LyoKICogQ29weXJpZ2h0IDE5OTggTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAwIEJyYWRsZXkgQmFldHoKICogQ29weXJpZ2h0IDIwMDMgTWljaGFlbCBH/G5uZXdpZwogKiBDb3B5cmlnaHQgMjAwNSBEbWl0cnkgVGltb3Noa292CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBGSVhNRTogVGhpcyBhbGwgYXNzdW1lcyAzMiBiaXQgY29kZWNzCiAqCQlXaW45NSBhcHBlYXJzIHRvIHByZWZlciAzMiBiaXQgY29kZWNzLCBldmVuIGZyb20gMTYgYml0IGNvZGUuCiAqCQlUaGVyZSBpcyB0aGUgSUNPcGVuRnVuY3Rpb24xNiB0byB3b3JyeSBhYm91dCBzdGlsbCwgdGhvdWdoLgogKiAgICAgIAogKiBUT0RPCiAqICAgICAgLSBubyB0aHJlYWQgc2FmZXR5CiAqLwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBDT01fTk9fV0lORE9XU19ICiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgImNvbW1kbGcuaCIKI2luY2x1ZGUgInZmdy5oIgojaW5jbHVkZSAibXN2aWRlb19wcml2YXRlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgovKiBEcml2ZXJzMzIgc2V0dGluZ3MgKi8KI2RlZmluZSBIS0xNX0RSSVZFUlMzMiAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93cyBOVFxcQ3VycmVudFZlcnNpb25cXERyaXZlcnMzMiIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKG1zdmlkZW8pOwoKc3RhdGljIGlubGluZSBjb25zdCBjaGFyICp3aW5lX2RiZ3N0cl9mY2MoIERXT1JEIGZjYyApCnsKICAgIHJldHVybiB3aW5lX2RiZ19zcHJpbnRmKCIlYyVjJWMlYyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9CWVRFKExPV09SRChmY2MpKSwgSElCWVRFKExPV09SRChmY2MpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQllURShISVdPUkQoZmNjKSksIEhJQllURShISVdPUkQoZmNjKSkpOwp9CgpMUkVTVUxUIChDQUxMQkFDSyAqcEZuQ2FsbFRvMTYpKEhEUlZSLCBISUMsIFVJTlQsIExQQVJBTSwgTFBBUkFNKSA9IE5VTEw7CgpzdGF0aWMgV0lORV9ISUMqICAgICAgICBNU1ZJREVPX0ZpcnN0SGljIC8qID0gTlVMTCAqLzsKCnR5cGVkZWYgc3RydWN0IF9yZWdfZHJpdmVyIHJlZ19kcml2ZXI7CnN0cnVjdCBfcmVnX2RyaXZlcgp7CiAgICBEV09SRCAgICAgICBmY2NUeXBlOwogICAgRFdPUkQgICAgICAgZmNjSGFuZGxlcjsKICAgIERSSVZFUlBST0MgIHByb2M7CiAgICBMUFdTVFIgICAgICBuYW1lOwogICAgcmVnX2RyaXZlciogbmV4dDsKfTsKCnN0YXRpYyByZWdfZHJpdmVyKiByZWdfZHJpdmVyX2xpc3QgPSBOVUxMOwoKLyogVGhpcyBvbmUgaXMgYSBtYWNybyBzdWNoIHRoYXQgaXQgd29ya3MgZm9yIGJvdGggQVNDSUkgYW5kIFVuaWNvZGUgKi8KI2RlZmluZSBmb3VyY2NfdG9fc3RyaW5nKHN0ciwgZmNjKSBkbyB7IFwKCShzdHIpWzBdID0gTE9CWVRFKExPV09SRChmY2MpKTsgXAoJKHN0cilbMV0gPSBISUJZVEUoTE9XT1JEKGZjYykpOyBcCgkoc3RyKVsyXSA9IExPQllURShISVdPUkQoZmNjKSk7IFwKCShzdHIpWzNdID0gSElCWVRFKEhJV09SRChmY2MpKTsgXAoJfSB3aGlsZSgwKQoKSE1PRFVMRSBNU1ZGVzMyX2hNb2R1bGU7CgpCT09MIFdJTkFQSSBEbGxNYWluKCBISU5TVEFOQ0UgaGluc3QsIERXT1JEIHJlYXNvbiwgTFBWT0lEIHJlc2VydmVkICkKewogICAgVFJBQ0UoIiVwLCVseCwlcFxuIiwgaGluc3QsIHJlYXNvbiwgcmVzZXJ2ZWQpOwoKICAgIHN3aXRjaChyZWFzb24pCiAgICB7CiAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CiAgICAgICAgICAgIERpc2FibGVUaHJlYWRMaWJyYXJ5Q2FsbHMoaGluc3QpOwogICAgICAgICAgICBNU1ZGVzMyX2hNb2R1bGUgPSAoSE1PRFVMRSloaW5zdDsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIGludCBjb21wYXJlX2ZvdXJjYyhEV09SRCBmY2MxLCBEV09SRCBmY2MyKQp7CiAgY2hhciBmY2Nfc3RyMVs0XTsKICBjaGFyIGZjY19zdHIyWzRdOwogIGZvdXJjY190b19zdHJpbmcoZmNjX3N0cjEsIGZjYzEpOwogIGZvdXJjY190b19zdHJpbmcoZmNjX3N0cjIsIGZjYzIpOwogIHJldHVybiBzdHJuY2FzZWNtcChmY2Nfc3RyMSwgZmNjX3N0cjIsIDQpOwp9Cgp0eXBlZGVmIEJPT0wgKCplbnVtX2hhbmRsZXJfdCkoY29uc3QgY2hhciosIGludCwgdm9pZCopOwoKc3RhdGljIEJPT0wgZW51bV9kcml2ZXJzKERXT1JEIGZjY1R5cGUsIGVudW1faGFuZGxlcl90IGhhbmRsZXIsIHZvaWQqIHBhcmFtKQp7CiAgICBDSEFSIGJ1ZlsyMDQ4XSwgZmNjVHlwZVN0cls1XSwgKnM7CiAgICBEV09SRCBpLCBjbnQgPSAwLCBidWZMZW4sIGxSZXQ7CiAgICBCT09MIHJlc3VsdCA9IEZBTFNFOwogICAgRklMRVRJTUUgbGFzdFdyaXRlOwogICAgSEtFWSBoS2V5OwoKICAgIGZvdXJjY190b19zdHJpbmcoZmNjVHlwZVN0ciwgZmNjVHlwZSk7CiAgICBmY2NUeXBlU3RyWzRdID0gJy4nOwoKICAgIC8qIGZpcnN0LCBnbyB0aHJvdWdoIHRoZSByZWdpc3RyeSBlbnRyaWVzICovCiAgICBsUmV0ID0gUmVnT3BlbktleUV4QShIS0VZX0xPQ0FMX01BQ0hJTkUsIEhLTE1fRFJJVkVSUzMyLCAwLCBLRVlfUVVFUllfVkFMVUUsICZoS2V5KTsKICAgIGlmIChsUmV0ID09IEVSUk9SX1NVQ0NFU1MpIAogICAgewoJRFdPUkQgbnVta2V5czsKCVJlZ1F1ZXJ5SW5mb0tleUEoIGhLZXksIDAsIDAsIDAsICZudW1rZXlzLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKCWZvciAoaSA9IDA7IGkgPCBudW1rZXlzOyBpKyspIAoJewoJICAgIGJ1ZkxlbiA9IHNpemVvZihidWYpIC8gc2l6ZW9mKGJ1ZlswXSk7CgkgICAgbFJldCA9IFJlZ0VudW1LZXlFeEEoaEtleSwgaSwgYnVmLCAmYnVmTGVuLCAwLCAwLCAwLCAmbGFzdFdyaXRlKTsKCSAgICBpZiAobFJldCAhPSBFUlJPUl9TVUNDRVNTKSBjb250aW51ZTsKCSAgICBpZiAoc3RybmNhc2VjbXAoYnVmLCBmY2NUeXBlU3RyLCA1KSB8fCBidWZbOV0gIT0gJz0nKSBjb250aW51ZTsKCSAgICBpZiAoKHJlc3VsdCA9IGhhbmRsZXIoYnVmLCBjbnQrKywgcGFyYW0pKSkgYnJlYWs7Cgl9CiAgICAJUmVnQ2xvc2VLZXkoIGhLZXkgKTsKICAgIH0KICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7CgogICAgLyogaWYgdGhhdCBkaWRuJ3Qgd29yaywgZ28gdGhyb3VnaCB0aGUgdmFsdWVzIGluIHN5c3RlbS5pbmkgKi8KICAgIGlmIChHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb25BKCJkcml2ZXJzMzIiLCBidWYsIHNpemVvZihidWYpLCAic3lzdGVtLmluaSIpKSAKICAgIHsKCWZvciAocyA9IGJ1ZjsgKnM7IHMgKz0gc3RybGVuKHMpICsgMSkKCXsKICAgICAgICAgICAgVFJBQ0UoImdvdCAlc1xuIiwgcyk7CgkgICAgaWYgKHN0cm5jYXNlY21wKHMsIGZjY1R5cGVTdHIsIDUpIHx8IHNbOV0gIT0gJz0nKSBjb250aW51ZTsKCSAgICBpZiAoKHJlc3VsdCA9IGhhbmRsZXIocywgY250KyssIHBhcmFtKSkpIGJyZWFrOwoJfQogICAgfQoKICAgIHJldHVybiByZXN1bHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1TVklERU9fR2V0SGljUHRyCiAqCiAqCiAqLwpXSU5FX0hJQyogICBNU1ZJREVPX0dldEhpY1B0cihISUMgaGljKQp7CiAgICBXSU5FX0hJQyogICB3aGljOwoKICAgIGZvciAod2hpYyA9IE1TVklERU9fRmlyc3RIaWM7IHdoaWMgJiYgd2hpYy0+aGljICE9IGhpYzsgd2hpYyA9IHdoaWMtPm5leHQpOwogICAgcmV0dXJuIHdoaWM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVmlkZW9Gb3JXaW5kb3dzVmVyc2lvbgkJW01TVkZXMzIuMl0KICoJCVZpZGVvRm9yV2luZG93c1ZlcnNpb24JCVtNU1ZJREVPLjJdCiAqIFJldHVybnMgdGhlIHZlcnNpb24gaW4gbWFqb3IubWlub3IgZm9ybS4KICogSW4gV2luZG93czk1IHRoaXMgcmV0dXJucyAweDA0MDAwM2I2ICg0Ljk1MCkKICovCkRXT1JEIFdJTkFQSSBWaWRlb0ZvcldpbmRvd3NWZXJzaW9uKHZvaWQpIAp7CiAgICByZXR1cm4gMHgwNDAwMDNCNjsgLyogNC45NTAgKi8KfQoKc3RhdGljIEJPT0wgSUNJbmZvX2VudW1faGFuZGxlcihjb25zdCBjaGFyICpkcnYsIGludCBuciwgdm9pZCAqcGFyYW0pCnsKICAgIElDSU5GTyAqbHBpY2luZm8gPSAoSUNJTkZPICopcGFyYW07CiAgICBEV09SRCBmY2NIYW5kbGVyID0gbW1pb1N0cmluZ1RvRk9VUkNDQShkcnYgKyA1LCAwKTsKCiAgICAvKiBleGFjdCBtYXRjaCBvZiBmY2NIYW5kbGVyIG9yIG50aCBkcml2ZXIgZm91bmQgKi8KICAgIGlmICgobHBpY2luZm8tPmZjY0hhbmRsZXIgIT0gbnIpICYmIChscGljaW5mby0+ZmNjSGFuZGxlciAhPSBmY2NIYW5kbGVyKSkKCXJldHVybiBGQUxTRTsKCiAgICBscGljaW5mby0+ZmNjVHlwZSA9IG1taW9TdHJpbmdUb0ZPVVJDQ0EoZHJ2LCAwKTsKICAgIGxwaWNpbmZvLT5mY2NIYW5kbGVyID0gZmNjSGFuZGxlcjsKICAgIGxwaWNpbmZvLT5kd0ZsYWdzID0gMDsKICAgIGxwaWNpbmZvLT5kd1ZlcnNpb24gPSAwOwogICAgbHBpY2luZm8tPmR3VmVyc2lvbklDTSA9IElDVkVSU0lPTjsKICAgIGxwaWNpbmZvLT5zek5hbWVbMF0gPSAwOwogICAgbHBpY2luZm8tPnN6RGVzY3JpcHRpb25bMF0gPSAwOwogICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGRydiArIDEwLCAtMSwgbHBpY2luZm8tPnN6RHJpdmVyLCAKCQkJc2l6ZW9mKGxwaWNpbmZvLT5zekRyaXZlcikvc2l6ZW9mKFdDSEFSKSk7CgogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNJbmZvCQkJCVtNU1ZGVzMyLkBdCiAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbnN0YWxsYWJsZSBjb21wcmVzc29yLiBSZXR1cm4gVFJVRSBpZiB0aGVyZQogKiBpcyBvbmUuCiAqCiAqIFBBUkFNUwogKiAgIGZjY1R5cGUgICAgIFtJXSB0eXBlIG9mIGNvbXByZXNzb3IgKGUuZy4gJ3ZpZGMnKQogKiAgIGZjY0hhbmRsZXIgIFtJXSByZWFsIGZjYyBmb3IgaGFuZGxlciBvciA8bj50aCBjb21wcmVzc29yCiAqICAgbHBpY2luZm8gICAgW09dIGluZm9ybWF0aW9uIGFib3V0IGNvbXByZXNzb3IKICovCkJPT0wgVkZXQVBJIElDSW5mbyggRFdPUkQgZmNjVHlwZSwgRFdPUkQgZmNjSGFuZGxlciwgSUNJTkZPICpscGljaW5mbykKewogICAgVFJBQ0UoIiglcywlcy8lMDhseCwlcClcbiIsIAogICAgICAgICAgd2luZV9kYmdzdHJfZmNjKGZjY1R5cGUpLCB3aW5lX2RiZ3N0cl9mY2MoZmNjSGFuZGxlciksIGZjY0hhbmRsZXIsIGxwaWNpbmZvKTsKCiAgICBscGljaW5mby0+ZmNjSGFuZGxlciA9IGZjY0hhbmRsZXI7CiAgICByZXR1cm4gZW51bV9kcml2ZXJzKGZjY1R5cGUsIElDSW5mb19lbnVtX2hhbmRsZXIsIGxwaWNpbmZvKTsKfQoKc3RhdGljIERXT1JEIElDX0hhbmRsZVJlZiA9IDE7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDSW5zdGFsbAkJCVtNU1ZGVzMyLkBdCiAqLwpCT09MIFZGV0FQSSBJQ0luc3RhbGwoRFdPUkQgZmNjVHlwZSwgRFdPUkQgZmNjSGFuZGxlciwgTFBBUkFNIGxQYXJhbSwgTFBTVFIgc3pEZXNjLCBVSU5UIHdGbGFncykgCnsKICAgIHJlZ19kcml2ZXIqIGRyaXZlcjsKICAgIHVuc2lnbmVkIGxlbjsKCiAgICBUUkFDRSgiKCVzLCVzLCVwLCVwLDB4JTA4eClcbiIsIHdpbmVfZGJnc3RyX2ZjYyhmY2NUeXBlKSwgd2luZV9kYmdzdHJfZmNjKGZjY0hhbmRsZXIpLCAodm9pZCopbFBhcmFtLCBzekRlc2MsIHdGbGFncyk7CgogICAgLyogQ2hlY2sgaWYgYSBkcml2ZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkICovCiAgICBmb3IgKGRyaXZlciA9IHJlZ19kcml2ZXJfbGlzdDsgZHJpdmVyOyBkcml2ZXIgPSBkcml2ZXItPm5leHQpCiAgICB7CiAgICAgICAgaWYgKCFjb21wYXJlX2ZvdXJjYyhmY2NUeXBlLCBkcml2ZXItPmZjY1R5cGUpICYmCiAgICAgICAgICAgICFjb21wYXJlX2ZvdXJjYyhmY2NIYW5kbGVyLCBkcml2ZXItPmZjY0hhbmRsZXIpKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChkcml2ZXIpIHJldHVybiBGQUxTRTsKCiAgICAvKiBSZWdpc3RlciB0aGUgZHJpdmVyICovCiAgICBkcml2ZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKHJlZ19kcml2ZXIpKTsKICAgIGlmICghZHJpdmVyKSBnb3RvIG9vbTsKICAgIGRyaXZlci0+ZmNjVHlwZSA9IGZjY1R5cGU7CiAgICBkcml2ZXItPmZjY0hhbmRsZXIgPSBmY2NIYW5kbGVyOwoKICAgIHN3aXRjaCh3RmxhZ3MpCiAgICB7CiAgICBjYXNlIElDSU5TVEFMTF9GVU5DVElPTjoKICAgICAgICBkcml2ZXItPnByb2MgPSAoRFJJVkVSUFJPQylsUGFyYW07Cglkcml2ZXItPm5hbWUgPSBOVUxMOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJQ0lOU1RBTExfRFJJVkVSOgoJZHJpdmVyLT5wcm9jID0gTlVMTDsKICAgICAgICBsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgKGNoYXIqKWxQYXJhbSwgLTEsIE5VTEwsIDApOwogICAgICAgIGRyaXZlci0+bmFtZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4gKiBzaXplb2YoV0NIQVIpKTsKICAgICAgICBpZiAoIWRyaXZlci0+bmFtZSkgZ290byBvb207CiAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIChjaGFyKilsUGFyYW0sIC0xLCBkcml2ZXItPm5hbWUsIGxlbik7CglicmVhazsKICAgIGRlZmF1bHQ6CglFUlIoIkludmFsaWQgZmxhZ3MhXG4iKTsKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRyaXZlcik7CglyZXR1cm4gRkFMU0U7CiAgIH0KCiAgIC8qIEluc2VydCBvdXIgZHJpdmVyIGluIHRoZSBsaXN0Ki8KICAgZHJpdmVyLT5uZXh0ID0gcmVnX2RyaXZlcl9saXN0OwogICByZWdfZHJpdmVyX2xpc3QgPSBkcml2ZXI7CiAgICAKICAgcmV0dXJuIFRSVUU7Cm9vbToKICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHJpdmVyKTsKICAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDUmVtb3ZlCQkJW01TVkZXMzIuQF0KICovCkJPT0wgVkZXQVBJIElDUmVtb3ZlKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIFVJTlQgd0ZsYWdzKSAKewogICAgcmVnX2RyaXZlcioqIHBkcml2ZXI7CiAgICByZWdfZHJpdmVyKiAgZHJ2OwoKICAgIFRSQUNFKCIoJXMsJXMsMHglMDh4KVxuIiwgd2luZV9kYmdzdHJfZmNjKGZjY1R5cGUpLCB3aW5lX2RiZ3N0cl9mY2MoZmNjSGFuZGxlciksIHdGbGFncyk7CgogICAgLyogQ2hlY2sgaWYgYSBkcml2ZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkICovCiAgICBmb3IgKHBkcml2ZXIgPSAmcmVnX2RyaXZlcl9saXN0OyAqcGRyaXZlcjsgcGRyaXZlciA9ICYoKnBkcml2ZXIpLT5uZXh0KQogICAgewogICAgICAgIGlmICghY29tcGFyZV9mb3VyY2MoZmNjVHlwZSwgKCpwZHJpdmVyKS0+ZmNjVHlwZSkgJiYKICAgICAgICAgICAgIWNvbXBhcmVfZm91cmNjKGZjY0hhbmRsZXIsICgqcGRyaXZlciktPmZjY0hhbmRsZXIpKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmICghKnBkcml2ZXIpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIC8qIFJlbW92ZSB0aGUgZHJpdmVyIGZyb20gdGhlIGxpc3QgKi8KICAgIGRydiA9ICpwZHJpdmVyOwogICAgKnBkcml2ZXIgPSAoKnBkcml2ZXIpLT5uZXh0OwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHJ2LT5uYW1lKTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRydik7CiAgICAKICAgIHJldHVybiBUUlVFOyAgCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDT3BlbgkJCQlbTVNWRlczMi5AXQogKiBPcGVucyBhbiBpbnN0YWxsYWJsZSBjb21wcmVzc29yLiBSZXR1cm4gc3BlY2lhbCBoYW5kbGUuCiAqLwpISUMgVkZXQVBJIElDT3BlbihEV09SRCBmY2NUeXBlLCBEV09SRCBmY2NIYW5kbGVyLCBVSU5UIHdNb2RlKSAKewogICAgV0NIQVIJCWNvZGVjbmFtZVsxMF07CiAgICBJQ09QRU4JCWljb3BlbjsKICAgIEhEUlZSCQloZHJ2OwogICAgV0lORV9ISUMqICAgICAgICAgICB3aGljOwogICAgQk9PTCAgICAgICAgICAgICAgICBiSXMxNjsKICAgIHN0YXRpYyBjb25zdCBXQ0hBUiAgZHJ2MzJXW10gPSB7J2QnLCdyJywnaScsJ3YnLCdlJywncicsJ3MnLCczJywnMicsJ1wwJ307CiAgICByZWdfZHJpdmVyKiAgICAgICAgIGRyaXZlcjsKCiAgICBUUkFDRSgiKCVzLCVzLDB4JTA4eClcbiIsIHdpbmVfZGJnc3RyX2ZjYyhmY2NUeXBlKSwgd2luZV9kYmdzdHJfZmNjKGZjY0hhbmRsZXIpLCB3TW9kZSk7CgogICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSByZWdpc3RlcmVkIGRyaXZlciB0aGF0IG1hdGNoZXMgKi8KICAgIGRyaXZlciA9IHJlZ19kcml2ZXJfbGlzdDsKICAgIHdoaWxlKGRyaXZlcikKICAgICAgICBpZiAoIWNvbXBhcmVfZm91cmNjKGZjY1R5cGUsIGRyaXZlci0+ZmNjVHlwZSkgJiYKICAgICAgICAgICAgIWNvbXBhcmVfZm91cmNjKGZjY0hhbmRsZXIsIGRyaXZlci0+ZmNjSGFuZGxlcikpCgkgICAgYnJlYWs7CiAgICAgICAgZWxzZQogICAgICAgICAgICBkcml2ZXIgPSBkcml2ZXItPm5leHQ7CgogICAgaWYgKGRyaXZlciAmJiBkcml2ZXItPnByb2MpCgkvKiBUaGUgZHJpdmVyIGhhcyBiZWVuIHJlZ2lzdGVyZWQgYXQgcnVudGltZSB3aXRoIGl0cyBkcml2ZXJwcm9jICovCiAgICAgICAgcmV0dXJuIE1TVklERU9fT3BlbkZ1bmN0aW9uKGZjY1R5cGUsIGZjY0hhbmRsZXIsIHdNb2RlLCAoRFJJVkVSUFJPQylkcml2ZXItPnByb2MsIChEV09SRClOVUxMKTsKICAKICAgIC8qIFdlbGwsIGxQYXJhbTIgaXMgaW4gZmFjdCBhIExQVklERU9fT1BFTl9QQVJNUywgYnV0IGl0IGhhcyB0aGUKICAgICAqIHNhbWUgbGF5b3V0IGFzIElDT1BFTgogICAgICovCiAgICBpY29wZW4uZHdTaXplCQk9IHNpemVvZihJQ09QRU4pOwogICAgaWNvcGVuLmZjY1R5cGUJCT0gZmNjVHlwZTsKICAgIGljb3Blbi5mY2NIYW5kbGVyCSAgICAgICAgPSBmY2NIYW5kbGVyOwogICAgaWNvcGVuLmR3VmVyc2lvbiAgICAgICAgICAgID0gMHgwMDAwMTAwMDsgLyogRklYTUUgKi8KICAgIGljb3Blbi5kd0ZsYWdzCQk9IHdNb2RlOwogICAgaWNvcGVuLmR3RXJyb3IgICAgICAgICAgICAgID0gMDsKICAgIGljb3Blbi5wVjFSZXNlcnZlZCAgICAgICAgICA9IE5VTEw7CiAgICBpY29wZW4ucFYyUmVzZXJ2ZWQgICAgICAgICAgPSBOVUxMOwogICAgaWNvcGVuLmRuRGV2Tm9kZSAgICAgICAgICAgID0gMDsgLyogRklYTUUgKi8KCQogICAgaWYgKCFkcml2ZXIpIHsKICAgICAgICAvKiBUaGUgZHJpdmVyIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIHJlZ2lzdHJ5ICovCglmb3VyY2NfdG9fc3RyaW5nKGNvZGVjbmFtZSwgZmNjVHlwZSk7CiAgICAgICAgY29kZWNuYW1lWzRdID0gJy4nOwoJZm91cmNjX3RvX3N0cmluZyhjb2RlY25hbWUgKyA1LCBmY2NIYW5kbGVyKTsKICAgICAgICBjb2RlY25hbWVbOV0gPSAnXDAnOwoKICAgICAgICBoZHJ2ID0gT3BlbkRyaXZlcihjb2RlY25hbWUsIGRydjMyVywgKExQQVJBTSkmaWNvcGVuKTsKICAgICAgICBpZiAoIWhkcnYpIAogICAgICAgICAgICByZXR1cm4gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgLyogVGhlIGRyaXZlciBoYXMgYmVlbiByZWdpc3RlcmVkIGF0IHJ1bnRpbWUgd2l0aCBpdHMgbmFtZSAqLwogICAgICAgIGhkcnYgPSBPcGVuRHJpdmVyKGRyaXZlci0+bmFtZSwgTlVMTCwgKExQQVJBTSkmaWNvcGVuKTsKICAgICAgICBpZiAoIWhkcnYpIAogICAgICAgICAgICByZXR1cm4gMDsgCiAgICB9CiAgICBiSXMxNiA9IEdldERyaXZlckZsYWdzKGhkcnYpICYgMHgxMDAwMDAwMDsgLyogdW5kb2N1bWVudGVkIGZsYWc6IFdJTkVfR0RGXzE2QklUICovCgogICAgaWYgKGJJczE2ICYmICFwRm5DYWxsVG8xNikKICAgIHsKICAgICAgICBGSVhNRSgiR290IGEgMTYgYml0IGRyaXZlciwgYnV0IG5vIDE2IGJpdCBzdXBwb3J0IGluIG1zdmZ3XG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHdoaWMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKFdJTkVfSElDKSk7CiAgICBpZiAoIXdoaWMpCiAgICB7CiAgICAgICAgQ2xvc2VEcml2ZXIoaGRydiwgMCwgMCk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgd2hpYy0+aGRydiAgICAgICAgICA9IGhkcnY7CiAgICAvKiBGSVhNRTogaXMgdGhlIHNpZ25hdHVyZSB0aGUgcmVhbCBvbmUgPyAqLwogICAgd2hpYy0+ZHJpdmVycHJvYyAgICA9IGJJczE2ID8gKERSSVZFUlBST0MpcEZuQ2FsbFRvMTYgOiBOVUxMOwogICAgd2hpYy0+ZHJpdmVycHJvYzE2ICA9IDA7CiAgICB3aGljLT50eXBlICAgICAgICAgID0gZmNjVHlwZTsKICAgIHdoaWMtPmhhbmRsZXIgICAgICAgPSBmY2NIYW5kbGVyOwogICAgd2hpbGUgKE1TVklERU9fR2V0SGljUHRyKEhJQ18zMihJQ19IYW5kbGVSZWYpKSAhPSBOVUxMKSBJQ19IYW5kbGVSZWYrKzsKICAgIHdoaWMtPmhpYyAgICAgICAgICAgPSBISUNfMzIoSUNfSGFuZGxlUmVmKyspOwogICAgd2hpYy0+bmV4dCAgICAgICAgICA9IE1TVklERU9fRmlyc3RIaWM7CiAgICBNU1ZJREVPX0ZpcnN0SGljID0gd2hpYzsKCiAgICBUUkFDRSgiPT4gJXBcbiIsIHdoaWMtPmhpYyk7CiAgICByZXR1cm4gd2hpYy0+aGljOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1TVklERU9fT3BlbkZ1bmN0aW9uCiAqLwpISUMgTVNWSURFT19PcGVuRnVuY3Rpb24oRFdPUkQgZmNjVHlwZSwgRFdPUkQgZmNjSGFuZGxlciwgVUlOVCB3TW9kZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBEUklWRVJQUk9DIGxwZm5IYW5kbGVyLCBEV09SRCBscGZuSGFuZGxlcjE2KSAKewogICAgSUNPUEVOICAgICAgaWNvcGVuOwogICAgV0lORV9ISUMqICAgd2hpYzsKCiAgICBUUkFDRSgiKCVzLCVzLCVkLCVwLCUwOGx4KVxuIiwgCiAgICAgICAgICB3aW5lX2RiZ3N0cl9mY2MoZmNjVHlwZSksIHdpbmVfZGJnc3RyX2ZjYyhmY2NIYW5kbGVyKSwgd01vZGUsIGxwZm5IYW5kbGVyLCBscGZuSGFuZGxlcjE2KTsKCiAgICBpY29wZW4uZHdTaXplCQk9IHNpemVvZihJQ09QRU4pOwogICAgaWNvcGVuLmZjY1R5cGUJCT0gZmNjVHlwZTsKICAgIGljb3Blbi5mY2NIYW5kbGVyCSAgICAgICAgPSBmY2NIYW5kbGVyOwogICAgaWNvcGVuLmR3VmVyc2lvbiAgICAgICAgICAgID0gMHgwMDAwMTAwMDsgLyogRklYTUUgKi8KICAgIGljb3Blbi5kd0ZsYWdzCQk9IHdNb2RlOwogICAgaWNvcGVuLmR3RXJyb3IgICAgICAgICAgICAgID0gMDsKICAgIGljb3Blbi5wVjFSZXNlcnZlZCAgICAgICAgICA9IE5VTEw7CiAgICBpY29wZW4ucFYyUmVzZXJ2ZWQgICAgICAgICAgPSBOVUxMOwogICAgaWNvcGVuLmRuRGV2Tm9kZSAgICAgICAgICAgID0gMDsgLyogRklYTUUgKi8KCiAgICB3aGljID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihXSU5FX0hJQykpOwogICAgaWYgKCF3aGljKSByZXR1cm4gMDsKCiAgICB3aGljLT5kcml2ZXJwcm9jICAgPSBscGZuSGFuZGxlcjsKICAgIHdoaWMtPmRyaXZlcnByb2MxNiA9IGxwZm5IYW5kbGVyMTY7CiAgICB3aGlsZSAoTVNWSURFT19HZXRIaWNQdHIoSElDXzMyKElDX0hhbmRsZVJlZikpICE9IE5VTEwpIElDX0hhbmRsZVJlZisrOwogICAgd2hpYy0+aGljICAgICAgICAgID0gSElDXzMyKElDX0hhbmRsZVJlZisrKTsKICAgIHdoaWMtPm5leHQgICAgICAgICA9IE1TVklERU9fRmlyc3RIaWM7CiAgICBNU1ZJREVPX0ZpcnN0SGljID0gd2hpYzsKCiAgICAvKiBOb3cgdHJ5IG9wZW5pbmcvbG9hZGluZyB0aGUgZHJpdmVyLiBUYWtlbiBmcm9tIERSSVZFUl9BZGRUb0xpc3QgKi8KICAgIC8qIFdoYXQgaWYgdGhlIGZ1bmN0aW9uIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2U/ICovCgogICAgaWYgKE1TVklERU9fU2VuZE1lc3NhZ2Uod2hpYywgRFJWX0xPQUQsIDBMLCAwTCkgIT0gRFJWX1NVQ0NFU1MpIAogICAgewogICAgICAgIFdBUk4oIkRSVl9MT0FEIGZhaWxlZCBmb3IgaGljICVwXG4iLCB3aGljLT5oaWMpOwogICAgICAgIE1TVklERU9fRmlyc3RIaWMgPSB3aGljLT5uZXh0OwogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdoaWMpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgLyogcmV0dXJuIHZhbHVlIGlzIG5vdCBjaGVja2VkICovCiAgICBNU1ZJREVPX1NlbmRNZXNzYWdlKHdoaWMsIERSVl9FTkFCTEUsIDBMLCAwTCk7CgogICAgd2hpYy0+ZHJpdmVySWQgPSAoRFdPUkQpTVNWSURFT19TZW5kTWVzc2FnZSh3aGljLCBEUlZfT1BFTiwgMCwgKERXT1JEX1BUUikmaWNvcGVuKTsKICAgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBwdXQgaGVyZT8gKi8KICAgIHdoaWMtPmhkcnYgPSBOVUxMOwogICAgCiAgICBpZiAod2hpYy0+ZHJpdmVySWQgPT0gMCkgCiAgICB7CiAgICAgICAgV0FSTigiRFJWX09QRU4gZmFpbGVkIGZvciBoaWMgJXBcbiIsIHdoaWMtPmhpYyk7CiAgICAgICAgTVNWSURFT19GaXJzdEhpYyA9IHdoaWMtPm5leHQ7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd2hpYyk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgVFJBQ0UoIj0+ICVwXG4iLCB3aGljLT5oaWMpOwogICAgcmV0dXJuIHdoaWMtPmhpYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ09wZW5GdW5jdGlvbgkJCVtNU1ZGVzMyLkBdCiAqLwpISUMgVkZXQVBJIElDT3BlbkZ1bmN0aW9uKERXT1JEIGZjY1R5cGUsIERXT1JEIGZjY0hhbmRsZXIsIFVJTlQgd01vZGUsIEZBUlBST0MgbHBmbkhhbmRsZXIpIAp7CiAgICByZXR1cm4gTVNWSURFT19PcGVuRnVuY3Rpb24oZmNjVHlwZSwgZmNjSGFuZGxlciwgd01vZGUsIChEUklWRVJQUk9DKWxwZm5IYW5kbGVyLCAwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0dldEluZm8JCQlbTVNWRlczMi5AXQogKi8KTFJFU1VMVCBWRldBUEkgSUNHZXRJbmZvKEhJQyBoaWMsIElDSU5GTyAqcGljaW5mbywgRFdPUkQgY2IpIAp7CiAgICBMUkVTVUxUCXJldDsKICAgIFdJTkVfSElDKiAgIHdoaWMgPSBNU1ZJREVPX0dldEhpY1B0cihoaWMpOwoKICAgIFRSQUNFKCIoJXAsJXAsJWxkKVxuIiwgaGljLCBwaWNpbmZvLCBjYik7CgogICAgd2hpYyA9IE1TVklERU9fR2V0SGljUHRyKGhpYyk7CiAgICBpZiAoIXdoaWMpIHJldHVybiBJQ0VSUl9CQURIQU5ETEU7CiAgICBpZiAoIXBpY2luZm8pIHJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwoKICAgIC8qIChXUykgVGhlIGZpZWxkIHN6RHJpdmVyIHNob3VsZCBiZSBpbml0aWFsaXplZCBiZWNhdXNlIHRoZSBkcml2ZXIgCiAgICAgKiBpcyBub3Qgb2JsaWdlZCBhbmQgb2Z0ZW4gd2lsbCBub3QgZG8gaXQuIFNvbWUgYXBwbGljYXRpb25zLCBsaWtlCiAgICAgKiBWaXJ0dWFsRHViLCByZWx5IG9uIHRoaXMgZmllbGQgYW5kIHdpbGwgb2NjYXNpb25hbGx5IGNyYXNoIGlmIGl0CiAgICAgKiBnb2VzIHVuaXRpYWxpemVkLgogICAgICovCiAgICBpZiAoY2IgPj0gc2l6ZW9mKElDSU5GTykpIHBpY2luZm8tPnN6RHJpdmVyWzBdID0gJ1wwJzsKCiAgICByZXQgPSBJQ1NlbmRNZXNzYWdlKGhpYywgSUNNX0dFVElORk8sIChEV09SRF9QVFIpcGljaW5mbywgY2IpOwoKICAgIC8qIChXUykgV2hlbiBzekRyaXZlciB3YXMgbm90IHN1cHBsaWVkIGJ5IHRoZSBkcml2ZXIgaXRzZWxmLCBhcHBhcmVudGx5IAogICAgICogV2luZG93cyB3aWxsIHNldCBpdHMgdmFsdWUgZXF1YWwgdG8gdGhlIGRyaXZlciBmaWxlIG5hbWUuIFRoaXMgY2FuCiAgICAgKiBiZSBvYnRhaW5lZCBmcm9tIHRoZSByZWdpc3RyeSBhcyB3ZSBkbyBoZXJlLgogICAgICovCiAgICBpZiAoY2IgPj0gc2l6ZW9mKElDSU5GTykgJiYgcGljaW5mby0+c3pEcml2ZXJbMF0gPT0gMCkKICAgIHsKICAgICAgICBJQ0lORk8gIGlpOwoKICAgICAgICBtZW1zZXQoJmlpLCAwLCBzaXplb2YoaWkpKTsKICAgICAgICBpaS5kd1NpemUgPSBzaXplb2YoaWkpOwogICAgICAgIElDSW5mbyhwaWNpbmZvLT5mY2NUeXBlLCBwaWNpbmZvLT5mY2NIYW5kbGVyLCAmaWkpOwogICAgICAgIGxzdHJjcHlXKHBpY2luZm8tPnN6RHJpdmVyLCBpaS5zekRyaXZlcik7CiAgICB9CgogICAgVFJBQ0UoIgktPiAweCUwOGx4XG4iLCByZXQpOwogICAgcmV0dXJuIHJldDsKfQoKdHlwZWRlZiBzdHJ1Y3QgewogICAgRFdPUkQgZmNjVHlwZTsKICAgIERXT1JEIGZjY0hhbmRsZXI7CiAgICBMUEJJVE1BUElORk9IRUFERVIgbHBiaUluOwogICAgTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlPdXQ7CiAgICBXT1JEIHdNb2RlOwogICAgRFdPUkQgcXVlcnltc2c7CiAgICBISUMgaGljOwp9IGRyaXZlcl9pbmZvX3Q7CgpzdGF0aWMgSElDIHRyeV9kcml2ZXIoZHJpdmVyX2luZm9fdCAqaW5mbykKewogICAgSElDICAgaGljOwoKICAgIGlmICgoaGljID0gSUNPcGVuKGluZm8tPmZjY1R5cGUsIGluZm8tPmZjY0hhbmRsZXIsIGluZm8tPndNb2RlKSkpIAogICAgewoJaWYgKCFJQ1NlbmRNZXNzYWdlKGhpYywgaW5mby0+cXVlcnltc2csIChEV09SRF9QVFIpaW5mby0+bHBiaUluLCAoRFdPUkRfUFRSKWluZm8tPmxwYmlPdXQpKQoJICAgIHJldHVybiBoaWM7CglJQ0Nsb3NlKGhpYyk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIEJPT0wgSUNMb2NhdGVfZW51bV9oYW5kbGVyKGNvbnN0IGNoYXIgKmRydiwgaW50IG5yLCB2b2lkICpwYXJhbSkKewogICAgZHJpdmVyX2luZm9fdCAqaW5mbyA9IChkcml2ZXJfaW5mb190ICopcGFyYW07CiAgICBpbmZvLT5mY2NIYW5kbGVyID0gbW1pb1N0cmluZ1RvRk9VUkNDQShkcnYgKyA1LCAwKTsKICAgIGluZm8tPmhpYyA9IHRyeV9kcml2ZXIoaW5mbyk7CiAgICByZXR1cm4gaW5mby0+aGljICE9IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNMb2NhdGUJCQlbTVNWRlczMi5AXQogKi8KSElDIFZGV0FQSSBJQ0xvY2F0ZShEV09SRCBmY2NUeXBlLCBEV09SRCBmY2NIYW5kbGVyLCBMUEJJVE1BUElORk9IRUFERVIgbHBiaUluLAogICAgICAgICAgICAgICAgICAgIExQQklUTUFQSU5GT0hFQURFUiBscGJpT3V0LCBXT1JEIHdNb2RlKQp7CiAgICBkcml2ZXJfaW5mb190IGluZm87CgogICAgVFJBQ0UoIiglcywlcywlcCwlcCwweCUwNHgpXG4iLCAKICAgICAgICAgIHdpbmVfZGJnc3RyX2ZjYyhmY2NUeXBlKSwgd2luZV9kYmdzdHJfZmNjKGZjY0hhbmRsZXIpLCBscGJpSW4sIGxwYmlPdXQsIHdNb2RlKTsKCiAgICBpbmZvLmZjY1R5cGUgPSBmY2NUeXBlOwogICAgaW5mby5mY2NIYW5kbGVyID0gZmNjSGFuZGxlcjsKICAgIGluZm8ubHBiaUluID0gbHBiaUluOwogICAgaW5mby5scGJpT3V0ID0gbHBiaU91dDsKICAgIGluZm8ud01vZGUgPSB3TW9kZTsKCiAgICBzd2l0Y2ggKHdNb2RlKSAKICAgIHsKICAgIGNhc2UgSUNNT0RFX0ZBU1RDT01QUkVTUzoKICAgIGNhc2UgSUNNT0RFX0NPTVBSRVNTOgogICAgICAgIGluZm8ucXVlcnltc2cgPSBJQ01fQ09NUFJFU1NfUVVFUlk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElDTU9ERV9GQVNUREVDT01QUkVTUzoKICAgIGNhc2UgSUNNT0RFX0RFQ09NUFJFU1M6CiAgICAgICAgaW5mby5xdWVyeW1zZyA9IElDTV9ERUNPTVBSRVNTX1FVRVJZOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJQ01PREVfRFJBVzoKICAgICAgICBpbmZvLnF1ZXJ5bXNnID0gSUNNX0RSQVdfUVVFUlk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIFdBUk4oIlVua25vd24gbW9kZSAoJWQpXG4iLCB3TW9kZSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogRWFzeSBjYXNlOiBoYW5kbGVyL3R5cGUgbWF0Y2gsIHdlIGp1c3QgZmlyZSBhIHF1ZXJ5IGFuZCByZXR1cm4gKi8KICAgIGluZm8uaGljID0gdHJ5X2RyaXZlcigmaW5mbyk7CiAgICAvKiBJZiBpdCBkaWRuJ3Qgd29yaywgdHJ5IGVhY2ggZHJpdmVyIGluIHR1cm4uIDMyIGJpdCBjb2RlY3Mgb25seS4gKi8KICAgIC8qIEZJWE1FOiBNb3ZlIHRoaXMgdG8gYW4gaW5pdCByb3V0aW5lPyAqLwogICAgaWYgKCFpbmZvLmhpYykgZW51bV9kcml2ZXJzKGZjY1R5cGUsIElDTG9jYXRlX2VudW1faGFuZGxlciwgJmluZm8pOwoKICAgIGlmIChpbmZvLmhpYykgCiAgICB7CiAgICAgICAgVFJBQ0UoIj0+ICVwXG4iLCBpbmZvLmhpYyk7CglyZXR1cm4gaW5mby5oaWM7CiAgICB9CgogICAgaWYgKGZjY1R5cGUgPT0gc3RyZWFtdHlwZVZJREVPKSAKICAgICAgICByZXR1cm4gSUNMb2NhdGUoSUNUWVBFX1ZJREVPLCBmY2NIYW5kbGVyLCBscGJpSW4sIGxwYmlPdXQsIHdNb2RlKTsKICAgIAogICAgV0FSTigiKCVzLCVzLCVwLCVwLDB4JTA0eCkgbm90IGZvdW5kIVxuIiwKICAgICAgICAgd2luZV9kYmdzdHJfZmNjKGZjY1R5cGUpLCB3aW5lX2RiZ3N0cl9mY2MoZmNjSGFuZGxlciksIGxwYmlJbiwgbHBiaU91dCwgd01vZGUpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNHZXREaXNwbGF5Rm9ybWF0CQkJW01TVkZXMzIuQF0KICovCkhJQyBWRldBUEkgSUNHZXREaXNwbGF5Rm9ybWF0KAoJSElDIGhpYyxMUEJJVE1BUElORk9IRUFERVIgbHBiaUluLExQQklUTUFQSU5GT0hFQURFUiBscGJpT3V0LAoJSU5UIGRlcHRoLElOVCBkeCxJTlQgZHkpCnsKCUhJQwl0bXBoaWMgPSBoaWM7CgoJVFJBQ0UoIiglcCwlcCwlcCwlZCwlZCwlZCkhXG4iLGhpYyxscGJpSW4sbHBiaU91dCxkZXB0aCxkeCxkeSk7CgoJaWYgKCF0bXBoaWMpIHsKCQl0bXBoaWM9SUNMb2NhdGUoSUNUWVBFX1ZJREVPLDAsbHBiaUluLE5VTEwsSUNNT0RFX0RFQ09NUFJFU1MpOwoJCWlmICghdG1waGljKQoJCQlyZXR1cm4gdG1waGljOwoJfQoJaWYgKChkeSA9PSBscGJpSW4tPmJpSGVpZ2h0KSAmJiAoZHggPT0gbHBiaUluLT5iaVdpZHRoKSkKCQlkeSA9IGR4ID0gMDsgLyogbm8gcmVzaXplIG5lZWRlZCAqLwoKCS8qIENhbiB3ZSBkZWNvbXByZXNzIGl0ID8gKi8KCWlmIChJQ0RlY29tcHJlc3NRdWVyeSh0bXBoaWMsbHBiaUluLE5VTEwpICE9IDApCgkJZ290byBlcnJvdXQ7IC8qIG5vLCBzb3JyeSAqLwoKCUlDRGVjb21wcmVzc0dldEZvcm1hdCh0bXBoaWMsbHBiaUluLGxwYmlPdXQpOwoKCWlmIChscGJpT3V0LT5iaUNvbXByZXNzaW9uICE9IDApIHsKCSAgIEZJWE1FKCJPb2NoLCBob3cgY29tZSBkZWNvbXByZXNzb3Igb3V0cHV0cyBjb21wcmVzc2VkIGRhdGEgKCVsZCk/P1xuIiwKCQkJIGxwYmlPdXQtPmJpQ29tcHJlc3Npb24pOwoJfQoJaWYgKGxwYmlPdXQtPmJpU2l6ZSA8IHNpemVvZigqbHBiaU91dCkpIHsKCSAgIEZJWE1FKCJPb2NoLCBzaXplIG9mIG91dHB1dCBCSUggaXMgdG9vIHNtYWxsICglbGQpXG4iLAoJCQkgbHBiaU91dC0+YmlTaXplKTsKCSAgIGxwYmlPdXQtPmJpU2l6ZSA9IHNpemVvZigqbHBiaU91dCk7Cgl9CglpZiAoIWRlcHRoKSB7CgkJSERDCWhkYzsKCgkJaGRjID0gR2V0REMoMCk7CgkJZGVwdGggPSBHZXREZXZpY2VDYXBzKGhkYyxCSVRTUElYRUwpKkdldERldmljZUNhcHMoaGRjLFBMQU5FUyk7CgkJUmVsZWFzZURDKDAsaGRjKTsKCQlpZiAoZGVwdGg9PTE1KQlkZXB0aCA9IDE2OwoJCWlmIChkZXB0aDw4KQlkZXB0aCA9ICA4OwoJfQoJaWYgKGxwYmlJbi0+YmlCaXRDb3VudCA9PSA4KQoJCWRlcHRoID0gODsKCglUUkFDRSgiPT4gJXBcbiIsIHRtcGhpYyk7CglyZXR1cm4gdG1waGljOwplcnJvdXQ6CglpZiAoaGljIT10bXBoaWMpCgkJSUNDbG9zZSh0bXBoaWMpOwoKCVRSQUNFKCI9PiAwXG4iKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDQ29tcHJlc3MJCQlbTVNWRlczMi5AXQogKi8KRFdPUkQgVkZXQVBJVgpJQ0NvbXByZXNzKAoJSElDIGhpYyxEV09SRCBkd0ZsYWdzLExQQklUTUFQSU5GT0hFQURFUiBscGJpT3V0cHV0LExQVk9JRCBscERhdGEsCglMUEJJVE1BUElORk9IRUFERVIgbHBiaUlucHV0LExQVk9JRCBscEJpdHMsTFBEV09SRCBscGNraWQsCglMUERXT1JEIGxwZHdGbGFncyxMT05HIGxGcmFtZU51bSxEV09SRCBkd0ZyYW1lU2l6ZSxEV09SRCBkd1F1YWxpdHksCglMUEJJVE1BUElORk9IRUFERVIgbHBiaVByZXYsTFBWT0lEIGxwUHJldikKewoJSUNDT01QUkVTUwlpY2NtcDsKCglUUkFDRSgiKCVwLCVsZCwlcCwlcCwlcCwlcCwuLi4pXG4iLGhpYyxkd0ZsYWdzLGxwYmlPdXRwdXQsbHBEYXRhLGxwYmlJbnB1dCxscEJpdHMpOwoKCWljY21wLmR3RmxhZ3MJCT0gZHdGbGFnczsKCglpY2NtcC5scGJpT3V0cHV0CT0gbHBiaU91dHB1dDsKCWljY21wLmxwT3V0cHV0CQk9IGxwRGF0YTsKCWljY21wLmxwYmlJbnB1dAkJPSBscGJpSW5wdXQ7CglpY2NtcC5scElucHV0CQk9IGxwQml0czsKCglpY2NtcC5scGNraWQJCT0gbHBja2lkOwoJaWNjbXAubHBkd0ZsYWdzCQk9IGxwZHdGbGFnczsKCWljY21wLmxGcmFtZU51bQkJPSBsRnJhbWVOdW07CglpY2NtcC5kd0ZyYW1lU2l6ZQk9IGR3RnJhbWVTaXplOwoJaWNjbXAuZHdRdWFsaXR5CQk9IGR3UXVhbGl0eTsKCWljY21wLmxwYmlQcmV2CQk9IGxwYmlQcmV2OwoJaWNjbXAubHBQcmV2CQk9IGxwUHJldjsKCXJldHVybiBJQ1NlbmRNZXNzYWdlKGhpYyxJQ01fQ09NUFJFU1MsKERXT1JEX1BUUikmaWNjbXAsc2l6ZW9mKGljY21wKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNEZWNvbXByZXNzCQkJW01TVkZXMzIuQF0KICovCkRXT1JEIFZGV0FQSVYgIElDRGVjb21wcmVzcyhISUMgaGljLERXT1JEIGR3RmxhZ3MsTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlGb3JtYXQsCgkJCQlMUFZPSUQgbHBEYXRhLExQQklUTUFQSU5GT0hFQURFUiBscGJpLExQVk9JRCBscEJpdHMpCnsKCUlDREVDT01QUkVTUwlpY2Q7CglEV09SRCByZXQ7CgoJVFJBQ0UoIiglcCwlbGQsJXAsJXAsJXAsJXApXG4iLGhpYyxkd0ZsYWdzLGxwYmlGb3JtYXQsbHBEYXRhLGxwYmksbHBCaXRzKTsKCglUUkFDRSgibHBCaXRzWzBdID09ICVseFxuIiwoKExQRFdPUkQpbHBCaXRzKVswXSk7CgoJaWNkLmR3RmxhZ3MJPSBkd0ZsYWdzOwoJaWNkLmxwYmlJbnB1dAk9IGxwYmlGb3JtYXQ7CglpY2QubHBJbnB1dAk9IGxwRGF0YTsKCglpY2QubHBiaU91dHB1dAk9IGxwYmk7CglpY2QubHBPdXRwdXQJPSBscEJpdHM7CglpY2QuY2tpZAk9IDA7CglyZXQgPSBJQ1NlbmRNZXNzYWdlKGhpYyxJQ01fREVDT01QUkVTUywoRFdPUkRfUFRSKSZpY2Qsc2l6ZW9mKElDREVDT01QUkVTUykpOwoKCVRSQUNFKCJscEJpdHNbMF0gPT0gJWx4XG4iLCgoTFBEV09SRClscEJpdHMpWzBdKTsKCglUUkFDRSgiLT4gJWxkXG4iLHJldCk7CgoJcmV0dXJuIHJldDsKfQoKCnN0cnVjdCBjaG9vc2VfY29tcHJlc3Nvcgp7CiAgICBVSU5UIGZsYWdzOwogICAgTFBDU1RSIHRpdGxlOwogICAgQ09NUFZBUlMgY3Y7Cn07CgpzdGF0aWMgQk9PTCBlbnVtX2NvbXByZXNzb3JzKEhXTkQgbGlzdCkKewogICAgVUlOVCBpZDsKICAgIElDSU5GTyBpY2luZm87CgogICAgaWQgPSAwOwoKICAgIHdoaWxlIChJQ0luZm8oSUNUWVBFX1ZJREVPLCBpZCwgJmljaW5mbykpCiAgICB7CiAgICAgICAgSUNJTkZPICppYzsKICAgICAgICBEV09SRCBpZHg7CiAgICAgICAgSElDIGhpYzsKCiAgICAgICAgaGljID0gSUNPcGVuKGljaW5mby5mY2NUeXBlLCBpY2luZm8uZmNjSGFuZGxlciwgSUNNT0RFX0NPTVBSRVNTKTsKCiAgICAgICAgaWYgKGhpYykKICAgICAgICB7CiAgICAgICAgICAgIC8qIGZvciB1bmtub3duIHJlYXNvbiBmY2NIYW5kbGVyIHJlcG9ydGVkIGJ5IHRoZSBkcml2ZXIKICAgICAgICAgICAgICogZG9lc24ndCBhbHdheXMgd29yaywgdXNlIHRoZSBvbmUgcmV0dXJuZWQgYnkgSUNJbmZvIGluc3RlYWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBEV09SRCBmY2NIYW5kbGVyID0gaWNpbmZvLmZjY0hhbmRsZXI7CgogICAgICAgICAgICBJQ0dldEluZm8oaGljLCAmaWNpbmZvLCBzaXplb2YoaWNpbmZvKSk7CiAgICAgICAgICAgIGljaW5mby5mY2NIYW5kbGVyID0gZmNjSGFuZGxlcjsKICAgICAgICAgICAgSUNDbG9zZShoaWMpOwoKICAgICAgICAgICAgaWR4ID0gU2VuZE1lc3NhZ2VXKGxpc3QsIENCX0FERFNUUklORywgMCwgKExQQVJBTSlpY2luZm8uc3pEZXNjcmlwdGlvbik7CgogICAgICAgICAgICBpYyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoSUNJTkZPKSk7CiAgICAgICAgICAgICppYyA9IGljaW5mbzsKICAgICAgICAgICAgU2VuZE1lc3NhZ2VXKGxpc3QsIENCX1NFVElURU1EQVRBLCBpZHgsIChMUEFSQU0paWMpOwogICAgICAgIH0KICAgICAgICBpZCsrOwogICAgfQoKICAgIHJldHVybiBpZCAhPSAwOwp9CgpzdGF0aWMgSU5UX1BUUiBDQUxMQkFDSyBpY21fY2hvb3NlX2NvbXByZXNzb3JfZGxncHJvYyhIV05EIGhkbGcsIFVJTlQgbXNnLCBXUEFSQU0gd3BhcmFtLCBMUEFSQU0gbHBhcmFtKQp7CiAgICBzd2l0Y2ggKG1zZykKICAgIHsKICAgIGNhc2UgV01fSU5JVERJQUxPRzoKICAgIHsKICAgICAgICBXQ0hBUiBidWZbMTI4XTsKICAgICAgICBzdHJ1Y3QgY2hvb3NlX2NvbXByZXNzb3IgKmNob29zZV9jb21wID0gKHN0cnVjdCBjaG9vc2VfY29tcHJlc3NvciAqKWxwYXJhbTsKCiAgICAgICAgaWYgKGNob29zZV9jb21wLT50aXRsZSkKICAgICAgICAgICAgU2V0V2luZG93VGV4dEEoaGRsZywgY2hvb3NlX2NvbXAtPnRpdGxlKTsKCiAgICAgICAgTG9hZFN0cmluZ1coTVNWRlczMl9oTW9kdWxlLCBJRFNfRlVMTEZSQU1FUywgYnVmLCAxMjgpOwogICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZVcoaGRsZywgSURDX0NPTVBfTElTVCwgQ0JfQUREU1RSSU5HLCAwLCAoTFBBUkFNKWJ1Zik7CgogICAgICAgIGVudW1fY29tcHJlc3NvcnMoR2V0RGxnSXRlbShoZGxnLCBJRENfQ09NUF9MSVNUKSk7CgogICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZVcoaGRsZywgSURDX0NPTVBfTElTVCwgQ0JfU0VUQ1VSU0VMLCAwLCAwKTsKICAgICAgICBTZXRGb2N1cyhHZXREbGdJdGVtKGhkbGcsIElEQ19DT01QX0xJU1QpKTsKCiAgICAgICAgU2V0V2luZG93TG9uZ1B0clcoaGRsZywgRFdMUF9VU0VSLCAoVUxPTkdfUFRSKWNob29zZV9jb21wKTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICBjYXNlIFdNX0NPTU1BTkQ6CiAgICAgICAgc3dpdGNoIChMT1dPUkQod3BhcmFtKSkKICAgICAgICB7CiAgICAgICAgY2FzZSBJRE9LOgogICAgICAgIHsKICAgICAgICAgICAgSFdORCBsaXN0ID0gR2V0RGxnSXRlbShoZGxnLCBJRENfQ09NUF9MSVNUKTsKICAgICAgICAgICAgSU5UIGN1cl9zZWw7CiAgICAgICAgICAgIElDSU5GTyAqaWM7CgogICAgICAgICAgICBjdXJfc2VsID0gU2VuZE1lc3NhZ2VXKGxpc3QsIENCX0dFVENVUlNFTCwgMCwgMCk7CiAgICAgICAgICAgIGljID0gKElDSU5GTyAqKVNlbmRNZXNzYWdlVyhsaXN0LCBDQl9HRVRJVEVNREFUQSwgY3VyX3NlbCwgMCk7CiAgICAgICAgICAgIGlmIChpYykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RydWN0IGNob29zZV9jb21wcmVzc29yICpjaG9vc2VfY29tcCA9IChzdHJ1Y3QgY2hvb3NlX2NvbXByZXNzb3IgKilHZXRXaW5kb3dMb25nUHRyVyhoZGxnLCBEV0xQX1VTRVIpOwoKICAgICAgICAgICAgICAgIGNob29zZV9jb21wLT5jdi5oaWMgPSBJQ09wZW4oaWMtPmZjY1R5cGUsIGljLT5mY2NIYW5kbGVyLCBJQ01PREVfQ09NUFJFU1MpOwogICAgICAgICAgICAgICAgaWYgKGNob29zZV9jb21wLT5jdi5oaWMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2hvb3NlX2NvbXAtPmN2LmZjY1R5cGUgPSBpYy0+ZmNjVHlwZTsKICAgICAgICAgICAgICAgICAgICBjaG9vc2VfY29tcC0+Y3YuZmNjSGFuZGxlciA9IGljLT5mY2NIYW5kbGVyOwogICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBmaWxsIGV2ZXJ5dGhpbmcgZWxzZSAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgICAgIGNhc2UgSURDQU5DRUw6CiAgICAgICAgewogICAgICAgICAgICBIV05EIGxpc3QgPSBHZXREbGdJdGVtKGhkbGcsIElEQ19DT01QX0xJU1QpOwogICAgICAgICAgICBJTlQgaWR4ID0gMDsKCiAgICAgICAgICAgIHdoaWxlICgxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBMUkVTVUxUIHJldCA9IFNlbmRNZXNzYWdlVyhsaXN0LCBDQl9HRVRJVEVNREFUQSwgaWR4KyssIDApOwoKICAgICAgICAgICAgICAgIGlmICghcmV0IHx8IHJldCA9PSBDQl9FUlIpIGJyZWFrOwoKICAgICAgICAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICh2b2lkICopcmV0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgRW5kRGlhbG9nKGhkbGcsIExPV09SRCh3cGFyYW0pID09IElET0spOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0NvbXByZXNzb3JDaG9vc2UgICBbTVNWRlczMi5AXQogKi8KQk9PTCBWRldBUEkgSUNDb21wcmVzc29yQ2hvb3NlKEhXTkQgaHduZCwgVUlOVCB1aUZsYWdzLCBMUFZPSUQgcHZJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscERhdGEsIFBDT01QVkFSUyBwYywgTFBTVFIgbHBzelRpdGxlKQp7CiAgICBzdHJ1Y3QgY2hvb3NlX2NvbXByZXNzb3IgY2hvb3NlX2NvbXA7CiAgICBCT09MIHJldDsKCiAgICBUUkFDRSgiKCVwLCUwOHgsJXAsJXAsJXAsJXMpXG4iLCBod25kLCB1aUZsYWdzLCBwdkluLCBscERhdGEsIHBjLCBscHN6VGl0bGUpOwoKICAgIGlmICghcGMgfHwgcGMtPmNiU2l6ZSAhPSBzaXplb2YoQ09NUFZBUlMpKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICBpZiAoIShwYy0+ZHdGbGFncyAmIElDTUZfQ09NUFZBUlNfVkFMSUQpKQogICAgewogICAgICAgIHBjLT5kd0ZsYWdzICAgPSAwOwogICAgICAgIHBjLT5mY2NUeXBlICAgPSBwYy0+ZmNjSGFuZGxlciA9IDA7CiAgICAgICAgcGMtPmhpYyAgICAgICA9IE5VTEw7CiAgICAgICAgcGMtPmxwYmlPdXQgICA9IE5VTEw7CiAgICAgICAgcGMtPmxwQml0c091dCA9IHBjLT5scEJpdHNQcmV2ID0gcGMtPmxwU3RhdGUgPSBOVUxMOwogICAgICAgIHBjLT5sUSAgICAgICAgPSBJQ1FVQUxJVFlfREVGQVVMVDsKICAgICAgICBwYy0+bEtleSAgICAgID0gLTE7CiAgICAgICAgcGMtPmxEYXRhUmF0ZSA9IDMwMDsgLyoga0IgKi8KICAgICAgICBwYy0+bHBTdGF0ZSAgID0gTlVMTDsKICAgICAgICBwYy0+Y2JTdGF0ZSAgID0gMDsKICAgIH0KICAgIGlmIChwYy0+ZmNjVHlwZSA9PSAwKQogICAgICAgIHBjLT5mY2NUeXBlID0gSUNUWVBFX1ZJREVPOwoKICAgIGNob29zZV9jb21wLmZsYWdzID0gdWlGbGFnczsKICAgIGNob29zZV9jb21wLnRpdGxlID0gbHBzelRpdGxlOwoKICAgIHJldCA9IERpYWxvZ0JveFBhcmFtVyhNU1ZGVzMyX2hNb2R1bGUsIE1BS0VJTlRSRVNPVVJDRVcoSUNNX0NIT09TRV9DT01QUkVTU09SKSwgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBpY21fY2hvb3NlX2NvbXByZXNzb3JfZGxncHJvYywgKExQQVJBTSkmY2hvb3NlX2NvbXApOwoKICAgIGlmIChyZXQpCiAgICB7CiAgICAgICAgKnBjID0gY2hvb3NlX2NvbXAuY3Y7CiAgICAgICAgcGMtPmR3RmxhZ3MgfD0gSUNNRl9DT01QVkFSU19WQUxJRDsKICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ0NvbXByZXNzb3JGcmVlICAgW01TVkZXMzIuQF0KICovCnZvaWQgVkZXQVBJIElDQ29tcHJlc3NvckZyZWUoUENPTVBWQVJTIHBjKQp7CiAgVFJBQ0UoIiglcClcbiIscGMpOwoKICBpZiAocGMgIT0gTlVMTCAmJiBwYy0+Y2JTaXplID09IHNpemVvZihDT01QVkFSUykpIHsKICAgIGlmIChwYy0+aGljICE9IE5VTEwpIHsKICAgICAgSUNDbG9zZShwYy0+aGljKTsKICAgICAgcGMtPmhpYyA9IE5VTEw7CiAgICB9CiAgICBpZiAocGMtPmxwYmlJbiAhPSBOVUxMKSB7CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHBjLT5scGJpSW4pOwogICAgICBwYy0+bHBiaUluID0gTlVMTDsKICAgIH0KICAgIGlmIChwYy0+bHBCaXRzT3V0ICE9IE5VTEwpIHsKICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcGMtPmxwQml0c091dCk7CiAgICAgIHBjLT5scEJpdHNPdXQgPSBOVUxMOwogICAgfQogICAgaWYgKHBjLT5scEJpdHNQcmV2ICE9IE5VTEwpIHsKICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcGMtPmxwQml0c1ByZXYpOwogICAgICBwYy0+bHBCaXRzUHJldiA9IE5VTEw7CiAgICB9CiAgICBpZiAocGMtPmxwU3RhdGUgIT0gTlVMTCkgewogICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwYy0+bHBTdGF0ZSk7CiAgICAgIHBjLT5scFN0YXRlID0gTlVMTDsKICAgIH0KICAgIHBjLT5kd0ZsYWdzID0gMDsKICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlNU1ZJREVPX1NlbmRNZXNzYWdlCiAqCiAqCiAqLwpMUkVTVUxUIE1TVklERU9fU2VuZE1lc3NhZ2UoV0lORV9ISUMqIHdoaWMsIFVJTlQgbXNnLCBEV09SRF9QVFIgbFBhcmFtMSwgRFdPUkRfUFRSIGxQYXJhbTIpCnsKICAgIExSRVNVTFQgICAgIHJldDsKICAgIAojZGVmaW5lIFhYKHgpIGNhc2UgeDogVFJBQ0UoIiglcCwiI3giLDB4JTA4bHgsMHglMDhseClcbiIsd2hpYyxsUGFyYW0xLGxQYXJhbTIpOyBicmVhazsKICAgIAogICAgc3dpdGNoIChtc2cpIHsKICAgICAgICAvKiBEUlZfKiAqLwogICAgICAgIFhYKERSVl9MT0FEKTsKICAgICAgICBYWChEUlZfRU5BQkxFKTsKICAgICAgICBYWChEUlZfT1BFTik7CiAgICAgICAgWFgoRFJWX0NMT1NFKTsKICAgICAgICBYWChEUlZfRElTQUJMRSk7CiAgICAgICAgWFgoRFJWX0ZSRUUpOwogICAgICAgIC8qIElDTV9SRVNFUlZFRCtYICovCiAgICAgICAgWFgoSUNNX0FCT1VUKTsKICAgICAgICBYWChJQ01fQ09ORklHVVJFKTsKICAgICAgICBYWChJQ01fR0VUKTsKICAgICAgICBYWChJQ01fR0VUSU5GTyk7CiAgICAgICAgWFgoSUNNX0dFVERFRkFVTFRRVUFMSVRZKTsKICAgICAgICBYWChJQ01fR0VUUVVBTElUWSk7CiAgICAgICAgWFgoSUNNX0dFVFNUQVRFKTsKICAgICAgICBYWChJQ01fU0VUUVVBTElUWSk7CiAgICAgICAgWFgoSUNNX1NFVCk7CiAgICAgICAgWFgoSUNNX1NFVFNUQVRFKTsKICAgICAgICAvKiBJQ01fVVNFUitYICovCiAgICAgICAgWFgoSUNNX0NPTVBSRVNTX0ZSQU1FU19JTkZPKTsKICAgICAgICBYWChJQ01fQ09NUFJFU1NfR0VUX0ZPUk1BVCk7CiAgICAgICAgWFgoSUNNX0NPTVBSRVNTX0dFVF9TSVpFKTsKICAgICAgICBYWChJQ01fQ09NUFJFU1NfUVVFUlkpOwogICAgICAgIFhYKElDTV9DT01QUkVTU19CRUdJTik7CiAgICAgICAgWFgoSUNNX0NPTVBSRVNTKTsKICAgICAgICBYWChJQ01fQ09NUFJFU1NfRU5EKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU19HRVRfRk9STUFUKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU19RVUVSWSk7CiAgICAgICAgWFgoSUNNX0RFQ09NUFJFU1NfQkVHSU4pOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU19FTkQpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTX1NFVF9QQUxFVFRFKTsKICAgICAgICBYWChJQ01fREVDT01QUkVTU19HRVRfUEFMRVRURSk7CiAgICAgICAgWFgoSUNNX0RSQVdfUVVFUlkpOwogICAgICAgIFhYKElDTV9EUkFXX0JFR0lOKTsKICAgICAgICBYWChJQ01fRFJBV19HRVRfUEFMRVRURSk7CiAgICAgICAgWFgoSUNNX0RSQVdfU1RBUlQpOwogICAgICAgIFhYKElDTV9EUkFXX1NUT1ApOwogICAgICAgIFhYKElDTV9EUkFXX0VORCk7CiAgICAgICAgWFgoSUNNX0RSQVdfR0VUVElNRSk7CiAgICAgICAgWFgoSUNNX0RSQVcpOwogICAgICAgIFhYKElDTV9EUkFXX1dJTkRPVyk7CiAgICAgICAgWFgoSUNNX0RSQVdfU0VUVElNRSk7CiAgICAgICAgWFgoSUNNX0RSQVdfUkVBTElaRSk7CiAgICAgICAgWFgoSUNNX0RSQVdfRkxVU0gpOwogICAgICAgIFhYKElDTV9EUkFXX1JFTkRFUkJVRkZFUik7CiAgICAgICAgWFgoSUNNX0RSQVdfU1RBUlRfUExBWSk7CiAgICAgICAgWFgoSUNNX0RSQVdfU1RPUF9QTEFZKTsKICAgICAgICBYWChJQ01fRFJBV19TVUdHRVNURk9STUFUKTsKICAgICAgICBYWChJQ01fRFJBV19DSEFOR0VQQUxFVFRFKTsKICAgICAgICBYWChJQ01fR0VUQlVGRkVSU1dBTlRFRCk7CiAgICAgICAgWFgoSUNNX0dFVERFRkFVTFRLRVlGUkFNRVJBVEUpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTRVhfQkVHSU4pOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTRVhfUVVFUlkpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTRVgpOwogICAgICAgIFhYKElDTV9ERUNPTVBSRVNTRVhfRU5EKTsKICAgICAgICBYWChJQ01fU0VUX1NUQVRVU19QUk9DKTsKICAgIGRlZmF1bHQ6CiAgICAgICAgRklYTUUoIiglcCwweCUwOGx4LDB4JTA4bHgsMHglMDhseCkgdW5rbm93biBtZXNzYWdlXG4iLHdoaWMsKERXT1JEKW1zZyxsUGFyYW0xLGxQYXJhbTIpOwogICAgfQogICAgCiN1bmRlZiBYWAogICAgCiAgICBpZiAod2hpYy0+ZHJpdmVycHJvYykgewoJLyogZHdEcml2ZXJJZCBwYXJhbWV0ZXIgaXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBEUlZfT1BFTiAqLwogICAgICAgIHJldCA9IHdoaWMtPmRyaXZlcnByb2Mod2hpYy0+ZHJpdmVySWQsIHdoaWMtPmhkcnYsIG1zZywgbFBhcmFtMSwgbFBhcmFtMik7CiAgICB9IGVsc2UgewogICAgICAgIHJldCA9IFNlbmREcml2ZXJNZXNzYWdlKHdoaWMtPmhkcnYsIG1zZywgbFBhcmFtMSwgbFBhcmFtMik7CiAgICB9CgogICAgVFJBQ0UoIgktPiAweCUwOGx4XG4iLCByZXQpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJQ1NlbmRNZXNzYWdlCQkJW01TVkZXMzIuQF0KICovCkxSRVNVTFQgVkZXQVBJIElDU2VuZE1lc3NhZ2UoSElDIGhpYywgVUlOVCBtc2csIERXT1JEX1BUUiBsUGFyYW0xLCBEV09SRF9QVFIgbFBhcmFtMikgCnsKICAgIFdJTkVfSElDKiAgIHdoaWMgPSBNU1ZJREVPX0dldEhpY1B0cihoaWMpOwoKICAgIGlmICghd2hpYykgcmV0dXJuIElDRVJSX0JBREhBTkRMRTsKICAgIHJldHVybiBNU1ZJREVPX1NlbmRNZXNzYWdlKHdoaWMsIG1zZywgbFBhcmFtMSwgbFBhcmFtMik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNEcmF3QmVnaW4JCVtNU1ZGVzMyLkBdCiAqLwpEV09SRCBWRldBUElWIElDRHJhd0JlZ2luKAoJSElDICAgICAgICAgICAgICAgIGhpYywgICAgIC8qIFtpbl0gKi8KCURXT1JEICAgICAgICAgICAgICBkd0ZsYWdzLCAvKiBbaW5dIGZsYWdzICovCglIUEFMRVRURSAgICAgICAgICAgaHBhbCwgICAgLyogW2luXSBwYWxldHRlIHRvIGRyYXcgd2l0aCAqLwoJSFdORCAgICAgICAgICAgICAgIGh3bmQsICAgIC8qIFtpbl0gd2luZG93IHRvIGRyYXcgdG8gKi8KCUhEQyAgICAgICAgICAgICAgICBoZGMsICAgICAvKiBbaW5dIEhEQyB0byBkcmF3IHRvICovCglJTlQgICAgICAgICAgICAgICAgeERzdCwgICAgLyogW2luXSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgKi8KCUlOVCAgICAgICAgICAgICAgICB5RHN0LCAgICAvKiBbaW5dICovCglJTlQgICAgICAgICAgICAgICAgZHhEc3QsICAgLyogW2luXSAqLwoJSU5UICAgICAgICAgICAgICAgIGR5RHN0LCAgIC8qIFtpbl0gKi8KCUxQQklUTUFQSU5GT0hFQURFUiBscGJpLCAgICAvKiBbaW5dIGZvcm1hdCBvZiBmcmFtZSB0byBkcmF3ICovCglJTlQgICAgICAgICAgICAgICAgeFNyYywgICAgLyogW2luXSBzb3VyY2UgcmVjdGFuZ2xlICovCglJTlQgICAgICAgICAgICAgICAgeVNyYywgICAgLyogW2luXSAqLwoJSU5UICAgICAgICAgICAgICAgIGR4U3JjLCAgIC8qIFtpbl0gKi8KCUlOVCAgICAgICAgICAgICAgICBkeVNyYywgICAvKiBbaW5dICovCglEV09SRCAgICAgICAgICAgICAgZHdSYXRlLCAgLyogW2luXSBmcmFtZXMvc2Vjb25kID0gKGR3UmF0ZS9kd1NjYWxlKSAqLwoJRFdPUkQgICAgICAgICAgICAgIGR3U2NhbGUpIC8qIFtpbl0gKi8KewoKCUlDRFJBV0JFR0lOCWljZGI7CgoJVFJBQ0UoIiglcCwlbGQsJXAsJXAsJXAsJXUsJXUsJXUsJXUsJXAsJXUsJXUsJXUsJXUsJWxkLCVsZClcbiIsCgkJICBoaWMsIGR3RmxhZ3MsIGhwYWwsIGh3bmQsIGhkYywgeERzdCwgeURzdCwgZHhEc3QsIGR5RHN0LAoJCSAgbHBiaSwgeFNyYywgeVNyYywgZHhTcmMsIGR5U3JjLCBkd1JhdGUsIGR3U2NhbGUpOwoKCWljZGIuZHdGbGFncyA9IGR3RmxhZ3M7CglpY2RiLmhwYWwgPSBocGFsOwoJaWNkYi5od25kID0gaHduZDsKCWljZGIuaGRjID0gaGRjOwoJaWNkYi54RHN0ID0geERzdDsKCWljZGIueURzdCA9IHlEc3Q7CglpY2RiLmR4RHN0ID0gZHhEc3Q7CglpY2RiLmR5RHN0ID0gZHlEc3Q7CglpY2RiLmxwYmkgPSBscGJpOwoJaWNkYi54U3JjID0geFNyYzsKCWljZGIueVNyYyA9IHlTcmM7CglpY2RiLmR4U3JjID0gZHhTcmM7CglpY2RiLmR5U3JjID0gZHlTcmM7CglpY2RiLmR3UmF0ZSA9IGR3UmF0ZTsKCWljZGIuZHdTY2FsZSA9IGR3U2NhbGU7CglyZXR1cm4gSUNTZW5kTWVzc2FnZShoaWMsSUNNX0RSQVdfQkVHSU4sKERXT1JEX1BUUikmaWNkYixzaXplb2YoaWNkYikpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlDRHJhdwkJCVtNU1ZGVzMyLkBdCiAqLwpEV09SRCBWRldBUElWIElDRHJhdyhISUMgaGljLCBEV09SRCBkd0ZsYWdzLCBMUFZPSUQgbHBGb3JtYXQsIExQVk9JRCBscERhdGEsIERXT1JEIGNiRGF0YSwgTE9ORyBsVGltZSkgewoJSUNEUkFXCWljZDsKCglUUkFDRSgiKCVwLCVsZCwlcCwlcCwlbGQsJWxkKVxuIixoaWMsZHdGbGFncyxscEZvcm1hdCxscERhdGEsY2JEYXRhLGxUaW1lKTsKCglpY2QuZHdGbGFncyA9IGR3RmxhZ3M7CglpY2QubHBGb3JtYXQgPSBscEZvcm1hdDsKCWljZC5scERhdGEgPSBscERhdGE7CglpY2QuY2JEYXRhID0gY2JEYXRhOwoJaWNkLmxUaW1lID0gbFRpbWU7CgoJcmV0dXJuIElDU2VuZE1lc3NhZ2UoaGljLElDTV9EUkFXLChEV09SRF9QVFIpJmljZCxzaXplb2YoaWNkKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNDbG9zZQkJCVtNU1ZGVzMyLkBdCiAqLwpMUkVTVUxUIFdJTkFQSSBJQ0Nsb3NlKEhJQyBoaWMpCnsKICAgIFdJTkVfSElDKiB3aGljID0gTVNWSURFT19HZXRIaWNQdHIoaGljKTsKICAgIFdJTkVfSElDKiogcDsKCiAgICBUUkFDRSgiKCVwKVxuIixoaWMpOwoKICAgIGlmICghd2hpYykgcmV0dXJuIElDRVJSX0JBREhBTkRMRTsKCiAgICBpZiAod2hpYy0+ZHJpdmVycHJvYykgCiAgICB7CiAgICAgICAgTVNWSURFT19TZW5kTWVzc2FnZSh3aGljLCBEUlZfQ0xPU0UsIDAsIDApOwogICAgICAgIE1TVklERU9fU2VuZE1lc3NhZ2Uod2hpYywgRFJWX0RJU0FCTEUsIDAsIDApOwogICAgICAgIE1TVklERU9fU2VuZE1lc3NhZ2Uod2hpYywgRFJWX0ZSRUUsIDAsIDApOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIENsb3NlRHJpdmVyKHdoaWMtPmhkcnYsIDAsIDApOwogICAgfQoKICAgIC8qIHJlbW92ZSB3aGljIGZyb20gbGlzdCAqLwogICAgZm9yIChwID0gJk1TVklERU9fRmlyc3RIaWM7ICpwICE9IE5VTEw7IHAgPSAmKCgqcCktPm5leHQpKQogICAgewogICAgICAgIGlmICgoKnApID09IHdoaWMpCiAgICAgICAgewogICAgICAgICAgICAqcCA9IHdoaWMtPm5leHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3aGljKTsKICAgIHJldHVybiAwOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNJbWFnZUNvbXByZXNzCVtNU1ZGVzMyLkBdCiAqLwpIQU5ETEUgVkZXQVBJIElDSW1hZ2VDb21wcmVzcygKCUhJQyBoaWMsIFVJTlQgdWlGbGFncywKCUxQQklUTUFQSU5GTyBscGJpSW4sIExQVk9JRCBscEJpdHMsCglMUEJJVE1BUElORk8gbHBiaU91dCwgTE9ORyBsUXVhbGl0eSwKCUxPTkcqIHBsU2l6ZSkKewoJRklYTUUoIiglcCwlMDh4LCVwLCVwLCVwLCVsZCwlcClcbiIsCgkJaGljLCB1aUZsYWdzLCBscGJpSW4sIGxwQml0cywgbHBiaU91dCwgbFF1YWxpdHksIHBsU2l6ZSk7CgoJcmV0dXJuIE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSUNJbWFnZURlY29tcHJlc3MJW01TVkZXMzIuQF0KICovCgpIQU5ETEUgVkZXQVBJIElDSW1hZ2VEZWNvbXByZXNzKAoJSElDIGhpYywgVUlOVCB1aUZsYWdzLCBMUEJJVE1BUElORk8gbHBiaUluLAoJTFBWT0lEIGxwQml0cywgTFBCSVRNQVBJTkZPIGxwYmlPdXQpCnsKCUhHTE9CQUwJaE1lbSA9IE5VTEw7CglCWVRFKglwTWVtID0gTlVMTDsKCUJPT0wJYlJlbGVhc2VJQyA9IEZBTFNFOwoJQllURSoJcEhkciA9IE5VTEw7CglVTE9ORwljYkhkciA9IDA7CglCT09MCWJTdWNjZWVkZWQgPSBGQUxTRTsKCUJPT0wJYkluRGVjb21wcmVzcyA9IEZBTFNFOwoJRFdPUkQJYmlTaXplSW1hZ2U7CgoJVFJBQ0UoIiglcCwlMDh4LCVwLCVwLCVwKVxuIiwKCQloaWMsIHVpRmxhZ3MsIGxwYmlJbiwgbHBCaXRzLCBscGJpT3V0KTsKCglpZiAoIGhpYyA9PSBOVUxMICkKCXsKCQloaWMgPSBJQ0RlY29tcHJlc3NPcGVuKCBJQ1RZUEVfVklERU8sIDAsICZscGJpSW4tPmJtaUhlYWRlciwgKGxwYmlPdXQgIT0gTlVMTCkgPyAmbHBiaU91dC0+Ym1pSGVhZGVyIDogTlVMTCApOwoJCWlmICggaGljID09IE5VTEwgKQoJCXsKCQkJV0FSTigibm8gaGFuZGxlclxuIiApOwoJCQlnb3RvIGVycjsKCQl9CgkJYlJlbGVhc2VJQyA9IFRSVUU7Cgl9CglpZiAoIHVpRmxhZ3MgIT0gMCApCgl7CgkJRklYTUUoICJ1bmtub3duIGZsYWcgJTA4eFxuIiwgdWlGbGFncyApOwoJCWdvdG8gZXJyOwoJfQoJaWYgKCBscGJpSW4gPT0gTlVMTCB8fCBscEJpdHMgPT0gTlVMTCApCgl7CgkJV0FSTigiaW52YWxpZCBhcmd1bWVudFxuIik7CgkJZ290byBlcnI7Cgl9CgoJaWYgKCBscGJpT3V0ICE9IE5VTEwgKQoJewoJCWlmICggbHBiaU91dC0+Ym1pSGVhZGVyLmJpU2l6ZSAhPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKQoJCQlnb3RvIGVycjsKCQljYkhkciA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKCQlpZiAoIGxwYmlPdXQtPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID09IDMgKQoJCQljYkhkciArPSBzaXplb2YoRFdPUkQpKjM7CgkJZWxzZQoJCWlmICggbHBiaU91dC0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPD0gOCApCgkJewoJCQlpZiAoIGxwYmlPdXQtPmJtaUhlYWRlci5iaUNsclVzZWQgPT0gMCApCgkJCQljYkhkciArPSBzaXplb2YoUkdCUVVBRCkgKiAoMTw8bHBiaU91dC0+Ym1pSGVhZGVyLmJpQml0Q291bnQpOwoJCQllbHNlCgkJCQljYkhkciArPSBzaXplb2YoUkdCUVVBRCkgKiBscGJpT3V0LT5ibWlIZWFkZXIuYmlDbHJVc2VkOwoJCX0KCX0KCWVsc2UKCXsKCQlUUkFDRSggImdldCBmb3JtYXRcbiIgKTsKCgkJY2JIZHIgPSBJQ0RlY29tcHJlc3NHZXRGb3JtYXRTaXplKGhpYyxscGJpSW4pOwoJCWlmICggY2JIZHIgPCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKQoJCQlnb3RvIGVycjsKCQlwSGRyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxjYkhkcitzaXplb2YoUkdCUVVBRCkqMjU2KTsKCQlpZiAoIHBIZHIgPT0gTlVMTCApCgkJCWdvdG8gZXJyOwoJCVplcm9NZW1vcnkoIHBIZHIsIGNiSGRyK3NpemVvZihSR0JRVUFEKSoyNTYgKTsKCQlpZiAoIElDRGVjb21wcmVzc0dldEZvcm1hdCggaGljLCBscGJpSW4sIChCSVRNQVBJTkZPKilwSGRyICkgIT0gSUNFUlJfT0sgKQoJCQlnb3RvIGVycjsKCQlscGJpT3V0ID0gKEJJVE1BUElORk8qKXBIZHI7CgkJaWYgKCBscGJpT3V0LT5ibWlIZWFkZXIuYmlCaXRDb3VudCA8PSA4ICYmCgkJCSBJQ0RlY29tcHJlc3NHZXRQYWxldHRlKCBoaWMsIGxwYmlJbiwgbHBiaU91dCApICE9IElDRVJSX09LICYmCgkJCSBscGJpSW4tPmJtaUhlYWRlci5iaUJpdENvdW50ID09IGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50ICkKCQl7CgkJCWlmICggbHBiaUluLT5ibWlIZWFkZXIuYmlDbHJVc2VkID09IDAgKQoJCQkJbWVtY3B5KCBscGJpT3V0LT5ibWlDb2xvcnMsIGxwYmlJbi0+Ym1pQ29sb3JzLCBzaXplb2YoUkdCUVVBRCkqKDE8PGxwYmlPdXQtPmJtaUhlYWRlci5iaUJpdENvdW50KSApOwoJCQllbHNlCgkJCQltZW1jcHkoIGxwYmlPdXQtPmJtaUNvbG9ycywgbHBiaUluLT5ibWlDb2xvcnMsIHNpemVvZihSR0JRVUFEKSpscGJpSW4tPmJtaUhlYWRlci5iaUNsclVzZWQgKTsKCQl9CgkJaWYgKCBscGJpT3V0LT5ibWlIZWFkZXIuYmlCaXRDb3VudCA8PSA4ICYmCgkJCSBscGJpT3V0LT5ibWlIZWFkZXIuYmlDbHJVc2VkID09IDAgKQoJCQlscGJpT3V0LT5ibWlIZWFkZXIuYmlDbHJVc2VkID0gMTw8bHBiaU91dC0+Ym1pSGVhZGVyLmJpQml0Q291bnQ7CgoJCWxwYmlPdXQtPmJtaUhlYWRlci5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7CgkJY2JIZHIgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyBzaXplb2YoUkdCUVVBRCkqbHBiaU91dC0+Ym1pSGVhZGVyLmJpQ2xyVXNlZDsKCX0KCgliaVNpemVJbWFnZSA9IGxwYmlPdXQtPmJtaUhlYWRlci5iaVNpemVJbWFnZTsKCWlmICggYmlTaXplSW1hZ2UgPT0gMCApCgkJYmlTaXplSW1hZ2UgPSAoKCgobHBiaU91dC0+Ym1pSGVhZGVyLmJpV2lkdGggKiBscGJpT3V0LT5ibWlIZWFkZXIuYmlCaXRDb3VudCArIDcpID4+IDMpICsgMykgJiAofjMpKSAqIGFicyhscGJpT3V0LT5ibWlIZWFkZXIuYmlIZWlnaHQpOwoKCVRSQUNFKCAiY2FsbCBJQ0RlY29tcHJlc3NCZWdpblxuIiApOwoKCWlmICggSUNEZWNvbXByZXNzQmVnaW4oIGhpYywgbHBiaUluLCBscGJpT3V0ICkgIT0gSUNFUlJfT0sgKQoJCWdvdG8gZXJyOwoJYkluRGVjb21wcmVzcyA9IFRSVUU7CgoJVFJBQ0UoICJjYkhkciAlbGQsIGJpU2l6ZUltYWdlICVsZFxuIiwgY2JIZHIsIGJpU2l6ZUltYWdlICk7CgoJaE1lbSA9IEdsb2JhbEFsbG9jKCBHTUVNX01PVkVBQkxFfEdNRU1fWkVST0lOSVQsIGNiSGRyICsgYmlTaXplSW1hZ2UgKTsKCWlmICggaE1lbSA9PSBOVUxMICkKCXsKCQlXQVJOKCAib3V0IG9mIG1lbW9yeVxuIiApOwoJCWdvdG8gZXJyOwoJfQoJcE1lbSA9IChCWVRFKilHbG9iYWxMb2NrKCBoTWVtICk7CglpZiAoIHBNZW0gPT0gTlVMTCApCgkJZ290byBlcnI7CgltZW1jcHkoIHBNZW0sIGxwYmlPdXQsIGNiSGRyICk7CgoJVFJBQ0UoICJjYWxsIElDRGVjb21wcmVzc1xuIiApOwoJaWYgKCBJQ0RlY29tcHJlc3MoIGhpYywgMCwgJmxwYmlJbi0+Ym1pSGVhZGVyLCBscEJpdHMsICZscGJpT3V0LT5ibWlIZWFkZXIsIHBNZW0rY2JIZHIgKSAhPSBJQ0VSUl9PSyApCgkJZ290byBlcnI7CgoJYlN1Y2NlZWRlZCA9IFRSVUU7CmVycjoKCWlmICggYkluRGVjb21wcmVzcyApCgkJSUNEZWNvbXByZXNzRW5kKCBoaWMgKTsKCWlmICggYlJlbGVhc2VJQyApCgkJSUNDbG9zZShoaWMpOwogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxwSGRyKTsKCWlmICggcE1lbSAhPSBOVUxMICkKCQlHbG9iYWxVbmxvY2soIGhNZW0gKTsKCWlmICggIWJTdWNjZWVkZWQgJiYgaE1lbSAhPSBOVUxMICkKCXsKCQlHbG9iYWxGcmVlKGhNZW0pOyBoTWVtID0gTlVMTDsKCX0KCglyZXR1cm4gKEhBTkRMRSloTWVtOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBJQ1NlcUNvbXByZXNzRnJhbWUgICBbTVNWRlczMi5AXQogKi8KTFBWT0lEIFZGV0FQSSBJQ1NlcUNvbXByZXNzRnJhbWUoUENPTVBWQVJTIHBjLCBVSU5UIHVpRmxhZ3MsIExQVk9JRCBscEJpdHMsIEJPT0wgKnBmS2V5LCBMT05HICpwbFNpemUpCnsKICAgIElDQ09NUFJFU1MqIGljQ29tcCA9IChJQ0NPTVBSRVNTICopcGMtPmxwU3RhdGU7CiAgICBEV09SRCByZXQ7CiAgICBUUkFDRSgiKCVwLCAweCUwOHgsICVwLCAlcCwgJXApXG4iLCBwYywgdWlGbGFncywgbHBCaXRzLCBwZktleSwgcGxTaXplKTsKCiAgICBpZiAocGMtPmNiU3RhdGUgIT0gc2l6ZW9mKElDQ09NUFJFU1MpKQogICAgewogICAgICAgRVJSKCJJbnZhbGlkIGNiU3RhdGUgKCVsaSBzaG91bGQgYmUgJWkpXG4iLCBwYy0+Y2JTdGF0ZSwgc2l6ZW9mKElDQ09NUFJFU1MpKTsKICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmICghcGMtPmxLZXlDb3VudCsrKQogICAgICAgaWNDb21wLT5kd0ZsYWdzID0gSUNDT01QUkVTU19LRVlGUkFNRTsKICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAocGMtPmxLZXkgJiYgcGMtPmxLZXlDb3VudCA9PSAocGMtPmxLZXkgLSAxKSkKICAgICAgICAvKiBObyBrZXkgZnJhbWVzIGlmIHBjLT5sS2V5ID09IDAgKi8KICAgICAgICAgICBwYy0+bEtleUNvdW50ID0gMDsKCWljQ29tcC0+ZHdGbGFncyA9IDA7CiAgICB9CgogICAgaWNDb21wLT5scElucHV0ID0gbHBCaXRzOwogICAgaWNDb21wLT5sRnJhbWVOdW0gPSBwYy0+bEZyYW1lKys7CiAgICBpY0NvbXAtPmxwT3V0cHV0ID0gcGMtPmxwQml0c091dDsKICAgIGljQ29tcC0+bHBQcmV2ID0gcGMtPmxwQml0c1ByZXY7CiAgICByZXQgPSBJQ1NlbmRNZXNzYWdlKHBjLT5oaWMsIElDTV9DT01QUkVTUywgKERXT1JEX1BUUilpY0NvbXAsIHNpemVvZihpY0NvbXApKTsKCiAgICBpZiAoaWNDb21wLT5kd0ZsYWdzICYgQVZJSUZfS0VZRlJBTUUpCiAgICB7CiAgICAgICBwYy0+bEtleUNvdW50ID0gMTsKICAgICAgICpwZktleSA9IFRSVUU7CiAgICAgICBUUkFDRSgiS2V5IGZyYW1lXG4iKTsKICAgIH0KICAgIGVsc2UKICAgICAgICpwZktleSA9IEZBTFNFOwoKICAgICpwbFNpemUgPSBpY0NvbXAtPmxwYmlPdXRwdXQtPmJpU2l6ZUltYWdlOwogICAgVFJBQ0UoIiAtLSAweCUwOGx4XG4iLCByZXQpOwogICAgaWYgKHJldCA9PSBJQ0VSUl9PSykKICAgIHsKICAgICAgIExQVk9JRCBvbGRwcmV2LCBvbGRvdXQ7Ci8qIFdlIHNoaWZ0IFByZXYgYW5kIE91dCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBhbGxvY2F0ZSBhbmQgcmVsZWFzZSBtZW1vcnkgKi8KICAgICAgIG9sZHByZXYgPSBwYy0+bHBCaXRzUHJldjsKICAgICAgIG9sZG91dCA9IHBjLT5scEJpdHNPdXQ7CiAgICAgICBwYy0+bHBCaXRzUHJldiA9IG9sZG91dDsKICAgICAgIHBjLT5scEJpdHNPdXQgPSBvbGRwcmV2OwoKICAgICAgIFRSQUNFKCJyZXR1cm5pbmc6ICVwXG4iLCBpY0NvbXAtPmxwT3V0cHV0KTsKICAgICAgIHJldHVybiBpY0NvbXAtPmxwT3V0cHV0OwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIElDU2VxQ29tcHJlc3NGcmFtZUVuZCAgIFtNU1ZGVzMyLkBdCiAqLwp2b2lkIFZGV0FQSSBJQ1NlcUNvbXByZXNzRnJhbWVFbmQoUENPTVBWQVJTIHBjKQp7CiAgICBEV09SRCByZXQ7CiAgICBUUkFDRSgiKCVwKVxuIiwgcGMpOwogICAgcmV0ID0gSUNTZW5kTWVzc2FnZShwYy0+aGljLCBJQ01fQ09NUFJFU1NfRU5ELCAwLCAwKTsKICAgIFRSQUNFKCIgLS0gJWx4IiwgcmV0KTsKICAgIGlmIChwYy0+bHBiaUluKQogICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcGMtPmxwYmlJbik7CiAgICBpZiAocGMtPmxwQml0c1ByZXYpCiAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwYy0+bHBCaXRzUHJldik7CiAgICBpZiAocGMtPmxwQml0c091dCkKICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHBjLT5scEJpdHNPdXQpOwogICAgaWYgKHBjLT5scFN0YXRlKQogICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcGMtPmxwU3RhdGUpOwogICAgcGMtPmxwYmlJbiA9IHBjLT5scEJpdHNQcmV2ID0gcGMtPmxwQml0c091dCA9IHBjLT5scFN0YXRlID0gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgSUNTZXFDb21wcmVzc0ZyYW1lU3RhcnQgW01TVkZXMzIuQF0KICovCkJPT0wgVkZXQVBJIElDU2VxQ29tcHJlc3NGcmFtZVN0YXJ0KFBDT01QVkFSUyBwYywgTFBCSVRNQVBJTkZPIGxwYmlJbikKewogICAgLyogSSdtIGlnbm9yaW5nIGJtaUNvbG9ycyBhcyBJIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIGl0LAogICAgICogaXQgZG9lc24ndCBhcHBlYXIgdG8gYmUgdXNlZCB0aG91Z2gKICAgICAqLwogICAgRFdPUkQgcmV0OwogICAgcGMtPmxwYmlJbiA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoQklUTUFQSU5GTykpOwogICAgaWYgKCFwYy0+bHBiaUluKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICBtZW1jcHkocGMtPmxwYmlJbiwgbHBiaUluLCBzaXplb2YoQklUTUFQSU5GTykpOwogICAgcGMtPmxwQml0c1ByZXYgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcGMtPmxwYmlJbi0+Ym1pSGVhZGVyLmJpU2l6ZUltYWdlKTsKICAgIGlmICghcGMtPmxwQml0c1ByZXYpCiAgICB7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcGMtPmxwYmlJbik7CglyZXR1cm4gRkFMU0U7CiAgICB9CgogICAgcGMtPmxwU3RhdGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKElDQ09NUFJFU1MpKTsKICAgIGlmICghcGMtPmxwU3RhdGUpCiAgICB7CiAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwYy0+bHBiaUluKTsKICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHBjLT5scEJpdHNQcmV2KTsKICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIHBjLT5jYlN0YXRlID0gc2l6ZW9mKElDQ09NUFJFU1MpOwoKICAgIHBjLT5scEJpdHNPdXQgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcGMtPmxwYmlPdXQtPmJtaUhlYWRlci5iaVNpemVJbWFnZSk7CiAgICBpZiAoIXBjLT5scEJpdHNPdXQpCiAgICB7CiAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwYy0+bHBiaUluKTsKICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHBjLT5scEJpdHNQcmV2KTsKICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHBjLT5scFN0YXRlKTsKICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIFRSQUNFKCJDb21wdmFyczpcbiIKCSAgIlx0cGM6XG4iCgkgICJcdHNpemU6ICVsaVxuIgoJICAiXHRmbGFnczogJWxpXG4iCgkgICJcdGhpYzogJXBcbiIKCSAgIlx0dHlwZTogJWx4XG4iCgkgICJcdGhhbmRsZXI6ICVseFxuIgoJICAiXHRpbi9vdXQ6ICVwLyVwXG4iCgkgICJrZXkvZGF0YS9xdWFsaXR5OiAlbGkvJWxpLyVsaVxuIiwKCSAgICAgcGMtPmNiU2l6ZSwgcGMtPmR3RmxhZ3MsIHBjLT5oaWMsIHBjLT5mY2NUeXBlLCBwYy0+ZmNjSGFuZGxlciwKCSAgICAgcGMtPmxwYmlJbiwgcGMtPmxwYmlPdXQsIHBjLT5sS2V5LCBwYy0+bERhdGFSYXRlLCBwYy0+bFEpOwoKICAgIHJldCA9IElDU2VuZE1lc3NhZ2UocGMtPmhpYywgSUNNX0NPTVBSRVNTX0JFR0lOLCAoRFdPUkRfUFRSKXBjLT5scGJpSW4sIChEV09SRF9QVFIpcGMtPmxwYmlPdXQpOwogICAgVFJBQ0UoIiAtLSAlbHhcbiIsIHJldCk7CiAgICBpZiAocmV0ID09IElDRVJSX09LKQogICAgewogICAgICAgSUNDT01QUkVTUyogaWNDb21wID0gKElDQ09NUFJFU1MgKilwYy0+bHBTdGF0ZTsKICAgICAgIC8qIEluaXRpYWxpc2Ugc29tZSB2YXJpYWJsZXMgKi8KICAgICAgIHBjLT5sRnJhbWUgPSAwOyBwYy0+bEtleUNvdW50ID0gMDsKCiAgICAgICBpY0NvbXAtPmxwYmlPdXRwdXQgPSAmcGMtPmxwYmlPdXQtPmJtaUhlYWRlcjsKICAgICAgIGljQ29tcC0+bHBiaUlucHV0ID0gJnBjLT5scGJpSW4tPmJtaUhlYWRlcjsKICAgICAgIGljQ29tcC0+bHBja2lkID0gTlVMTDsKICAgICAgIGljQ29tcC0+ZHdGcmFtZVNpemUgPSAwOwogICAgICAgaWNDb21wLT5kd1F1YWxpdHkgPSBwYy0+bFE7CiAgICAgICBpY0NvbXAtPmxwYmlQcmV2ID0gJnBjLT5scGJpSW4tPmJtaUhlYWRlcjsKICAgICAgIHJldHVybiBUUlVFOwogICAgfQogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcGMtPmxwYmlJbik7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwYy0+bHBCaXRzUHJldik7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwYy0+bHBTdGF0ZSk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwYy0+bHBCaXRzT3V0KTsKICAgIHBjLT5scEJpdHNQcmV2ID0gcGMtPmxwYmlJbiA9IHBjLT5scFN0YXRlID0gcGMtPmxwQml0c091dCA9IE5VTEw7CiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEdldEZpbGVOYW1lUHJldmlldyAgIFtNU1ZGVzMyLkBdCiAqLwpzdGF0aWMgQk9PTCBHZXRGaWxlTmFtZVByZXZpZXcoTFBWT0lEIGxwb2ZuLEJPT0wgYlNhdmUsQk9PTCBiVW5pY29kZSkKewogIENIQVIgICAgc3pGdW5jdGlvbk5hbWVbMjBdOwogIEJPT0wgICAgKCpmbkdldEZpbGVOYW1lKShMUFZPSUQpOwogIEhNT0RVTEUgaENvbWRsZzMyOwogIEJPT0wgICAgcmV0OwoKICBGSVhNRSgiKCVwLCVkLCVkKSwgc2VtaS1zdHViIVxuIixscG9mbixiU2F2ZSxiVW5pY29kZSk7CgogIGxzdHJjcHlBKHN6RnVuY3Rpb25OYW1lLCAoYlNhdmUgPyAiR2V0U2F2ZUZpbGVOYW1lIiA6ICJHZXRPcGVuRmlsZU5hbWUiKSk7CiAgbHN0cmNhdEEoc3pGdW5jdGlvbk5hbWUsIChiVW5pY29kZSA/ICJXIiA6ICJBIikpOwoKICBoQ29tZGxnMzIgPSBMb2FkTGlicmFyeUEoIkNPTURMRzMyLkRMTCIpOwogIGlmIChoQ29tZGxnMzIgPT0gTlVMTCkKICAgIHJldHVybiBGQUxTRTsKCiAgZm5HZXRGaWxlTmFtZSA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaENvbWRsZzMyLCBzekZ1bmN0aW9uTmFtZSk7CiAgaWYgKGZuR2V0RmlsZU5hbWUgPT0gTlVMTCkKICAgIHJldHVybiBGQUxTRTsKCiAgLyogRklYTUU6IG5lZWQgdG8gYWRkIE9GTl9FTkFCTEVIT09LIGFuZCBvdXIgb3duIGhhbmRsZXIgKi8KICByZXQgPSBmbkdldEZpbGVOYW1lKGxwb2ZuKTsKCiAgRnJlZUxpYnJhcnkoaENvbWRsZzMyKTsKICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldE9wZW5GaWxlTmFtZVByZXZpZXdBCVtNU1ZGVzMyLkBdCiAqLwpCT09MIFdJTkFQSSBHZXRPcGVuRmlsZU5hbWVQcmV2aWV3QShMUE9QRU5GSUxFTkFNRUEgbHBvZm4pCnsKICBGSVhNRSgiKCVwKSwgc2VtaS1zdHViIVxuIiwgbHBvZm4pOwoKICByZXR1cm4gR2V0RmlsZU5hbWVQcmV2aWV3KGxwb2ZuLCBGQUxTRSwgRkFMU0UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldE9wZW5GaWxlTmFtZVByZXZpZXdXCVtNU1ZGVzMyLkBdCiAqLwpCT09MIFdJTkFQSSBHZXRPcGVuRmlsZU5hbWVQcmV2aWV3VyhMUE9QRU5GSUxFTkFNRVcgbHBvZm4pCnsKICBGSVhNRSgiKCVwKSwgc2VtaS1zdHViIVxuIiwgbHBvZm4pOwoKICByZXR1cm4gR2V0RmlsZU5hbWVQcmV2aWV3KGxwb2ZuLCBGQUxTRSwgVFJVRSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U2F2ZUZpbGVOYW1lUHJldmlld0EJW01TVkZXMzIuQF0KICovCkJPT0wgV0lOQVBJIEdldFNhdmVGaWxlTmFtZVByZXZpZXdBKExQT1BFTkZJTEVOQU1FQSBscG9mbikKewogIEZJWE1FKCIoJXApLCBzZW1pLXN0dWIhXG4iLCBscG9mbik7CgogIHJldHVybiBHZXRGaWxlTmFtZVByZXZpZXcobHBvZm4sIFRSVUUsIEZBTFNFKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTYXZlRmlsZU5hbWVQcmV2aWV3VwlbTVNWRlczMi5AXQogKi8KQk9PTCBXSU5BUEkgR2V0U2F2ZUZpbGVOYW1lUHJldmlld1coTFBPUEVORklMRU5BTUVXIGxwb2ZuKQp7CiAgRklYTUUoIiglcCksIHNlbWktc3R1YiFcbiIsIGxwb2ZuKTsKCiAgcmV0dXJuIEdldEZpbGVOYW1lUHJldmlldyhscG9mbiwgVFJVRSwgVFJVRSk7Cn0K