LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCgovLyBNQVJLRVIodXBkYXRlX3ByZWNvbXAucHkpOiBhdXRvZ2VuIGluY2x1ZGUgc3RhdGVtZW50LCBkbyBub3QgcmVtb3ZlCiNpbmNsdWRlICJwcmVjb21waWxlZF9iYXNpYy5oeHgiCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dG9vbHMvc3RyZWFtLmh4eD4KI2luY2x1ZGUgPGJhc2ljL3NieC5oeHg+CiNpbmNsdWRlICJzYi5oeHgiCiNpbmNsdWRlICJpb3N5cy5oeHgiCiNpbmNsdWRlICJkaXNhcy5oeHgiCiNpbmNsdWRlICJzYnRyYWNlLmh4eCIKCgpzdGF0aWMgY29uc3QgY2hhciogcE9wMVtdID0gewoJIk5PUCIsCgoJLy8gT3BlcmF0b3JzCgkvLyB0aGUgZm9sbG93aW5nIG9wZXJhdG9ycyBoYXZlIHRoZSBzYW1lIG9yZGVyIGFzIGluCgkvLyBlbnVtIFNieFZhck9wCgkiRVhQIiwgIk1VTCIsICJESVYiLCAiTU9EIiwgIlBMVVMiLCAiTUlOVVMiLCAiTkVHIiwKCSJFUSIsICJORSIsICJMVCIsICJHVCIsICJMRSIsICJHRSIsCgkiSURJViIsICJBTkQiLCAiT1IiLCAiWE9SIiwgIkVRViIsICJJTVAiLCAiTk9UIiwKCSJDQVQiLAoJLy8gRW5kIGVudW0gU2J4VmFyT3AKCSJMSUtFIiwgIklTIiwKCS8vIExvYWQvU3RvcmUKCSJBUkdDIiwgICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBBcmd2CgkiQVJHViIsICAgICAgICAgICAgIC8vIFRPUyA9PT4gY3VycmVudCBBcmd2CgkiSU5QVVQiLCAgICAgICAgICAgIC8vIElucHV0ID09PiBUT1MKCSJMSU5QVVQiLCAgICAgICAgICAgLy8gTGluZSBJbnB1dCA9PT4gVE9TCgkiR0VUIiwgICAgICAgICAgICAgIC8vIGdldCBUT1MKCSJTRVQiLCAgICAgICAgICAgICAgLy8gU2F2ZSBPYmplY3QgVE9TID09PiBUT1MtMQoJIlBVVCIsICAgICAgICAgICAgICAvLyBUT1MgPT0+IFRPUy0xCgkiQ09OU1QiLCAgICAgICAgICAgIC8vIFRPUyA9PT4gVE9TLTEsIHRoZW4gUmVhZE9ubHkKCSJESU0iLCAgICAgICAgICAgICAgLy8gRElNCgkiUkVESU0iLCAgICAgICAgICAgIC8vIFJFRElNCgkiUkVESU1QIiwgICAgICAgICAgIC8vIFJFRElNIFBSRVNFUlZFCgkiRVJBU0UiLCAgICAgICAgICAgIC8vIGRlbGV0ZSBUT1MKCS8vIEJyYW5jaAoJIlNUT1AiLCAgICAgICAgICAgICAvLyBFbmQgb2YgcHJvZ3JhbQoJIklOSVRGT1IiLCAgICAgICAgICAvLyBGT1ItVmFyaWFibGUgaW5pdAoJIk5FWFQiLCAgICAgICAgICAgICAvLyBGT1ItVmFyaWFibGUgaW5jcmVtZW50CgkiQ0FTRSIsICAgICAgICAgICAgIC8vIEJlZ2luIENBU0UKCSJFTkRDQVNFIiwgICAgICAgICAgLy8gRW5kIENBU0UKCSJTVERFUlIiLCAgICAgICAgICAgLy8gRGVmYXVsdCBlcnJvciBoYW5kbGluZwoJIk5PRVJST1IiLCAgICAgICAgICAvLyBObyBlcnJvciBoYW5kbGluZwoJIkxFQVZFIiwgICAgICAgICAgICAvLyBsZWF2ZSBVUAoJLy8gSS9PCgkiQ0hBTk5FTCIsICAgICAgICAgIC8vIFRPUyA9IENoYW5uZWxudW1iZXIKCSJQUklOVCIsICAgICAgICAgICAgLy8gcHJpbnQgVE9TCgkiUFJJTlRGIiwgICAgICAgICAgIC8vIHByaW50IFRPUyBpbiBmaWVsZAoJIldSSVRFIiwgICAgICAgICAgICAvLyB3cml0ZSBUT1MKCSJSRU5BTUUiLCAgICAgICAgICAgLy8gUmVuYW1lIFRvcysxIHRvIFRvcwoJIlBST01QVCIsICAgICAgICAgICAvLyBUT1MgPSBQcm9tcHQgZm9yIElucHV0CgkiUkVTVEFSVCIsICAgICAgICAgIC8vIERlZmluZSByZXN0YXJ0IHBvaW50CgkiU1RESU8iLCAgICAgICAgICAgIC8vIFN3aXRjaCB0byBJL08gY2hhbm5lbCAwCgkvLyBNaXNjCgkiRU1QVFkiLCAgICAgICAgICAgIC8vIEVtcHR5IHN0YXRlbWVudCB0byBzdGFjawoJIkVSUk9SIiwgICAgICAgICAgICAvLyBUT1MgPSBlcnJvciBjb2RlCgkiTFNFVCIsICAgICAgICAgICAgIC8vIFNhdmUgb2JqZWN0IFRPUyA9PT4gVE9TLTEKCSJSU0VUIiwgICAgICAgICAgICAgLy8gU2F2ZSBvYmplY3QgVE9TID09PiBUT1MtMSAoVE9ETzogU2FtZSBhcyBhYm92ZT8pCiAgICAiUkVESU1QX0VSQVNFIiwKICAgICJJTklURk9SRUFDSCIsCgkiVkJBU0VUIiwKCSJFUkFTRV9DTEVBUiIsCgkiQVJSQVlBQ0NFU1MiLAoJIkJZVkFMIgp9OwoKc3RhdGljIGNvbnN0IGNoYXIqIHBPcDJbXSA9IHsKCSJOVU1CRVIiLCAgICAgICAgICAgIC8vIExvYWQgYSBudW1lcmljIGNvbnN0YW50ICgrSUQpCgkiU1RSSU5HIiwgICAgICAgICAgICAvLyBMb2FkIGEgc3RyaW5nIGNvbnN0YW50ICgrSUQpCgkiQ09OU1RBTlQiLCAgICAgICAgICAvLyBJbW1lZGlhdGUgTG9hZCAoK3ZhbHVlKQoJIkFSR04iLCAgICAgICAgICAgICAgLy8gU2F2ZSBuYW1lZCBhcmdzIGluIGFyZ3YgKCtTdHJpbmdJRCkKCSJQQUQiLCAgICAgICAgICAgICAgIC8vIFBhZCBTdHJpbmcgdG8gZGVmaW5lZCBsZW5ndGggKCtsZW5ndGgpCgkvLyBCcmFuY2hlcwoJIkpVTVAiLCAgICAgICAgICAgICAgLy8gSnVtcCB0byB0YXJnZXQgKCtUYXJnZXQpCgkiSlVNUC5UIiwgICAgICAgICAgICAvLyBldmFsdWF0ZSBUT1MsIGNvbmRpdGlvbmFsIGp1bXAgKCtUYXJnZXQpCgkiSlVNUC5GIiwgICAgICAgICAgICAvLyBldmFsdWF0ZSBUT1MsIGNvbmRpdGlvbmFsIGp1bXAgKCtUYXJnZXQpCgkiT05KVU1QIiwgICAgICAgICAgICAvLyBldmFsdWF0ZSBUT1MsIGp1bXAgaW50byBKVU1QLXRhYmxlICgrTWF4VmFsKQoJIkdPU1VCIiwgICAgICAgICAgICAgLy8gVVAtQ2FsbCAoK1RhcmdldCkKCSJSRVRVUk4iLCAgICAgICAgICAgIC8vIFVQLVJldHVybiAoKzAgb3IgVGFyZ2V0KQoJIlRFU1RGT1IiLCAgICAgICAgICAgLy8gVGVzdCBGT1ItVmFyaWFibGUsIGluY3JlbWVudCAoK0VuZGxhYmVsKQoJIkNBU0VUTyIsICAgICAgICAgICAgLy8gVG9zKzEgPD0gQ2FzZSA8PSBUb3MsIDJ4cmVtb3ZlICgrVGFyZ2V0KQoJIkVSUkhETCIsICAgICAgICAgICAgLy8gRXJyb3ItSGFuZGxlciAoK09mZnNldCkKCSJSRVNVTUUiLCAgICAgICAgICAgIC8vIFJlc3VtZSBhZnRlciBlcnJvcnMgKCswIG9yIDEgb3IgTGFiZWwpCgkvLyBJL08KCSJDTE9TRSIsICAgICAgICAgICAgIC8vICgrY2hhbm5lbC8wKQoJIlBSQ0hBUiIsICAgICAgICAgICAgLy8gKCtjaGFyKQoJLy8gT2JqZWN0cwoJIlNFVENMQVNTIiwgICAgICAgICAgLy8gVGVzdCBTZXQgKyBDbGFzc25hbWUgKCtTdHJpbmdJZCkKCSJURVNUQ0xBU1MiLCAgICAgICAgIC8vIENoZWNrIFRPUyBjbGFzcyAoK1N0cmluZ0lkKQoJIkxJQiIsICAgICAgICAgICAgICAgLy8gU2V0IExpYm5hbWUgZm9yIERlY2xhcmUtUHJvY3MgKCtTdHJpbmdJZCkKCS8vIE5ldyBzaW5jZSBCZXRhIDMgKFRPRE86IFdoaWNoIEJldGEzPykKCSJCQVNFRCIsICAgICAgICAgICAgIC8vIFRPUyBpcyBpbmNyZW10ZWQgYWJvdXQgQkFTRSwgcHVzaCBCQVNFIGJlZm9yZQoJIkFSR1RZUCIsICAgICAgICAgICAgLy8gQ29udmVydCBsYXN0IHBhcmFtZXRlciBpbiBhcmd2ICgrVHlwZSkKCSJWQkFTRVRDTEFTUyIsCn07CgpzdGF0aWMgY29uc3QgY2hhciogcE9wM1tdID0gewoJLy8gQWxsIG9wY29kZXMgd2l0aCB0d28gb3BlcmFuZHMKCSJSVEwiLCAgICAgICAgICAgICAgLy8gTG9hZCBmcm9tIFJUTCAoK1N0cmluZ0lEK1R5cCkKCSJGSU5EIiwgICAgICAgICAgICAgLy8gTG9hZCAoK1N0cmluZ0lEK1R5cCkKCSJFTEVNIiwgICAgICAgICAgICAgLy8gTG9hZCBlbGVtZW50ICgrU3RyaW5nSUQrVHlwKQoJIlBBUkFNIiwgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgKCtPZmZzZXQrVHlwKQoKICAgIC8vIEJyYW5jaGluZwoJIkNBTEwiLCAgICAgICAgICAgICAvLyBDYWxsIERFQ0xBUkUgbWV0aG9kICgrU3RyaW5nSUQrVHlwKQoJIkNBTEwuQyIsICAgICAgICAgICAvLyBDYWxsIENkZWNsLURFQ0xBUkUgbWV0aG9kICgrU3RyaW5nSUQrVHlwKQoJIkNBU0VJUyIsICAgICAgICAgICAvLyBDYXNlLVRlc3QgKCtUZXN0LU9wY29kZStGYWxzZS1UYXJnZXQpCgkiU1RNTlQiLCAgICAgICAgICAgIC8vIFN0YXJ0IG9mIGEgc3RhdGVtZW50ICgrTGluZStDb2wpCgogICAgLy8gSS9PCgkiT1BFTiIsICAgICAgICAgICAgIC8vICgrU3ZTdHJlYW1GbGFncytGbGFncykKCiAgICAvLyBPYmplY3RzIGFuZCB2YXJpYWJsZXMKCSJMT0NBTCIsICAgICAgICAgICAgLy8gTG9jYWwgdmFyaWFibGVzICgrU3RyaW5nSUQrVHlwKQoJIlBVQkxJQyIsICAgICAgICAgICAvLyBNb2R1bCBnbG9iYWwgdmFyICgrU3RyaW5nSUQrVHlwKQoJIkdMT0JBTCIsICAgICAgICAgICAvLyBHbG9iYWwgdmFyICgrU3RyaW5nSUQrVHlwKQoJIkNSRUFURSIsICAgICAgICAgICAvLyBDcmVhdGUgb2JqZWN0ICgrU3RyaW5nSWQrU3RyaW5nSWQpCgkiU1RBVElDIiwgICAgICAgICAgIC8vIENyZWF0ZSBzdGF0aWMgb2JqZWN0ICgrU3RyaW5nSWQrU3RyaW5nSWQpCgkiVENSRUFURSIsICAgICAgICAgIC8vIENyZWF0ZSBVc2VyIGRlZmluZWQgT2JqZWN0ICgrU3RyaW5nSWQrU3RyaW5nSWQpCgkiRENSRUFURSIsICAgICAgICAgIC8vIENyZWF0ZSBVc2VyIGRlZmluZWQgT2JqZWN0LUFycmF5IGtyZWllcmVuICgrU3RyaW5nSWQrU3RyaW5nSWQpCiAgICAiR0xPQkFMX1AiLCAgICAgICAgIC8vIERlZmluZSBwZXJzaXN0ZW50IGdsb2JhbCB2YXIgKGV4aXN0aW5nIGFmdGVyIGJhc2ljIHJlc3RhcnQpCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFA9UEVSU0lTVCAoK1N0cmluZ0lEK1R5cCkKICAgICJGSU5EX0ciLCAgICAgICAgICAgLy8gU2VhcmNoZXMgZm9yIGdsb2JhbCB2YXIgd2l0aCBzcGVjaWFsIGhhbmRsaW5nIGR1ZSB0byBfR0xPQkFMX1AKICAgICJEQ1JFQVRFX1JFRElNUCIsICAgLy8gQ2hhbmdlIGRpbWVuc2lvbnMgb2YgYSB1c2VyIGRlZmluZWQgT2JqZWN0LUFycmF5ICgrU3RyaW5nSWQrU3RyaW5nSWQpCiAgICAiRklORF9DTSIsICAgICAgICAgIC8vIFNlYXJjaCBpbnNpZGUgYSBjbGFzcyBtb2R1bGUgKENNKSB0byBlbmFibGUgZ2xvYmFsIHNlYXJjaCBpbiB0aW1lCiAgICAiUFVCTElDX1AiLCAgICAgICAgCS8vIE1vZHVsZSBnbG9iYWwgVmFyaWFibGUgKHBlcnNpc3RlZCBiZXR3ZWVuIGNhbGxzKSgrU3RyaW5nSUQrVHlwKQogICAgIkZJTkRfU1RBVElDIiwgICAgIAkvLyBsb2NhbCBzdGF0aWMgdmFyIGxvb2t1cCAoK1N0cmluZ0lEK1R5cCkKfTsKCnN0YXRpYyBjb25zdCBjaGFyKiogcE9wc1szXSA9IHsgcE9wMSwgcE9wMiwgcE9wMyB9OwoKdHlwZWRlZiB2b2lkKCBTYmlEaXNhczo6KkZ1bmMgKSggU3RyaW5nJiApOyAgLy8gUHJvY2Vzc2luZyByb3V0aW5lcwoKc3RhdGljIGNvbnN0IEZ1bmMgcE9wZXJhbmQyW10gPSB7CgkmU2JpRGlzYXM6OlN0ck9wLAkvLyBMb2FkIGEgbnVtZXJpYyBjb25zdGFudCAoK0lEKQoJJlNiaURpc2FzOjpTdHJPcCwJLy8gTG9hZCBhIHN0cmluZyBjb25zdGFudCAoK0lEKQoJJlNiaURpc2FzOjpJbW1PcCwJLy8gSW1tZWRpYXRlIExvYWQgKCtXZXJ0KQoJJlNiaURpc2FzOjpTdHJPcCwJLy8gU2F2ZSBhIG5hbWVkIGFyZ3VtZW50ICgrSUQpCgkmU2JpRGlzYXM6OkltbU9wLAkvLyBTdHJpcCBTdHJpbmcgdG8gZml4ZWQgc2l6ZSAoK2xlbmd0aCkKCiAgICAvLyBCcmFuY2hlcwoJJlNiaURpc2FzOjpMYmxPcCwJLy8gSnVtcCAoK1RhcmdldCkKCSZTYmlEaXNhczo6TGJsT3AsCS8vIGV2YWwgVE9TLCBjb25kaXRpb25hbCBqdW1wICgrVGFyZ2V0KQoJJlNiaURpc2FzOjpMYmxPcCwgCS8vIGV2YWwgVE9TLCBjb25kaXRpb25hbCBqdW1wICgrVGFyZ2V0KQoJJlNiaURpc2FzOjpPbk9wLAkvLyBldmFsIFRPUywganVtcCBpbiBKVU1QIHRhYmxlICgrTWF4VmFsKQoJJlNiaURpc2FzOjpMYmxPcCwJLy8gVVAgY2FsbCAoK1RhcmdldCkKCSZTYmlEaXNhczo6UmV0dXJuT3AsCS8vIFVQIFJldHVybiAoKzAgb3IgVGFyZ2V0KQoJJlNiaURpc2FzOjpMYmxPcCwJLy8gdGVzdCBGT1ItVmFyaWFibGUsIGluY3JlbWVudCAoK0VuZGxhYmVsKQoJJlNiaURpc2FzOjpMYmxPcCwJLy8gVG9zKzEgPD0gQ2FzZSA8PSBUb3MpLCAyeHJlbW92ZSAoK1RhcmdldCkKCSZTYmlEaXNhczo6TGJsT3AsCS8vIEVycm9yIGhhbmRsZXIgKCtPZmZzZXQpCgkmU2JpRGlzYXM6OlJlc3VtZU9wLAkvLyBSZXN1bWUgYWZ0ZXIgZXJyb3JzICgrMCBvciAxIG9yIExhYmVsKQoKICAgIC8vIEkvTwoJJlNiaURpc2FzOjpDbG9zZU9wLAkvLyAoK2NoYW5uZWwvMCkKCSZTYmlEaXNhczo6Q2hhck9wLAkvLyAoK2NoYXIpCgogICAgLy8gT2JqZWN0cwoJJlNiaURpc2FzOjpTdHJPcCwgICAvLyBUZXN0IGNsYXNzbmFtZSAoK1N0cmluZ0lkKQoJJlNiaURpc2FzOjpTdHJPcCwgICAvLyBURVNUQ0xBU1MsIENoZWNrIFRPUyBjbGFzcyAoK1N0cmluZ0lkKQoJJlNiaURpc2FzOjpTdHJPcCwgICAvLyBTZXQgbGlibmFtZSBmb3IgZGVjbGFyZSBwcm9jcyAoK1N0cmluZ0lkKQoJJlNiaURpc2FzOjpJbW1PcCwgICAvLyBUT1MgaXMgaW5jcmVtZW50ZWQgYWJvdXQgQkFTRSBlcmhvZWh0LCBCQVNFIHB1c2hlZCBiZWZvcmUKCSZTYmlEaXNhczo6VHlwZU9wLCAgLy8gQ29udmVydCBsYXN0IHBhcmFtZXRlciB0by9pbig/KSBhcmd2ICgrVHlwKQoJJlNiaURpc2FzOjpTdHJPcCwgICAvLyBWQkFTRVRDTEFTUyAoK1N0cmluZ0lkKQp9OwoKc3RhdGljIGNvbnN0IEZ1bmMgcE9wZXJhbmQzW10gPSB7CgkvLyBBbGwgb3Bjb2RlcyB3aXRoIHR3byBvcGVyYW5kcwoJJlNiaURpc2FzOjpWYXJPcCwJLy8gTG9hZCBmcm9tIFJUTCAoK1N0cmluZ0lEK1R5cCkKCSZTYmlEaXNhczo6VmFyT3AsCS8vIExvYWQgKCtTdHJpbmdJRCtUeXApCgkmU2JpRGlzYXM6OlZhck9wLAkvLyBMb2FkIEVsZW1lbnQgKCtTdHJpbmdJRCtUeXApCgkmU2JpRGlzYXM6Ok9mZk9wLAkvLyBQYXJhbWV0ZXIgKCtPZmZzZXQrVHlwKQoKCS8vIEJyYW5jaAoJJlNiaURpc2FzOjpWYXJPcCwJLy8gQ2FsbCBERUNMQVJFLU1ldGhvZCAoK1N0cmluZ0lEK1R5cCkKCSZTYmlEaXNhczo6VmFyT3AsCS8vIENhbGwgQ0RlY2wtREVDTEFSRS1NZXRob2RlICgrU3RyaW5nSUQrVHlwKQoJJlNiaURpc2FzOjpDYXNlT3AsCS8vIENhc2UtVGVzdCAoK1Rlc3QtT3Bjb2RlK0ZhbHNlLVRhcmdldCkKCSZTYmlEaXNhczo6U3RtbnRPcCwJLy8gU3RhdGVtZW50ICgrUm93K0NvbHVtbikKCgkvLyBJL08KCSZTYmlEaXNhczo6U3RybU9wLAkvLyAoK1N2U3RyZWFtRmxhZ3MrRmxhZ3MpCgoJLy8gT2JqZWN0cwoJJlNiaURpc2FzOjpWYXJEZWZPcCwgICAvLyBEZWZpbmUgbG9jYWwgdmFyICgrU3RyaW5nSUQrVHlwKQoJJlNiaURpc2FzOjpWYXJEZWZPcCwgICAvLyBEZWZpbmUgTW9kdWxlIGdsb2JhbCB2YXIgKCtTdHJpbmdJRCtUeXApCgkmU2JpRGlzYXM6OlZhckRlZk9wLCAgIC8vIERlZmluZSBnbG9iYWwgdmFyICgrU3RyaW5nSUQrVHlwKQoJJlNiaURpc2FzOjpTdHIyT3AsICAgICAvLyBDcmVhdGUgb2JqZWN0ICgrU3RyaW5nSWQrU3RyaW5nSWQpCgkmU2JpRGlzYXM6OlZhckRlZk9wLCAgIC8vIERlZmluZSBzdGF0aWMgb2JqZWN0ICgrU3RyaW5nSUQrVHlwKQoJJlNiaURpc2FzOjpTdHIyT3AsICAgICAvLyBDcmVhdGUgVXNlciBkZWZpbmVkIE9iamVjdCAoK1N0cmluZ0lkK1N0cmluZ0lkKQoJJlNiaURpc2FzOjpTdHIyT3AsICAgICAvLyBDcmVhdGUgVXNlciBkZWZpbmVkIE9iamVjdC1BcnJheSAoK1N0cmluZ0lkK1N0cmluZ0lkKQoJJlNiaURpc2FzOjpWYXJEZWZPcCwgICAvLyBEZWZpbmUgcGVyc2lzdGVudCBnbG9iYWwgdmFyIFA9UEVSU0lTVCAoK1N0cmluZ0lEK1R5cCkKICAgICZTYmlEaXNhczo6VmFyT3AsICAgIC8vIFNlYXJjaGVzIGZvciBnbG9iYWwgdmFyIHdpdGggc3BlY2lhbCBoYW5kbGluZyBkdWUgdG8gIF9HTE9CQUxfUAoJJlNiaURpc2FzOjpTdHIyT3AsICAgICAvLyBSZWRpbWVuc2lvbmF0ZSBVc2VyIGRlZmluZWQgT2JqZWN0LUFycmF5ICgrU3RyaW5nSWQrU3RyaW5nSWQpCgkmU2JpRGlzYXM6OlZhck9wLAkgLy8gRklORF9DTQoJJlNiaURpc2FzOjpWYXJEZWZPcCwgLy8gUFVCTElDX1AKCSZTYmlEaXNhczo6VmFyT3AsCSAvLyBGSU5EX1NUQVRJQwp9OwoKLy8gVE9ETzogV2h5IGFzIG1ldGhvZD8gSXNuJ3QgYSBzaW1wbGUgZGVmaW5lIHN1ZmZpY2llbnQ/CnN0YXRpYyBjb25zdCBjaGFyKiBfY3JsZigpCnsKI2lmIGRlZmluZWQgKFVOWCkgfHwgZGVmaW5lZCggUE0yICkKCXJldHVybiAiXG4iOwojZWxzZQoJcmV0dXJuICJcclxuIjsKI2VuZGlmCn0KCi8vIFRoaXMgbWV0aG9kIGV4aXN0cyBiZWNhdXNlIHdlIHdhbnQgdG8gbG9hZCB0aGUgZmlsZSBhcyBvd24gc2VnbWVudApzYWxfQm9vbCBTYk1vZHVsZTo6RGlzYXNzZW1ibGUoIFN0cmluZyYgclRleHQgKQp7CglyVGV4dC5FcmFzZSgpOwoJaWYoIHBJbWFnZSApCgl7CgkJU2JpRGlzYXMgYURpc2FzKCB0aGlzLCBwSW1hZ2UgKTsKCQlhRGlzYXMuRGlzYXMoIHJUZXh0ICk7Cgl9CglyZXR1cm4gc2FsX0Jvb2woIHJUZXh0LkxlbigpICE9IDAgKTsKfQoKU2JpRGlzYXM6OlNiaURpc2FzKCBTYk1vZHVsZSogcCwgY29uc3QgU2JpSW1hZ2UqIHEgKSA6IHJJbWcoICpxICksIHBNb2QoIHAgKQp7CgltZW1zZXQoIGNMYWJlbHMsIDAsIDgxOTIgKTsKCW5MaW5lID0gMDsKCW5PZmYgPSAwOwoJblBDID0gMDsKCW5PcDEgPSBuT3AyID0gblBhcnRzID0gMDsKCWVPcCA9IF9OT1A7CgkvLyBTZXQgTGFiZWwtQml0cwoJbk9mZiA9IDA7Cgl3aGlsZSggRmV0Y2goKSApCgl7CgkJc3dpdGNoKCBlT3AgKQoJCXsKCQkJY2FzZSBfUkVTVU1FOiBpZiggbk9wMSA8PSAxICkgYnJlYWs7CgkJCWNhc2UgX1JFVFVSTjogaWYoICFuT3AxICkgYnJlYWs7CgkJCWNhc2UgX0pVTVA6CgkJCWNhc2UgX0pVTVBUOgoJCQljYXNlIF9KVU1QRjoKCQkJY2FzZSBfR09TVUI6CgkJCWNhc2UgX1RFU1RGT1I6CgkJCWNhc2UgX0NBU0VJUzoKCQkJY2FzZSBfQ0FTRVRPOgoJCQljYXNlIF9FUlJIREw6CiAgICAgICAgICAgICAgICBjTGFiZWxzWyAobk9wMSAmIDB4ZmZmZikgPj4gMyBdIHw9ICggMSA8PCAoIG5PcDEgJiA3ICkgKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoJCQlkZWZhdWx0OiBicmVhazsKCQl9Cgl9CgluT2ZmID0gMDsKCS8vIEFkZCB0aGUgcHVibGljcwoJZm9yKCBzYWxfdUludDE2IGkgPSAwOyBpIDwgcE1vZC0+R2V0TWV0aG9kcygpLT5Db3VudCgpOyBpKysgKQoJewoJCVNiTWV0aG9kKiBwTWV0aCA9IFBUUl9DQVNUKFNiTWV0aG9kLHBNb2QtPkdldE1ldGhvZHMoKS0+R2V0KCBpICkpOwoJCWlmKCBwTWV0aCApCgkJewoJCQlzYWxfdUludDE2IG5Qb3MgPSAoc2FsX3VJbnQxNikgKHBNZXRoLT5HZXRJZCgpKTsKCQkJY0xhYmVsc1sgblBvcyA+PiAzIF0gfD0gKCAxIDw8ICggblBvcyAmIDcgKSApOwoJCX0KCX0KfQoKLy8gUmVhZCBjdXJyZW50IG9wY29kZQpzYWxfQm9vbCBTYmlEaXNhczo6RmV0Y2goKQp7CgluUEMgPSBuT2ZmOwoJaWYoIG5PZmYgPj0gckltZy5HZXRDb2RlU2l6ZSgpICkKCQlyZXR1cm4gc2FsX0ZhbHNlOwoJY29uc3QgdW5zaWduZWQgY2hhciogcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyKikoIHJJbWcuR2V0Q29kZSgpICsgbk9mZiApOwoJZU9wID0gKFNiaU9wY29kZSkgKCAqcCsrICYgMHhGRiApOwoJaWYoIGVPcCA8PSBTYk9QMF9FTkQgKQoJewoJCW5PcDEgPSBuT3AyID0gMDsKCQluUGFydHMgPSAxOwoJCW5PZmYrKzsKCQlyZXR1cm4gc2FsX1RydWU7Cgl9CgllbHNlIGlmKCBlT3AgPD0gU2JPUDFfRU5EICkKCXsKCQluT2ZmICs9IDU7CgkJaWYoIG5PZmYgPiBySW1nLkdldENvZGVTaXplKCkgKQoJCQlyZXR1cm4gc2FsX0ZhbHNlOwoJCW5PcDEgPSAqcCsrOyBuT3AxIHw9ICpwKysgPDwgODsgbk9wMSB8PSAqcCsrIDw8IDE2OyBuT3AxIHw9ICpwKysgPDwgMjQ7CgkJblBhcnRzID0gMjsKCQlyZXR1cm4gc2FsX1RydWU7Cgl9CgllbHNlIGlmKCBlT3AgPD0gU2JPUDJfRU5EICkKCXsKCQluT2ZmICs9IDk7CgkJaWYoIG5PZmYgPiBySW1nLkdldENvZGVTaXplKCkgKQoJCQlyZXR1cm4gc2FsX0ZhbHNlOwoJCW5PcDEgPSAqcCsrOyBuT3AxIHw9ICpwKysgPDwgODsgbk9wMSB8PSAqcCsrIDw8IDE2OyBuT3AxIHw9ICpwKysgPDwgMjQ7CgkJbk9wMiA9ICpwKys7IG5PcDIgfD0gKnArKyA8PCA4OyBuT3AyIHw9ICpwKysgPDwgMTY7IG5PcDIgfD0gKnArKyA8PCAyNDsKCQluUGFydHMgPSAzOwoJCXJldHVybiBzYWxfVHJ1ZTsKCX0KCWVsc2UKCQlyZXR1cm4gc2FsX0ZhbHNlOwp9Cgp2b2lkIFNiaURpc2FzOjpEaXNhcyggU3ZTdHJlYW0mIHIgKQp7CglTdHJpbmcgYVRleHQ7CgluT2ZmID0gMDsKCXdoaWxlKCBEaXNhc0xpbmUoIGFUZXh0ICkgKQoJewoJCUJ5dGVTdHJpbmcgYUJ5dGVUZXh0KCBhVGV4dCwgZ3NsX2dldFN5c3RlbVRleHRFbmNvZGluZygpICk7CgkJci5Xcml0ZUxpbmUoIGFCeXRlVGV4dCApOwoJfQp9Cgp2b2lkIFNiaURpc2FzOjpEaXNhcyggU3RyaW5nJiByICkKewoJci5FcmFzZSgpOwoJU3RyaW5nIGFUZXh0OwoJbk9mZiA9IDA7Cgl3aGlsZSggRGlzYXNMaW5lKCBhVGV4dCApICkKCXsKCQlyICs9IGFUZXh0OwoJCXIuQXBwZW5kQXNjaWkoIF9jcmxmKCkgKTsKCX0KCWFUZXh0LkNvbnZlcnRMaW5lRW5kKCk7Cn0KCnNhbF9Cb29sIFNiaURpc2FzOjpEaXNhc0xpbmUoIFN0cmluZyYgclRleHQgKQp7CgljaGFyIGNCdWZbIDEwMCBdOwoJY29uc3QgY2hhciogcE1hc2tbXSA9IHsKCQkiJTA4IiBTQUxfUFJJWFVJTlQzMiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCgkJIiUwOCIgU0FMX1BSSVhVSU5UMzIgIiAlMDJYICAgICAgICAgICAgICAgICAgICIsCgkJIiUwOCIgU0FMX1BSSVhVSU5UMzIgIiAlMDJYICUwOFggICAgICAgICAgIiwKCQkiJTA4IiBTQUxfUFJJWFVJTlQzMiAiICUwMlggJTA4WCAlMDhYICIgfTsKCXJUZXh0LkVyYXNlKCk7CglpZiggIUZldGNoKCkgKQoJCXJldHVybiBzYWxfRmFsc2U7CgojaWZkZWYgREJHX1RSQUNFX0JBU0lDCglTdHJpbmcgYVRyYWNlU3RyX1NUTU5UOwojZW5kaWYKCgkvLyBOZXcgbGluZT8KCWlmKCBlT3AgPT0gX1NUTU5UICYmIG5PcDEgIT0gbkxpbmUgKQoJewogICAgICAgIC8vIEZpbmQgbGluZQogICAgICAgIFN0cmluZyBhU291cmNlID0gckltZy5hT1VTb3VyY2U7CgkJbkxpbmUgPSBuT3AxOwoJCXNhbF91SW50MTYgbiA9IDA7CgkJc2FsX3VJbnQxNiBsID0gKHNhbF91SW50MTYpbkxpbmU7CgkJd2hpbGUoIC0tbCApIHsKCQkJbiA9IGFTb3VyY2UuU2VhcmNoQXNjaWkoICJcbiIsIG4gKTsKCQkJaWYoIG4gPT0gU1RSSU5HX05PVEZPVU5EICkgYnJlYWs7CgkJCWVsc2UgbisrOwoJCX0KCQkvLyBTaG93IHBvc2l0aW9uCgkJaWYoIG4gIT0gU1RSSU5HX05PVEZPVU5EICkKCQl7CgkJCXNhbF91SW50MTYgbjIgPSBhU291cmNlLlNlYXJjaEFzY2lpKCAiXG4iLCBuICk7CgkJCWlmKCBuMiA9PSBTVFJJTkdfTk9URk9VTkQgKSBuMiA9IGFTb3VyY2UuTGVuKCkgLSBuOwoJCQlTdHJpbmcgcyggYVNvdXJjZS5Db3B5KCBuLCBuMiAtIG4gKyAxICkgKTsKCQkJc2FsX0Jvb2wgYkRvbmU7CgkJCWRvIHsKCQkJCWJEb25lID0gc2FsX1RydWU7CgkJCQluID0gcy5TZWFyY2goICdccicgKTsKCQkJCWlmKCBuICE9IFNUUklOR19OT1RGT1VORCApIGJEb25lID0gc2FsX0ZhbHNlLCBzLkVyYXNlKCBuLCAxICk7CgkJCQluID0gcy5TZWFyY2goICdcbicgKTsKCQkJCWlmKCBuICE9IFNUUklOR19OT1RGT1VORCApIGJEb25lID0gc2FsX0ZhbHNlLCBzLkVyYXNlKCBuLCAxICk7CgkJCX0gd2hpbGUoICFiRG9uZSApOwovLyAgICAgICAgICBzbnByaW50ZiggY0J1Ziwgc2l6ZW9mKGNCdWYpLCBwTWFza1sgMCBdLCBuUEMgKTsKLy8JCQlyVGV4dCArPSBjQnVmOwoJCQlyVGV4dC5BcHBlbmRBc2NpaSggIjsgIiApOwoJCQlyVGV4dCArPSBzOwoJCQlyVGV4dC5BcHBlbmRBc2NpaSggX2NybGYoKSApOwoKI2lmZGVmIERCR19UUkFDRV9CQVNJQwoJCQlhVHJhY2VTdHJfU1RNTlQgPSBzOwojZW5kaWYKCQl9Cgl9CgoJLy8gTGFiZWw/Cgljb25zdCBjaGFyKiBwID0gIiI7CglpZiggY0xhYmVsc1sgblBDID4+IDMgXSAmICggMSA8PCAoIG5QQyAmIDcgKSApICkKCXsKCQkvLyBQdWJsaWM/CgkJQnl0ZVN0cmluZyBhQnl0ZU1ldGhOYW1lOwoJCWZvciggc2FsX3VJbnQxNiBpID0gMDsgaSA8IHBNb2QtPkdldE1ldGhvZHMoKS0+Q291bnQoKTsgaSsrICkKCQl7CgkJCVNiTWV0aG9kKiBwTWV0aCA9IFBUUl9DQVNUKFNiTWV0aG9kLHBNb2QtPkdldE1ldGhvZHMoKS0+R2V0KCBpICkpOwoJCQlpZiggcE1ldGggKQoJCQl7CgkJCQlhQnl0ZU1ldGhOYW1lID0gQnl0ZVN0cmluZyggcE1ldGgtPkdldE5hbWUoKSwgZ3NsX2dldFN5c3RlbVRleHRFbmNvZGluZygpICk7CgkJCQlpZiggcE1ldGgtPkdldElkKCkgPT0gblBDICkKCQkJCXsKCQkJCQlwID0gYUJ5dGVNZXRoTmFtZS5HZXRCdWZmZXIoKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJCWlmKCBwTWV0aC0+R2V0SWQoKSA+PSBuUEMgKQoJCQkJCWJyZWFrOwoJCQl9CgkJfQogICAgICAgIHNucHJpbnRmKCBjQnVmLCBzaXplb2YoY0J1ZiksIHBNYXNrWyAwIF0sIG5QQyApOwoJCXJUZXh0LkFwcGVuZEFzY2lpKCBjQnVmICk7CgkJaWYoIHAgJiYgKnAgKQoJCXsKCQkJclRleHQuQXBwZW5kQXNjaWkoIHAgKTsKCQl9CgkJZWxzZQoJCXsKICAgICAgICAgICAgLy8gZml4IHdhcm5pbmcgKG5vdyBlcnJvcikgZm9yICJMYmwlMDRsWCIgZm9ybWF0CiAgCQkJc25wcmludGYoIGNCdWYsIHNpemVvZihjQnVmKSwgIkxibCUwOCIgU0FMX1BSSVhVSU5UMzIsIG5QQyApOwoJCQlyVGV4dC5BcHBlbmRBc2NpaSggY0J1ZiApOwoJCX0KCQlyVGV4dCArPSAnOic7CgkJclRleHQuQXBwZW5kQXNjaWkoIF9jcmxmKCkgKTsKCX0KICAgIHNucHJpbnRmKCBjQnVmLCBzaXplb2YoY0J1ZiksIHBNYXNrWyBuUGFydHMgXSwgblBDLCAoc2FsX3VJbnQxNikgZU9wLCBuT3AxLCBuT3AyICk7CgoJU3RyaW5nIGFQQ29kZVN0cjsKCWFQQ29kZVN0ci5BcHBlbmRBc2NpaSggY0J1ZiApOwoJaW50IG4gPSBlT3A7CglpZiggZU9wID49IFNiT1AyX1NUQVJUICkKCQluIC09IFNiT1AyX1NUQVJUOwoJZWxzZSBpZiggZU9wID49IFNiT1AxX1NUQVJUICkKCQluIC09IFNiT1AxX1NUQVJUOwoJYVBDb2RlU3RyICs9ICdcdCc7CglhUENvZGVTdHIuQXBwZW5kQXNjaWkoIHBPcHNbIG5QYXJ0cy0xIF1bIG4gXSApOwoJYVBDb2RlU3RyICs9ICdcdCc7Cglzd2l0Y2goIG5QYXJ0cyApCgl7CgkJY2FzZSAyOiAodGhpcy0+KiggcE9wZXJhbmQyWyBuIF0gKSApKCBhUENvZGVTdHIgKTsgYnJlYWs7CgkJY2FzZSAzOiAodGhpcy0+KiggcE9wZXJhbmQzWyBuIF0gKSApKCBhUENvZGVTdHIgKTsgYnJlYWs7Cgl9CgoJclRleHQgKz0gYVBDb2RlU3RyOwoKI2lmZGVmIERCR19UUkFDRV9CQVNJQwoJZGJnX1JlZ2lzdGVyVHJhY2VUZXh0Rm9yUEMoIHBNb2QsIG5QQywgYVRyYWNlU3RyX1NUTU5ULCBhUENvZGVTdHIgKTsKI2VuZGlmCgoJcmV0dXJuIHNhbF9UcnVlOwp9CgovLyBSZWFkIGZyb20gU3RyaW5nUG9vbAp2b2lkIFNiaURpc2FzOjpTdHJPcCggU3RyaW5nJiByVGV4dCApCnsKCVN0cmluZyBhU3RyID0gckltZy5HZXRTdHJpbmcoIChzYWxfdUludDE2KW5PcDEgKTsKCUJ5dGVTdHJpbmcgYUJ5dGVTdHJpbmcoIGFTdHIsIFJUTF9URVhURU5DT0RJTkdfQVNDSUlfVVMgKTsKCWNvbnN0IGNoYXIqIHAgPSBhQnl0ZVN0cmluZy5HZXRCdWZmZXIoKTsKCWlmKCBwICkKCXsKCQlyVGV4dCArPSAnIic7CgkJclRleHQuQXBwZW5kQXNjaWkoIHAgKTsKCQlyVGV4dCArPSAnIic7Cgl9CgllbHNlCgl7CgkJclRleHQuQXBwZW5kQXNjaWkoICI/U3RyaW5nPyAiICk7CgkJclRleHQgKz0gKHNhbF91SW50MTYpbk9wMTsKCX0KfQoKdm9pZCBTYmlEaXNhczo6U3RyMk9wKCBTdHJpbmcmIHJUZXh0ICkKewoJU3RyT3AoIHJUZXh0ICk7CglyVGV4dCArPSAnLCc7CglTdHJpbmcgczsKCW5PcDEgPSBuT3AyOwoJU3RyT3AoIHMgKTsKCXJUZXh0ICs9IHM7Cn0KCi8vIEltbWVkaWF0ZSBPcGVyYW5kCnZvaWQgU2JpRGlzYXM6OkltbU9wKCBTdHJpbmcmIHJUZXh0ICkKewoJclRleHQgKz0gU3RyaW5nOjpDcmVhdGVGcm9tSW50MzIobk9wMSk7Cn0KCi8vIE9uR290byBPcGVyYW5kCnZvaWQgU2JpRGlzYXM6Ok9uT3AoIFN0cmluZyYgclRleHQgKQp7CglyVGV4dCArPSBTdHJpbmc6OkNyZWF0ZUZyb21JbnQzMihuT3AxICYgMHg3RkZGKTsKCWlmKCBuT3AxICYgMHg4MDAgKQoJCXJUZXh0LkFwcGVuZEFzY2lpKCAiXHQ7IEdvc3ViIiApOwp9CgovLyBMYWJlbAp2b2lkIFNiaURpc2FzOjpMYmxPcCggU3RyaW5nJiByVGV4dCApCnsKCWNoYXIgY0J1ZlsgMTAgXTsKICAgIHNucHJpbnRmKCBjQnVmLCBzaXplb2YoY0J1ZiksICJMYmwlMDQiIFNBTF9QUklYVUlOVDMyLCBuT3AxICk7CglyVGV4dC5BcHBlbmRBc2NpaSggY0J1ZiApOwp9CgovLyAwIG9yIExhYmVsCnZvaWQgU2JpRGlzYXM6OlJldHVybk9wKCBTdHJpbmcmIHJUZXh0ICkKewoJaWYoIG5PcDEgKQoJCUxibE9wKCByVGV4dCApOwp9CgovLyAwLCAxIG9yIExhYmVsCnZvaWQgU2JpRGlzYXM6OlJlc3VtZU9wKCBTdHJpbmcmIHJUZXh0ICkKewoJc3dpdGNoKCBuT3AxICkKCXsKCQljYXNlIDE6IHJUZXh0LkFwcGVuZEFzY2lpKCAiTkVYVCIgKTsgYnJlYWs7CgkJY2FzZSAyOiBMYmxPcCggclRleHQgKTsKCX0KfQoKLy8gcHJpbnQgUHJvbXB0Ci8vIHNhbF9GYWxzZS9UUlVFCnZvaWQgU2JpRGlzYXM6OlByb21wdE9wKCBTdHJpbmcmIHJUZXh0ICkKewoJaWYoIG5PcDEgKQoJCXJUZXh0LkFwcGVuZEFzY2lpKCAiXCI/IFwiIiApOwp9CgovLyAwIG9yIDEKdm9pZCBTYmlEaXNhczo6Q2xvc2VPcCggU3RyaW5nJiByVGV4dCApCnsKCXJUZXh0LkFwcGVuZEFzY2lpKCBuT3AxID8gIkNoYW5uZWwiIDogIkFsbCIgKTsKfQoKLy8gUHJpbnQgY2hhcmFjdGVyCnZvaWQgU2JpRGlzYXM6OkNoYXJPcCggU3RyaW5nJiByVGV4dCApCnsKCWNvbnN0IGNoYXIqIHAgPSBOVUxMOwoJc3dpdGNoKCBuT3AxICkKCXsKCQljYXNlICA3OiBwID0gIidcXGEnIjsgYnJlYWs7CgkJY2FzZSAgOTogcCA9ICInXFx0JyI7IGJyZWFrOwoJCWNhc2UgMTA6IHAgPSAiJ1xcbiciOyBicmVhazsKCQljYXNlIDEyOiBwID0gIidcXGYnIjsgYnJlYWs7CgkJY2FzZSAxMzogcCA9ICInXFxyJyI7IGJyZWFrOwoJfQoJaWYoIHAgKSByVGV4dC5BcHBlbmRBc2NpaSggcCApOwoJZWxzZSBpZiggbk9wMSA+PSAnICcgKQoJCXJUZXh0ICs9ICdcJycsCgkJclRleHQgKz0gKGNoYXIpIG5PcDEsCgkJclRleHQgKz0gJ1wnJzsKCWVsc2UKCQlyVGV4dC5BcHBlbmRBc2NpaSggImNoYXIgIiApLAoJCXJUZXh0ICs9IChzYWxfdUludDE2KW5PcDE7Cn0KCi8vIFByaW50IHZhcjogU3RyaW5nLUlEIGFuZCB0eXBlCnZvaWQgU2JpRGlzYXM6OlZhck9wKCBTdHJpbmcmIHJUZXh0ICkKewoJclRleHQgKz0gckltZy5HZXRTdHJpbmcoIChzYWxfdUludDE2KShuT3AxICYgMHg3RkZGKSApOwoJclRleHQuQXBwZW5kQXNjaWkoICJcdDsgIiApOwogICAgLy8gVGhlIHR5cGUKCXNhbF91SW50MzIgbiA9IG5PcDE7CgluT3AxID0gbk9wMjsKCVR5cGVPcCggclRleHQgKTsKCWlmKCBuICYgMHg4MDAwICkKCQlyVGV4dC5BcHBlbmRBc2NpaSggIiwgQXJncyIgKTsKfQoKLy8gRGVmaW5lIHZhcmlhYmxlOiBTdHJpbmctSUQgYW5kIHR5cGUKdm9pZCBTYmlEaXNhczo6VmFyRGVmT3AoIFN0cmluZyYgclRleHQgKQp7CglyVGV4dCArPSBySW1nLkdldFN0cmluZyggKHNhbF91SW50MTYpKG5PcDEgJiAweDdGRkYpICk7CglyVGV4dC5BcHBlbmRBc2NpaSggIlx0OyAiICk7CiAgICAvLyBUaGUgVHlwCgluT3AxID0gbk9wMjsKCVR5cGVPcCggclRleHQgKTsKfQoKLy8gUHJpbnQgdmFyaWFibGU6IE9mZnNldCBhbmQgVHlwCnZvaWQgU2JpRGlzYXM6Ok9mZk9wKCBTdHJpbmcmIHJUZXh0ICkKewoJclRleHQgKz0gU3RyaW5nOjpDcmVhdGVGcm9tSW50MzIoIG5PcDEgJiAweDdGRkYgKTsKCXJUZXh0LkFwcGVuZEFzY2lpKCAiXHQ7ICIgKTsKCS8vIFRoZSB0eXBlCglzYWxfdUludDMyIG4gPSBuT3AxOwoJbk9wMSA9IG5PcDI7CglUeXBlT3AoIHJUZXh0ICk7CglpZiggbiAmIDB4ODAwMCApCgkJclRleHQuQXBwZW5kQXNjaWkoICIsIEFyZ3MiICk7Cn0KCi8vIERhdGEgdHlwZQojaWZkZWYgSFA5MDAwIC8vIFRPRE86IHJlbW92ZSB0aGlzIQpzdGF0aWMgY2hhciogU2JpRGlzYXNfVHlwZU9wX3BUeXBlc1sxM10gPSB7CgkiRW1wdHkiLCJOdWxsIiwiSW50ZWdlciIsIkxvbmciLCJTaW5nbGUiLCJEb3VibGUiLAoJIkN1cnJlbmN5IiwiRGF0ZSIsIlN0cmluZyIsIk9iamVjdCIsIkVycm9yIiwiQm9vbGVhbiIsCgkiVmFyaWFudCIgfTsKI2RlZmluZSBwVHlwZXMgU2JpRGlzYXNfVHlwZU9wX3BUeXBlcwojZW5kaWYKdm9pZCBTYmlEaXNhczo6VHlwZU9wKCBTdHJpbmcmIHJUZXh0ICkKewoJLy8gQUIgMTkuMS45NjogVHlwIGthbm4gRmxhZyBm/HIgQllWQUwgZW50aGFsdGVuIChTdGVwQVJHVFlQKQoJaWYoIG5PcDEgJiAweDgwMDAgKQoJewoJCW5PcDEgJj0gMHg3RkZGOwkJLy8gRmxhZyB3ZWdmaWx0ZXJuCgkJclRleHQuQXBwZW5kQXNjaWkoICJCWVZBTCAiICk7Cgl9CglpZiggbk9wMSA8IDEzICkKCXsKI2lmbmRlZiBIUDkwMDAKCQlzdGF0aWMgY2hhciBwVHlwZXNbXVsxM10gPSB7CgkJCSJFbXB0eSIsIk51bGwiLCJJbnRlZ2VyIiwiTG9uZyIsIlNpbmdsZSIsIkRvdWJsZSIsCgkJCSJDdXJyZW5jeSIsIkRhdGUiLCJTdHJpbmciLCJPYmplY3QiLCJFcnJvciIsIkJvb2xlYW4iLAoJCQkiVmFyaWFudCIgfTsKI2VuZGlmCgkJclRleHQuQXBwZW5kQXNjaWkoIHBUeXBlc1sgbk9wMSBdICk7Cgl9CgllbHNlCgl7CgkJclRleHQuQXBwZW5kQXNjaWkoICJ0eXBlICIgKTsKCQlyVGV4dCArPSAoc2FsX3VJbnQxNiluT3AxOwoJfQp9CiNpZmRlZiBIUDkwMDAKI3VuZGVmIHBUeXBlcwojZW5kaWYKCi8vIHNhbF9UcnVlLUxhYmVsLCBjb25kaXRpb24gT3Bjb2RlCnZvaWQgU2JpRGlzYXM6OkNhc2VPcCggU3RyaW5nJiByVGV4dCApCnsKCUxibE9wKCByVGV4dCApOwoJclRleHQgKz0gJywnOwoJclRleHQuQXBwZW5kQXNjaWkoIHBPcDFbIG5PcDIgLSBTYnhFUSArIF9FUSBdICk7Cn0KCi8vIFJvdywgY29sdW1uCnZvaWQgU2JpRGlzYXM6OlN0bW50T3AoIFN0cmluZyYgclRleHQgKQp7CglyVGV4dCArPSBTdHJpbmc6OkNyZWF0ZUZyb21JbnQzMiggbk9wMSApOwoJclRleHQgKz0gJywnOwoJc2FsX3VJbnQzMiBuQ29sID0gbk9wMiAmIDB4RkY7CglzYWxfdUludDMyIG5Gb3IgPSBuT3AyIC8gMHgxMDA7CiAgICByVGV4dCArPSBTdHJpbmc6OkNyZWF0ZUZyb21JbnQzMiggbkNvbCApOwoJclRleHQuQXBwZW5kQXNjaWkoICIgKEZvci1MZXZlbDogIiApOwoJclRleHQgKz0gU3RyaW5nOjpDcmVhdGVGcm9tSW50MzIoIG5Gb3IgKTsKCXJUZXh0ICs9ICcpJzsKfQoKLy8gb3BlbiBtb2RlLCBmbGFncwp2b2lkIFNiaURpc2FzOjpTdHJtT3AoIFN0cmluZyYgclRleHQgKQp7CgljaGFyIGNCdWZbIDEwIF07CiAgICBzbnByaW50ZiggY0J1Ziwgc2l6ZW9mKGNCdWYpLCAiJTA0IiBTQUxfUFJJWFVJTlQzMiwgbk9wMSApOwoJclRleHQuQXBwZW5kQXNjaWkoIGNCdWYgKTsKCWlmKCBuT3AyICYgU0JTVFJNX0lOUFVUICkKCQlyVGV4dC5BcHBlbmRBc2NpaSggIiwgSW5wdXQiICk7CglpZiggbk9wMiAmIFNCU1RSTV9PVVRQVVQgKQoJCXJUZXh0LkFwcGVuZEFzY2lpKCAiLCBPdXRwdXQiICk7CglpZiggbk9wMiAmIFNCU1RSTV9BUFBFTkQgKQoJCXJUZXh0LkFwcGVuZEFzY2lpKCAiLCBBcHBlbmQiICk7CglpZiggbk9wMiAmIFNCU1RSTV9SQU5ET00gKQoJCXJUZXh0LkFwcGVuZEFzY2lpKCAiLCBSYW5kb20iICk7CglpZiggbk9wMiAmIFNCU1RSTV9CSU5BUlkgKQoJCXJUZXh0LkFwcGVuZEFzY2lpKCAiLCBCaW5hcnkiICk7Cn0K