LyoKICogQ29weXJpZ2h0IChjKSAxOTgwLCAxOTkzCiAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgogKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCiAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgogKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICovCgovKgogKiBtb2RpZmllZCBieSBLYXJzIGRlIEpvbmcgPGpvbmdrQGNzLnV0d2VudGUubmw+CiAqCXRvIHVzZSB0ZXJtaW5mbyBpbnN0ZWFkIG9mIHRlcm1jYXAuCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgogKiAJYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICogMTk5OS0wOS0xOSBCcnVubyBIYWlibGUgPGhhaWJsZUBjbGlzcC5jb25zLm9yZz4KICogCW1vZGlmaWVkIHRvIHdvcmsgY29ycmVjdGx5IGluIG11bHRpLWJ5dGUgbG9jYWxlcwogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CQkvKiBmb3IgZ2V0b3B0KCksIGlzYXR0eSgpICovCiNpbmNsdWRlIDxzdHJpbmcuaD4JCS8qIGZvciBtZW1zZXQoKSwgc3RyY3B5KCkgKi8KI2luY2x1ZGUgPHRlcm0uaD4JCS8qIGZvciBzZXR1cHRlcm0oKSAqLwojaW5jbHVkZSA8c3RkbGliLmg+CQkvKiBmb3IgZ2V0ZW52KCkgKi8KI2luY2x1ZGUgPGxpbWl0cy5oPgkJLyogZm9yIElOVF9NQVggKi8KI2luY2x1ZGUgIm5scy5oIgoKI2luY2x1ZGUgIndpZGVjaGFyLmgiCgojaWZkZWYgSEFWRV9XSURFQ0hBUgpzdGF0aWMgaW50IHB1dDF3YyhpbnQgYykgLyogT3V0cHV0IGFuIEFTQ0lJIGNoYXJhY3RlciBhcyBhIHdpZGUgY2hhcmFjdGVyICovCnsKICBpZiAocHV0d2NoYXIoYykgPT0gV0VPRikKICAgIHJldHVybiBFT0Y7CiAgZWxzZQogICAgcmV0dXJuIGM7Cn0KI2RlZmluZSBwdXR3cChzKSB0cHV0cyhzLDEscHV0MXdjKQojZWxzZQojZGVmaW5lIHB1dHdwKHMpIHB1dHAocykKI2VuZGlmCgp2b2lkIGZpbHRlcihGSUxFICpmKTsKdm9pZCBmbHVzaGxuKHZvaWQpOwp2b2lkIG92ZXJzdHJpa2Uodm9pZCk7CnZvaWQgaWF0dHIodm9pZCk7CnZvaWQgaW5pdGJ1Zih2b2lkKTsKdm9pZCBmd2Qodm9pZCk7CnZvaWQgcmV2ZXJzZSh2b2lkKTsKdm9pZCBpbml0aW5mbyh2b2lkKTsKdm9pZCBvdXRjKHdpbnRfdCBjLCBpbnQgd2lkdGgpOwp2b2lkIHNldG1vZGUoaW50IG5ld21vZGUpOwpzdGF0aWMgdm9pZCBzZXRjb2woaW50IG5ld2NvbCk7CnN0YXRpYyB2b2lkIG5lZWRjb2woaW50IGNvbCk7CgojZGVmaW5lCUlFU0MJJ1wwMzMnCiNkZWZpbmUJU08JJ1wwMTYnCiNkZWZpbmUJU0kJJ1wwMTcnCiNkZWZpbmUJSEZXRAknOScKI2RlZmluZQlIUkVWCSc4JwojZGVmaW5lCUZSRVYJJzcnCgojZGVmaW5lCU5PUk1BTAkwMDAKI2RlZmluZQlBTFRTRVQJMDAxCS8qIFJldmVyc2UgKi8KI2RlZmluZQlTVVBFUlNDCTAwMgkvKiBEaW0gKi8KI2RlZmluZQlTVUJTQwkwMDQJLyogRGltIHwgVWwgKi8KI2RlZmluZQlVTkRFUkwJMDEwCS8qIFVsICovCiNkZWZpbmUJQk9MRAkwMjAJLyogQm9sZCAqLwojZGVmaW5lCUlOSVRCVUYJNTEyCgppbnQJbXVzdF91c2VfdWMsIG11c3Rfb3ZlcnN0cmlrZTsKY2hhcgkqQ1VSU19VUCwgKkNVUlNfUklHSFQsICpDVVJTX0xFRlQsCgkqRU5URVJfU1RBTkRPVVQsICpFWElUX1NUQU5ET1VULCAqRU5URVJfVU5ERVJMSU5FLCAqRVhJVF9VTkRFUkxJTkUsCgkqRU5URVJfRElNLCAqRU5URVJfQk9MRCwgKkVOVEVSX1JFVkVSU0UsICpVTkRFUl9DSEFSLCAqRVhJVF9BVFRSSUJVVEVTOwoKc3RydWN0CUNIQVIJewoJY2hhcgljX21vZGU7Cgl3Y2hhcl90CWNfY2hhcjsKCWludAljX3dpZHRoOwp9IDsKCnN0cnVjdAlDSEFSCSpvYnVmOwppbnQJb2J1ZmxlbjsJCS8qIFRyYWNrcyBudW1iZXIgb2YgZWxlbWVudHMgaW4gb2J1Zi4gKi8KaW50CWNvbCwgbWF4Y29sOwppbnQJbW9kZTsKaW50CWhhbGZwb3M7CmludAl1cGxuOwppbnQJaWZsYWc7CgojZGVmaW5lCVBSSU5UKHMpCWlmIChzID09IE5VTEwpIC8qIHZvaWQgKi87IGVsc2UgcHV0d3AocykKCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJaW50IGMsIHJldDsKCWNoYXIgKnRlcm10eXBlOwoJRklMRSAqZjsKCglzZXRsb2NhbGUoTENfQUxMLCAiIik7CgliaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOwoJdGV4dGRvbWFpbihQQUNLQUdFKTsKCgl0ZXJtdHlwZSA9IGdldGVudigiVEVSTSIpOwoJaWYgKHRlcm10eXBlID09IE5VTEwgfHwgKGFyZ3ZbMF1bMF0gPT0gJ2MnICYmICFpc2F0dHkoMSkpKQoJCXRlcm10eXBlID0gImxwciI7Cgl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgIml0OlQ6IikpICE9IC0xKQoJCXN3aXRjaChjKSB7CgoJCWNhc2UgJ3QnOgoJCWNhc2UgJ1QnOiAvKiBmb3IgbnJvZmYgY29tcGF0aWJpbGl0eSAqLwoJCQkJdGVybXR5cGUgPSBvcHRhcmc7CgkJCWJyZWFrOwoJCWNhc2UgJ2knOgoJCQlpZmxhZyA9IDE7CgkJCWJyZWFrOwoKCQlkZWZhdWx0OgoJCQlmcHJpbnRmKHN0ZGVyciwKCQkJCV8oInVzYWdlOiAlcyBbIC1pIF0gWyAtdFRlcm0gXSBmaWxlLi4uXG4iKSwKCQkJCWFyZ3ZbMF0pOwoJCQlleGl0KDEpOwoJCX0KCXNldHVwdGVybSh0ZXJtdHlwZSwgMSwgJnJldCk7Cglzd2l0Y2gocmV0KSB7CgoJY2FzZSAxOgoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJZnByaW50ZihzdGRlcnIsXygidHJvdWJsZSByZWFkaW5nIHRlcm1pbmZvIikpOwoJCS8qIGZhbGwgdGhyb3VnaCB0byAuLi4gKi8KCgljYXNlIDA6CgkJLyogTm8gc3VjaCB0ZXJtaW5hbCB0eXBlIC0gYXNzdW1lIGR1bWIgKi8KCSAgICAgICAgc2V0dXB0ZXJtKCJkdW1iIiwgMSwgKGludCAqKTApOwoJCWJyZWFrOwoJfQoJaW5pdGluZm8oKTsKCWlmICggICAgKHRpZ2V0ZmxhZygib3MiKSAmJiBFTlRFUl9CT0xEPT1OVUxMICkgfHwKCQkodGlnZXRmbGFnKCJ1bCIpICYmIEVOVEVSX1VOREVSTElORT09TlVMTCAmJiBVTkRFUl9DSEFSPT1OVUxMKSkKCQkJbXVzdF9vdmVyc3RyaWtlID0gMTsKCWluaXRidWYoKTsKCWlmIChvcHRpbmQgPT0gYXJnYykKCQlmaWx0ZXIoc3RkaW4pOwoJZWxzZSBmb3IgKDsgb3B0aW5kPGFyZ2M7IG9wdGluZCsrKSB7CgkJZiA9IGZvcGVuKGFyZ3Zbb3B0aW5kXSwiciIpOwoJCWlmIChmID09IE5VTEwpIHsKCQkJcGVycm9yKGFyZ3Zbb3B0aW5kXSk7CgkJCWV4aXQoMSk7CgkJfSBlbHNlCgkJCWZpbHRlcihmKTsKCX0KCWlmIChmZXJyb3Ioc3Rkb3V0KSB8fCBmY2xvc2Uoc3Rkb3V0KSkKCQlyZXR1cm4gMTsKCXJldHVybiAwOwp9Cgp2b2lkIGZpbHRlcihGSUxFICpmKQp7Cgl3aW50X3QgYzsKCWludCBpLCB3OwoKCXdoaWxlICgoYyA9IGdldHdjKGYpKSAhPSBXRU9GKSBzd2l0Y2goYykgewoKCWNhc2UgJ1xiJzoKCQlzZXRjb2woY29sIC0gMSk7CgkJY29udGludWU7CgoJY2FzZSAnXHQnOgoJCXNldGNvbCgoY29sKzgpICYgfjA3KTsKCQljb250aW51ZTsKCgljYXNlICdccic6CgkJc2V0Y29sKDApOwoJCWNvbnRpbnVlOwoKCWNhc2UgU086CgkJbW9kZSB8PSBBTFRTRVQ7CgkJY29udGludWU7CgoJY2FzZSBTSToKCQltb2RlICY9IH5BTFRTRVQ7CgkJY29udGludWU7CgoJY2FzZSBJRVNDOgoJCXN3aXRjaCAoYyA9IGdldHdjKGYpKSB7CgoJCWNhc2UgSFJFVjoKCQkJaWYgKGhhbGZwb3MgPT0gMCkgewoJCQkJbW9kZSB8PSBTVVBFUlNDOwoJCQkJaGFsZnBvcy0tOwoJCQl9IGVsc2UgaWYgKGhhbGZwb3MgPiAwKSB7CgkJCQltb2RlICY9IH5TVUJTQzsKCQkJCWhhbGZwb3MtLTsKCQkJfSBlbHNlIHsKCQkJCWhhbGZwb3MgPSAwOwoJCQkJcmV2ZXJzZSgpOwoJCQl9CgkJCWNvbnRpbnVlOwoKCQljYXNlIEhGV0Q6CgkJCWlmIChoYWxmcG9zID09IDApIHsKCQkJCW1vZGUgfD0gU1VCU0M7CgkJCQloYWxmcG9zKys7CgkJCX0gZWxzZSBpZiAoaGFsZnBvcyA8IDApIHsKCQkJCW1vZGUgJj0gflNVUEVSU0M7CgkJCQloYWxmcG9zKys7CgkJCX0gZWxzZSB7CgkJCQloYWxmcG9zID0gMDsKCQkJCWZ3ZCgpOwoJCQl9CgkJCWNvbnRpbnVlOwoKCQljYXNlIEZSRVY6CgkJCXJldmVyc2UoKTsKCQkJY29udGludWU7CgoJCWRlZmF1bHQ6CgkJCWZwcmludGYoc3RkZXJyLAoJCQkJXygiVW5rbm93biBlc2NhcGUgc2VxdWVuY2UgaW4gaW5wdXQ6ICVvLCAlb1xuIiksCgkJCQlJRVNDLCBjKTsKCQkJZXhpdCgxKTsKCQl9CgkJY29udGludWU7CgoJY2FzZSAnXyc6CgkJaWYgKG9idWZbY29sXS5jX2NoYXIgfHwgb2J1Zltjb2xdLmNfd2lkdGggPCAwKSB7CgkJCXdoaWxlKGNvbCA+IDAgJiYgb2J1Zltjb2xdLmNfd2lkdGggPCAwKQoJCQkJY29sLS07CgkJCXcgPSBvYnVmW2NvbF0uY193aWR0aDsKCQkJZm9yIChpID0gMDsgaSA8IHc7IGkrKykKCQkJCW9idWZbY29sKytdLmNfbW9kZSB8PSBVTkRFUkwgfCBtb2RlOwoJCQlzZXRjb2woY29sKTsKCQkJY29udGludWU7CgkJfQoJCW9idWZbY29sXS5jX2NoYXIgPSAnXyc7CgkJb2J1Zltjb2xdLmNfd2lkdGggPSAxOwoJCS8qIGZhbGwgdGhyb3VnaCAqLwoJY2FzZSAnICc6CgkJc2V0Y29sKGNvbCArIDEpOwoJCWNvbnRpbnVlOwoKCWNhc2UgJ1xuJzoKCQlmbHVzaGxuKCk7CgkJY29udGludWU7CgoJY2FzZSAnXGYnOgoJCWZsdXNobG4oKTsKCQlwdXR3Y2hhcignXGYnKTsKCQljb250aW51ZTsKCglkZWZhdWx0OgoJCWlmICghaXN3cHJpbnQoYykpCS8qIG5vbiBwcmludGluZyAqLwoJCQljb250aW51ZTsKCQl3ID0gd2N3aWR0aChjKTsKCQluZWVkY29sKGNvbCArIHcpOwoJCWlmIChvYnVmW2NvbF0uY19jaGFyID09ICdcMCcpIHsKCQkJb2J1Zltjb2xdLmNfY2hhciA9IGM7CgkJCWZvciAoaSA9IDA7IGkgPCB3OyBpKyspCgkJCQlvYnVmW2NvbCtpXS5jX21vZGUgPSBtb2RlOwoJCQlvYnVmW2NvbF0uY193aWR0aCA9IHc7CgkJCWZvciAoaSA9IDE7IGkgPCB3OyBpKyspCgkJCQlvYnVmW2NvbCtpXS5jX3dpZHRoID0gLTE7CgkJfSBlbHNlIGlmIChvYnVmW2NvbF0uY19jaGFyID09ICdfJykgewoJCQlvYnVmW2NvbF0uY19jaGFyID0gYzsKCQkJZm9yIChpID0gMDsgaSA8IHc7IGkrKykKCQkJCW9idWZbY29sK2ldLmNfbW9kZSB8PSBVTkRFUkx8bW9kZTsKCQkJb2J1Zltjb2xdLmNfd2lkdGggPSB3OwoJCQlmb3IgKGkgPSAxOyBpIDwgdzsgaSsrKQoJCQkJb2J1Zltjb2wraV0uY193aWR0aCA9IC0xOwoJCX0gZWxzZSBpZiAob2J1Zltjb2xdLmNfY2hhciA9PSBjKSB7CgkJCWZvciAoaSA9IDA7IGkgPCB3OyBpKyspCgkJCQlvYnVmW2NvbCtpXS5jX21vZGUgfD0gQk9MRHxtb2RlOwoJCX0gZWxzZSB7CgkJCXcgPSBvYnVmW2NvbF0uY193aWR0aDsKCQkJZm9yIChpID0gMDsgaSA8IHc7IGkrKykKCQkJCW9idWZbY29sK2ldLmNfbW9kZSA9IG1vZGU7CgkJfQoJCXNldGNvbChjb2wgKyB3KTsKCQljb250aW51ZTsKCX0KCWlmIChtYXhjb2wpCgkJZmx1c2hsbigpOwp9Cgp2b2lkIGZsdXNobG4odm9pZCkKewoJaW50IGxhc3Rtb2RlOwoJaW50IGk7CglpbnQgaGFkbW9kZXMgPSAwOwoKCWxhc3Rtb2RlID0gTk9STUFMOwoJZm9yIChpPTA7IGk8bWF4Y29sOyBpKyspIHsKCQlpZiAob2J1ZltpXS5jX21vZGUgIT0gbGFzdG1vZGUpIHsKCQkJaGFkbW9kZXMrKzsKCQkJc2V0bW9kZShvYnVmW2ldLmNfbW9kZSk7CgkJCWxhc3Rtb2RlID0gb2J1ZltpXS5jX21vZGU7CgkJfQoJCWlmIChvYnVmW2ldLmNfY2hhciA9PSAnXDAnKSB7CgkJCWlmICh1cGxuKSB7CgkJCQlQUklOVChDVVJTX1JJR0hUKTsKCQkJfSBlbHNlCgkJCQlvdXRjKCcgJywgMSk7CgkJfSBlbHNlCgkJCW91dGMob2J1ZltpXS5jX2NoYXIsIG9idWZbaV0uY193aWR0aCk7CgkJaWYgKG9idWZbaV0uY193aWR0aCA+IDEpCgkJCWkgKz0gb2J1ZltpXS5jX3dpZHRoIC0xOwoJfQoJaWYgKGxhc3Rtb2RlICE9IE5PUk1BTCkgewoJCXNldG1vZGUoMCk7Cgl9CglpZiAobXVzdF9vdmVyc3RyaWtlICYmIGhhZG1vZGVzKQoJCW92ZXJzdHJpa2UoKTsKCXB1dHdjaGFyKCdcbicpOwoJaWYgKGlmbGFnICYmIGhhZG1vZGVzKQoJCWlhdHRyKCk7Cgkodm9pZClmZmx1c2goc3Rkb3V0KTsKCWlmICh1cGxuKQoJCXVwbG4tLTsKCWluaXRidWYoKTsKfQoKLyoKICogRm9yIHRlcm1pbmFscyB0aGF0IGNhbiBvdmVyc3RyaWtlLCBvdmVyc3RyaWtlIHVuZGVybGluZXMgYW5kIGJvbGRzLgogKiBXZSBkb24ndCBkbyBhbnl0aGluZyB3aXRoIGhhbGZsaW5lIHVwcyBhbmQgZG93bnMsIG9yIEdyZWVrLgogKi8Kdm9pZCBvdmVyc3RyaWtlKHZvaWQpCnsKCXJlZ2lzdGVyIGludCBpOwojaWZkZWYgX19HTlVDX18KCXJlZ2lzdGVyIHdjaGFyX3QgKmxidWYgPSBfX2J1aWx0aW5fYWxsb2NhKChtYXhjb2wrMSkqc2l6ZW9mKHdjaGFyX3QpKTsKI2Vsc2UKCXdjaGFyX3QgbGJ1ZlsyNTZdOwojZW5kaWYKCXJlZ2lzdGVyIHdjaGFyX3QgKmNwID0gbGJ1ZjsKCWludCBoYWRib2xkPTA7CgoJLyogU2V0IHVwIG92ZXJzdHJpa2UgYnVmZmVyICovCglmb3IgKGk9MDsgaTxtYXhjb2w7IGkrKykKCQlzd2l0Y2ggKG9idWZbaV0uY19tb2RlKSB7CgkJY2FzZSBOT1JNQUw6CgkJZGVmYXVsdDoKCQkJKmNwKysgPSAnICc7CgkJCWJyZWFrOwoJCWNhc2UgVU5ERVJMOgoJCQkqY3ArKyA9ICdfJzsKCQkJYnJlYWs7CgkJY2FzZSBCT0xEOgoJCQkqY3ArKyA9IG9idWZbaV0uY19jaGFyOwoJCQlpZiAob2J1ZltpXS5jX3dpZHRoID4gMSkKCQkJCWkgKz0gb2J1ZltpXS5jX3dpZHRoIC0gMTsKCQkJaGFkYm9sZD0xOwoJCQlicmVhazsKCQl9CglwdXR3Y2hhcignXHInKTsKCWZvciAoKmNwPScgJzsgKmNwPT0nICc7IGNwLS0pCgkJKmNwID0gMDsKCWZvciAoY3A9bGJ1ZjsgKmNwOyBjcCsrKQoJCXB1dHdjaGFyKCpjcCk7CglpZiAoaGFkYm9sZCkgewoJCXB1dHdjaGFyKCdccicpOwoJCWZvciAoY3A9bGJ1ZjsgKmNwOyBjcCsrKQoJCQlwdXR3Y2hhcigqY3A9PSdfJyA/ICcgJyA6ICpjcCk7CgkJcHV0d2NoYXIoJ1xyJyk7CgkJZm9yIChjcD1sYnVmOyAqY3A7IGNwKyspCgkJCXB1dHdjaGFyKCpjcD09J18nID8gJyAnIDogKmNwKTsKCX0KfQoKdm9pZCBpYXR0cih2b2lkKQp7CglyZWdpc3RlciBpbnQgaTsKI2lmZGVmIF9fR05VQ19fCglyZWdpc3RlciBjaGFyICpsYnVmID0gX19idWlsdGluX2FsbG9jYSgobWF4Y29sKzEpKnNpemVvZihjaGFyKSk7CiNlbHNlCgljaGFyIGxidWZbMjU2XTsKI2VuZGlmCglyZWdpc3RlciBjaGFyICpjcCA9IGxidWY7CgoJZm9yIChpPTA7IGk8bWF4Y29sOyBpKyspCgkJc3dpdGNoIChvYnVmW2ldLmNfbW9kZSkgewoJCWNhc2UgTk9STUFMOgkqY3ArKyA9ICcgJzsgYnJlYWs7CgkJY2FzZSBBTFRTRVQ6CSpjcCsrID0gJ2cnOyBicmVhazsKCQljYXNlIFNVUEVSU0M6CSpjcCsrID0gJ14nOyBicmVhazsKCQljYXNlIFNVQlNDOgkqY3ArKyA9ICd2JzsgYnJlYWs7CgkJY2FzZSBVTkRFUkw6CSpjcCsrID0gJ18nOyBicmVhazsKCQljYXNlIEJPTEQ6CSpjcCsrID0gJyEnOyBicmVhazsKCQlkZWZhdWx0OgkqY3ArKyA9ICdYJzsgYnJlYWs7CgkJfQoJZm9yICgqY3A9JyAnOyAqY3A9PScgJzsgY3AtLSkKCQkqY3AgPSAwOwoJZm9yIChjcD1sYnVmOyAqY3A7IGNwKyspCgkJcHV0d2NoYXIoKmNwKTsKCXB1dHdjaGFyKCdcbicpOwp9Cgp2b2lkIGluaXRidWYodm9pZCkKewoJaWYgKG9idWYgPT0gTlVMTCkgewkvKiBGaXJzdCB0aW1lLiAqLwoJCW9idWZsZW4gPSBJTklUQlVGOwoJCW9idWYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBDSEFSKSAqIG9idWZsZW4pOwoJCWlmIChvYnVmID09IE5VTEwpIHsKCQkJZnByaW50ZihzdGRlcnIsIF8oIlVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIuXG4iKSk7CgkJCWV4aXQoMSk7CgkJfQoJfQoKCS8qIGFzc3VtZXMgTk9STUFMID09IDAgKi8KCW1lbXNldChvYnVmLCAwLCBzaXplb2Yoc3RydWN0IENIQVIpICogb2J1Zmxlbik7CglzZXRjb2woMCk7CgltYXhjb2wgPSAwOwoJbW9kZSAmPSBBTFRTRVQ7Cn0KCnZvaWQgZndkKHZvaWQpCnsKCWludCBvbGRjb2wsIG9sZG1heDsKCglvbGRjb2wgPSBjb2w7CglvbGRtYXggPSBtYXhjb2w7CglmbHVzaGxuKCk7CglzZXRjb2wob2xkY29sKTsKCW1heGNvbCA9IG9sZG1heDsKfQoKdm9pZCByZXZlcnNlKHZvaWQpCnsKCXVwbG4rKzsKCWZ3ZCgpOwoJUFJJTlQoQ1VSU19VUCk7CglQUklOVChDVVJTX1VQKTsKCXVwbG4rKzsKfQoKdm9pZCBpbml0aW5mbyh2b2lkKQp7CglDVVJTX1VQID0JCXRpZ2V0c3RyKCJjdXUxIik7CglDVVJTX1JJR0hUID0JCXRpZ2V0c3RyKCJjdWYxIik7CglDVVJTX0xFRlQgPQkJdGlnZXRzdHIoImN1YjEiKTsKCWlmIChDVVJTX0xFRlQgPT0gTlVMTCkKCQlDVVJTX0xFRlQgPQkiXGIiOwoKCUVOVEVSX1NUQU5ET1VUID0JdGlnZXRzdHIoInNtc28iKTsKCUVYSVRfU1RBTkRPVVQgPQkJdGlnZXRzdHIoInJtc28iKTsKCUVOVEVSX1VOREVSTElORSA9CXRpZ2V0c3RyKCJzbXVsIik7CglFWElUX1VOREVSTElORSA9CXRpZ2V0c3RyKCJybXVsIik7CglFTlRFUl9ESU0gPQkJdGlnZXRzdHIoImRpbSIpOwoJRU5URVJfQk9MRCA9CQl0aWdldHN0cigiYm9sZCIpOwoJRU5URVJfUkVWRVJTRSA9CQl0aWdldHN0cigicmV2Iik7CglFWElUX0FUVFJJQlVURVMgPQl0aWdldHN0cigic2dyMCIpOwoKCWlmICghRU5URVJfQk9MRCAmJiBFTlRFUl9SRVZFUlNFKQoJCUVOVEVSX0JPTEQgPSBFTlRFUl9SRVZFUlNFOwoJaWYgKCFFTlRFUl9CT0xEICYmIEVOVEVSX1NUQU5ET1VUKQoJCUVOVEVSX0JPTEQgPSBFTlRFUl9TVEFORE9VVDsKCWlmICghRU5URVJfVU5ERVJMSU5FICYmIEVOVEVSX1NUQU5ET1VUKSB7CgkJRU5URVJfVU5ERVJMSU5FID0gRU5URVJfU1RBTkRPVVQ7CgkJRVhJVF9VTkRFUkxJTkUgPSBFWElUX1NUQU5ET1VUOwoJfQoJaWYgKCFFTlRFUl9ESU0gJiYgRU5URVJfU1RBTkRPVVQpCgkJRU5URVJfRElNID0gRU5URVJfU1RBTkRPVVQ7CglpZiAoIUVOVEVSX1JFVkVSU0UgJiYgRU5URVJfU1RBTkRPVVQpCgkJRU5URVJfUkVWRVJTRSA9IEVOVEVSX1NUQU5ET1VUOwoJaWYgKCFFWElUX0FUVFJJQlVURVMgJiYgRVhJVF9TVEFORE9VVCkKCQlFWElUX0FUVFJJQlVURVMgPSBFWElUX1NUQU5ET1VUOwoJCgkvKgoJICogTm90ZSB0aGF0IHdlIHVzZSBSRVZFUlNFIGZvciB0aGUgYWx0ZXJuYXRlIGNoYXJhY3RlciBzZXQsCgkgKiBub3QgdGhlIGFzL2FlIGNhcGFiaWxpdGllcy4gIFRoaXMgaXMgYmVjYXVzZSB3ZSBhcmUgbW9kZWxsaW5nCgkgKiB0aGUgbW9kZWwgMzcgdGVsZXR5cGUgKHNpbmNlIHRoYXQncyB3aGF0IG5yb2ZmIG91dHB1dHMpIGFuZAoJICogdGhlIHR5cGljYWwgYXMvYWUgaXMgbW9yZSBvZiBhIGdyYXBoaWNzIHNldCwgbm90IHRoZSBncmVlawoJICogbGV0dGVycyB0aGUgMzcgaGFzLgoJICovCgoJVU5ERVJfQ0hBUiA9CQl0aWdldHN0cigidWMiKTsKCW11c3RfdXNlX3VjID0gKFVOREVSX0NIQVIgJiYgIUVOVEVSX1VOREVSTElORSk7Cn0KCnN0YXRpYyBpbnQgY3VybW9kZSA9IDA7Cgp2b2lkCm91dGMod2ludF90IGMsIGludCB3aWR0aCkgewoJaW50IGk7CgoJcHV0d2NoYXIoYyk7CglpZiAobXVzdF91c2VfdWMgJiYgKGN1cm1vZGUmVU5ERVJMKSkgewoJCWZvciAoaT0wOyBpPHdpZHRoOyBpKyspCgkJCVBSSU5UKENVUlNfTEVGVCk7CgkJZm9yIChpPTA7IGk8d2lkdGg7IGkrKykKCQkJUFJJTlQoVU5ERVJfQ0hBUik7Cgl9Cn0KCnZvaWQgc2V0bW9kZShpbnQgbmV3bW9kZSkKewoJaWYgKCFpZmxhZykgewoJCWlmIChjdXJtb2RlICE9IE5PUk1BTCAmJiBuZXdtb2RlICE9IE5PUk1BTCkKCQkJc2V0bW9kZShOT1JNQUwpOwoJCXN3aXRjaCAobmV3bW9kZSkgewoJCWNhc2UgTk9STUFMOgoJCQlzd2l0Y2goY3VybW9kZSkgewoJCQljYXNlIE5PUk1BTDoKCQkJCWJyZWFrOwoJCQljYXNlIFVOREVSTDoKCQkJCVBSSU5UKEVYSVRfVU5ERVJMSU5FKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJLyogVGhpcyBpbmNsdWRlcyBzdGFuZG91dCAqLwoJCQkJUFJJTlQoRVhJVF9BVFRSSUJVVEVTKTsKCQkJCWJyZWFrOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgQUxUU0VUOgoJCQlQUklOVChFTlRFUl9SRVZFUlNFKTsKCQkJYnJlYWs7CgkJY2FzZSBTVVBFUlNDOgoJCQkvKgoJCQkgKiBUaGlzIG9ubHkgd29ya3Mgb24gYSBmZXcgdGVybWluYWxzLgoJCQkgKiBJdCBzaG91bGQgYmUgZml4ZWQuCgkJCSAqLwoJCQlQUklOVChFTlRFUl9VTkRFUkxJTkUpOwoJCQlQUklOVChFTlRFUl9ESU0pOwoJCQlicmVhazsKCQljYXNlIFNVQlNDOgoJCQlQUklOVChFTlRFUl9ESU0pOwoJCQlicmVhazsKCQljYXNlIFVOREVSTDoKCQkJUFJJTlQoRU5URVJfVU5ERVJMSU5FKTsKCQkJYnJlYWs7CgkJY2FzZSBCT0xEOgoJCQlQUklOVChFTlRFUl9CT0xEKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJLyoKCQkJICogV2Ugc2hvdWxkIGhhdmUgc29tZSBwcm92aXNpb24gaGVyZSBmb3IgbXVsdGlwbGUgbW9kZXMKCQkJICogb24gYXQgb25jZS4gIFRoaXMgd2lsbCBoYXZlIHRvIGNvbWUgbGF0ZXIuCgkJCSAqLwoJCQlQUklOVChFTlRFUl9TVEFORE9VVCk7CgkJCWJyZWFrOwoJCX0KCX0KCWN1cm1vZGUgPSBuZXdtb2RlOwp9CgpzdGF0aWMgdm9pZApzZXRjb2woaW50IG5ld2NvbCkgewoJY29sID0gbmV3Y29sOwoKCWlmIChjb2wgPCAwKQoJCWNvbCA9IDA7CgllbHNlIGlmIChjb2wgPiBtYXhjb2wpCgkJbmVlZGNvbChjb2wpOwp9CgpzdGF0aWMgdm9pZApuZWVkY29sKGludCBjb2wpIHsKCW1heGNvbCA9IGNvbDsKCgkvKiBJZiBjb2wgPj0gb2J1ZmxlbiwgZXhwYW5kIG9idWYgdW50aWwgb2J1ZmxlbiA+IGNvbC4gKi8KCXdoaWxlIChjb2wgPj0gb2J1ZmxlbikgewoJCS8qIFBhcmFub2lkIGNoZWNrIGZvciBvYnVmbGVuID09IElOVF9NQVguICovCgkJaWYgKG9idWZsZW4gPT0gSU5UX01BWCkgewoJCQlmcHJpbnRmKHN0ZGVyciwKCQkJCV8oIklucHV0IGxpbmUgdG9vIGxvbmcuXG4iKSk7CgkJCWV4aXQoMSk7CgkJfQoKCQkvKiBTaW1pbGFyIHBhcmFub2lhOiBkb3VibGUgb25seSB1cCB0byBJTlRfTUFYLiAqLwoJCW9idWZsZW4gPSAoKElOVF9NQVggLyAyKSA8IG9idWZsZW4pCgkJCT8gSU5UX01BWAoJCQk6IG9idWZsZW4gKiAyOwoKCQkvKiBOb3cgd2UgY2FuIHRyeSB0byBleHBhbmQgb2J1Zi4gKi8KCQlvYnVmID0gcmVhbGxvYyhvYnVmLCBzaXplb2Yoc3RydWN0IENIQVIpICogb2J1Zmxlbik7CgkJaWYgKG9idWYgPT0gTlVMTCkgewoJCQlmcHJpbnRmKHN0ZGVyciwKCQkJCV8oIk91dCBvZiBtZW1vcnkgd2hlbiBncm93aW5nIGJ1ZmZlci5cbiIpKTsKCQkJZXhpdCgxKTsKCQl9Cgl9Cn0K