LyoKICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCiAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CiAqIEplZiBQb3NrYW56ZXIgYW5kIENyYWlnIExlcmVzIG9mIHRoZSBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5LgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgogKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCiAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgogKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICoKICogTW9kaWZpZWQgZm9yIExpbnV4LCBNb24gTWFyICA4IDE4OjE2OjI0IDE5OTMsIGZhaXRoQGNzLnVuYy5lZHUKICogV2VkIEp1biAyMiAyMTo0MTo1NiAxOTk0LCBmYWl0aEBjcy51bmMuZWR1OgogKiAgICAgIEFkZGVkIGZpeCBmcm9tIE1pa2UgR3J1cGVuaG9mZiAoa2FzaG1pckB1bWlhY3MudW1kLmVkdSkKICogTW9uIEp1bCAgMSAxNzowMTozOSBNRVQgRFNUIDE5OTYsIGphbmxAbWF0aC51aW8ubm86CiAqICAgICAgLSBBZGRlZCBmaXggZnJvbSBEYXZpZC5DaGFwZWxsQG1haWwudHJpbmNvbGwuZWR1IGVuYWJlbGluZyBkYWVtb25zCiAqCSAgdG8gdXNlIHdyaXRlLgogKiAgICAgIC0gQU5TSWVkIGl0IHNpbmNlIEkgd2FzIHdvcmtpbmcgb24gaXQgYW55d2F5LgogKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNabZraWV3aWN6IDxtaXNpZWtAcGxkLk9SRy5QTD4KICogLSBhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAogKgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDx1dG1wLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHB3ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3lzL2ZpbGUuaD4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDxwYXRocy5oPgojaW5jbHVkZSAicGF0aG5hbWVzLmgiCiNpbmNsdWRlICJjYXJlZnVscHV0Yy5oIgojaW5jbHVkZSAibmxzLmgiCiAKdm9pZCBzZWFyY2hfdXRtcChjaGFyICosIGNoYXIgKiwgY2hhciAqLCB1aWRfdCk7CnZvaWQgZG9fd3JpdGUoY2hhciAqLCBjaGFyICosIHVpZF90KTsKdm9pZCB3cl9mcHV0cyhjaGFyICopOwpzdGF0aWMgdm9pZCBkb25lKGludCk7CmludCB0ZXJtX2NoayhjaGFyICosIGludCAqLCB0aW1lX3QgKiwgaW50KTsKaW50IHV0bXBfY2hrKGNoYXIgKiwgY2hhciAqKTsKCnN0YXRpYyBnaWRfdCBteWVnaWQ7CgppbnQKbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCXRpbWVfdCBhdGltZTsKCXVpZF90IG15dWlkOwoJaW50IG1zZ3NvaywgbXl0dHlmZDsKCWNoYXIgdHR5W01BWFBBVEhMRU5dLCAqbXl0dHk7CgoJc2V0bG9jYWxlKExDX0FMTCwgIiIpOwoJYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKCXRleHRkb21haW4oUEFDS0FHRSk7CgoJbXllZ2lkID0gZ2V0ZWdpZCgpOwoKCS8qIGNoZWNrIHRoYXQgc2VuZGVyIGhhcyB3cml0ZSBlbmFibGVkICovCglpZiAoaXNhdHR5KGZpbGVubyhzdGRpbikpKQoJCW15dHR5ZmQgPSBmaWxlbm8oc3RkaW4pOwoJZWxzZSBpZiAoaXNhdHR5KGZpbGVubyhzdGRvdXQpKSkKCQlteXR0eWZkID0gZmlsZW5vKHN0ZG91dCk7CgllbHNlIGlmIChpc2F0dHkoZmlsZW5vKHN0ZGVycikpKQoJCW15dHR5ZmQgPSBmaWxlbm8oc3RkZXJyKTsKCWVsc2UgewoJICAJbXl0dHlmZCA9IC0xOwoJfQoJaWYgKG15dHR5ZmQgIT0gLTEpIHsKCSAgaWYgKCEobXl0dHkgPSB0dHluYW1lKG15dHR5ZmQpKSkgewoJCSh2b2lkKWZwcmludGYoc3RkZXJyLCBfKCJ3cml0ZTogY2FuJ3QgZmluZCB5b3VyIHR0eSdzIG5hbWVcbiIpKTsKCQlleGl0KDEpOwoJICB9CgkgIC8qIFdlIG1heSBoYXZlIC9kZXYvdHR5TiBidXQgYWxzbyAvZGV2L3B0cy94eC4KCSAgICAgQmVsb3csIHRlcm1fY2hrKCkgd2lsbCBwdXQgIi9kZXYvIiBpbiBmcm9udCwgc28gcmVtb3ZlIHRoYXQgcGFydC4gKi8KCSAgaWYgKCFzdHJuY21wKG15dHR5LCAiL2Rldi8iLCA1KSkKCQlteXR0eSArPSA1OwoJICBpZiAodGVybV9jaGsobXl0dHksICZtc2dzb2ssICZhdGltZSwgMSkpCgkJZXhpdCgxKTsKCSAgaWYgKCFtc2dzb2spIHsKCQkodm9pZClmcHJpbnRmKHN0ZGVyciwKCQkgICAgXygid3JpdGU6IHlvdSBoYXZlIHdyaXRlIHBlcm1pc3Npb24gdHVybmVkIG9mZi5cbiIpKTsKCQlleGl0KDEpOwoJICB9CgkKCX0gZWxzZSB7CgkgICAgbXl0dHkgPSAiPG5vIHR0eT4iOwoJfQoKCW15dWlkID0gZ2V0dWlkKCk7CgoJLyogY2hlY2sgYXJncyAqLwoJc3dpdGNoIChhcmdjKSB7CgljYXNlIDI6CgkJc2VhcmNoX3V0bXAoYXJndlsxXSwgdHR5LCBteXR0eSwgbXl1aWQpOwoJCWRvX3dyaXRlKHR0eSwgbXl0dHksIG15dWlkKTsKCQlicmVhazsKCWNhc2UgMzoKCQlpZiAoIXN0cm5jbXAoYXJndlsyXSwgIi9kZXYvIiwgNSkpCgkJCWFyZ3ZbMl0gKz0gNTsKCQlpZiAodXRtcF9jaGsoYXJndlsxXSwgYXJndlsyXSkpIHsKCQkJKHZvaWQpZnByaW50ZihzdGRlcnIsCgkJCSAgICBfKCJ3cml0ZTogJXMgaXMgbm90IGxvZ2dlZCBpbiBvbiAlcy5cbiIpLAoJCQkgICAgYXJndlsxXSwgYXJndlsyXSk7CgkJCWV4aXQoMSk7CgkJfQoJCWlmICh0ZXJtX2Noayhhcmd2WzJdLCAmbXNnc29rLCAmYXRpbWUsIDEpKQoJCQlleGl0KDEpOwoJCWlmIChteXVpZCAmJiAhbXNnc29rKSB7CgkJCSh2b2lkKWZwcmludGYoc3RkZXJyLAoJCQkgICAgXygid3JpdGU6ICVzIGhhcyBtZXNzYWdlcyBkaXNhYmxlZCBvbiAlc1xuIiksCgkJCSAgICBhcmd2WzFdLCBhcmd2WzJdKTsKCQkJZXhpdCgxKTsKCQl9CgkJZG9fd3JpdGUoYXJndlsyXSwgbXl0dHksIG15dWlkKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJKHZvaWQpZnByaW50ZihzdGRlcnIsIF8oInVzYWdlOiB3cml0ZSB1c2VyIFt0dHldXG4iKSk7CgkJZXhpdCgxKTsKCX0KCWRvbmUoMCk7CgkvKiBOT1RSRUFDSEVEICovCglyZXR1cm4gMDsKfQoKCi8qCiAqIHV0bXBfY2hrIC0gY2hlY2tzIHRoYXQgdGhlIGdpdmVuIHVzZXIgaXMgYWN0dWFsbHkgbG9nZ2VkIGluIG9uCiAqICAgICB0aGUgZ2l2ZW4gdHR5CiAqLwppbnQgdXRtcF9jaGsoY2hhciAqdXNlciwgY2hhciAqdHR5KQoKewoJc3RydWN0IHV0bXAgdTsKCXN0cnVjdCB1dG1wICp1cHRyOwoJaW50IHJlcyA9IDE7CgoJdXRtcG5hbWUoX1BBVEhfVVRNUCk7CglzZXR1dGVudCgpOwoKCXdoaWxlICgodXB0ciA9IGdldHV0ZW50KCkpKSB7CgkJbWVtY3B5KCZ1LCB1cHRyLCBzaXplb2YodSkpOwoJCWlmIChzdHJuY21wKHVzZXIsIHUudXRfbmFtZSwgc2l6ZW9mKHUudXRfbmFtZSkpID09IDAgJiYKCQkgICAgc3RybmNtcCh0dHksIHUudXRfbGluZSwgc2l6ZW9mKHUudXRfbGluZSkpID09IDApIHsKCQkJcmVzID0gMDsKCQkJYnJlYWs7CgkJfQoJfQoKCWVuZHV0ZW50KCk7CglyZXR1cm4ocmVzKTsKfQoKLyoKICogc2VhcmNoX3V0bXAgLSBzZWFyY2ggdXRtcCBmb3IgdGhlICJiZXN0IiB0ZXJtaW5hbCB0byB3cml0ZSB0bwogKgogKiBJZ25vcmVzIHRlcm1pbmFscyB3aXRoIG1lc3NhZ2VzIGRpc2FibGVkLCBhbmQgb2YgdGhlIHJlc3QsIHJldHVybnMKICogdGhlIG9uZSB3aXRoIHRoZSBtb3N0IHJlY2VudCBhY2Nlc3MgdGltZS4gIFJldHVybnMgYXMgdmFsdWUgdGhlIG51bWJlcgogKiBvZiB0aGUgdXNlcidzIHRlcm1pbmFscyB3aXRoIG1lc3NhZ2VzIGVuYWJsZWQsIG9yIC0xIGlmIHRoZSB1c2VyIGlzCiAqIG5vdCBsb2dnZWQgaW4gYXQgYWxsLgogKgogKiBTcGVjaWFsIGNhc2UgZm9yIHdyaXRpbmcgdG8geW91cnNlbGYgLSBpZ25vcmUgdGhlIHRlcm1pbmFsIHlvdSdyZQogKiB3cml0aW5nIGZyb20sIHVubGVzcyB0aGF0J3MgdGhlIG9ubHkgdGVybWluYWwgd2l0aCBtZXNzYWdlcyBlbmFibGVkLgogKi8Kdm9pZCBzZWFyY2hfdXRtcChjaGFyICp1c2VyLCBjaGFyICp0dHksIGNoYXIgKm15dHR5LCB1aWRfdCBteXVpZCkKCnsKCXN0cnVjdCB1dG1wIHU7CglzdHJ1Y3QgdXRtcCAqdXB0cjsKCXRpbWVfdCBiZXN0YXRpbWUsIGF0aW1lOwoJaW50IG5sb2dnZWR0dHlzLCBudHR5cywgbXNnc29rLCB1c2VyX2lzX21lOwoJY2hhciBhdHR5W3NpemVvZih1LnV0X2xpbmUpICsgMV07CgoJdXRtcG5hbWUoX1BBVEhfVVRNUCk7CglzZXR1dGVudCgpOwoKCW5sb2dnZWR0dHlzID0gbnR0eXMgPSAwOwoJYmVzdGF0aW1lID0gMDsKCXVzZXJfaXNfbWUgPSAwOwoJd2hpbGUgKCh1cHRyID0gZ2V0dXRlbnQoKSkpIHsKCQltZW1jcHkoJnUsIHVwdHIsIHNpemVvZih1KSk7CgkJaWYgKHN0cm5jbXAodXNlciwgdS51dF9uYW1lLCBzaXplb2YodS51dF9uYW1lKSkgPT0gMCkgewoJCQkrK25sb2dnZWR0dHlzOwoJCQkodm9pZClzdHJuY3B5KGF0dHksIHUudXRfbGluZSwgc2l6ZW9mKHUudXRfbGluZSkpOwoJCQlhdHR5W3NpemVvZih1LnV0X2xpbmUpXSA9ICdcMCc7CgkJCWlmICh0ZXJtX2NoayhhdHR5LCAmbXNnc29rLCAmYXRpbWUsIDApKQoJCQkJY29udGludWU7CS8qIGJhZCB0ZXJtPyBza2lwICovCgkJCWlmIChteXVpZCAmJiAhbXNnc29rKQoJCQkJY29udGludWU7CS8qIHNraXAgdHR5cyB3aXRoIG1zZ3Mgb2ZmICovCgkJCWlmIChzdHJjbXAoYXR0eSwgbXl0dHkpID09IDApIHsKCQkJCXVzZXJfaXNfbWUgPSAxOwoJCQkJY29udGludWU7CS8qIGRvbid0IHdyaXRlIHRvIHlvdXJzZWxmICovCgkJCX0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUudXRfdHlwZSAhPSBVU0VSX1BST0NFU1MpCgkJCSAgICAgICAgY29udGludWU7ICAgICAgIC8qIGl0J3Mgbm90IGEgdmFsaWQgZW50cnkgKi8KCQkJKytudHR5czsKCQkJaWYgKGF0aW1lID4gYmVzdGF0aW1lKSB7CgkJCQliZXN0YXRpbWUgPSBhdGltZTsKCQkJCSh2b2lkKXN0cmNweSh0dHksIGF0dHkpOwoJCQl9CgkJfQoJfQoKCWVuZHV0ZW50KCk7CglpZiAobmxvZ2dlZHR0eXMgPT0gMCkgewoJCSh2b2lkKWZwcmludGYoc3RkZXJyLCBfKCJ3cml0ZTogJXMgaXMgbm90IGxvZ2dlZCBpblxuIiksIHVzZXIpOwoJCWV4aXQoMSk7Cgl9CglpZiAobnR0eXMgPT0gMCkgewoJCWlmICh1c2VyX2lzX21lKSB7CQkvKiBvaywgc28gd3JpdGUgdG8geW91cnNlbGYhICovCgkJCSh2b2lkKXN0cmNweSh0dHksIG15dHR5KTsKCQkJcmV0dXJuOwoJCX0KCQkodm9pZClmcHJpbnRmKHN0ZGVyciwKCQkgICAgXygid3JpdGU6ICVzIGhhcyBtZXNzYWdlcyBkaXNhYmxlZFxuIiksIHVzZXIpOwoJCWV4aXQoMSk7Cgl9IGVsc2UgaWYgKG50dHlzID4gMSkgewoJCSh2b2lkKWZwcmludGYoc3RkZXJyLAoJCSAgICBfKCJ3cml0ZTogJXMgaXMgbG9nZ2VkIGluIG1vcmUgdGhhbiBvbmNlOyB3cml0aW5nIHRvICVzXG4iKSwKCQkgICAgdXNlciwgdHR5KTsKCX0KfQoKLyoKICogdGVybV9jaGsgLSBjaGVjayB0aGF0IGEgdGVybWluYWwgZXhpc3RzLCBhbmQgZ2V0IHRoZSBtZXNzYWdlIGJpdAogKiAgICAgYW5kIHRoZSBhY2Nlc3MgdGltZQogKi8KaW50IHRlcm1fY2hrKGNoYXIgKnR0eSwgaW50ICptc2dzb2tQLCB0aW1lX3QgKmF0aW1lUCwgaW50IHNob3dlcnJvcikKCnsKCXN0cnVjdCBzdGF0IHM7CgljaGFyIHBhdGhbTUFYUEFUSExFTl07CgoJaWYgKHN0cmxlbih0dHkpICsgNiA+IHNpemVvZihwYXRoKSkKCQlyZXR1cm4oMSk7Cgkodm9pZClzcHJpbnRmKHBhdGgsICIvZGV2LyVzIiwgdHR5KTsKCWlmIChzdGF0KHBhdGgsICZzKSA8IDApIHsKCQlpZiAoc2hvd2Vycm9yKQoJCQkodm9pZClmcHJpbnRmKHN0ZGVyciwKCQkJICAgICJ3cml0ZTogJXM6ICVzXG4iLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOwoJCXJldHVybigxKTsKCX0KCgkvKiBncm91cCB3cml0ZSBiaXQgYW5kIGdyb3VwIG93bmVyc2hpcCAqLwoJKm1zZ3Nva1AgPSAocy5zdF9tb2RlICYgKFNfSVdSSVRFID4+IDMpKSAmJiBteWVnaWQgPT0gcy5zdF9naWQ7CgkqYXRpbWVQID0gcy5zdF9hdGltZTsKCXJldHVybigwKTsKfQoKLyoKICogZG9fd3JpdGUgLSBhY3R1YWxseSBtYWtlIHRoZSBjb25uZWN0aW9uCiAqLwp2b2lkIGRvX3dyaXRlKGNoYXIgKnR0eSwgY2hhciAqbXl0dHksIHVpZF90IG15dWlkKSB7CgljaGFyICpsb2dpbiwgKnB3dWlkLCAqbm93czsKCXN0cnVjdCBwYXNzd2QgKnB3ZDsKCXRpbWVfdCBub3c7CgljaGFyIHBhdGhbTUFYUEFUSExFTl0sIGhvc3RbTUFYSE9TVE5BTUVMRU5dLCBsaW5lWzUxMl07CgoJLyogRGV0ZXJtaW5lIG91ciBsb2dpbiBuYW1lKHMpIGJlZm9yZSB0aGUgd2UgcmVvcGVuKCkgc3Rkb3V0ICovCglpZiAoKHB3ZCA9IGdldHB3dWlkKG15dWlkKSkgIT0gTlVMTCkKCQlwd3VpZCA9IHB3ZC0+cHdfbmFtZTsKCWVsc2UKCQlwd3VpZCA9ICI/Pz8iOwoJaWYgKChsb2dpbiA9IGdldGxvZ2luKCkpID09IE5VTEwpCgkJbG9naW4gPSBwd3VpZDsKCglpZiAoc3RybGVuKHR0eSkgKyA2ID4gc2l6ZW9mKHBhdGgpKQoJCWV4aXQoMSk7Cgkodm9pZClzcHJpbnRmKHBhdGgsICIvZGV2LyVzIiwgdHR5KTsKCWlmICgoZnJlb3BlbihwYXRoLCAidyIsIHN0ZG91dCkpID09IE5VTEwpIHsKCQkodm9pZClmcHJpbnRmKHN0ZGVyciwgIndyaXRlOiAlczogJXNcbiIsCgkJCSAgICAgIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CgkJZXhpdCgxKTsKCX0KCgkodm9pZClzaWduYWwoU0lHSU5ULCBkb25lKTsKCSh2b2lkKXNpZ25hbChTSUdIVVAsIGRvbmUpOwoKCS8qIHByaW50IGdyZWV0aW5nICovCglpZiAoZ2V0aG9zdG5hbWUoaG9zdCwgc2l6ZW9mKGhvc3QpKSA8IDApCgkJKHZvaWQpc3RyY3B5KGhvc3QsICI/Pz8iKTsKCW5vdyA9IHRpbWUoKHRpbWVfdCAqKU5VTEwpOwoJbm93cyA9IGN0aW1lKCZub3cpOwoJbm93c1sxNl0gPSAnXDAnOwoJcHJpbnRmKCJcclxuXDAwN1wwMDdcMDA3Iik7CglpZiAoc3RyY21wKGxvZ2luLCBwd3VpZCkpCgkJKHZvaWQpcHJpbnRmKF8oIk1lc3NhZ2UgZnJvbSAlc0AlcyAoYXMgJXMpIG9uICVzIGF0ICVzIC4uLiIpLAoJCQkgICAgIGxvZ2luLCBob3N0LCBwd3VpZCwgbXl0dHksIG5vd3MgKyAxMSk7CgllbHNlCgkJKHZvaWQpcHJpbnRmKF8oIk1lc3NhZ2UgZnJvbSAlc0AlcyBvbiAlcyBhdCAlcyAuLi4iKSwKCQkJICAgICBsb2dpbiwgaG9zdCwgbXl0dHksIG5vd3MgKyAxMSk7CglwcmludGYoIlxyXG4iKTsKCgl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBzdGRpbikgIT0gTlVMTCkKCQl3cl9mcHV0cyhsaW5lKTsKfQoKLyoKICogZG9uZSAtIGNsZWFudXAgYW5kIGV4aXQKICovCnN0YXRpYyB2b2lkCmRvbmUoaW50IGR1bW15KSB7Cgkodm9pZClwcmludGYoIkVPRlxyXG4iKTsKCWV4aXQoMCk7Cn0KCi8qCiAqIHdyX2ZwdXRzIC0gbGlrZSBmcHV0cygpLCBidXQgbWFrZXMgY29udHJvbCBjaGFyYWN0ZXJzIHZpc2libGUgYW5kCiAqICAgICB0dXJucyBcbiBpbnRvIFxyXG4uCiAqLwp2b2lkCndyX2ZwdXRzKGNoYXIgKnMpIHsKCWNoYXIgYzsKCiNkZWZpbmUJUFVUQyhjKQlpZiAoY2FyZWZ1bHB1dGMoYyxzdGRvdXQpID09IEVPRikgZ290byBlcnI7CgoJd2hpbGUoKnMpIHsKCQljID0gKnMrKzsKCQlpZiAoYyA9PSAnXG4nKQoJCQlQVVRDKCdccicpOwoJCVBVVEMoYyk7Cgl9CglyZXR1cm47CgplcnI6CglmcHJpbnRmKHN0ZGVyciwgIndyaXRlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKCWV4aXQoMSk7CiN1bmRlZiBQVVRDCn0K