LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcnF1ZXVlLmMKICogVmVyc2lvbjogICAgICAgMC4zCiAqIERlc2NyaXB0aW9uOiAgIEdlbmVyYWwgcXVldWUgaW1wbGVtZW50YXRpb24KICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFR1ZSBKdW4gIDkgMTM6Mjk6MzEgMTk5OAogKiBNb2RpZmllZCBhdDogICBTdW4gRGVjIDEyIDEzOjQ4OjIyIDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBNb2RpZmllZCBhdDogICBUaHUgSmFuICA0IDE0OjI5OjEwIENFVCAyMDAxCiAqIE1vZGlmaWVkIGJ5OiAgIE1hcmMgWnluZ2llciA8bXp5bmdpZXJAZnJlZXN1cmYuZnI+CiAqCiAqICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMTk5OSwgQWFnZSBLdmFsbmVzIDxhYWdlQGNzLnVpdC5ubz4KICogICAgIENvcHlyaWdodCAoQykgMTk5OCwgRGFnIEJyYXR0bGksCiAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiAgICAgVGhpcyBjb2RlIGlzIHRha2VuIGZyb20gdGhlIFZvcnRleCBPcGVyYXRpbmcgU3lzdGVtIHdyaXR0ZW4gYnkgQWFnZQogKiAgICAgS3ZhbG5lcy4gQWFnZSBoYXMgYWdyZWVkIHRoYXQgdGhpcyBjb2RlIGNhbiB1c2UgdGhlIEdQTCBsaWNlbmNlLAogKiAgICAgYWx0aG91Z2ggaGUgZG9lcyBub3QgdXNlIHRoYXQgbGljZW5jZSBpbiBoaXMgb3duIGNvZGUuCiAqCiAqICAgICBUaGlzIGNvcHlyaWdodCBkb2VzIGhvd2V2ZXIgX25vdF8gaW5jbHVkZSB0aGUgRUxGIGhhc2goKSBmdW5jdGlvbgogKiAgICAgd2hpY2ggSSBjdXJyZW50bHkgZG9uJ3Qga25vdyB3aGljaCBsaWNlbmNlIG9yIGNvcHlyaWdodCBpdAogKiAgICAgaGFzLiBQbGVhc2UgaW5mb3JtIG1lIGlmIHlvdSBrbm93LgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qCiAqIE5PVEUgOgogKiBUaGVyZSBhcmUgdmFyaW91cyBwcm9ibGVtcyB3aXRoIHRoaXMgcGFja2FnZSA6CiAqCW8gdGhlIGhhc2ggZnVuY3Rpb24gZm9yIGludHMgaXMgcGF0aGV0aWMgKGJ1dCBjb3VsZCBiZSBjaGFuZ2VkKQogKglvIGxvY2tpbmcgaXMgc29tZXRpbWUgc3VzcGljaW91cyAoZXNwZWNpYWxseSBkdXJpbmcgZW51bWVyYXRpb24pCiAqCW8gbW9zdCB1c2VycyBoYXZlIG9ubHkgYSBmZXcgZWxlbWVudHMgKD09IG92ZXJoZWFkKQogKglvIG1vc3QgdXNlcnMgbmV2ZXIgdXNlIHNlYWNoLCBzbyBkb24ndCBiZW5lZml0IGZyb20gaGFzaGluZwogKiBQcm9ibGVtIGFscmVhZHkgZml4ZWQgOgogKglvIG5vdCA2NCBiaXQgY29tcGxpYW50IChtb3N0IHVzZXJzIGRvIGhhc2h2ID0gKGludCkgc2VsZikKICoJbyBoYXNoYmluX3JlbW92ZSgpIGlzIGJyb2tlbiA9PiB1c2UgaGFzaGJpbl9yZW1vdmVfdGhpcygpCiAqIEkgdGhpbmsgbW9zdCB1c2VycyB3b3VsZCBiZSBiZXR0ZXIgc2VydmVkIGJ5IGEgc2ltcGxlIGxpbmtlZCBsaXN0CiAqIChsaWtlIGluY2x1ZGUvbGludXgvbGlzdC5oKSB3aXRoIGEgZ2xvYmFsIHNwaW5sb2NrIHBlciBsaXN0LgogKiBKZWFuIElJCiAqLwoKLyoKICogTm90ZXMgb24gdGhlIGNvbmN1cnJlbnQgYWNjZXNzIHRvIGhhc2hiaW4gYW5kIG90aGVyIFNNUCBpc3N1ZXMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKglIYXNoYmlucyBhcmUgdmVyeSBvZnRlbiBpbiB0aGUgSXJEQSBzdGFjayBhIGdsb2JhbCByZXBvc2l0b3J5IG9mCiAqIGluZm9ybWF0aW9uLCBhbmQgdGhlcmVmb3JlIHVzZWQgaW4gYSB2ZXJ5IGFzeW5jaHJvbm91cyBtYW5uZXIgZm9sbG93aW5nCiAqIHZhcmlvdXMgZXZlbnRzIChkcml2ZXIgY2FsbHMsIHRpbWVycywgdXNlciBjYWxscy4uLikuCiAqCVRoZXJlZm9yZSwgdmVyeSBvZnRlbiBpdCBpcyBoaWdobHkgaW1wb3J0YW50IHRvIGNvbnNpZGVyIHRoZQogKiBtYW5hZ2VtZW50IG9mIGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBoYXNoYmluIGFuZCBob3cgdG8gZ3VhcmFudGVlIHRoZQogKiBjb25zaXN0ZW5jeSBvZiB0aGUgb3BlcmF0aW9ucyBvbiBpdC4KICoKICoJRmlyc3QsIHdlIG5lZWQgdG8gZGVmaW5lIHRoZSBvYmplY3RpdmUgb2YgbG9ja2luZyA6CiAqCQkxKSBQcm90ZWN0IHVzZXIgZGF0YSAoY29udGVudCBwb2ludGVkIGJ5IHRoZSBoYXNoYmluKQogKgkJMikgUHJvdGVjdCBoYXNoYmluIHN0cnVjdHVyZSBpdHNlbGYgKGxpbmtlZCBsaXN0IGluIGVhY2ggYmluKQogKgogKgkJCSAgICAgT0xEIExPQ0tJTkcKICoJCQkgICAgIC0tLS0tLS0tLS0tCiAqCiAqCVRoZSBwcmV2aW91cyBsb2NraW5nIHN0cmF0ZWd5LCBlaXRoZXIgSEJfTE9DQUwgb3IgSEJfR0xPQkFMIHdlcmUKICogYm90aCBpbmFkZXF1YXRlIGluICpib3RoKiBhc3BlY3QuCiAqCQlvIEhCX0dMT0JBTCB3YXMgdXNpbmcgYSBzcGlubG9jayBmb3IgZWFjaCBiaW4gKGxvY2FsIGxvY2tpbmcpLgogKgkJbyBIQl9MT0NBTCB3YXMgZGlzYWJsaW5nIGlycSBvbiAqYWxsKiBDUFVzLCBzbyB1c2UgYSBzaW5nbGUKICoJCSAgZ2xvYmFsIHNlbWFwaG9yZS4KICoJVGhlIHByb2JsZW1zIHdlcmUgOgogKgkJQSkgR2xvYmFsIGlycSBkaXNhYmxpbmcgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSB0aGUga2VybmVsCiAqCQlCKSBObyBwcm90ZWN0aW9uIGZvciB0aGUgaGFzaGJpbiBzdHJ1Y3QgZ2xvYmFsIGRhdGEKICoJCQlvIGhhc2hiaW5fZGVsZXRlKCkKICoJCQlvIGhiX2N1cnJlbnQKICoJCUMpIE5vIHByb3RlY3Rpb24gZm9yIHVzZXIgZGF0YSBpbiBzb21lIGNhc2VzCiAqCiAqCUEpIEhCX0xPQ0FMIHVzZSBnbG9iYWwgaXJxIGRpc2FibGluZywgc28gZG9lc24ndCB3b3JrIG9uIGtlcm5lbAogKiAyLjUuWC4gRXZlbiB3aGVuIGl0IGlzIHN1cHBvcnRlZCAoa2VybmVsIDIuNC5YIGFuZCBlYXJsaWVyKSwgaXRzCiAqIHBlcmZvcm1hbmNlIGlzIG5vdCBzYXRpc2ZhY3Rvcnkgb24gU01QIHNldHVwcy4gTW9zdCBoYXNoYmlucyB3ZXJlCiAqIEhCX0xPQ0FMLCBzbyAoQSkgZGVmaW5pdGVseSBuZWVkIGZpeGluZy4KICoJQikgSEJfTE9DQUwgY291bGQgYmUgbW9kaWZpZWQgdG8gZml4IChCKS4gSG93ZXZlciwgYmVjYXVzZSBIQl9HTE9CQUwKICogbG9jayBvbmx5IHRoZSBpbmRpdmlkdWFsIGJpbnMsIGl0IHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBsb2NrIHRoZQogKiBnbG9iYWwgZGF0YSwgc28gY2FuJ3QgZG8gKEIpLgogKglDKSBTb21lIGZ1bmN0aW9ucyByZXR1cm4gcG9pbnRlciB0byBkYXRhIHRoYXQgaXMgc3RpbGwgaW4gdGhlCiAqIGhhc2hiaW4gOgogKgkJbyBoYXNoYmluX2ZpbmQoKQogKgkJbyBoYXNoYmluX2dldF9maXJzdCgpCiAqCQlvIGhhc2hiaW5fZ2V0X25leHQoKQogKglBcyB0aGUgZGF0YSBpcyBzdGlsbCBpbiB0aGUgaGFzaGJpbiwgaXQgbWF5IGJlIGNoYW5nZWQgb3IgZnJlZSdkCiAqIHdoaWxlIHRoZSBjYWxsZXIgaXMgZXhhbWluaW1nIHRoZSBkYXRhLiBJbiB0aG9zZSBjYXNlLCBsb2NraW5nIGNhbid0CiAqIGJlIGRvbmUgd2l0aGluIHRoZSBoYXNoYmluLCBidXQgbXVzdCBpbmNsdWRlIHVzZSBvZiB0aGUgZGF0YSB3aXRoaW4KICogdGhlIGNhbGxlci4KICoJVGhlIGNhbGxlciBjYW4gZWFzaWx5IGRvIHRoaXMgd2l0aCBIQl9MT0NBTCAoanVzdCBkaXNhYmxlIGlycXMpLgogKiBIb3dldmVyLCB0aGlzIGlzIGltcG9zc2libGUgd2l0aCBIQl9HTE9CQUwgYmVjYXVzZSB0aGUgY2FsbGVyIGhhcyBubwogKiB3YXkgdG8ga25vdyB0aGUgcHJvcGVyIGJpbiwgc28gZG9uJ3Qga25vdyB3aGljaCBzcGlubG9jayB0byB1c2UuCiAqCiAqCVF1aWNrIHN1bW1hcnkgOiBjYW4gbm8gbG9uZ2VyIHVzZSBIQl9MT0NBTCwgYW5kIEhCX0dMT0JBTCBpcwogKiBmdW5kYW1lbnRhbGx5IGJyb2tlbiBhbmQgd2lsbCBuZXZlciB3b3JrLgogKgogKgkJCSAgICAgTkVXIExPQ0tJTkcKICoJCQkgICAgIC0tLS0tLS0tLS0tCiAqCiAqCVRvIGZpeCB0aG9zZSBwcm9ibGVtcywgSSd2ZSBpbnRyb2R1Y2UgYSBmZXcgY2hhbmdlcyBpbiB0aGUKICogaGFzaGJpbiBsb2NraW5nIDoKICoJCTEpIE5ldyBIQl9MT0NLIHNjaGVtZQogKgkJMikgaGFzaGJpbi0+aGJfc3BpbmxvY2sKICoJCTMpIE5ldyBoYXNoYmluIHVzYWdlIHBvbGljeQogKgogKiBIQl9MT0NLIDoKICogLS0tLS0tLQogKglIQl9MT0NLIGlzIGEgbG9ja2luZyBzY2hlbWUgaW50ZXJtZWRpYXRlIGJldHdlZW4gdGhlIG9sZCBIQl9MT0NBTAogKiBhbmQgSEJfR0xPQkFMLiBJdCB1c2VzIGEgc2luZ2xlIHNwaW5sb2NrIHRvIHByb3RlY3QgdGhlIHdob2xlIGNvbnRlbnQKICogb2YgdGhlIGhhc2hiaW4uIEFzIGl0IGlzIGEgc2luZ2xlIHNwaW5sb2NrLCBpdCBjYW4gcHJvdGVjdCB0aGUgZ2xvYmFsCiAqIGRhdGEgb2YgdGhlIGhhc2hiaW4gYW5kIG5vdCBvbmx5IHRoZSBiaW5zIHRoZW1zZWx2ZXMuCiAqCUhCX0xPQ0sgY2FuIG9ubHkgcHJvdGVjdCBzb21lIG9mIHRoZSBoYXNoYmluIGNhbGxzLCBzbyBpdCBvbmx5IGxvY2sKICogY2FsbCB0aGF0IGNhbiBiZSBtYWRlIDEwMCUgc2FmZSBhbmQgbGVhdmUgb3RoZXIgY2FsbCB1bnByb3RlY3RlZC4KICoJSEJfTE9DSyBpbiB0aGVvcnkgaXMgc2xvd2VyIHRoYW4gSEJfR0xPQkFMLCBidXQgYXMgdGhlIGhhc2hiaW4KICogY29udGVudCBpcyBhbHdheXMgc21hbGwgY29udGVudGlvbiBpcyBub3QgaGlnaCwgc28gaXQgZG9lc24ndCBtYXR0ZXIKICogbXVjaC4gSEJfTE9DSyBpcyBwcm9iYWJseSBmYXN0ZXIgdGhhbiBIQl9MT0NBTC4KICoKICogaGFzaGJpbi0+aGJfc3BpbmxvY2sgOgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLQogKglUaGUgc3BpbmxvY2sgdGhhdCBIQl9MT0NLIHVzZXMgaXMgYXZhaWxhYmxlIGZvciBjYWxsZXIsIHNvIHRoYXQKICogdGhlIGNhbGxlciBjYW4gcHJvdGVjdCB1bnByb3RlY3RlZCBjYWxscyAoc2VlIGJlbG93KS4KICoJSWYgdGhlIGNhbGxlciB3YW50IHRvIGRvIGVudGlyZWx5IGl0cyBvd24gbG9ja2luZyAoSEJfTk9MT0NLKSwgaGUKICogY2FuIGRvIHNvIGFuZCBtYXkgdXNlIHNhZmVseSB0aGlzIHNwaW5sb2NrLgogKglMb2NraW5nIGlzIGRvbmUgbGlrZSB0aGlzIDoKICoJCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOwogKglSZWxlYXNpbmcgdGhlIGxvY2sgOgogKgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKICoKICogU2FmZSAmIFByb3RlY3RlZCBjYWxscyA6CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoJVGhlIGZvbGxvd2luZyBjYWxscyBhcmUgc2FmZSBvciBwcm90ZWN0ZWQgdmlhIEhCX0xPQ0sgOgogKgkJbyBoYXNoYmluX25ldygpCQktPiBzYWZlCiAqCQlvIGhhc2hiaW5fZGVsZXRlKCkKICoJCW8gaGFzaGJpbl9pbnNlcnQoKQogKgkJbyBoYXNoYmluX3JlbW92ZV9maXJzdCgpCiAqCQlvIGhhc2hiaW5fcmVtb3ZlKCkKICoJCW8gaGFzaGJpbl9yZW1vdmVfdGhpcygpCiAqCQlvIEhBU0hCSU5fR0VUX1NJWkUoKQktPiBhdG9taWMKICoKICoJVGhlIGZvbGxvd2luZyBjYWxscyBvbmx5IHByb3RlY3QgdGhlIGhhc2hiaW4gaXRzZWxmIDoKICoJCW8gaGFzaGJpbl9sb2NrX2ZpbmQoKQogKgkJbyBoYXNoYmluX2ZpbmRfbmV4dCgpCiAqCiAqIFVucHJvdGVjdGVkIGNhbGxzIDoKICogLS0tLS0tLS0tLS0tLS0tLS0KICoJVGhlIGZvbGxvd2luZyBjYWxscyBuZWVkIHRvIGJlIHByb3RlY3RlZCBieSB0aGUgY2FsbGVyIDoKICoJCW8gaGFzaGJpbl9maW5kKCkKICoJCW8gaGFzaGJpbl9nZXRfZmlyc3QoKQogKgkJbyBoYXNoYmluX2dldF9uZXh0KCkKICoKICogTG9ja2luZyBQb2xpY3kgOgogKiAtLS0tLS0tLS0tLS0tLQogKglJZiB0aGUgaGFzaGJpbiBpcyB1c2VkIG9ubHkgaW4gYSBzaW5nbGUgdGhyZWFkIG9mIGV4ZWN1dGlvbgogKiAoZXhwbGljaXRseSBvciBpbXBsaWNpdGVseSksIHlvdSBjYW4gdXNlIEhCX05PTE9DSwogKglJZiB0aGUgY2FsbGluZyBtb2R1bGUgYWxyZWFkeSBwcm92aWRlIGNvbmN1cnJlbnQgYWNjZXNzIHByb3RlY3Rpb24sCiAqIHlvdSBtYXkgdXNlIEhCX05PTE9DSy4KICoKICoJSW4gYWxsIG90aGVyIGNhc2VzLCB5b3UgbmVlZCB0byB1c2UgSEJfTE9DSyBhbmQgbG9jayB0aGUgaGFzaGJpbgogKiBldmVyeSB0aW1lIGJlZm9yZSBjYWxsaW5nIG9uZSBvZiB0aGUgdW5wcm90ZWN0ZWQgY2FsbHMuIFlvdSBhbHNvIG11c3QKICogdXNlIHRoZSBwb2ludGVyIHJldHVybmVkIGJ5IHRoZSB1bnByb3RlY3RlZCBjYWxsIHdpdGhpbiB0aGUgbG9ja2VkCiAqIHJlZ2lvbi4KICoKICogRXh0cmEgY2FyZSBmb3IgZW51bWVyYXRpb24gOgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgloYXNoYmluX2dldF9maXJzdCgpIGFuZCBoYXNoYmluX2dldF9uZXh0KCkgdXNlIHRoZSBoYXNoYmluIHRvCiAqIHN0b3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLCBpbiBoYl9jdXJyZW50LgogKglBcyBsb25nIGFzIHRoZSBoYXNoYmluIHJlbWFpbnMgbG9ja2VkLCB0aGlzIGlzIHNhZmUuIElmIHlvdSB1bmxvY2sKICogdGhlIGhhc2hiaW4sIHRoZSBjdXJyZW50IHBvc2l0aW9uIG1heSBjaGFuZ2UgaWYgYW55Ym9keSBlbHNlIG1vZGlmeQogKiBvciBlbnVtZXJhdGUgdGhlIGhhc2hiaW4uCiAqCVN1bW1hcnkgOiBkbyB0aGUgZnVsbCBlbnVtZXJhdGlvbiB3aGlsZSBsb2NrZWQuCiAqCiAqCUFsdGVybmF0aXZlbHksIHlvdSBtYXkgdXNlIGhhc2hiaW5fZmluZF9uZXh0KCkuIEJ1dCwgdGhpcyB3aWxsCiAqIGJlIHNsb3dlciwgaXMgbW9yZSBjb21wbGV4IHRvIHVzZSBhbmQgZG9lc24ndCBwcm90ZWN0IHRoZSBoYXNoYmluCiAqIGNvbnRlbnQuIFNvLCBjYXJlIGlzIG5lZWRlZCBoZXJlIGFzIHdlbGwuCiAqCiAqIE90aGVyIGlzc3VlcyA6CiAqIC0tLS0tLS0tLS0tLQogKglJIGJlbGlldmUgdGhhdCB3ZSBhcmUgb3ZlcmRvaW5nIGl0IGJ5IHVzaW5nIHNwaW5fbG9ja19pcnFzYXZlKCkKICogYW5kIHdlIHNob3VsZCB1c2Ugb25seSBzcGluX2xvY2tfYmgoKSBvciBzaW1pbGFyLiBCdXQsIEkgZG9uJ3QgaGF2ZQogKiB0aGUgYmFsbHMgdG8gdHJ5IGl0IG91dC4KICoJRG9uJ3QgYmVsaWV2ZSB0aGF0IGJlY2F1c2UgaGFzaGJpbiBhcmUgbm93IChzb21ld2hhdCkgU01QIHNhZmUKICogdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29kZSBpcy4gSGlnaGVyIGxheWVycyB0ZW5kIHRvIGJlIHNhZmVzdCwKICogYnV0IExBUCBhbmQgTE1QIHdvdWxkIG5lZWQgc29tZSBzZXJpb3VzIGRlZGljYXRlZCBsb3ZlLgogKgogKiBKZWFuIElJCiAqLwojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJxdWV1ZS5oPgoKLyoqKioqKioqKioqKioqKioqKioqKioqKiBRVUVVRSBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBIYXNoYmluCiAqLwojZGVmaW5lIEdFVF9IQVNIQklOKHgpICggeCAmIEhBU0hCSU5fTUFTSyApCgovKgogKiBGdW5jdGlvbiBoYXNoIChuYW1lKQogKgogKiAgICBUaGlzIGZ1bmN0aW9uIGhhc2ggdGhlIGlucHV0IHN0cmluZyAnbmFtZScgdXNpbmcgdGhlIEVMRiBoYXNoCiAqICAgIGZ1bmN0aW9uIGZvciBzdHJpbmdzLgogKi8Kc3RhdGljIF9fdTMyIGhhc2goIGNvbnN0IGNoYXIqIG5hbWUpCnsKCV9fdTMyIGggPSAwOwoJX191MzIgZzsKCgl3aGlsZSgqbmFtZSkgewoJCWggPSAoaDw8NCkgKyAqbmFtZSsrOwoJCWlmICgoZyA9IChoICYgMHhmMDAwMDAwMCkpKQoJCQloIF49Zz4+MjQ7CgkJaCAmPX5nOwoJfQoJcmV0dXJuIGg7Cn0KCi8qCiAqIEZ1bmN0aW9uIGVucXVldWVfZmlyc3QgKHF1ZXVlLCBwcm9jKQogKgogKiAgICBJbnNlcnQgaXRlbSBmaXJzdCBpbiBxdWV1ZS4KICoKICovCnN0YXRpYyB2b2lkIGVucXVldWVfZmlyc3QoaXJkYV9xdWV1ZV90ICoqcXVldWUsIGlyZGFfcXVldWVfdCogZWxlbWVudCkKewoKCUlSREFfREVCVUcoIDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCS8qCgkgKiBDaGVjayBpZiBxdWV1ZSBpcyBlbXB0eS4KCSAqLwoJaWYgKCAqcXVldWUgPT0gTlVMTCApIHsKCQkvKgoJCSAqIFF1ZXVlIGlzIGVtcHR5LiAgSW5zZXJ0IG9uZSBlbGVtZW50IGludG8gdGhlIHF1ZXVlLgoJCSAqLwoJCWVsZW1lbnQtPnFfbmV4dCA9IGVsZW1lbnQtPnFfcHJldiA9ICpxdWV1ZSA9IGVsZW1lbnQ7CgoJfSBlbHNlIHsKCQkvKgoJCSAqIFF1ZXVlIGlzIG5vdCBlbXB0eS4gIEluc2VydCBlbGVtZW50IGludG8gZnJvbnQgb2YgcXVldWUuCgkJICovCgkJZWxlbWVudC0+cV9uZXh0ICAgICAgICAgID0gKCpxdWV1ZSk7CgkJKCpxdWV1ZSktPnFfcHJldi0+cV9uZXh0ID0gZWxlbWVudDsKCQllbGVtZW50LT5xX3ByZXYgICAgICAgICAgPSAoKnF1ZXVlKS0+cV9wcmV2OwoJCSgqcXVldWUpLT5xX3ByZXYgICAgICAgICA9IGVsZW1lbnQ7CgkJKCpxdWV1ZSkgICAgICAgICAgICAgICAgID0gZWxlbWVudDsKCX0KfQoKCi8qCiAqIEZ1bmN0aW9uIGRlcXVldWUgKHF1ZXVlKQogKgogKiAgICBSZW1vdmUgZmlyc3QgZW50cnkgaW4gcXVldWUKICoKICovCnN0YXRpYyBpcmRhX3F1ZXVlX3QgKmRlcXVldWVfZmlyc3QoaXJkYV9xdWV1ZV90ICoqcXVldWUpCnsKCWlyZGFfcXVldWVfdCAqcmV0OwoKCUlSREFfREVCVUcoIDQsICJkZXF1ZXVlX2ZpcnN0KClcbiIpOwoKCS8qCgkgKiBTZXQgcmV0dXJuIHZhbHVlCgkgKi8KCXJldCA9ICAqcXVldWU7CgoJaWYgKCAqcXVldWUgPT0gTlVMTCApIHsKCQkvKgoJCSAqIFF1ZXVlIHdhcyBlbXB0eS4KCQkgKi8KCX0gZWxzZSBpZiAoICgqcXVldWUpLT5xX25leHQgPT0gKnF1ZXVlICkgewoJCS8qCgkJICogIFF1ZXVlIG9ubHkgY29udGFpbmVkIGEgc2luZ2xlIGVsZW1lbnQuIEl0IHdpbGwgbm93IGJlCgkJICogIGVtcHR5LgoJCSAqLwoJCSpxdWV1ZSA9IE5VTEw7Cgl9IGVsc2UgewoJCS8qCgkJICogUXVldWUgY29udGFpbmVkIHNldmVyYWwgZWxlbWVudC4gIFJlbW92ZSB0aGUgZmlyc3Qgb25lLgoJCSAqLwoJCSgqcXVldWUpLT5xX3ByZXYtPnFfbmV4dCA9ICgqcXVldWUpLT5xX25leHQ7CgkJKCpxdWV1ZSktPnFfbmV4dC0+cV9wcmV2ID0gKCpxdWV1ZSktPnFfcHJldjsKCQkqcXVldWUgPSAoKnF1ZXVlKS0+cV9uZXh0OwoJfQoKCS8qCgkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgZW50cnkgKG9yIE5VTEwgb2YgcXVldWUgd2FzIGVtcHR5KS4KCSAqLwoJcmV0dXJuIHJldDsKfQoKLyoKICogRnVuY3Rpb24gZGVxdWV1ZV9nZW5lcmFsIChxdWV1ZSwgZWxlbWVudCkKICoKICoKICovCnN0YXRpYyBpcmRhX3F1ZXVlX3QgKmRlcXVldWVfZ2VuZXJhbChpcmRhX3F1ZXVlX3QgKipxdWV1ZSwgaXJkYV9xdWV1ZV90KiBlbGVtZW50KQp7CglpcmRhX3F1ZXVlX3QgKnJldDsKCglJUkRBX0RFQlVHKCA0LCAiZGVxdWV1ZV9nZW5lcmFsKClcbiIpOwoKCS8qCgkgKiBTZXQgcmV0dXJuIHZhbHVlCgkgKi8KCXJldCA9ICAqcXVldWU7CgoJaWYgKCAqcXVldWUgPT0gTlVMTCApIHsKCQkvKgoJCSAqIFF1ZXVlIHdhcyBlbXB0eS4KCQkgKi8KCX0gZWxzZSBpZiAoICgqcXVldWUpLT5xX25leHQgPT0gKnF1ZXVlICkgewoJCS8qCgkJICogIFF1ZXVlIG9ubHkgY29udGFpbmVkIGEgc2luZ2xlIGVsZW1lbnQuIEl0IHdpbGwgbm93IGJlCgkJICogIGVtcHR5LgoJCSAqLwoJCSpxdWV1ZSA9IE5VTEw7CgoJfSBlbHNlIHsKCQkvKgoJCSAqICBSZW1vdmUgc3BlY2lmaWMgZWxlbWVudC4KCQkgKi8KCQllbGVtZW50LT5xX3ByZXYtPnFfbmV4dCA9IGVsZW1lbnQtPnFfbmV4dDsKCQllbGVtZW50LT5xX25leHQtPnFfcHJldiA9IGVsZW1lbnQtPnFfcHJldjsKCQlpZiAoICgqcXVldWUpID09IGVsZW1lbnQpCgkJCSgqcXVldWUpID0gZWxlbWVudC0+cV9uZXh0OwoJfQoKCS8qCgkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgZW50cnkgKG9yIE5VTEwgb2YgcXVldWUgd2FzIGVtcHR5KS4KCSAqLwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKiBIQVNIQklOIE1BTkFHRU1FTlQgKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogRnVuY3Rpb24gaGFzaGJpbl9jcmVhdGUgKCB0eXBlLCBuYW1lICkKICoKICogICAgQ3JlYXRlIGhhc2hiaW4hCiAqCiAqLwpoYXNoYmluX3QgKmhhc2hiaW5fbmV3KGludCB0eXBlKQp7CgloYXNoYmluX3QqIGhhc2hiaW47CgoJLyoKCSAqIEFsbG9jYXRlIG5ldyBoYXNoYmluCgkgKi8KCWhhc2hiaW4gPSBremFsbG9jKHNpemVvZigqaGFzaGJpbiksIEdGUF9BVE9NSUMpOwoJaWYgKCFoYXNoYmluKQoJCXJldHVybiBOVUxMOwoKCS8qCgkgKiBJbml0aWFsaXplIHN0cnVjdHVyZQoJICovCgloYXNoYmluLT5oYl90eXBlID0gdHlwZTsKCWhhc2hiaW4tPm1hZ2ljID0gSEJfTUFHSUM7CgkvL2hhc2hiaW4tPmhiX2N1cnJlbnQgPSBOVUxMOwoKCS8qIE1ha2Ugc3VyZSBhbGwgc3BpbmxvY2sncyBhcmUgdW5sb2NrZWQgKi8KCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CgkJc3Bpbl9sb2NrX2luaXQoJmhhc2hiaW4tPmhiX3NwaW5sb2NrKTsKCX0KCglyZXR1cm4gaGFzaGJpbjsKfQpFWFBPUlRfU1lNQk9MKGhhc2hiaW5fbmV3KTsKCgovKgogKiBGdW5jdGlvbiBoYXNoYmluX2RlbGV0ZSAoaGFzaGJpbiwgZnJlZV9mdW5jKQogKgogKiAgICBEZXN0cm95IGhhc2hiaW4sIHRoZSBmcmVlX2Z1bmMgY2FuIGJlIGEgdXNlciBzdXBwbGllZCBzcGVjaWFsIHJvdXRpbmUKICogICAgZm9yIGRlYWxsb2NhdGluZyB0aGlzIHN0cnVjdHVyZSBpZiBpdCdzIGNvbXBsZXguIElmIG5vdCB0aGUgdXNlciBjYW4KICogICAganVzdCBzdXBwbHkga2ZyZWUsIHdoaWNoIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhlIGpvYi4KICovCiNpZmRlZiBDT05GSUdfTE9DS0RFUApzdGF0aWMgaW50IGhhc2hiaW5fbG9ja19kZXB0aCA9IDA7CiNlbmRpZgppbnQgaGFzaGJpbl9kZWxldGUoIGhhc2hiaW5fdCogaGFzaGJpbiwgRlJFRV9GVU5DIGZyZWVfZnVuYykKewoJaXJkYV9xdWV1ZV90KiBxdWV1ZTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwoJaW50IGk7CgoJSVJEQV9BU1NFUlQoaGFzaGJpbiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKGhhc2hiaW4tPm1hZ2ljID09IEhCX01BR0lDLCByZXR1cm4gLTE7KTsKCgkvKiBTeW5jaHJvbml6ZSAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKCQlzcGluX2xvY2tfaXJxc2F2ZV9uZXN0ZWQoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncywKCQkJCQkgaGFzaGJpbl9sb2NrX2RlcHRoKyspOwoJfQoKCS8qCgkgKiAgRnJlZSB0aGUgZW50cmllcyBpbiB0aGUgaGFzaGJpbiwgVE9ETzogdXNlIGhhc2hiaW5fY2xlYXIgd2hlbgoJICogIGl0IGhhcyBiZWVuIHNob3duIHRvIHdvcmsKCSAqLwoJZm9yIChpID0gMDsgaSA8IEhBU0hCSU5fU0laRTsgaSArKyApIHsKCQlxdWV1ZSA9IGRlcXVldWVfZmlyc3QoKGlyZGFfcXVldWVfdCoqKSAmaGFzaGJpbi0+aGJfcXVldWVbaV0pOwoJCXdoaWxlIChxdWV1ZSApIHsKCQkJaWYgKGZyZWVfZnVuYykKCQkJCSgqZnJlZV9mdW5jKShxdWV1ZSk7CgkJCXF1ZXVlID0gZGVxdWV1ZV9maXJzdCgKCQkJCShpcmRhX3F1ZXVlX3QqKikgJmhhc2hiaW4tPmhiX3F1ZXVlW2ldKTsKCQl9Cgl9CgoJLyogQ2xlYW51cCBsb2NhbCBkYXRhICovCgloYXNoYmluLT5oYl9jdXJyZW50ID0gTlVMTDsKCWhhc2hiaW4tPm1hZ2ljID0gfkhCX01BR0lDOwoKCS8qIFJlbGVhc2UgbG9jayAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSykgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CiNpZmRlZiBDT05GSUdfTE9DS0RFUAoJCWhhc2hiaW5fbG9ja19kZXB0aC0tOwojZW5kaWYKCX0KCgkvKgoJICogIEZyZWUgdGhlIGhhc2hiaW4gc3RydWN0dXJlCgkgKi8KCWtmcmVlKGhhc2hiaW4pOwoKCXJldHVybiAwOwp9CkVYUE9SVF9TWU1CT0woaGFzaGJpbl9kZWxldGUpOwoKLyoqKioqKioqKioqKioqKioqKioqKiBIQVNIQklOIExJU1QgT1BFUkFUSU9OUyAqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBGdW5jdGlvbiBoYXNoYmluX2luc2VydCAoaGFzaGJpbiwgZW50cnksIG5hbWUpCiAqCiAqICAgIEluc2VydCBhbiBlbnRyeSBpbnRvIHRoZSBoYXNoYmluCiAqCiAqLwp2b2lkIGhhc2hiaW5faW5zZXJ0KGhhc2hiaW5fdCogaGFzaGJpbiwgaXJkYV9xdWV1ZV90KiBlbnRyeSwgbG9uZyBoYXNodiwKCQkgICAgY29uc3QgY2hhciogbmFtZSkKewoJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CglpbnQgYmluOwoKCUlSREFfREVCVUcoIDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKCBoYXNoYmluICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoIGhhc2hiaW4tPm1hZ2ljID09IEhCX01BR0lDLCByZXR1cm47KTsKCgkvKgoJICogTG9jYXRlIGhhc2hiaW4KCSAqLwoJaWYgKCBuYW1lICkKCQloYXNodiA9IGhhc2goIG5hbWUgKTsKCWJpbiA9IEdFVF9IQVNIQklOKCBoYXNodiApOwoKCS8qIFN5bmNocm9uaXplICovCglpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCgoJLyoKCSAqIFN0b3JlIG5hbWUgYW5kIGtleQoJICovCgllbnRyeS0+cV9oYXNoID0gaGFzaHY7CglpZiAoIG5hbWUgKQoJCXN0cmxjcHkoIGVudHJ5LT5xX25hbWUsIG5hbWUsIHNpemVvZihlbnRyeS0+cV9uYW1lKSk7CgoJLyoKCSAqIEluc2VydCBuZXcgZW50cnkgZmlyc3QKCSAqLwoJZW5xdWV1ZV9maXJzdCggKGlyZGFfcXVldWVfdCoqKSAmaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdLAoJCSAgICAgICBlbnRyeSk7CgloYXNoYmluLT5oYl9zaXplKys7CgoJLyogUmVsZWFzZSBsb2NrICovCglpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7Cgl9IC8qIERlZmF1bHQgaXMgbm8tbG9jayAgKi8KfQpFWFBPUlRfU1lNQk9MKGhhc2hiaW5faW5zZXJ0KTsKCi8qCiAqICBGdW5jdGlvbiBoYXNoYmluX3JlbW92ZV9maXJzdCAoaGFzaGJpbikKICoKICogICAgUmVtb3ZlIGZpcnN0IGVudHJ5IG9mIHRoZSBoYXNoYmluCiAqCiAqIE5vdGUgOiB0aGlzIGZ1bmN0aW9uIG5vIGxvbmdlciB1c2UgaGFzaGJpbl9yZW1vdmUoKSwgYnV0IGRvZXMgdGhpbmdzCiAqIHNpbWlsYXIgdG8gaGFzaGJpbl9yZW1vdmVfdGhpcygpLCBzbyBjYW4gYmUgY29uc2lkZXJlZCBzYWZlLgogKiBKZWFuIElJCiAqLwp2b2lkICpoYXNoYmluX3JlbW92ZV9maXJzdCggaGFzaGJpbl90ICpoYXNoYmluKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKCWlyZGFfcXVldWVfdCAqZW50cnkgPSBOVUxMOwoKCS8qIFN5bmNocm9uaXplICovCglpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCgoJZW50cnkgPSBoYXNoYmluX2dldF9maXJzdCggaGFzaGJpbik7CglpZiAoIGVudHJ5ICE9IE5VTEwpIHsKCQlpbnQJYmluOwoJCWxvbmcJaGFzaHY7CgkJLyoKCQkgKiBMb2NhdGUgaGFzaGJpbgoJCSAqLwoJCWhhc2h2ID0gZW50cnktPnFfaGFzaDsKCQliaW4gPSBHRVRfSEFTSEJJTiggaGFzaHYgKTsKCgkJLyoKCQkgKiBEZXF1ZXVlIHRoZSBlbnRyeS4uLgoJCSAqLwoJCWRlcXVldWVfZ2VuZXJhbCggKGlyZGFfcXVldWVfdCoqKSAmaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdLAoJCQkJIChpcmRhX3F1ZXVlX3QqKSBlbnRyeSApOwoJCWhhc2hiaW4tPmhiX3NpemUtLTsKCQllbnRyeS0+cV9uZXh0ID0gTlVMTDsKCQllbnRyeS0+cV9wcmV2ID0gTlVMTDsKCgkJLyoKCQkgKiAgQ2hlY2sgaWYgdGhpcyBpdGVtIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgYW5kIGluCgkJICogIHRoYXQgY2FzZSB3ZSBtdXN0IHJlc2V0IGhiX2N1cnJlbnQKCQkgKi8KCQlpZiAoIGVudHJ5ID09IGhhc2hiaW4tPmhiX2N1cnJlbnQpCgkJCWhhc2hiaW4tPmhiX2N1cnJlbnQgPSBOVUxMOwoJfQoKCS8qIFJlbGVhc2UgbG9jayAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCgoJcmV0dXJuIGVudHJ5Owp9CgoKLyoKICogIEZ1bmN0aW9uIGhhc2hiaW5fcmVtb3ZlIChoYXNoYmluLCBoYXNodiwgbmFtZSkKICoKICogICAgUmVtb3ZlIGVudHJ5IHdpdGggdGhlIGdpdmVuIG5hbWUKICoKICogIFRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBoaWdobHkgZGlzY291cmFnZWQsIGJlY2F1c2UgdGhlIHdob2xlCiAqICBjb25jZXB0IGJlaGluZCBoYXNoYmluX3JlbW92ZSgpIGlzIGJyb2tlbi4gSW4gbWFueSBjYXNlcywgaXQncyBub3QKICogIHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgdW5pY2l0eSBvZiB0aGUgaW5kZXggKGVpdGhlciBoYXNodiBvciBuYW1lKSwKICogIGxlYWRpbmcgdG8gcmVtb3ZpbmcgdGhlIFdST05HIGVudHJ5LgogKiAgVGhlIG9ubHkgc2ltcGxlIHNhZmUgdXNlIGlzIDoKICoJCWhhc2hiaW5fcmVtb3ZlKGhhc2JpbiwgKGludCkgc2VsZiwgTlVMTCk7CiAqICBJbiBvdGhlciBjYXNlLCB5b3UgbXVzdCB0aGluayBoYXJkIHRvIGd1YXJhbnRlZSB1bmljaXR5IG9mIHRoZSBpbmRleC4KICogIEplYW4gSUkKICovCnZvaWQqIGhhc2hiaW5fcmVtb3ZlKCBoYXNoYmluX3QqIGhhc2hiaW4sIGxvbmcgaGFzaHYsIGNvbnN0IGNoYXIqIG5hbWUpCnsKCWludCBiaW4sIGZvdW5kID0gRkFMU0U7Cgl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKCWlyZGFfcXVldWVfdCogZW50cnk7CgoJSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoIGhhc2hiaW4gIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuIE5VTEw7KTsKCgkvKgoJICogTG9jYXRlIGhhc2hiaW4KCSAqLwoJaWYgKCBuYW1lICkKCQloYXNodiA9IGhhc2goIG5hbWUgKTsKCWJpbiA9IEdFVF9IQVNIQklOKCBoYXNodiApOwoKCS8qIFN5bmNocm9uaXplICovCglpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCgoJLyoKCSAqIFNlYXJjaCBmb3IgZW50cnkKCSAqLwoJZW50cnkgPSBoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF07CglpZiAoIGVudHJ5ICkgewoJCWRvIHsKCQkJLyoKCQkJICogQ2hlY2sgZm9yIGtleQoJCQkgKi8KCQkJaWYgKCBlbnRyeS0+cV9oYXNoID09IGhhc2h2ICkgewoJCQkJLyoKCQkJCSAqIE5hbWUgY29tcGFyZSB0b28/CgkJCQkgKi8KCQkJCWlmICggbmFtZSApIHsKCQkJCQlpZiAoIHN0cmNtcCggZW50cnktPnFfbmFtZSwgbmFtZSkgPT0gMCkKCQkJCQl7CgkJCQkJCWZvdW5kID0gVFJVRTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlmb3VuZCA9IFRSVUU7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJZW50cnkgPSBlbnRyeS0+cV9uZXh0OwoJCX0gd2hpbGUgKCBlbnRyeSAhPSBoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0gKTsKCX0KCgkvKgoJICogSWYgZW50cnkgd2FzIGZvdW5kLCBkZXF1ZXVlIGl0CgkgKi8KCWlmICggZm91bmQgKSB7CgkJZGVxdWV1ZV9nZW5lcmFsKCAoaXJkYV9xdWV1ZV90KiopICZoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0sCgkJCQkgKGlyZGFfcXVldWVfdCopIGVudHJ5ICk7CgkJaGFzaGJpbi0+aGJfc2l6ZS0tOwoKCQkvKgoJCSAqICBDaGVjayBpZiB0aGlzIGl0ZW0gaXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLCBhbmQgaW4KCQkgKiAgdGhhdCBjYXNlIHdlIG11c3QgcmVzZXQgaGJfY3VycmVudAoJCSAqLwoJCWlmICggZW50cnkgPT0gaGFzaGJpbi0+aGJfY3VycmVudCkKCQkJaGFzaGJpbi0+aGJfY3VycmVudCA9IE5VTEw7Cgl9CgoJLyogUmVsZWFzZSBsb2NrICovCglpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7Cgl9IC8qIERlZmF1bHQgaXMgbm8tbG9jayAgKi8KCgoJLyogUmV0dXJuICovCglpZiAoIGZvdW5kICkKCQlyZXR1cm4gZW50cnk7CgllbHNlCgkJcmV0dXJuIE5VTEw7Cgp9CkVYUE9SVF9TWU1CT0woaGFzaGJpbl9yZW1vdmUpOwoKLyoKICogIEZ1bmN0aW9uIGhhc2hiaW5fcmVtb3ZlX3RoaXMgKGhhc2hiaW4sIGVudHJ5KQogKgogKiAgICBSZW1vdmUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZQogKgogKiBJbiBzb21lIGNhc2VzLCB0aGUgdXNlciBvZiBoYXNoYmluIGNhbid0IGd1YXJhbnRlZSB0aGUgdW5pY2l0eQogKiBvZiBlaXRoZXIgdGhlIGhhc2h2IG9yIG5hbWUuCiAqIEluIHRob3NlIGNhc2VzLCB1c2luZyB0aGUgYWJvdmUgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBjYXVzZSB0cm91YmxlcywKICogc28gd2UgdXNlIHRoaXMgb25lIGluc3RlYWQuLi4KICogQW5kIGJ5IHRoZSB3YXksIGl0J3MgYWxzbyBmYXN0ZXIsIGJlY2F1c2Ugd2Ugc2tpcCB0aGUgc2VhcmNoIHBoYXNlIDstKQogKi8Kdm9pZCogaGFzaGJpbl9yZW1vdmVfdGhpcyggaGFzaGJpbl90KiBoYXNoYmluLCBpcmRhX3F1ZXVlX3QqIGVudHJ5KQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKCWludAliaW47Cglsb25nCWhhc2h2OwoKCUlSREFfREVCVUcoIDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKCBoYXNoYmluICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CglJUkRBX0FTU0VSVCggaGFzaGJpbi0+bWFnaWMgPT0gSEJfTUFHSUMsIHJldHVybiBOVUxMOyk7CglJUkRBX0FTU0VSVCggZW50cnkgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKCgkvKiBTeW5jaHJvbml6ZSAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLwoKCS8qIENoZWNrIGlmIHZhbGlkIGFuZCBub3QgYWxyZWFkeSByZW1vdmVkLi4uICovCglpZigoZW50cnktPnFfbmV4dCA9PSBOVUxMKSB8fCAoZW50cnktPnFfcHJldiA9PSBOVUxMKSkgewoJCWVudHJ5ID0gTlVMTDsKCQlnb3RvIG91dDsKCX0KCgkvKgoJICogTG9jYXRlIGhhc2hiaW4KCSAqLwoJaGFzaHYgPSBlbnRyeS0+cV9oYXNoOwoJYmluID0gR0VUX0hBU0hCSU4oIGhhc2h2ICk7CgoJLyoKCSAqIERlcXVldWUgdGhlIGVudHJ5Li4uCgkgKi8KCWRlcXVldWVfZ2VuZXJhbCggKGlyZGFfcXVldWVfdCoqKSAmaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdLAoJCQkgKGlyZGFfcXVldWVfdCopIGVudHJ5ICk7CgloYXNoYmluLT5oYl9zaXplLS07CgllbnRyeS0+cV9uZXh0ID0gTlVMTDsKCWVudHJ5LT5xX3ByZXYgPSBOVUxMOwoKCS8qCgkgKiAgQ2hlY2sgaWYgdGhpcyBpdGVtIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgYW5kIGluCgkgKiAgdGhhdCBjYXNlIHdlIG11c3QgcmVzZXQgaGJfY3VycmVudAoJICovCglpZiAoIGVudHJ5ID09IGhhc2hiaW4tPmhiX2N1cnJlbnQpCgkJaGFzaGJpbi0+aGJfY3VycmVudCA9IE5VTEw7Cm91dDoKCS8qIFJlbGVhc2UgbG9jayAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCgoJcmV0dXJuIGVudHJ5Owp9CkVYUE9SVF9TWU1CT0woaGFzaGJpbl9yZW1vdmVfdGhpcyk7CgovKioqKioqKioqKioqKioqKioqKioqKiogSEFTSEJJTiBFTlVNRVJBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qCiAqIEZ1bmN0aW9uIGhhc2hiaW5fY29tbW9uX2ZpbmQgKGhhc2hiaW4sIGhhc2h2LCBuYW1lKQogKgogKiAgICBGaW5kIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gaGFzaHYgb3IgbmFtZQogKgogKi8Kdm9pZCogaGFzaGJpbl9maW5kKCBoYXNoYmluX3QqIGhhc2hiaW4sIGxvbmcgaGFzaHYsIGNvbnN0IGNoYXIqIG5hbWUgKQp7CglpbnQgYmluOwoJaXJkYV9xdWV1ZV90KiBlbnRyeTsKCglJUkRBX0RFQlVHKCA0LCAiaGFzaGJpbl9maW5kKClcbiIpOwoKCUlSREFfQVNTRVJUKCBoYXNoYmluICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CglJUkRBX0FTU0VSVCggaGFzaGJpbi0+bWFnaWMgPT0gSEJfTUFHSUMsIHJldHVybiBOVUxMOyk7CgoJLyoKCSAqIExvY2F0ZSBoYXNoYmluCgkgKi8KCWlmICggbmFtZSApCgkJaGFzaHYgPSBoYXNoKCBuYW1lICk7CgliaW4gPSBHRVRfSEFTSEJJTiggaGFzaHYgKTsKCgkvKgoJICogU2VhcmNoIGZvciBlbnRyeQoJICovCgllbnRyeSA9IGhhc2hiaW4tPmhiX3F1ZXVlWyBiaW5dOwoJaWYgKCBlbnRyeSApIHsKCQlkbyB7CgkJCS8qCgkJCSAqIENoZWNrIGZvciBrZXkKCQkJICovCgkJCWlmICggZW50cnktPnFfaGFzaCA9PSBoYXNodiApIHsKCQkJCS8qCgkJCQkgKiBOYW1lIGNvbXBhcmUgdG9vPwoJCQkJICovCgkJCQlpZiAoIG5hbWUgKSB7CgkJCQkJaWYgKCBzdHJjbXAoIGVudHJ5LT5xX25hbWUsIG5hbWUgKSA9PSAwICkgewoJCQkJCQlyZXR1cm4gZW50cnk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gZW50cnk7CgkJCQl9CgkJCX0KCQkJZW50cnkgPSBlbnRyeS0+cV9uZXh0OwoJCX0gd2hpbGUgKCBlbnRyeSAhPSBoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0gKTsKCX0KCglyZXR1cm4gTlVMTDsKfQpFWFBPUlRfU1lNQk9MKGhhc2hiaW5fZmluZCk7CgovKgogKiBGdW5jdGlvbiBoYXNoYmluX2xvY2tfZmluZCAoaGFzaGJpbiwgaGFzaHYsIG5hbWUpCiAqCiAqICAgIEZpbmQgaXRlbSB3aXRoIHRoZSBnaXZlbiBoYXNodiBvciBuYW1lCiAqCiAqIFNhbWUsIGJ1dCB3aXRoIHNwaW5sb2NrIHByb3RlY3Rpb24uLi4KICogSSBjYWxsIGl0IHNhZmUsIGJ1dCBpdCdzIG9ubHkgc2FmZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGhhc2hiaW4sIG5vdCBpdHMKICogY29udGVudC4gLSBKZWFuIElJCiAqLwp2b2lkKiBoYXNoYmluX2xvY2tfZmluZCggaGFzaGJpbl90KiBoYXNoYmluLCBsb25nIGhhc2h2LCBjb25zdCBjaGFyKiBuYW1lICkKewoJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CglpcmRhX3F1ZXVlX3QqIGVudHJ5OwoKCS8qIFN5bmNocm9uaXplICovCglzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCgkvKgoJICogU2VhcmNoIGZvciBlbnRyeQoJICovCgllbnRyeSA9IChpcmRhX3F1ZXVlX3QqICkgaGFzaGJpbl9maW5kKCBoYXNoYmluLCBoYXNodiwgbmFtZSApOwoKCS8qIFJlbGVhc2UgbG9jayAqLwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gZW50cnk7Cn0KRVhQT1JUX1NZTUJPTChoYXNoYmluX2xvY2tfZmluZCk7CgovKgogKiBGdW5jdGlvbiBoYXNoYmluX2ZpbmQgKGhhc2hiaW4sIGhhc2h2LCBuYW1lLCBwbmV4dCkKICoKICogICAgRmluZCBhbiBpdGVtIHdpdGggdGhlIGdpdmVuIGhhc2h2IG9yIG5hbWUsIGFuZCBpdHMgc3VjY2Vzc29yCiAqCiAqIFRoaXMgZnVuY3Rpb24gYWxsb3cgdG8gZG8gY29uY3VycmVudCBlbnVtZXJhdGlvbnMgd2l0aG91dCB0aGUKICogbmVlZCB0byBsb2NrIG92ZXIgdGhlIHdob2xlIHNlc3Npb24sIGJlY2F1c2UgdGhlIGNhbGxlciBrZWVwIHRoZQogKiBjb250ZXh0IG9mIHRoZSBzZWFyY2guIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBtaWdodCBmYWlsIGFuZCByZXR1cm4KICogTlVMTCBpZiB0aGUgZW50cnkgaXMgcmVtb3ZlZC4gLSBKZWFuIElJCiAqLwp2b2lkKiBoYXNoYmluX2ZpbmRfbmV4dCggaGFzaGJpbl90KiBoYXNoYmluLCBsb25nIGhhc2h2LCBjb25zdCBjaGFyKiBuYW1lLAoJCQkgdm9pZCAqKiBwbmV4dCkKewoJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CglpcmRhX3F1ZXVlX3QqIGVudHJ5OwoKCS8qIFN5bmNocm9uaXplICovCglzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCgkvKgoJICogU2VhcmNoIGZvciBjdXJyZW50IGVudHJ5CgkgKiBUaGlzIGFsbG93IHRvIGNoZWNrIGlmIHRoZSBjdXJyZW50IGl0ZW0gaXMgc3RpbGwgaW4gdGhlCgkgKiBoYXNoYmluIG9yIGhhcyBiZWVuIHJlbW92ZWQuCgkgKi8KCWVudHJ5ID0gKGlyZGFfcXVldWVfdCogKSBoYXNoYmluX2ZpbmQoIGhhc2hiaW4sIGhhc2h2LCBuYW1lICk7CgoJLyoKCSAqIFRyaWNrIGhhc2hiaW5fZ2V0X25leHQoKSB0byByZXR1cm4gd2hhdCB3ZSB3YW50CgkgKi8KCWlmKGVudHJ5KSB7CgkJaGFzaGJpbi0+aGJfY3VycmVudCA9IGVudHJ5OwoJCSpwbmV4dCA9IGhhc2hiaW5fZ2V0X25leHQoIGhhc2hiaW4gKTsKCX0gZWxzZQoJCSpwbmV4dCA9IE5VTEw7CgoJLyogUmVsZWFzZSBsb2NrICovCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoKCXJldHVybiBlbnRyeTsKfQoKLyoKICogRnVuY3Rpb24gaGFzaGJpbl9nZXRfZmlyc3QgKGhhc2hiaW4pCiAqCiAqICAgIEdldCBhIHBvaW50ZXIgdG8gZmlyc3QgZWxlbWVudCBpbiBoYXNoYmluLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUKICogICAgY2FsbGVkIGJlZm9yZSBhbnkgY2FsbHMgdG8gaGFzaGJpbl9nZXRfbmV4dCgpIQogKgogKi8KaXJkYV9xdWV1ZV90ICpoYXNoYmluX2dldF9maXJzdCggaGFzaGJpbl90KiBoYXNoYmluKQp7CglpcmRhX3F1ZXVlX3QgKmVudHJ5OwoJaW50IGk7CgoJSVJEQV9BU1NFUlQoIGhhc2hiaW4gIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuIE5VTEw7KTsKCglpZiAoIGhhc2hiaW4gPT0gTlVMTCkKCQlyZXR1cm4gTlVMTDsKCglmb3IgKCBpID0gMDsgaSA8IEhBU0hCSU5fU0laRTsgaSArKyApIHsKCQllbnRyeSA9IGhhc2hiaW4tPmhiX3F1ZXVlWyBpXTsKCQlpZiAoIGVudHJ5KSB7CgkJCWhhc2hiaW4tPmhiX2N1cnJlbnQgPSBlbnRyeTsKCQkJcmV0dXJuIGVudHJ5OwoJCX0KCX0KCS8qCgkgKiAgRGlkIG5vdCBmaW5kIGFueSBpdGVtIGluIGhhc2hiaW4KCSAqLwoJcmV0dXJuIE5VTEw7Cn0KRVhQT1JUX1NZTUJPTChoYXNoYmluX2dldF9maXJzdCk7CgovKgogKiBGdW5jdGlvbiBoYXNoYmluX2dldF9uZXh0IChoYXNoYmluKQogKgogKiAgICBHZXQgbmV4dCBpdGVtIGluIGhhc2hiaW4uIEEgc2VyaWVzIG9mIGhhc2hiaW5fZ2V0X25leHQoKSBjYWxscyBtdXN0CiAqICAgIGJlIHN0YXJ0ZWQgYnkgYSBjYWxsIHRvIGhhc2hiaW5fZ2V0X2ZpcnN0KCkuIFRoZSBmdW5jdGlvbiByZXR1cm5zCiAqICAgIE5VTEwgd2hlbiBhbGwgaXRlbXMgaGF2ZSBiZWVuIHRyYXZlcnNlZAogKgogKiBUaGUgY29udGV4dCBvZiB0aGUgc2VhcmNoIGlzIHN0b3JlZCB3aXRoaW4gdGhlIGhhc2hiaW4sIHNvIHlvdSBtdXN0CiAqIHByb3RlY3QgeW91cnNlbGYgZnJvbSBjb25jdXJyZW50IGVudW1lcmF0aW9ucy4gLSBKZWFuIElJCiAqLwppcmRhX3F1ZXVlX3QgKmhhc2hiaW5fZ2V0X25leHQoIGhhc2hiaW5fdCAqaGFzaGJpbikKewoJaXJkYV9xdWV1ZV90KiBlbnRyeTsKCWludCBiaW47CglpbnQgaTsKCglJUkRBX0FTU0VSVCggaGFzaGJpbiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOwoJSVJEQV9BU1NFUlQoIGhhc2hiaW4tPm1hZ2ljID09IEhCX01BR0lDLCByZXR1cm4gTlVMTDspOwoKCWlmICggaGFzaGJpbi0+aGJfY3VycmVudCA9PSBOVUxMKSB7CgkJSVJEQV9BU1NFUlQoIGhhc2hiaW4tPmhiX2N1cnJlbnQgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKCQlyZXR1cm4gTlVMTDsKCX0KCWVudHJ5ID0gaGFzaGJpbi0+aGJfY3VycmVudC0+cV9uZXh0OwoJYmluID0gR0VUX0hBU0hCSU4oIGVudHJ5LT5xX2hhc2gpOwoKCS8qCgkgKiAgTWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5vdCBiYWNrIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHF1ZXVlCgkgKiAgYWdhaW4KCSAqLwoJaWYgKCBlbnRyeSAhPSBoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0pIHsKCQloYXNoYmluLT5oYl9jdXJyZW50ID0gZW50cnk7CgoJCXJldHVybiBlbnRyeTsKCX0KCgkvKgoJICogIENoZWNrIHRoYXQgdGhpcyBpcyBub3QgdGhlIGxhc3QgcXVldWUgaW4gaGFzaGJpbgoJICovCglpZiAoIGJpbiA+PSBIQVNIQklOX1NJWkUpCgkJcmV0dXJuIE5VTEw7CgoJLyoKCSAqICBNb3ZlIHRvIG5leHQgcXVldWUgaW4gaGFzaGJpbgoJICovCgliaW4rKzsKCWZvciAoIGkgPSBiaW47IGkgPCBIQVNIQklOX1NJWkU7IGkrKyApIHsKCQllbnRyeSA9IGhhc2hiaW4tPmhiX3F1ZXVlWyBpXTsKCQlpZiAoIGVudHJ5KSB7CgkJCWhhc2hiaW4tPmhiX2N1cnJlbnQgPSBlbnRyeTsKCgkJCXJldHVybiBlbnRyeTsKCQl9Cgl9CglyZXR1cm4gTlVMTDsKfQpFWFBPUlRfU1lNQk9MKGhhc2hiaW5fZ2V0X25leHQpOwo=