LyoKICogU0hMV0FQSSBvcmRpbmFsIGZ1bmN0aW9ucwogKgogKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKICogICAgICAgICAgIDE5OTggSvxyZ2VuIFNjaG1pZWQKICogICAgICAgICAgIDIwMDEgSm9uIEdyaWZmaXRocwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAiZG9jb2JqLmgiCiNpbmNsdWRlICJzaGxndWlkLmgiCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAiZGRlbWwuaCIKI2luY2x1ZGUgInNobG9iai5oIgojaW5jbHVkZSAic2hlbGxhcGkuaCIKI2luY2x1ZGUgImNvbW1kbGcuaCIKI2luY2x1ZGUgIndpbmUvdW5pY29kZS5oIgojaW5jbHVkZSAid2luZS9vYmpfc2VydmljZXByb3ZpZGVyLmgiCiNpbmNsdWRlICJ3aW5lL29ial9jb250cm9sLmgiCiNpbmNsdWRlICJ3aW5lL29ial9jb25uZWN0aW9uLmgiCiNpbmNsdWRlICJ3aW5lL29ial9wcm9wZXJ0eS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKI2luY2x1ZGUgInNobHdhcGkuaCIKCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChzaGVsbCk7CgovKiBHZXQgYSBmdW5jdGlvbiBwb2ludGVyIGZyb20gYSBETEwgaGFuZGxlICovCiNkZWZpbmUgR0VUX0ZVTkMoZnVuYywgbW9kdWxlLCBuYW1lLCBmYWlsKSBcCiAgZG8geyBcCiAgICBpZiAoIWZ1bmMpIHsgXAogICAgICBpZiAoIVNITFdBUElfaCMjbW9kdWxlICYmICEoU0hMV0FQSV9oIyNtb2R1bGUgPSBMb2FkTGlicmFyeUEoI21vZHVsZSAiLmRsbCIpKSkgcmV0dXJuIGZhaWw7IFwKICAgICAgaWYgKCEoZnVuYyA9ICh2b2lkKilHZXRQcm9jQWRkcmVzcyhTSExXQVBJX2gjI21vZHVsZSwgbmFtZSkpKSByZXR1cm4gZmFpbDsgXAogICAgfSBcCiAgfSB3aGlsZSAoMCkKCi8qIERMTCBoYW5kbGVzIGZvciBsYXRlIGJvdW5kIGNhbGxzICovCmV4dGVybiBISU5TVEFOQ0Ugc2hsd2FwaV9oSW5zdGFuY2U7CmV4dGVybiBITU9EVUxFIFNITFdBUElfaHNoZWxsMzI7CmV4dGVybiBITU9EVUxFIFNITFdBUElfaHdpbm1tOwpleHRlcm4gSE1PRFVMRSBTSExXQVBJX2hjb21kbGczMjsKZXh0ZXJuIEhNT0RVTEUgU0hMV0FQSV9oY29tY3RsMzI7CmV4dGVybiBITU9EVUxFIFNITFdBUElfaG1wcjsKZXh0ZXJuIEhNT0RVTEUgU0hMV0FQSV9obWxhbmc7CmV4dGVybiBITU9EVUxFIFNITFdBUElfaHZlcnNpb247CgpleHRlcm4gRFdPUkQgU0hMV0FQSV9UaHJlYWRSZWZfaW5kZXg7Cgp0eXBlZGVmIEhBTkRMRSBIU0hBUkVEOyAvKiBTaGFyZWQgbWVtb3J5ICovCgovKiBmb2xsb3dpbmcgaXMgR1VJRCBmb3IgSU9iamVjdFdpdGhTaXRlOjpTZXRTaXRlICAtLSBzZWUgXzE3NCAgICAgICAgICAgKi8Kc3RhdGljIERXT1JEIGlkMVs0XSA9IHsweGZjNDgwMWEzLCAweDExY2YyYmE5LCAweGFhMDAyOWEyLCAweDUyNzMzZDAwfTsKLyogZm9sbG93aW5nIGlzIEdVSUQgZm9yIElQZXJzaXN0TW9uaWtlcjo6R2V0Q2xhc3NJRCAgLS0gc2VlIF8xNzQgICAgICAgICovCnN0YXRpYyBEV09SRCBpZDJbNF0gPSB7MHg3OWVhYzllZSwgMHgxMWNlYmFmOSwgMHhhYTAwODI4YywgMHgwYmE5NGIwMH07CgovKiBGdW5jdGlvbiBwb2ludGVycyBmb3IgR0VUX0ZVTkMgbWFjcm87IHRoZXNlIG5lZWQgdG8gYmUgZ2xvYmFsIGJlY2F1c2Ugb2YgZ2NjIGJ1ZyAqLwpzdGF0aWMgTFBJVEVNSURMSVNUIChXSU5BUEkgKnBTSEJyb3dzZUZvckZvbGRlclcpKExQQlJPV1NFSU5GT1cpOwpzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpwQ29udmVydElOZXRVbmljb2RlVG9NdWx0aUJ5dGUpKExQRFdPUkQsRFdPUkQsTFBDV1NUUixMUElOVCxMUFNUUixMUElOVCk7CnN0YXRpYyBCT09MICAgIChXSU5BUEkgKnBQbGF5U291bmRXKShMUENXU1RSLCBITU9EVUxFLCBEV09SRCk7CnN0YXRpYyBEV09SRCAgIChXSU5BUEkgKnBTSEdldEZpbGVJbmZvVykoTFBDV1NUUixEV09SRCxTSEZJTEVJTkZPVyosVUlOVCxVSU5UKTsKc3RhdGljIFVJTlQgICAgKFdJTkFQSSAqcERyYWdRdWVyeUZpbGVXKShIRFJPUCwgVUlOVCwgTFBXU1RSLCBVSU5UKTsKc3RhdGljIEJPT0wgICAgKFdJTkFQSSAqcFNIR2V0UGF0aEZyb21JRExpc3RXKShMUENJVEVNSURMSVNULCBMUFdTVFIpOwpzdGF0aWMgQk9PTCAgICAoV0lOQVBJICpwU2hlbGxFeGVjdXRlRXhXKShMUFNIRUxMRVhFQ1VURUlORk9XKTsKc3RhdGljIEhJQ09OICAgKFdJTkFQSSAqcFNIRmlsZU9wZXJhdGlvblcpKExQU0hGSUxFT1BTVFJVQ1RXKTsKc3RhdGljIEhJQ09OICAgKFdJTkFQSSAqcEV4dHJhY3RJY29uRXhXKShMUENXU1RSLCBJTlQsSElDT04gKixISUNPTiAqLCBVSU5UKTsKc3RhdGljIEJPT0wgICAgKFdJTkFQSSAqcFNIR2V0TmV3TGlua0luZm9XKShMUENXU1RSLCBMUENXU1RSLCBMUENXU1RSLCBCT09MKiwgVUlOVCk7CnN0YXRpYyBEV09SRCAgIChXSU5BUEkgKnBTSERlZkV4dHJhY3RJY29uVykoTFBWT0lELCBMUFZPSUQsIExQVk9JRCwgTFBWT0lELCBMUFZPSUQsIExQVk9JRCk7IC8qIEZJWE1FOiBDb3JyZWN0IGFyZ3MgKi8Kc3RhdGljIEhJQ09OICAgKFdJTkFQSSAqcEV4dHJhY3RJY29uVykoSElOU1RBTkNFLCBMUENXU1RSLCBVSU5UKTsKc3RhdGljIEJPT0wgICAgKFdJTkFQSSAqcEdldFNhdmVGaWxlTmFtZVcpKExQT1BFTkZJTEVOQU1FVyk7CnN0YXRpYyBEV09SRCAgIChXSU5BUEkgKnBXTmV0UmVzdG9yZUNvbm5lY3Rpb25XKShMUFZPSUQsIExQVk9JRCk7IC8qIEZJWE1FOiBDb3JyZWN0IGFyZ3MgKi8Kc3RhdGljIERXT1JEICAgKFdJTkFQSSAqcFdOZXRHZXRMYXN0RXJyb3JXKShMUFZPSUQsIExQVk9JRCwgTFBWT0lELCBMUFZPSUQsIExQVk9JRCk7IC8qIEZJWE1FOiBDb3JyZWN0IGFyZ3MgKi8Kc3RhdGljIEJPT0wgICAgKFdJTkFQSSAqcFBhZ2VTZXR1cERsZ1cpKExQUEFHRVNFVFVQRExHVyk7CnN0YXRpYyBCT09MICAgIChXSU5BUEkgKnBQcmludERsZ1cpKExQUFJJTlRETEdXKTsKc3RhdGljIEJPT0wgICAgKFdJTkFQSSAqcEdldE9wZW5GaWxlTmFtZVcpKExQT1BFTkZJTEVOQU1FVyk7CnN0YXRpYyBEV09SRCAgIChXSU5BUEkgKnBHZXRGaWxlVmVyc2lvbkluZm9TaXplVykoTFBDV1NUUixMUERXT1JEKTsKc3RhdGljIEJPT0wgICAgKFdJTkFQSSAqcEdldEZpbGVWZXJzaW9uSW5mb1cpKExQQ1dTVFIsRFdPUkQsRFdPUkQsTFBWT0lEKTsKc3RhdGljIFdPUkQgICAgKFdJTkFQSSAqcFZlclF1ZXJ5VmFsdWVXKShMUFZPSUQsTFBDV1NUUixMUFZPSUQqLFVJTlQqKTsKc3RhdGljIEJPT0wgICAgKFdJTkFQSSAqcENPTUNUTDMyXzQxNykoSERDLElOVCxJTlQsVUlOVCxjb25zdCBSRUNUKixMUENXU1RSLFVJTlQsY29uc3QgSU5UKik7CnN0YXRpYyBIUkVTVUxUIChXSU5BUEkgKnBEbGxHZXRWZXJzaW9uKShETExWRVJTSU9OSU5GTyopOwoKLyoKIE5PVEVTOiBNb3N0IGZ1bmN0aW9ucyBleHBvcnRlZCBieSBvcmRpbmFsIHNlZW0gdG8gYmUgc3VwZXJmbG91cy4KIFRoZSByZWFzb24gZm9yIHRoZXNlIGZ1bmN0aW9ucyB0byBiZSB0aGVyZSBpcyB0byBwcm92aWRlIGEgd3JhcHBlcgogZm9yIHVuaWNvZGUgZnVuY3Rpb25zIHRvIHByb3ZpZGUgdGhlc2UgZnVuY3Rpb25zIG9uIHN5c3RlbXMgd2l0aG91dAogdW5pY29kZSBmdW5jdGlvbnMgZWcuIHdpbjk1L3dpbjk4LiBTaW5jZSB3ZSBoYXZlIHN1Y2ggZnVuY3Rpb25zIHdlIGp1c3QKIGNhbGwgdGhlc2UuIElmIHJ1bm5pbmcgV2luZSB3aXRoIG5hdGl2ZSBETEwncywgc29tZSBsYXRlIGJvdW5kIGNhbGxzIG1heQogZmFpbC4gSG93ZXZlciwgaXRzIGJldHRlciB0byBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgZm9yd2FyZCBETEwKIGFuZCByZWNvbW1lbmQgdGhlIGJ1aWx0aW4gcmF0aGVyIHRoYW4gcmVpbXBsZW1lbnRpbmcgdGhlIGNhbGxzIGhlcmUhCiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSExXQVBJX0R1cFNoYXJlZEhhbmRsZQogKgogKiBJbnRlcm5hbCBpbXBsZW1ldGF0aW9uIG9mIFNITFdBUElfMTEuCiAqLwpzdGF0aWMKSFNIQVJFRCBXSU5BUEkgU0hMV0FQSV9EdXBTaGFyZWRIYW5kbGUoSFNIQVJFRCBoU2hhcmVkLCBEV09SRCBkd0RzdFByb2NJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdTcmNQcm9jSWQsIERXT1JEIGR3QWNjZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd09wdGlvbnMpCnsKICBIQU5ETEUgaERzdCwgaFNyYzsKICBEV09SRCBkd015UHJvY0lkID0gR2V0Q3VycmVudFByb2Nlc3NJZCgpOwogIEhTSEFSRUQgaFJldCA9IChIU0hBUkVEKU5VTEw7CgogIFRSQUNFKCIoJXAsJWxkLCVsZCwlMDhseCwlMDhseClcbiIsIChQVk9JRCloU2hhcmVkLCBkd0RzdFByb2NJZCwgZHdTcmNQcm9jSWQsCiAgICAgICAgZHdBY2Nlc3MsIGR3T3B0aW9ucyk7CgogIC8qIEdldCBkZXN0IHByb2Nlc3MgaGFuZGxlICovCiAgaWYgKGR3RHN0UHJvY0lkID09IGR3TXlQcm9jSWQpCiAgICBoRHN0ID0gR2V0Q3VycmVudFByb2Nlc3MoKTsKICBlbHNlCiAgICBoRHN0ID0gT3BlblByb2Nlc3MoUFJPQ0VTU19EVVBfSEFORExFLCAwLCBkd0RzdFByb2NJZCk7CgogIGlmIChoRHN0KQogIHsKICAgIC8qIEdldCBzcmMgcHJvY2VzcyBoYW5kbGUgKi8KICAgIGlmIChkd1NyY1Byb2NJZCA9PSBkd015UHJvY0lkKQogICAgICBoU3JjID0gR2V0Q3VycmVudFByb2Nlc3MoKTsKICAgIGVsc2UKICAgICAgaFNyYyA9IE9wZW5Qcm9jZXNzKFBST0NFU1NfRFVQX0hBTkRMRSwgMCwgZHdTcmNQcm9jSWQpOwoKICAgIGlmIChoU3JjKQogICAgewogICAgICAvKiBNYWtlIGhhbmRsZSBhdmFpbGFibGUgdG8gZGVzdCBwcm9jZXNzICovCiAgICAgIGlmICghRHVwbGljYXRlSGFuZGxlKGhEc3QsIChIQU5ETEUpaFNoYXJlZCwgaFNyYywgJmhSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3QWNjZXNzLCAwLCBkd09wdGlvbnMgfCBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKQogICAgICAgIGhSZXQgPSAoSFNIQVJFRClOVUxMOwoKICAgICAgaWYgKGR3U3JjUHJvY0lkICE9IGR3TXlQcm9jSWQpCiAgICAgICAgQ2xvc2VIYW5kbGUoaFNyYyk7CiAgICB9CgogICAgaWYgKGR3RHN0UHJvY0lkICE9IGR3TXlQcm9jSWQpCiAgICAgIENsb3NlSGFuZGxlKGhEc3QpOwogIH0KCiAgVFJBQ0UoIlJldHVybmluZyBoYW5kbGUgJXBcbiIsIChQVk9JRCloUmV0KTsKICByZXR1cm4gaFJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQCAgW1NITFdBUEkuN10KICoKICogQ3JlYXRlIGEgYmxvY2sgb2Ygc2hhcmFibGUgbWVtb3J5IGFuZCBpbml0aWFsaXNlIGl0IHdpdGggZGF0YS4KICoKICogUEFSQU1TCiAqIGR3UHJvY0lkIFtJXSBJRCBvZiBwcm9jZXNzIG93bmluZyBkYXRhCiAqIGxwdkRhdGEgIFtJXSBQb2ludGVyIHRvIGRhdGEgdG8gd3JpdGUKICogZHdTaXplICAgW0ldIFNpemUgb2YgZGF0YQogKgogKiBSRVRVUk5TCiAqIFN1Y2Nlc3M6IEEgc2hhcmVkIG1lbW9yeSBoYW5kbGUKICogRmFpbHVyZTogTlVMTAogKgogKiBOT1RFUwogKiBPcmRpbmFscyA3LTExIHByb3ZpZGUgYSBzZXQgb2YgY2FsbHMgdG8gY3JlYXRlIHNoYXJlZCBtZW1vcnkgYmV0d2VlbiBhCiAqIGdyb3VwIG9mIHByb2Nlc3Nlcy4gVGhlIHNoYXJlZCBtZW1vcnkgaXMgdHJlYXRlZCBvcGFxdWVseSBpbiB0aGF0IGl0cyBzaXplCiAqIGlzIG5vdCBleHBvc2VkIHRvIGNsaWVudHMgd2hvIG1hcCBpdC4gVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgc3RvcmluZwogKiB0aGUgc2l6ZSBvZiB0aGUgbWFwIGFzIHRoZSBmaXJzdCBEV09SRCBvZiBtYXBwZWQgZGF0YSwgYW5kIHRoZW4gb2Zmc2V0dGluZwogKiB0aGUgdmlldyBwb2ludGVyIHJldHVybmVkIGJ5IHRoaXMgc2l6ZS4KICoKICogU0hMV0FQSV83L1NITFdBUElfMTAgLSBDcmVhdGUvRGVzdHJveSB0aGUgc2hhcmVkIG1lbW9yeSBoYW5kbGUKICogU0hMV0FQSV84L1NITFdBUElfOSAgLSBHZXQvUmVsZWFzZSBhIHBvaW50ZXIgdG8gdGhlIHNoYXJlZCBkYXRhCiAqIFNITFdBUElfMTEgICAgICAgICAgIC0gSGVscGVyIGZ1bmN0aW9uOyBEdXBsaWNhdGUgY3Jvc3MtcHJvY2VzcyBoYW5kbGVzCiAgICovCkhTSEFSRUQgV0lOQVBJIFNITFdBUElfNyAoRFdPUkQgZHdQcm9jSWQsIERXT1JEIGR3U2l6ZSwgTFBDVk9JRCBscHZEYXRhKQp7CiAgSEFORExFIGhNYXA7CiAgTFBWT0lEIHBNYXBwZWQ7CiAgSFNIQVJFRCBoUmV0ID0gKEhTSEFSRUQpTlVMTDsKCiAgVFJBQ0UoIiglbGQsJXAsJWxkKVxuIiwgZHdQcm9jSWQsIGxwdkRhdGEsIGR3U2l6ZSk7CgogIC8qIENyZWF0ZSBmaWxlIG1hcHBpbmcgb2YgdGhlIGNvcnJlY3QgbGVuZ3RoICovCiAgaE1hcCA9IENyZWF0ZUZpbGVNYXBwaW5nQShJTlZBTElEX0hBTkRMRV9WQUxVRSwgTlVMTCwgRklMRV9NQVBfUkVBRCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U2l6ZSArIHNpemVvZihkd1NpemUpLCBOVUxMKTsKICBpZiAoIWhNYXApCiAgICByZXR1cm4gaFJldDsKCiAgLyogR2V0IGEgdmlldyBpbiBvdXIgcHJvY2VzcyBhZGRyZXNzIHNwYWNlICovCiAgcE1hcHBlZCA9IE1hcFZpZXdPZkZpbGUoaE1hcCwgRklMRV9NQVBfUkVBRCB8IEZJTEVfTUFQX1dSSVRFLCAwLCAwLCAwKTsKCiAgaWYgKHBNYXBwZWQpCiAgewogICAgLyogV3JpdGUgc2l6ZSBvZiBkYXRhLCBmb2xsb3dlZCBieSB0aGUgZGF0YSwgdG8gdGhlIHZpZXcgKi8KICAgICooKERXT1JEKilwTWFwcGVkKSA9IGR3U2l6ZTsKICAgIGlmIChkd1NpemUpCiAgICAgIG1lbWNweSgoY2hhciAqKSBwTWFwcGVkICsgc2l6ZW9mKGR3U2l6ZSksIGxwdkRhdGEsIGR3U2l6ZSk7CgogICAgLyogUmVsZWFzZSB2aWV3LiBBbGwgZnVydGhlciB2aWV3cyBtYXBwZWQgd2lsbCBiZSBvcGFxdWUgKi8KICAgIFVubWFwVmlld09mRmlsZShwTWFwcGVkKTsKICAgIGhSZXQgPSBTSExXQVBJX0R1cFNoYXJlZEhhbmRsZSgoSFNIQVJFRCloTWFwLCBkd1Byb2NJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UHJvY2Vzc0lkKCksIEZJTEVfTUFQX0FMTF9BQ0NFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFVQTElDQVRFX1NBTUVfQUNDRVNTKTsKICB9CgogIENsb3NlSGFuZGxlKGhNYXApOwogIHJldHVybiBoUmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAIFtTSExXQVBJLjhdCiAqCiAqIEdldCBhIHBvaW50ZXIgdG8gYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5IGZyb20gYSBzaGFyZWQgbWVtb3J5IGhhbmRsZS4KICoKICogUEFSQU1TCiAqIGhTaGFyZWQgIFtJXSBTaGFyZWQgbWVtb3J5IGhhbmRsZQogKiBkd1Byb2NJZCBbSV0gSUQgb2YgcHJvY2VzcyBvd25pbmcgaFNoYXJlZAogKgogKiBSRVRVUk5TCiAqIFN1Y2Nlc3M6IEEgcG9pbnRlciB0byB0aGUgc2hhcmVkIG1lbW9yeQogKiBGYWlsdXJlOiBOVUxMCiAqCiAqIE5PVEVTCiAqIFNlZSBTSExXQVBJXzcuCiAgICovClBWT0lEIFdJTkFQSSBTSExXQVBJXzggKEhTSEFSRUQgaFNoYXJlZCwgRFdPUkQgZHdQcm9jSWQpCiAgewogIEhTSEFSRUQgaER1cDsKICBMUFZPSUQgcE1hcHBlZDsKCiAgVFJBQ0UoIiglcCAlbGQpXG4iLCAoUFZPSUQpaFNoYXJlZCwgZHdQcm9jSWQpOwoKICAvKiBHZXQgaGFuZGxlIHRvIHNoYXJlZCBtZW1vcnkgZm9yIGN1cnJlbnQgcHJvY2VzcyAqLwogIGhEdXAgPSBTSExXQVBJX0R1cFNoYXJlZEhhbmRsZShoU2hhcmVkLCBkd1Byb2NJZCwgR2V0Q3VycmVudFByb2Nlc3NJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX01BUF9BTExfQUNDRVNTLCAwKTsKICAvKiBHZXQgVmlldyAqLwogIHBNYXBwZWQgPSBNYXBWaWV3T2ZGaWxlKChIQU5ETEUpaER1cCwgRklMRV9NQVBfUkVBRCB8IEZJTEVfTUFQX1dSSVRFLCAwLCAwLCAwKTsKICBDbG9zZUhhbmRsZShoRHVwKTsKCiAgaWYgKHBNYXBwZWQpCiAgICByZXR1cm4gKGNoYXIgKikgcE1hcHBlZCArIHNpemVvZihEV09SRCk7IC8qIEhpZGUgc2l6ZSAqLwogIHJldHVybiBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAIFtTSExXQVBJLjldCiAqCiAqIFJlbGVhc2UgYSBwb2ludGVyIHRvIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeS4KICoKICogUEFSQU1TCiAqIGxwVmlldyBbSV0gU2hhcmVkIG1lbW9yeSBwb2ludGVyCiAqCiAqIFJFVFVSTlMKICogU3VjY2VzczogVFJVRQogKiBGYWlsdXJlOiBGQUxTRQogKgogKiBOT1RFUwogKiBTZWUgU0hMV0FQSV83LgogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV85IChMUFZPSUQgbHBWaWV3KQp7CiAgVFJBQ0UoIiglcClcbiIsIGxwVmlldyk7CiAgcmV0dXJuIFVubWFwVmlld09mRmlsZSgoY2hhciAqKSBscFZpZXcgLSBzaXplb2YoRFdPUkQpKTsgLyogSW5jbHVkZSBzaXplICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEAgW1NITFdBUEkuMTBdCiAqCiAqIERlc3Ryb3kgYSBibG9jayBvZiBzaGFyYWJsZSBtZW1vcnkuCiAqCiAqIFBBUkFNUwogKiBoU2hhcmVkICBbSV0gU2hhcmVkIG1lbW9yeSBoYW5kbGUKICogZHdQcm9jSWQgW0ldIElEIG9mIHByb2Nlc3Mgb3duaW5nIGhTaGFyZWQKICoKICogUkVUVVJOUwogKiBTdWNjZXNzOiBUUlVFCiAqIEZhaWx1cmU6IEZBTFNFCiAqCiAqIE5PVEVTCiAqIFNlZSBTSExXQVBJXzcuCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzEwIChIU0hBUkVEIGhTaGFyZWQsIERXT1JEIGR3UHJvY0lkKQp7CiAgSFNIQVJFRCBoQ2xvc2U7CgogIFRSQUNFKCIoJXAgJWxkKVxuIiwgKFBWT0lEKWhTaGFyZWQsIGR3UHJvY0lkKTsKCiAgLyogR2V0IGEgY29weSBvZiB0aGUgaGFuZGxlIGZvciBvdXIgcHJvY2VzcywgY2xvc2luZyB0aGUgc291cmNlIGhhbmRsZSAqLwogIGhDbG9zZSA9IFNITFdBUElfRHVwU2hhcmVkSGFuZGxlKGhTaGFyZWQsIGR3UHJvY0lkLCBHZXRDdXJyZW50UHJvY2Vzc0lkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9NQVBfQUxMX0FDQ0VTUyxEVVBMSUNBVEVfQ0xPU0VfU09VUkNFKTsKICAvKiBDbG9zZSBsb2NhbCBjb3B5ICovCiAgcmV0dXJuIENsb3NlSGFuZGxlKChIQU5ETEUpaENsb3NlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQCAgIFtTSExXQVBJLjExXQogKgogKiBDb3B5IGEgc2hhcmFibGUgbWVtb3J5IGhhbmRsZSBmcm9tIG9uZSBwcm9jZXNzIHRvIGFub3RoZXIuCiAqCiAqIFBBUkFNUwogKiBoU2hhcmVkICAgICBbSV0gU2hhcmVkIG1lbW9yeSBoYW5kbGUgdG8gZHVwbGljYXRlCiAqIGR3RHN0UHJvY0lkIFtJXSBJRCBvZiB0aGUgcHJvY2VzcyB3YW50aW5nIHRoZSBkdXBsaWNhdGVkIGhhbmRsZQogKiBkd1NyY1Byb2NJZCBbSV0gSUQgb2YgdGhlIHByb2Nlc3Mgb3duaW5nIGhTaGFyZWQKICogZHdBY2Nlc3MgICAgW0ldIERlc2lyZWQgRHVwbGljYXRlSGFuZGxlIGFjY2VzcwogKiBkd09wdGlvbnMgICBbSV0gRGVzaXJlZCBEdXBsaWNhdGVIYW5kbGUgb3B0aW9ucwogKgogKiBSRVRVUk5TCiAqIFN1Y2Nlc3M6IEEgaGFuZGxlIHN1aXRhYmxlIGZvciB1c2UgYnkgdGhlIGR3RHN0UHJvY0lkIHByb2Nlc3MuCiAqIEZhaWx1cmU6IEEgTlVMTCBoYW5kbGUuCiAqCiAqIE5PVEVTCiAqIFNlZSBTSExXQVBJXzcuCiAqLwpIU0hBUkVEIFdJTkFQSSBTSExXQVBJXzExKEhTSEFSRUQgaFNoYXJlZCwgRFdPUkQgZHdEc3RQcm9jSWQsIERXT1JEIGR3U3JjUHJvY0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3QWNjZXNzLCBEV09SRCBkd09wdGlvbnMpCnsKICBIU0hBUkVEIGhSZXQ7CgogIGhSZXQgPSBTSExXQVBJX0R1cFNoYXJlZEhhbmRsZShoU2hhcmVkLCBkd0RzdFByb2NJZCwgZHdTcmNQcm9jSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3QWNjZXNzLCBkd09wdGlvbnMpOwogIHJldHVybiBoUmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTNdCiAqCiAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBjbGlwYm9hcmQgZW51bWVyYXRvciBmb3IgYSB3ZWIgYnJvd3Nlci4KICoKICogUEFSQU1TCiAqICBscEJDICAgICAgW0ldIEJpbmRpbmcgY29udGV4dAogKiAgbHBVbmtub3duIFtJXSBBbiBvYmplY3QgZXhwb3NpbmcgdGhlIElXZWJCcm93c2VyQXBwIGludGVyZmFjZQogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBTX09LLgogKiAgRmFpbHVyZTogQW4gSFJFU1VMVCBlcnJvciBjb2RlLgogKgogKiBOT1RFUwogKiAgVGhlIGVudW1lcmF0b3IgaXMgc3RvcmVkIGFzIGEgcHJvcGVydHkgb2YgdGhlIHdlYiBicm93c2VyLiBJZiBpdCBkb2VzIG5vdAogKiAgeWV0IGV4aXN0LCBpdCBpcyBjcmVhdGVkIGFuZCBzZXQgYmVmb3JlIGJlaW5nIHJlZ2lzdGVyZWQuCiAqCiAqIEJVR1MKICogIFVuaW1wbGVtZW50ZWQuCiAqLwpIUkVTVUxUIFdJTkFQSSBTSExXQVBJXzEzKExQQkMgbHBCQywgSVVua25vd24gKmxwVW5rbm93bikKewoJRklYTUUoIiglcCwlcCkgc3R1YlxuIiwgbHBCQywgbHBVbmtub3duKTsKCXJldHVybiAxOwojaWYgMAoJLyogcHNldWRvIGNvZGUgZXh0cmFjdGVkIGZyb20gcmVsYXkgdHJhY2UgKi8KCVJlZ09wZW5LZXlBKEhLTE0sICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcSW50ZXJuZXQgU2V0dGluZ3NcXEFjY2VwdGVkIERvY3VtZW50cyIsICZuZXdrZXkpOwoJcmV0ID0gMDsKCWkgPSAwOwoJc2l6ZSA9IDA7Cgl3aGlsZSghcmV0KSB7CgkgICAgcmV0ID0gUmVnRW51bVZhbHVlQShuZXdrZXksIGksIGExLCBhMiwgMCwgYTMsIDAsIDApOwoJICAgIHNpemUgKz0gPz8/OwoJICAgIGkrKzsKCX0KCWIxID0gTG9jYWxBbGxvYygweDQwLCBzaXplKTsKCXJldCA9IDA7CglpID0gMDsKCXdoaWxlKCFyZXQpIHsKCSAgICByZXQgPSBSZWdFbnVtVmFsdWVBKG5ld2tleSwgaSwgYTEsIGEyLCAwLCBhMywgYTQsIGE1KTsKCSAgICBSZWdpc3RlckNsaXBCb2FyZEZvcm1hdEEoYTQpOwoJICAgIGkrKzsKCX0KCWhtb2QxID0gR2V0TW9kdWxlSGFuZGxlQSgiVVJMTU9OLkRMTCIpOwoJcHJvYyA9IEdldFByb2NBZGRyZXNzKGhtb2QxLCAiQ3JlYXRlRm9ybWF0RW51bWVyYXRvciIpOwoJSGVhcEFsbG9jKD8/LCAwLCAweDE0KTsKCUhlYXBBbGxvYyg/PywgMCwgMHg1MCk7CglMb2NhbEFsbG9jKDB4NDAsIDB4NzgpOwoJLyogRklYTUU6IGJhZCBzdHJpbmcgYmVsb3cgKi8KCWxzdHJsZW5XKEwie0QwRkNBNDIwLUQzRjUtMTFDRi1CMjExLTAwQUEwMDRBRTgzN30iKTsKCVN0ckNweVcoYTYsICBMIntEMEZDQTQyMC1EM0Y1LTExQ0YtQjIxMS0wMEFBMDA0QUU4Mzd9Iik7CgoJR2V0VGlja0NvdW50KCk7CglJc0JhZFJlYWRQdHIoYzEgPSAweDQwM2ZkMjEwLDQpOwoJSW50ZXJsb2NrZWRJbmNyZW1lbnQoYzErNCk7CglMb2NhbEZyZWUoYjEpOwoJUmVnQ2xvc2VLZXkobmV3a2V5KTsKCUlzQmFkUmVhZFB0cihjMSA9IDB4NDAzZmQyMTAsNCk7CglJbnRlcmxvY2tlZEluY3JlbWVudChjMSs0KTsKCglIZWFwQWxsb2MoNDAzNTAwMDAsMDAwMDAwMDAsMDAwMDAwMTQpIHJldHZhbD00MDNmZDBhODsKCUhlYXBBbGxvYyg0MDM1MDAwMCwwMDAwMDAwMCwwMDAwMDA1MCkgcmV0dmFsPTQwM2ZlYjQ0OwoJaG1vZDEgPSBHZXRNb2R1bGVIYW5kbGVBKCJVUkxNT04uRExMIik7Cglwcm9jID0gR2V0UHJvY0FkZHJlc3MoaG1vZDEsICJSZWdpc3RlckZvcm1hdEVudW1lcmF0b3IiKTsKCS8qIDB4MWE0MGM4OGMgaXMgaW4gVVJMTU9OLkRMTCBqdXN0IGJlZm9yZSBhYm92ZSBwcm9jCgkgKiBjb250ZW50IGlzIEwiX0VudW1GT1JNQVRFVENfIgoJICogbGFiZWwgaXMgZDEKCSAqLwogICAgICAgIElzQmFkUmVhZFB0cihkMSA9IDB4MWE0MGM4OGMsMDAwMDAwMDIpOwoJbHN0cmxlblcoZDEpOwoJbHN0cmxlblcoZDEpOwoJSGVhcEFsbG9jKDQwMzUwMDAwLDAwMDAwMDAwLDAwMDAwMDFlKSByZXR2YWw9NDAzZmVkNDQ7CglJc0JhZFJlYWRQdHIoZDIgPSAweDQwM2ZkMGE4LDAwMDAwMDA0KTsKCUludGVybG9ja2VkSW5jcmVtZW50KGQyKzQpOwoJSXNCYWRSZWFkUHRyKGQyID0gMHg0MDNmZDBhOCwwMDAwMDAwNCk7CglJbnRlcmxvY2tlZERlY3JlbWVudChkMis0KTsKCUlzQmFkUmVhZFB0cihjMSwwMDAwMDAwNCk7CglJbnRlcmxvY2tlZERlY3JlbWVudChjMSs0KTsKCUlzQmFkUmVhZFB0cihjMSwwMDAwMDAwNCk7CglJbnRlcmxvY2tlZERlY3JlbWVudChjMSs0KTsKCiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTRdCiAqCiAqIEdldCBFeHBsb3JlcnMgIkFjY2VwdExhbmd1YWdlIiBzZXR0aW5nLgogKgogKiBQQVJBTVMKICogIGxhbmdidWYgW09dIERlc3RpbmF0aW9uIGZvciBsYW5ndWFnZSBzdHJpbmcKICogIGJ1ZmxlbiAgW0ldIExlbmd0aCBvZiBsYW5nYnVmCiAqCiAqIFJFVFVSTlMKICogIFN1Y2Nlc3M6IFNfT0suICAgbGFuZ2J1ZiBpcyBzZXQgdG8gdGhlIGxhbmd1YWdlIHN0cmluZyBmb3VuZC4KICogIEZhaWx1cmU6IEVfRkFJTCwgSWYgYW55IGFyZ3VtZW50cyBhcmUgaW52YWxpZCwgZXJyb3Igb2NjdXJyZWQsIG9yIEV4cGxvcmVyCiAqICAgICAgICAgICBkb2VzIG5vdCBjb250YWluIHRoZSBzZXR0aW5nLgogKi8KSFJFU1VMVCBXSU5BUEkgU0hMV0FQSV8xNCAoCglMUFNUUiBsYW5nYnVmLAoJTFBEV09SRCBidWZsZW4pCnsKCUNIQVIgKm15c3RyOwoJRFdPUkQgbXlzdHJsZW4sIG15dHlwZTsKCUhLRVkgbXlrZXk7CglMQ0lEIG15bGNpZDsKCglteXN0cmxlbiA9ICgqYnVmbGVuID4gNikgPyAqYnVmbGVuIDogNjsKCW15c3RyID0gKENIQVIqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLAoJCQkJIEhFQVBfWkVST19NRU1PUlksIG15c3RybGVuKTsKCVJlZ09wZW5LZXlBKEhLRVlfQ1VSUkVOVF9VU0VSLAoJCSAgICAiU29mdHdhcmVcXE1pY3Jvc29mdFxcSW50ZXJuZXQgRXhwbG9yZXJcXEludGVybmF0aW9uYWwiLAoJCSAgICAmbXlrZXkpOwoJaWYgKFJlZ1F1ZXJ5VmFsdWVFeEEobXlrZXksICJBY2NlcHRMYW5ndWFnZSIsCgkJCSAgICAgIDAsICZteXR5cGUsIG15c3RyLCAmbXlzdHJsZW4pKSB7CgkgICAgLyogRGlkIG5vdCBmaW5kIHZhbHVlICovCgkgICAgbXlsY2lkID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CgkgICAgLyogc29tZWhvdyB0aGUgbXlsY2lkIHRyYW5zbGF0ZXMgaW50byAiZW4tdXMiCgkgICAgICogIHRoaXMgaXMgc2ltaWxhciB0byAiTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSIKCSAgICAgKiAgd2hpY2ggY291bGQgYmUgZ290dGVuIHZpYSBHZXRMb2NhbGVJbmZvLgoJICAgICAqICBUaGUgb25seSBwcm9ibGVtIGlzIExPQ0FMRV9TQUJCUkVWTEFOR1VBR0UiIGlzCgkgICAgICogIGEgMyBjaGFyIHN0cmluZyAoZmlyc3QgMiBhcmUgY291bnRyeSBjb2RlIGFuZCB0aGlyZCBpcwoJICAgICAqICBsZXR0ZXIgZm9yICJzdWJsYW5ndWFnZSIsIHdoaWNoIGRvZXMgbm90IGNvbWUgY2xvc2UgdG8KCSAgICAgKiAgImVuLXVzIgoJICAgICAqLwoJICAgIGxzdHJjcHlBKG15c3RyLCAiZW4tdXMiKTsKCSAgICBteXN0cmxlbiA9IGxzdHJsZW5BKG15c3RyKTsKCX0KCWVsc2UgewoJICAgIC8qIGhhbmRsZSByZXR1cm5lZCBzdHJpbmcgKi8KCSAgICBGSVhNRSgibWlzc2luZyBjb2RlXG4iKTsKCX0KCWlmIChteXN0cmxlbiA+ICpidWZsZW4pCgkgICAgbHN0cmNweW5BKGxhbmdidWYsIG15c3RyLCAqYnVmbGVuKTsKCWVsc2UgewoJICAgIGxzdHJjcHlBKGxhbmdidWYsIG15c3RyKTsKCSAgICAqYnVmbGVuID0gbHN0cmxlbkEobGFuZ2J1Zik7Cgl9CglSZWdDbG9zZUtleShteWtleSk7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBteXN0cik7CglUUkFDRSgibGFuZ3VhZ2UgaXMgJXNcbiIsIGRlYnVnc3RyX2EobGFuZ2J1ZikpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNV0KICoKICogVW5pY29kZSB2ZXJzaW9uIG9mIFNITFdBUElfMTQuCiAqLwpIUkVTVUxUIFdJTkFQSSBTSExXQVBJXzE1ICgKCUxQV1NUUiBsYW5nYnVmLAoJTFBEV09SRCBidWZsZW4pCnsKCUNIQVIgKm15c3RyOwoJRFdPUkQgbXlzdHJsZW4sIG15dHlwZTsKCUhLRVkgbXlrZXk7CglMQ0lEIG15bGNpZDsKCglteXN0cmxlbiA9ICgqYnVmbGVuID4gNikgPyAqYnVmbGVuIDogNjsKCW15c3RyID0gKENIQVIqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLAoJCQkJIEhFQVBfWkVST19NRU1PUlksIG15c3RybGVuKTsKCVJlZ09wZW5LZXlBKEhLRVlfQ1VSUkVOVF9VU0VSLAoJCSAgICAiU29mdHdhcmVcXE1pY3Jvc29mdFxcSW50ZXJuZXQgRXhwbG9yZXJcXEludGVybmF0aW9uYWwiLAoJCSAgICAmbXlrZXkpOwoJaWYgKFJlZ1F1ZXJ5VmFsdWVFeEEobXlrZXksICJBY2NlcHRMYW5ndWFnZSIsCgkJCSAgICAgIDAsICZteXR5cGUsIG15c3RyLCAmbXlzdHJsZW4pKSB7CgkgICAgLyogRGlkIG5vdCBmaW5kIHZhbHVlICovCgkgICAgbXlsY2lkID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CgkgICAgLyogc29tZWhvdyB0aGUgbXlsY2lkIHRyYW5zbGF0ZXMgaW50byAiZW4tdXMiCgkgICAgICogIHRoaXMgaXMgc2ltaWxhciB0byAiTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSIKCSAgICAgKiAgd2hpY2ggY291bGQgYmUgZ290dGVuIHZpYSBHZXRMb2NhbGVJbmZvLgoJICAgICAqICBUaGUgb25seSBwcm9ibGVtIGlzIExPQ0FMRV9TQUJCUkVWTEFOR1VBR0UiIGlzCgkgICAgICogIGEgMyBjaGFyIHN0cmluZyAoZmlyc3QgMiBhcmUgY291bnRyeSBjb2RlIGFuZCB0aGlyZCBpcwoJICAgICAqICBsZXR0ZXIgZm9yICJzdWJsYW5ndWFnZSIsIHdoaWNoIGRvZXMgbm90IGNvbWUgY2xvc2UgdG8KCSAgICAgKiAgImVuLXVzIgoJICAgICAqLwoJICAgIGxzdHJjcHlBKG15c3RyLCAiZW4tdXMiKTsKCSAgICBteXN0cmxlbiA9IGxzdHJsZW5BKG15c3RyKTsKCX0KCWVsc2UgewoJICAgIC8qIGhhbmRsZSByZXR1cm5lZCBzdHJpbmcgKi8KCSAgICBGSVhNRSgibWlzc2luZyBjb2RlXG4iKTsKCX0KCVJlZ0Nsb3NlS2V5KG15a2V5KTsKCSpidWZsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKDAsIDAsIG15c3RyLCAtMSwgbGFuZ2J1ZiwgKCpidWZsZW4pLTEpOwoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbXlzdHIpOwoJVFJBQ0UoImxhbmd1YWdlIGlzICVzXG4iLCBkZWJ1Z3N0cl93KGxhbmdidWYpKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjNdCiAqCiAqIE5PVEVTCiAqCWNvbnZlcnRzIGEgZ3VpZCB0byBhIHN0cmluZwogKglyZXR1cm5zIHN0cmxlbihzdHIpCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yMyAoCglSRUZHVUlEIGd1aWQsCS8qIFtpbl0gIGNsc2lkICovCglMUFNUUiBzdHIsCS8qIFtvdXRdIGJ1ZmZlciAqLwoJSU5UIGNtYXgpCS8qIFtpbl0gIHNpemUgb2YgYnVmZmVyICovCnsKCWNoYXIgeGd1aWRbNDBdOwoKICAgICAgICBzcHJpbnRmKCB4Z3VpZCwgInslMDhseC0lMDR4LSUwNHgtJTAyeCUwMngtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4fSIsCiAgICAgICAgICAgICAgICAgZ3VpZC0+RGF0YTEsIGd1aWQtPkRhdGEyLCBndWlkLT5EYXRhMywKICAgICAgICAgICAgICAgICBndWlkLT5EYXRhNFswXSwgZ3VpZC0+RGF0YTRbMV0sIGd1aWQtPkRhdGE0WzJdLCBndWlkLT5EYXRhNFszXSwKICAgICAgICAgICAgICAgICBndWlkLT5EYXRhNFs0XSwgZ3VpZC0+RGF0YTRbNV0sIGd1aWQtPkRhdGE0WzZdLCBndWlkLT5EYXRhNFs3XSApOwoJVFJBQ0UoIiglcyAlcCAweCUwOHgpc3R1YlxuIiwgeGd1aWQsIHN0ciwgY21heCk7CglpZiAoc3RybGVuKHhndWlkKT49Y21heCkgcmV0dXJuIDA7CglzdHJjcHkoc3RyLHhndWlkKTsKCXJldHVybiBzdHJsZW4oeGd1aWQpICsgMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI0XQogKgogKiBOT1RFUwogKgljb252ZXJ0cyBhIGd1aWQgdG8gYSBzdHJpbmcKICoJcmV0dXJucyBzdHJsZW4oc3RyKQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjQgKAoJUkVGR1VJRCBndWlkLAkvKiBbaW5dICBjbHNpZCAqLwoJTFBXU1RSIHN0ciwJLyogW291dF0gYnVmZmVyICovCglJTlQgY21heCkJLyogW2luXSAgc2l6ZSBvZiBidWZmZXIgKi8KewogICAgY2hhciB4Z3VpZFs0MF07CgogICAgc3ByaW50ZiggeGd1aWQsICJ7JTA4bHgtJTA0eC0lMDR4LSUwMnglMDJ4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeH0iLAogICAgICAgICAgICAgZ3VpZC0+RGF0YTEsIGd1aWQtPkRhdGEyLCBndWlkLT5EYXRhMywKICAgICAgICAgICAgIGd1aWQtPkRhdGE0WzBdLCBndWlkLT5EYXRhNFsxXSwgZ3VpZC0+RGF0YTRbMl0sIGd1aWQtPkRhdGE0WzNdLAogICAgICAgICAgICAgZ3VpZC0+RGF0YTRbNF0sIGd1aWQtPkRhdGE0WzVdLCBndWlkLT5EYXRhNFs2XSwgZ3VpZC0+RGF0YTRbN10gKTsKICAgIHJldHVybiBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHhndWlkLCAtMSwgc3RyLCBjbWF4ICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yNV0KICoKICogU2VlbXMgdG8gYmUgaXN3YWxwaGEKICovCkJPT0wgV0lOQVBJIFNITFdBUElfMjUoV0NIQVIgd2MpCnsKICAgIHJldHVybiAoZ2V0X2NoYXJfdHlwZVcod2MpICYgQzFfQUxQSEEpICE9IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yNl0KICoKICogU2VlbXMgdG8gYmUgaXN3dXBwZXIKICovCkJPT0wgV0lOQVBJIFNITFdBUElfMjYoV0NIQVIgd2MpCnsKICAgIHJldHVybiAoZ2V0X2NoYXJfdHlwZVcod2MpICYgQzFfVVBQRVIpICE9IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yN10KICoKICogU2VlbXMgdG8gYmUgaXN3bG93ZXIKICovCkJPT0wgV0lOQVBJIFNITFdBUElfMjcoV0NIQVIgd2MpCnsKICAgIHJldHVybiAoZ2V0X2NoYXJfdHlwZVcod2MpICYgQzFfTE9XRVIpICE9IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yOF0KICoKICogU2VlbXMgdG8gYmUgaXN3YWxudW0KICovCkJPT0wgV0lOQVBJIFNITFdBUElfMjgoV0NIQVIgd2MpCnsKICAgIHJldHVybiAoZ2V0X2NoYXJfdHlwZVcod2MpICYgKEMxX0FMUEhBfEMxX0RJR0lUKSkgIT0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI5XQogKgogKiBTZWVtcyB0byBiZSBpc3dzcGFjZQogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8yOShXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiBDMV9TUEFDRSkgIT0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjMwXQogKgogKiBTZWVtcyB0byBiZSBpc3dibGFuawogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8zMChXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiBDMV9CTEFOSykgIT0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjMxXQogKgogKiBTZWVtcyB0byBiZSBpc3dwdW5jdAogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8zMShXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiBDMV9QVU5DVCkgIT0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjMyXQogKgogKiBTZWVtcyB0byBiZSBpc3djbnRybAogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8zMihXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiBDMV9DTlRSTCkgIT0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjMzXQogKgogKiBTZWVtcyB0byBiZSBpc3dkaWdpdAogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8zMyhXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiBDMV9ESUdJVCkgIT0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM0XQogKgogKiBTZWVtcyB0byBiZSBpc3d4ZGlnaXQKICovCkJPT0wgV0lOQVBJIFNITFdBUElfMzQoV0NIQVIgd2MpCnsKICAgIHJldHVybiAoZ2V0X2NoYXJfdHlwZVcod2MpICYgQzFfWERJR0lUKSAhPSAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzVdCiAqCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzM1KExQVk9JRCBwMSwgRFdPUkQgZHcyLCBMUFZPSUQgcDMpCnsKICAgIEZJWE1FKCIoJXAsIDB4JTA4bHgsICVwKTogc3R1YlxuIiwgcDEsIGR3MiwgcDMpOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNl0KICoKICogSW5zZXJ0IGEgYml0bWFwIG1lbnUgaXRlbSBhdCB0aGUgYm90dG9tIG9mIGEgbWVudS4KICoKICogUEFSQU1TCiAqICBoTWVudSBbSV0gTWVudSB0byBpbnNlcnQgaW50bwogKiAgZmxhZ3MgW0ldIEZsYWdzIGZvciBpbnNlcnRpb24KICogIGlkICAgIFtJXSBNZW51IElEIG9mIHRoZSBpdGVtCiAqICBzdHIgICBbSV0gTWVudSB0ZXh0IGZvciB0aGUgaXRlbQogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBUUlVFLCAgdGhlIGl0ZW0gaXMgaW5zZXJ0ZWQgaW50byB0aGUgbWVudQogKiAgRmFpbHVyZTogRkFMU0UsIGlmIGFueSBwYXJhbWV0ZXIgaXMgaW52YWxpZAogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8zNihITUVOVSBoTWVudSwgVUlOVCBmbGFncywgVUlOVCBpZCwgTFBDV1NUUiBzdHIpCnsKICAgIFRSQUNFKCIoJXAsMHglMDh4LDB4JTA4eCwlcylcbiIsaE1lbnUsIGZsYWdzLCBpZCwgZGVidWdzdHJfdyhzdHIpKTsKICAgIHJldHVybiBJbnNlcnRNZW51VyhoTWVudSwgLTEsIGZsYWdzIHwgTUZfQklUTUFQLCBpZCwgc3RyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjc0XQogKgogKiBHZXQgdGhlIHRleHQgZnJvbSBhIGdpdmVuIGRpYWxvZyBpdGVtLgogKgogKiBQQVJBTVMKICogIGhXbmQgICAgIFtJXSBIYW5kbGUgb2YgZGlhbG9nCiAqICBuSXRlbSAgICBbSV0gSW5kZXggb2YgaXRlbQogKiAgbHBzRGVzdCAgW09dIEJ1ZmZlciBmb3IgcmVjZWl2aW5nIHdpbmRvdyB0ZXh0CiAqICBuRGVzdExlbiBbSV0gTGVuZ3RoIG9mIGJ1ZmZlci4KICoKICogUkVUVVJOUwogKiAgU3VjY2VzczogVGhlIGxlbmd0aCBvZiB0aGUgcmV0dXJuZWQgdGV4dC4KICogIEZhaWx1cmU6IDAuCiAqLwpJTlQgV0lOQVBJIFNITFdBUElfNzQoSFdORCBoV25kLCBJTlQgbkl0ZW0sIExQV1NUUiBscHNEZXN0LElOVCBuRGVzdExlbikKewogIEhXTkQgaEl0ZW0gPSBHZXREbGdJdGVtKGhXbmQsIG5JdGVtKTsKCiAgaWYgKGhJdGVtKQogICAgcmV0dXJuIEdldFdpbmRvd1RleHRXKGhJdGVtLCBscHNEZXN0LCBuRGVzdExlbik7CiAgaWYgKG5EZXN0TGVuKQogICAgKmxwc0Rlc3QgPSAoV0NIQVIpJ1wwJzsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBAICAgW1NITFdBUEkuMTM4XQogKgogKiBTZXQgdGhlIHRleHQgb2YgYSBnaXZlbiBkaWFsb2cgaXRlbS4KICoKICogUEFSQU1TCiAqICBoV25kICAgICBbSV0gSGFuZGxlIG9mIGRpYWxvZwogKiAgaUl0ZW0gICAgW0ldIEluZGV4IG9mIGl0ZW0KICogIGxwc3pUZXh0IFtPXSBUZXh0IHRvIHNldAogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBUUlVFLiAgVGhlIHRleHQgb2YgdGhlIGRpYWxvZyBpcyBzZXQgdG8gbHBzelRleHQuCiAqICBGYWlsdXJlOiBGQUxTRSwgT3RoZXJ3aXNlLgogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8xMzgoSFdORCBoV25kLCBJTlQgaUl0ZW0sIExQQ1dTVFIgbHBzelRleHQpCnsKICAgIEhXTkQgaFduZEl0ZW0gPSBHZXREbGdJdGVtKGhXbmQsIGlJdGVtKTsKICAgIGlmIChoV25kSXRlbSkKICAgICAgICByZXR1cm4gU2V0V2luZG93VGV4dFcoaFduZEl0ZW0sIGxwc3pUZXh0KTsKICAgIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE1MV0KICogRnVuY3Rpb246ICBDb21wYXJlIHR3byBBU0NJSSBzdHJpbmdzIGZvciAibGVuIiBieXRlcy4KICogUmV0dXJuczogICAqc3RyMS0qc3RyMiAgKGNhc2Ugc2Vuc2l0aXZlKQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTUxKExQQ1NUUiBzdHIxLCBMUENTVFIgc3RyMiwgSU5UIGxlbikKewogICAgcmV0dXJuIHN0cm5jbXAoIHN0cjEsIHN0cjIsIGxlbiApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTUyXQogKgogKiBGdW5jdGlvbjogIENvbXBhcmUgdHdvIFdJREUgc3RyaW5ncyBmb3IgImxlbiIgYnl0ZXMuCiAqIFJldHVybnM6ICAgKnN0cjEtKnN0cjIgIChjYXNlIHNlbnNpdGl2ZSkKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE1MihMUENXU1RSIHN0cjEsIExQQ1dTVFIgc3RyMiwgSU5UIGxlbikKewogICAgcmV0dXJuIHN0cm5jbXBXKCBzdHIxLCBzdHIyLCBsZW4gKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE1M10KICogRnVuY3Rpb246ICBDb21wYXJlIHR3byBBU0NJSSBzdHJpbmdzIGZvciAibGVuIiBieXRlcyB2aWEgY2FzZWxlc3MgY29tcGFyZS4KICogUmV0dXJuczogICAqc3RyMS0qc3RyMiAgKGNhc2UgaW5zZW5zaXRpdmUpCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNTMoTFBDU1RSIHN0cjEsIExQQ1NUUiBzdHIyLCBEV09SRCBsZW4pCnsKICAgIHJldHVybiBzdHJuY2FzZWNtcCggc3RyMSwgc3RyMiwgbGVuICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNTRdCiAqCiAqIEZ1bmN0aW9uOiAgQ29tcGFyZSB0d28gV0lERSBzdHJpbmdzIGZvciAibGVuIiBieXRlcyB2aWEgY2FzZWxlc3MgY29tcGFyZS4KICogUmV0dXJuczogICAqc3RyMS0qc3RyMiAgKGNhc2UgaW5zZW5zaXRpdmUpCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNTQoTFBDV1NUUiBzdHIxLCBMUENXU1RSIHN0cjIsIERXT1JEIGxlbikKewogICAgcmV0dXJuIHN0cm5jbXBpVyggc3RyMSwgc3RyMiwgbGVuICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNTVdCiAqCiAqCUNhc2Ugc2Vuc2l0aXZlIHN0cmluZyBjb21wYXJlIChBU0NJSSkuIERvZXMgbm90IFNldExhc3RFcnJvcigpLgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTU1KExQQ1NUUiBzdHIxLCBMUENTVFIgc3RyMikKewogICAgcmV0dXJuIHN0cmNtcChzdHIxLCBzdHIyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE1Nl0KICoKICoJQ2FzZSBzZW5zaXRpdmUgc3RyaW5nIGNvbXBhcmUuIERvZXMgbm90IFNldExhc3RFcnJvcigpLgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTU2KExQQ1dTVFIgc3RyMSwgTFBDV1NUUiBzdHIyKQp7CiAgICByZXR1cm4gc3RyY21wVyggc3RyMSwgc3RyMiApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTU3XQogKgogKglDYXNlIGluc2Vuc2l0aXZlIHN0cmluZyBjb21wYXJlIChBU0NJSSkuIERvZXMgbm90IFNldExhc3RFcnJvcigpLgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTU3KExQQ1NUUiBzdHIxLCBMUENTVFIgc3RyMikKewogICAgcmV0dXJuIHN0cmNhc2VjbXAoc3RyMSwgc3RyMik7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE1OF0KICoKICoJQ2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcgY29tcGFyZS4gRG9lcyBub3QgU2V0TGFzdEVycm9yKCkuID8/CiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNTggKExQQ1dTVFIgc3RyMSwgTFBDV1NUUiBzdHIyKQp7CiAgICByZXR1cm4gc3RyY21waVcoIHN0cjEsIHN0cjIgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE2Ml0KICoKICogUmVtb3ZlIGEgaGFuZ2luZyBsZWFkIGJ5dGUgZnJvbSB0aGUgZW5kIG9mIGEgc3RyaW5nLCBpZiBwcmVzZW50LgogKgogKiBQQVJBTVMKICogIGxwU3RyIFtJXSBTdHJpbmcgdG8gY2hlY2sgZm9yIGEgaGFuZ2luZyBsZWFkIGJ5dGUKICogIHNpemUgIFtJXSBMZW5ndGggb2YgbHBzelN0cgogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBUaGUgbmV3IHNpemUgb2YgdGhlIHN0cmluZy4gQW55IGhhbmdpbmcgbGVhZCBieXRlcyBhcmUgcmVtb3ZlZC4KICogIEZhaWx1cmU6IDAsIGlmIGFueSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTYyKExQU1RSIGxwU3RyLCBEV09SRCBzaXplKQp7CiAgaWYgKGxwU3RyICYmIHNpemUpCiAgewogICAgTFBTVFIgbGFzdEJ5dGUgPSBscFN0ciArIHNpemUgLSAxOwoKICAgIHdoaWxlKGxwU3RyIDwgbGFzdEJ5dGUpCiAgICAgIGxwU3RyICs9IElzREJDU0xlYWRCeXRlKCpscFN0cikgPyAyIDogMTsKCiAgICBpZihscFN0ciA9PSBsYXN0Qnl0ZSAmJiBJc0RCQ1NMZWFkQnl0ZSgqbHBTdHIpKQogICAgewogICAgICAqbHBTdHIgPSAnXDAnOwogICAgICBzaXplLS07CiAgICB9CiAgICByZXR1cm4gc2l6ZTsKICB9CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNjNdCiAqCiAqIENhbGwgSU9sZUNvbW1hbmRUYXJnZXQ6OlF1ZXJ5U3RhdHVzKCkgb24gYW4gb2JqZWN0LgogKgogKiBQQVJBTVMKICogIGxwVW5rbm93biAgICAgW0ldIE9iamVjdCBzdXBwb3J0aW5nIHRoZSBJT2xlQ29tbWFuZFRhcmdldCBpbnRlcmZhY2UKICogIHBndWlkQ21kR3JvdXAgW0ldIEdVSUQgZm9yIHRoZSBjb21tYW5kIGdyb3VwCiAqICBjQ21kcyAgICAgICAgIFtJXQogKiAgcHJnQ21kcyAgICAgICBbT10gQ29tbWFuZHMKICogIHBDbWRUZXh0ICAgICAgW09dIENvbW1hbmQgdGV4dAogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBTX09LLgogKiAgRmFpbHVyZTogRV9GQUlMLCBpZiBscFVua25vd24gaXMgTlVMTC4KICogICAgICAgICAgIEVfTk9JTlRFUkZBQ0UsIGlmIGxwVW5rbm93biBkb2VzIG5vdCBzdXBwb3J0IElPbGVDb21tYW5kVGFyZ2V0LgogKiAgICAgICAgICAgT3RoZXJ3aXNlLCBhbiBlcnJvciBjb2RlIGZyb20gSU9sZUNvbW1hbmRUYXJnZXQ6OlF1ZXJ5U3RhdHVzKCkuCiAqLwpIUkVTVUxUIFdJTkFQSSBTSExXQVBJXzE2MyhJVW5rbm93biogbHBVbmtub3duLCBSRUZHVUlEIHBndWlkQ21kR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIGNDbWRzLCBPTEVDTUQgKnByZ0NtZHMsIE9MRUNNRFRFWFQqIHBDbWRUZXh0KQp7CiAgSFJFU1VMVCBoUmV0ID0gRV9GQUlMOwoKICBUUkFDRSgiKCVwLCVwLCVsZCwlcCwlcClcbiIsbHBVbmtub3duLCBwZ3VpZENtZEdyb3VwLCBjQ21kcywgcHJnQ21kcywgcENtZFRleHQpOwoKICBpZiAobHBVbmtub3duKQogIHsKICAgIElPbGVDb21tYW5kVGFyZ2V0KiBscE9sZTsKCiAgICBoUmV0ID0gSVVua25vd25fUXVlcnlJbnRlcmZhY2UobHBVbmtub3duLCAmSUlEX0lPbGVDb21tYW5kVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiopJmxwT2xlKTsKCiAgICBpZiAoU1VDQ0VFREVEKGhSZXQpICYmIGxwT2xlKQogICAgewogICAgICBoUmV0ID0gSU9sZUNvbW1hbmRUYXJnZXRfUXVlcnlTdGF0dXMobHBPbGUsIHBndWlkQ21kR3JvdXAsIGNDbWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJnQ21kcywgcENtZFRleHQpOwogICAgICBJT2xlQ29tbWFuZFRhcmdldF9SZWxlYXNlKGxwT2xlKTsKICAgIH0KICB9CiAgcmV0dXJuIGhSZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAkJW1NITFdBUEkuMTY0XQogKgogKiBDYWxsIElPbGVDb21tYW5kVGFyZ2V0OjpFeGVjKCkgb24gYW4gb2JqZWN0LgogKgogKiBQQVJBTVMKICogIGxwVW5rbm93biAgICAgW0ldIE9iamVjdCBzdXBwb3J0aW5nIHRoZSBJT2xlQ29tbWFuZFRhcmdldCBpbnRlcmZhY2UKICogIHBndWlkQ21kR3JvdXAgW0ldIEdVSUQgZm9yIHRoZSBjb21tYW5kIGdyb3VwCiAqCiAqIFJFVFVSTlMKICogIFN1Y2Nlc3M6IFNfT0suCiAqICBGYWlsdXJlOiBFX0ZBSUwsIGlmIGxwVW5rbm93biBpcyBOVUxMLgogKiAgICAgICAgICAgRV9OT0lOVEVSRkFDRSwgaWYgbHBVbmtub3duIGRvZXMgbm90IHN1cHBvcnQgSU9sZUNvbW1hbmRUYXJnZXQuCiAqICAgICAgICAgICBPdGhlcndpc2UsIGFuIGVycm9yIGNvZGUgZnJvbSBJT2xlQ29tbWFuZFRhcmdldDo6RXhlYygpLgogKi8KSFJFU1VMVCBXSU5BUEkgU0hMV0FQSV8xNjQoSVVua25vd24qIGxwVW5rbm93biwgUkVGR1VJRCBwZ3VpZENtZEdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBuQ21kSUQsIERXT1JEIG5DbWRleGVjb3B0LCBWQVJJQU5UKiBwdmFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSSUFOVCogcHZhT3V0KQp7CiAgSFJFU1VMVCBoUmV0ID0gRV9GQUlMOwoKICBUUkFDRSgiKCVwLCVwLCVsZCwlbGQsJXAsJXApXG4iLGxwVW5rbm93biwgcGd1aWRDbWRHcm91cCwgbkNtZElELAogICAgICAgIG5DbWRleGVjb3B0LCBwdmFJbiwgcHZhT3V0KTsKCiAgaWYgKGxwVW5rbm93bikKICB7CiAgICBJT2xlQ29tbWFuZFRhcmdldCogbHBPbGU7CgogICAgaFJldCA9IElVbmtub3duX1F1ZXJ5SW50ZXJmYWNlKGxwVW5rbm93biwgJklJRF9JT2xlQ29tbWFuZFRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCoqKSZscE9sZSk7CiAgICBpZiAoU1VDQ0VFREVEKGhSZXQpICYmIGxwT2xlKQogICAgewogICAgICBoUmV0ID0gSU9sZUNvbW1hbmRUYXJnZXRfRXhlYyhscE9sZSwgcGd1aWRDbWRHcm91cCwgbkNtZElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ21kZXhlY29wdCwgcHZhSW4sIHB2YU91dCk7CiAgICAgIElPbGVDb21tYW5kVGFyZ2V0X1JlbGVhc2UobHBPbGUpOwogICAgfQogIH0KICByZXR1cm4gaFJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE2NV0KICoKICogUmV0cmlldmUsIG1vZGlmeSwgYW5kIHJlLXNldCBhIHZhbHVlIGZyb20gYSB3aW5kb3cuCiAqCiAqIFBBUkFNUwogKiAgaFduZCAgIFtJXSBXaW5kb3dzIHRvIGdldCB2YWx1ZSBmcm9tCiAqICBvZmZzZXQgW0ldIE9mZnNldCBvZiB2YWx1ZQogKiAgd01hc2sgIFtJXSBNYXNrIGZvciB1aUZsYWdzCiAqICB3RmxhZ3MgW0ldIEJpdHMgdG8gc2V0IGluIHdpbmRvdyB2YWx1ZQogKgogKiBSRVRVUk5TCiAqICBUaGUgbmV3IHZhbHVlIGFzIGl0IHdhcyBzZXQsIG9yIDAgaWYgYW55IHBhcmFtZXRlciBpcyBpbnZhbGlkLgogKgogKiBOT1RFUwogKiAgQW55IGJpdHMgc2V0IGluIHVpTWFzayBhcmUgY2xlYXJlZCBmcm9tIHRoZSB2YWx1ZSwgdGhlbiBhbnkgYml0cyBzZXQgaW4KICogIHVpRmxhZ3MgYXJlIHNldCBpbiB0aGUgdmFsdWUuCiAqLwpMT05HIFdJTkFQSSBTSExXQVBJXzE2NShIV05EIGh3bmQsIElOVCBvZmZzZXQsIFVJTlQgd01hc2ssIFVJTlQgd0ZsYWdzKQp7CiAgTE9ORyByZXQgPSBHZXRXaW5kb3dMb25nQShod25kLCBvZmZzZXQpOwogIFVJTlQgbmV3RmxhZ3MgPSAod0ZsYWdzICYgd01hc2spIHwgKHJldCAmIH53RmxhZ3MpOwoKICBpZiAobmV3RmxhZ3MgIT0gcmV0KQogICAgcmV0ID0gU2V0V2luZG93TG9uZ0EoaHduZCwgb2Zmc2V0LCBuZXdGbGFncyk7CiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE2N10KICoKICogQ2hhbmdlIGEgd2luZG93cyBwYXJlbnQuCiAqCiAqIFBBUkFNUwogKiAgaFduZCAgICAgICBbSV0gV2luZG93IHRvIGNoYW5nZSBwYXJlbnQgb2YKICogIGhXbmRQYXJlbnQgW0ldIE5ldyBwYXJlbnQgd2luZG93CiAqCiAqIFJFVFVSTlMKICogIE5vdGhpbmcuCiAqCiAqIE5PVEVTCiAqICBJZiBoV25kUGFyZW50IGlzIE5VTEwgKGRlc2t0b3ApLCB0aGUgd2luZG93IHN0eWxlIGlzIGNoYW5nZWQgdG8gV1NfUE9QVVAuCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNjcoSFdORCBoV25kLCBIV05EIGhXbmRQYXJlbnQpCnsKCUZJWE1FKCIlcCwlcFxuIiwgaFduZCwgaFduZFBhcmVudCk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBAICAgICAgIFtTSExXQVBJLjE2OF0KICoKICogTG9jYXRlIGFuZCBhZHZpc2UgYSBjb25uZWN0aW9uIHBvaW50IGluIGFuIElDb25uZWN0aW9uUG9pbnRDb250YWluZXIuCiAqCiAqIFBBUkFNUwogKiAgbHBVbmtTaW5rICAgW0ldIFNpbmsgZm9yIHRoZSBjb25uZWN0aW9uIHBvaW50IGFkdmlzZSBjYWxsCiAqICByaWlkICAgICAgICBbSV0gUkVGSUlEIG9mIGNvbm5lY3Rpb24gcG9pbnQgdG8gYWR2aXNlCiAqICBiQWR2aXNlT25seSBbSV0gVFJVRSA9IEFkdmlzZSBvbmx5LCBGQUxTRSA9IFVuYWR2aXNlIGZpcnN0CiAqICBscFVua25vd24gICBbSV0gT2JqZWN0IHN1cHBvcnRpbmcgdGhlIElDb25uZWN0aW9uUG9pbnRDb250YWluZXIgaW50ZXJmYWNlCiAqICBscENvb2tpZSAgICBbT10gUG9pbnRlciB0byBjb25uZWN0aW9uIHBvaW50IGNvb2tpZQogKiAgbHBwQ1AgICAgICAgW09dIERlc3RpbmF0aW9uIGZvciB0aGUgSUNvbm5lY3Rpb25Qb2ludCBmb3VuZAogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBTX09LLiBJZiBscHBDUCBpcyBub24tTlVMTCwgaXQgaXMgZmlsbGVkIHdpdGggdGhlIElDb25uZWN0aW9uUG9pbnQKICogICAgICAgICAgIHRoYXQgd2FzIGFkdmlzZWQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2FibGUgZm9yIHJlbGVhc2luZyBpdC4KICogIEZhaWx1cmU6IEVfRkFJTCwgaWYgYW55IGFyZ3VtZW50cyBhcmUgaW52YWxpZC4KICogICAgICAgICAgIEVfTk9JTlRFUkZBQ0UsIGlmIGxwVW5rbm93biBpc24ndCBhbiBJQ29ubmVjdGlvblBvaW50Q29udGFpbmVyLAogKiAgICAgICAgICAgT3IgYW4gSFJFU1VMVCBlcnJvciBjb2RlIGlmIGFueSBjYWxsIGZhaWxzLgogKi8KSFJFU1VMVCBXSU5BUEkgU0hMV0FQSV8xNjgoSVVua25vd24qIGxwVW5rU2luaywgUkVGSUlEIHJpaWQsIEJPT0wgYkFkdmlzZU9ubHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duKiBscFVua25vd24sIExQRFdPUkQgbHBDb29raWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElDb25uZWN0aW9uUG9pbnQgKipscHBDUCkKewogIEhSRVNVTFQgaFJldDsKICBJQ29ubmVjdGlvblBvaW50Q29udGFpbmVyKiBscENvbnRhaW5lcjsKICBJQ29ubmVjdGlvblBvaW50ICpscENQOwoKICBpZighbHBVbmtub3duIHx8IChiQWR2aXNlT25seSAmJiAhbHBVbmtTaW5rKSkKICAgIHJldHVybiBFX0ZBSUw7CgogIGlmKGxwcENQKQogICAgKmxwcENQID0gTlVMTDsKCiAgaFJldCA9IElVbmtub3duX1F1ZXJ5SW50ZXJmYWNlKGxwVW5rbm93biwgJklJRF9JQ29ubmVjdGlvblBvaW50Q29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCoqKSZscENvbnRhaW5lcik7CiAgaWYgKFNVQ0NFRURFRChoUmV0KSkKICB7CiAgICBoUmV0ID0gSUNvbm5lY3Rpb25Qb2ludENvbnRhaW5lcl9GaW5kQ29ubmVjdGlvblBvaW50KGxwQ29udGFpbmVyLCByaWlkLCAmbHBDUCk7CgogICAgaWYgKFNVQ0NFRURFRChoUmV0KSkKICAgIHsKICAgICAgaWYoIWJBZHZpc2VPbmx5KQogICAgICAgIGhSZXQgPSBJQ29ubmVjdGlvblBvaW50X1VuYWR2aXNlKGxwQ1AsICpscENvb2tpZSk7CiAgICAgIGhSZXQgPSBJQ29ubmVjdGlvblBvaW50X0FkdmlzZShscENQLCBscFVua1NpbmssIGxwQ29va2llKTsKCiAgICAgIGlmIChGQUlMRUQoaFJldCkpCiAgICAgICAgKmxwQ29va2llID0gMDsKCiAgICAgIGlmIChscHBDUCAmJiBTVUNDRUVERUQoaFJldCkpCiAgICAgICAgKmxwcENQID0gbHBDUDsgLyogQ2FsbGVyIGtlZXBzIHRoZSBpbnRlcmZhY2UgKi8KICAgICAgZWxzZQogICAgICAgIElDb25uZWN0aW9uUG9pbnRfUmVsZWFzZShscENQKTsgLyogUmVsZWFzZSBpdCAqLwogICAgfQoKICAgIElVbmtub3duX1JlbGVhc2UobHBDb250YWluZXIpOwogIH0KICByZXR1cm4gaFJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQAlbU0hMV0FQSS4xNjldCiAqCiAqCiAqIFJlbGVhc2UgYW4gaW50ZXJmYWNlLgogKgogKiBQQVJBTVMKICogIGxwVW5rbm93biBbSV0gT2JqZWN0IHRvIHJlbGVhc2UKICoKICogUkVUVVJOUwogKiAgTm90aGluZy4KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE2OSAoSVVua25vd24gKiogbHBVbmtub3duKQp7CiAgICAgICAgSVVua25vd24gKnRlbXA7CgoJVFJBQ0UoIiglcClcbiIsbHBVbmtub3duKTsKCWlmKCFscFVua25vd24gfHwgISooKExQRFdPUkQpbHBVbmtub3duKSkgcmV0dXJuIDA7Cgl0ZW1wID0gKmxwVW5rbm93bjsKCSpscFVua25vd24gPSBOVUxMOwoJVFJBQ0UoImRvaW5nIFJlbGVhc2VcbiIpOwoJcmV0dXJuIElVbmtub3duX1JlbGVhc2UodGVtcCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNzBdCiAqCiAqIFNraXAgJy8vJyBpZiBwcmVzZW50IGluIGEgc3RyaW5nLgogKgogKiBQQVJBTVMKICogIGxwc3pTcmMgW0ldIFN0cmluZyB0byBjaGVjayBmb3IgJy8vJwogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBUaGUgbmV4dCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlICcvLycgb3IgdGhlIHN0cmluZyBpZiBub3QgcHJlc2VudAogKiAgRmFpbHVyZTogTlVMTCwgaWYgbHBzelN0ciBpcyBOVUxMLgogKi8KTFBDU1RSIFdJTkFQSSBTSExXQVBJXzE3MChMUENTVFIgbHBzelNyYykKewogIGlmIChscHN6U3JjICYmIGxwc3pTcmNbMF0gPT0gJy8nICYmIGxwc3pTcmNbMV0gPT0gJy8nKQogICAgbHBzelNyYyArPSAyOwogIHJldHVybiBscHN6U3JjOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJCVtTSExXQVBJLjE3MV0KICoKICogX1NISXNTYW1lT2JqZWN0CiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzE3MShMUFZPSUQgeCwgTFBWT0lEIHkpCnsKCUZJWE1FKCIlcCAlcFxuIix4LHkpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNzJdCiAqCiAqIEdldCB0aGUgd2luZG93IGhhbmRsZSBvZiBhbiBvYmplY3QuCiAqCiAqIFBBUkFNUwogKiAgbHBVbmtub3duIFtJXSBPYmplY3QgdG8gZ2V0IHRoZSB3aW5kb3cgaGFuZGxlIG9mCiAqICBscGhXbmQgICAgW09dIERlc3RpbmF0aW9uIGZvciB3aW5kb3cgaGFuZGxlCiAqCiAqIFJFVFVSTlMKICogIFN1Y2Nlc3M6IFNfT0suIGxwaFduZCBjb250YWlucyB0aGUgb2JqZWN0cyB3aW5kb3cgaGFuZGxlLgogKiAgRmFpbHVyZTogQW4gSFJFU1VMVCBlcnJvciBjb2RlLgogKgogKiBOT1RFUwogKiAgbHBVbmtub3duIGlzIGV4cGVjdGVkIHRvIHN1cHBvcnQgb25lIG9mIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlczoKICogICBJT2xlV2luZG93CiAqICAgSUludGVybmV0U2VjdXJpdHlNZ3JTaXRlCiAqICAgSVNoZWxsVmlldwogKi8KSFJFU1VMVCBXSU5BUEkgU0hMV0FQSV8xNzIoSVVua25vd24gKmxwVW5rbm93biwgUEhXTkQgbHBoV25kKQp7CiAgLyogRklYTUU6IFdpbmUgaGFzIG5vIGhlYWRlciBmb3IgdGhpcyBvYmplY3QgKi8KICBzdGF0aWMgY29uc3QgR1VJRCBJSURfSUludGVybmV0U2VjdXJpdHlNZ3JTaXRlID0geyAweDc5ZWFjOWVkLAogICAgMHhiYWY5LCAweDExY2UsIHsgMHg4YywgMHg4MiwgMHgwMCwgMHhhYSwgMHgwMCwgMHg0YiwgMHhhOSwgMHgwYiB9fTsKICBJVW5rbm93biAqbHBPbGU7CiAgSFJFU1VMVCBoUmV0ID0gRV9GQUlMOwoKICBUUkFDRSgiKCVwLCVwKVxuIiwgbHBVbmtub3duLCBscGhXbmQpOwoKICBpZiAoIWxwVW5rbm93bikKICAgIHJldHVybiBoUmV0OwoKICBoUmV0ID0gSVVua25vd25fUXVlcnlJbnRlcmZhY2UobHBVbmtub3duLCAmSUlEX0lPbGVXaW5kb3csICh2b2lkKiopJmxwT2xlKTsKCiAgaWYgKEZBSUxFRChoUmV0KSkKICB7CiAgICBoUmV0ID0gSVVua25vd25fUXVlcnlJbnRlcmZhY2UobHBVbmtub3duLCZJSURfSVNoZWxsVmlldywgKHZvaWQqKikmbHBPbGUpOwoKICAgIGlmIChGQUlMRUQoaFJldCkpCiAgICB7CiAgICAgIGhSZXQgPSBJVW5rbm93bl9RdWVyeUludGVyZmFjZShscFVua25vd24sICZJSURfSUludGVybmV0U2VjdXJpdHlNZ3JTaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiopJmxwT2xlKTsKICAgIH0KICB9CgogIGlmIChTVUNDRUVERUQoaFJldCkpCiAgewogICAgLyogTGF6eW5lc3MgaGVyZSAtIFNpbmNlIEdldFdpbmRvdygpIGlzIHRoZSBmaXJzdCBtZXRob2QgZm9yIHRoZSBhYm92ZSAzCiAgICAgKiBpbnRlcmZhY2VzLCB3ZSB1c2UgdGhlIHNhbWUgY2FsbCBmb3IgdGhlbSBhbGwuCiAgICAgKi8KICAgIGhSZXQgPSBJT2xlV2luZG93X0dldFdpbmRvdygoSU9sZVdpbmRvdyopbHBPbGUsIGxwaFduZCk7CiAgICBJVW5rbm93bl9SZWxlYXNlKGxwT2xlKTsKICAgIGlmIChscGhXbmQpCiAgICAgIFRSQUNFKCJSZXR1cm5pbmcgSFdORD0lcFxuIiwgKmxwaFduZCk7CiAgfQoKICByZXR1cm4gaFJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE3NF0KICoKICogU2VlbXMgdG8gZG8gY2FsbCBlaXRoZXIgSU9iamVjdFdpdGhTaXRlOjpTZXRTaXRlIG9yCiAqICAgSVBlcnNpc3RNb25pa2VyOjpHZXRDbGFzc0lELiAgQnV0IHNpbmNlIHdlIGRvIG5vdCBpbXBsZW1lbnQgZWl0aGVyCiAqICAgb2YgdGhvc2UgY2xhc3NlcyBpbiBvdXIgaGVhZGVycywgd2Ugd2lsbCBmYWtlIGl0IG91dC4KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE3NCgKCUlVbmtub3duICpwMSwgICAgIC8qIFtpbl0gICBPTEUgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIExQVk9JRCAqcDIpICAgICAgIC8qIFtvdXRdICBwdHIgdG8gcmVzdWx0IG9mIGVpdGhlciBHZXRDbGFzc0lECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFNldFNpdGUgY2FsbC4gICAgICAgICAgICAgICAgICAgICovCnsKICAgIERXT1JEIHJldCwgYWE7CgogICAgaWYgKCFwMSkgcmV0dXJuIEVfRkFJTDsKCiAgICAvKiBzZWUgaWYgU2V0U2l0ZSBpbnRlcmZhY2UgZXhpc3RzIGZvciBJT2JqZWN0V2l0aFNpdGUgb2JqZWN0ICovCiAgICByZXQgPSBJVW5rbm93bl9RdWVyeUludGVyZmFjZSgoSVVua25vd24gKilwMSwgKFJFRklJRClpZDEsIChMUFZPSUQgKikmcDEpOwogICAgVFJBQ0UoImZpcnN0IElVX1FJIHJldD0lMDhseCwgcDE9JXBcbiIsIHJldCwgcDEpOwogICAgaWYgKHJldCkgewoKCS8qIHNlZSBpZiBHZXRDbGFzc0lkIGludGVyZmFjZSBleGlzdHMgZm9yIElQZXJzaXN0TW9uaWtlciBvYmplY3QgKi8KCXJldCA9IElVbmtub3duX1F1ZXJ5SW50ZXJmYWNlKChJVW5rbm93biAqKXAxLCAoUkVGSUlEKWlkMiwgKExQVk9JRCAqKSZhYSk7CglUUkFDRSgic2Vjb25kIElVX1FJIHJldD0lMDhseCwgYWE9JTA4bHhcbiIsIHJldCwgYWEpOwoJaWYgKHJldCkgcmV0dXJuIHJldDsKCgkvKiBmYWtlIGEgR2V0Q2xhc3NJZCBjYWxsICovCglyZXQgPSBJT2xlV2luZG93X0dldFdpbmRvdygoSU9sZVdpbmRvdyAqKWFhLCAoSFdORCopcDIpOwoJVFJBQ0UoInNlY29uZCBJVV9RSSBkb2luZyAweDBjIHJldD0lMDhseCwgKnAyPSUwOGx4XG4iLCByZXQsCgkgICAgICAqKExQRFdPUkQpcDIpOwoJSVVua25vd25fUmVsZWFzZSgoSVVua25vd24gKilhYSk7CiAgICB9CiAgICBlbHNlIHsKCS8qIGZha2UgYSBTZXRTaXRlIGNhbGwgKi8KCXJldCA9IElPbGVXaW5kb3dfR2V0V2luZG93KChJT2xlV2luZG93ICopcDEsIChIV05EKilwMik7CglUUkFDRSgiZmlyc3QgSVVfUUkgZG9pbmcgMHgwYyByZXQ9JTA4bHgsICpwMj0lMDhseFxuIiwgcmV0LAoJICAgICAgKihMUERXT1JEKXAyKTsKCUlVbmtub3duX1JlbGVhc2UoKElVbmtub3duICopcDEpOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE3NV0KICoKICogQ2FsbCBJUGVyc2lzdDo6R2V0Q2xhc3NJRCBvbiBhbiBvYmplY3QuCiAqCiAqIFBBUkFNUwogKiAgbHBVbmtub3duIFtJXSBPYmplY3Qgc3VwcG9ydGluZyB0aGUgSVBlcnNpc3QgaW50ZXJmYWNlCiAqICBscENsYXNzSWQgW09dIERlc3RpbmF0aW9uIGZvciBDbGFzcyBJZAogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBTX09LLiBscENsYXNzSWQgY29udGFpbnMgdGhlIENsYXNzIElkIHJlcXVlc3RlZC4KICogIEZhaWx1cmU6IEVfRkFJTCwgSWYgbHBVbmtub3duIGlzIE5VTEwsCiAqICAgICAgICAgICBFX05PSU5URVJGQUNFIElmIGxwVW5rbm93biBkb2VzIG5vdCBzdXBwb3J0IElQZXJzaXN0LAogKiAgICAgICAgICAgT3IgYW4gSFJFU1VMVCBlcnJvciBjb2RlLgogKi8KSFJFU1VMVCBXSU5BUEkgU0hMV0FQSV8xNzUgKElVbmtub3duICpscFVua25vd24sIENMU0lEKiBscENsYXNzSWQpCnsKICBJUGVyc2lzdCogbHBQZXJzaXN0OwogIEhSRVNVTFQgaFJldCA9IEVfRkFJTDsKCiAgVFJBQ0UoIiglcCwlcClcbiIsIGxwVW5rbm93biwgZGVidWdzdHJfZ3VpZChscENsYXNzSWQpKTsKCiAgaWYgKGxwVW5rbm93bikKICB7CiAgICBoUmV0ID0gSVVua25vd25fUXVlcnlJbnRlcmZhY2UobHBVbmtub3duLCZJSURfSVBlcnNpc3QsKHZvaWQqKikmbHBQZXJzaXN0KTsKICAgIGlmIChTVUNDRUVERUQoaFJldCkpCiAgICB7CiAgICAgIElQZXJzaXN0X0dldENsYXNzSUQobHBQZXJzaXN0LCBscENsYXNzSWQpOwogICAgICBJUGVyc2lzdF9SZWxlYXNlKGxwUGVyc2lzdCk7CiAgICB9CiAgfQogIHJldHVybiBoUmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTc2XQogKgogKiBSZXRyaWV2ZSBhIFNlcnZpY2UgSW50ZXJmYWNlIGZyb20gYW4gb2JqZWN0LgogKgogKiBQQVJBTVMKICogIGxwVW5rbm93biBbSV0gT2JqZWN0IHRvIGdldCBhbiBJU2VydmljZVByb3ZpZGVyIGludGVyZmFjZSBmcm9tCiAqICBzaWQgICAgICAgW0ldIFNlcnZpY2UgSUQgZm9yIFF1ZXJ5U2VydmljZSBjYWxsCiAqICByaWlkICAgICAgW0ldIEZ1bmN0aW9uIHJlcXVlc3RlZCBmb3IgUXVlcnlTZXJ2aWNlIGNhbGwKICogIGxwcE91dCAgICBbT10gRGVzdGluYXRpb24gZm9yIHRoZSBzZXJ2aWNlIGludGVyZmFjZSBwb2ludGVyCiAqCiAqIEZ1bmN0aW9uIGFwcGVhcnMgdG8gYmUgaW50ZXJmYWNlIHRvIElTZXJ2aWNlUHJvdmlkZXI6OlF1ZXJ5U2VydmljZQogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBTX09LLiBscHBPdXQgY29udGFpbnMgYW4gb2JqZWN0IHByb3ZpZGluZyB0aGUgcmVxdWVzdGVkIHNlcnZpY2UKICogIEZhaWx1cmU6IEFuIEhSRVNVTFQgZXJyb3IgY29kZQogKgogKiBOT1RFUwogKiAgbHBVbmtub3duIGlzIGV4cGVjdGVkIHRvIHN1cHBvcnQgdGhlIElTZXJ2aWNlUHJvdmlkZXIgaW50ZXJmYWNlLgogKi8KSFJFU1VMVCBXSU5BUEkgU0hMV0FQSV8xNzYoSVVua25vd24qIGxwVW5rbm93biwgUkVGR1VJRCBzaWQsIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgKmxwcE91dCkKewogIElTZXJ2aWNlUHJvdmlkZXIqIHBTZXJ2aWNlID0gTlVMTDsKICBIUkVTVUxUIGhSZXQ7CgogIGlmICghbHBwT3V0KQogICAgcmV0dXJuIEVfRkFJTDsKCiAgKmxwcE91dCA9IE5VTEw7CgogIGlmICghbHBVbmtub3duKQogICAgcmV0dXJuIEVfRkFJTDsKCiAgLyogR2V0IGFuIElTZXJ2aWNlUHJvdmlkZXIgaW50ZXJmYWNlIGZyb20gdGhlIG9iamVjdCAqLwogIGhSZXQgPSBJVW5rbm93bl9RdWVyeUludGVyZmFjZShscFVua25vd24sICZJSURfSVNlcnZpY2VQcm92aWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCopJnBTZXJ2aWNlKTsKCiAgaWYgKCFoUmV0ICYmIHBTZXJ2aWNlKQogIHsKICAgIFRSQUNFKCJRdWVyeUludGVyZmFjZSByZXR1cm5lZCAoSVNlcnZpY2VQcm92aWRlciopJXBcbiIsIHBTZXJ2aWNlKTsKCiAgICAvKiBHZXQgYSBTZXJ2aWNlIGludGVyZmFjZSBmcm9tIHRoZSBvYmplY3QgKi8KICAgIGhSZXQgPSBJU2VydmljZVByb3ZpZGVyX1F1ZXJ5U2VydmljZShwU2VydmljZSwgc2lkLCByaWlkLCBscHBPdXQpOwoKICAgIFRSQUNFKCIoSVNlcnZpY2VQcm92aWRlciopJXAgcmV0dXJuZWQgKElVbmtub3duKiklcFxuIiwgcFNlcnZpY2UsICpscHBPdXQpOwoKICAgIC8qIFJlbGVhc2UgdGhlIElTZXJ2aWNlUHJvdmlkZXIgaW50ZXJmYWNlICovCiAgICBJVW5rbm93bl9SZWxlYXNlKHBTZXJ2aWNlKTsKICB9CiAgcmV0dXJuIGhSZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xODBdCiAqCiAqIFJlbW92ZSBhbGwgc3ViLW1lbnVzIGZyb20gYSBtZW51LgogKgogKiBQQVJBTVMKICogIGhNZW51IFtJXSBNZW51IHRvIHJlbW92ZSBzdWItbWVudXMgZnJvbQogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiAwLiAgQWxsIHN1Yi1tZW51cyB1bmRlciBoTWVudSBhcmUgcmVtb3ZlZAogKiAgRmFpbHVyZTogLTEsIGlmIGFueSBwYXJhbWV0ZXIgaXMgaW52YWxpZAogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTgwKEhNRU5VIGhNZW51KQp7CiAgaW50IGlJdGVtQ291bnQgPSBHZXRNZW51SXRlbUNvdW50KGhNZW51KSAtIDE7CiAgd2hpbGUgKGlJdGVtQ291bnQgPj0gMCkKICB7CiAgICBITUVOVSBoU3ViTWVudSA9IEdldFN1Yk1lbnUoaE1lbnUsIGlJdGVtQ291bnQpOwogICAgaWYgKGhTdWJNZW51KQogICAgICBSZW1vdmVNZW51KGhNZW51LCBpSXRlbUNvdW50LCAweDQwMCk7CiAgICBpSXRlbUNvdW50LS07CiAgfQogIHJldHVybiBpSXRlbUNvdW50Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTgxXQogKgogKiBFbmFibGUgb3IgZGlzYWJsZSBhIG1lbnUgaXRlbS4KICoKICogUEFSQU1TCiAqICBoTWVudSAgIFtJXSBNZW51IGhvbGRpbmcgbWVudSBpdGVtCiAqICB1SUQgICAgIFtJXSBJRCBvZiBtZW51IGl0ZW0gdG8gZW5hYmxlL2Rpc2FibGUKICogIGJFbmFibGUgW0ldIFdoZXRoZXIgdG8gZW5hYmxlIChUUlVFKSBvciBkaXNhYmxlIChGQUxTRSkgdGhlIGl0ZW0uCiAqCiAqIFJFVFVSTlMKICogIFRoZSByZXR1cm4gY29kZSBmcm9tIENoZWNrTWVudUl0ZW0uCiAqLwpVSU5UIFdJTkFQSSBTSExXQVBJXzE4MShITUVOVSBoTWVudSwgVUlOVCB3SXRlbUlELCBCT09MIGJFbmFibGUpCnsKICByZXR1cm4gRW5hYmxlTWVudUl0ZW0oaE1lbnUsIHdJdGVtSUQsIGJFbmFibGUgPyBNRl9FTkFCTEVEIDogTUZfR1JBWUVEKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQAlbU0hMV0FQSS4xODJdCiAqCiAqIENoZWNrIG9yIHVuY2hlY2sgYSBtZW51IGl0ZW0uCiAqCiAqIFBBUkFNUwogKiAgaE1lbnUgIFtJXSBNZW51IGhvbGRpbmcgbWVudSBpdGVtCiAqICB1SUQgICAgW0ldIElEIG9mIG1lbnUgaXRlbSB0byBjaGVjay91bmNoZWNrCiAqICBiQ2hlY2sgW0ldIFdoZXRoZXIgdG8gY2hlY2sgKFRSVUUpIG9yIHVuY2hlY2sgKEZBTFNFKSB0aGUgaXRlbS4KICoKICogUkVUVVJOUwogKiAgVGhlIHJldHVybiBjb2RlIGZyb20gQ2hlY2tNZW51SXRlbS4KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE4MihITUVOVSBoTWVudSwgVUlOVCB1SUQsIEJPT0wgYkNoZWNrKQp7CiAgcmV0dXJuIENoZWNrTWVudUl0ZW0oaE1lbnUsIHVJRCwgYkNoZWNrID8gTUZfQ0hFQ0tFRCA6IDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTgzXQogKgogKiBSZWdpc3RlciBhIHdpbmRvdyBjbGFzcyBpZiBpdCBpc24ndCBhbHJlYWR5LgogKgogKiBQQVJBTVMKICogIGxwV25kQ2xhc3MgW0ldIFdpbmRvdyBjbGFzcyB0byByZWdpc3RlcgogKgogKiBSRVRVUk5TCiAqICBUaGUgcmVzdWx0IG9mIHRoZSBSZWdpc3RlckNsYXNzQSBjYWxsLgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTgzKFdORENMQVNTQSAqd25kY2xhc3MpCnsKICBXTkRDTEFTU0Egd2NhOwogIGlmIChHZXRDbGFzc0luZm9BKHduZGNsYXNzLT5oSW5zdGFuY2UsIHduZGNsYXNzLT5scHN6Q2xhc3NOYW1lLCAmd2NhKSkKICAgIHJldHVybiBUUlVFOwogIHJldHVybiAoRFdPUkQpUmVnaXN0ZXJDbGFzc0Eod25kY2xhc3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTg3XQogKgogKiBDYWxsIElQZXJzaXN0UHJvcGVydHlCYWc6OkxvYWQgb24gYW4gb2JqZWN0LgogKgogKiBQQVJBTVMKICogIGxwVW5rbm93biBbSV0gT2JqZWN0IHN1cHBvcnRpbmcgdGhlIElQZXJzaXN0UHJvcGVydHlCYWcgaW50ZXJmYWNlCiAqICBscFByb3BCYWcgW09dIERlc3RpbmF0aW9uIGZvciBsb2FkZWQgSVByb3BlcnR5QmFnCiAqCiAqIFJFVFVSTlMKICogIFN1Y2Nlc3M6IFNfT0suCiAqICBGYWlsdXJlOiBBbiBIUkVTVUxUIGVycm9yIGNvZGUsIG9yIEVfRkFJTCBpZiBscFVua25vd24gaXMgTlVMTC4KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE4NyhJVW5rbm93biAqbHBVbmtub3duLCBJUHJvcGVydHlCYWcqIGxwUHJvcEJhZykKewogIElQZXJzaXN0UHJvcGVydHlCYWcqIGxwUFBCYWc7CiAgSFJFU1VMVCBoUmV0ID0gRV9GQUlMOwoKICBUUkFDRSgiKCVwLCVwKVxuIiwgbHBVbmtub3duLCBscFByb3BCYWcpOwoKICBpZiAobHBVbmtub3duKQogIHsKICAgIGhSZXQgPSBJVW5rbm93bl9RdWVyeUludGVyZmFjZShscFVua25vd24sICZJSURfSVBlcnNpc3RQcm9wZXJ0eUJhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCoqKSZscFBQQmFnKTsKICAgIGlmIChTVUNDRUVERUQoaFJldCkgJiYgbHBQUEJhZykKICAgIHsKICAgICAgaFJldCA9IElQZXJzaXN0UHJvcGVydHlCYWdfTG9hZChscFBQQmFnLCBscFByb3BCYWcsIE5VTEwpOwogICAgICBJUGVyc2lzdFByb3BlcnR5QmFnX1JlbGVhc2UobHBQUEJhZyk7CiAgICB9CiAgfQogIHJldHVybiBoUmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTg5XQogKgogKiBfSVVua25vd25fT25Gb2N1c09DUwogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTg5KExQVk9JRCB4LCBMUFZPSUQgeSkKewoJRklYTUUoIiVwICVwXG4iLCB4LCB5KTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTkzXQogKgogKiBHZXQgdGhlIGNvbG9yIGRlcHRoIG9mIHRoZSBwcmltYXJ5IGRpc3BsYXkuCiAqCiAqIFBBUkFNUwogKiAgTm9uZS4KICoKICogUkVUVVJOUwogKiAgVGhlIGNvbG9yIGRlcHRoIG9mIHRoZSBwcmltYXJ5IGRpc3BsYXkuCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xOTMgKCkKewoJSERDIGhkYzsKCURXT1JEIHJldDsKCglUUkFDRSgiKClcbiIpOwoKCWhkYyA9IEdldERDKDApOwoJcmV0ID0gR2V0RGV2aWNlQ2FwcyhoZGMsIEJJVFNQSVhFTCkgKiBHZXREZXZpY2VDYXBzKGhkYywgUExBTkVTKTsKCVJlbGVhc2VEQygwLCBoZGMpOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBAICAgICAgIFtTSExXQVBJLjE5N10KICoKICogQmxhbmsgb3V0IGEgcmVnaW9uIG9mIHRleHQgYnkgZHJhd2luZyB0aGUgYmFja2dyb3VuZCBvbmx5LgogKgogKiBQQVJBTVMKICogIGhEQyAgIFtJXSBEZXZpY2UgY29udGV4dCB0byBkcmF3IGluCiAqICBwUmVjdCBbSV0gQXJlYSB0byBkcmF3IGluCiAqICBjUmVmICBbSV0gQ29sb3IgdG8gZHJhdyBpbgogKgogKiBSRVRVUk5TCiAqICBOb3RoaW5nLgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTk3KEhEQyBoREMsIExQQ1JFQ1QgcFJlY3QsIENPTE9SUkVGIGNSZWYpCnsKICAgIENPTE9SUkVGIGNPbGRDb2xvciA9IFNldEJrQ29sb3IoaERDLCBjUmVmKTsKICAgIEV4dFRleHRPdXRBKGhEQywgMCwgMCwgRVRPX09QQVFVRSwgcFJlY3QsIDAsIDAsIDApOwogICAgU2V0QmtDb2xvcihoREMsIGNPbGRDb2xvcik7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE5OV0KICoKICogQ29weSBpbnRlcmZhY2UgcG9pbnRlcgogKgogKiBQQVJBTVMKICogICBscHBEZXN0ICAgW09dIERlc3RpbmF0aW9uIGZvciBjb3B5CiAqICAgbHBVbmtub3duIFtJXSBTb3VyY2UgZm9yIGNvcHkKICoKICogUkVUVVJOUwogKiAgTm90aGluZy4KICovClZPSUQgV0lOQVBJIFNITFdBUElfMTk5KElVbmtub3duICoqbHBwRGVzdCwgSVVua25vd24gKmxwVW5rbm93bikKewogIFRSQUNFKCIoJXAsJXApXG4iLCBscHBEZXN0LCBscFVua25vd24pOwoKICBpZiAobHBwRGVzdCkKICAgIFNITFdBUElfMTY5KGxwcERlc3QpOyAvKiBSZWxlYXNlIGV4aXN0aW5nIGludGVyZmFjZSAqLwoKICBpZiAobHBVbmtub3duKQogIHsKICAgIC8qIENvcHkgKi8KICAgIElVbmtub3duX0FkZFJlZihscFVua25vd24pOwogICAgKmxwcERlc3QgPSBscFVua25vd247CiAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjAxXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hMV0FQSV8yMDEoSVVua25vd24qIGxwVW5rbm93biwgSU5UIGlVbmssIFJFRkdVSUQgcGd1aWRDbWRHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgbkNtZElELCBEV09SRCBuQ21kZXhlY29wdCwgVkFSSUFOVCogcHZhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUklBTlQqIHB2YU91dCkKewogIEZJWE1FKCIoJXAsJWQsJXAsJWxkLCVsZCwlcCwlcCkgLSBzdHViIVxuIiwgbHBVbmtub3duLCBpVW5rLCBwZ3VpZENtZEdyb3VwLAogICAgICAgIG5DbWRJRCwgbkNtZGV4ZWNvcHQsIHB2YUluLCBwdmFPdXQpOwogIHJldHVybiBEUkFHRFJPUF9FX05PVFJFR0lTVEVSRUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yMDJdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSExXQVBJXzIwMihSRUZHVUlEIHBndWlkQ21kR3JvdXAsVUxPTkcgY0NtZHMsIE9MRUNNRCAqcHJnQ21kcykKewogIEZJWE1FKCIoJXAsJWxkLCVwKSAtIHN0dWIhXG4iLCBwZ3VpZENtZEdyb3VwLCBjQ21kcywgcHJnQ21kcyk7CiAgcmV0dXJuIERSQUdEUk9QX0VfTk9UUkVHSVNURVJFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIwM10KICoKICovClZPSUQgV0lOQVBJIFNITFdBUElfMjAzKExQQ1NUUiBscHN6U3RyKQp7CiAgRklYTUUoIiglcykgLSBzdHViIVxuIiwgZGVidWdzdHJfYShscHN6U3RyKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEAJW1NITFdBUEkuMjA0XQogKgogKiBEZXRlcm1pbmUgaWYgYSB3aW5kb3cgaXMgbm90IGEgY2hpbGQgb2YgYW5vdGhlciB3aW5kb3cuCiAqCiAqIFBBUkFNUwogKiBoUGFyZW50IFtJXSBTdXNwZWN0ZWQgcGFyZW50IHdpbmRvdwogKiBoQ2hpbGQgIFtJXSBTdXNwZWN0ZWQgY2hpbGQgd2luZG93CiAqCiAqIFJFVFVSTlMKICogVFJVRTogIElmIGhDaGlsZCBpcyBhIGNoaWxkIHdpbmRvdyBvZiBoUGFyZW50CiAqIEZBTFNFOiBJZiBoQ2hpbGQgaXMgbm90IGEgY2hpbGQgd2luZG93IG9mIGhQYXJlbnQsIG9yIHRoZXkgYXJlIGVxdWFsCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzIwNChIV05EIGhQYXJlbnQsIEhXTkQgaENoaWxkKQp7CiAgVFJBQ0UoIiglcCwlcClcbiIsIGhQYXJlbnQsIGhDaGlsZCk7CgogIGlmICghaFBhcmVudCB8fCAhaENoaWxkKQogICAgcmV0dXJuIFRSVUU7CiAgZWxzZSBpZihoUGFyZW50ID09IGhDaGlsZCkKICAgIHJldHVybiBGQUxTRTsKICByZXR1cm4gIUlzQ2hpbGQoaFBhcmVudCwgaENoaWxkKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIwOF0KICoKICogU29tZSBzb3J0IG9mIG1lbW9yeSBtYW5hZ2VtZW50IHByb2Nlc3MgLSBhc3NvY2lhdGVkIHdpdGggXzIxMAogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjA4ICgKCURXT1JEICAgIGEsCglEV09SRCAgICBiLAoJTFBWT0lEICAgYywKCUxQVk9JRCAgIGQsCglEV09SRCAgICBlKQp7CiAgICBGSVhNRSgiKDB4JTA4bHggMHglMDhseCAlcCAlcCAweCUwOGx4KSBzdHViXG4iLAoJICBhLCBiLCBjLCBkLCBlKTsKICAgIHJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjA5XQogKgogKiBTb21lIHNvcnQgb2YgbWVtb3J5IG1hbmFnZW1lbnQgcHJvY2VzcyAtIGFzc29jaWF0ZWQgd2l0aCBfMjA4CiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yMDkgKAoJTFBWT0lEICAgYSkKewogICAgRklYTUUoIiglcCkgc3R1YlxuIiwKCSAgYSk7CiAgICByZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIxMF0KICoKICogU29tZSBzb3J0IG9mIG1lbW9yeSBtYW5hZ2VtZW50IHByb2Nlc3MgLSBhc3NvY2lhdGVkIHdpdGggXzIwOAogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjEwICgKCUxQVk9JRCAgIGEsCglEV09SRCAgICBiLAoJTFBWT0lEICAgYykKewogICAgRklYTUUoIiglcCAweCUwOGx4ICVwKSBzdHViXG4iLAoJICBhLCBiLCBjKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjExXQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjExICgKCUxQVk9JRCAgIGEsCglEV09SRCAgICBiKQp7CiAgICBGSVhNRSgiKCVwIDB4JTA4bHgpIHN0dWJcbiIsCgkgIGEsIGIpOwogICAgcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yMTVdCiAqCiAqIE5PVEVTCiAqICBjaGVjayBtZSEKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzIxNSAoCglMUENTVFIgbHBTdHJTcmMsCglMUFdTVFIgbHB3U3RyRGVzdCwKCWludCBsZW4pCnsKCUlOVCBsZW5fYSwgcmV0OwoKCWxlbl9hID0gbHN0cmxlbkEobHBTdHJTcmMpOwoJcmV0ID0gTXVsdGlCeXRlVG9XaWRlQ2hhcigwLCAwLCBscFN0clNyYywgbGVuX2EsIGxwd1N0ckRlc3QsIGxlbik7CglUUkFDRSgiJXMgJXMgJWQsIHJldD0lZFxuIiwKCSAgICAgIGRlYnVnc3RyX2EobHBTdHJTcmMpLCBkZWJ1Z3N0cl93KGxwd1N0ckRlc3QpLCBsZW4sIHJldCk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjE4XQogKgogKiBXaWRlQ2hhclRvTXVsdGlCeXRlIHdpdGggbXVsdGkgbGFuZ3VhZ2Ugc3VwcG9ydC4KICovCklOVCBXSU5BUEkgU0hMV0FQSV8yMTgoVUlOVCBDb2RlUGFnZSwgTFBDV1NUUiBscFNyY1N0ciwgTFBTVFIgbHBEc3RTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgTFBJTlQgbHBuTXVsdGlDaGFyQ291bnQpCnsKICBXQ0hBUiBlbXB0eVdbXSA9IHsgJ1wwJyB9OwogIGludCBsZW4gLCByZXFMZW47CiAgTFBTVFIgbWVtOwoKICBpZiAoIWxwRHN0U3RyIHx8ICFscG5NdWx0aUNoYXJDb3VudCkKICAgIHJldHVybiAwOwoKICBpZiAoIWxwU3JjU3RyKQogICAgbHBTcmNTdHIgPSBlbXB0eVc7CgogICpscERzdFN0ciA9ICdcMCc7CgogIGxlbiA9IHN0cmxlblcobHBTcmNTdHIpICsgMTsKCiAgc3dpdGNoIChDb2RlUGFnZSkKICB7CiAgY2FzZSBDUF9XSU5VTklDT0RFOgogICAgQ29kZVBhZ2UgPSBDUF9VVEY4OyAvKiBGYWxsIHRocm91Z2guLi4gKi8KICBjYXNlIDB4MDAwMEMzNTA6IC8qIEZJWE1FOiBDUF8gI2RlZmluZSAqLwogIGNhc2UgQ1BfVVRGNzoKICBjYXNlIENQX1VURjg6CiAgICB7CiAgICAgIERXT1JEIGR3TW9kZSA9IDA7CiAgICAgIElOVCBuV2lkZUNoYXJDb3VudCA9IGxlbiAtIDE7CgogICAgICBHRVRfRlVOQyhwQ29udmVydElOZXRVbmljb2RlVG9NdWx0aUJ5dGUsIG1sYW5nLCAiQ29udmVydElOZXRVbmljb2RlVG9NdWx0aUJ5dGUiLCAwKTsKICAgICAgaWYgKCFwQ29udmVydElOZXRVbmljb2RlVG9NdWx0aUJ5dGUoJmR3TW9kZSwgQ29kZVBhZ2UsIGxwU3JjU3RyLCAmbldpZGVDaGFyQ291bnQsIGxwRHN0U3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscG5NdWx0aUNoYXJDb3VudCkpCiAgICAgICAgcmV0dXJuIDA7CgogICAgICBpZiAobldpZGVDaGFyQ291bnQgPCBsZW4gLSAxKQogICAgICB7CiAgICAgICAgbWVtID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCAqbHBuTXVsdGlDaGFyQ291bnQpOwogICAgICAgIGlmICghbWVtKQogICAgICAgICAgcmV0dXJuIDA7CgogICAgICAgICpscG5NdWx0aUNoYXJDb3VudCA9IDA7CgogICAgICAgIGlmIChwQ29udmVydElOZXRVbmljb2RlVG9NdWx0aUJ5dGUoJmR3TW9kZSwgQ29kZVBhZ2UsIGxwU3JjU3RyLCAmbGVuLCBtZW0sIGxwbk11bHRpQ2hhckNvdW50KSkKICAgICAgICB7CiAgICAgICAgICBTSExXQVBJXzE2MiAobWVtLCAqbHBuTXVsdGlDaGFyQ291bnQpOwogICAgICAgICAgbHN0cmNweW5BKGxwRHN0U3RyLCBtZW0sICpscG5NdWx0aUNoYXJDb3VudCArIDEpOwogICAgICAgICAgcmV0dXJuICpscG5NdWx0aUNoYXJDb3VudCArIDE7CiAgICAgICAgfQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG1lbSk7CiAgICAgICAgcmV0dXJuICpscG5NdWx0aUNoYXJDb3VudDsKICAgICAgfQogICAgICBscERzdFN0clsqbHBuTXVsdGlDaGFyQ291bnRdID0gJ1wwJzsKICAgICAgcmV0dXJuICpscG5NdWx0aUNoYXJDb3VudDsKICAgIH0KICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICBicmVhazsKICB9CgogIHJlcUxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ29kZVBhZ2UsIDAsIGxwU3JjU3RyLCBsZW4sIGxwRHN0U3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxwbk11bHRpQ2hhckNvdW50LCBOVUxMLCBOVUxMKTsKCiAgaWYgKCFyZXFMZW4gJiYgR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikKICB7CiAgICByZXFMZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENvZGVQYWdlLCAwLCBscFNyY1N0ciwgbGVuLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKICAgIGlmIChyZXFMZW4pCiAgICB7CiAgICAgIG1lbSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcmVxTGVuKTsKICAgICAgaWYgKG1lbSkKICAgICAgewogICAgICAgIHJlcUxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ29kZVBhZ2UsIDAsIGxwU3JjU3RyLCBsZW4sIG1lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcUxlbiwgTlVMTCwgTlVMTCk7CgogICAgICAgIHJlcUxlbiA9IFNITFdBUElfMTYyKG1lbSwgKmxwbk11bHRpQ2hhckNvdW50KTsKICAgICAgICByZXFMZW4rKzsKCiAgICAgICAgbHN0cmNweW5BKGxwRHN0U3RyLCBtZW0sICpscG5NdWx0aUNoYXJDb3VudCk7CgogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG1lbSk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHJlcUxlbjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIxN10KICoKICogSG1tLCBzb21lIHByb2dyYW0gdXNlZCBscG5NdWx0aUNoYXJDb3VudCA9PSAweDMgKGFuZCBscFNyY1N0ciB3YXMgIkMiKQogKiAtLT4gQ3Jhc2guIFNvbWV0aGluZyB3cm9uZyBoZXJlLgogKgogKiBJdCBzZWVtcyBmcm9tIE9FIHY1IHRoYXQgdGhlIHRoaXJkIHBhcmFtIGlzIHRoZSBjb3VudC4gKEdBIDExLzIwMDEpCiAqLwpJTlQgV0lOQVBJIFNITFdBUElfMjE3KExQQ1dTVFIgbHBTcmNTdHIsIExQU1RSIGxwRHN0U3RyLCBJTlQgTXVsdGlDaGFyQ291bnQpCnsKICAgIElOVCBteWludCA9IE11bHRpQ2hhckNvdW50OwoKICAgIHJldHVybiBTSExXQVBJXzIxOChDUF9BQ1AsIGxwU3JjU3RyLCBscERzdFN0ciwgJm15aW50KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIxOV0KICoKICogU2VlbXMgdG8gYmUgInN1cGVyIiBRdWVyeUludGVyZmFjZS4gU3VwcGxpZWQgd2l0aCBhIHRhYmxlIG9mIGludGVyZmFjZXMKICogYW5kIGFuIGFycmF5IG9mIElJRHMgYW5kIG9mZnNldHMgaW50byB0aGUgdGFibGUuCiAqCiAqIE5PVEVTCiAqICBlcnJvciBjb2RlczogRV9QT0lOVEVSLCBFX05PSU5URVJGQUNFCiAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgICBSRUZJSUQgICByZWZpZDsKICAgIERXT1JEICAgIGluZHg7Cn0gSUZBQ0VfSU5ERVhfVEJMOwoKSFJFU1VMVCBXSU5BUEkgU0hMV0FQSV8yMTkgKAoJTFBWT0lEIHcsICAgICAgICAgICAvKiBbaW5dICAgdGFibGUgb2YgaW50ZXJmYWNlcyAgICAgICAgICAgICAgICAgICAqLwoJSUZBQ0VfSU5ERVhfVEJMICp4LCAvKiBbaW5dICAgYXJyYXkgb2YgUkVGSUlEcyBhbmQgaW5kZXhlcyB0byBhYm92ZSAqLwoJUkVGSUlEIHJpaWQsICAgICAgICAvKiBbaW5dICAgUkVGSUlEIHRvIGdldCBpbnRlcmZhY2UgZm9yICAgICAgICAgICAqLwoJTFBWT0lEICpwcHYpICAgICAgICAgIC8qIFtvdXRdICBsb2NhdGlvbiB0byBnZXQgaW50ZXJmYWNlIHBvaW50ZXIgICAgICovCnsKCUhSRVNVTFQgcmV0OwoJSVVua25vd24gKmFfdnRibDsKCUlGQUNFX0lOREVYX1RCTCAqeG1vdmU7CgoJVFJBQ0UoIiglcCAlcCAlcyAlcClcbiIsIHcseCxkZWJ1Z3N0cl9ndWlkKHJpaWQpLHBwdik7CglpZiAocHB2KSB7CgkgICAgeG1vdmUgPSB4OwoJICAgIHdoaWxlICh4bW92ZS0+cmVmaWQpIHsKCQlUUkFDRSgidHJ5aW5nIChpbmR4ICVsZCkgJXNcbiIsIHhtb3ZlLT5pbmR4LCBkZWJ1Z3N0cl9ndWlkKHhtb3ZlLT5yZWZpZCkpOwoJCWlmIChJc0VxdWFsSUlEKHJpaWQsIHhtb3ZlLT5yZWZpZCkpIHsKCQkgICAgYV92dGJsID0gKElVbmtub3duKikoeG1vdmUtPmluZHggKyAoTFBCWVRFKXcpOwoJCSAgICBUUkFDRSgibWF0Y2hlZCwgcmV0dXJuaW5nICglcClcbiIsIGFfdnRibCk7CgkJICAgICpwcHYgPSAoTFBWT0lEKWFfdnRibDsKCQkgICAgSVVua25vd25fQWRkUmVmKGFfdnRibCk7CgkJICAgIHJldHVybiBTX09LOwoJCX0KCQl4bW92ZSsrOwoJICAgIH0KCgkgICAgaWYgKElzRXF1YWxJSUQocmlpZCwgJklJRF9JVW5rbm93bikpIHsKCQlhX3Z0YmwgPSAoSVVua25vd24qKSh4LT5pbmR4ICsgKExQQllURSl3KTsKCQlUUkFDRSgicmV0dXJuaW5nIGZpcnN0IGZvciBJVW5rbm93biAoJXApXG4iLCBhX3Z0YmwpOwoJCSpwcHYgPSAoTFBWT0lEKWFfdnRibDsKCQlJVW5rbm93bl9BZGRSZWYoYV92dGJsKTsKCQlyZXR1cm4gU19PSzsKCSAgICB9CgkgICAgKnBwdiA9IDA7CgkgICAgcmV0ID0gRV9OT0lOVEVSRkFDRTsKCX0gZWxzZQoJICAgIHJldCA9IEVfUE9JTlRFUjsKCglUUkFDRSgiLS0gMHglMDhseFxuIiwgcmV0KTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yMzZdCiAqLwpITU9EVUxFIFdJTkFQSSBTSExXQVBJXzIzNiAoUkVGSUlEIGxwVW5rbm93bikKewogICAgSEtFWSBuZXdrZXk7CiAgICBEV09SRCB0eXBlLCBjb3VudDsKICAgIENIQVIgdmFsdWVbTUFYX1BBVEhdLCBzdHJpbmdbTUFYX1BBVEhdOwoKICAgIHN0cmNweShzdHJpbmcsICJDTFNJRFxcIik7CiAgICBzdHJjYXQoc3RyaW5nLCBkZWJ1Z3N0cl9ndWlkKGxwVW5rbm93bikpOwogICAgc3RyY2F0KHN0cmluZywgIlxcSW5Qcm9jU2VydmVyMzIiKTsKCiAgICBjb3VudCA9IE1BWF9QQVRIOwogICAgUmVnT3BlbktleUV4QShIS0VZX0NMQVNTRVNfUk9PVCwgc3RyaW5nLCAwLCAxLCAmbmV3a2V5KTsKICAgIFJlZ1F1ZXJ5VmFsdWVFeEEobmV3a2V5LCAwLCAwLCAmdHlwZSwgdmFsdWUsICZjb3VudCk7CiAgICBSZWdDbG9zZUtleShuZXdrZXkpOwogICAgcmV0dXJuIExvYWRMaWJyYXJ5RXhBKHZhbHVlLCAwLCAwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIzN10KICoKICogVW5pY29kZSB2ZXJzaW9uIG9mIFNITFdBUElfMTgzLgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjM3IChXTkRDTEFTU1cgKiBscFduZENsYXNzKQp7CglXTkRDTEFTU1cgV25kQ2xhc3M7CgoJVFJBQ0UoIiglcCAlcylcbiIsbHBXbmRDbGFzcy0+aEluc3RhbmNlLCBkZWJ1Z3N0cl93KGxwV25kQ2xhc3MtPmxwc3pDbGFzc05hbWUpKTsKCglpZiAoR2V0Q2xhc3NJbmZvVyhscFduZENsYXNzLT5oSW5zdGFuY2UsIGxwV25kQ2xhc3MtPmxwc3pDbGFzc05hbWUsICZXbmRDbGFzcykpCgkJcmV0dXJuIFRSVUU7CglyZXR1cm4gUmVnaXN0ZXJDbGFzc1cobHBXbmRDbGFzcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yMzldCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yMzkoSElOU1RBTkNFIGhJbnN0YW5jZSwgTFBWT0lEIHAyLCBEV09SRCBkdzMpCnsKICAgIEZJWE1FKCIoJXAgJXAgMHglMDhseCkgc3R1YlxuIiwKCSAgaEluc3RhbmNlLCBwMiwgZHczKTsKICAgIHJldHVybiAwOwojaWYgMAogICAgLyogcHNldWRvIGNvZGUgZnJvbSByZWxheSB0cmFjZSAqLwogICAgV2lkZUNoYXJUb011bHRpQnl0ZSgwLCAwLCBMIlNoZWxsIERvY09iamVjdCBWaWV3IiwgLTEsICZhYSwgMHgwMjA3LCAwLCAwKTsKICAgIEdldENsYXNzSW5mb0EoNzBmZTAwMDAsNDA1ODY4ZWMgIlNoZWxsIERvY09iamVjdCBWaWV3Iiw0MDU4NmIxNCk7CiAgICAvKiBhYm92ZSBwYWlyIHJlcGVhdGVkIGZvcjoKICAgICAgICAgICBUcmlkZW50VGhpY2tldFVybERsQ2xhc3MKCSAgIFNoZWxsIEVtYmVkZGluZwoJICAgQ0lFU3BsYXNoU2NyZWVuCgkgICBJbmV0IE5vdGlmeV9IaWRkZW4KCSAgIE9DSG9zdAogICAgKi8KI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yNDBdCiAqCiAqIENhbGwgVGhlIGNvcnJlY3QgKEFTQ0lJL1VuaWNvZGUpIGRlZmF1bHQgd2luZG93IHByb2NlZHVyZSBmb3IgYSB3aW5kb3cuCiAqCiAqIFBBUkFNUwogKiAgaFduZCAgICAgW0ldIFdpbmRvdyB0byBjYWxsIHRoZSBkZWZhdWx0IHByb2NlZWR1cmUgZm9yCiAqICB1TWVzc2FnZSBbSV0gTWVzc2FnZSBJRAogKiAgd1BhcmFtICAgW0ldIFdQQVJBTSBvZiBtZXNzYWdlCiAqICBsUGFyYW0gICBbSV0gTFBBUkFNIG9mIG1lc3NhZ2UKICoKICogUkVUVVJOUwogKiAgVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSB3aW5kb3cgcHJvY2VlZHVyZS4KICovCkxSRVNVTFQgQ0FMTEJBQ0sgU0hMV0FQSV8yNDAoSFdORCBoV25kLCBVSU5UIHVNZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQp7CglpZiAoSXNXaW5kb3dVbmljb2RlKGhXbmQpKQoJCXJldHVybiBEZWZXaW5kb3dQcm9jVyhoV25kLCB1TWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwoJcmV0dXJuIERlZldpbmRvd1Byb2NBKGhXbmQsIHVNZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yNDFdCiAqCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yNDEgKCkKewoJRklYTUUoIigpc3R1YlxuIik7CglyZXR1cm4gLyogMHhhYmJhMTI0MyAqLyAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjY2XQogKgogKiBuYXRpdmUgZG9lcyBhdCBsZWFzdCBhcHByb3hpbWF0ZWx5OgogKiAgICAgc3RyY3B5VyhuZXdzdHIsIHgpOwogKiAgICAgc3RyY2F0VyhuZXdzdHIsICJcXFJlc3RyaWN0aW9ucyIpOwogKiAgICAgaWYgKFJlZ09wZW5LZXlFeEEoODAwMDAwMDEsIG5ld3N0ciwgMDAwMDAwMDAsMDAwMDAwMDEsNDA1MjBiNzgpKQogKiAgICAgICAgcmV0dXJuIDA7CiAqICAgICp1bmtub3duKgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjY2ICgKCUxQVk9JRCB3LAoJTFBWT0lEIHgsICAgLyogW2luXSBwYXJ0aWFsIHJlZ2lzdHJ5IGtleSAqLwoJTFBWT0lEIHksCglMUFZPSUQgeikKewoJRklYTUUoIiglcCAlcCAlcCAlcClzdHViXG4iLHcseCx5LHopOwoJcmV0dXJuIC8qIDB4YWJiYTEyNDggKi8gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI2N10KICoKICogTk9URVM6CiAqICAgVGhpcyBRdWVyeUludGVyZmFjZSBhc2tzIHRoZSBpbm5lciBvYmplY3QgZm9yIGEgaW50ZXJmYWNlLiBJbiBjYXNlCiAqICAgb2YgYWdncmVnYXRpb24gdGhpcyByZXF1ZXN0IHdvdWxkIGJlIGZvcndhcmRlZCBieSB0aGUgaW5uZXIgdG8gdGhlCiAqICAgb3V0ZXIgb2JqZWN0LiBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGlubmVyIG9iamVjdCBkaXJlY3RseSBmb3IgdGhlCiAqICAgaW50ZXJmYWNlIGNpcmN1bXZlbnRpbmcgdGhlIGZvcndhcmRpbmcgdG8gdGhlIG91dGVyIG9iamVjdC4KICovCkhSRVNVTFQgV0lOQVBJIFNITFdBUElfMjY3ICgKCUlVbmtub3duICogcFVuaywgICAvKiBbaW5dIG91dGVyIG9iamVjdCAqLwoJSVVua25vd24gKiBwSW5uZXIsIC8qIFtpbl0gaW5uZXIgb2JqZWN0ICovCglJSUQgKiByaWlkLAoJTFBWT0lEKiBwcHYpCnsKCUhSRVNVTFQgaHJldCA9IEVfTk9JTlRFUkZBQ0U7CglUUkFDRSgiKHBVbms9JXAgcElubmVyPSVwXG5cdElJRDogICVzICVwKVxuIixwVW5rLHBJbm5lcixkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBwcHYpOwoKCSpwcHYgPSBOVUxMOwoJaWYocFVuayAmJiBwSW5uZXIpIHsKCSAgICBocmV0ID0gSVVua25vd25fUXVlcnlJbnRlcmZhY2UocElubmVyLCByaWlkLCAoTFBWT0lEKilwcHYpOwoJICAgIGlmIChTVUNDRUVERUQoaHJldCkpIElVbmtub3duX1JlbGVhc2UocFVuayk7Cgl9CglUUkFDRSgiLS0gMHglMDhseFxuIiwgaHJldCk7CglyZXR1cm4gaHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI2OF0KICoKICogTW92ZSBhIHJlZmVyZW5jZSBmcm9tIG9uZSBpbnRlcmZhY2UgdG8gYW5vdGhlci4KICoKICogUEFSQU1TCiAqICAgbHBEZXN0ICAgICBbT10gRGVzdGluYXRpb24gdG8gcmVjZWl2ZSB0aGUgcmVmZXJlbmNlCiAqICAgbHBwVW5rbm93biBbT10gU291cmNlIHRvIGdpdmUgdXAgdGhlIHJlZmVyZW5jZSB0byBscERlc3QKICoKICogUkVUVVJOUwogKiAgTm90aGluZy4KICovClZPSUQgV0lOQVBJIFNITFdBUElfMjY4KElVbmtub3duICpscERlc3QsIElVbmtub3duICoqbHBwVW5rbm93bikKewogIFRSQUNFKCIoJXAsJXApXG4iLCBscERlc3QsIGxwcFVua25vd24pOwoKICBpZiAoKmxwcFVua25vd24pCiAgewogICAgLyogQ29weSBSZWZlcmVuY2UqLwogICAgSVVua25vd25fQWRkUmVmKGxwRGVzdCk7CiAgICBTSExXQVBJXzE2OShscHBVbmtub3duKTsgLyogUmVsZWFzZSBleGlzdGluZyBpbnRlcmZhY2UgKi8KICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yNzZdCiAqCiAqIERldGVybWluZSBpZiB0aGUgYnJvd3NlciBpcyBpbnRlZ3JhdGVkIGludG8gdGhlIHNoZWxsLCBhbmQgc2V0IGEgcmVnaXN0cnkKICoga2V5IGFjY29yZGluZ2x5LgogKgogKiBQQVJBTVMKICogIE5vbmUuCiAqCiAqIFJFVFVSTlMKICogIDEsIElmIHRoZSBicm93c2VyIGlzIG5vdCBpbnRlZ3JhdGVkLgogKiAgMiwgSWYgdGhlIGJyb3dzZXIgaXMgaW50ZWdyYXRlZC4KICoKICogTk9URVMKICogIFRoZSBrZXkgSEtMTVxTb2Z0d2FyZVxNaWNyb3NvZnRcSW50ZXJuZXQgRXhwbG9yZXJcSW50ZWdyYXRlZEJyb3dzZXIgaXMKICogIGVpdGhlciBzZXQgdG8gVFJVRSwgb3IgcmVtb3ZlZCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgYnJvd3NlciBpcyBkZWVtZWQKICogIHRvIGJlIGludGVncmF0ZWQuCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yNzYoKQp7CiAgc3RhdGljIExQQ1NUUiBzekludGVncmF0ZWRCcm93c2VyID0gIkludGVncmF0ZWRCcm93c2VyIjsKICBzdGF0aWMgRFdPUkQgZHdTdGF0ZSA9IDA7CiAgSEtFWSBoS2V5OwogIERXT1JEIGR3UmV0LCBkd0RhdGEsIGR3U2l6ZTsKCiAgaWYgKGR3U3RhdGUpCiAgICByZXR1cm4gZHdTdGF0ZTsKCiAgLyogSWYgc2hlbGwzMiBleHBvcnRzIERsbEdldFZlcnNpb24oKSwgdGhlIGJyb3dzZXIgaXMgaW50ZWdyYXRlZCAqLwogIEdFVF9GVU5DKHBEbGxHZXRWZXJzaW9uLCBzaGVsbDMyLCAiRGxsR2V0VmVyc2lvbiIsIDEpOwogIGR3U3RhdGUgPSBwRGxsR2V0VmVyc2lvbiA/IDIgOiAxOwoKICAvKiBTZXQgb3IgZGVsZXRlIHRoZSBrZXkgYWNjb3JkaW5seSAqLwogIGR3UmV0ID0gUmVnT3BlbktleUV4QShIS0VZX0xPQ0FMX01BQ0hJTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxJbnRlcm5ldCBFeHBsb3JlciIsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfQUxMX0FDQ0VTUywgJmhLZXkpOwogIGlmICghZHdSZXQpCiAgewogICAgZHdSZXQgPSBSZWdRdWVyeVZhbHVlRXhBKGhLZXksIHN6SW50ZWdyYXRlZEJyb3dzZXIsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQllURSkmZHdEYXRhLCAmZHdTaXplKTsKCiAgICBpZiAoIWR3UmV0ICYmIGR3U3RhdGUgPT0gMSkKICAgIHsKICAgICAgLyogVmFsdWUgZXhpc3RzIGJ1dCBicm93c2VyIGlzIG5vdCBpbnRlZ3JhdGVkICovCiAgICAgIFJlZ0RlbGV0ZVZhbHVlQShoS2V5LCBzekludGVncmF0ZWRCcm93c2VyKTsKICAgIH0KICAgIGVsc2UgaWYgKGR3UmV0ICYmIGR3U3RhdGUgPT0gMikKICAgIHsKICAgICAgLyogQnJvd3NlciBpcyBpbnRlZ3JhdGVkIGJ1dCB2YWx1ZSBkb2VzIG5vdCBleGlzdCAqLwogICAgICBkd0RhdGEgPSBUUlVFOwogICAgICBSZWdTZXRWYWx1ZUV4QShoS2V5LCBzekludGVncmF0ZWRCcm93c2VyLCAwLCBSRUdfRFdPUkQsCiAgICAgICAgICAgICAgICAgICAgIChMUEJZVEUpJmR3RGF0YSwgc2l6ZW9mKGR3RGF0YSkpOwogICAgfQogICAgUmVnQ2xvc2VLZXkoaEtleSk7CiAgfQogIHJldHVybiBkd1N0YXRlOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjc4XQogKgogKi8KSFdORCBXSU5BUEkgU0hMV0FQSV8yNzggKAoJTE9ORyB3bmRQcm9jLAoJSFdORCBoV25kUGFyZW50LAoJRFdPUkQgZHdFeFN0eWxlLAoJRFdPUkQgZHdTdHlsZSwKCUhNRU5VIGhNZW51LAoJTE9ORyB6KQp7CglXTkRDTEFTU0Egd25kY2xhc3M7CglIV05EIGh3bmQ7CglIQ1VSU09SIGhDdXJzb3I7CgljaGFyICogY2xzbmFtZSA9ICJXb3JrZXJBIjsKCglGSVhNRSgiKDB4JTA4bHggJXAgMHglMDhseCAweCUwOGx4ICVwIDB4JTA4bHgpIHBhcnRpYWwgc3R1YlxuIiwKCSAgd25kUHJvYyxoV25kUGFyZW50LGR3RXhTdHlsZSxkd1N0eWxlLGhNZW51LHopOwoKCWhDdXJzb3IgPSBMb2FkQ3Vyc29yQSgweDAwMDAwMDAwLElEQ19BUlJPV0EpOwoKCWlmKCFHZXRDbGFzc0luZm9BKHNobHdhcGlfaEluc3RhbmNlLCBjbHNuYW1lLCAmd25kY2xhc3MpKQoJewoJICBSdGxaZXJvTWVtb3J5KCZ3bmRjbGFzcywgc2l6ZW9mKFdORENMQVNTQSkpOwoJICB3bmRjbGFzcy5scGZuV25kUHJvYyA9IERlZldpbmRvd1Byb2NXOwoJICB3bmRjbGFzcy5jYlduZEV4dHJhID0gNDsKCSAgd25kY2xhc3MuaEluc3RhbmNlID0gc2hsd2FwaV9oSW5zdGFuY2U7CgkgIHduZGNsYXNzLmhDdXJzb3IgPSBoQ3Vyc29yOwoJICB3bmRjbGFzcy5oYnJCYWNrZ3JvdW5kID0gKEhCUlVTSClDT0xPUl9CVE5TSEFET1c7CgkgIHduZGNsYXNzLmxwc3pNZW51TmFtZSA9IE5VTEw7CgkgIHduZGNsYXNzLmxwc3pDbGFzc05hbWUgPSBjbHNuYW1lOwoJICBSZWdpc3RlckNsYXNzQSAoJnduZGNsYXNzKTsKCX0KCWh3bmQgPSBDcmVhdGVXaW5kb3dFeEEoZHdFeFN0eWxlLCBjbHNuYW1lLCAwLGR3U3R5bGUsMCwwLDAsMCxoV25kUGFyZW50LAoJCWhNZW51LHNobHdhcGlfaEluc3RhbmNlLDApOwoJU2V0V2luZG93TG9uZ0EoaHduZCwgMCwgeik7CglTZXRXaW5kb3dMb25nQShod25kLCBHV0xfV05EUFJPQywgd25kUHJvYyk7CglyZXR1cm4gaHduZDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI4MV0KICoKICogX1NIUGFja0Rpc3BQYXJhbXNWCiAqLwpIUkVTVUxUIFdJTkFQSSBTSExXQVBJXzI4MShMUFZPSUQgdywgTFBWT0lEIHgsIExQVk9JRCB5LCBMUFZPSUQgeikKewoJRklYTUUoIiVwICVwICVwICVwXG4iLHcseCx5LHopOwoJcmV0dXJuIEVfRkFJTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI4NF0KICoKICogX0lDb25uZWN0aW9uUG9pbnRfU2ltcGxlSW52b2tlCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yODQgKAoJTFBWT0lEIHgsCglMUFZPSUQgeSwKCUxQVk9JRCB6KQp7CiAgICAgICAgVFJBQ0UoIiglcCAlcCAlcCkgc3R1YlxuIix4LHkseik7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI4N10KICoKICogX0lVbmtub3duX0NQQ29udGFpbmVyT25DaGFuZ2VkCiAqLwpIUkVTVUxUIFdJTkFQSSBTSExXQVBJXzI4NyhMUFZPSUQgeCwgTFBWT0lEIHkpCnsKCUZJWE1FKCIlcCAlcFxuIiwgeCx5KTsKCXJldHVybiBFX0ZBSUw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yODldCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byB3aW5tbS5QbGF5U291bmRXCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzI4OShMUENXU1RSIHBzelNvdW5kLCBITU9EVUxFIGhtb2QsIERXT1JEIGZkd1NvdW5kKQp7CiAgR0VUX0ZVTkMocFBsYXlTb3VuZFcsIHdpbm1tLCAiUGxheVNvdW5kVyIsIEZBTFNFKTsKICByZXR1cm4gcFBsYXlTb3VuZFcocHN6U291bmQsIGhtb2QsIGZkd1NvdW5kKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI5NF0KICovCkJPT0wgV0lOQVBJIFNITFdBUElfMjk0KExQU1RSIHN0cjEsIExQU1RSIHN0cjIsIExQU1RSIHBTdHIsIERXT1JEIHNvbWVfbGVuLCAgTFBDU1RSIGxwU3RyMikKewogICAgLyoKICAgICAqIHN0cjE6CQkiSSIJIkkiCXB1c2hsIGVzcCsweDIwCiAgICAgKiBzdHIyOgkJIlUiCSJJIglwdXNobCAweDc3YzkzODEwCiAgICAgKiAoaXMgIkkiIGFuZCAiVSIgImludGVnZXIiIGFuZCAidW5zaWduZWQiID8/KQogICAgICoKICAgICAqIHBTdHI6CQkiIgkiIglwdXNobCBlYXgKICAgICAqIHNvbWVfbGVuOgkweDgyNAkweDEwNAlwdXNobCAweDgyNAogICAgICogbHBTdHIyOgkJIiVsIgkiJWwiCXB1c2hsIGVzcCsweGMKICAgICAqCiAgICAgKiBzaGx3YXBpLiBTdHJDcHlOVyhscFN0cjIsIGlycmVsZXZhbnRfdmFyLCAweDEwNCk7CiAgICAgKiBMb2NhbEFsbG9jKDB4MDAsIHNvbWVfbGVuKSAtPiBpcnJlbGV2YW50X3ZhcgogICAgICogTG9jYWxBbGxvYygweDQwLCBpcnJlbGV2YW50X2xlbikgLT4gcFN0cgogICAgICogc2hsd2FwaS4yOTQoc3RyMSwgc3RyMiwgcFN0ciwgc29tZV9sZW4sIGxwU3RyMik7CiAgICAgKiBzaGx3YXBpLlBhdGhSZW1vdmVCbGFua3NXKHBTdHIpOwogICAgICovCiAgICBGSVhNRSgiKCclcycsICclcycsICclcycsICUwOGx4LCAnJXMnKTogc3R1YiFcbiIsIHN0cjEsIHN0cjIsIHBTdHIsIHNvbWVfbGVuLCBscFN0cjIpOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yOTVdCiAqCiAqIENhbGxlZCBieSBJQ1EyMDAwYiBpbnN0YWxsIHZpYSBTSERPQ1ZXOgogKiBzdHIxOiAiSW50ZXJuZXRTaG9ydGN1dCIKICogeDogc29tZSB1bmtub3duIHBvaW50ZXIKICogc3RyMjogImh0dHA6Ly9mcmVlLmFvbC5jb20vdHJ5YW9sZnJlZS9pbmRleC5hZHA/MTM5MjY5IgogKiBzdHIzOiAiQzpcXFdJTkRPV1NcXERlc2t0b3AubmV3MlxcRnJlZSBBT0wgJiBVbmxpbWl0ZWQgSW50ZXJuZXQudXJsIgogKgogKiBJbiBzaG9ydDogdGhpcyBvbmUgbWF5YmUgY3JlYXRlcyBhIGRlc2t0b3AgbGluayA6LSkKICovCkJPT0wgV0lOQVBJIFNITFdBUElfMjk1KExQV1NUUiBzdHIxLCBMUFZPSUQgeCwgTFBXU1RSIHN0cjIsIExQV1NUUiBzdHIzKQp7CiAgICBGSVhNRSgiKCclcycsICVwLCAnJXMnLCAnJXMnKSwgc3R1Yi5cbiIsIGRlYnVnc3RyX3coc3RyMSksIHgsIGRlYnVnc3RyX3coc3RyMiksIGRlYnVnc3RyX3coc3RyMykpOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yOTldCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBjb21jdGwzMi40MTcKICovCkJPT0wgV0lOQVBJIFNITFdBUElfMjk5KEhEQyBoZGMsIElOVCB4LCBJTlQgeSwgVUlOVCBmbGFncywgY29uc3QgUkVDVCAqbHByZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBzdHIsIFVJTlQgY291bnQsIGNvbnN0IElOVCAqbHBEeCkKewogICAgR0VUX0ZVTkMocENPTUNUTDMyXzQxNywgY29tY3RsMzIsIChMUENTVFIpNDE3LCBGQUxTRSk7CiAgICByZXR1cm4gcENPTUNUTDMyXzQxNyhoZGMsIHgsIHksIGZsYWdzLCBscHJlY3QsIHN0ciwgY291bnQsIGxwRHgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzEzXQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gc2hlbGwzMi5TSEdldEZpbGVJbmZvVwogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMzEzKExQQ1dTVFIgcGF0aCwgRFdPUkQgZHdGaWxlQXR0cmlidXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgIFNIRklMRUlORk9XICpwc2ZpLCBVSU5UIHNpemVvZnBzZmksIFVJTlQgZmxhZ3MpCnsKICBHRVRfRlVOQyhwU0hHZXRGaWxlSW5mb1csIHNoZWxsMzIsICJTSEdldEZpbGVJbmZvVyIsIDApOwogIHJldHVybiBwU0hHZXRGaWxlSW5mb1cocGF0aCwgZHdGaWxlQXR0cmlidXRlcywgcHNmaSwgc2l6ZW9mcHNmaSwgZmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzE4XQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gc2hlbGwzMi5EcmFnUXVlcnlGaWxlVwogKi8KVUlOVCBXSU5BUEkgU0hMV0FQSV8zMTgoSERST1AgaERyb3AsIFVJTlQgbEZpbGUsIExQV1NUUiBscHN6RmlsZSwgVUlOVCBsTGVuZ3RoKQp7CiAgR0VUX0ZVTkMocERyYWdRdWVyeUZpbGVXLCBzaGVsbDMyLCAiRHJhZ1F1ZXJ5RmlsZVciLCAwKTsKICByZXR1cm4gcERyYWdRdWVyeUZpbGVXKGhEcm9wLCBsRmlsZSwgbHBzekZpbGUsIGxMZW5ndGgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzMzXQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gc2hlbGwzMi5TSEJyb3dzZUZvckZvbGRlclcKICovCkxQSVRFTUlETElTVCBXSU5BUEkgU0hMV0FQSV8zMzMoTFBCUk9XU0VJTkZPVyBscEJpKQp7CiAgR0VUX0ZVTkMocFNIQnJvd3NlRm9yRm9sZGVyVywgc2hlbGwzMiwgIlNIQnJvd3NlRm9yRm9sZGVyVyIsIE5VTEwpOwogIHJldHVybiBwU0hCcm93c2VGb3JGb2xkZXJXKGxwQmkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzM0XQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gc2hlbGwzMi5TSEdldFBhdGhGcm9tSURMaXN0VwogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8zMzQoTFBDSVRFTUlETElTVCBwaWRsLExQV1NUUiBwc3pQYXRoKQp7CiAgR0VUX0ZVTkMocFNIR2V0UGF0aEZyb21JRExpc3RXLCBzaGVsbDMyLCAiU0hHZXRQYXRoRnJvbUlETGlzdFciLCAwKTsKICByZXR1cm4gcFNIR2V0UGF0aEZyb21JRExpc3RXKHBpZGwsIHBzelBhdGgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzM1XQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gc2hlbGwzMi5TaGVsbEV4ZWN1dGVFeFcKICovCkJPT0wgV0lOQVBJIFNITFdBUElfMzM1KExQU0hFTExFWEVDVVRFSU5GT1cgbHBFeGVjSW5mbykKewogIEdFVF9GVU5DKHBTaGVsbEV4ZWN1dGVFeFcsIHNoZWxsMzIsICJTaGVsbEV4ZWN1dGVFeFciLCBGQUxTRSk7CiAgcmV0dXJuIHBTaGVsbEV4ZWN1dGVFeFcobHBFeGVjSW5mbyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zMzZdCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBzaGVsbDMyLlNIRmlsZU9wZXJhdGlvblcuCiAqLwpISUNPTiBXSU5BUEkgU0hMV0FQSV8zMzYoTFBTSEZJTEVPUFNUUlVDVFcgbHBGaWxlT3ApCnsKICBHRVRfRlVOQyhwU0hGaWxlT3BlcmF0aW9uVywgc2hlbGwzMiwgIlNIRmlsZU9wZXJhdGlvblciLCAwKTsKICByZXR1cm4gcFNIRmlsZU9wZXJhdGlvblcobHBGaWxlT3ApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzM3XQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gc2hlbGwzMi5FeHRyYWN0SWNvbkV4Vy4KICovCkhJQ09OIFdJTkFQSSBTSExXQVBJXzMzNyhMUENXU1RSIGxwc3pGaWxlLCBJTlQgbkljb25JbmRleCwgSElDT04gKnBoaWNvbkxhcmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgSElDT04gKnBoaWNvblNtYWxsLCBVSU5UIG5JY29ucykKewogIEdFVF9GVU5DKHBFeHRyYWN0SWNvbkV4Vywgc2hlbGwzMiwgIkV4dHJhY3RJY29uRXhXIiwgTlVMTCk7CiAgcmV0dXJuIHBFeHRyYWN0SWNvbkV4VyhscHN6RmlsZSwgbkljb25JbmRleCwgcGhpY29uTGFyZ2UsIHBoaWNvblNtYWxsLCBuSWNvbnMpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzQyXQogKgogKi8KTE9ORyBXSU5BUEkgU0hJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSggUExPTkcgZGVzdCwgTE9ORyB4Y2hnLCBMT05HIGNvbXBhcmUpCnsKICAgICAgICByZXR1cm4gSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoZGVzdCwgeGNoZywgY29tcGFyZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNDZdCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8zNDYgKAoJTFBDV1NUUiBzcmMsCglMUFdTVFIgZGVzdCwKCWludCBsZW4pCnsKCUZJWE1FKCIoJXMgJXAgMHglMDh4KXN0dWJcbiIsZGVidWdzdHJfdyhzcmMpLGRlc3QsbGVuKTsKCWxzdHJjcHluVyhkZXN0LCBzcmMsIGxlbik7CglyZXR1cm4gbHN0cmxlblcoZGVzdCkrMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM1MF0KICoKICogc2VlbXMgdG8gYmUgbGF0ZSBib3VuZCBjYWxsIHRvIEdldEZpbGVWZXJzaW9uSW5mb1NpemVXCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8zNTAgKAoJTFBXU1RSIHgsCglMUFZPSUQgeSkKewogICAgICAgIERXT1JEIHJldDsKCglHRVRfRlVOQyhwR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVcsIHZlcnNpb24sICJHZXRGaWxlVmVyc2lvbkluZm9TaXplVyIsIDApOwoJcmV0ID0gcEdldEZpbGVWZXJzaW9uSW5mb1NpemVXKHgsIHkpOwoJcmV0dXJuIDB4MjA4ICsgcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzUxXQogKgogKiBzZWVtcyB0byBiZSBsYXRlIGJvdW5kIGNhbGwgdG8gR2V0RmlsZVZlcnNpb25JbmZvVwogKi8KQk9PTCAgV0lOQVBJIFNITFdBUElfMzUxICgKCUxQV1NUUiB3LCAgIC8qIFtpbl0gcGF0aCB0byBkbGwgKi8KCURXT1JEICB4LCAgIC8qIFtpbl0gcGFybSAyIHRvIEdldEZpbGVWZXJzaW9uSW5mb0EgKi8KCURXT1JEICB5LCAgIC8qIFtpbl0gcmV0dXJuIHZhbHVlIGZyb20gLjM1MCAtIGFzc3VtZSBsZW5ndGggKi8KCUxQVk9JRCB6KSAgIC8qIFtpbi9vdXRdIGJ1ZmZlciAoKzB4MjA4IHNlbnQgdG8gR2V0RmlsZVZlcnNpb25JbmZvQSkgKi8KewogICAgR0VUX0ZVTkMocEdldEZpbGVWZXJzaW9uSW5mb1csIHZlcnNpb24sICJHZXRGaWxlVmVyc2lvbkluZm9XIiwgMCk7CiAgICByZXR1cm4gcEdldEZpbGVWZXJzaW9uSW5mb1codywgeCwgeS0weDIwOCwgKGNoYXIqKXorMHgyMDgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzUyXQogKgogKiBzZWVtcyB0byBiZSBsYXRlIGJvdW5kIGNhbGwgdG8gVmVyUXVlcnlWYWx1ZVcKICovCldPUkQgV0lOQVBJIFNITFdBUElfMzUyICgKCUxQVk9JRCB3LCAgIC8qIFtpbl0gYnVmZmVyIGZyb20gXzM1MSAqLwoJTFBXU1RSIHgsICAgLyogW2luXSAgIHZhbHVlIHRvIHJldHJpZXZlIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkIGFuZCBwYXNzZWQgdG8gVmVyUXVlcnlWYWx1ZUEgYXMgIzIgKi8KCUxQVk9JRCB5LCAgIC8qIFtvdXRdICB2ZXIgYnVmZmVyIC0gcGFzc2VkIHRvIFZlclF1ZXJ5VmFsdWVBIGFzICMzICovCglVSU5UKiAgeikgICAvKiBbaW5dICAgdmVyIGxlbmd0aCAtIHBhc3NlZCB0byBWZXJRdWVyeVZhbHVlQSBhcyAjNCAqLwp7CiAgICBHRVRfRlVOQyhwVmVyUXVlcnlWYWx1ZVcsIHZlcnNpb24sICJWZXJRdWVyeVZhbHVlVyIsIDApOwogICAgcmV0dXJuIHBWZXJRdWVyeVZhbHVlVygoY2hhciopdysweDIwOCwgeCwgeSwgeik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNTddCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBzaGVsbDMyLlNIR2V0TmV3TGlua0luZm9XCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzM1NyhMUENXU1RSIHBzekxpbmtUbywgTFBDV1NUUiBwc3pEaXIsIExQV1NUUiBwc3pOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBCT09MICpwZk11c3RDb3B5LCBVSU5UIHVGbGFncykKewogIEdFVF9GVU5DKHBTSEdldE5ld0xpbmtJbmZvVywgc2hlbGwzMiwgIlNIR2V0TmV3TGlua0luZm9XIiwgRkFMU0UpOwogIHJldHVybiBwU0hHZXROZXdMaW5rSW5mb1cocHN6TGlua1RvLCBwc3pEaXIsIHBzek5hbWUsIHBmTXVzdENvcHksIHVGbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNThdCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBzaGVsbDMyLlNIRGVmRXh0cmFjdEljb25XCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8zNTgoTFBWT0lEIGFyZzEsIExQVk9JRCBhcmcyLCBMUFZPSUQgYXJnMywgTFBWT0lEIGFyZzQsCiAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgYXJnNSwgTFBWT0lEIGFyZzYpCnsKICBHRVRfRlVOQyhwU0hEZWZFeHRyYWN0SWNvblcsIHNoZWxsMzIsICJTSERlZkV4dHJhY3RJY29uVyIsIDApOwogIHJldHVybiBwU0hEZWZFeHRyYWN0SWNvblcoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNjRdCiAqCiAqIFdyYXBwZXIgZm9yIGxzdHJjcHluQSB3aXRoIHNyYyBhbmQgZHN0IHN3YXBwZWQuCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8zNjQoTFBDU1RSIHNyYywgTFBTVFIgZHN0LCBJTlQgbikKewogIGxzdHJjcHluQShkc3QsIHNyYywgbik7CiAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNzBdCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBzaGVsbDMyLkV4dHJhY3RJY29uVwogKi8KSElDT04gV0lOQVBJIFNITFdBUElfMzcwKEhJTlNUQU5DRSBoSW5zdGFuY2UsIExQQ1dTVFIgbHBzekV4ZUZpbGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBuSWNvbkluZGV4KQp7CiAgR0VUX0ZVTkMocEV4dHJhY3RJY29uVywgc2hlbGwzMiwgIkV4dHJhY3RJY29uVyIsIE5VTEwpOwogIHJldHVybiBwRXh0cmFjdEljb25XKGhJbnN0YW5jZSwgbHBzekV4ZUZpbGVOYW1lLCBuSWNvbkluZGV4KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM3Nl0KICovCkxBTkdJRCBXSU5BUEkgU0hMV0FQSV8zNzYgKCkKewogICAgRklYTUUoIigpIHN0dWJcbiIpOwogICAgLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgZm9yd2FyZCBpbiB0aGUgLnNwZWMgZmlsZSB0byB0aGUgd2luMmsgZnVuY3Rpb24KICAgICAqIGtlcm5lbDMyLkdldFVzZXJEZWZhdWx0VUlMYW5ndWFnZSwgaG93ZXZlciB0aGF0IGZ1bmN0aW9uIGlzbid0IHRoZXJlIHlldC4KICAgICAqLwogICAgcmV0dXJuIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNzddCiAqCiAqIEZJWE1FOiBOYXRpdmUgYXBwZWFycyB0byBkbyBEUEFfQ3JlYXRlIGFuZCBhIERQQV9JbnNlcnRQdHIgZm9yCiAqICAgICAgICBlYWNoIGNhbGwgaGVyZS4KICogRklYTUU6IE5hdGl2ZSBzaG93cyBjYWxscyB0bzoKICogIFNIUmVnR2V0VVNWYWx1ZSBmb3IgIlNvZnR3YXJlXE1pY3Jvc29mdFxJbnRlcm5ldCBFeHBsb3JlclxJbnRlcm5hdGlvbmFsIgogKiAgICAgICAgICAgICAgICAgICAgICBDaGVja1ZlcnNpb24KICogIFJlZ09wZW5LZXlFeEEgZm9yICJIS0xNXFNvZnR3YXJlXE1pY3Jvc29mdFxJbnRlcm5ldCBFeHBsb3JlciIKICogIFJlZ1F1ZXJ5VmFsdWVFeEEgZm9yICJMUEtJbnN0YWxsZWQiCiAqICBSZWdDbG9zZUtleQogKiAgUmVnT3BlbktleUV4QSBmb3IgIkhLQ1VcU29mdHdhcmVcTWljcm9zb2Z0XEludGVybmV0IEV4cGxvcmVyXEludGVybmF0aW9uYWwiCiAqICBSZWdRdWVyeVZhbHVlRXhBIGZvciAiUmVzb3VyY2VMb2NhbGUiCiAqICBSZWdDbG9zZUtleQogKiAgUmVnT3BlbktleUV4QSBmb3IgIkhLTE1cU29mdHdhcmVcTWljcm9zb2Z0XEFjdGl2ZSBTZXR1cFxJbnN0YWxsZWQgQ29tcG9uZW50c1x7Z3VpZH0iCiAqICBSZWdRdWVyeVZhbHVlRXhBIGZvciAiTG9jYWxlIgogKiAgUmVnQ2xvc2VLZXkKICogIGFuZCB0aGVuIHRlc3RzIHRoZSBMb2NhbGUgKCJlbiIgZm9yIG1lKS4KICogICAgIGNvZGUgYmVsb3cKICogIGFmdGVyIHRoZSBjb2RlIHRoZW4gYSBEUEFfQ3JlYXRlIChmaXJzdCB0aW1lKSBhbmQgRFBBX0luc2VydFB0ciBhcmUgZG9uZS4KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzM3NyAoTFBDU1RSIG5ld19tb2QsIEhNT0RVTEUgaW5zdF9od25kLCBMUFZPSUQgeikKewogICAgQ0hBUiBtb2RfcGF0aFsyKk1BWF9QQVRIXTsKICAgIExQU1RSIHB0cjsKCiAgICBHZXRNb2R1bGVGaWxlTmFtZUEoaW5zdF9od25kLCBtb2RfcGF0aCwgMipNQVhfUEFUSCk7CiAgICBwdHIgPSBzdHJyY2hyKG1vZF9wYXRoLCAnXFwnKTsKICAgIGlmIChwdHIpIHsKCXN0cmNweShwdHIrMSwgbmV3X21vZCk7CglUUkFDRSgibG9hZGluZyAlc1xuIiwgZGVidWdzdHJfYShtb2RfcGF0aCkpOwoJcmV0dXJuIChEV09SRClMb2FkTGlicmFyeUEobW9kX3BhdGgpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNzhdCiAqCiAqICBUaGlzIGlzIFVuaWNvZGUgdmVyc2lvbiBvZiAuMzc3CiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8zNzggKAoJTFBDV1NUUiAgIG5ld19tb2QsICAgICAgICAgIC8qIFtpbl0gbmV3IG1vZHVsZSBuYW1lICAgICAgICAqLwoJSE1PRFVMRSAgIGluc3RfaHduZCwgICAgICAgIC8qIFtpbl0gY2FsbGluZyBtb2R1bGUgaGFuZGxlICAqLwoJTFBWT0lEIHopICAgICAgICAgICAgICAgICAgIC8qIFs/Pz9dIDQgKi8KewogICAgV0NIQVIgbW9kX3BhdGhbMipNQVhfUEFUSF07CiAgICBMUFdTVFIgcHRyOwoKICAgIEdldE1vZHVsZUZpbGVOYW1lVyhpbnN0X2h3bmQsIG1vZF9wYXRoLCAyKk1BWF9QQVRIKTsKICAgIHB0ciA9IHN0cnJjaHJXKG1vZF9wYXRoLCAnXFwnKTsKICAgIGlmIChwdHIpIHsKCXN0cmNweVcocHRyKzEsIG5ld19tb2QpOwoJVFJBQ0UoImxvYWRpbmcgJXNcbiIsIGRlYnVnc3RyX3cobW9kX3BhdGgpKTsKCXJldHVybiAoRFdPUkQpTG9hZExpYnJhcnlXKG1vZF9wYXRoKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzg5XQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gY29tZGxnMzIuR2V0U2F2ZUZpbGVOYW1lVwogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8zODkoTFBPUEVORklMRU5BTUVXIG9mbikKewogIEdFVF9GVU5DKHBHZXRTYXZlRmlsZU5hbWVXLCBjb21kbGczMiwgIkdldFNhdmVGaWxlTmFtZVciLCBGQUxTRSk7CiAgcmV0dXJuIHBHZXRTYXZlRmlsZU5hbWVXKG9mbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zOTBdCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBtcHIuV05ldFJlc3RvcmVDb25uZWN0aW9uVwogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMzkwKExQVk9JRCBhcmcxLCBMUFZPSUQgYXJnMikKewogIEdFVF9GVU5DKHBXTmV0UmVzdG9yZUNvbm5lY3Rpb25XLCBtcHIsICJXTmV0UmVzdG9yZUNvbm5lY3Rpb25XIiwgMCk7CiAgcmV0dXJuIHBXTmV0UmVzdG9yZUNvbm5lY3Rpb25XKGFyZzEsIGFyZzIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzkxXQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gbXByLldOZXRHZXRMYXN0RXJyb3JXCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8zOTEoTFBWT0lEIGFyZzEsIExQVk9JRCBhcmcyLCBMUFZPSUQgYXJnMywgTFBWT0lEIGFyZzQsCiAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgYXJnNSkKewogIEdFVF9GVU5DKHBXTmV0R2V0TGFzdEVycm9yVywgbXByLCAiV05ldEdldExhc3RFcnJvclciLCAwKTsKICByZXR1cm4gcFdOZXRHZXRMYXN0RXJyb3JXKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuNDAxXQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gY29tZGxnMzIuUGFnZVNldHVwRGxnVwogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV80MDEoTFBQQUdFU0VUVVBETEdXIHBhZ2VkbGcpCnsKICBHRVRfRlVOQyhwUGFnZVNldHVwRGxnVywgY29tZGxnMzIsICJQYWdlU2V0dXBEbGdXIiwgRkFMU0UpOwogIHJldHVybiBwUGFnZVNldHVwRGxnVyhwYWdlZGxnKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjQwMl0KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIGNvbWRsZzMyLlByaW50RGxnVwogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV80MDIoTFBQUklOVERMR1cgcHJpbnRkbGcpCnsKICBHRVRfRlVOQyhwUHJpbnREbGdXLCBjb21kbGczMiwgIlByaW50RGxnVyIsIEZBTFNFKTsKICByZXR1cm4gcFByaW50RGxnVyhwcmludGRsZyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS40MDNdCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBjb21kbGczMi5HZXRPcGVuRmlsZU5hbWVXCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzQwMyhMUE9QRU5GSUxFTkFNRVcgb2ZuKQp7CiAgR0VUX0ZVTkMocEdldE9wZW5GaWxlTmFtZVcsIGNvbWRsZzMyLCAiR2V0T3BlbkZpbGVOYW1lVyIsIEZBTFNFKTsKICByZXR1cm4gcEdldE9wZW5GaWxlTmFtZVcob2ZuKTsKfQoKLyogSU5URVJOQUw6IE1hcCBmcm9tIEhMUyBjb2xvciBzcGFjZSB0byBSR0IgKi8Kc3RhdGljIFdPUkQgQ29udmVydEh1ZShpbnQgd0h1ZSwgV09SRCB3TWlkMSwgV09SRCB3TWlkMikKewogIHdIdWUgPSB3SHVlID4gMjQwID8gd0h1ZSAtIDI0MCA6IHdIdWUgPCAwID8gd0h1ZSArIDI0MCA6IHdIdWU7CgogIGlmICh3SHVlID4gMTYwKQogICAgcmV0dXJuIHdNaWQxOwogIGVsc2UgaWYgKHdIdWUgPiAxMjApCiAgICB3SHVlID0gMTYwIC0gd0h1ZTsKICBlbHNlIGlmICh3SHVlID4gNDApCiAgICByZXR1cm4gd01pZDI7CgogIHJldHVybiAoKHdIdWUgKiAod01pZDIgLSB3TWlkMSkgKyAyMCkgLyA0MCkgKyB3TWlkMTsKfQoKLyogQ29udmVydCB0byBSR0IgYW5kIHNjYWxlIGludG8gUkdCIHJhbmdlICgwLi4yNTUpICovCiNkZWZpbmUgR0VUX1JHQihoKSAoQ29udmVydEh1ZShoLCB3TWlkMSwgd01pZDIpICogMjU1ICsgMTIwKSAvIDI0MAoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBDb2xvckhMU1RvUkdCCVtTSExXQVBJLjQwNF0KICoKICogQ29udmVydCBmcm9tIEhMUyBjb2xvciBzcGFjZSBpbnRvIGFuIFJHQiBDT0xPUlJFRi4KICoKICogTk9URVMKICogSW5wdXQgSExTIHZhbHVlcyBhcmUgY29uc3RyYWluZWQgdG8gdGhlIHJhbmdlICgwLi4yNDApLgogKi8KQ09MT1JSRUYgV0lOQVBJIENvbG9ySExTVG9SR0IoV09SRCB3SHVlLCBXT1JEIHdMdW1pbm9zaXR5LCBXT1JEIHdTYXR1cmF0aW9uKQp7CiAgV09SRCB3UmVkOwoKICBpZiAod1NhdHVyYXRpb24pCiAgewogICAgV09SRCB3R3JlZW4sIHdCbHVlLCB3TWlkMSwgd01pZDI7CgogICAgaWYgKHdMdW1pbm9zaXR5ID4gMTIwKQogICAgICB3TWlkMiA9IHdTYXR1cmF0aW9uICsgd0x1bWlub3NpdHkgLSAod1NhdHVyYXRpb24gKiB3THVtaW5vc2l0eSArIDEyMCkgLyAyNDA7CiAgICBlbHNlCiAgICAgIHdNaWQyID0gKCh3U2F0dXJhdGlvbiArIDI0MCkgKiB3THVtaW5vc2l0eSArIDEyMCkgLyAyNDA7CgogICAgd01pZDEgPSB3THVtaW5vc2l0eSAqIDIgLSB3TWlkMjsKCiAgICB3UmVkICAgPSBHRVRfUkdCKHdIdWUgKyA4MCk7CiAgICB3R3JlZW4gPSBHRVRfUkdCKHdIdWUpOwogICAgd0JsdWUgID0gR0VUX1JHQih3SHVlIC0gODApOwoKICAgIHJldHVybiBSR0Iod1JlZCwgd0dyZWVuLCB3Qmx1ZSk7CiAgfQoKICB3UmVkID0gd0x1bWlub3NpdHkgKiAyNTUgLyAyNDA7CiAgcmV0dXJuIFJHQih3UmVkLCB3UmVkLCB3UmVkKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjQxM10KICoKICogRnVuY3Rpb24gdW5rbm93biBzZWVtcyB0byBhbHdheXMgdG8gcmV0dXJuIDAKICogeCBjYW4gYmUgMHgzLgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfNDEzIChEV09SRCB4KQp7CglGSVhNRSgiKDB4JTA4bHgpc3R1YlxuIiwgeCk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjQxOF0KICoKICogRnVuY3Rpb24gc2VlbXMgdG8gZG8gRnJlZUxpYnJhcnkgcGx1cyBvdGhlciB0aGluZ3MuCiAqCiAqIEZJWE1FIG5hdGl2ZSBzaG93cyB0aGUgZm9sbG93aW5nIGNhbGxzOgogKiAgIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uCiAqICAgTG9jYWxGcmVlCiAqICAgR2V0UHJvY0FkZHJlc3MoQ29tY3RsMzI/PywgMTUwTCkKICogICBEUEFfRGVsZXRlUHRyCiAqICAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24KICogIGZvbGxvd2VkIGJ5IHRoZSBGcmVlTGlicmFyeS4KICogIFRoZSBhYm92ZSBjb2RlIG1heSBiZSByZWxhdGVkIHRvIC4zNzcgYWJvdmUuCiAqLwpCT09MICBXSU5BUEkgU0hMV0FQSV80MTggKEhNT0RVTEUgeCkKewoJRklYTUUoIigweCUwOGx4KSBwYXJ0aWFsIHN0dWJcbiIsIChMT05HKXgpOwoJcmV0dXJuIEZyZWVMaWJyYXJ5KHgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuNDMwXQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfNDMwIChISU5TVEFOQ0UgaE1vZHVsZSwgSEFORExFIGhlYXApCnsKCUZJWE1FKCIoMHglMDhseCAweCUwOGx4KSBzdHViXG4iLCAoRFdPUkQpaE1vZHVsZSwgKERXT1JEKWhlYXApOwoJcmV0dXJuIEVfRkFJTDsgICAvKiBUaGlzIGlzIHdoYXQgaXMgdXNlZCBpZiBzaGx3YXBpIG5vdCBsb2FkZWQgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjQzMV0KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzQzMSAoRFdPUkQgeCkKewoJRklYTUUoIigweCUwOGx4KXN0dWJcbiIsIHgpOwoJcmV0dXJuIDB4YWJiYTEyNDc7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS40MzZdCiAqCiAqICBUaGlzIGlzIHJlYWxseSBDTFNJREZyb21TdHJpbmcgd2hpY2ggaXMgZXhwb3J0ZWQgYnkgb2xlMzIuZGxsLAogKiAgaG93ZXZlciB0aGUgbmF0aXZlIHNobHdhcGkuZGxsIGRvZXMgKm5vdCogaW1wb3J0IG9sZTMyLiBOb3IgZG9lcwogKiAgb2xlMzIuZGxsIGltcG9ydCB0aGlzIG9yZGluYWwgZnJvbSBzaGx3YXBpLiBUaGVyZWZvcmUgd2UgbXVzdCBjb25jbHVkZQogKiAgdGhhdCBNUyBkdXBsaWNhdGVkIHRoZSBjb2RlIGZvciBDTFNJREZyb21TdHJpbmcuCiAqCiAqICBUaGlzIGlzIGEgZHVwbGljYXRlICh3aXRoIGNoYW5nZXMgZm9yIFVOSUNPREUpIG9mIENMU0lERnJvbVN0cmluZzE2CiAqICBpbiBkbGxzL29sZTMyL2NvbXBvYmouYwogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfNDM2IChMUFdTVFIgaWRzdHIsIENMU0lEICppZCkKewogICAgTFBXU1RSIHMgPSBpZHN0cjsKICAgIEJZVEUgKnA7CiAgICBJTlQgaTsKICAgIFdDSEFSIHRhYmxlWzI1Nl07CgogICAgaWYgKCFzKSB7CgltZW1zZXQocywgMCwgc2l6ZW9mKENMU0lEKSk7CglyZXR1cm4gU19PSzsKICAgIH0KICAgIGVsc2UgeyAgLyogdmFsaWRhdGUgdGhlIENMU0lEIHN0cmluZyAqLwoKCWlmIChzdHJsZW5XKHMpICE9IDM4KQoJICAgIHJldHVybiBDT19FX0NMQVNTU1RSSU5HOwoKCWlmICgoc1swXSE9TCd7JykgfHwgKHNbOV0hPUwnLScpIHx8IChzWzE0XSE9TCctJykgfHwgKHNbMTldIT1MJy0nKSB8fCAoc1syNF0hPUwnLScpIHx8IChzWzM3XSE9TCd9JykpCgkgICAgcmV0dXJuIENPX0VfQ0xBU1NTVFJJTkc7CgoJZm9yIChpPTE7IGk8Mzc7IGkrKykKCSAgICB7CgkJaWYgKChpID09IDkpfHwoaSA9PSAxNCl8fChpID09IDE5KXx8KGkgPT0gMjQpKSBjb250aW51ZTsKCQlpZiAoISgoKHNbaV0gPj0gTCcwJykgJiYgKHNbaV0gPD0gTCc5JykpICB8fAoJCSAgICAgICgoc1tpXSA+PSBMJ2EnKSAmJiAoc1tpXSA8PSBMJ2YnKSkgIHx8CgkJICAgICAgKChzW2ldID49IEwnQScpICYmIChzW2ldIDw9IEwnRicpKSkKCQkgICAgKQoJCSAgICByZXR1cm4gQ09fRV9DTEFTU1NUUklORzsKCSAgICB9CiAgICB9CgogICAgVFJBQ0UoIiVzIC0+ICVwXG4iLCBkZWJ1Z3N0cl93KHMpLCBpZCk7CgogIC8qIHF1aWNrIGxvb2t1cCB0YWJsZSAqLwogICAgbWVtc2V0KHRhYmxlLCAwLCAyNTYqc2l6ZW9mKFdDSEFSKSk7CgogICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKCXRhYmxlWycwJyArIGldID0gaTsKICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKCXRhYmxlWydBJyArIGldID0gaSsxMDsKCXRhYmxlWydhJyArIGldID0gaSsxMDsKICAgIH0KCiAgICAvKiBpbiBmb3JtIHtYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFh9ICovCgogICAgcCA9IChCWVRFICopIGlkOwoKICAgIHMrKzsJLyogc2tpcCBsZWFkaW5nIGJyYWNlICAqLwogICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewoJcFszIC0gaV0gPSB0YWJsZVsqc108PDQgfCB0YWJsZVsqKHMrMSldOwoJcyArPSAyOwogICAgfQogICAgcCArPSA0OwogICAgcysrOwkvKiBza2lwIC0gKi8KCiAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CglwWzEtaV0gPSB0YWJsZVsqc108PDQgfCB0YWJsZVsqKHMrMSldOwoJcyArPSAyOwogICAgfQogICAgcCArPSAyOwogICAgcysrOwkvKiBza2lwIC0gKi8KCiAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CglwWzEtaV0gPSB0YWJsZVsqc108PDQgfCB0YWJsZVsqKHMrMSldOwoJcyArPSAyOwogICAgfQogICAgcCArPSAyOwogICAgcysrOwkvKiBza2lwIC0gKi8KCiAgICAvKiB0aGVzZSBhcmUganVzdCBzZXF1ZW50aWFsIGJ5dGVzICovCiAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CgkqcCsrID0gdGFibGVbKnNdPDw0IHwgdGFibGVbKihzKzEpXTsKCXMgKz0gMjsKICAgIH0KICAgIHMrKzsJLyogc2tpcCAtICovCgogICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewoJKnArKyA9IHRhYmxlWypzXTw8NCB8IHRhYmxlWyoocysxKV07CglzICs9IDI7CiAgICB9CgogICAgcmV0dXJuIFNfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS40MzddCiAqCiAqIERldGVybWluZSBpZiB0aGUgT1Mgc3VwcG9ydHMgYSBnaXZlbiBmZWF0dXJlLgogKgogKiBQQVJBTVMKICogIGR3RmVhdHVyZSBbSV0gRmVhdHVyZSByZXF1ZXN0ZWQgKHVuZG9jdW1lbnRlZCkKICoKICogUkVUVVJOUwogKiAgVFJVRSAgSWYgdGhlIGZlYXR1cmUgaXMgYXZhaWxhYmxlLgogKiAgRkFMU0UgSWYgdGhlIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZS4KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzQzNyAoRFdPUkQgZmVhdHVyZSkKewogIEZJWE1FKCIoMHglMDhseCkgc3R1YlxuIiwgZmVhdHVyZSk7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIENvbG9yUkdCVG9ITFMJW1NITFdBUEkuNDQ1XQogKgogKiBDb252ZXJ0IGZyb20gUkdCIENPTE9SUkVGIGludG8gdGhlIEhMUyBjb2xvciBzcGFjZS4KICoKICogTk9URVMKICogSW5wdXQgSExTIHZhbHVlcyBhcmUgY29uc3RyYWluZWQgdG8gdGhlIHJhbmdlICgwLi4yNDApLgogKi8KVk9JRCBXSU5BUEkgQ29sb3JSR0JUb0hMUyhDT0xPUlJFRiBkclJHQiwgTFBXT1JEIHB3SHVlLAoJCQkgIExQV09SRCB3THVtaW5hbmNlLCBMUFdPUkQgcHdTYXR1cmF0aW9uKQp7CiAgICBGSVhNRSgic3R1YlxuIik7CiAgICByZXR1cm47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hDcmVhdGVTaGVsbFBhbGV0dGUJW1NITFdBUEkuQF0KICovCkhQQUxFVFRFIFdJTkFQSSBTSENyZWF0ZVNoZWxsUGFsZXR0ZShIREMgaGRjKQp7CglGSVhNRSgic3R1YlxuIik7CglyZXR1cm4gQ3JlYXRlSGFsZnRvbmVQYWxldHRlKGhkYyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNIR2V0SW52ZXJzZUNNQVAgKFNITFdBUEkuQCkKICovCkRXT1JEIFdJTkFQSSBTSEdldEludmVyc2VDTUFQIChMUERXT1JEKiB4LCBEV09SRCB3aHkpCnsKICAgIGlmICh3aHkgPT0gNCkgewoJRklYTUUoIiAtIHJldHVybmluZyBib2d1cyBhZGRyZXNzIGZvciBTSEdldEludmVyc2VDTUFQXG4iKTsKCSp4ID0gKExQRFdPUkQpMHhhYmJhMTI0OTsKCXJldHVybiAwOwogICAgfQogICAgRklYTUUoIiglcCwgJSNseClzdHViXG4iLCB4LCB3aHkpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hJc0xvd01lbW9yeU1hY2hpbmUJW1NITFdBUEkuQF0KICovCkRXT1JEIFdJTkFQSSBTSElzTG93TWVtb3J5TWFjaGluZSAoRFdPUkQgeCkKewoJRklYTUUoIjB4JTA4bHhcbiIsIHgpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgR2V0TWVudVBvc0Zyb21JRAlbU0hMV0FQSS5AXQogKi8KSU5UIFdJTkFQSSBHZXRNZW51UG9zRnJvbUlEKEhNRU5VIGhNZW51LCBVSU5UIHdJRCkKewogTUVOVUlURU1JTkZPQSBtaTsKIElOVCBuQ291bnQgPSBHZXRNZW51SXRlbUNvdW50KGhNZW51KSwgbkl0ZXIgPSAwOwoKIHdoaWxlIChuSXRlciA8IG5Db3VudCkKIHsKICAgbWkud0lEID0gMDsKICAgaWYgKCFHZXRNZW51SXRlbUluZm9BKGhNZW51LCBuSXRlciwgVFJVRSwgJm1pKSAmJiBtaS53SUQgPT0gd0lEKQogICAgIHJldHVybiBuSXRlcjsKICAgbkl0ZXIrKzsKIH0KIHJldHVybiAtMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hTa2lwSnVuY3Rpb24JW1NITFdBUEkuQF0KICoKICogRGV0ZXJtaW5lIGlmIGEgYmluZCBjb250ZXh0IGNhbiBiZSBib3VuZCB0byBhbiBvYmplY3QKICoKICogUEFSQU1TCiAqICBwYmMgICAgW0ldIEJpbmQgY29udGV4dCB0byBjaGVjawogKiAgcGNsc2lkIFtJXSBDTFNJRCBvZiBvYmplY3QgdG8gYmUgYm91bmQgdG8KICoKICogUkVUVVJOUwogKiAgVFJVRTogSWYgaXQgaXMgc2FmZSB0byBiaW5kCiAqICBGQUxTRTogSWYgcGJjIGlzIGludmFsaWQgb3IgYmluZGluZyB3b3VsZCBub3QgYmUgc2FmZQogKgogKi8KQk9PTCBXSU5BUEkgU0hTa2lwSnVuY3Rpb24oSUJpbmRDdHggKnBiYywgY29uc3QgQ0xTSUQgKnBjbHNpZCkKewogIHN0YXRpYyBXQ0hBUiBzelNraXBCaW5kaW5nW10gPSB7ICdTJywnaycsJ2knLCdwJywnICcsCiAgICAnQicsJ2knLCduJywnZCcsJ2knLCduJywnZycsJyAnLCdDJywnTCcsJ1MnLCdJJywnRCcsJ1wwJyB9OwogIEJPT0wgYlJldCA9IEZBTFNFOwoKICBpZiAocGJjKQogIHsKICAgIElVbmtub3duKiBscFVuazsKCiAgICBpZiAoU1VDQ0VFREVEKElCaW5kQ3R4X0dldE9iamVjdFBhcmFtKHBiYywgc3pTa2lwQmluZGluZywgJmxwVW5rKSkpCiAgICB7CiAgICAgIENMU0lEIGNsc2lkOwoKICAgICAgaWYgKFNVQ0NFRURFRChTSExXQVBJXzE3NShscFVuaywgJmNsc2lkKSkgJiYKICAgICAgICAgIElzRXF1YWxHVUlEKHBjbHNpZCwgJmNsc2lkKSkKICAgICAgICBiUmV0ID0gVFJVRTsKCiAgICAgIElVbmtub3duX1JlbGVhc2UobHBVbmspOwogICAgfQogIH0KICByZXR1cm4gYlJldDsKfQo=