LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmlhc19vYmplY3QuYwogKiBWZXJzaW9uOiAgICAgICAwLjMKICogRGVzY3JpcHRpb246ICAgSUFTIG9iamVjdCBkYXRhYmFzZSBhbmQgZnVuY3Rpb25zCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBUaHUgT2N0ICAxIDIyOjUwOjA0IDE5OTgKICogTW9kaWZpZWQgYXQ6ICAgV2VkIERlYyAxNSAxMToyMzoxNiAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICoKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXNfb2JqZWN0Lmg+CgpoYXNoYmluX3QgKmlyaWFzX29iamVjdHM7CgovKgogKiAgVXNlZCB3aGVuIGEgbWlzc2luZyB2YWx1ZSBuZWVkcyB0byBiZSByZXR1cm5lZAogKi8Kc3RydWN0IGlhc192YWx1ZSBpcmlhc19taXNzaW5nID0geyBJQVNfTUlTU0lORywgMCwgMCwgMCwgezB9fTsKCi8qCiAqIEZ1bmN0aW9uIHN0cm5kdXAgKHN0ciwgbWF4KQogKgogKiAgICBNeSBvd24ga2VybmVsIHZlcnNpb24gb2Ygc3RybmR1cCEKICoKICogRmFzdGVyLCBjaGVjayBib3VuZGFyeS4uLiBKZWFuIElJCiAqLwpzdGF0aWMgY2hhciAqc3RybmR1cChjaGFyICpzdHIsIHNpemVfdCBtYXgpCnsKCWNoYXIgKm5ld19zdHI7CglpbnQgbGVuOwoKCS8qIENoZWNrIHN0cmluZyAqLwoJaWYgKHN0ciA9PSBOVUxMKQoJCXJldHVybiBOVUxMOwoJLyogQ2hlY2sgbGVuZ3RoLCB0cnVuY2F0ZSAqLwoJbGVuID0gc3RybGVuKHN0cik7CglpZihsZW4gPiBtYXgpCgkJbGVuID0gbWF4OwoKCS8qIEFsbG9jYXRlIG5ldyBzdHJpbmcgKi8KCW5ld19zdHIgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9BVE9NSUMpOwoJaWYgKG5ld19zdHIgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgkvKiBDb3B5IGFuZCB0cnVuY2F0ZSAqLwoJbWVtY3B5KG5ld19zdHIsIHN0ciwgbGVuKTsKCW5ld19zdHJbbGVuXSA9ICdcMCc7CgoJcmV0dXJuIG5ld19zdHI7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlhc19uZXdfb2JqZWN0IChuYW1lLCBpZCkKICoKICogICAgQ3JlYXRlIGEgbmV3IElBUyBvYmplY3QKICoKICovCnN0cnVjdCBpYXNfb2JqZWN0ICppcmlhc19uZXdfb2JqZWN0KCBjaGFyICpuYW1lLCBpbnQgaWQpCnsKCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CgoJSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlhc19vYmplY3QpLCBHRlBfQVRPTUlDKTsKCWlmIChvYmogPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXMoKSwgVW5hYmxlIHRvIGFsbG9jYXRlIG9iamVjdCFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglvYmotPm1hZ2ljID0gSUFTX09CSkVDVF9NQUdJQzsKCW9iai0+bmFtZSA9IHN0cm5kdXAobmFtZSwgSUFTX01BWF9DTEFTU05BTUUpOwoJaWYgKCFvYmotPm5hbWUpIHsKCQlJUkRBX1dBUk5JTkcoIiVzKCksIFVuYWJsZSB0byBhbGxvY2F0ZSBuYW1lIVxuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCWtmcmVlKG9iaik7CgkJcmV0dXJuIE5VTEw7Cgl9CglvYmotPmlkID0gaWQ7CgoJLyogTG9ja2luZyBub3RlcyA6IHRoZSBhdHRyaWIgc3BpbmxvY2sgaGFzIGxvd2VyIHByZWNlbmRlbmNlCgkgKiB0aGFuIHRoZSBvYmplY3RzIHNwaW5sb2NrLiBOZXZlciBncmFwIHRoZSBvYmplY3RzIHNwaW5sb2NrCgkgKiB3aGlsZSBob2xkaW5nIGFueSBhdHRyaWIgc3BpbmxvY2sgKHJpc2sgb2YgZGVhZGxvY2spLiBKZWFuIElJICovCglvYmotPmF0dHJpYnMgPSBoYXNoYmluX25ldyhIQl9MT0NLKTsKCglpZiAob2JqLT5hdHRyaWJzID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzKCksIFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJzIVxuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCWtmcmVlKG9iai0+bmFtZSk7CgkJa2ZyZWUob2JqKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglyZXR1cm4gb2JqOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfbmV3X29iamVjdCk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19kZWxldGVfYXR0cmliIChhdHRyaWIpCiAqCiAqICAgIERlbGV0ZSBnaXZlbiBhdHRyaWJ1dGUgYW5kIGRlYWxsb2NhdGUgYWxsIGl0cyBtZW1vcnkKICoKICovCnN0YXRpYyB2b2lkIF9faXJpYXNfZGVsZXRlX2F0dHJpYihzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliKQp7CglJUkRBX0FTU0VSVChhdHRyaWIgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChhdHRyaWItPm1hZ2ljID09IElBU19BVFRSSUJfTUFHSUMsIHJldHVybjspOwoKCWtmcmVlKGF0dHJpYi0+bmFtZSk7CgoJaXJpYXNfZGVsZXRlX3ZhbHVlKGF0dHJpYi0+dmFsdWUpOwoJYXR0cmliLT5tYWdpYyA9IH5JQVNfQVRUUklCX01BR0lDOwoKCWtmcmVlKGF0dHJpYik7Cn0KCnZvaWQgX19pcmlhc19kZWxldGVfb2JqZWN0KHN0cnVjdCBpYXNfb2JqZWN0ICpvYmopCnsKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuOyk7CgoJa2ZyZWUob2JqLT5uYW1lKTsKCgloYXNoYmluX2RlbGV0ZShvYmotPmF0dHJpYnMsIChGUkVFX0ZVTkMpIF9faXJpYXNfZGVsZXRlX2F0dHJpYik7CgoJb2JqLT5tYWdpYyA9IH5JQVNfT0JKRUNUX01BR0lDOwoKCWtmcmVlKG9iaik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2RlbGV0ZV9vYmplY3QgKG9iaikKICoKICogICAgUmVtb3ZlIG9iamVjdCBmcm9tIGhhc2hiaW4gYW5kIGRlYWxsb2NhdGUgYWxsIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoCiAqICAgIHdpdGggdGhpcyBvYmplY3QgYW5kIHRoZSBvYmplY3QgaXRzZWxmCiAqCiAqLwppbnQgaXJpYXNfZGVsZXRlX29iamVjdChzdHJ1Y3QgaWFzX29iamVjdCAqb2JqKQp7CglzdHJ1Y3QgaWFzX29iamVjdCAqbm9kZTsKCglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybiAtMTspOwoKCS8qIFJlbW92ZSBmcm9tIGxpc3QgKi8KCW5vZGUgPSBoYXNoYmluX3JlbW92ZV90aGlzKGlyaWFzX29iamVjdHMsIChpcmRhX3F1ZXVlX3QgKikgb2JqKTsKCWlmICghbm9kZSkKCQlJUkRBX0RFQlVHKCAwLCAiJXMoKSwgb2JqZWN0IGFscmVhZHkgcmVtb3ZlZCFcbiIsCgkJCSAgICBfX0ZVTkNUSU9OX18pOwoKCS8qIERlc3Ryb3kgKi8KCV9faXJpYXNfZGVsZXRlX29iamVjdChvYmopOwoKCXJldHVybiAwOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfZGVsZXRlX29iamVjdCk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19kZWxldGVfYXR0cmliIChvYmopCiAqCiAqICAgIFJlbW92ZSBhdHRyaWJ1dGUgZnJvbSBoYXNoYmluIGFuZCwgaWYgaXQgd2FzIHRoZSBsYXN0IGF0dHJpYnV0ZSBvZgogKiAgICB0aGUgb2JqZWN0LCByZW1vdmUgdGhlIG9iamVjdCBhcyB3ZWxsLgogKgogKi8KaW50IGlyaWFzX2RlbGV0ZV9hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYiwKCQkJaW50IGNsZWFub2JqZWN0KQp7CglzdHJ1Y3QgaWFzX2F0dHJpYiAqbm9kZTsKCglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoYXR0cmliICE9IE5VTEwsIHJldHVybiAtMTspOwoKCS8qIFJlbW92ZSBhdHRyaWJ1dGUgZnJvbSBvYmplY3QgKi8KCW5vZGUgPSBoYXNoYmluX3JlbW92ZV90aGlzKG9iai0+YXR0cmlicywgKGlyZGFfcXVldWVfdCAqKSBhdHRyaWIpOwoJaWYgKCFub2RlKQoJCXJldHVybiAwOyAvKiBBbHJlYWR5IHJlbW92ZWQgb3Igbm9uLWV4aXN0ZW50ICovCgoJLyogRGVhbGxvY2F0ZSBhdHRyaWJ1dGUgKi8KCV9faXJpYXNfZGVsZXRlX2F0dHJpYihub2RlKTsKCgkvKiBDaGVjayBpZiBvYmplY3QgaGFzIHN0aWxsIHNvbWUgYXR0cmlidXRlcywgZGVzdHJveSBpdCBpZiBub25lLgoJICogQXQgZmlyc3QgZ2xhbmNlLCB0aGlzIGxvb2sgZGFuZ2Vyb3VzLCBhcyB0aGUga2VybmVsIHJlZmVyZW5jZQoJICogdmFyaW91cyBJQVMgb2JqZWN0cy4gSG93ZXZlciwgd2Ugb25seSB1c2UgdGhpcyBmdW5jdGlvbiBvbgoJICogdXNlciBhdHRyaWJ1dGVzLCBub3Qga2VybmVsIGF0dHJpYnV0ZXMsIHNvIHRoZXJlIGlzIG5vIHJpc2sKCSAqIG9mIGRlbGV0aW5nIGEga2VybmVsIG9iamVjdCB0aGlzIHdheS4gSmVhbiBJSSAqLwoJbm9kZSA9IChzdHJ1Y3QgaWFzX2F0dHJpYiAqKSBoYXNoYmluX2dldF9maXJzdChvYmotPmF0dHJpYnMpOwoJaWYgKGNsZWFub2JqZWN0ICYmICFub2RlKQoJCWlyaWFzX2RlbGV0ZV9vYmplY3Qob2JqKTsKCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXNfaW5zZXJ0X29iamVjdCAob2JqKQogKgogKiAgICBJbnNlcnQgYW4gb2JqZWN0IGludG8gdGhlIExNLUlBUyBkYXRhYmFzZQogKgogKi8Kdm9pZCBpcmlhc19pbnNlcnRfb2JqZWN0KHN0cnVjdCBpYXNfb2JqZWN0ICpvYmopCnsKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuOyk7CgoJaGFzaGJpbl9pbnNlcnQoaXJpYXNfb2JqZWN0cywgKGlyZGFfcXVldWVfdCAqKSBvYmosIDAsIG9iai0+bmFtZSk7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19pbnNlcnRfb2JqZWN0KTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2ZpbmRfb2JqZWN0IChuYW1lKQogKgogKiAgICBGaW5kIG9iamVjdCB3aXRoIGdpdmVuIG5hbWUKICoKICovCnN0cnVjdCBpYXNfb2JqZWN0ICppcmlhc19maW5kX29iamVjdChjaGFyICpuYW1lKQp7CglJUkRBX0FTU0VSVChuYW1lICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CgoJLyogVW5zYWZlIChsb2NraW5nKSwgb2JqZWN0IG1pZ2h0IGNoYW5nZSAqLwoJcmV0dXJuIGhhc2hiaW5fbG9ja19maW5kKGlyaWFzX29iamVjdHMsIDAsIG5hbWUpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfZmluZF9vYmplY3QpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfZmluZF9hdHRyaWIgKG9iaiwgbmFtZSkKICoKICogICAgRmluZCBuYW1lZCBhdHRyaWJ1dGUgaW4gb2JqZWN0CiAqCiAqLwpzdHJ1Y3QgaWFzX2F0dHJpYiAqaXJpYXNfZmluZF9hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgY2hhciAqbmFtZSkKewoJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKCglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuIE5VTEw7KTsKCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKCglhdHRyaWIgPSBoYXNoYmluX2xvY2tfZmluZChvYmotPmF0dHJpYnMsIDAsIG5hbWUpOwoJaWYgKGF0dHJpYiA9PSBOVUxMKQoJCXJldHVybiBOVUxMOwoKCS8qIFVuc2FmZSAobG9ja2luZyksIGF0dHJpYiBtaWdodCBjaGFuZ2UgKi8KCXJldHVybiBhdHRyaWI7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2FkZF9hdHRyaWJ1dGUgKG9iaiwgYXR0cmliKQogKgogKiAgICBBZGQgYXR0cmlidXRlIHRvIG9iamVjdAogKgogKi8Kc3RhdGljIHZvaWQgaXJpYXNfYWRkX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliLAoJCQkgICAgIGludCBvd25lcikKewoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKCglJUkRBX0FTU0VSVChhdHRyaWIgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChhdHRyaWItPm1hZ2ljID09IElBU19BVFRSSUJfTUFHSUMsIHJldHVybjspOwoKCS8qIFNldCBpZiBhdHRyaWIgaXMgb3duZWQgYnkga2VybmVsIG9yIHVzZXIgc3BhY2UgKi8KCWF0dHJpYi0+dmFsdWUtPm93bmVyID0gb3duZXI7CgoJaGFzaGJpbl9pbnNlcnQob2JqLT5hdHRyaWJzLCAoaXJkYV9xdWV1ZV90ICopIGF0dHJpYiwgMCwgYXR0cmliLT5uYW1lKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXNfb2JqZWN0X2NoYW5nZV9hdHRyaWJ1dGUgKG9ial9uYW1lLCBhdHRyaWJfbmFtZSwgbmV3X3ZhbHVlKQogKgogKiAgICBDaGFuZ2UgdGhlIHZhbHVlIG9mIGFuIG9iamVjdHMgYXR0cmlidXRlLgogKgogKi8KaW50IGlyaWFzX29iamVjdF9jaGFuZ2VfYXR0cmlidXRlKGNoYXIgKm9ial9uYW1lLCBjaGFyICphdHRyaWJfbmFtZSwKCQkJCSAgc3RydWN0IGlhc192YWx1ZSAqbmV3X3ZhbHVlKQp7CglzdHJ1Y3QgaWFzX29iamVjdCAqb2JqOwoJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJLyogRmluZCBvYmplY3QgKi8KCW9iaiA9IGhhc2hiaW5fbG9ja19maW5kKGlyaWFzX29iamVjdHMsIDAsIG9ial9uYW1lKTsKCWlmIChvYmogPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBmaW5kIG9iamVjdDogJXNcbiIsIF9fRlVOQ1RJT05fXywKCQkJICAgICBvYmpfbmFtZSk7CgkJcmV0dXJuIC0xOwoJfQoKCS8qIFNsaWdodGx5IHVuc2FmZSAob2JqIG1pZ2h0IGdldCByZW1vdmVkIHVuZGVyIHVzKSAqLwoJc3Bpbl9sb2NrX2lycXNhdmUoJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCgkvKiBGaW5kIGF0dHJpYnV0ZSAqLwoJYXR0cmliID0gaGFzaGJpbl9maW5kKG9iai0+YXR0cmlicywgMCwgYXR0cmliX25hbWUpOwoJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGZpbmQgYXR0cmlidXRlOiAlc1xuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18sIGF0dHJpYl9uYW1lKTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmotPmF0dHJpYnMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CgkJcmV0dXJuIC0xOwoJfQoKCWlmICggYXR0cmliLT52YWx1ZS0+dHlwZSAhPSBuZXdfdmFsdWUtPnR5cGUpIHsKCQlJUkRBX0RFQlVHKCAwLCAiJXMoKSwgY2hhbmdpbmcgdmFsdWUgdHlwZSBub3QgYWxsb3dlZCFcbiIsCgkJCSAgICBfX0ZVTkNUSU9OX18pOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gLTE7Cgl9CgoJLyogRGVsZXRlIG9sZCB2YWx1ZSAqLwoJaXJpYXNfZGVsZXRlX3ZhbHVlKGF0dHJpYi0+dmFsdWUpOwoKCS8qIEluc2VydCBuZXcgdmFsdWUgKi8KCWF0dHJpYi0+dmFsdWUgPSBuZXdfdmFsdWU7CgoJLyogU3VjY2VzcyAqLwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJcmV0dXJuIDA7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19vYmplY3RfY2hhbmdlX2F0dHJpYnV0ZSk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19vYmplY3RfYWRkX2ludGVnZXJfYXR0cmliIChvYmosIG5hbWUsIHZhbHVlKQogKgogKiAgICBBZGQgYW4gaW50ZWdlciBhdHRyaWJ1dGUgdG8gYW4gTE0tSUFTIG9iamVjdAogKgogKi8Kdm9pZCBpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgY2hhciAqbmFtZSwgaW50IHZhbHVlLAoJCQkgICAgICBpbnQgb3duZXIpCnsKCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CgoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuOyk7CgoJYXR0cmliID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlhc19hdHRyaWIpLCBHRlBfQVRPTUlDKTsKCWlmIChhdHRyaWIgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJ1dGUhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoKCWF0dHJpYi0+bWFnaWMgPSBJQVNfQVRUUklCX01BR0lDOwoJYXR0cmliLT5uYW1lID0gc3RybmR1cChuYW1lLCBJQVNfTUFYX0FUVFJJQk5BTUUpOwoKCS8qIEluc2VydCB2YWx1ZSAqLwoJYXR0cmliLT52YWx1ZSA9IGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlKHZhbHVlKTsKCWlmICghYXR0cmliLT5uYW1lIHx8ICFhdHRyaWItPnZhbHVlKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlpZiAoYXR0cmliLT52YWx1ZSkKCQkJaXJpYXNfZGVsZXRlX3ZhbHVlKGF0dHJpYi0+dmFsdWUpOwoJCWtmcmVlKGF0dHJpYi0+bmFtZSk7CgkJa2ZyZWUoYXR0cmliKTsKCQlyZXR1cm47Cgl9CgoJaXJpYXNfYWRkX2F0dHJpYihvYmosIGF0dHJpYiwgb3duZXIpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfYWRkX2ludGVnZXJfYXR0cmliKTsKCiAvKgogKiBGdW5jdGlvbiBpcmlhc19hZGRfb2N0c2VxX2F0dHJpYiAob2JqLCBuYW1lLCBvY3RldF9zZXEsIGxlbikKICoKICogICAgQWRkIGEgb2N0ZXQgc2VxdWVuY2UgYXR0cmlidXRlIHRvIGFuIExNLUlBUyBvYmplY3QKICoKICovCgp2b2lkIGlyaWFzX2FkZF9vY3RzZXFfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIGNoYXIgKm5hbWUsIF9fdTggKm9jdGV0cywKCQkJICAgICBpbnQgbGVuLCBpbnQgb3duZXIpCnsKCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CgoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKCglJUkRBX0FTU0VSVChuYW1lICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2N0ZXRzICE9IE5VTEwsIHJldHVybjspOwoKCWF0dHJpYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfYXR0cmliKSwgR0ZQX0FUT01JQyk7CglpZiAoYXR0cmliID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgYXR0cmlidXRlIVxuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCglhdHRyaWItPm1hZ2ljID0gSUFTX0FUVFJJQl9NQUdJQzsKCWF0dHJpYi0+bmFtZSA9IHN0cm5kdXAobmFtZSwgSUFTX01BWF9BVFRSSUJOQU1FKTsKCglhdHRyaWItPnZhbHVlID0gaXJpYXNfbmV3X29jdHNlcV92YWx1ZSggb2N0ZXRzLCBsZW4pOwoJaWYgKCFhdHRyaWItPm5hbWUgfHwgIWF0dHJpYi0+dmFsdWUpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgYXR0cmlidXRlIVxuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCWlmIChhdHRyaWItPnZhbHVlKQoJCQlpcmlhc19kZWxldGVfdmFsdWUoYXR0cmliLT52YWx1ZSk7CgkJa2ZyZWUoYXR0cmliLT5uYW1lKTsKCQlrZnJlZShhdHRyaWIpOwoJCXJldHVybjsKCX0KCglpcmlhc19hZGRfYXR0cmliKG9iaiwgYXR0cmliLCBvd25lcik7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19hZGRfb2N0c2VxX2F0dHJpYik7CgovKgogKiBGdW5jdGlvbiBpcmlhc19vYmplY3RfYWRkX3N0cmluZ19hdHRyaWIgKG9iaiwgc3RyaW5nKQogKgogKiAgICBBZGQgYSBzdHJpbmcgYXR0cmlidXRlIHRvIGFuIExNLUlBUyBvYmplY3QKICoKICovCnZvaWQgaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgY2hhciAqbmFtZSwgY2hhciAqdmFsdWUsCgkJCSAgICAgaW50IG93bmVyKQp7CglzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOwoKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuOyk7CgoJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHZhbHVlICE9IE5VTEwsIHJldHVybjspOwoKCWF0dHJpYiA9IGt6YWxsb2Moc2l6ZW9mKCBzdHJ1Y3QgaWFzX2F0dHJpYiksIEdGUF9BVE9NSUMpOwoJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgoJYXR0cmliLT5tYWdpYyA9IElBU19BVFRSSUJfTUFHSUM7CglhdHRyaWItPm5hbWUgPSBzdHJuZHVwKG5hbWUsIElBU19NQVhfQVRUUklCTkFNRSk7CgoJYXR0cmliLT52YWx1ZSA9IGlyaWFzX25ld19zdHJpbmdfdmFsdWUodmFsdWUpOwoJaWYgKCFhdHRyaWItPm5hbWUgfHwgIWF0dHJpYi0+dmFsdWUpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgYXR0cmlidXRlIVxuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCWlmIChhdHRyaWItPnZhbHVlKQoJCQlpcmlhc19kZWxldGVfdmFsdWUoYXR0cmliLT52YWx1ZSk7CgkJa2ZyZWUoYXR0cmliLT5uYW1lKTsKCQlrZnJlZShhdHRyaWIpOwoJCXJldHVybjsKCX0KCglpcmlhc19hZGRfYXR0cmliKG9iaiwgYXR0cmliLCBvd25lcik7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19hZGRfc3RyaW5nX2F0dHJpYik7CgovKgogKiBGdW5jdGlvbiBpcmlhc19uZXdfaW50ZWdlcl92YWx1ZSAoaW50ZWdlcikKICoKICogICAgQ3JlYXRlIG5ldyBJQVMgaW50ZWdlciB2YWx1ZQogKgogKi8Kc3RydWN0IGlhc192YWx1ZSAqaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUoaW50IGludGVnZXIpCnsKCXN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlOwoKCXZhbHVlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlhc192YWx1ZSksIEdGUF9BVE9NSUMpOwoJaWYgKHZhbHVlID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJdmFsdWUtPnR5cGUgPSBJQVNfSU5URUdFUjsKCXZhbHVlLT5sZW4gPSA0OwoJdmFsdWUtPnQuaW50ZWdlciA9IGludGVnZXI7CgoJcmV0dXJuIHZhbHVlOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfbmV3X3N0cmluZ192YWx1ZSAoc3RyaW5nKQogKgogKiAgICBDcmVhdGUgbmV3IElBUyBzdHJpbmcgdmFsdWUKICoKICogUGVyIElyTE1QIDEuMSwgNC4zLjMuMiwgc3RyaW5ncyBhcmUgdXAgdG8gMjU2IGNoYXJzIC0gSmVhbiBJSQogKi8Kc3RydWN0IGlhc192YWx1ZSAqaXJpYXNfbmV3X3N0cmluZ192YWx1ZShjaGFyICpzdHJpbmcpCnsKCXN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlOwoKCXZhbHVlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlhc192YWx1ZSksIEdGUF9BVE9NSUMpOwoJaWYgKHZhbHVlID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJdmFsdWUtPnR5cGUgPSBJQVNfU1RSSU5HOwoJdmFsdWUtPmNoYXJzZXQgPSBDU19BU0NJSTsKCXZhbHVlLT50LnN0cmluZyA9IHN0cm5kdXAoc3RyaW5nLCBJQVNfTUFYX1NUUklORyk7CglpZiAoIXZhbHVlLT50LnN0cmluZykgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlrZnJlZSh2YWx1ZSk7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJdmFsdWUtPmxlbiA9IHN0cmxlbih2YWx1ZS0+dC5zdHJpbmcpOwoKCXJldHVybiB2YWx1ZTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXNfbmV3X29jdHNlcV92YWx1ZSAob2N0ZXRzLCBsZW4pCiAqCiAqICAgIENyZWF0ZSBuZXcgSUFTIG9jdGV0LXNlcXVlbmNlIHZhbHVlCiAqCiAqIFBlciBJckxNUCAxLjEsIDQuMy4zLjIsIG9jdGV0LXNlcXVlbmNlIGFyZSB1cCB0byAxMDI0IGJ5dGVzIC0gSmVhbiBJSQogKi8Kc3RydWN0IGlhc192YWx1ZSAqaXJpYXNfbmV3X29jdHNlcV92YWx1ZShfX3U4ICpvY3RzZXEgLCBpbnQgbGVuKQp7CglzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZTsKCgl2YWx1ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpLCBHRlBfQVRPTUlDKTsKCWlmICh2YWx1ZSA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoKCXZhbHVlLT50eXBlID0gSUFTX09DVF9TRVE7CgkvKiBDaGVjayBsZW5ndGggKi8KCWlmKGxlbiA+IElBU19NQVhfT0NURVRfU1RSSU5HKQoJCWxlbiA9IElBU19NQVhfT0NURVRfU1RSSU5HOwoJdmFsdWUtPmxlbiA9IGxlbjsKCgl2YWx1ZS0+dC5vY3Rfc2VxID0ga21lbWR1cChvY3RzZXEsIGxlbiwgR0ZQX0FUT01JQyk7CglpZiAodmFsdWUtPnQub2N0X3NlcSA9PSBOVUxMKXsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJa2ZyZWUodmFsdWUpOwoJCXJldHVybiBOVUxMOwoJfQoJcmV0dXJuIHZhbHVlOwp9CgpzdHJ1Y3QgaWFzX3ZhbHVlICppcmlhc19uZXdfbWlzc2luZ192YWx1ZSh2b2lkKQp7CglzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZTsKCgl2YWx1ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpLCBHRlBfQVRPTUlDKTsKCWlmICh2YWx1ZSA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoKCXZhbHVlLT50eXBlID0gSUFTX01JU1NJTkc7CgoJcmV0dXJuIHZhbHVlOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhc19kZWxldGVfdmFsdWUgKHZhbHVlKQogKgogKiAgICBEZWxldGUgSUFTIHZhbHVlCiAqCiAqLwp2b2lkIGlyaWFzX2RlbGV0ZV92YWx1ZShzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZSkKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVCh2YWx1ZSAhPSBOVUxMLCByZXR1cm47KTsKCglzd2l0Y2ggKHZhbHVlLT50eXBlKSB7CgljYXNlIElBU19JTlRFR0VSOiAvKiBGYWxsdGhyb3VnaCAqLwoJY2FzZSBJQVNfTUlTU0lORzoKCQkvKiBObyBuZWVkIHRvIGRlYWxsb2NhdGUgKi8KCQlicmVhazsKCWNhc2UgSUFTX1NUUklORzoKCQkvKiBEZWFsbG9jYXRlIHN0cmluZyAqLwoJCWtmcmVlKHZhbHVlLT50LnN0cmluZyk7CgkJYnJlYWs7CgljYXNlIElBU19PQ1RfU0VROgoJCS8qIERlYWxsb2NhdGUgYnl0ZSBzdHJlYW0gKi8KCQkga2ZyZWUodmFsdWUtPnQub2N0X3NlcSk7CgkJIGJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIHZhbHVlIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCWJyZWFrOwoJfQoJa2ZyZWUodmFsdWUpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfZGVsZXRlX3ZhbHVlKTsK