LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmY0eHhfaGFsX3d3ZGcuYwogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIFdXREcgSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFdpbmRvdyBXYXRjaGRvZyAoV1dERykgcGVyaXBoZXJhbDoKICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucwogICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucwogIEB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgV1dERyBTcGVjaWZpYyBmZWF0dXJlcyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIFsuLl0KICAgIE9uY2UgZW5hYmxlZCB0aGUgV1dERyBnZW5lcmF0ZXMgYSBzeXN0ZW0gcmVzZXQgb24gZXhwaXJ5IG9mIGEgcHJvZ3JhbW1lZAogICAgdGltZSBwZXJpb2QsIHVubGVzcyB0aGUgcHJvZ3JhbSByZWZyZXNoZXMgdGhlIGNvdW50ZXIgKFRbNjswXSBkb3duY291bnRlcikKICAgIGJlZm9yZSByZWFjaGluZyAweDNGIHZhbHVlIChpLmUuIGEgcmVzZXQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGNvdW50ZXIKICAgIHZhbHVlIHJvbGxzIGRvd24gZnJvbSAweDQwIHRvIDB4M0YpLgoKICAgICgrKSBBbiBNQ1UgcmVzZXQgaXMgYWxzbyBnZW5lcmF0ZWQgaWYgdGhlIGNvdW50ZXIgdmFsdWUgaXMgcmVmcmVzaGVkCiAgICAgICAgYmVmb3JlIHRoZSBjb3VudGVyIGhhcyByZWFjaGVkIHRoZSByZWZyZXNoIHdpbmRvdyB2YWx1ZS4gVGhpcwogICAgICAgIGltcGxpZXMgdGhhdCB0aGUgY291bnRlciBtdXN0IGJlIHJlZnJlc2hlZCBpbiBhIGxpbWl0ZWQgd2luZG93LgogICAgKCspIE9uY2UgZW5hYmxlZCB0aGUgV1dERyBjYW5ub3QgYmUgZGlzYWJsZWQgZXhjZXB0IGJ5IGEgc3lzdGVtIHJlc2V0LgogICAgKCspIElmIHJlcXVpcmVkIGJ5IGFwcGxpY2F0aW9uLCBhbiBFYXJseSBXYWtldXAgSW50ZXJydXB0IGNhbiBiZSB0cmlnZ2VyZWQKICAgICAgICBpbiBvcmRlciB0byBiZSB3YXJuZWQgYmVmb3JlIFdXREcgZXhwaXJhdGlvbi4gVGhlIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQKICAgICAgICAoRVdJKSBjYW4gYmUgdXNlZCBpZiBzcGVjaWZpYyBzYWZldHkgb3BlcmF0aW9ucyBvciBkYXRhIGxvZ2dpbmcgbXVzdAogICAgICAgIGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGFjdHVhbCByZXNldCBpcyBnZW5lcmF0ZWQuIFdoZW4gdGhlIGRvd25jb3VudGVyCiAgICAgICAgcmVhY2hlcyAweDQwLCBpbnRlcnJ1cHQgb2NjdXJzLiBUaGlzIG1lY2hhbmlzbSByZXF1aXJlcyBXV0RHIGludGVycnVwdAogICAgICAgIGxpbmUgdG8gYmUgZW5hYmxlZCBpbiBOVklDLiBPbmNlIGVuYWJsZWQsIEVXSSBpbnRlcnJ1cHQgY2Fubm90IGJlCiAgICAgICAgZGlzYWJsZWQgZXhjZXB0IGJ5IGEgc3lzdGVtIHJlc2V0LgogICAgKCspIFdXREdSU1QgZmxhZyBpbiBSQ0MgQ1NSIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIHRvIGluZm9ybSB3aGVuIGEgV1dERwogICAgICAgIHJlc2V0IG9jY3Vycy4KICAgICgrKSBUaGUgV1dERyBjb3VudGVyIGlucHV0IGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgQVBCIGNsb2NrIGRpdmlkZWQKICAgICAgICBieSBhIHByb2dyYW1tYWJsZSBwcmVzY2FsZXIuCiAgICAoKykgV1dERyBjbG9jayAoSHopID0gUENMSzEgLyAoNDA5NiAqIFByZXNjYWxlcikKICAgICgrKSBXV0RHIHRpbWVvdXQgKG1TKSA9IDEwMDAgKiAoVFs1OzBdICsgMSkgLyBXV0RHIGNsb2NrIChIeikKICAgICAgICB3aGVyZSBUWzU7MF0gYXJlIHRoZSBsb3dlc3QgNiBiaXRzIG9mIENvdW50ZXIuCiAgICAoKykgV1dERyBDb3VudGVyIHJlZnJlc2ggaXMgYWxsb3dlZCBiZXR3ZWVuIHRoZSBmb2xsb3dpbmcgbGltaXRzIDoKICAgICAgICAoKyspIG1pbiB0aW1lIChtUykgPSAxMDAwICogKENvdW50ZXIgLSBXaW5kb3cpIC8gV1dERyBjbG9jawogICAgICAgICgrKykgbWF4IHRpbWUgKG1TKSA9IDEwMDAgKiAoQ291bnRlciAtIDB4NDApIC8gV1dERyBjbG9jawogICAgKCspIFR5cGljYWwgdmFsdWVzOgogICAgICAgICgrKykgQ291bnRlciBtaW4gKFRbNTswXSA9IDB4MDApIGF0IDQyTUh6IChQQ0xLMSkgd2l0aCB6ZXJvIHByZXNjYWxlcjoKICAgICAgICAgICAgIG1heCB0aW1lb3V0IGJlZm9yZSByZXNldDogYXBwcm94aW1hdGVseSA5Ny41MrVzCiAgICAgICAgKCsrKSBDb3VudGVyIG1heCAoVFs1OzBdID0gMHgzRikgYXQgNDJNSHogKFBDTEsxKSB3aXRoIHByZXNjYWxlcgogICAgICAgICAgICAgZGl2aWRpbmcgYnkgODoKICAgICAgICAgICAgIG1heCB0aW1lb3V0IGJlZm9yZSByZXNldDogYXBwcm94aW1hdGVseSA0OS45M21zCgogICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgKioqIENvbW1vbiBkcml2ZXIgdXNhZ2UgKioqCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgWy4uXQogICAgKCspIEVuYWJsZSBXV0RHIEFQQjEgY2xvY2sgdXNpbmcgX19IQUxfUkNDX1dXREdfQ0xLX0VOQUJMRSgpLgogICAgKCspIENvbmZpZ3VyZSB0aGUgV1dERyBwcmVzY2FsZXIsIHJlZnJlc2ggd2luZG93IHZhbHVlLCBjb3VudGVyIHZhbHVlIGFuZCBlYXJseQogICAgICAgIGludGVycnVwdCBzdGF0dXMgdXNpbmcgSEFMX1dXREdfSW5pdCgpIGZ1bmN0aW9uLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseQogICAgICAgIGVuYWJsZSBXV0RHIGFuZCBzdGFydCBpdHMgZG93bmNvdW50ZXIuIFRpbWUgcmVmZXJlbmNlIGNhbiBiZSB0YWtlbiBmcm9tIAogICAgICAgIGZ1bmN0aW9uIGV4aXQuIENhcmUgbXVzdCBiZSB0YWtlbiB0byBwcm92aWRlIGEgY291bnRlciB2YWx1ZQogICAgICAgIGdyZWF0ZXIgdGhhbiAweDQwIHRvIHByZXZlbnQgZ2VuZXJhdGlvbiBvZiBpbW1lZGlhdGUgcmVzZXQuCiAgICAoKykgSWYgdGhlIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgKEVXSSkgZmVhdHVyZSBpcyBlbmFibGVkLCBhbiBpbnRlcnJ1cHQgaXMKICAgICAgICBnZW5lcmF0ZWQgd2hlbiB0aGUgY291bnRlciByZWFjaGVzIDB4NDAuIFdoZW4gSEFMX1dXREdfSVJRSGFuZGxlciBpcwogICAgICAgIHRyaWdnZXJlZCBieSB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSwgZmxhZyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKICAgICAgICBjbGVhcmVkIGFuZCBIQUxfV1dER19XYWtldXBDYWxsYmFjayB1c2VyIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQuIFVzZXIKICAgICAgICBjYW4gYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGNhbGxiYWNrIEhBTF9XV0RHX1dha2V1cENhbGxiYWNrLgogICAgKCspIFRoZW4gdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gbXVzdCByZWZyZXNoIHRoZSBXV0RHIGNvdW50ZXIgYXQgcmVndWxhcgogICAgICAgIGludGVydmFscyBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiB0byBwcmV2ZW50IGFuIE1DVSByZXNldCwgdXNpbmcKICAgICAgICBIQUxfV1dER19SZWZyZXNoKCkgZnVuY3Rpb24uIFRoaXMgb3BlcmF0aW9uIG11c3Qgb2NjdXIgb25seSB3aGVuCiAgICAgICAgdGhlIGNvdW50ZXIgaXMgbG93ZXIgdGhhbiB0aGUgcmVmcmVzaCB3aW5kb3cgdmFsdWUgYWxyZWFkeSBwcm9ncmFtbWVkLgoKICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBbLi5dCiAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMSBhbGxvd3MKICAgIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4gVXNlIEZ1bmN0aW9ucwogICAgSEFMX1dXREdfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgdXNlciBjYWxsYmFjay4KCiAgICAoKykgRnVuY3Rpb24gSEFMX1dXREdfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcKICAgICAgICBjYWxsYmFja3M6CiAgICAgICAgKCsrKSBFd2lDYWxsYmFjayA6IGNhbGxiYWNrIGZvciBFYXJseSBXYWtlVXAgSW50ZXJydXB0LgogICAgICAgICgrKykgTXNwSW5pdENhbGxiYWNrIDogV1dERyBNc3BJbml0LgogICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAogICAgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KCiAgICAoKykgVXNlIGZ1bmN0aW9uIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8KICAgIHRoZSBkZWZhdWx0IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uLiBIQUxfV1dER19VblJlZ2lzdGVyQ2FsbGJhY2soKQogICAgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCiAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgogICAgICAgICgrKykgRXdpQ2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQuCiAgICAgICAgKCsrKSBNc3BJbml0Q2FsbGJhY2sgOiBXV0RHIE1zcEluaXQuCgogICAgWy4uXQogICAgV2hlbiBjYWxsaW5nIEhBTF9XV0RHX0luaXQgZnVuY3Rpb24sIGNhbGxiYWNrcyBhcmUgcmVzZXQgdG8gdGhlCiAgICBjb3JyZXNwb25kaW5nIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6CiAgICBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrKCkgYW5kIEhBTF9XV0RHX01zcEluaXQoKSBvbmx5IGlmIHRoZXkgaGF2ZQogICAgbm90IGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUuCgogICAgWy4uXQogICAgV2hlbiBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgogICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RlcmluZyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuCgogICAgKioqIFdXREcgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dCiAgICAgIEJlbG93IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBtYWNyb3MgaW4gV1dERyBIQUwgZHJpdmVyLgogICAgICAoKykgX19IQUxfV1dER19FTkFCTEU6IEVuYWJsZSB0aGUgV1dERyBwZXJpcGhlcmFsCiAgICAgICgrKSBfX0hBTF9XV0RHX0dFVF9GTEFHOiBHZXQgdGhlIHNlbGVjdGVkIFdXREcncyBmbGFnIHN0YXR1cwogICAgICAoKykgX19IQUxfV1dER19DTEVBUl9GTEFHOiBDbGVhciB0aGUgV1dERydzIHBlbmRpbmcgZmxhZ3MKICAgICAgKCspIF9fSEFMX1dXREdfRU5BQkxFX0lUOiBFbmFibGUgdGhlIFdXREcgZWFybHkgd2FrZXVwIGludGVycnVwdAoKICBAZW5kdmVyYmF0aW0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEBhdHRlbnRpb24KICAqCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCgovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAic3RtMzJmNHh4X2hhbC5oIgoKLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjR4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCgojaWZkZWYgSEFMX1dXREdfTU9EVUxFX0VOQUJMRUQKLyoqIEBkZWZncm91cCBXV0RHIFdXREcKICAqIEBicmllZiBXV0RHIEhBTCBtb2R1bGUgZHJpdmVyLgogICogQHsKICAqLwoKLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnMgV1dERyBFeHBvcnRlZCBGdW5jdGlvbnMKICAqIEB7CiAgKi8KCi8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucwogICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMuCiAgKgpAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIFsuLl0KICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CiAgICAgICgrKSBJbml0aWFsaXplIGFuZCBzdGFydCB0aGUgV1dERyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCiAgICAgICAgICBpbiB0aGUgV1dER19Jbml0VHlwZURlZiBvZiBhc3NvY2lhdGVkIGhhbmRsZS4KICAgICAgKCspIEluaXRpYWxpemUgdGhlIFdXREcgTVNQLgoKQGVuZHZlcmJhdGltCiAgKiBAewogICovCgovKioKICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgV1dERyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZC4KICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgV1dER19Jbml0VHlwZURlZiBvZiAgYXNzb2NpYXRlZCBoYW5kbGUuCiAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9XV0RHX0luaXQoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKewogIC8qIENoZWNrIHRoZSBXV0RHIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgaWYgKGh3d2RnID09IE5VTEwpCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgYXNzZXJ0X3BhcmFtKElTX1dXREdfQUxMX0lOU1RBTkNFKGh3d2RnLT5JbnN0YW5jZSkpOwogIGFzc2VydF9wYXJhbShJU19XV0RHX1BSRVNDQUxFUihod3dkZy0+SW5pdC5QcmVzY2FsZXIpKTsKICBhc3NlcnRfcGFyYW0oSVNfV1dER19XSU5ET1coaHd3ZGctPkluaXQuV2luZG93KSk7CiAgYXNzZXJ0X3BhcmFtKElTX1dXREdfQ09VTlRFUihod3dkZy0+SW5pdC5Db3VudGVyKSk7CiAgYXNzZXJ0X3BhcmFtKElTX1dXREdfRVdJX01PREUoaHd3ZGctPkluaXQuRVdJTW9kZSkpOwoKI2lmIChVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgLyogUmVzZXQgQ2FsbGJhY2sgcG9pbnRlcnMgKi8KICBpZiAoaHd3ZGctPkV3aUNhbGxiYWNrID09IE5VTEwpCiAgewogICAgaHd3ZGctPkV3aUNhbGxiYWNrID0gSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjazsKICB9CgogIGlmIChod3dkZy0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCiAgewogICAgaHd3ZGctPk1zcEluaXRDYWxsYmFjayA9IEhBTF9XV0RHX01zcEluaXQ7CiAgfQoKICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KICBod3dkZy0+TXNwSW5pdENhbGxiYWNrKGh3d2RnKTsKI2Vsc2UKICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KICBIQUxfV1dER19Nc3BJbml0KGh3d2RnKTsKI2VuZGlmIC8qIFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KCiAgLyogU2V0IFdXREcgQ291bnRlciAqLwogIFdSSVRFX1JFRyhod3dkZy0+SW5zdGFuY2UtPkNSLCAoV1dER19DUl9XREdBIHwgaHd3ZGctPkluaXQuQ291bnRlcikpOwoKICAvKiBTZXQgV1dERyBQcmVzY2FsZXIgYW5kIFdpbmRvdyAqLwogIFdSSVRFX1JFRyhod3dkZy0+SW5zdGFuY2UtPkNGUiwgKGh3d2RnLT5Jbml0LkVXSU1vZGUgfCBod3dkZy0+SW5pdC5QcmVzY2FsZXIgfCBod3dkZy0+SW5pdC5XaW5kb3cpKTsKCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCgovKioKICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgV1dERyBNU1AuCiAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KICAqIEBub3RlICAgV2hlbiByZXdyaXRpbmcgdGhpcyBmdW5jdGlvbiBpbiB1c2VyIGZpbGUsIG1lY2hhbmlzbSBtYXkgYmUgYWRkZWQKICAqICAgICAgICAgdG8gYXZvaWQgbXVsdGlwbGUgaW5pdGlhbGl6ZSB3aGVuIEhBTF9XV0RHX0luaXQgZnVuY3Rpb24gaXMgY2FsbGVkCiAgKiAgICAgICAgIGFnYWluIHRvIGNoYW5nZSBwYXJhbWV0ZXJzLgogICogQHJldHZhbCBOb25lCiAgKi8KX193ZWFrIHZvaWQgSEFMX1dXREdfTXNwSW5pdChXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQp7CiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogIFVOVVNFRChod3dkZyk7CgogIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgIHRoZSBIQUxfV1dER19Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKCiNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQovKioKICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFdXREcgQ2FsbGJhY2sKICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIChzdXJjaGFyZ2VkKSBwcmVkZWZpbmVkIGNhbGxiYWNrCiAgKiBAcGFyYW0gIGh3d2RnIFdXREcgaGFuZGxlCiAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfRVdJX0NCX0lEIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQgQ2FsbGJhY2sgSUQKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECiAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgogICogQHJldHZhbCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcsIEhBTF9XV0RHX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdXREdfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKewogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKCiAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQogIHsKICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICB9CiAgZWxzZQogIHsKICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgIHsKICAgICAgY2FzZSBIQUxfV1dER19FV0lfQ0JfSUQ6CiAgICAgICAgaHd3ZGctPkV3aUNhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBIQUxfV1dER19NU1BJTklUX0NCX0lEOgogICAgICAgIGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CiAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgogICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICAgICAgICBicmVhazsKICAgIH0KICB9CgogIHJldHVybiBzdGF0dXM7Cn0KCgovKioKICAqIEBicmllZiAgVW5yZWdpc3RlciBhIFdXREcgQ2FsbGJhY2sKICAqICAgICAgICAgV1dERyBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIChzdXJjaGFyZ2VkKSBwcmVkZWZpbmVkIGNhbGxiYWNrCiAgKiBAcGFyYW0gIGh3d2RnIFdXREcgaGFuZGxlCiAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfRVdJX0NCX0lEIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQgQ2FsbGJhY2sgSUQKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECiAgKiBAcmV0dmFsIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnLCBIQUxfV1dER19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQp7CiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwoKICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgewogICAgY2FzZSBIQUxfV1dER19FV0lfQ0JfSUQ6CiAgICAgIGh3d2RnLT5Fd2lDYWxsYmFjayA9IEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2s7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgSEFMX1dXREdfTVNQSU5JVF9DQl9JRDoKICAgICAgaHd3ZGctPk1zcEluaXRDYWxsYmFjayA9IEhBTF9XV0RHX01zcEluaXQ7CiAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICAgICAgYnJlYWs7CiAgfQoKICByZXR1cm4gc3RhdHVzOwp9CiNlbmRpZiAvKiBVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCgovKioKICAqIEB9CiAgKi8KCi8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKICAqICBAYnJpZWYgICAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucwogICoKQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgWy4uXQogICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKICAgICgrKSBSZWZyZXNoIHRoZSBXV0RHLgogICAgKCspIEhhbmRsZSBXV0RHIGludGVycnVwdCByZXF1ZXN0IGFuZCBhc3NvY2lhdGVkIGZ1bmN0aW9uIGNhbGxiYWNrLgoKQGVuZHZlcmJhdGltCiAgKiBAewogICovCgovKioKICAqIEBicmllZiAgUmVmcmVzaCB0aGUgV1dERy4KICAqIEBwYXJhbSAgaHd3ZGcgIHBvaW50ZXIgdG8gYSBXV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFdXREcgbW9kdWxlLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1dXREdfUmVmcmVzaChXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQp7CiAgLyogV3JpdGUgdG8gV1dERyBDUiB0aGUgV1dERyBDb3VudGVyIHZhbHVlIHRvIHJlZnJlc2ggd2l0aCAqLwogIFdSSVRFX1JFRyhod3dkZy0+SW5zdGFuY2UtPkNSLCAoaHd3ZGctPkluaXQuQ291bnRlcikpOwoKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEhhbmRsZSBXV0RHIGludGVycnVwdCByZXF1ZXN0LgogICogQG5vdGUgICBUaGUgRWFybHkgV2FrZXVwIEludGVycnVwdCAoRVdJKSBjYW4gYmUgdXNlZCBpZiBzcGVjaWZpYyBzYWZldHkgb3BlcmF0aW9ucwogICogICAgICAgICBvciBkYXRhIGxvZ2dpbmcgbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBhY3R1YWwgcmVzZXQgaXMgZ2VuZXJhdGVkLgogICogICAgICAgICBUaGUgRVdJIGludGVycnVwdCBpcyBlbmFibGVkIGJ5IGNhbGxpbmcgSEFMX1dXREdfSW5pdCBmdW5jdGlvbiB3aXRoCiAgKiAgICAgICAgIEVXSU1vZGUgc2V0IHRvIFdXREdfRVdJX0VOQUJMRS4KICAqICAgICAgICAgV2hlbiB0aGUgZG93bmNvdW50ZXIgcmVhY2hlcyB0aGUgdmFsdWUgMHg0MCwgYW5kIEVXSSBpbnRlcnJ1cHQgaXMKICAqICAgICAgICAgZ2VuZXJhdGVkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lIChJU1IpIGNhbgogICogICAgICAgICBiZSB1c2VkIHRvIHRyaWdnZXIgc3BlY2lmaWMgYWN0aW9ucyAoc3VjaCBhcyBjb21tdW5pY2F0aW9ucyBvciBkYXRhCiAgKiAgICAgICAgIGxvZ2dpbmcpLCBiZWZvcmUgcmVzZXR0aW5nIHRoZSBkZXZpY2UuCiAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgSEFMX1dXREdfSVJRSGFuZGxlcihXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQp7CiAgLyogQ2hlY2sgaWYgRWFybHkgV2FrZXVwIEludGVycnVwdCBpcyBlbmFibGUgKi8KICBpZiAoX19IQUxfV1dER19HRVRfSVRfU09VUkNFKGh3d2RnLCBXV0RHX0lUX0VXSSkgIT0gUkVTRVQpCiAgewogICAgLyogQ2hlY2sgaWYgV1dERyBFYXJseSBXYWtldXAgSW50ZXJydXB0IG9jY3VycmVkICovCiAgICBpZiAoX19IQUxfV1dER19HRVRfRkxBRyhod3dkZywgV1dER19GTEFHX0VXSUYpICE9IFJFU0VUKQogICAgewogICAgICAvKiBDbGVhciB0aGUgV1dERyBFYXJseSBXYWtldXAgZmxhZyAqLwogICAgICBfX0hBTF9XV0RHX0NMRUFSX0ZMQUcoaHd3ZGcsIFdXREdfRkxBR19FV0lGKTsKCiNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAvKiBFYXJseSBXYWtldXAgcmVnaXN0ZXJlZCBjYWxsYmFjayAqLwogICAgICBod3dkZy0+RXdpQ2FsbGJhY2soaHd3ZGcpOwojZWxzZQogICAgICAvKiBFYXJseSBXYWtldXAgY2FsbGJhY2sgKi8KICAgICAgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjayhod3dkZyk7CiNlbmRpZiAvKiBVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICB9CiAgfQp9CgoKLyoqCiAgKiBAYnJpZWYgIFdXREcgRWFybHkgV2FrZXVwIGNhbGxiYWNrLgogICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpfX3dlYWsgdm9pZCBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCnsKICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgVU5VU0VEKGh3d2RnKTsKCiAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgdGhlIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9CgovKioKICAqIEB9CiAgKi8KCi8qKgogICogQH0KICAqLwoKI2VuZGlmIC8qIEhBTF9XV0RHX01PRFVMRV9FTkFCTEVEICovCi8qKgogICogQH0KICAqLwoKLyoqCiAgKiBAfQogICovCgovKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwo=