LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmlhc19vYmplY3QuYwogKiBWZXJzaW9uOiAgICAgICAwLjMKICogRGVzY3JpcHRpb246ICAgSUFTIG9iamVjdCBkYXRhYmFzZSBhbmQgZnVuY3Rpb25zCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBUaHUgT2N0ICAxIDIyOjUwOjA0IDE5OTgKICogTW9kaWZpZWQgYXQ6ICAgV2VkIERlYyAxNSAxMToyMzoxNiAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICoKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXNfb2JqZWN0Lmg+CgpoYXNoYmluX3QgKmlyaWFzX29iamVjdHM7CgovKgogKiAgVXNlZCB3aGVuIGEgbWlzc2luZyB2YWx1ZSBuZWVkcyB0byBiZSByZXR1cm5lZAogKi8Kc3RydWN0IGlhc192YWx1ZSBpcmlhc19taXNzaW5nID0geyBJQVNfTUlTU0lORywgMCwgMCwgMCwgezB9fTsKCgovKgogKiBGdW5jdGlvbiBpYXNfbmV3X29iamVjdCAobmFtZSwgaWQpCiAqCiAqICAgIENyZWF0ZSBhIG5ldyBJQVMgb2JqZWN0CiAqCiAqLwpzdHJ1Y3QgaWFzX29iamVjdCAqaXJpYXNfbmV3X29iamVjdCggY2hhciAqbmFtZSwgaW50IGlkKQp7CglzdHJ1Y3QgaWFzX29iamVjdCAqb2JqOwoKCUlSREFfREVCVUcoIDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCW9iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfb2JqZWN0KSwgR0ZQX0FUT01JQyk7CglpZiAob2JqID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzKCksIFVuYWJsZSB0byBhbGxvY2F0ZSBvYmplY3QhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJb2JqLT5tYWdpYyA9IElBU19PQkpFQ1RfTUFHSUM7CglvYmotPm5hbWUgPSBrc3RybmR1cChuYW1lLCBJQVNfTUFYX0NMQVNTTkFNRSwgR0ZQX0FUT01JQyk7CglpZiAoIW9iai0+bmFtZSkgewoJCUlSREFfV0FSTklORygiJXMoKSwgVW5hYmxlIHRvIGFsbG9jYXRlIG5hbWUhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJa2ZyZWUob2JqKTsKCQlyZXR1cm4gTlVMTDsKCX0KCW9iai0+aWQgPSBpZDsKCgkvKiBMb2NraW5nIG5vdGVzIDogdGhlIGF0dHJpYiBzcGlubG9jayBoYXMgbG93ZXIgcHJlY2VuZGVuY2UKCSAqIHRoYW4gdGhlIG9iamVjdHMgc3BpbmxvY2suIE5ldmVyIGdyYXAgdGhlIG9iamVjdHMgc3BpbmxvY2sKCSAqIHdoaWxlIGhvbGRpbmcgYW55IGF0dHJpYiBzcGlubG9jayAocmlzayBvZiBkZWFkbG9jaykuIEplYW4gSUkgKi8KCW9iai0+YXR0cmlicyA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOwoKCWlmIChvYmotPmF0dHJpYnMgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXMoKSwgVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnMhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJa2ZyZWUob2JqLT5uYW1lKTsKCQlrZnJlZShvYmopOwoJCXJldHVybiBOVUxMOwoJfQoKCXJldHVybiBvYmo7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19uZXdfb2JqZWN0KTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2RlbGV0ZV9hdHRyaWIgKGF0dHJpYikKICoKICogICAgRGVsZXRlIGdpdmVuIGF0dHJpYnV0ZSBhbmQgZGVhbGxvY2F0ZSBhbGwgaXRzIG1lbW9yeQogKgogKi8Kc3RhdGljIHZvaWQgX19pcmlhc19kZWxldGVfYXR0cmliKHN0cnVjdCBpYXNfYXR0cmliICphdHRyaWIpCnsKCUlSREFfQVNTRVJUKGF0dHJpYiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKGF0dHJpYi0+bWFnaWMgPT0gSUFTX0FUVFJJQl9NQUdJQywgcmV0dXJuOyk7CgoJa2ZyZWUoYXR0cmliLT5uYW1lKTsKCglpcmlhc19kZWxldGVfdmFsdWUoYXR0cmliLT52YWx1ZSk7CglhdHRyaWItPm1hZ2ljID0gfklBU19BVFRSSUJfTUFHSUM7CgoJa2ZyZWUoYXR0cmliKTsKfQoKdm9pZCBfX2lyaWFzX2RlbGV0ZV9vYmplY3Qoc3RydWN0IGlhc19vYmplY3QgKm9iaikKewoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKCglrZnJlZShvYmotPm5hbWUpOwoKCWhhc2hiaW5fZGVsZXRlKG9iai0+YXR0cmlicywgKEZSRUVfRlVOQykgX19pcmlhc19kZWxldGVfYXR0cmliKTsKCglvYmotPm1hZ2ljID0gfklBU19PQkpFQ1RfTUFHSUM7CgoJa2ZyZWUob2JqKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXNfZGVsZXRlX29iamVjdCAob2JqKQogKgogKiAgICBSZW1vdmUgb2JqZWN0IGZyb20gaGFzaGJpbiBhbmQgZGVhbGxvY2F0ZSBhbGwgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGgKICogICAgd2l0aCB0aGlzIG9iamVjdCBhbmQgdGhlIG9iamVjdCBpdHNlbGYKICoKICovCmludCBpcmlhc19kZWxldGVfb2JqZWN0KHN0cnVjdCBpYXNfb2JqZWN0ICpvYmopCnsKCXN0cnVjdCBpYXNfb2JqZWN0ICpub2RlOwoKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuIC0xOyk7CgoJLyogUmVtb3ZlIGZyb20gbGlzdCAqLwoJbm9kZSA9IGhhc2hiaW5fcmVtb3ZlX3RoaXMoaXJpYXNfb2JqZWN0cywgKGlyZGFfcXVldWVfdCAqKSBvYmopOwoJaWYgKCFub2RlKQoJCUlSREFfREVCVUcoIDAsICIlcygpLCBvYmplY3QgYWxyZWFkeSByZW1vdmVkIVxuIiwKCQkJICAgIF9fRlVOQ1RJT05fXyk7CgoJLyogRGVzdHJveSAqLwoJX19pcmlhc19kZWxldGVfb2JqZWN0KG9iaik7CgoJcmV0dXJuIDA7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19kZWxldGVfb2JqZWN0KTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2RlbGV0ZV9hdHRyaWIgKG9iaikKICoKICogICAgUmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIGhhc2hiaW4gYW5kLCBpZiBpdCB3YXMgdGhlIGxhc3QgYXR0cmlidXRlIG9mCiAqICAgIHRoZSBvYmplY3QsIHJlbW92ZSB0aGUgb2JqZWN0IGFzIHdlbGwuCiAqCiAqLwppbnQgaXJpYXNfZGVsZXRlX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliLAoJCQlpbnQgY2xlYW5vYmplY3QpCnsKCXN0cnVjdCBpYXNfYXR0cmliICpub2RlOwoKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChhdHRyaWIgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgoJLyogUmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIG9iamVjdCAqLwoJbm9kZSA9IGhhc2hiaW5fcmVtb3ZlX3RoaXMob2JqLT5hdHRyaWJzLCAoaXJkYV9xdWV1ZV90ICopIGF0dHJpYik7CglpZiAoIW5vZGUpCgkJcmV0dXJuIDA7IC8qIEFscmVhZHkgcmVtb3ZlZCBvciBub24tZXhpc3RlbnQgKi8KCgkvKiBEZWFsbG9jYXRlIGF0dHJpYnV0ZSAqLwoJX19pcmlhc19kZWxldGVfYXR0cmliKG5vZGUpOwoKCS8qIENoZWNrIGlmIG9iamVjdCBoYXMgc3RpbGwgc29tZSBhdHRyaWJ1dGVzLCBkZXN0cm95IGl0IGlmIG5vbmUuCgkgKiBBdCBmaXJzdCBnbGFuY2UsIHRoaXMgbG9vayBkYW5nZXJvdXMsIGFzIHRoZSBrZXJuZWwgcmVmZXJlbmNlCgkgKiB2YXJpb3VzIElBUyBvYmplY3RzLiBIb3dldmVyLCB3ZSBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIG9uCgkgKiB1c2VyIGF0dHJpYnV0ZXMsIG5vdCBrZXJuZWwgYXR0cmlidXRlcywgc28gdGhlcmUgaXMgbm8gcmlzawoJICogb2YgZGVsZXRpbmcgYSBrZXJuZWwgb2JqZWN0IHRoaXMgd2F5LiBKZWFuIElJICovCglub2RlID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGhhc2hiaW5fZ2V0X2ZpcnN0KG9iai0+YXR0cmlicyk7CglpZiAoY2xlYW5vYmplY3QgJiYgIW5vZGUpCgkJaXJpYXNfZGVsZXRlX29iamVjdChvYmopOwoKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhc19pbnNlcnRfb2JqZWN0IChvYmopCiAqCiAqICAgIEluc2VydCBhbiBvYmplY3QgaW50byB0aGUgTE0tSUFTIGRhdGFiYXNlCiAqCiAqLwp2b2lkIGlyaWFzX2luc2VydF9vYmplY3Qoc3RydWN0IGlhc19vYmplY3QgKm9iaikKewoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKCgloYXNoYmluX2luc2VydChpcmlhc19vYmplY3RzLCAoaXJkYV9xdWV1ZV90ICopIG9iaiwgMCwgb2JqLT5uYW1lKTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX2luc2VydF9vYmplY3QpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfZmluZF9vYmplY3QgKG5hbWUpCiAqCiAqICAgIEZpbmQgb2JqZWN0IHdpdGggZ2l2ZW4gbmFtZQogKgogKi8Kc3RydWN0IGlhc19vYmplY3QgKmlyaWFzX2ZpbmRfb2JqZWN0KGNoYXIgKm5hbWUpCnsKCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKCgkvKiBVbnNhZmUgKGxvY2tpbmcpLCBvYmplY3QgbWlnaHQgY2hhbmdlICovCglyZXR1cm4gaGFzaGJpbl9sb2NrX2ZpbmQoaXJpYXNfb2JqZWN0cywgMCwgbmFtZSk7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19maW5kX29iamVjdCk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19maW5kX2F0dHJpYiAob2JqLCBuYW1lKQogKgogKiAgICBGaW5kIG5hbWVkIGF0dHJpYnV0ZSBpbiBvYmplY3QKICoKICovCnN0cnVjdCBpYXNfYXR0cmliICppcmlhc19maW5kX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBjaGFyICpuYW1lKQp7CglzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOwoKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm4gTlVMTDspOwoJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm4gTlVMTDspOwoKCWF0dHJpYiA9IGhhc2hiaW5fbG9ja19maW5kKG9iai0+YXR0cmlicywgMCwgbmFtZSk7CglpZiAoYXR0cmliID09IE5VTEwpCgkJcmV0dXJuIE5VTEw7CgoJLyogVW5zYWZlIChsb2NraW5nKSwgYXR0cmliIG1pZ2h0IGNoYW5nZSAqLwoJcmV0dXJuIGF0dHJpYjsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXNfYWRkX2F0dHJpYnV0ZSAob2JqLCBhdHRyaWIpCiAqCiAqICAgIEFkZCBhdHRyaWJ1dGUgdG8gb2JqZWN0CiAqCiAqLwpzdGF0aWMgdm9pZCBpcmlhc19hZGRfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIHN0cnVjdCBpYXNfYXR0cmliICphdHRyaWIsCgkJCSAgICAgaW50IG93bmVyKQp7CglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOwoKCUlSREFfQVNTRVJUKGF0dHJpYiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKGF0dHJpYi0+bWFnaWMgPT0gSUFTX0FUVFJJQl9NQUdJQywgcmV0dXJuOyk7CgoJLyogU2V0IGlmIGF0dHJpYiBpcyBvd25lZCBieSBrZXJuZWwgb3IgdXNlciBzcGFjZSAqLwoJYXR0cmliLT52YWx1ZS0+b3duZXIgPSBvd25lcjsKCgloYXNoYmluX2luc2VydChvYmotPmF0dHJpYnMsIChpcmRhX3F1ZXVlX3QgKikgYXR0cmliLCAwLCBhdHRyaWItPm5hbWUpOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhc19vYmplY3RfY2hhbmdlX2F0dHJpYnV0ZSAob2JqX25hbWUsIGF0dHJpYl9uYW1lLCBuZXdfdmFsdWUpCiAqCiAqICAgIENoYW5nZSB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0cyBhdHRyaWJ1dGUuCiAqCiAqLwppbnQgaXJpYXNfb2JqZWN0X2NoYW5nZV9hdHRyaWJ1dGUoY2hhciAqb2JqX25hbWUsIGNoYXIgKmF0dHJpYl9uYW1lLAoJCQkJICBzdHJ1Y3QgaWFzX3ZhbHVlICpuZXdfdmFsdWUpCnsKCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CglzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgkvKiBGaW5kIG9iamVjdCAqLwoJb2JqID0gaGFzaGJpbl9sb2NrX2ZpbmQoaXJpYXNfb2JqZWN0cywgMCwgb2JqX25hbWUpOwoJaWYgKG9iaiA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGZpbmQgb2JqZWN0OiAlc1xuIiwgX19GVU5DVElPTl9fLAoJCQkgICAgIG9ial9uYW1lKTsKCQlyZXR1cm4gLTE7Cgl9CgoJLyogU2xpZ2h0bHkgdW5zYWZlIChvYmogbWlnaHQgZ2V0IHJlbW92ZWQgdW5kZXIgdXMpICovCglzcGluX2xvY2tfaXJxc2F2ZSgmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoKCS8qIEZpbmQgYXR0cmlidXRlICovCglhdHRyaWIgPSBoYXNoYmluX2ZpbmQob2JqLT5hdHRyaWJzLCAwLCBhdHRyaWJfbmFtZSk7CglpZiAoYXR0cmliID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gZmluZCBhdHRyaWJ1dGU6ICVzXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXywgYXR0cmliX25hbWUpOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKCBhdHRyaWItPnZhbHVlLT50eXBlICE9IG5ld192YWx1ZS0+dHlwZSkgewoJCUlSREFfREVCVUcoIDAsICIlcygpLCBjaGFuZ2luZyB2YWx1ZSB0eXBlIG5vdCBhbGxvd2VkIVxuIiwKCQkJICAgIF9fRlVOQ1RJT05fXyk7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJCXJldHVybiAtMTsKCX0KCgkvKiBEZWxldGUgb2xkIHZhbHVlICovCglpcmlhc19kZWxldGVfdmFsdWUoYXR0cmliLT52YWx1ZSk7CgoJLyogSW5zZXJ0IG5ldyB2YWx1ZSAqLwoJYXR0cmliLT52YWx1ZSA9IG5ld192YWx1ZTsKCgkvKiBTdWNjZXNzICovCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmotPmF0dHJpYnMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CglyZXR1cm4gMDsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX29iamVjdF9jaGFuZ2VfYXR0cmlidXRlKTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX29iamVjdF9hZGRfaW50ZWdlcl9hdHRyaWIgKG9iaiwgbmFtZSwgdmFsdWUpCiAqCiAqICAgIEFkZCBhbiBpbnRlZ2VyIGF0dHJpYnV0ZSB0byBhbiBMTS1JQVMgb2JqZWN0CiAqCiAqLwp2b2lkIGlyaWFzX2FkZF9pbnRlZ2VyX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBjaGFyICpuYW1lLCBpbnQgdmFsdWUsCgkJCSAgICAgIGludCBvd25lcikKewoJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKCglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm47KTsKCglhdHRyaWIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX2F0dHJpYiksIEdGUF9BVE9NSUMpOwoJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgoJYXR0cmliLT5tYWdpYyA9IElBU19BVFRSSUJfTUFHSUM7CglhdHRyaWItPm5hbWUgPSBrc3RybmR1cChuYW1lLCBJQVNfTUFYX0FUVFJJQk5BTUUsIEdGUF9BVE9NSUMpOwoKCS8qIEluc2VydCB2YWx1ZSAqLwoJYXR0cmliLT52YWx1ZSA9IGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlKHZhbHVlKTsKCWlmICghYXR0cmliLT5uYW1lIHx8ICFhdHRyaWItPnZhbHVlKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlpZiAoYXR0cmliLT52YWx1ZSkKCQkJaXJpYXNfZGVsZXRlX3ZhbHVlKGF0dHJpYi0+dmFsdWUpOwoJCWtmcmVlKGF0dHJpYi0+bmFtZSk7CgkJa2ZyZWUoYXR0cmliKTsKCQlyZXR1cm47Cgl9CgoJaXJpYXNfYWRkX2F0dHJpYihvYmosIGF0dHJpYiwgb3duZXIpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfYWRkX2ludGVnZXJfYXR0cmliKTsKCiAvKgogKiBGdW5jdGlvbiBpcmlhc19hZGRfb2N0c2VxX2F0dHJpYiAob2JqLCBuYW1lLCBvY3RldF9zZXEsIGxlbikKICoKICogICAgQWRkIGEgb2N0ZXQgc2VxdWVuY2UgYXR0cmlidXRlIHRvIGFuIExNLUlBUyBvYmplY3QKICoKICovCgp2b2lkIGlyaWFzX2FkZF9vY3RzZXFfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIGNoYXIgKm5hbWUsIF9fdTggKm9jdGV0cywKCQkJICAgICBpbnQgbGVuLCBpbnQgb3duZXIpCnsKCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CgoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKCglJUkRBX0FTU0VSVChuYW1lICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2N0ZXRzICE9IE5VTEwsIHJldHVybjspOwoKCWF0dHJpYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfYXR0cmliKSwgR0ZQX0FUT01JQyk7CglpZiAoYXR0cmliID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgYXR0cmlidXRlIVxuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCglhdHRyaWItPm1hZ2ljID0gSUFTX0FUVFJJQl9NQUdJQzsKCWF0dHJpYi0+bmFtZSA9IGtzdHJuZHVwKG5hbWUsIElBU19NQVhfQVRUUklCTkFNRSwgR0ZQX0FUT01JQyk7CgoJYXR0cmliLT52YWx1ZSA9IGlyaWFzX25ld19vY3RzZXFfdmFsdWUoIG9jdGV0cywgbGVuKTsKCWlmICghYXR0cmliLT5uYW1lIHx8ICFhdHRyaWItPnZhbHVlKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlpZiAoYXR0cmliLT52YWx1ZSkKCQkJaXJpYXNfZGVsZXRlX3ZhbHVlKGF0dHJpYi0+dmFsdWUpOwoJCWtmcmVlKGF0dHJpYi0+bmFtZSk7CgkJa2ZyZWUoYXR0cmliKTsKCQlyZXR1cm47Cgl9CgoJaXJpYXNfYWRkX2F0dHJpYihvYmosIGF0dHJpYiwgb3duZXIpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfYWRkX29jdHNlcV9hdHRyaWIpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfb2JqZWN0X2FkZF9zdHJpbmdfYXR0cmliIChvYmosIHN0cmluZykKICoKICogICAgQWRkIGEgc3RyaW5nIGF0dHJpYnV0ZSB0byBhbiBMTS1JQVMgb2JqZWN0CiAqCiAqLwp2b2lkIGlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLAoJCQkgICAgIGludCBvd25lcikKewoJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKCglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOwoKCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVCh2YWx1ZSAhPSBOVUxMLCByZXR1cm47KTsKCglhdHRyaWIgPSBremFsbG9jKHNpemVvZiggc3RydWN0IGlhc19hdHRyaWIpLCBHRlBfQVRPTUlDKTsKCWlmIChhdHRyaWIgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJ1dGUhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoKCWF0dHJpYi0+bWFnaWMgPSBJQVNfQVRUUklCX01BR0lDOwoJYXR0cmliLT5uYW1lID0ga3N0cm5kdXAobmFtZSwgSUFTX01BWF9BVFRSSUJOQU1FLCBHRlBfQVRPTUlDKTsKCglhdHRyaWItPnZhbHVlID0gaXJpYXNfbmV3X3N0cmluZ192YWx1ZSh2YWx1ZSk7CglpZiAoIWF0dHJpYi0+bmFtZSB8fCAhYXR0cmliLT52YWx1ZSkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJ1dGUhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJaWYgKGF0dHJpYi0+dmFsdWUpCgkJCWlyaWFzX2RlbGV0ZV92YWx1ZShhdHRyaWItPnZhbHVlKTsKCQlrZnJlZShhdHRyaWItPm5hbWUpOwoJCWtmcmVlKGF0dHJpYik7CgkJcmV0dXJuOwoJfQoKCWlyaWFzX2FkZF9hdHRyaWIob2JqLCBhdHRyaWIsIG93bmVyKTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlIChpbnRlZ2VyKQogKgogKiAgICBDcmVhdGUgbmV3IElBUyBpbnRlZ2VyIHZhbHVlCiAqCiAqLwpzdHJ1Y3QgaWFzX3ZhbHVlICppcmlhc19uZXdfaW50ZWdlcl92YWx1ZShpbnQgaW50ZWdlcikKewoJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CgoJdmFsdWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSwgR0ZQX0FUT01JQyk7CglpZiAodmFsdWUgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgl2YWx1ZS0+dHlwZSA9IElBU19JTlRFR0VSOwoJdmFsdWUtPmxlbiA9IDQ7Cgl2YWx1ZS0+dC5pbnRlZ2VyID0gaW50ZWdlcjsKCglyZXR1cm4gdmFsdWU7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19uZXdfaW50ZWdlcl92YWx1ZSk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19uZXdfc3RyaW5nX3ZhbHVlIChzdHJpbmcpCiAqCiAqICAgIENyZWF0ZSBuZXcgSUFTIHN0cmluZyB2YWx1ZQogKgogKiBQZXIgSXJMTVAgMS4xLCA0LjMuMy4yLCBzdHJpbmdzIGFyZSB1cCB0byAyNTYgY2hhcnMgLSBKZWFuIElJCiAqLwpzdHJ1Y3QgaWFzX3ZhbHVlICppcmlhc19uZXdfc3RyaW5nX3ZhbHVlKGNoYXIgKnN0cmluZykKewoJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CgoJdmFsdWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSwgR0ZQX0FUT01JQyk7CglpZiAodmFsdWUgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgl2YWx1ZS0+dHlwZSA9IElBU19TVFJJTkc7Cgl2YWx1ZS0+Y2hhcnNldCA9IENTX0FTQ0lJOwoJdmFsdWUtPnQuc3RyaW5nID0ga3N0cm5kdXAoc3RyaW5nLCBJQVNfTUFYX1NUUklORywgR0ZQX0FUT01JQyk7CglpZiAoIXZhbHVlLT50LnN0cmluZykgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlrZnJlZSh2YWx1ZSk7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJdmFsdWUtPmxlbiA9IHN0cmxlbih2YWx1ZS0+dC5zdHJpbmcpOwoKCXJldHVybiB2YWx1ZTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXNfbmV3X29jdHNlcV92YWx1ZSAob2N0ZXRzLCBsZW4pCiAqCiAqICAgIENyZWF0ZSBuZXcgSUFTIG9jdGV0LXNlcXVlbmNlIHZhbHVlCiAqCiAqIFBlciBJckxNUCAxLjEsIDQuMy4zLjIsIG9jdGV0LXNlcXVlbmNlIGFyZSB1cCB0byAxMDI0IGJ5dGVzIC0gSmVhbiBJSQogKi8Kc3RydWN0IGlhc192YWx1ZSAqaXJpYXNfbmV3X29jdHNlcV92YWx1ZShfX3U4ICpvY3RzZXEgLCBpbnQgbGVuKQp7CglzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZTsKCgl2YWx1ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpLCBHRlBfQVRPTUlDKTsKCWlmICh2YWx1ZSA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoKCXZhbHVlLT50eXBlID0gSUFTX09DVF9TRVE7CgkvKiBDaGVjayBsZW5ndGggKi8KCWlmKGxlbiA+IElBU19NQVhfT0NURVRfU1RSSU5HKQoJCWxlbiA9IElBU19NQVhfT0NURVRfU1RSSU5HOwoJdmFsdWUtPmxlbiA9IGxlbjsKCgl2YWx1ZS0+dC5vY3Rfc2VxID0ga21lbWR1cChvY3RzZXEsIGxlbiwgR0ZQX0FUT01JQyk7CglpZiAodmFsdWUtPnQub2N0X3NlcSA9PSBOVUxMKXsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJa2ZyZWUodmFsdWUpOwoJCXJldHVybiBOVUxMOwoJfQoJcmV0dXJuIHZhbHVlOwp9CgpzdHJ1Y3QgaWFzX3ZhbHVlICppcmlhc19uZXdfbWlzc2luZ192YWx1ZSh2b2lkKQp7CglzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZTsKCgl2YWx1ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpLCBHRlBfQVRPTUlDKTsKCWlmICh2YWx1ZSA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoKCXZhbHVlLT50eXBlID0gSUFTX01JU1NJTkc7CgoJcmV0dXJuIHZhbHVlOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhc19kZWxldGVfdmFsdWUgKHZhbHVlKQogKgogKiAgICBEZWxldGUgSUFTIHZhbHVlCiAqCiAqLwp2b2lkIGlyaWFzX2RlbGV0ZV92YWx1ZShzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZSkKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVCh2YWx1ZSAhPSBOVUxMLCByZXR1cm47KTsKCglzd2l0Y2ggKHZhbHVlLT50eXBlKSB7CgljYXNlIElBU19JTlRFR0VSOiAvKiBGYWxsdGhyb3VnaCAqLwoJY2FzZSBJQVNfTUlTU0lORzoKCQkvKiBObyBuZWVkIHRvIGRlYWxsb2NhdGUgKi8KCQlicmVhazsKCWNhc2UgSUFTX1NUUklORzoKCQkvKiBEZWFsbG9jYXRlIHN0cmluZyAqLwoJCWtmcmVlKHZhbHVlLT50LnN0cmluZyk7CgkJYnJlYWs7CgljYXNlIElBU19PQ1RfU0VROgoJCS8qIERlYWxsb2NhdGUgYnl0ZSBzdHJlYW0gKi8KCQkga2ZyZWUodmFsdWUtPnQub2N0X3NlcSk7CgkJIGJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIHZhbHVlIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCWJyZWFrOwoJfQoJa2ZyZWUodmFsdWUpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfZGVsZXRlX3ZhbHVlKTsK