LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmY0eHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybV90ZW1wbGF0ZS5jIAogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIEhBTCB0aW1lIGJhc2UgYmFzZWQgb24gdGhlIGhhcmR3YXJlIFJUQ19BTEFSTSBUZW1wbGF0ZS4KICAqCiAgKiAgICAgICAgICBUaGlzIGZpbGUgb3ZlcnJpZGUgdGhlIG5hdGl2ZSBIQUwgdGltZSBiYXNlIGZ1bmN0aW9ucyAoZGVmaW5lZCBhcyB3ZWFrKQogICogICAgICAgICAgdG8gdXNlIHRoZSBSVEMgQUxBUk0gZm9yIHRpbWUgYmFzZSBnZW5lcmF0aW9uOgogICogICAgICAgICAgICsgSW5pdGlhbGl6ZXMgdGhlIFJUQyBwZXJpcGhlcmFsIHRvIGluY3JlbWVudCB0aGUgc2Vjb25kcyByZWdpc3RlcnMgZWFjaCAxbXMKICAqICAgICAgICAgICArIFRoZSBhbGFybSBpcyBjb25maWd1cmVkIHRvIGFzc2VydCBhbiBpbnRlcnJ1cHQgd2hlbiB0aGUgUlRDIHJlYWNoZXMgMW1zIAogICogICAgICAgICAgICsgSEFMX0luY1RpY2sgaXMgY2FsbGVkIGF0IGVhY2ggQWxhcm0gZXZlbnQgYW5kIHRoZSB0aW1lIGlzIHJlc2V0IHRvIDAwOjAwOjAwCiAgKiAgICAgICAgICAgKyBIU0UgKGRlZmF1bHQpLCBMU0Ugb3IgTFNJIGNhbiBiZSBzZWxlY3RlZCBhcyBSVEMgY2xvY2sgc291cmNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQGF0dGVudGlvbgogICoKICAqIENvcHlyaWdodCAoYykgMjAxNyBTVE1pY3JvZWxlY3Ryb25pY3MuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQogICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgogICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0KICAgIFRoaXMgZmlsZSBtdXN0IGJlIGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24gZm9sZGVyIGFuZCBtb2RpZmllZCBhcyBmb2xsb3dzOgogICAgKCMpIFJlbmFtZSBpdCB0byAnc3RtMzJmNHh4X2hhbF90aW1lYmFzZV9ydGNfYWxhcm0uYycKICAgICgjKSBBZGQgdGhpcyBmaWxlIGFuZCB0aGUgUlRDIEhBTCBkcml2ZXJzIHRvIHlvdXIgcHJvamVjdCBhbmQgdW5jb21tZW50CiAgICAgICBIQUxfUlRDX01PRFVMRV9FTkFCTEVEIGRlZmluZSBpbiBzdG0zMmY0eHhfaGFsX2NvbmYuaCAKCiAgICBbLi5dCiAgICAoQCkgSEFMIFJUQyBhbGFybSBhbmQgSEFMIFJUQyB3YWtldXAgZHJpdmVycyBjYW6SdCBiZSB1c2VkIHdpdGggbG93IHBvd2VyIG1vZGVzOgogICAgICAgIFRoZSB3YWtlIHVwIGNhcGFiaWxpdHkgb2YgdGhlIFJUQyBtYXkgYmUgaW50cnVzaXZlIGluIGNhc2Ugb2YgcHJpb3IgbG93IHBvd2VyIG1vZGUKICAgICAgICBjb25maWd1cmF0aW9uIHJlcXVpcmluZyBkaWZmZXJlbnQgd2FrZSB1cCBzb3VyY2VzLgogICAgICAgIEFwcGxpY2F0aW9uL0V4YW1wbGUgYmVoYXZpb3IgaXMgbm8gbW9yZSBndWFyYW50ZWVkIAogICAgKEApIFRoZSBzdG0zMmY0eHhfaGFsX3RpbWViYXNlX3RpbSB1c2UgaXMgcmVjb21tZW5kZWQgZm9yIHRoZSBBcHBsaWNhdGlvbnMvRXhhbXBsZXMKICAgICAgICAgIHJlcXVpcmluZyBsb3cgcG93ZXIgbW9kZXMKCiAgQGVuZHZlcmJhdGltCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpbmNsdWRlICJzdG0zMmY0eHhfaGFsLmgiCi8qKiBAYWRkdG9ncm91cCBTVE0zMkY0eHhfSEFMX0RyaXZlcgogICogQHsKICAqLwoKLyoqIEBkZWZncm91cCBIQUxfVGltZUJhc2VfUlRDX0FsYXJtX1RlbXBsYXRlICBIQUwgVGltZUJhc2UgUlRDIEFsYXJtIFRlbXBsYXRlCiAgKiBAewogICovIAoKLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIFJUQyBDbG9jayBzb3VyY2UgZm9yIHlvdXIgYXBwbGljYXRpb246IAogICsgUlRDX0NMT0NLX1NPVVJDRV9IU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHJlcXVpcmluZyB0aW1pbmcgcHJlY2lzaW9uLgogICsgUlRDX0NMT0NLX1NPVVJDRV9MU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgogICsgUlRDX0NMT0NLX1NPVVJDRV9MU0k6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgogICovCiNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9IU0UKLyogI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLwovKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNJICovCgojaWZkZWYgUlRDX0NMT0NLX1NPVVJDRV9IU0UKICAjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDk5VQogICNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgOVUKICAjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfMU1IWiAgICgodWludDMyX3QpKCh1aW50MzJfdClSQ0NfQkRDUl9SVENTRUwgfCAodWludDMyX3QpKChIU0VfVkFMVUUvMTAwMDAwMFUpIDw8IDE2VSkpKQojZWxzZSAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTRSB8fCBSVENfQ0xPQ0tfU09VUkNFX0xTSSAqLwogICNkZWZpbmUgUlRDX0FTWU5DSF9QUkVESVYgICAgICAgMFUKICAjZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgIDMxVQojZW5kaWYgLyogUlRDX0NMT0NLX1NPVVJDRV9IU0UgKi8KCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovClJUQ19IYW5kbGVUeXBlRGVmICAgICAgICBoUlRDX0hhbmRsZTsKLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCBSVENfQWxhcm1fSVJRSGFuZGxlcih2b2lkKTsKLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qKgogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIFJUQ19BTEFSTUEgYXMgYSB0aW1lIGJhc2Ugc291cmNlLiAKICAqICAgICAgICAgVGhlIHRpbWUgc291cmNlIGlzIGNvbmZpZ3VyZWQgIHRvIGhhdmUgMW1zIHRpbWUgYmFzZSB3aXRoIGEgZGVkaWNhdGVkIAogICogICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4gCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICBhdXRvbWF0aWNhbGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgcHJvZ3JhbSBhZnRlcgogICogICAgICAgICByZXNldCBieSBIQUxfSW5pdCgpIG9yIGF0IGFueSB0aW1lIHdoZW4gY2xvY2sgaXMgY29uZmlndXJlZCwgYnkgSEFMX1JDQ19DbG9ja0NvbmZpZygpLgogICogQHBhcmFtICBUaWNrUHJpb3JpdHkgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdFRpY2sodWludDMyX3QgVGlja1ByaW9yaXR5KQp7CiAgX19JTyB1aW50MzJfdCBjb3VudGVyID0gMFU7CgogIFJDQ19Pc2NJbml0VHlwZURlZiAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3Q7CiAgUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmICBQZXJpcGhDbGtJbml0U3RydWN0OwogIEhBTF9TdGF0dXNUeXBlRGVmICAgICBzdGF0dXM7CgojaWZkZWYgUlRDX0NMT0NLX1NPVVJDRV9MU0UKICAvKiBDb25maWd1cmUgTFNFIGFzIFJUQyBjbG9jayBzb3VyY2UgKi8KICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9MU0U7CiAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOwogIFJDQ19Pc2NJbml0U3RydWN0LkxTRVN0YXRlID0gUkNDX0xTRV9PTjsKICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9MU0U7CiNlbGlmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfTFNJKQogIC8qIENvbmZpZ3VyZSBMU0kgYXMgUlRDIGNsb2NrIHNvdXJjZSAqLwogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CiAgUkNDX09zY0luaXRTdHJ1Y3QuTFNJU3RhdGUgPSBSQ0NfTFNJX09OOwogIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0xTSTsKI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9IU0UpCiAgLyogQ29uZmlndXJlIEhTRSBhcyBSVEMgY2xvY2sgc291cmNlICovCiAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFOwogIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5IU0VTdGF0ZSA9IFJDQ19IU0VfT047CiAgLyogRW5zdXJlIHRoYXQgUlRDIGlzIGNsb2NrZWQgYnkgMU1IeiAqLwogIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFXzFNSFo7CiNlbHNlCiNlcnJvciBQbGVhc2Ugc2VsZWN0IHRoZSBSVEMgQ2xvY2sgc291cmNlCiNlbmRpZiAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLwoKICBzdGF0dXMgPSBIQUxfUkNDX09zY0NvbmZpZygmUkNDX09zY0luaXRTdHJ1Y3QpOwogIGlmIChzdGF0dXMgPT0gSEFMX09LKQogIHsKICAgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX1JUQzsKICAgIHN0YXR1cyA9IEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoJlBlcmlwaENsa0luaXRTdHJ1Y3QpOwogIH0KICBpZiAoc3RhdHVzID09IEhBTF9PSykKICB7CiAgICAvKiBFbmFibGUgUlRDIENsb2NrICovCiAgICBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpOwogICAgLyogVGhlIHRpbWUgYmFzZSBzaG91bGQgYmUgMW1zCiAgICAgICBUaW1lIGJhc2UgPSAoKFJUQ19BU1lOQ0hfUFJFRElWICsgMSkgKiAoUlRDX1NZTkNIX1BSRURJViArIDEpKSAvIFJUQ19DTE9DSwogICAgICAgSFNFIGFzIFJUQyBjbG9jawogICAgICAgICBUaW1lIGJhc2UgPSAoKDk5ICsgMSkgKiAoOSArIDEpKSAvIDFNSHoKICAgICAgICAgICAgICAgICAgID0gMW1zCiAgICAgICBMU0UgYXMgUlRDIGNsb2NrCiAgICAgICAgIFRpbWUgYmFzZSA9ICgoMzEgKyAxKSAqICgwICsgMSkpIC8gMzIuNzY4S0h6CiAgICAgICAgICAgICAgICAgICA9IH4xbXMKICAgICAgIExTSSBhcyBSVEMgY2xvY2sKICAgICAgICAgVGltZSBiYXNlID0gKCgzMSArIDEpICogKDAgKyAxKSkgLyAzMktIegogICAgICAgICAgICAgICAgICAgPSAxbXMKICAgICovCiAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZSA9IFJUQzsKICAgIGhSVENfSGFuZGxlLkluaXQuSG91ckZvcm1hdCA9IFJUQ19IT1VSRk9STUFUXzI0OwogICAgaFJUQ19IYW5kbGUuSW5pdC5Bc3luY2hQcmVkaXYgPSBSVENfQVNZTkNIX1BSRURJVjsKICAgIGhSVENfSGFuZGxlLkluaXQuU3luY2hQcmVkaXYgPSBSVENfU1lOQ0hfUFJFRElWOwogICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXQgPSBSVENfT1VUUFVUX0RJU0FCTEU7CiAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFBvbGFyaXR5ID0gUlRDX09VVFBVVF9QT0xBUklUWV9ISUdIOwogICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRUeXBlID0gUlRDX09VVFBVVF9UWVBFX09QRU5EUkFJTjsKICAgIHN0YXR1cyA9IEhBTF9SVENfSW5pdCgmaFJUQ19IYW5kbGUpOwogIH0KICBpZiAoc3RhdHVzID09IEhBTF9PSykKICB7CiAgICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAvKiBEaXNhYmxlIHRoZSBBbGFybSBBIGludGVycnVwdCAqLwogICAgX19IQUxfUlRDX0FMQVJNQV9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CgogICAgLyogQ2xlYXIgZmxhZyBhbGFybSBBICovCiAgICBfX0hBTF9SVENfQUxBUk1fQ0xFQVJfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX0FMUkFGKTsKCiAgICBjb3VudGVyID0gMFU7CiAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUkFXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCiAgICB3aGlsZSAoX19IQUxfUlRDX0FMQVJNX0dFVF9GTEFHKCZoUlRDX0hhbmRsZSwgUlRDX0ZMQUdfQUxSQVdGKSA9PSBSRVNFVCkKICAgIHsKICAgICAgaWYgKGNvdW50ZXIrKyA9PSAoU3lzdGVtQ29yZUNsb2NrIC8gNDhVKSkgLyogVGltZW91dCA9IH4gMXMgKi8KICAgICAgewogICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgewogICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkFMUk1BUiA9ICh1aW50MzJfdCkweDAxVTsKCiAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIHN0YXRlOiBFbmFibGUgQWxhcm0gKi8KICAgIF9fSEFMX1JUQ19BTEFSTUFfRU5BQkxFKCZoUlRDX0hhbmRsZSk7CiAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIGludGVycnVwdCAqLwogICAgX19IQUxfUlRDX0FMQVJNX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsKCiAgICAvKiBSVEMgQWxhcm0gSW50ZXJydXB0IENvbmZpZ3VyYXRpb246IEVYVEkgY29uZmlndXJhdGlvbiAqLwogICAgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0lUKCk7CiAgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsKCiAgICAvKiBDaGVjayBpZiB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSBpcyBzZXQgKi8KICAgIGlmICgoaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVEYpID09ICh1aW50MzJfdClSRVNFVCkKICAgIHsKICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBtb2RlICovCiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5JU1IgPSAodWludDMyX3QpUlRDX0lOSVRfTUFTSzsKICAgICAgY291bnRlciA9IDBVOwogICAgICB3aGlsZSAoKGhSVENfSGFuZGxlLkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX0lOSVRGKSA9PSAodWludDMyX3QpUkVTRVQpCiAgICAgIHsKICAgICAgICBpZiAoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLyA0OFUpKSAvKiBUaW1lb3V0ID0gfiAxcyAqLwogICAgICAgIHsKICAgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgewogICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkRSID0gMFU7CiAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+VFIgPSAwVTsKCiAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+SVNSICY9ICh1aW50MzJfdCl+UlRDX0lTUl9JTklUOwoKICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAvKiBFbmFibGUgdGhlIFJUQyBBbGFybSBJbnRlcnJ1cHQgKi8KICAgIEhBTF9OVklDX0VuYWJsZUlSUShSVENfQWxhcm1fSVJRbik7CgogICAgLyogQ29uZmlndXJlIHRoZSBTeXNUaWNrIElSUSBwcmlvcml0eSAqLwogICAgaWYgKFRpY2tQcmlvcml0eSA8ICgxVUwgPDwgX19OVklDX1BSSU9fQklUUykpCiAgICB7CiAgICAgIEhBTF9OVklDX1NldFByaW9yaXR5KFJUQ19BbGFybV9JUlFuLCBUaWNrUHJpb3JpdHksIDBVKTsKICAgICAgdXdUaWNrUHJpbyA9IFRpY2tQcmlvcml0eTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOwogICAgfQoKICB9CiAgcmV0dXJuIHN0YXR1czsKfQoKLyoqCiAgKiBAYnJpZWYgIFN1c3BlbmQgVGljayBpbmNyZW1lbnQuCiAgKiBAbm90ZSAgIERpc2FibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IGRpc2FibGluZyBSVEMgQUxBUk0gaW50ZXJydXB0LgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCkKewogIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKICAvKiBEaXNhYmxlIFJUQyBBTEFSTSB1cGRhdGUgSW50ZXJydXB0ICovCiAgX19IQUxfUlRDX0FMQVJNX0RJU0FCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7CiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKfQoKLyoqCiAgKiBAYnJpZWYgIFJlc3VtZSBUaWNrIGluY3JlbWVudC4KICAqIEBub3RlICAgRW5hYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBFbmFibGluZyBSVEMgQUxBUk0gaW50ZXJydXB0LgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfUmVzdW1lVGljayh2b2lkKQp7CiAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOwogIC8qIEVuYWJsZSBSVEMgQUxBUk0gVXBkYXRlIGludGVycnVwdCAqLwogIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7CiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKfQoKLyoqCiAgKiBAYnJpZWYgIEFMQVJNIEEgRXZlbnQgQ2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUKICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIHdoZW4gUlRDX0FMQVJNIGludGVycnVwdCB0b29rIHBsYWNlLCBpbnNpZGUKICAqIFJUQ19BTEFSTV9JUlFIYW5kbGVyKCkuIEl0IG1ha2VzIGEgZGlyZWN0IGNhbGwgdG8gSEFMX0luY1RpY2soKSB0byBpbmNyZW1lbnQKICAqIGEgZ2xvYmFsIHZhcmlhYmxlICJ1d1RpY2siIHVzZWQgYXMgYXBwbGljYXRpb24gdGltZSBiYXNlLgogICogQHBhcmFtICBocnRjICBSVEMgaGFuZGxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIEhBTF9SVENfQWxhcm1BRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKewogIF9fSU8gdWludDMyX3QgY291bnRlciA9IDBVOwoKICBIQUxfSW5jVGljaygpOwoKICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CgogIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSAqLwogIGhydGMtPkluc3RhbmNlLT5JU1IgPSAodWludDMyX3QpUlRDX0lOSVRfTUFTSzsKCiAgd2hpbGUoKGhydGMtPkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX0lOSVRGKSA9PSAodWludDMyX3QpUkVTRVQpCiAgewogICAgaWYoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLzQ4VSkpIC8qIFRpbWVvdXQgPSB+IDFzICovCiAgICB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgaHJ0Yy0+SW5zdGFuY2UtPkRSID0gMFU7CiAgaHJ0Yy0+SW5zdGFuY2UtPlRSID0gMFU7CgogIGhydGMtPkluc3RhbmNlLT5JU1IgJj0gKHVpbnQzMl90KX5SVENfSVNSX0lOSVQ7CgogIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOwp9CgovKioKICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFJUQyBBTEFSTSBpbnRlcnJ1cHQgcmVxdWVzdC4KICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgUlRDX0FsYXJtX0lSUUhhbmRsZXIodm9pZCkKewogIEhBTF9SVENfQWxhcm1JUlFIYW5kbGVyKCZoUlRDX0hhbmRsZSk7Cn0KCi8qKgogICogQH0KICAqLwoKLyoqCiAgKiBAfQogICovCgoK