LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmw0eHhfaGFsX3d3ZGcuYwogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIFdXREcgSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFdpbmRvdyBXYXRjaGRvZyAoV1dERykgcGVyaXBoZXJhbDoKICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucwogICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucwogIEB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgV1dERyBTcGVjaWZpYyBmZWF0dXJlcyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIFsuLl0KICAgIE9uY2UgZW5hYmxlZCB0aGUgV1dERyBnZW5lcmF0ZXMgYSBzeXN0ZW0gcmVzZXQgb24gZXhwaXJ5IG9mIGEgcHJvZ3JhbW1lZAogICAgdGltZSBwZXJpb2QsIHVubGVzcyB0aGUgcHJvZ3JhbSByZWZyZXNoZXMgdGhlIGNvdW50ZXIgKFRbNjswXSBkb3duY291bnRlcikKICAgIGJlZm9yZSByZWFjaGluZyAweDNGIHZhbHVlIChpLmUuIGEgcmVzZXQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGNvdW50ZXIKICAgIHZhbHVlIHJvbGxzIGRvd24gZnJvbSAweDQwIHRvIDB4M0YpLgoKICAgICgrKSBBbiBNQ1UgcmVzZXQgaXMgYWxzbyBnZW5lcmF0ZWQgaWYgdGhlIGNvdW50ZXIgdmFsdWUgaXMgcmVmcmVzaGVkCiAgICAgICAgYmVmb3JlIHRoZSBjb3VudGVyIGhhcyByZWFjaGVkIHRoZSByZWZyZXNoIHdpbmRvdyB2YWx1ZS4gVGhpcwogICAgICAgIGltcGxpZXMgdGhhdCB0aGUgY291bnRlciBtdXN0IGJlIHJlZnJlc2hlZCBpbiBhIGxpbWl0ZWQgd2luZG93LgogICAgKCspIE9uY2UgZW5hYmxlZCB0aGUgV1dERyBjYW5ub3QgYmUgZGlzYWJsZWQgZXhjZXB0IGJ5IGEgc3lzdGVtIHJlc2V0LgogICAgKCspIFdXREdSU1QgZmxhZyBpbiBSQ0MgQ1NSIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIHRvIGluZm9ybSB3aGVuIGEgV1dERwogICAgICAgIHJlc2V0IG9jY3Vycy4KICAgICgrKSBUaGUgV1dERyBjb3VudGVyIGlucHV0IGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgQVBCIGNsb2NrIGRpdmlkZWQKICAgICAgICBieSBhIHByb2dyYW1tYWJsZSBwcmVzY2FsZXIuCiAgICAoKykgV1dERyBjbG9jayAoSHopID0gUENMSzEgLyAoNDA5NiAqIFByZXNjYWxlcikKICAgICgrKSBXV0RHIHRpbWVvdXQgKG1TKSA9IDEwMDAgKiAoVFs1OzBdICsgMSkgLyBXV0RHIGNsb2NrIChIeikKICAgICAgICB3aGVyZSBUWzU7MF0gYXJlIHRoZSBsb3dlc3QgNiBiaXRzIG9mIENvdW50ZXIuCiAgICAoKykgV1dERyBDb3VudGVyIHJlZnJlc2ggaXMgYWxsb3dlZCBiZXR3ZWVuIHRoZSBmb2xsb3dpbmcgbGltaXRzIDoKICAgICAgICAoKyspIG1pbiB0aW1lIChtUykgPSAxMDAwICogKENvdW50ZXIgLSBXaW5kb3cpIC8gV1dERyBjbG9jawogICAgICAgICgrKykgbWF4IHRpbWUgKG1TKSA9IDEwMDAgKiAoQ291bnRlciAtIDB4NDApIC8gV1dERyBjbG9jawogICAgKCspIFR5cGljYWwgdmFsdWVzOgogICAgICAgICgrKykgQ291bnRlciBtaW4gKFRbNTswXSA9IDB4MDApIEA4ME1IeiAoUENMSzEpIHdpdGggemVybyBwcmVzY2FsZXI6CiAgICAgICAgICAgICBtYXggdGltZW91dCBiZWZvcmUgcmVzZXQ6IGFwcHJveGltYXRlbHkgNTEuMrVzCiAgICAgICAgKCsrKSBDb3VudGVyIG1heCAoVFs1OzBdID0gMHgzRikgQDgwTUh6IChQQ0xLMSkgd2l0aCBwcmVzY2FsZXIgZGl2aWRpbmcgYnkgODoKICAgICAgICAgICAgIG1heCB0aW1lb3V0IGJlZm9yZSByZXNldDogYXBwcm94aW1hdGVseSAyNi4yMW1zCgogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgKioqIENvbW1vbiBkcml2ZXIgdXNhZ2UgKioqCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgWy4uXQogICAgKCspIEVuYWJsZSBXV0RHIEFQQjEgY2xvY2sgdXNpbmcgX19IQUxfUkNDX1dXREdfQ0xLX0VOQUJMRSgpLgogICAgKCspIFNldCB0aGUgV1dERyBwcmVzY2FsZXIsIHJlZnJlc2ggd2luZG93IGFuZCBjb3VudGVyIHZhbHVlCiAgICAgICAgdXNpbmcgSEFMX1dXREdfSW5pdCgpIGZ1bmN0aW9uLgogICAgKCspIFN0YXJ0IHRoZSBXV0RHIHVzaW5nIEhBTF9XV0RHX1N0YXJ0KCkgZnVuY3Rpb24uCiAgICAgICAgV2hlbiB0aGUgV1dERyBpcyBlbmFibGVkIHRoZSBjb3VudGVyIHZhbHVlIHNob3VsZCBiZSBjb25maWd1cmVkIHRvCiAgICAgICAgYSB2YWx1ZSBncmVhdGVyIHRoYW4gMHg0MCB0byBwcmV2ZW50IGdlbmVyYXRpbmcgYW4gaW1tZWRpYXRlIHJlc2V0LgogICAgKCspIE9wdGlvbmFsbHkgeW91IGNhbiBlbmFibGUgdGhlIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgKEVXSSkgd2hpY2ggaXMKICAgICAgICBnZW5lcmF0ZWQgd2hlbiB0aGUgY291bnRlciByZWFjaGVzIDB4NDAsIGFuZCB0aGVuIHN0YXJ0IHRoZSBXV0RHIHVzaW5nCiAgICAgICAgSEFMX1dXREdfU3RhcnRfSVQoKS4gQXQgRVdJIEhBTF9XV0RHX1dha2V1cENhbGxiYWNrIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgogICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBjYWxsYmFjayBIQUxfV1dER19XYWtldXBDYWxsYmFjay4KICAgICAgICBPbmNlIGVuYWJsZWQsIEVXSSBpbnRlcnJ1cHQgY2Fubm90IGJlIGRpc2FibGVkIGV4Y2VwdCBieSBhIHN5c3RlbSByZXNldC4KICAgICgrKSBUaGVuIHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIG11c3QgcmVmcmVzaCB0aGUgV1dERyBjb3VudGVyIGF0IHJlZ3VsYXIKICAgICAgICBpbnRlcnZhbHMgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24gdG8gcHJldmVudCBhbiBNQ1UgcmVzZXQsIHVzaW5nCiAgICAgICAgSEFMX1dXREdfUmVmcmVzaCgpIGZ1bmN0aW9uLiBUaGlzIG9wZXJhdGlvbiBtdXN0IG9jY3VyIG9ubHkgd2hlbgogICAgICAgIHRoZSBjb3VudGVyIGlzIGxvd2VyIHRoYW4gdGhlIHJlZnJlc2ggd2luZG93IHZhbHVlIGFscmVhZHkgcHJvZ3JhbW1lZC4KCiAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgWy4uXQogICAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSAgVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxIGFsbG93cwogICAgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLiBVc2UgRnVuY3Rpb25zCiAgICBAcmVmIEhBTF9XV0RHX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIHVzZXIgY2FsbGJhY2suCgogICAgKCspIEZ1bmN0aW9uIEByZWYgSEFMX1dXREdfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcKICAgICAgICBjYWxsYmFja3M6CiAgICAgICAgKCsrKSBFd2lDYWxsYmFjayA6IGNhbGxiYWNrIGZvciBFYXJseSBXYWtlVXAgSW50ZXJydXB0LgogICAgICAgICgrKykgTXNwSW5pdENhbGxiYWNrIDogV1dERyBNc3BJbml0LgogICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAogICAgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KCiAgICAoKykgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX1dXREdfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0bwogICAgdGhlIGRlZmF1bHQgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb24uIEByZWYgSEFMX1dXREdfVW5SZWdpc3RlckNhbGxiYWNrKCkKICAgIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSBhbmQgdGhlIENhbGxiYWNrIElELgogICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKICAgICAgICAoKyspIEV3aUNhbGxiYWNrIDogY2FsbGJhY2sgZm9yICBFYXJseSBXYWtlVXAgSW50ZXJydXB0LgogICAgICAgICgrKykgTXNwSW5pdENhbGxiYWNrIDogV1dERyBNc3BJbml0LgoKICAgIFsuLl0KICAgIFdoZW4gY2FsbGluZyBAcmVmIEhBTF9XV0RHX0luaXQgZnVuY3Rpb24sIGNhbGxiYWNrcyBhcmUgcmVzZXQgdG8gdGhlCiAgICBjb3JyZXNwb25kaW5nIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6CiAgICBAcmVmIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2soKSBhbmQgSEFMX1dXREdfTXNwSW5pdCgpIG9ubHkgaWYgdGhleSBoYXZlCiAgICBub3QgYmVlbiByZWdpc3RlcmVkIGJlZm9yZS4KCiAgICBbLi5dCiAgICBXaGVuIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCiAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdGVyaW5nIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQogICAgYW5kIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrcyBhcmUgdXNlZC4KCiAgICAqKiogV1dERyBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0KICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBXV0RHIEhBTCBkcml2ZXIuCiAgICAgICgrKSBfX0hBTF9XV0RHX0VOQUJMRTogRW5hYmxlIHRoZSBXV0RHIHBlcmlwaGVyYWwKICAgICAgKCspIF9fSEFMX1dXREdfR0VUX0ZMQUc6IEdldCB0aGUgc2VsZWN0ZWQgV1dERydzIGZsYWcgc3RhdHVzCiAgICAgICgrKSBfX0hBTF9XV0RHX0NMRUFSX0ZMQUc6IENsZWFyIHRoZSBXV0RHJ3MgcGVuZGluZyBmbGFncwogICAgICAoKykgX19IQUxfV1dER19FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgV1dERyBlYXJseSB3YWtldXAgaW50ZXJydXB0CgogIEBlbmR2ZXJiYXRpbQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQGF0dGVudGlvbgogICoKICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgogICoKICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAogICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQogICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgogICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpbmNsdWRlICJzdG0zMmw0eHhfaGFsLmgiCgovKiogQGFkZHRvZ3JvdXAgU1RNMzJMNHh4X0hBTF9Ecml2ZXIKICAqIEB7CiAgKi8KCiNpZmRlZiBIQUxfV1dER19NT0RVTEVfRU5BQkxFRAovKiogQGRlZmdyb3VwIFdXREcgV1dERwogICogQGJyaWVmIFdXREcgSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiBAewogICovCgovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9ucyBXV0RHIEV4cG9ydGVkIEZ1bmN0aW9ucwogICogQHsKICAqLwoKLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCiAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucy4KICAqCkB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgWy4uXQogICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKICAgICAgKCspIEluaXRpYWxpemUgYW5kIHN0YXJ0IHRoZSBXV0RHIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKICAgICAgICAgIGluIHRoZSBXV0RHX0luaXRUeXBlRGVmIG9mIGFzc29jaWF0ZWQgaGFuZGxlLgogICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgV1dERyBNU1AuCgpAZW5kdmVyYmF0aW0KICAqIEB7CiAgKi8KCi8qKgogICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBXV0RHIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkLgogICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBXV0RHX0luaXRUeXBlRGVmIG9mICBhc3NvY2lhdGVkIGhhbmRsZS4KICAqIEBwYXJhbSAgaHd3ZGcgIHBvaW50ZXIgdG8gYSBXV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFdXREcgbW9kdWxlLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1dXREdfSW5pdChXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQp7CiAgLyogQ2hlY2sgdGhlIFdXREcgaGFuZGxlIGFsbG9jYXRpb24gKi8KICBpZiAoaHd3ZGcgPT0gTlVMTCkKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICBhc3NlcnRfcGFyYW0oSVNfV1dER19BTExfSU5TVEFOQ0UoaHd3ZGctPkluc3RhbmNlKSk7CiAgYXNzZXJ0X3BhcmFtKElTX1dXREdfUFJFU0NBTEVSKGh3d2RnLT5Jbml0LlByZXNjYWxlcikpOwogIGFzc2VydF9wYXJhbShJU19XV0RHX1dJTkRPVyhod3dkZy0+SW5pdC5XaW5kb3cpKTsKICBhc3NlcnRfcGFyYW0oSVNfV1dER19DT1VOVEVSKGh3d2RnLT5Jbml0LkNvdW50ZXIpKTsKICBhc3NlcnRfcGFyYW0oSVNfV1dER19FV0lfTU9ERShod3dkZy0+SW5pdC5FV0lNb2RlKSk7CgojaWYgKFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAvKiBSZXNldCBDYWxsYmFjayBwb2ludGVycyAqLwogIGlmIChod3dkZy0+RXdpQ2FsbGJhY2sgPT0gTlVMTCkKICB7CiAgICBod3dkZy0+RXdpQ2FsbGJhY2sgPSBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrOwogIH0KCiAgaWYgKGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKICB7CiAgICBod3dkZy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1dXREdfTXNwSW5pdDsKICB9CgogIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLwogIGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2soaHd3ZGcpOwojZWxzZQogIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLwogIEhBTF9XV0RHX01zcEluaXQoaHd3ZGcpOwojZW5kaWYKCiAgLyogU2V0IFdXREcgQ291bnRlciAqLwogIFdSSVRFX1JFRyhod3dkZy0+SW5zdGFuY2UtPkNSLCAoV1dER19DUl9XREdBIHwgaHd3ZGctPkluaXQuQ291bnRlcikpOwoKICAvKiBTZXQgV1dERyBQcmVzY2FsZXIgYW5kIFdpbmRvdyAqLwogIFdSSVRFX1JFRyhod3dkZy0+SW5zdGFuY2UtPkNGUiwgKGh3d2RnLT5Jbml0LkVXSU1vZGUgfCBod3dkZy0+SW5pdC5QcmVzY2FsZXIgfCBod3dkZy0+SW5pdC5XaW5kb3cpKTsKCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCgovKioKICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgV1dERyBNU1AuCiAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KICAqIEBub3RlICAgV2hlbiByZXdyaXRpbmcgdGhpcyBmdW5jdGlvbiBpbiB1c2VyIGZpbGUsIG1lY2hhbmlzbSBtYXkgYmUgYWRkZWQKICAqICAgICAgICAgdG8gYXZvaWQgbXVsdGlwbGUgaW5pdGlhbGl6ZSB3aGVuIEhBTF9XV0RHX0luaXQgZnVuY3Rpb24gaXMgY2FsbGVkCiAgKiAgICAgICAgIGFnYWluIHRvIGNoYW5nZSBwYXJhbWV0ZXJzLgogICogQHJldHZhbCBOb25lCiAgKi8KX193ZWFrIHZvaWQgSEFMX1dXREdfTXNwSW5pdChXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQp7CiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogIFVOVVNFRChod3dkZyk7CgogIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgIHRoZSBIQUxfV1dER19Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKCiNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQovKioKICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFdXREcgQ2FsbGJhY2sKICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIChzdXJjaGFyZ2VkKSBwcmVkZWZpbmVkIGNhbGxiYWNrCiAgKiBAcGFyYW0gIGh3d2RnIFdXREcgaGFuZGxlCiAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfRVdJX0NCX0lEIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQgQ2FsbGJhY2sgSUQKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECiAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgogICogQHJldHZhbCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcsIEhBTF9XV0RHX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBXV0RHX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCnsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CgogIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKICB7CiAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgfQogIGVsc2UKICB7CiAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICB7CiAgICAgIGNhc2UgSEFMX1dXREdfRVdJX0NCX0lEOgogICAgICAgIGh3d2RnLT5Fd2lDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgSEFMX1dXREdfTVNQSU5JVF9DQl9JRDoKICAgICAgICBod3dkZy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICByZXR1cm4gc3RhdHVzOwp9CgoKLyoqCiAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYSBXV0RHIENhbGxiYWNrCiAgKiAgICAgICAgIFdXREcgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayAoc3VyY2hhcmdlZCkgcHJlZGVmaW5lZCBjYWxsYmFjawogICogQHBhcmFtICBod3dkZyBXV0RHIGhhbmRsZQogICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCiAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9XV0RHX0VXSV9DQl9JRCBFYXJseSBXYWtlVXAgSW50ZXJydXB0IENhbGxiYWNrIElECiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9XV0RHX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAogICogQHJldHZhbCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfV1dER19VblJlZ2lzdGVyQ2FsbGJhY2soV1dER19IYW5kbGVUeXBlRGVmICpod3dkZywgSEFMX1dXREdfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKewogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKCiAgc3dpdGNoIChDYWxsYmFja0lEKQogIHsKICAgIGNhc2UgSEFMX1dXREdfRVdJX0NCX0lEOgogICAgICBod3dkZy0+RXdpQ2FsbGJhY2sgPSBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrOwogICAgICBicmVhazsKCiAgICBjYXNlIEhBTF9XV0RHX01TUElOSVRfQ0JfSUQ6CiAgICAgIGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfV1dER19Nc3BJbml0OwogICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgICAgIGJyZWFrOwogIH0KCiAgcmV0dXJuIHN0YXR1czsKfQojZW5kaWYKCi8qKgogICogQH0KICAqLwoKLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucwogICogIEBicmllZiAgICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCiAgKgpAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBbLi5dCiAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgogICAgKCspIFJlZnJlc2ggdGhlIFdXREcuCiAgICAoKykgSGFuZGxlIFdXREcgaW50ZXJydXB0IHJlcXVlc3QgYW5kIGFzc29jaWF0ZWQgZnVuY3Rpb24gY2FsbGJhY2suCgpAZW5kdmVyYmF0aW0KICAqIEB7CiAgKi8KCi8qKgogICogQGJyaWVmICBSZWZyZXNoIHRoZSBXV0RHLgogICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfV1dER19SZWZyZXNoKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCnsKICAvKiBXcml0ZSB0byBXV0RHIENSIHRoZSBXV0RHIENvdW50ZXIgdmFsdWUgdG8gcmVmcmVzaCB3aXRoICovCiAgV1JJVEVfUkVHKGh3d2RnLT5JbnN0YW5jZS0+Q1IsIChod3dkZy0+SW5pdC5Db3VudGVyKSk7CgogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgSGFuZGxlIFdXREcgaW50ZXJydXB0IHJlcXVlc3QuCiAgKiBAbm90ZSAgIFRoZSBFYXJseSBXYWtldXAgSW50ZXJydXB0IChFV0kpIGNhbiBiZSB1c2VkIGlmIHNwZWNpZmljIHNhZmV0eSBvcGVyYXRpb25zCiAgKiAgICAgICAgIG9yIGRhdGEgbG9nZ2luZyBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGFjdHVhbCByZXNldCBpcyBnZW5lcmF0ZWQuCiAgKiAgICAgICAgIFRoZSBFV0kgaW50ZXJydXB0IGlzIGVuYWJsZWQgYnkgY2FsbGluZyBIQUxfV1dER19Jbml0IGZ1bmN0aW9uIHdpdGgKICAqICAgICAgICAgRVdJTW9kZSBzZXQgdG8gV1dER19FV0lfRU5BQkxFLgogICogICAgICAgICBXaGVuIHRoZSBkb3duY291bnRlciByZWFjaGVzIHRoZSB2YWx1ZSAweDQwLCBhbmQgRVdJIGludGVycnVwdCBpcwogICogICAgICAgICBnZW5lcmF0ZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUgKElTUikgY2FuCiAgKiAgICAgICAgIGJlIHVzZWQgdG8gdHJpZ2dlciBzcGVjaWZpYyBhY3Rpb25zIChzdWNoIGFzIGNvbW11bmljYXRpb25zIG9yIGRhdGEKICAqICAgICAgICAgbG9nZ2luZyksIGJlZm9yZSByZXNldHRpbmcgdGhlIGRldmljZS4KICAqIEBwYXJhbSAgaHd3ZGcgIHBvaW50ZXIgdG8gYSBXV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFdXREcgbW9kdWxlLgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfV1dER19JUlFIYW5kbGVyKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCnsKICAvKiBDaGVjayBpZiBFYXJseSBXYWtldXAgSW50ZXJydXB0IGlzIGVuYWJsZSAqLwogIGlmIChfX0hBTF9XV0RHX0dFVF9JVF9TT1VSQ0UoaHd3ZGcsIFdXREdfSVRfRVdJKSAhPSBSRVNFVCkKICB7CiAgICAvKiBDaGVjayBpZiBXV0RHIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgb2NjdXJyZWQgKi8KICAgIGlmIChfX0hBTF9XV0RHX0dFVF9GTEFHKGh3d2RnLCBXV0RHX0ZMQUdfRVdJRikgIT0gUkVTRVQpCiAgICB7CiAgICAgIC8qIENsZWFyIHRoZSBXV0RHIEVhcmx5IFdha2V1cCBmbGFnICovCiAgICAgIF9fSEFMX1dXREdfQ0xFQVJfRkxBRyhod3dkZywgV1dER19GTEFHX0VXSUYpOwoKI2lmIChVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgIC8qIEVhcmx5IFdha2V1cCByZWdpc3RlcmVkIGNhbGxiYWNrICovCiAgICAgIGh3d2RnLT5Fd2lDYWxsYmFjayhod3dkZyk7CiNlbHNlCiAgICAgIC8qIEVhcmx5IFdha2V1cCBjYWxsYmFjayAqLwogICAgICBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrKGh3d2RnKTsKI2VuZGlmCiAgICB9CiAgfQp9CgoKLyoqCiAgKiBAYnJpZWYgIFdXREcgRWFybHkgV2FrZXVwIGNhbGxiYWNrLgogICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpfX3dlYWsgdm9pZCBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCnsKICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgVU5VU0VEKGh3d2RnKTsKCiAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgdGhlIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9CgovKioKICAqIEB9CiAgKi8KCi8qKgogICogQH0KICAqLwoKI2VuZGlmIC8qIEhBTF9XV0RHX01PRFVMRV9FTkFCTEVEICovCi8qKgogICogQH0KICAqLwoKLyoqCiAgKiBAfQogICovCgovKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwo=