LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCCpIDIwMDAtMjAwOCBBbGFjcml0ZWNoLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiAkSWQ6IHN4Z2RiZy5oLHYgMS4xIDIwMDgvMDYvMjcgMTI6NDk6MjggbW9vayBFeHAgJAogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQogKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwogKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFMQUNSSVRFQ0gsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBTEFDUklURUNILCBJTkMuIE9SCiAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICoKICogVGhlIHZpZXdzIGFuZCBjb25jbHVzaW9ucyBjb250YWluZWQgaW4gdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uCiAqIGFyZSB0aG9zZSBvZiB0aGUgYXV0aG9ycyBhbmQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyByZXByZXNlbnRpbmcKICogb2ZmaWNpYWwgcG9saWNpZXMsIGVpdGhlciBleHByZXNzZWQgb3IgaW1wbGllZCwgb2YgQWxhY3JpdGVjaCwgSW5jLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBGSUxFTkFNRTogc3hnZGJnLmgKICoKICogQWxsIGRlYnVnIGFuZCBhc3NlcnRpb24tYmFzZWQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBhcmUgaW5jbHVkZWQKICogaW4gdGhpcyBmaWxlIGZvciB0aGUgU1hHT1NTIGRyaXZlci4KICovCiNpZm5kZWYgX1NYR19ERUJVR19IXwojZGVmaW5lIF9TWEdfREVCVUdfSF8KCiNkZWZpbmUgQVRLREJHICAxCiNkZWZpbmUgQVRLX1RSQUNFX0VOQUJMRUQgMQoKI2RlZmluZSBEQkdfRVJST1IobiwgYXJncy4uLikJcHJpbnRrKEtFUk5fRU1FUkcgbiwgIyNhcmdzKQoKI2lmZGVmIEFTU0VSVAojdW5kZWYgQVNTRVJUCiNlbmRpZgoKI2lmZGVmIFNYR19BU1NFUlRfRU5BQkxFRAojaWZuZGVmIEFTU0VSVAojZGVmaW5lIEFTU0VSVChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGlmICghKGEpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBEQkdfRVJST1IoIkFTU0VSVCgpIEZhaWx1cmU6IGZpbGUgJXMsIGZ1bmN0aW9uICVzICBsaW5lICVkXG4iLFwKICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfQojZW5kaWYKI2Vsc2UKI2lmbmRlZiBBU1NFUlQKI2RlZmluZSBBU1NFUlQoYSkKI2VuZGlmCiNlbmRpZiAvKiBTWEdfQVNTRVJUX0VOQUJMRUQgICovCgoKI2lmZGVmIEFUS0RCRwovKgogKiAgR2xvYmFsIGZvciB0aW1lciBncmFudWxhcml0eTsgZXZlcnkgZHJpdmVyIG11c3QgaGF2ZSBhbiBpbnN0YW5jZQogKiAgb2YgdGhpcyBpbml0aWFsaXplZCB0byAwCiAqLwoKZXh0ZXJuIHVsb25nIEFUS1RpbWVyRGl2OwoKLyoKICogdHJhY2VfZW50cnlfdCAtCiAqCiAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gZW50cnkgaW4gdGhlIHRyYWNlIGJ1ZmZlci4gIFRoZQogKiBmaXJzdCBmZXcgZmllbGRzIG1lYW4gdGhlIHNhbWUgZnJvbSBlbnRyeSB0byBlbnRyeSwgd2hpbGUKICogdGhlIG1lYW5pbmcgb2YgbGFzdCBzZXZlcmFsIGZpZWxkcyBjaGFuZ2UgdG8gc3VpdCB0aGUKICogbmVlZHMgb2YgdGhlIHRyYWNlIGVudHJ5LiAgVHlwaWNhbGx5IHRoZXkgYXJlIGZ1bmN0aW9uIGNhbGwKICogcGFyYW1ldGVycy4KICovCnR5cGVkZWYgc3RydWN0IF90cmFjZV9lbnRyeV9zIHsKICAgICAgICBjaGFyICAgICAgbmFtZVs4XTsgICAgICAgIC8qIDggY2hhcmFjdGVyIG5hbWUgLSBsaWtlICdzJ2knbSdiJ2EncidjJ3YnICovCiAgICAgICAgdTMyICAgdGltZTsgICAgICAgICAgIC8qIEN1cnJlbnQgY2xvY2sgdGljICovCiAgICAgICAgdW5zaWduZWQgY2hhciAgICAgY3B1OyAgICAgICAgICAgIC8qIEN1cnJlbnQgQ1BVICovCiAgICAgICAgdW5zaWduZWQgY2hhciAgICAgaXJxbDsgICAgICAgICAgIC8qIEN1cnJlbnQgSVJRTCAqLwogICAgICAgIHVuc2lnbmVkIGNoYXIgICAgIGRyaXZlcjsgICAgICAgICAvKiBUaGUgZHJpdmVyIHdoaWNoIGFkZGVkIHRoZSB0cmFjZSBjYWxsICovCiAgICAgICAgdW5zaWduZWQgY2hhciAgICAgcGFkMjsgICAgICAgICAgIC8qIHBhZCB0byA0IGJ5dGUgYm91bmRhcnkgLSB3aWxsIHByb2JhYmx5IGdldCB1c2VkICovCiAgICAgICAgdTMyICAgYXJnMTsgICAgICAgICAgIC8qIENhbGxlciBhcmcxICovCiAgICAgICAgdTMyICAgYXJnMjsgICAgICAgICAgIC8qIENhbGxlciBhcmcyICovCiAgICAgICAgdTMyICAgYXJnMzsgICAgICAgICAgIC8qIENhbGxlciBhcmczICovCiAgICAgICAgdTMyICAgYXJnNDsgICAgICAgICAgIC8qIENhbGxlciBhcmc0ICovCn0gdHJhY2VfZW50cnlfdCwgKnB0cmFjZV9lbnRyeV90OwoKLyoKICogRHJpdmVyIHR5cGVzIGZvciBkcml2ZXIgZmllbGQgaW4gdHJhY2VfZW50cnlfdAogKi8KI2RlZmluZSBUUkFDRV9TWEcgICAgICAgICAgICAgMQojZGVmaW5lIFRSQUNFX1ZQQ0kgICAgICAgICAgICAyCiNkZWZpbmUgVFJBQ0VfU0xJQyAgICAgICAgICAgIDMKCiNkZWZpbmUgVFJBQ0VfRU5UUklFUyAgIDEwMjQKCnR5cGVkZWYgc3RydWN0IF9zeGdfdHJhY2VfYnVmZmVyX3QKewogICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgc2l6ZTsgICAgICAgICAgICAgICAgICAvKiBhaWQgZm9yIHdpbmRiZyBleHRlbnNpb24gKi8KICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIGluOyAgICAgICAgICAgICAgICAgICAgLyogV2hlcmUgdG8gYWRkICovCiAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICBsZXZlbDsgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgVHJhY2UgbGV2ZWwgKi8KCXNwaW5sb2NrX3QJbG9jazsgICAgICAgICAgICAgICAgICAvKiBGb3IgTVAgdHJhY2luZyAqLwogICAgICAgIHRyYWNlX2VudHJ5X3QgICAgICAgICAgIGVudHJpZXNbVFJBQ0VfRU5UUklFU107LyogVGhlIGNpcmN1bGFyIGJ1ZmZlciAqLwp9IHN4Z190cmFjZV9idWZmZXJfdDsKCi8qCiAqIFRoZSB0cmFjZSBsZXZlbHMKICoKICogWFhYIEF0IHRoZSBtb21lbnQgSSBhbSBvbmx5IGRlZmluaW5nIGNyaXRpY2FsLCBpbXBvcnRhbnQsIGFuZCBub2lzeS4KICogSSBhbSBsZWF2aW5nIHJvb20gZm9yIG1vcmUgaWYgYW55b25lIHdhbnRzIHRoZW0uCiAqLwojZGVmaW5lIFRSQUNFX05PTkUgICAgICAgICAgICAgIDAgICAvKiBGb3IgdHJhY2UgbGV2ZWwgLSBpZiBubyB0cmFjaW5nIHdhbnRlZCAqLwojZGVmaW5lIFRSQUNFX0NSSVRJQ0FMICAgICAgICAgIDEgICAvKiBtaW5pbWFsIHRyYWNpbmcgLSBvbmx5IGNyaXRpY2FsIHN0dWZmICovCiNkZWZpbmUgVFJBQ0VfSU1QT1JUQU5UICAgICAgICAgNSAgIC8qIG1vcmUgdHJhY2luZyAtIGFueXRoaW5nIGltcG9ydGFudCAqLwojZGVmaW5lIFRSQUNFX05PSVNZICAgICAgICAgICAgIDEwICAvKiBFdmVyeXRoaW5nIGluIHRoZSB3b3JsZCAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIFRoZSBtYWNyb3MgdGhlbXNlbHZlcyAtCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZiBBVEtfVFJBQ0VfRU5BQkxFRAojZGVmaW5lIFNYR19UUkFDRV9JTklUKGJ1ZmZlciwgdGxldmVsKQkJCQlcCnsJCQkJCQkJCVwKCW1lbXNldCgoYnVmZmVyKSwgMCwgc2l6ZW9mKHN4Z190cmFjZV9idWZmZXJfdCkpOwlcCgkoYnVmZmVyKS0+bGV2ZWwgPSAodGxldmVsKTsJCQkJXAoJKGJ1ZmZlciktPnNpemUgPSBUUkFDRV9FTlRSSUVTOwkJCQlcCglzcGluX2xvY2tfaW5pdCgmKGJ1ZmZlciktPmxvY2spOwkJCVwKfQojZWxzZQojZGVmaW5lIFNYR19UUkFDRV9JTklUKGJ1ZmZlciwgdGxldmVsKQojZW5kaWYKCi8qCiAqIFRoZSB0cmFjZSBtYWNyby4gIFRoaXMgaXMgYWN0aXZlIG9ubHkgaWYgQVRLX1RSQUNFX0VOQUJMRUQgaXMgc2V0LgogKi8KI2lmIEFUS19UUkFDRV9FTkFCTEVECiNkZWZpbmUgU1hHX1RSQUNFKHRkcml2ZXIsIGJ1ZmZlciwgdGxldmVsLCB0bmFtZSwgYTEsIGEyLCBhMywgYTQpIHsgICAgICAgIFwKICAgICAgICBpZiAoKGJ1ZmZlcikgJiYgKChidWZmZXIpLT5sZXZlbCA+PSAodGxldmVsKSkpIHsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgdHJhY2VfaXJxbCA9IDA7ICAgIC8qID8/Pz8/PyBGSVggVEhJUyAgKi8gICAgXAogICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgdHJhY2VfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgcHRyYWNlX2VudHJ5X3QgIHRyYWNlX2VudHJ5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICB0aW1ldjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgc3Bpbl9sb2NrKCYoYnVmZmVyKS0+bG9jayk7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICB0cmFjZV9lbnRyeSA9ICYoYnVmZmVyKS0+ZW50cmllc1soYnVmZmVyKS0+aW5dOyAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgZG9fZ2V0dGltZW9mZGF5KCZ0aW1ldik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBtZW1zZXQodHJhY2VfZW50cnktPm5hbWUsIDAsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgdHJhY2VfbGVuID0gc3RybGVuKHRuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIHRyYWNlX2xlbiA9IHRyYWNlX2xlbiA+IDggPyA4IDogdHJhY2VfbGVuOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBtZW1jcHkodHJhY2VfZW50cnktPm5hbWUsICh0bmFtZSksIHRyYWNlX2xlbik7ICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgdHJhY2VfZW50cnktPnRpbWUgPSB0aW1ldi50dl91c2VjOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIHRyYWNlX2VudHJ5LT5jcHUgPSAodW5zaWduZWQgY2hhcikoc21wX3Byb2Nlc3Nvcl9pZCgpICYgMHhGRik7ICAgICAgIFwKICAgICAgICAgICAgICAgIHRyYWNlX2VudHJ5LT5kcml2ZXIgPSAodGRyaXZlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICB0cmFjZV9lbnRyeS0+aXJxbCA9IHRyYWNlX2lycWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgdHJhY2VfZW50cnktPmFyZzEgPSAodWxvbmcpKGExKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIHRyYWNlX2VudHJ5LT5hcmcyID0gKHVsb25nKShhMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICB0cmFjZV9lbnRyeS0+YXJnMyA9ICh1bG9uZykoYTMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgdHJhY2VfZW50cnktPmFyZzQgPSAodWxvbmcpKGE0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAoYnVmZmVyKS0+aW4rKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgaWYgKChidWZmZXIpLT5pbiA9PSBUUkFDRV9FTlRSSUVTKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlciktPmluID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJihidWZmZXIpLT5sb2NrKTsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCn0KI2Vsc2UKI2RlZmluZSBTWEdfVFJBQ0UodGRyaXZlciwgYnVmZmVyLCB0bGV2ZWwsIHRuYW1lLCBhMSwgYTIsIGEzLCBhNCkKI2VuZGlmCgojZW5kaWYKCiNlbmRpZiAgLyogIF9TWEdfREVCVUdfSF8gICovCg==