LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmYyeHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybV90ZW1wbGF0ZS5jIAogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIEhBTCB0aW1lIGJhc2UgYmFzZWQgb24gdGhlIGhhcmR3YXJlIFJUQ19BTEFSTSBUZW1wbGF0ZS4KICAqCiAgKiAgICAgICAgICBUaGlzIGZpbGUgb3ZlcnJpZGUgdGhlIG5hdGl2ZSBIQUwgdGltZSBiYXNlIGZ1bmN0aW9ucyAoZGVmaW5lZCBhcyB3ZWFrKQogICogICAgICAgICAgdG8gdXNlIHRoZSBSVEMgQUxBUk0gZm9yIHRpbWUgYmFzZSBnZW5lcmF0aW9uOgogICogICAgICAgICAgICsgSW50aWFsaXplcyB0aGUgUlRDIHBlcmlwaGVyYWwgd2l0aCByZXF1aXJlZCBwcmVzY2FsZXJzIHZhbHVlIGZvciBlYWNoCiAgKiAgICAgICAgICAgICBSVEMgY2xvY2sgc291cmNlIChIU0UsIExTRSBvciBMU0kpCiAgKiAgICAgICAgICAgKyBUaGUgYWxhcm0gaXMgY29uZmlndXJlZCB0byBhc3NlcnQgYW4gaW50ZXJydXB0IHdoZW4gdGhlIFJUQyByZWFjaGVzIDFtcyAKICAqICAgICAgICAgICArIEhBTF9JbmNUaWNrIGlzIGNhbGxlZCBhdCBlYWNoIEFsYXJtIGV2ZW50IGFuZCB0aGUgdGltZSBpcyByZXNldCB0byAwMDowMDowMAogICogICAgICAgICAgICsgSFNFIChkZWZhdWx0KSwgTFNFIG9yIExTSSBjYW4gYmUgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrIHNvdXJjZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEBhdHRlbnRpb24KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXQogICAgVGhpcyBmaWxlIG11c3QgYmUgY29waWVkIHRvIHRoZSBhcHBsaWNhdGlvbiBmb2xkZXIgYW5kIG1vZGlmaWVkIGFzIGZvbGxvd3M6CiAgICAoIykgUmVuYW1lIGl0IHRvICdzdG0zMmYyeHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybS5jJwogICAgKCMpIEFkZCB0aGlzIGZpbGUgYW5kIHRoZSBSVEMgSEFMIGRyaXZlcnMgdG8geW91ciBwcm9qZWN0IGFuZCB1bmNvbW1lbnQKICAgICAgICBIQUxfUlRDX01PRFVMRV9FTkFCTEVEIGRlZmluZSBpbiBzdG0zMmYyeHhfaGFsX2NvbmYuaCAKCiAgICBbLi5dCiAgICAoQCkgSEFMIFJUQyBhbGFybSBhbmQgSEFMIFJUQyB3YWtldXAgZHJpdmVycyBjYW6SdCBiZSB1c2VkIHdpdGggbG93IHBvd2VyIG1vZGVzOgogICAgICAgIFRoZSB3YWtlIHVwIGNhcGFiaWxpdHkgb2YgdGhlIFJUQyBtYXkgYmUgaW50cnVzaXZlIGluIGNhc2Ugb2YgcHJpb3IgbG93IHBvd2VyIG1vZGUKICAgICAgICBjb25maWd1cmF0aW9uIHJlcXVpcmluZyBkaWZmZXJlbnQgd2FrZSB1cCBzb3VyY2VzLgogICAgICAgIEFwcGxpY2F0aW9uL0V4YW1wbGUgYmVoYXZpb3IgaXMgbm8gbW9yZSBndWFyYW50ZWVkIAogICAgKEApIFRoZSBzdG0zMmYyeHhfaGFsX3RpbWViYXNlX3RpbSB1c2UgaXMgcmVjb21tZW5kZWQgZm9yIHRoZSBBcHBsaWNhdGlvbnMvRXhhbXBsZXMKICAgICAgICByZXF1aXJpbmcgbG93IHBvd2VyIG1vZGVzCgogIEBlbmR2ZXJiYXRpbQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCgovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAic3RtMzJmMnh4X2hhbC5oIgoKLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjJ4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCgovKiogQGRlZmdyb3VwIEhBTF9UaW1lQmFzZV9SVENfQWxhcm1fVGVtcGxhdGUgIEhBTCBUaW1lQmFzZSBSVEMgQWxhcm0gVGVtcGxhdGUKICAqIEB7CiAgKi8KCi8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgdG8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBSVEMgQ2xvY2sgc291cmNlIGZvciB5b3VyIGFwcGxpY2F0aW9uOiAKICArIFJUQ19DTE9DS19TT1VSQ0VfSFNFOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyByZXF1aXJpbmcgdGltaW5nIHByZWNpc2lvbi4KICArIFJUQ19DTE9DS19TT1VSQ0VfTFNFOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxvdyBjb25zdHJhaW50IG9uIHRpbWluZwogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbi4KICArIFJUQ19DTE9DS19TT1VSQ0VfTFNJOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxvdyBjb25zdHJhaW50IG9uIHRpbWluZwogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbi4KICAqLwojZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfSFNFCi8qICNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9MU0UgKi8KLyogI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0xTSSAqLwoKI2lmZGVmIFJUQ19DTE9DS19TT1VSQ0VfSFNFCiAgI2RlZmluZSBSVENfQVNZTkNIX1BSRURJViAgICAgICA5VQogICNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgOVUKICAjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfMU1IWiAgICgodWludDMyX3QpKCh1aW50MzJfdClSQ0NfQkRDUl9SVENTRUwgfCAodWludDMyX3QpKChIU0VfVkFMVUUvMTAwMDAwMFUpIDw8IDE2VSkpKQojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0xTRSkKICAjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDJVCiAgI2RlZmluZSBSVENfU1lOQ0hfUFJFRElWICAgICAgICAwVQojZWxzZSAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTSSAqLwogICNkZWZpbmUgUlRDX0FTWU5DSF9QUkVESVYgICAgICAgMVUKICAjZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgIDBVCiNlbmRpZiAvKiBSVENfQ0xPQ0tfU09VUkNFX0hTRSAqLwoKLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KUlRDX0hhbmRsZVR5cGVEZWYgICAgICAgIGhSVENfSGFuZGxlOwovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIFJUQ19BbGFybV9JUlFIYW5kbGVyKHZvaWQpOwovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyoqCiAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgUlRDX0FMQVJNQSBhcyBhIHRpbWUgYmFzZSBzb3VyY2UuIAogICogICAgICAgICBUaGUgdGltZSBzb3VyY2UgaXMgY29uZmlndXJlZCAgdG8gaGF2ZSAxbXMgdGltZSBiYXNlIHdpdGggYSBkZWRpY2F0ZWQgCiAgKiAgICAgICAgIFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LiAKICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGJlZ2lubmluZyBvZiBwcm9ncmFtIGFmdGVyCiAgKiAgICAgICAgIHJlc2V0IGJ5IEhBTF9Jbml0KCkgb3IgYXQgYW55IHRpbWUgd2hlbiBjbG9jayBpcyBjb25maWd1cmVkLCBieSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkuCiAgKiBAcGFyYW0gIFRpY2tQcmlvcml0eSBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayh1aW50MzJfdCBUaWNrUHJpb3JpdHkpCnsKICBfX0lPIHVpbnQzMl90IGNvdW50ZXIgPSAwVTsKCiAgUkNDX09zY0luaXRUeXBlRGVmICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdDsKICBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgIFBlcmlwaENsa0luaXRTdHJ1Y3Q7CiAgSEFMX1N0YXR1c1R5cGVEZWYgICAgIHN0YXR1czsKCiNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0xTRQogIC8qIENvbmZpZ3VlIExTRSBhcyBSVEMgY2xvY2sgc291Y3JlICovCiAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFOwogIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0VTdGF0ZSA9IFJDQ19MU0VfT047CiAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNFOwojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0xTSSkKICAvKiBDb25maWd1ZSBMU0kgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLwogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CiAgUkNDX09zY0luaXRTdHJ1Y3QuTFNJU3RhdGUgPSBSQ0NfTFNJX09OOwogIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0xTSTsKI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9IU0UpCiAgLyogQ29uZmlndWUgSFNFIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9IU0U7CiAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOwogIFJDQ19Pc2NJbml0U3RydWN0LkhTRVN0YXRlID0gUkNDX0hTRV9PTjsKICAvKiBFbnN1cmUgdGhhdCBSVEMgaXMgY2xvY2tlZCBieSAxTUh6ICovCiAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfMU1IWjsKI2Vsc2UKI2Vycm9yIFBsZWFzZSBzZWxlY3QgdGhlIFJUQyBDbG9jayBzb3VyY2UKI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovCgogIHN0YXR1cyA9IEhBTF9SQ0NfT3NjQ29uZmlnKCZSQ0NfT3NjSW5pdFN0cnVjdCk7CiAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgewogICAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9IFJDQ19QRVJJUEhDTEtfUlRDOwogICAgc3RhdHVzID0gSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygmUGVyaXBoQ2xrSW5pdFN0cnVjdCk7CiAgfQogIGlmIChzdGF0dXMgPT0gSEFMX09LKQogIHsKICAgIC8qIEVuYWJsZSBSVEMgQ2xvY2sgKi8KICAgIF9fSEFMX1JDQ19SVENfRU5BQkxFKCk7CgogICAgLyogVGhlIHRpbWUgYmFzZSBzaG91bGQgYmUgMW1zCiAgICAgICBUaW1lIGJhc2UgPSAoKFJUQ19BU1lOQ0hfUFJFRElWICsgMSkgKiAoUlRDX1NZTkNIX1BSRURJViArIDEpICogQUxBUk1fVkFMVUUpIC8gUlRDX0NMT0NLCiAgICAgICBIU0UgYXMgUlRDIGNsb2NrCiAgICAgICAgIFRpbWUgYmFzZSA9ICgoOSArIDEpICogKDkgKyAxKSAqIDEwKSAvIDFNSHoKICAgICAgICAgICAgICAgICAgID0gMW1zCiAgICAgICBMU0UgYXMgUlRDIGNsb2NrCiAgICAgICAgIFRpbWUgYmFzZSA9ICgoMiArIDEpICogKDAgKyAxKSAqIDExKSAvIDMyLjc2OEtIegogICAgICAgICAgICAgICAgICAgPSB+MW1zCiAgICAgICBMU0kgYXMgUlRDIGNsb2NrCiAgICAgICAgIFRpbWUgYmFzZSA9ICgoMSArIDEpICogKDAgKyAxKSAqIDE2KSAvIDMyS0h6CiAgICAgICAgICAgICAgICAgICA9IDFtcwogICAgKi8KICAgIGhSVENfSGFuZGxlLkluc3RhbmNlID0gUlRDOwogICAgaFJUQ19IYW5kbGUuSW5pdC5Ib3VyRm9ybWF0ID0gUlRDX0hPVVJGT1JNQVRfMjQ7CiAgICBoUlRDX0hhbmRsZS5Jbml0LkFzeW5jaFByZWRpdiA9IFJUQ19BU1lOQ0hfUFJFRElWOwogICAgaFJUQ19IYW5kbGUuSW5pdC5TeW5jaFByZWRpdiA9IFJUQ19TWU5DSF9QUkVESVY7CiAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dCA9IFJUQ19PVVRQVVRfRElTQUJMRTsKICAgIGhSVENfSGFuZGxlLkluaXQuT3V0UHV0UG9sYXJpdHkgPSBSVENfT1VUUFVUX1BPTEFSSVRZX0hJR0g7CiAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFR5cGUgPSBSVENfT1VUUFVUX1RZUEVfT1BFTkRSQUlOOwogICAgc3RhdHVzID0gSEFMX1JUQ19Jbml0KCZoUlRDX0hhbmRsZSk7CiAgfQogIGlmIChzdGF0dXMgPT0gSEFMX09LKQogIHsKICAgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOwoKICAgIC8qIERpc2FibGUgdGhlIEFsYXJtIEEgaW50ZXJydXB0ICovCiAgICBfX0hBTF9SVENfQUxBUk1BX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAvKiBDbGVhciBmbGFnIGFsYXJtIEEgKi8KICAgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKCZoUlRDX0hhbmRsZSwgUlRDX0ZMQUdfQUxSQUYpOwoKICAgIGNvdW50ZXIgPSAwVTsKICAgIC8qIFdhaXQgdGlsbCBSVEMgQUxSQVdGIGZsYWcgaXMgc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KICAgIHdoaWxlIChfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoJmhSVENfSGFuZGxlLCBSVENfRkxBR19BTFJBV0YpID09IFJFU0VUKQogICAgewogICAgICBpZiAoY291bnRlcisrID09IFN5c3RlbUNvcmVDbG9jayAvIDQ4VSkgLyogVGltZW91dCA9IH4gMXMgKi8KICAgICAgewogICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICAgICAgfQogICAgfQogIH0KICBpZiAoc3RhdHVzID09IEhBTF9PSykKICB7CiAgICAvKiBTZXQgYWxhcm0gdmFsdWUgZm9yIGVhY2ggUlRDIGNsb2NrIHNvdXJjZSAqLwojaWZkZWYgUlRDX0NMT0NLX1NPVVJDRV9IU0UKICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5BTFJNQVIgPSAweDEwVTsKI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9MU0UpCiAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+QUxSTUFSID0gMHgxMVU7CiNlbHNlCiAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+QUxSTUFSID0gMHgxNlU7CiNlbmRpZgoKICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gc3RhdGU6IEVuYWJsZSBBbGFybSAqLwogICAgX19IQUxfUlRDX0FMQVJNQV9FTkFCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIGludGVycnVwdCAqLwogICAgX19IQUxfUlRDX0FMQVJNX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsKCiAgICAvKiBSVEMgQWxhcm0gSW50ZXJydXB0IENvbmZpZ3VyYXRpb246IEVYVEkgY29uZmlndXJhdGlvbiAqLwogICAgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0lUKCk7CiAgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsKCiAgICAvKiBDaGVjayBpZiB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSBpcyBzZXQgKi8KICAgIGlmICgoaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVEYpID09ICh1aW50MzJfdClSRVNFVCkKICAgIHsKICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBtb2RlICovCiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5JU1IgPSAodWludDMyX3QpUlRDX0lOSVRfTUFTSzsKICAgICAgY291bnRlciA9IDBVOwogICAgICB3aGlsZSAoKGhSVENfSGFuZGxlLkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX0lOSVRGKSA9PSAodWludDMyX3QpUkVTRVQpCiAgICAgIHsKICAgICAgICBpZiAoY291bnRlcisrID09IFN5c3RlbUNvcmVDbG9jayAvIDQ4VSkgLyogVGltZW91dCA9IH4gMXMgKi8KICAgICAgICB7CiAgICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGlmIChzdGF0dXMgPT0gSEFMX09LKQogIHsKICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5EUiA9IDBVOwogICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPlRSID0gMFU7CgogICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiAmPSAodWludDMyX3QpflJUQ19JU1JfSU5JVDsKCiAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7CgogICAgLyogRW5hYmxlIHRoZSBSVEMgQWxhcm0gSW50ZXJydXB0ICovCiAgICBIQUxfTlZJQ19FbmFibGVJUlEoUlRDX0FsYXJtX0lSUW4pOwoKICAgIC8qIENvbmZpZ3VyZSB0aGUgU3lzVGljayBJUlEgcHJpb3JpdHkgKi8KICAgIGlmIChUaWNrUHJpb3JpdHkgPCAoMVVMIDw8IF9fTlZJQ19QUklPX0JJVFMpKQogICAgewogICAgICBIQUxfTlZJQ19TZXRQcmlvcml0eShSVENfQWxhcm1fSVJRbiwgVGlja1ByaW9yaXR5LCAwVSk7CiAgICAgIHV3VGlja1ByaW8gPSBUaWNrUHJpb3JpdHk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICAgIH0KCiAgfQogIHJldHVybiBzdGF0dXM7Cn0KCi8qKgogICogQGJyaWVmICBTdXNwZW5kIFRpY2sgaW5jcmVtZW50LgogICogQG5vdGUgICBEaXNhYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBkaXNhYmxpbmcgUlRDIEFMQVJNIGludGVycnVwdC4KICAqIEBwYXJhbSAgTm9uZQogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCkKewogIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKICAvKiBEaXNhYmxlIFJUQyBBTEFSTSB1cGRhdGUgSW50ZXJydXB0ICovCiAgX19IQUxfUlRDX0FMQVJNX0RJU0FCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7CiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKfQoKLyoqCiAgKiBAYnJpZWYgIFJlc3VtZSBUaWNrIGluY3JlbWVudC4KICAqIEBub3RlICAgRW5hYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBFbmFibGluZyBSVEMgQUxBUk0gaW50ZXJydXB0LgogICogQHBhcmFtICBOb25lCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIEhBTF9SZXN1bWVUaWNrKHZvaWQpCnsKICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CiAgLyogRW5hYmxlIFJUQyBBTEFSTSBVcGRhdGUgaW50ZXJydXB0ICovCiAgX19IQUxfUlRDX0FMQVJNX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsKICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwp9CgovKioKICAqIEBicmllZiAgQUxBUk0gQSBFdmVudCBDYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgd2hlbiBSVENfQUxBUk0gaW50ZXJydXB0IHRvb2sgcGxhY2UsIGluc2lkZQogICogUlRDX0FMQVJNX0lSUUhhbmRsZXIoKS4gSXQgbWFrZXMgYSBkaXJlY3QgY2FsbCB0byBIQUxfSW5jVGljaygpIHRvIGluY3JlbWVudAogICogYSBnbG9iYWwgdmFyaWFibGUgInV3VGljayIgdXNlZCBhcyBhcHBsaWNhdGlvbiB0aW1lIGJhc2UuCiAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfUlRDX0FsYXJtQUV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCnsKICBfX0lPIHVpbnQzMl90IGNvdW50ZXIgPSAwVTsKCiAgSEFMX0luY1RpY2soKTsKCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOwoKICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KICBocnRjLT5JbnN0YW5jZS0+SVNSID0gKHVpbnQzMl90KVJUQ19JTklUX01BU0s7CgogIHdoaWxlKChocnRjLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQogIHsKICAgIGlmKGNvdW50ZXIrKyA9PSBTeXN0ZW1Db3JlQ2xvY2sgLzQ4VSkgLyogVGltZW91dCA9IH4gMXMgKi8KICAgIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBocnRjLT5JbnN0YW5jZS0+RFIgPSAwVTsKICBocnRjLT5JbnN0YW5jZS0+VFIgPSAwVTsKCiAgaHJ0Yy0+SW5zdGFuY2UtPklTUiAmPSAodWludDMyX3QpflJUQ19JU1JfSU5JVDsKCiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7Cn0KCi8qKgogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgUlRDIEFMQVJNIGludGVycnVwdCByZXF1ZXN0LgogICogQHBhcmFtICBOb25lCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIFJUQ19BbGFybV9JUlFIYW5kbGVyKHZvaWQpCnsKICBIQUxfUlRDX0FsYXJtSVJRSGFuZGxlcigmaFJUQ19IYW5kbGUpOwp9CgovKioKICAqIEB9CiAgKi8KCi8qKgogICogQH0KICAqLwoKCg==