LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmYxeHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybV90ZW1wbGF0ZS5jIAogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEB2ZXJzaW9uIFYxLjEuMAogICogQGRhdGUgICAgMTQtQXByaWwtMjAxNwogICogQGJyaWVmICAgSEFMIHRpbWUgYmFzZSBiYXNlZCBvbiB0aGUgaGFyZHdhcmUgUlRDX0FMQVJNLgogICoKICAqICAgICAgICAgIFRoaXMgZmlsZSBvdmVycmlkZSB0aGUgbmF0aXZlIEhBTCB0aW1lIGJhc2UgZnVuY3Rpb25zIChkZWZpbmVkIGFzIHdlYWspCiAgKiAgICAgICAgICB0byB1c2UgdGhlIFJUQyBBTEFSTSBmb3IgdGltZSBiYXNlIGdlbmVyYXRpb246CiAgKiAgICAgICAgICAgKyBJbnRpYWxpemVzIHRoZSBSVEMgcGVyaXBoZXJhbCB0byBpbmNyZW1lbnQgdGhlIHNlY29uZHMgcmVnaXN0ZXJzIGVhY2ggMW1zCiAgKiAgICAgICAgICAgKyBUaGUgYWxhcm0gaXMgY29uZmlndXJlZCB0byBhc3NlcnQgYW4gaW50ZXJydXB0IHdoZW4gdGhlIFJUQyByZWFjaGVzIDFtcyAKICAqICAgICAgICAgICArIEhBTF9JbmNUaWNrIGlzIGNhbGxlZCBhdCBlYWNoIEFsYXJtIGV2ZW50IGFuZCB0aGUgdGltZSBpcyByZXNldCB0byAwMDowMDowMAogICogICAgICAgICAgICsgSFNFIChkZWZhdWx0KSwgTFNFIG9yIExTSSBjYW4gYmUgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrIHNvdXJjZSAgCiBAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXQogICAgVGhpcyBmaWxlIG11c3QgYmUgY29waWVkIHRvIHRoZSBhcHBsaWNhdGlvbiBmb2xkZXIgYW5kIG1vZGlmaWVkIGFzIGZvbGxvd3M6CiAgICAoIykgUmVuYW1lIGl0IHRvICdzdG0zMmYxeHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybS5jJwogICAgKCMpIEFkZCB0aGlzIGZpbGUgYW5kIHRoZSBSVEMgSEFMIGRyaXZlcnMgdG8geW91ciBwcm9qZWN0IGFuZCB1bmNvbW1lbnQKICAgICAgIEhBTF9SVENfTU9EVUxFX0VOQUJMRUQgZGVmaW5lIGluIHN0bTMyZjF4eF9oYWxfY29uZi5oIAoKICAgIFsuLl0KICAgIChAKSBIQUwgUlRDIGFsYXJtIGFuZCBIQUwgUlRDIHdha2V1cCBkcml2ZXJzIGNhbpJ0IGJlIHVzZWQgd2l0aCBsb3cgcG93ZXIgbW9kZXM6CiAgICAgICAgVGhlIHdha2UgdXAgY2FwYWJpbGl0eSBvZiB0aGUgUlRDIG1heSBiZSBpbnRydXNpdmUgaW4gY2FzZSBvZiBwcmlvciBsb3cgcG93ZXIgbW9kZQogICAgICAgIGNvbmZpZ3VyYXRpb24gcmVxdWlyaW5nIGRpZmZlcmVudCB3YWtlIHVwIHNvdXJjZXMuCiAgICAgICAgQXBwbGljYXRpb24vRXhhbXBsZSBiZWhhdmlvciBpcyBubyBtb3JlIGd1YXJhbnRlZWQgCiAgICAoQCkgVGhlIHN0bTMyZjF4eF9oYWxfdGltZWJhc2VfdGltIHVzZSBpcyByZWNvbW1lbmRlZCBmb3IgdGhlIEFwcGxpY2F0aW9ucy9FeGFtcGxlcwogICAgICAgICAgcmVxdWlyaW5nIGxvdyBwb3dlciBtb2RlcwoKICBAZW5kdmVyYmF0aW0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEBhdHRlbnRpb24KICAqCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAogICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCiAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICAqCiAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCiAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgogICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwoKLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2luY2x1ZGUgInN0bTMyZjF4eF9oYWwuaCIKLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjF4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCgovKiogQGRlZmdyb3VwIEhBTF9UaW1lQmFzZV9SVENfQWxhcm1fVGVtcGxhdGUgIEhBTCBUaW1lQmFzZSBSVEMgQWxhcm0gVGVtcGxhdGUKICAqIEB7CiAgKi8KCi8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgdG8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBSVEMgQ2xvY2sgc291cmNlIGZvciB5b3VyIGFwcGxpY2F0aW9uOgogICsgUlRDX0NMT0NLX1NPVVJDRV9IU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHJlcXVpcmluZyB0aW1pbmcgcHJlY2lzaW9uLgogICsgUlRDX0NMT0NLX1NPVVJDRV9MU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgogICsgUlRDX0NMT0NLX1NPVVJDRV9MU0k6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgogICovCiNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9IU0UKLyogI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLwovKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNJICovCgovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpSVENfSGFuZGxlVHlwZURlZiAgICAgICAgaFJUQ19IYW5kbGU7Ci8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgUlRDX0FsYXJtX0lSUUhhbmRsZXIodm9pZCk7Ci8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKioKICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBSVENfQUxBUk1BIGFzIGEgdGltZSBiYXNlIHNvdXJjZS4gCiAgKiAgICAgICAgIFRoZSB0aW1lIHNvdXJjZSBpcyBjb25maWd1cmVkICB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZCAKICAqICAgICAgICAgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuIAogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgYXV0b21hdGljYWxseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHByb2dyYW0gYWZ0ZXIKICAqICAgICAgICAgcmVzZXQgYnkgSEFMX0luaXQoKSBvciBhdCBhbnkgdGltZSB3aGVuIGNsb2NrIGlzIGNvbmZpZ3VyZWQsIGJ5IEhBTF9SQ0NfQ2xvY2tDb25maWcoKS4KICAqIEBwYXJhbSAgVGlja1ByaW9yaXR5OiBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayAodWludDMyX3QgVGlja1ByaW9yaXR5KQp7CiAgX19JTyB1aW50MzJfdCBjb3VudGVyID0gMFU7CgogIFJDQ19Pc2NJbml0VHlwZURlZiAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3Q7CiAgUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmICBQZXJpcGhDbGtJbml0U3RydWN0OwoKI2lmZGVmIFJUQ19DTE9DS19TT1VSQ0VfTFNFCiAgLyogQ29uZmlndWUgTFNFIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9MU0U7CiAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOwogIFJDQ19Pc2NJbml0U3RydWN0LkxTRVN0YXRlID0gUkNDX0xTRV9PTjsKICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9MU0U7CiNlbGlmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfTFNJKQogIC8qIENvbmZpZ3VlIExTSSBhcyBSVEMgY2xvY2sgc291Y3JlICovCiAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJOwogIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0lTdGF0ZSA9IFJDQ19MU0lfT047CiAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNJOwojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0hTRSkKICAvKiBDb25maWd1ZSBIU0UgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLwogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTRTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CiAgUkNDX09zY0luaXRTdHJ1Y3QuSFNFU3RhdGUgPSBSQ0NfSFNFX09OOwogIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYxMjg7CiNlbHNlCiNlcnJvciBQbGVhc2Ugc2VsZWN0IHRoZSBSVEMgQ2xvY2sgc291cmNlCiNlbmRpZiAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLwoKICBpZihIQUxfUkNDX09zY0NvbmZpZygmUkNDX09zY0luaXRTdHJ1Y3QpID09IEhBTF9PSykKICB7CiAgICBQZXJpcGhDbGtJbml0U3RydWN0LlBlcmlwaENsb2NrU2VsZWN0aW9uID0gUkNDX1BFUklQSENMS19SVEM7CiAgICBpZihIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCZQZXJpcGhDbGtJbml0U3RydWN0KSA9PSBIQUxfT0spCiAgICB7CiAgICAgIC8qIEVuYWJsZSBSVEMgQ2xvY2sgKi8KICAgICAgX19IQUxfUkNDX1JUQ19FTkFCTEUoKTsKCiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlID0gUlRDOwogICAgICAvKiBDb25maWd1cmUgUlRDIHRpbWUgYmFzZSB0byAxMEtoeiAqLwogICAgICBoUlRDX0hhbmRsZS5Jbml0LkFzeW5jaFByZWRpdiA9ICAoSEFMX1JDQ0V4X0dldFBlcmlwaENMS0ZyZXEoUkNDX1BFUklQSENMS19SVEMpIC8gMTAwMDApIC0gMTsKICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXQgPSBSVENfT1VUUFVUU09VUkNFX05PTkU7CiAgICAgIEhBTF9SVENfSW5pdCgmaFJUQ19IYW5kbGUpOwoKICAgICAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAgIC8qIENsZWFyIGZsYWcgYWxhcm0gQSAqLwogICAgICBfX0hBTF9SVENfQUxBUk1fQ0xFQVJfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX0FMUkFGKTsKCiAgICAgIGNvdW50ZXIgPSAwVTsKICAgICAgLyogV2FpdCB0aWxsIFJUQyBBTFJBRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCiAgICAgIHdoaWxlKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX0FMUkFGKSAhPSBSRVNFVCkKICAgICAgewogICAgICAgIGlmKGNvdW50ZXIrKyA9PSBTeXN0ZW1Db3JlQ2xvY2sgLzQ4VSkgLyogVGltZW91dCA9IH4gMXMgKi8KICAgICAgICB7CiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyogU2V0IFJUQyBDT1VOVEVSIE1TQiB3b3JkICovCiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5BTFJIID0gMHgwMFU7CiAgICAgIC8qIFNldCBSVEMgQ09VTlRFUiBMU0Igd29yZCAqLwogICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+QUxSTCA9IDB4MDlVOwoKICAgICAgLyogUlRDIEFsYXJtIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0lUKCk7CiAgICAgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOwoKICAgICAgLyogQ2xlYXIgU2Vjb25kIGFuZCBvdmVyZmxvdyBmbGFncyAqLwogICAgICBDTEVBUl9CSVQoaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkNSTCwgKFJUQ19GTEFHX1NFQyB8IFJUQ19GTEFHX09XKSk7CgogICAgICAvKiBTZXQgUlRDIENPVU5URVIgTVNCIHdvcmQgKi8KICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkNOVEggPSAweDAwVTsKICAgICAgLyogU2V0IFJUQyBDT1VOVEVSIExTQiB3b3JkICovCiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5DTlRMID0gMHgwMFU7CgogICAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIGludGVycnVwdCAqLwogICAgICBfX0hBTF9SVENfQUxBUk1fRU5BQkxFX0lUKCZoUlRDX0hhbmRsZSwgUlRDX0lUX0FMUkEpOwoKICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7CgogICAgICAvKiBXYWl0IHRpbGwgUlRDIGlzIGluIElOSVQgc3RhdGUgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLwogICAgICBjb3VudGVyID0gMFU7CiAgICAgIHdoaWxlKChoUlRDX0hhbmRsZS5JbnN0YW5jZS0+Q1JMICYgUlRDX0NSTF9SVE9GRikgPT0gKHVpbnQzMl90KVJFU0VUKQogICAgICB7CiAgICAgICAgaWYoY291bnRlcisrID09IFN5c3RlbUNvcmVDbG9jayAvNDhVKSAvKiBUaW1lb3V0ID0gfiAxcyAqLwogICAgICAgIHsKICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICB9CgogICAgICBIQUxfTlZJQ19TZXRQcmlvcml0eShSVENfQWxhcm1fSVJRbiwgVGlja1ByaW9yaXR5LCAwVSk7CiAgICAgIEhBTF9OVklDX0VuYWJsZUlSUShSVENfQWxhcm1fSVJRbik7CiAgICAgIHJldHVybiBIQUxfT0s7CiAgICB9CiAgfQogIHJldHVybiBIQUxfRVJST1I7Cn0KCi8qKgogICogQGJyaWVmICBTdXNwZW5kIFRpY2sgaW5jcmVtZW50LgogICogQG5vdGUgICBEaXNhYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBkaXNhYmxpbmcgUlRDIEFMQVJNIGludGVycnVwdC4KICAqIEBwYXJhbSAgTm9uZQogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCkKewogIC8qIERpc2FibGUgUlRDIEFMQVJNIHVwZGF0ZSBJbnRlcnJ1cHQgKi8KICBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsKfQoKLyoqCiAgKiBAYnJpZWYgIFJlc3VtZSBUaWNrIGluY3JlbWVudC4KICAqIEBub3RlICAgRW5hYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBFbmFibGluZyBSVEMgQUxBUk0gaW50ZXJydXB0LgogICogQHBhcmFtICBOb25lCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIEhBTF9SZXN1bWVUaWNrKHZvaWQpCnsKICBfX0lPIHVpbnQzMl90IGNvdW50ZXIgPSAwVTsKCiAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOwoKICAvKiBTZXQgUlRDIENPVU5URVIgTVNCIHdvcmQgKi8KICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+Q05USCA9IDB4MDBVOwogIC8qIFNldCBSVEMgQ09VTlRFUiBMU0Igd29yZCAqLwogIGhSVENfSGFuZGxlLkluc3RhbmNlLT5DTlRMID0gMHgwMFU7CgogIC8qIENsZWFyIFNlY29uZCBhbmQgb3ZlcmZsb3cgZmxhZ3MgKi8KICBDTEVBUl9CSVQoaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkNSTCwgKFJUQ19GTEFHX1NFQyB8IFJUQ19GTEFHX09XIHwgUlRDX0ZMQUdfQUxSQUYpKTsKCiAgLyogRW5hYmxlIFJUQyBBTEFSTSBVcGRhdGUgaW50ZXJydXB0ICovCiAgX19IQUxfUlRDX0FMQVJNX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsKCiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKCiAgLyogV2FpdCB0aWxsIFJUQyBpcyBpbiBJTklUIHN0YXRlIGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KICB3aGlsZSgoaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkNSTCAmIFJUQ19DUkxfUlRPRkYpID09ICh1aW50MzJfdClSRVNFVCkKICB7CiAgICBpZihjb3VudGVyKysgPT0gU3lzdGVtQ29yZUNsb2NrIC80OFUpIC8qIFRpbWVvdXQgPSB+IDFzICovCiAgICB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KfQoKLyoqCiAgKiBAYnJpZWYgIEFMQVJNIEEgRXZlbnQgQ2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUKICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIHdoZW4gUlRDX0FMQVJNIGludGVycnVwdCB0b29rIHBsYWNlLCBpbnNpZGUKICAqIFJUQ19BTEFSTV9JUlFIYW5kbGVyKCkuIEl0IG1ha2VzIGEgZGlyZWN0IGNhbGwgdG8gSEFMX0luY1RpY2soKSB0byBpbmNyZW1lbnQKICAqIGEgZ2xvYmFsIHZhcmlhYmxlICJ1d1RpY2siIHVzZWQgYXMgYXBwbGljYXRpb24gdGltZSBiYXNlLgogICogQHBhcmFtICBocnRjIDogUlRDIGhhbmRsZQogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfUlRDX0FsYXJtQUV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCnsKICBfX0lPIHVpbnQzMl90IGNvdW50ZXIgPSAwVTsKCiAgSEFMX0luY1RpY2soKTsKCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOwoKICAvKiBTZXQgUlRDIENPVU5URVIgTVNCIHdvcmQgKi8KICBXUklURV9SRUcoaHJ0Yy0+SW5zdGFuY2UtPkNOVEgsIDB4MDBVKTsKICAvKiBTZXQgUlRDIENPVU5URVIgTFNCIHdvcmQgKi8KICBXUklURV9SRUcoaHJ0Yy0+SW5zdGFuY2UtPkNOVEwsIDB4MDBVKTsKCiAgLyogQ2xlYXIgU2Vjb25kIGFuZCBvdmVyZmxvdyBmbGFncyAqLwogIENMRUFSX0JJVChocnRjLT5JbnN0YW5jZS0+Q1JMLCAoUlRDX0ZMQUdfU0VDIHwgUlRDX0ZMQUdfT1cpKTsKCiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CgogIC8qIFdhaXQgdGlsbCBSVEMgaXMgaW4gSU5JVCBzdGF0ZSBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCiAgd2hpbGUoKGhydGMtPkluc3RhbmNlLT5DUkwgJiBSVENfQ1JMX1JUT0ZGKSA9PSAodWludDMyX3QpUkVTRVQpCiAgewogICAgaWYoY291bnRlcisrID09IFN5c3RlbUNvcmVDbG9jayAvNDhVKSAvKiBUaW1lb3V0ID0gfiAxcyAqLwogICAgewogICAgICBicmVhazsKICAgIH0KICB9Cn0KCi8qKgogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgUlRDIEFMQVJNIGludGVycnVwdCByZXF1ZXN0LgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBSVENfQWxhcm1fSVJRSGFuZGxlcih2b2lkKQp7CiAgSEFMX1JUQ19BbGFybUlSUUhhbmRsZXIoJmhSVENfSGFuZGxlKTsKfQoKLyoqCiAgKiBAfQogICovCgovKioKICAqIEB9CiAgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCg==