LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybV90ZW1wbGF0ZS5jCiAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQogICogQGJyaWVmICAgSEFMIHRpbWUgYmFzZSBiYXNlZCBvbiB0aGUgaGFyZHdhcmUgUlRDX0FMQVJNIFRlbXBsYXRlLgogICoKICAqICAgICAgICAgIFRoaXMgZmlsZSBvdmVycmlkZSB0aGUgbmF0aXZlIEhBTCB0aW1lIGJhc2UgZnVuY3Rpb25zIChkZWZpbmVkIGFzIHdlYWspCiAgKiAgICAgICAgICB0byB1c2UgdGhlIFJUQyBBTEFSTSBmb3IgdGltZSBiYXNlIGdlbmVyYXRpb246CiAgKiAgICAgICAgICAgKyBJbml0aWFsaXplcyB0aGUgUlRDIHBlcmlwaGVyYWwgdG8gaW5jcmVtZW50IHRoZSBzZWNvbmRzIHJlZ2lzdGVycyBlYWNoIDFtcwogICogICAgICAgICAgICsgVGhlIGFsYXJtIGlzIGNvbmZpZ3VyZWQgdG8gYXNzZXJ0IGFuIGludGVycnVwdCB3aGVuIHRoZSBSVEMgcmVhY2hlcyAxbXMKICAqICAgICAgICAgICArIEhBTF9JbmNUaWNrIGlzIGNhbGxlZCBhdCBlYWNoIEFsYXJtIGV2ZW50IGFuZCB0aGUgdGltZSBpcyByZXNldCB0byAwMDowMDowMAogICogICAgICAgICAgICsgSFNFIChkZWZhdWx0KSwgTFNFIG9yIExTSSBjYW4gYmUgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrIHNvdXJjZQogQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0KICAgIFRoaXMgZmlsZSBtdXN0IGJlIGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24gZm9sZGVyIGFuZCBtb2RpZmllZCBhcyBmb2xsb3dzOgogICAgKCMpIFJlbmFtZSBpdCB0byAnc3RtMzJnMHh4X2hhbF90aW1lYmFzZV9ydGNfYWxhcm0uYycKICAgICgjKSBBZGQgdGhpcyBmaWxlIGFuZCB0aGUgUlRDIEhBTCBkcml2ZXJzIHRvIHlvdXIgcHJvamVjdCBhbmQgdW5jb21tZW50CiAgICAgICBIQUxfUlRDX01PRFVMRV9FTkFCTEVEIGRlZmluZSBpbiBzdG0zMmcweHhfaGFsX2NvbmYuaAoKICAgIFsuLl0KICAgIChAKSBIQUwgUlRDIGFsYXJtIGFuZCBIQUwgUlRDIHdha2V1cCBkcml2ZXJzIGNhbpJ0IGJlIHVzZWQgd2l0aCBsb3cgcG93ZXIgbW9kZXM6CiAgICAgICAgVGhlIHdha2UgdXAgY2FwYWJpbGl0eSBvZiB0aGUgUlRDIG1heSBiZSBpbnRydXNpdmUgaW4gY2FzZSBvZiBwcmlvciBsb3cgcG93ZXIgbW9kZQogICAgICAgIGNvbmZpZ3VyYXRpb24gcmVxdWlyaW5nIGRpZmZlcmVudCB3YWtlIHVwIHNvdXJjZXMuCiAgICAgICAgQXBwbGljYXRpb24vRXhhbXBsZSBiZWhhdmlvciBpcyBubyBtb3JlIGd1YXJhbnRlZWQKICAgIChAKSBUaGUgc3RtMzJnMHh4X2hhbF90aW1lYmFzZV90aW0gdXNlIGlzIHJlY29tbWVuZGVkIGZvciB0aGUgQXBwbGljYXRpb25zL0V4YW1wbGVzCiAgICAgICAgICByZXF1aXJpbmcgbG93IHBvd2VyIG1vZGVzCgogIEBlbmR2ZXJiYXRpbQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQGF0dGVudGlvbgogICoKICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCiAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CiAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwoKLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCgovKiogQGRlZmdyb3VwIEhBTF9UaW1lQmFzZV9SVENfQWxhcm1fVGVtcGxhdGUgIEhBTCBUaW1lQmFzZSBSVEMgQWxhcm0gVGVtcGxhdGUKICAqIEB7CiAgKi8KCi8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgdG8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBSVEMgQ2xvY2sgc291cmNlIGZvciB5b3VyIGFwcGxpY2F0aW9uOgogICsgUlRDX0NMT0NLX1NPVVJDRV9IU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHJlcXVpcmluZyB0aW1pbmcgcHJlY2lzaW9uLgogICsgUlRDX0NMT0NLX1NPVVJDRV9MU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgogICsgUlRDX0NMT0NLX1NPVVJDRV9MU0k6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgogICovCi8qICNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9IU0UgKi8KLyogI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLwojZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNJIAoKLyogTWluaW1pemUgQXN5bmNocm9ub3VzIHByZXNjYWxlciBmb3IgcG93ZXIgY29uc3VtcHRpb24gOgogIGNrX2FwcmUgPSBSVENDTEsgLyAoQVNZTkMgcHJlZGl2ICsgMSkKICBja19zcHJlID0gY2tfYXByZS8oU1lOQyBwcmVkaXYgKyAxKSA9IDEgSHogKi8KI2lmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfTFNFKQovKiBMU0UgRnJlcSA9IDMyLjc2OCBrSHogUkMgKi8KI2RlZmluZSBSVENfQVNZTkNIX1BSRURJViAgICAgICAgICAgICAgICAgICAwdQojZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgICAgICAgICAgICAgIDB4M0ZGRnUgLyogKDE2Mzg0IC0gMSkgKi8KI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9MU0kpCi8qIExTSSBGcmVxID0gMzIga0h6IFJDICAqLwojZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgICAgICAgICAgICAgIDB1CiNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgICAgICAgICAgICAgMHgzRTdGdSAvKiAoMTYwMDAgLSAxKSAqLwojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0hTRSkKLyogSFNFIEZyZXEgYXMgUlRDQ0xLID0gOCBNSHogLyAzMiA9IDI1MCBrSHogKi8KI2RlZmluZSBSVENfQVNZTkNIX1BSRURJViAgICAgICAgICAgICAgICAgICAweDA3dSAgIC8qICg4IC0gMSkgKi8KI2RlZmluZSBSVENfU1lOQ0hfUFJFRElWICAgICAgICAgICAgICAgICAgICAweDdBMTF1IC8qICgzMTI1MCAtMSkgKi8KI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovCgoKLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KUlRDX0hhbmRsZVR5cGVEZWYgICAgICAgIGhSVENfSGFuZGxlID0gey5Jbml0ID0gezB9fTsKCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgUlRDX1RBTVBfSVJRSGFuZGxlcih2b2lkKTsKLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qKgogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIFJUQyBBTEFSTSBBIGFzIGEgdGltZSBiYXNlIHNvdXJjZS4gCiAgKiAgICAgICAgIFRoZSB0aW1lIHNvdXJjZSBpcyBjb25maWd1cmVkIHRvIGhhdmUgMW1zIHRpbWUgYmFzZSB3aXRoIGEgZGVkaWNhdGVkIAogICogICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4gCiAgKiAgICAgICAgIENhbGVuZGFyIHRpbWUgYmFzZSBpcyA9ICgoUlRDX0FTWU5DSF9QUkVESVYgKyAxKSAqIChSVENfU1lOQ0hfUFJFRElWICsgMSkpIC8gUlRDX0NMT0NLCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDFzCiAgKiAgICAgICAgIEFsYXJtIGludGVycnVwdCB0aW1lYmFzZSBpcyA9IChSVENfU1lOQ0hfUFJFRElWIC8gKDEwMDAgLyB1d1RpY2tGcmVxKSkKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSBtcyB3aGVuIHV3VGlja0ZyZXEgaXMgc2V0IHRvIDEga0h6CiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGJlZ2lubmluZyBvZiBwcm9ncmFtIGFmdGVyCiAgKiAgICAgICAgIHJlc2V0IGJ5IEhBTF9Jbml0KCkgb3IgYXQgYW55IHRpbWUgd2hlbiBjbG9jayBpcyBjb25maWd1cmVkLCBieSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkuIAogICogQHBhcmFtICBUaWNrUHJpb3JpdHkgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdFRpY2sodWludDMyX3QgVGlja1ByaW9yaXR5KQp7CiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwogIFJDQ19Pc2NJbml0VHlwZURlZiAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3QgPSB7MH07CiAgUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmICBQZXJpcGhDbGtJbml0U3RydWN0ID0gezB9OwogIFJUQ19UaW1lVHlwZURlZiAgICAgICAgICAgdGltZTsKICBSVENfRGF0ZVR5cGVEZWYgICAgICAgICAgIGRhdGU7CiAgUlRDX0FsYXJtVHlwZURlZiAgICAgICAgICBhbGFybTsKCgogIC8qIENoZWNrIHV3VGlja0ZyZXEgZm9yIE1pc3JhQyAyMDEyIChldmVuIGlmIHV3VGlja0ZyZXEgaXMgYSBlbnVtIHR5cGUgdGhhdCBkb24ndCB0YWtlIHRoZSB2YWx1ZSB6ZXJvKSovCiAgaWYgKCh1aW50MzJfdCl1d1RpY2tGcmVxICE9IDBVKQogIHsKICAgIC8qIERpc2FibGUgYmFja3VwIGRvbWVhaW4gcHJvdGVjdGlvbiAqLwogICAgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKCk7CgogICAgLyogRW5hYmxlIFJUQyBBUEIgY2xvY2sgZ2F0aW5nICovCiAgICBfX0hBTF9SQ0NfUlRDQVBCX0NMS19FTkFCTEUoKTsKCiAgICAvKiBEaXNhYmxlIHRoZSBBbGFybSBBICovCiAgICBfX0hBTF9SVENfQUxBUk1BX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKICAgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLyAKICAgIF9fSEFMX1JUQ19BTEFSTV9ESVNBQkxFX0lUKCZoUlRDX0hhbmRsZSwgUlRDX0lUX0FMUkEpOwogICAgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoJmhSVENfSGFuZGxlLCBSVENfRkxBR19BTFJBRik7CgogICAgLyogR2V0IFJUQyBjbG9jayBjb25maWd1cmF0aW9uICovCiAgICBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLQ29uZmlnKCZQZXJpcGhDbGtJbml0U3RydWN0KTsKCiAgICAvKkluIGNhc2Ugb2YgUlRDIGNsb2NrIGFscmVhZHkgZW5hYmxlLCBtYWtlIHN1cmUgaXQncyB0aGUgZ29vZCBvbmUgKi8KI2lmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfTFNFKQogICAgaWYgKChQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID09IFJDQ19SVENDTEtTT1VSQ0VfTFNFKSAmJiAoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0xTRVJEWSkgIT0gMHgwMHUpKQojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0xTSSkKICAgIGlmICgoUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfUlRDQ0xLU09VUkNFX0xTSSkgJiYgKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19MU0lSRFkpICE9IDB4MDB1KSkKI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9IU0UpCiAgICBpZiAoKFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPT0gUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzIpICYmIChfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNFUkRZKSAhPSAweDAwdSkpCiNlbHNlCiNlcnJvciBQbGVhc2Ugc2VsZWN0IHRoZSBSVEMgQ2xvY2sgc291cmNlCiNlbmRpZiAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLwogICAgewogICAgICAvKiBEbyBub3RoaW5nICovCiAgICB9CiAgICBlbHNlCiAgICB7CiNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0xTRQogICAgICAvKiBDb25maWd1cmUgTFNFIGFzIFJUQyBjbG9jayBzb3VyY2UgKi8KICAgICAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFOwogICAgICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CiAgICAgIFJDQ19Pc2NJbml0U3RydWN0LkxTRVN0YXRlID0gUkNDX0xTRV9PTjsKICAgICAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNFOwojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0xTSSkKICAgICAgLyogQ29uZmlndXJlIExTSSBhcyBSVEMgY2xvY2sgc291cmNlICovCiAgICAgIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTsKICAgICAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOwogICAgICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0lTdGF0ZSA9IFJDQ19MU0lfT047CiAgICAgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0xTSTsKI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9IU0UpCiAgICAgIC8qIENvbmZpZ3VyZSBIU0UgYXMgUlRDIGNsb2NrIHNvdXJjZSAqLwogICAgICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9IU0U7CiAgICAgIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKICAgICAgUkNDX09zY0luaXRTdHJ1Y3QuSFNFU3RhdGUgPSBSQ0NfSFNFX09OOwogICAgICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzI7CiNlbmRpZiAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLwoKICAgICAgLyogQ29uZmlndXJlIG9zY2lsbGF0b3IgKi8KICAgICAgc3RhdHVzID0gSEFMX1JDQ19Pc2NDb25maWcoJlJDQ19Pc2NJbml0U3RydWN0KTsKICAgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgICAgIHsKICAgICAgICAvKiBDb25maWd1cmUgUlRDIGNsb2NrIHNvdXJjZSAqLwogICAgICAgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX1JUQzsKICAgICAgICBzdGF0dXMgPSBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCZQZXJpcGhDbGtJbml0U3RydWN0KTsKCiAgICAgICAgLyogRW5hYmxlIFJUQyBDbG9jayAqLwogICAgICAgIGlmKHN0YXR1cyA9PSBIQUxfT0spCiAgICAgICAgewogICAgICAgICAgX19IQUxfUkNDX1JUQ19FTkFCTEUoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKiBJZiBSVEMgQ2xvY2sgY29uZmlndXJhdGlvbiBpcyBvayAqLwogICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgICB7CiAgICAgIC8qIFRoZSB0aW1lIGJhc2UgaXMgZGVmaW5lZCB0byBoYXZlIGhpZ2hlc3Qgc3luY2hyb25vdXMgcHJlc2NhbGVyIGJ1dCBrZWVwaW5nIAogICAgICAgICBhIDFIeiBSVEMgZnJlcXVlbmN5LiAqLwogICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZSA9IFJUQzsKICAgICAgaFJUQ19IYW5kbGUuSW5pdC5Ib3VyRm9ybWF0ID0gUlRDX0hPVVJGT1JNQVRfMjQ7CiAgICAgIGhSVENfSGFuZGxlLkluaXQuQXN5bmNoUHJlZGl2ID0gUlRDX0FTWU5DSF9QUkVESVY7CiAgICAgIGhSVENfSGFuZGxlLkluaXQuU3luY2hQcmVkaXYgPSBSVENfU1lOQ0hfUFJFRElWOwogICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dCA9IFJUQ19PVVRQVVRfRElTQUJMRTsKICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRQb2xhcml0eSA9IFJUQ19PVVRQVVRfUE9MQVJJVFlfSElHSDsKICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRUeXBlID0gUlRDX09VVFBVVF9UWVBFX09QRU5EUkFJTjsKICAgICAgc3RhdHVzID0gSEFMX1JUQ19Jbml0KCZoUlRDX0hhbmRsZSk7CiAgICB9CgogICAgLyogSEFMIFJUQyBJbml0IGlzIG9rICYgY2FsZW5kYXIgaGFzIG5ldmVyIGJlZW4gaW5pdGlhbGl6ZWQgKi8KICAgIGlmKChzdGF0dXMgPT0gSEFMX09LKSAgJiYgKF9fSEFMX1JUQ19HRVRfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX0lOSVRTKSA9PSAweDAwdSkpCiAgICB7CiAgICAgIHRpbWUuSG91cnMgPSAweDAwdTsKICAgICAgdGltZS5NaW51dGVzID0gMHgwMHU7CiAgICAgIHRpbWUuU2Vjb25kcyA9IDB4MDB1OwogICAgICB0aW1lLlRpbWVGb3JtYXQgPSBSVENfSE9VUkZPUk1BVDEyX1BNOwogICAgICB0aW1lLlN1YlNlY29uZHMgPSAweDAwdTsKICAgICAgdGltZS5TZWNvbmRGcmFjdGlvbiA9IDB4MDB1OwogICAgICB0aW1lLkRheUxpZ2h0U2F2aW5nID0gUlRDX0RBWUxJR0hUU0FWSU5HX05PTkU7CiAgICAgIHRpbWUuU3RvcmVPcGVyYXRpb24gPSBSVENfU1RPUkVPUEVSQVRJT05fUkVTRVQ7CiAgICAgIHN0YXR1cyA9IEhBTF9SVENfU2V0VGltZSgmaFJUQ19IYW5kbGUsICZ0aW1lLCBSVENfRk9STUFUX0JDRCk7CiAgICAgIGlmKHN0YXR1cyA9PSBIQUxfT0spCiAgICAgIHsKICAgICAgICBkYXRlLldlZWtEYXkgPSBSVENfV0VFS0RBWV9NT05EQVk7CiAgICAgICAgZGF0ZS5EYXRlID0gMHgwMXU7CiAgICAgICAgZGF0ZS5Nb250aCA9IFJUQ19NT05USF9KQU5VQVJZOwogICAgICAgIGRhdGUuWWVhciA9IDB4MDF1OwogICAgICAgIHN0YXR1cyA9IEhBTF9SVENfU2V0RGF0ZSgmaFJUQ19IYW5kbGUsICZkYXRlLCBSVENfRk9STUFUX0JDRCk7CiAgICAgIH0KICAgIH0KCiAgICAvKiBJZiBSVEMgY2FsZW5kYXIgaXMgaW5pdGlhbGl6ZWQgKi8KICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQogICAgewogICAgICBhbGFybS5BbGFybVRpbWUuSG91cnMgPSAweDAwdTsKICAgICAgYWxhcm0uQWxhcm1UaW1lLk1pbnV0ZXMgPSAweDAwdTsKICAgICAgYWxhcm0uQWxhcm1UaW1lLlNlY29uZHMgPSAweDAwdTsKICAgICAgYWxhcm0uQWxhcm1UaW1lLlRpbWVGb3JtYXQgPSBSVENfSE9VUkZPUk1BVDEyX1BNOwogICAgICBhbGFybS5BbGFybVRpbWUuU3ViU2Vjb25kcyA9IChSVENfU1lOQ0hfUFJFRElWIC8gKDEwMDAgLyAodWludDMyX3QpdXdUaWNrRnJlcSkpOwogICAgICBhbGFybS5BbGFybVRpbWUuU2Vjb25kRnJhY3Rpb24gPSAweDAwdTsKICAgICAgYWxhcm0uQWxhcm1UaW1lLkRheUxpZ2h0U2F2aW5nID0gUlRDX0RBWUxJR0hUU0FWSU5HX05PTkU7CiAgICAgIGFsYXJtLkFsYXJtVGltZS5TdG9yZU9wZXJhdGlvbiA9IFJUQ19TVE9SRU9QRVJBVElPTl9SRVNFVDsKICAgICAgYWxhcm0uQWxhcm1NYXNrID0gUlRDX0FMQVJNTUFTS19BTEw7CgogICAgICAvKiBEZXBlbmRpbmcgb24gaW5wdXQgZnJlcXVlbmN5IHNlbGVjdCBTdWJzZWNvbmQgbWFzayAqLwogICAgICBpZiAodXdUaWNrRnJlcSA9PSBIQUxfVElDS19GUkVRXzFLSFopCiAgICAgIHsKICAgICAgICBhbGFybS5BbGFybVN1YlNlY29uZE1hc2sgPSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfNTsKICAgICAgfQogICAgICBlbHNlIGlmICh1d1RpY2tGcmVxID09IEhBTF9USUNLX0ZSRVFfMTAwSFopCiAgICAgIHsKICAgICAgICBhbGFybS5BbGFybVN1YlNlY29uZE1hc2sgPSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfOTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKI2lmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfSFNFKQogICAgICAgIC8qIFdoZW4gUlRDQ0xLID0gMSBNSHosIG5lZWQgdG8gbWFzayBTdWJzZWNvbmQgcmVnaXN0ZXIgYml0IDEyIHRvIDE0CiAgICAgICAgICB0byBoYXZlIDEwIEhoeiBpbnRlcnJ1cHQgKi8KICAgICAgICBhbGFybS5BbGFybVN1YlNlY29uZE1hc2sgPSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMTI7CiNlbHNlCiAgICAgICAgLyogV2hlbiBSVENDTEsgaXMgYXJvdW5kIDMyIGtIeiwgbmVlZCB0byBtYXNrIFN1YnNlY29uZCByZWdpc3RlciBiaXQgMTIgdG8gMTEKICAgICAgICAgIHRvIGhhdmUgMTAgSGh6IGludGVycnVwdCAqLwogICAgICAgIGFsYXJtLkFsYXJtU3ViU2Vjb25kTWFzayA9IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xMTsKI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfSFNFICovCiAgICAgIH0KICAgICAgYWxhcm0uQWxhcm1EYXRlV2Vla0RheVNlbCA9IFJUQ19BTEFSTURBVEVXRUVLREFZU0VMX0RBVEU7CiAgICAgIGFsYXJtLkFsYXJtRGF0ZVdlZWtEYXkgPSBSVENfV0VFS0RBWV9NT05EQVk7CiAgICAgIGFsYXJtLkFsYXJtID0gUlRDX0FMQVJNX0E7CiAgICAgIHN0YXR1cyA9IEhBTF9SVENfU2V0QWxhcm1fSVQoJmhSVENfSGFuZGxlLCAmYWxhcm0sIFJUQ19GT1JNQVRfQkNEKTsKICAgICAgaWYoc3RhdHVzID09IEhBTF9PSykKICAgICAgewogICAgICAgIC8qIEVuYWJsZSB0aGUgUlRDIGdsb2JhbCBJbnRlcnJ1cHQgKi8KICAgICAgICBIQUxfTlZJQ19FbmFibGVJUlEoUlRDX1RBTVBfSVJRbik7CgogICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgU3lzVGljayBJUlEgcHJpb3JpdHkgKi8KICAgICAgICBpZiAoVGlja1ByaW9yaXR5IDwgKDFVTCA8PCBfX05WSUNfUFJJT19CSVRTKSkKICAgICAgICB7CiAgICAgICAgICBIQUxfTlZJQ19TZXRQcmlvcml0eShSVENfVEFNUF9JUlFuLCBUaWNrUHJpb3JpdHksIDBVKTsKICAgICAgICAgIHV3VGlja1ByaW8gPSBUaWNrUHJpb3JpdHk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgfQogIHJldHVybiBzdGF0dXM7Cn0KCi8qKgogICogQGJyaWVmICBTdXNwZW5kIFRpY2sgaW5jcmVtZW50LgogICogQG5vdGUgICBEaXNhYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBkaXNhYmxpbmcgUlRDX0FMUkEgaW50ZXJydXB0LgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCkKewogIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKICAvKiBEaXNhYmxlIEFMQVJNIEEgSW50ZXJydXB0ICovCiAgX19IQUxfUlRDX0FMQVJNX0RJU0FCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7CiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKfQoKLyoqCiAgKiBAYnJpZWYgIFJlc3VtZSBUaWNrIGluY3JlbWVudC4KICAqIEBub3RlICAgRW5hYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBFbmFibGluZyBSVEMgQUxBUk0gaW50ZXJydXB0LgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfUmVzdW1lVGljayh2b2lkKQp7CiAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOwogIC8qIEVuYWJsZSBBTEFSTSBBIGludGVycnVwdCAqLwogIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7CiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKfQoKLyoqCiAgKiBAYnJpZWYgIEFsYXJtIFRpbWVyIEV2ZW50IENhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICB3aGVuIFJUQyBBbGFybSB0YWtlcyBwbGFjZSwgaW5zaWRlCiAgKiAgICAgICAgIEhBTF9SVENfQWxhcm1JUlFIYW5kbGVyKCkuIEl0IG1ha2VzIGEgZGlyZWN0IGNhbGwgdG8gSEFMX0luY1RpY2soKSB0byBpbmNyZW1lbnQKICAqICAgICAgICAgYSBnbG9iYWwgdmFyaWFibGUgInV3VGljayIgdXNlZCBhcyBhcHBsaWNhdGlvbiB0aW1lIGJhc2UuCiAgKiBAcGFyYW0gIGhydGMgIFJUQyBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgSEFMX1JUQ19BbGFybUFFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQp7CiAgSEFMX0luY1RpY2soKTsKfQoKLyoqCiAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBSVEMgQUxBUk0gaW50ZXJydXB0IHJlcXVlc3QuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIFJUQ19UQU1QX0lSUUhhbmRsZXIodm9pZCkKewogIEhBTF9SVENfQWxhcm1JUlFIYW5kbGVyKCZoUlRDX0hhbmRsZSk7Cn0KCi8qKgogICogQH0KICAqLwoKLyoqCiAgKiBAfQogICovCgovKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwo=