LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmY0eHhfaGFsX3d3ZGcuYwogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIFdXREcgSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFdpbmRvdyBXYXRjaGRvZyAoV1dERykgcGVyaXBoZXJhbDoKICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucwogICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucwogIEB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgV1dERyBTcGVjaWZpYyBmZWF0dXJlcyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIFsuLl0KICAgIE9uY2UgZW5hYmxlZCB0aGUgV1dERyBnZW5lcmF0ZXMgYSBzeXN0ZW0gcmVzZXQgb24gZXhwaXJ5IG9mIGEgcHJvZ3JhbW1lZAogICAgdGltZSBwZXJpb2QsIHVubGVzcyB0aGUgcHJvZ3JhbSByZWZyZXNoZXMgdGhlIGNvdW50ZXIgKFRbNjswXSBkb3duY291bnRlcikKICAgIGJlZm9yZSByZWFjaGluZyAweDNGIHZhbHVlIChpLmUuIGEgcmVzZXQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGNvdW50ZXIKICAgIHZhbHVlIHJvbGxzIGRvd24gZnJvbSAweDQwIHRvIDB4M0YpLgoKICAgICgrKSBBbiBNQ1UgcmVzZXQgaXMgYWxzbyBnZW5lcmF0ZWQgaWYgdGhlIGNvdW50ZXIgdmFsdWUgaXMgcmVmcmVzaGVkCiAgICAgICAgYmVmb3JlIHRoZSBjb3VudGVyIGhhcyByZWFjaGVkIHRoZSByZWZyZXNoIHdpbmRvdyB2YWx1ZS4gVGhpcwogICAgICAgIGltcGxpZXMgdGhhdCB0aGUgY291bnRlciBtdXN0IGJlIHJlZnJlc2hlZCBpbiBhIGxpbWl0ZWQgd2luZG93LgogICAgKCspIE9uY2UgZW5hYmxlZCB0aGUgV1dERyBjYW5ub3QgYmUgZGlzYWJsZWQgZXhjZXB0IGJ5IGEgc3lzdGVtIHJlc2V0LgogICAgKCspIFdXREdSU1QgZmxhZyBpbiBSQ0MgQ1NSIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIHRvIGluZm9ybSB3aGVuIGEgV1dERwogICAgICAgIHJlc2V0IG9jY3Vycy4KICAgICgrKSBUaGUgV1dERyBjb3VudGVyIGlucHV0IGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgQVBCIGNsb2NrIGRpdmlkZWQKICAgICAgICBieSBhIHByb2dyYW1tYWJsZSBwcmVzY2FsZXIuCiAgICAoKykgV1dERyBjbG9jayAoSHopID0gUENMSzEgLyAoNDA5NiAqIFByZXNjYWxlcikKICAgICgrKSBXV0RHIHRpbWVvdXQgKG1TKSA9IDEwMDAgKiAoVFs1OzBdICsgMSkgLyBXV0RHIGNsb2NrIChIeikKICAgICAgICB3aGVyZSBUWzU7MF0gYXJlIHRoZSBsb3dlc3QgNiBiaXRzIG9mIENvdW50ZXIuCiAgICAoKykgV1dERyBDb3VudGVyIHJlZnJlc2ggaXMgYWxsb3dlZCBiZXR3ZWVuIHRoZSBmb2xsb3dpbmcgbGltaXRzIDoKICAgICAgICAoKyspIG1pbiB0aW1lIChtUykgPSAxMDAwICogKENvdW50ZXIgLSBXaW5kb3cpIC8gV1dERyBjbG9jawogICAgICAgICgrKykgbWF4IHRpbWUgKG1TKSA9IDEwMDAgKiAoQ291bnRlciAtIDB4NDApIC8gV1dERyBjbG9jawogICAgKCspIFR5cGljYWwgdmFsdWVzOgogICAgICAgICgrKykgQ291bnRlciBtaW4gKFRbNTswXSA9IDB4MDApIEA1Nk1IeiAoUENMSzEpIHdpdGggemVybyBwcmVzY2FsZXI6CiAgICAgICAgICAgICBtYXggdGltZW91dCBiZWZvcmUgcmVzZXQ6IH43My4xNLVzCiAgICAgICAgKCsrKSBDb3VudGVyIG1heCAoVFs1OzBdID0gMHgzRikgQDU2TUh6IChQQ0xLMSkgd2l0aCBwcmVzY2FsZXIgZGl2aWRpbmcgYnkgMTI4OgogICAgICAgICAgICAgbWF4IHRpbWVvdXQgYmVmb3JlIHJlc2V0OiB+NTk5LjE4bXMKCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBbLi5dCiAgICAqKiogQ29tbW9uIGRyaXZlciB1c2FnZSAqKioKICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgKCspIEVuYWJsZSBXV0RHIEFQQjEgY2xvY2sgdXNpbmcgX19IQUxfUkNDX1dXREdfQ0xLX0VOQUJMRSgpLgogICAgKCspIFNldCB0aGUgV1dERyBwcmVzY2FsZXIsIHJlZnJlc2ggd2luZG93IGFuZCBjb3VudGVyIHZhbHVlCiAgICAgICAgdXNpbmcgSEFMX1dXREdfSW5pdCgpIGZ1bmN0aW9uLgogICAgKCspIFN0YXJ0IHRoZSBXV0RHIHVzaW5nIEhBTF9XV0RHX1N0YXJ0KCkgZnVuY3Rpb24uCiAgICAgICAgV2hlbiB0aGUgV1dERyBpcyBlbmFibGVkIHRoZSBjb3VudGVyIHZhbHVlIHNob3VsZCBiZSBjb25maWd1cmVkIHRvCiAgICAgICAgYSB2YWx1ZSBncmVhdGVyIHRoYW4gMHg0MCB0byBwcmV2ZW50IGdlbmVyYXRpbmcgYW4gaW1tZWRpYXRlIHJlc2V0LgogICAgKCspIE9wdGlvbmFsbHkgeW91IGNhbiBlbmFibGUgdGhlIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgKEVXSSkgd2hpY2ggaXMKICAgICAgICBnZW5lcmF0ZWQgd2hlbiB0aGUgY291bnRlciByZWFjaGVzIDB4NDAsIGFuZCB0aGVuIHN0YXJ0IHRoZSBXV0RHIHVzaW5nCiAgICAgICAgSEFMX1dXREdfU3RhcnRfSVQoKS4gQXQgRVdJIEhBTF9XV0RHX1dha2V1cENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgogICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBjYWxsYmFjayBIQUxfV1dER19XYWtldXBDYWxsYmFjay4KICAgICAgICBPbmNlIGVuYWJsZWQsIEVXSSBpbnRlcnJ1cHQgY2Fubm90IGJlIGRpc2FibGVkIGV4Y2VwdCBieSBhIHN5c3RlbSByZXNldC4KICAgICgrKSBUaGVuIHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIG11c3QgcmVmcmVzaCB0aGUgV1dERyBjb3VudGVyIGF0IHJlZ3VsYXIKICAgICAgICBpbnRlcnZhbHMgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24gdG8gcHJldmVudCBhbiBNQ1UgcmVzZXQsIHVzaW5nCiAgICAgICAgSEFMX1dXREdfUmVmcmVzaCgpIGZ1bmN0aW9uLiBUaGlzIG9wZXJhdGlvbiBtdXN0IG9jY3VyIG9ubHkgd2hlbgogICAgICAgIHRoZSBjb3VudGVyIGlzIGxvd2VyIHRoYW4gdGhlIHJlZnJlc2ggd2luZG93IHZhbHVlIGFscmVhZHkgcHJvZ3JhbW1lZC4KCiAgWy4uXQogICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lICBVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEgYWxsb3dzCiAgICB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuIFVzZSBGdW5jdGlvbnMKICAgIEByZWYgSEFMX1dXREdfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgdXNlciBjYWxsYmFjay4KCiAgICAoKykgRnVuY3Rpb24gQHJlZiBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZwogICAgICAgIGNhbGxiYWNrczoKICAgICAgICAoKyspIEV3aUNhbGxiYWNrIDogY2FsbGJhY2sgZm9yIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQuCiAgICAgICAgKCsrKSBNc3BJbml0Q2FsbGJhY2sgOiBXV0RHIE1zcEluaXQuCiAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECiAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgoKICAgICgrKSBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfV1dER19VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvCiAgICB0aGUgZGVmYXVsdCB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbi4gQHJlZiBIQUxfV1dER19VblJlZ2lzdGVyQ2FsbGJhY2soKQogICAgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCiAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgogICAgICAgICgrKykgRXdpQ2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQuCiAgICAgICAgKCsrKSBNc3BJbml0Q2FsbGJhY2sgOiBXV0RHIE1zcEluaXQuCgogICAgV2hlbiBjYWxsaW5nIEByZWYgSEFMX1dXREdfSW5pdCBmdW5jdGlvbiwgY2FsbGJhY2tzIGFyZSByZXNldCB0byB0aGUKICAgIGNvcnJlc3BvbmRpbmcgbGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uczogCiAgICBAcmVmIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2soKSBhbmQgSEFMX1dXREdfTXNwSW5pdCgpIG9ubHkgaWYgdGhleSBoYXZlCiAgICBub3QgYmVlbiByZWdpc3RlcmVkIGJlZm9yZS4KCiAgICBXaGVuIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCiAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdGVyaW5nIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSAKICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuCgogICAgKioqIFdXREcgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dCiAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gV1dERyBIQUwgZHJpdmVyLgogICAgICAoKykgX19IQUxfV1dER19FTkFCTEU6IEVuYWJsZSB0aGUgV1dERyBwZXJpcGhlcmFsCiAgICAgICgrKSBfX0hBTF9XV0RHX0dFVF9GTEFHOiBHZXQgdGhlIHNlbGVjdGVkIFdXREcncyBmbGFnIHN0YXR1cwogICAgICAoKykgX19IQUxfV1dER19DTEVBUl9GTEFHOiBDbGVhciB0aGUgV1dERydzIHBlbmRpbmcgZmxhZ3MKICAgICAgKCspIF9fSEFMX1dXREdfRU5BQkxFX0lUOiBFbmFibGUgdGhlIFdXREcgZWFybHkgd2FrZXVwIGludGVycnVwdAoKICBAZW5kdmVyYmF0aW0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEBhdHRlbnRpb24KICAqCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCgovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAic3RtMzJmNHh4X2hhbC5oIgoKLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjR4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCgojaWZkZWYgSEFMX1dXREdfTU9EVUxFX0VOQUJMRUQKLyoqIEBkZWZncm91cCBXV0RHIFdXREcKICAqIEBicmllZiBXV0RHIEhBTCBtb2R1bGUgZHJpdmVyLgogICogQHsKICAqLwoKLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnMgV1dERyBFeHBvcnRlZCBGdW5jdGlvbnMKICAqIEB7CiAgKi8KCi8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucwogKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucy4KICoKQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBbLi5dCiAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgogICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgc3RhcnQgdGhlIFdXREcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycwogICAgICAgICAgaW4gdGhlIFdXREdfSW5pdFR5cGVEZWYgb2YgYXNzb2NpYXRlZCBoYW5kbGUuCiAgICAgICgrKSBJbml0aWFsaXplIHRoZSBXV0RHIE1TUC4KCkBlbmR2ZXJiYXRpbQogICogQHsKICAqLwoKLyoqCiAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFdXREcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQuCiAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFdXREdfSW5pdFR5cGVEZWYgb2YgIGFzc29jaWF0ZWQgaGFuZGxlLgogICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfV1dER19Jbml0KFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCnsKICAvKiBDaGVjayB0aGUgV1dERyBoYW5kbGUgYWxsb2NhdGlvbiAqLwogIGlmIChod3dkZyA9PSBOVUxMKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQoKICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogIGFzc2VydF9wYXJhbShJU19XV0RHX0FMTF9JTlNUQU5DRShod3dkZy0+SW5zdGFuY2UpKTsKICBhc3NlcnRfcGFyYW0oSVNfV1dER19QUkVTQ0FMRVIoaHd3ZGctPkluaXQuUHJlc2NhbGVyKSk7CiAgYXNzZXJ0X3BhcmFtKElTX1dXREdfV0lORE9XKGh3d2RnLT5Jbml0LldpbmRvdykpOwogIGFzc2VydF9wYXJhbShJU19XV0RHX0NPVU5URVIoaHd3ZGctPkluaXQuQ291bnRlcikpOwogIGFzc2VydF9wYXJhbShJU19XV0RHX0VXSV9NT0RFKGh3d2RnLT5Jbml0LkVXSU1vZGUpKTsKCiNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogIC8qIFJlc2V0IENhbGxiYWNrIHBvaW50ZXJzICovCiAgaWYoaHd3ZGctPkV3aUNhbGxiYWNrID09IE5VTEwpCiAgewogICAgaHd3ZGctPkV3aUNhbGxiYWNrID0gSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjazsKICB9CgogIGlmKGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKICB7CiAgICBod3dkZy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1dXREdfTXNwSW5pdDsKICB9CgogIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLwogIGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2soaHd3ZGcpOwojZWxzZQogIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLwogIEhBTF9XV0RHX01zcEluaXQoaHd3ZGcpOwojZW5kaWYKCiAgLyogU2V0IFdXREcgQ291bnRlciAqLwogIFdSSVRFX1JFRyhod3dkZy0+SW5zdGFuY2UtPkNSLCAoV1dER19DUl9XREdBIHwgaHd3ZGctPkluaXQuQ291bnRlcikpOwoKICAvKiBTZXQgV1dERyBQcmVzY2FsZXIgYW5kIFdpbmRvdyAqLwogIFdSSVRFX1JFRyhod3dkZy0+SW5zdGFuY2UtPkNGUiwgKGh3d2RnLT5Jbml0LkVXSU1vZGUgfCBod3dkZy0+SW5pdC5QcmVzY2FsZXIgfCBod3dkZy0+SW5pdC5XaW5kb3cpKTsKCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCgovKioKICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgV1dERyBNU1AuCiAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KICAqIEBub3RlICAgV2hlbiByZXdyaXRpbmcgdGhpcyBmdW5jdGlvbiBpbiB1c2VyIGZpbGUsIG1lY2hhbmlzbSBtYXkgYmUgYWRkZWQKICAqICAgICAgICAgdG8gYXZvaWQgbXVsdGlwbGUgaW5pdGlhbGl6ZSB3aGVuIEhBTF9XV0RHX0luaXQgZnVuY3Rpb24gaXMgY2FsbGVkCiAgKiAgICAgICAgIGFnYWluIHRvIGNoYW5nZSBwYXJhbWV0ZXJzLgogICogQHJldHZhbCBOb25lCiAgKi8KX193ZWFrIHZvaWQgSEFMX1dXREdfTXNwSW5pdChXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQp7CiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogIFVOVVNFRChod3dkZyk7CgogIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgIHRoZSBIQUxfV1dER19Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKCiNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQovKioKICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFdXREcgQ2FsbGJhY2sKICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIChzdXJjaGFyZ2VkKSBwcmVkZWZpbmVkIGNhbGxiYWNrCiAgKiBAcGFyYW0gIGh3d2RnIFdXREcgaGFuZGxlCiAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfRVdJX0NCX0lEIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQgQ2FsbGJhY2sgSUQKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECiAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgogICogQHJldHZhbCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcsIEhBTF9XV0RHX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBXV0RHX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCnsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CgogIGlmKHBDYWxsYmFjayA9PSBOVUxMKQogIHsKICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICB9CiAgZWxzZQogIHsKICAgIHN3aXRjaChDYWxsYmFja0lEKQogICAgewogICAgICBjYXNlIEhBTF9XV0RHX0VXSV9DQl9JRDoKICAgICAgICBod3dkZy0+RXdpQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEhBTF9XV0RHX01TUElOSVRfQ0JfSUQ6CiAgICAgICAgaHd3ZGctPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgcmV0dXJuIHN0YXR1czsKfQoKCi8qKgogICogQGJyaWVmICBVbnJlZ2lzdGVyIGEgV1dERyBDYWxsYmFjawogICogICAgICAgICBXV0RHIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgKHN1cmNoYXJnZWQpIHByZWRlZmluZWQgY2FsbGJhY2sgCiAgKiBAcGFyYW0gIGh3d2RnIFdXREcgaGFuZGxlCiAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfRVdJX0NCX0lEIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQgQ2FsbGJhY2sgSUQKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECiAgKiBAcmV0dmFsIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnLCBIQUxfV1dER19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQp7CiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwoKICBzd2l0Y2goQ2FsbGJhY2tJRCkKICB7CiAgICBjYXNlIEhBTF9XV0RHX0VXSV9DQl9JRDoKICAgICAgaHd3ZGctPkV3aUNhbGxiYWNrID0gSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjazsKICAgICAgYnJlYWs7CgogICAgY2FzZSBIQUxfV1dER19NU1BJTklUX0NCX0lEOgogICAgICBod3dkZy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1dXREdfTXNwSW5pdDsKICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOwogICAgICBicmVhazsKICB9CgogIHJldHVybiBzdGF0dXM7Cn0KI2VuZGlmCgovKioKICAqIEB9CiAgKi8KCi8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKICogIEBicmllZiAgICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCiAqCkB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIFsuLl0KICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CiAgICAoKykgUmVmcmVzaCB0aGUgV1dERy4KICAgICgrKSBIYW5kbGUgV1dERyBpbnRlcnJ1cHQgcmVxdWVzdCBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbiBjYWxsYmFjay4KCkBlbmR2ZXJiYXRpbQogICogQHsKICAqLwoKLyoqCiAgKiBAYnJpZWYgIFJlZnJlc2ggdGhlIFdXREcuCiAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9XV0RHX1JlZnJlc2goV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKewogIC8qIFdyaXRlIHRvIFdXREcgQ1IgdGhlIFdXREcgQ291bnRlciB2YWx1ZSB0byByZWZyZXNoIHdpdGggKi8KICBXUklURV9SRUcoaHd3ZGctPkluc3RhbmNlLT5DUiwgKGh3d2RnLT5Jbml0LkNvdW50ZXIpKTsKCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBIYW5kbGUgV1dERyBpbnRlcnJ1cHQgcmVxdWVzdC4KICAqIEBub3RlICAgVGhlIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgKEVXSSkgY2FuIGJlIHVzZWQgaWYgc3BlY2lmaWMgc2FmZXR5IG9wZXJhdGlvbnMKICAqICAgICAgICAgb3IgZGF0YSBsb2dnaW5nIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgYWN0dWFsIHJlc2V0IGlzIGdlbmVyYXRlZC4KICAqICAgICAgICAgVGhlIEVXSSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBieSBjYWxsaW5nIEhBTF9XV0RHX0luaXQgZnVuY3Rpb24gd2l0aAogICogICAgICAgICBFV0lNb2RlIHNldCB0byBXV0RHX0VXSV9FTkFCTEUuCiAgKiAgICAgICAgIFdoZW4gdGhlIGRvd25jb3VudGVyIHJlYWNoZXMgdGhlIHZhbHVlIDB4NDAsIGFuZCBFV0kgaW50ZXJydXB0IGlzCiAgKiAgICAgICAgIGdlbmVyYXRlZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZSAoSVNSKSBjYW4KICAqICAgICAgICAgYmUgdXNlZCB0byB0cmlnZ2VyIHNwZWNpZmljIGFjdGlvbnMgKHN1Y2ggYXMgY29tbXVuaWNhdGlvbnMgb3IgZGF0YQogICogICAgICAgICBsb2dnaW5nKSwgYmVmb3JlIHJlc2V0dGluZyB0aGUgZGV2aWNlLgogICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIEhBTF9XV0RHX0lSUUhhbmRsZXIoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKewogIC8qIENoZWNrIGlmIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgaXMgZW5hYmxlICovCiAgaWYgKF9fSEFMX1dXREdfR0VUX0lUX1NPVVJDRShod3dkZywgV1dER19JVF9FV0kpICE9IFJFU0VUKQogIHsKICAgIC8qIENoZWNrIGlmIFdXREcgRWFybHkgV2FrZXVwIEludGVycnVwdCBvY2N1cnJlZCAqLwogICAgaWYgKF9fSEFMX1dXREdfR0VUX0ZMQUcoaHd3ZGcsIFdXREdfRkxBR19FV0lGKSAhPSBSRVNFVCkKICAgIHsKICAgICAgLyogQ2xlYXIgdGhlIFdXREcgRWFybHkgV2FrZXVwIGZsYWcgKi8KICAgICAgX19IQUxfV1dER19DTEVBUl9GTEFHKGh3d2RnLCBXV0RHX0ZMQUdfRVdJRik7CgojaWYgKFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgLyogRWFybHkgV2FrZXVwIHJlZ2lzdGVyZWQgY2FsbGJhY2sgKi8KICAgICAgaHd3ZGctPkV3aUNhbGxiYWNrKGh3d2RnKTsKI2Vsc2UKICAgICAgLyogRWFybHkgV2FrZXVwIGNhbGxiYWNrICovCiAgICAgIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2soaHd3ZGcpOwojZW5kaWYKICAgIH0KICB9Cn0KCgovKioKICAqIEBicmllZiAgV1dERyBFYXJseSBXYWtldXAgY2FsbGJhY2suCiAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KICAqIEByZXR2YWwgTm9uZQogICovCl9fd2VhayB2b2lkIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2soV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKewogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICBVTlVTRUQoaHd3ZGcpOwoKICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICB0aGUgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICovCn0KCi8qKgogICogQH0KICAqLwoKLyoqCiAgKiBAfQogICovCgojZW5kaWYgLyogSEFMX1dXREdfTU9EVUxFX0VOQUJMRUQgKi8KLyoqCiAgKiBAfQogICovCgovKioKICAqIEB9CiAgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCg==