LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqIGZ0cGQuYwoqKiBSdW1hdGFAbWcKKiogMTMuNi4xOTk5CioqCioqIEVybWl0dGx1bmcgZGVyIFp1Z3JpZmZzcmVjaHRlIGF1cyBkZW4gVXNlcmRhdGVuLgoqKgoqKiBEaWVzZXMgT2JqZWt0IHdpcmQgdm9tIGZ0cGltcCBhdXMgYXVmZ2VydWZlbiwgZGVyIHdpZWRlcnVtIHZvbSBtYXN0ZXIKKiogYXVmZ2VydWZlbiB3aXJkLCB1bSBkaWUgWnVncmlmZnNyZWNodGUgenUgcHJ1ZWZlbi4KKioKKiogRnVrdGlvbnN3ZWlzZToKKiogKyBJbSBNYXN0ZXIgd2lyZCB2b20gVU5JWC1mdHBkIGF1cyBGdHBBY2Nlc3MgKC9zZWN1cmUvbWFzdGVyL25ldHdvcmspCioqICAgYXVmZ2VydWZlbi4KKiogKyBEaWVzZXMgcnVmdCBkYW5uLCBzb2JhbGQgZWluIFp1Z3JpZmYgZXJrYW5udCB3aXJkCioqICAgUXVlcnlSZWFkLCBRdWVyeVdyaXRlIG9kZXIgUXVlcnlEaXIgYXVmLgoqKiArIERpZXNlIGZyYWdlbiBkZW4gTWFzdGVyLCBvYiBkZXIgWnVncmlmZiBsZWdhbCBpc3QuCioqICsgUXVlcnlEaXIgbGllZmVydCBhdWNoIGdsZWljaCBkYXMgRXJnZWJuaXMgbWl0LgoqKgoqKiBVbSBmdHAtenVncmlmZmUg/GJlcndhY2hlbiB6dSBr9m5uZW4sIGthbm4gZGVyIGZ0cGQgZWluZSBsaXN0ZSBkZXIKKiogdWViZXJ3YWNodGVuIHNwaWVsZXIgbGllZmVybiB1bmQgZGVyZW4gWnVncmlmZmUgYXVmIGRlbSBGVFAgS2FuYWwgYXVzZ2ViZW4uCioqCioqIGFkZCggbmFtZSwgemVpdCApIC0gRlRQIFp1Z3JpZmZlIGRlcyBTcGllbGVycyAnbmFtZScgd2VyZGVuIHByb3Rva29sbGllcnQuCioqICAgICAgICAgICAgICAgICAgICAgTmFjaCAnemVpdCcgd2lyZCBkaWVzZXIgWnVncmlmZiBhdXRvbWF0aXNjaCBiZWVuZGV0LgoqKiAgICAgICAgICAgICAgICAgICAgIElzdCAnemVpdCcgPD0gMCwgd2lyIGF1ZiBld2lnIHVlYmVyd2FjaHQuIAoqKiBzdWIoIG5hbWUgKSAgICAgICAtIEZUUCBTbm9vcCBmdWVyIFNwaWVsZXIgJ25hbWUnIGRpcmVrdCBhdWZoZWJlbi4KKiogbGlzdCgpICAgICAgICAgICAgLSBNYXBwaW5nIGRlciB1ZWJlcndhY2h0ZW4gU3BpZWxlciB6dXJ1ZWNrZ2ViZW4uCioqCioqIEZJTEVTOgoqKiAgIC9zZWN1cmUvbWFzdGVyL25ldHdvcmsuYwoqKiAgIC9zZWN1cmUvZnRwZC5jCioqICAgL3N0ZC9zaGVsbHMvZmlsZXN5cy9mdHBpbXAuYwoqKiAgIC9zZWN1cmUvQVJDSC9mdHBkLm8KKiogICAvcC9kYWVtb24vY2hhbm5lbGQuaW5pdAoqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKI2luY2x1ZGUgIi9zeXMvZGFlbW9uLmgiCgojZGVmaW5lIEZUUERTQVZFICIvc2VjdXJlL0FSQ0gvZnRwZCIKI2RlZmluZSBGVFBEX0NIICJGVFAiCiNkZWZpbmUgQkJNQVNURVIgIi9zZWN1cmUvYmJtYXN0ZXIiCgptYXBwaW5nIG1vbml0b3JlZDsKLy8gWnUgamVkZW0gU3BpZWxlcm5hbWVuIHdpcmQgdmVybWVya3QsIHdpZSBsYW5nZSBkaWUgVWViZXJ3YWNodW5nIGRhdWVybiBzb2xsLgovLyBaYWhsZW4gPD0gMCBiZWRldXRlbiBmdWVyIGltbWVyLgoKbm9tYXNrIHZvaWQgY3JlYXRlKCkgewogIGlmKCBjbG9uZXAodGhpc19vYmplY3QoKSkgKSB7CiAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOwogICAgcmV0dXJuOwogIH0KICBzZXRldWlkKCBnZXR1aWQoKSApOwogIGlmKCAhcmVzdG9yZV9vYmplY3QoRlRQRFNBVkUpICkKICAgIG1vbml0b3JlZCA9IChbXSk7Cn0KCm5vbWFzayBpbnQgcGxheWVyX2V4aXN0cyggc3RyaW5nIHVzZXIgKSB7CiAgdXNlciA9IGxvd2VyX2Nhc2UodXNlcik7CiAgaWYoICFzdHJpbmdwKCB1c2VyICkgfHwgc2l6ZW9mKCB1c2VyICkgPCAxICkgcmV0dXJuIDA7CiAgcmV0dXJuIGZpbGVfc2l6ZSggIi9zYXZlLyIrdXNlclswLi4wXSsiLyIrdXNlcisiLm8iICkgPiAwOwp9Cgpub21hc2sgdmFyYXJncyBpbnQgYWRkKCBzdHJpbmcgdXNlciwgaW50IHRpbWVvdXQgKSB7CiAgaWYoICFBUkNIX1NFQ1VSSVRZICkgcmV0dXJuIC0xOwogIGlmKCAhcGxheWVyX2V4aXN0cyh1c2VyKSApIHJldHVybiAtMjsKICBtb25pdG9yZWRbdXNlcl0gPSB0aW1lb3V0OwogIHNhdmVfb2JqZWN0KCBGVFBEU0FWRSApOwogIHJldHVybiAwOwp9Cgpub21hc2sgaW50IHN1Yiggc3RyaW5nIHVzZXIgKSB7CiAgaWYoICFBUkNIX1NFQ1VSSVRZICkgcmV0dXJuIC0xOwogIGlmKCAhcGxheWVyX2V4aXN0cyh1c2VyKSApIHJldHVybiAtMjsKICBtb25pdG9yZWQgLT0gKFsgdXNlciBdKTsKICBzYXZlX29iamVjdCggRlRQRFNBVkUgKTsKICByZXR1cm4gMDsKfQoKbm9tYXNrIG1peGVkIGxpc3QoKSB7CiAgaWYoICFBUkNIX1NFQ1VSSVRZICkgcmV0dXJuIC0xOwogIHJldHVybiBkZWVwX2NvcHkobW9uaXRvcmVkKTsKfQoKI2RlZmluZSBORVdJTVAgInllcyIKCnByaXZhdGUgb2JqZWN0IGZpbmRGdHBJbXBGb3IoIHN0cmluZyB1c2VyICkgewojaWZkZWYgTkVXSU1QCiAgcmV0dXJuICIvc2VjdXJlL2ltcGZldGNoIi0+aW1wRm9yKCBsb3dlcl9jYXNlKHVzZXIpICk7CiNlbHNlCiAgb2JqZWN0IGltcDsKICBzdHJpbmcgZm5hbWU7CgogIHVzZXIgPSBsb3dlcl9jYXNlKCB1c2VyICk7CiAgZm5hbWUgPSAiL2Z0cGltcDoiICsgdXNlcjsKICBpbXAgPSBmaW5kX29iamVjdCggZm5hbWUgKTsKICBpZiggIW9iamVjdHAoaW1wKSApIHsKICAgIGltcCA9IGNsb25lX29iamVjdCggInNlY3VyZS9mdHBpbXAiICk7CiAgICBpbXAtPlNldFVzZXIodXNlcik7CiAgICByZW5hbWVfb2JqZWN0KCBpbXAsIGZuYW1lICk7CiAgfQogIHJldHVybiBpbXA7CiNlbmRpZgp9Cgpwcml2YXRlIG5vbWFzayB2b2lkIG1zZyggc3RyaW5nIHVzZXIsIHN0cmluZyBtICkgewogIGludCB0aW1lb3V0OwogIG9iamVjdCByOwoKICBpZiggIXN0cmluZ3AodXNlcikgKSByZXR1cm47CiAgbSArPSAiXG4iOwogIGlmKCAocj1maW5kX3BsYXllcigicnVtYXRhIikpICYmIHVzZXI9PSJhdGFtdXIiICkgewogICAgIHRpbWVvdXQgPSBDSE1BU1RFUi0+c2VuZChGVFBEX0NILGZpbmRGdHBJbXBGb3IodXNlciksIG0gKTsKICAgICB0ZWxsX29iamVjdCggciwgc3ByaW50ZigiJU9cbiIsIGZpbmRGdHBJbXBGb3IodXNlcikgKSApOwogIH0KICBCQk1BU1RFUi0+ZnRwYmIodXNlcixtKTsKICBpZiggIW1lbWJlcihtb25pdG9yZWQsdXNlcikgKSByZXR1cm47CiAgdGltZW91dCA9IG1vbml0b3JlZFt1c2VyXTsKICBpZiggdGltZW91dCA+IDAgJiYgdGltZW91dCA8IHRpbWUoKSApIHsKICAgIHN1YiggdXNlciApOwogICAgcmV0dXJuOwogIH0KICBDSE1BU1RFUi0+c2VuZChGVFBEX0NILGZpbmRGdHBJbXBGb3IodXNlciksIG0gKTsKfQoKbm9tYXNrIGludCBzZWN1cmUoKSB7CiAgcmV0dXJuIHByZXZpb3VzX29iamVjdCgpPT1maW5kX29iamVjdChNQVNURVIpOwp9Cgpub21hc2sgbWl4ZWQgUXVlcnlSZWFkKCBzdHJpbmcgdXNlciwgc3RyaW5nIGZpbGUgKSB7CiAgaWYoICFzZWN1cmUoKSApIHJldHVybiAtMTsKICBpZiggKElTX1dJWkFSRCh1c2VyKSB8fCBmaWxlWzAuLjRdPT0iL29wZW4iKQogICAgICAmJiBmaWxlWzBdID09ICcvJwogICAgICAmJiBNQVNURVItPnZhbGlkX3JlYWQoZmlsZSwgdXNlciwgInJlYWRfZmlsZSIsIDApCiAgICAgICkgewogICAgbXNnKCB1c2VyLCAicmVhZCAiICsgZmlsZSApOwogICAgcmV0dXJuICJPSyI7CiAgfSBlbHNlIHsKICAgIHJldHVybiAiRkFJTCI7CiAgfQp9Cgpub21hc2sgbWl4ZWQgUXVlcnlXcml0ZSggc3RyaW5nIHVzZXIsIHN0cmluZyBmaWxlICkgewogIGlmKCAhc2VjdXJlKCkgKSByZXR1cm4gLTE7CiAgaWYoIGZpbGVbMF0gPT0gJy8nCiAgICAgICYmIE1BU1RFUi0+dmFsaWRfd3JpdGUoIGZpbGUsIHVzZXIsICJ3cml0ZV9maWxlIiwgMCkKICAgICAgKSB7CiAgICBtc2coIHVzZXIsICJ3cml0ZSAiICsgZmlsZSApOwogICAgcmV0dXJuICJPSyI7CiAgfSBlbHNlIHsKICAgIHJldHVybiAiRkFJTCI7CiAgfQp9CgojZGVmaW5lIERCRyh4KSBpZihmaW5kX3BsYXllcigicnVtYXRhIikpe3RlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJydW1hdGEiKSwiRlRQRDoiK3grIlxuIik7fQoKLy9ub21hc2sgbWl4ZWQgUXVlcnlEaXIoIHN0cmluZyB1c2VyLCBzdHJpbmcgZmlsZSApIHsKLy8gIHN0cmluZyByZXBseTsKLy8gIG9iamVjdCBpbXA7Ci8vCi8vICBpZiggIXNlY3VyZSgpICkgcmV0dXJuIC0xOwovLyAgcmVwbHkgPSBRdWVyeVJlYWQoIHVzZXIsIGZpbGUgKTsKLy8gIGlmKCByZXBseT09IkZBSUwiICkgcmV0dXJuIC0xOwovLwovLyAgaW1wID0gZmluZEZ0cEltcEZvciggdXNlciApOwovLyAgaWYoICFvYmplY3RwKGltcCkgKSByZXR1cm4gLTE7IC8vIHNob3VsZCBuZXZlciBoYXBwZW4KLy8KLy8gIHJldHVybiBpbXAtPkdldERpciggZmlsZSApOwovL30KCm5vbWFzayBtaXhlZCBRdWVyeURpciggc3RyaW5nIHVzZXIsIHN0cmluZyBmaWxlICkgewogIGlmKCAhc2VjdXJlKCkgKSByZXR1cm4gLTE7CiAgaWYoIGZpbGVbMF0gPT0gJy8nCiAgICAgICYmIE1BU1RFUi0+dmFsaWRfcmVhZCggZmlsZSsiLyoiLCB1c2VyLCAiZ2V0X2RpciIsIDApKQogICAgICByZXR1cm4gIk9LIjsKICBlbHNlIAogICAgcmV0dXJuICJGQUlMIjsKfQo=