LyoKICogeGNvbW1vbi5jIC0gdmFyaW91cyBmdW5jdGlvbnMgcHV0IHRvZ2V0aGVyIHRvIGF2b2lkIGJhc2ljIGVycm9yIGNoZWNraW5nLgogKgogKiBhZGRlZCBmY250bCBsb2NraW5nIGJ5IEtqZXRpbCBULiAoa2pldGlsaG9AbWF0aC51aW8ubm8pIC0gYWViLCA5NTA5MjcKICoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICoKICogMjAwNi0wNi0wNiBBbWl0IEd1ZCA8YWd1ZEByZWRoYXQuY29tPgogKiAtIE1vdmVkIGNvZGUgc25pcHBldHMgaGVyZSBmcm9tIG1vdW50L3N1bmRyaWVzLmMgb2YgdXRpbC1saW51eAogKiAgIGFuZCBtZXJnZWQgY29kZSBmcm9tIHN1cHBvcnQvbmZzL3htYWxsb2MuYyBieSBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4gaGVyZS4KICovCgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAieGNvbW1vbi5oIgojaW5jbHVkZSAibmxzLmgiCS8qIF8oKSAqLwoKdm9pZCAoKmF0X2RpZSkodm9pZCApID0gTlVMTDsKCmNoYXIgKgp4c3RybmR1cCAoY29uc3QgY2hhciAqcywgaW50IG4pIHsKICAgICBjaGFyICp0OwoKICAgICBpZiAocyA9PSBOVUxMKQoJICBkaWUgKEVYX1NPRlRXQVJFLCBfKCJidWcgaW4geHN0cm5kdXAgY2FsbCIpKTsKCiAgICAgdCA9IHhtYWxsb2MobisxKTsKICAgICBzdHJuY3B5KHQscyxuKTsKICAgICB0W25dID0gMDsKCiAgICAgcmV0dXJuIHQ7Cn0KCmNoYXIgKgp4c3RyY29uY2F0MiAoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkgewogICAgIGNoYXIgKnJlczsKCiAgICAgaWYgKCFzKSBzID0gIiI7CiAgICAgaWYgKCF0KSB0ID0gIiI7CiAgICAgcmVzID0geG1hbGxvYyhzdHJsZW4ocykgKyBzdHJsZW4odCkgKyAxKTsKICAgICBzdHJjcHkocmVzLCBzKTsKICAgICBzdHJjYXQocmVzLCB0KTsKICAgICByZXR1cm4gcmVzOwp9CgovKiBmcmVlcyBpdHMgZmlyc3QgYXJnIC0gdHlwaWNhbCB1c2U6IHMgPSB4c3RyY29uY2F0MyhzLHQsdSk7ICovCmNoYXIgKgp4c3RyY29uY2F0MyAoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCwgY29uc3QgY2hhciAqdSkgewogICAgIGNoYXIgKnJlczsKCiAgICAgaWYgKCFzKSBzID0gIiI7CiAgICAgaWYgKCF0KSB0ID0gIiI7CiAgICAgaWYgKCF1KSB1ID0gIiI7CiAgICAgcmVzID0geG1hbGxvYyhzdHJsZW4ocykgKyBzdHJsZW4odCkgKyBzdHJsZW4odSkgKyAxKTsKICAgICBzdHJjcHkocmVzLCBzKTsKICAgICBzdHJjYXQocmVzLCB0KTsKICAgICBzdHJjYXQocmVzLCB1KTsKICAgICBmcmVlKCh2b2lkICopIHMpOwogICAgIHJldHVybiByZXM7Cn0KCi8qIGZyZWVzIGl0cyBmaXJzdCBhcmcgLSB0eXBpY2FsIHVzZTogcyA9IHhzdHJjb25jYXQ0KHMsdCx1LHYpOyAqLwpjaGFyICoKeHN0cmNvbmNhdDQgKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQsIGNvbnN0IGNoYXIgKnUsIGNvbnN0IGNoYXIgKnYpIHsKICAgICBjaGFyICpyZXM7CgogICAgIGlmICghcykgcyA9ICIiOwogICAgIGlmICghdCkgdCA9ICIiOwogICAgIGlmICghdSkgdSA9ICIiOwogICAgIGlmICghdikgdiA9ICIiOwogICAgIHJlcyA9IHhtYWxsb2Moc3RybGVuKHMpICsgc3RybGVuKHQpICsgc3RybGVuKHUpICsgc3RybGVuKHYpICsgMSk7CiAgICAgc3RyY3B5KHJlcywgcyk7CiAgICAgc3RyY2F0KHJlcywgdCk7CiAgICAgc3RyY2F0KHJlcywgdSk7CiAgICAgc3RyY2F0KHJlcywgdik7CiAgICAgZnJlZSgodm9pZCAqKSBzKTsKICAgICByZXR1cm4gcmVzOwp9CgovKiBOb24tZmF0YWwgZXJyb3IuICBQcmludCBtZXNzYWdlIGFuZCByZXR1cm4uICAqLwovKiAocHJpbnQgdGhlIG1lc3NhZ2UgaW4gYSBzaW5nbGUgcHJpbnRmLCBpbiBhbiBhdHRlbXB0CiAgICB0byBhdm9pZCBtaXhpbmcgb3V0cHV0IG9mIHNldmVyYWwgdGhyZWFkcykgKi8Kdm9pZApuZnNfZXJyb3IgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CiAgICAgdmFfbGlzdCBhcmdzOwogICAgIGNoYXIgKmZtdDI7CgogICAgIGZtdDIgPSB4c3RyY29uY2F0MiAoZm10LCAiXG4iKTsKICAgICB2YV9zdGFydCAoYXJncywgZm10KTsKICAgICB2ZnByaW50ZiAoc3RkZXJyLCBmbXQyLCBhcmdzKTsKICAgICB2YV9lbmQgKGFyZ3MpOwogICAgIGZyZWUgKGZtdDIpOwp9CgovKiBNYWtlIGEgY2Fub25pY2FsIHBhdGhuYW1lIGZyb20gUEFUSC4gIFJldHVybnMgYSBmcmVzaGx5IG1hbGxvY2VkIHN0cmluZy4KICAgSXQgaXMgdXAgdGhlICpjYWxsZXIqIHRvIGVuc3VyZSB0aGF0IHRoZSBQQVRIIGlzIHNlbnNpYmxlLiAgaS5lLgogICBjYW5vbmljYWxpemUgKCIvZGV2L2ZkMC8uIikgcmV0dXJucyAiL2Rldi9mZDAiIGV2ZW4gdGhvdWdoIGBgL2Rldi9mZDAvLicnCiAgIGlzIG5vdCBhIGxlZ2FsIHBhdGhuYW1lIGZvciBgYC9kZXYvZmQwJycuICBBbnl0aGluZyB3ZSBjYW5ub3QgcGFyc2UKICAgd2UgcmV0dXJuIHVubW9kaWZpZWQuICAgKi8KY2hhciAqY2Fub25pY2FsaXplIChjb25zdCBjaGFyICpwYXRoKSB7CgljaGFyIGNhbm9uaWNhbFtQQVRIX01BWCsyXTsKCglpZiAocGF0aCA9PSBOVUxMKQoJCXJldHVybiBOVUxMOwoKI2lmIDEKCWlmIChzdHJlcShwYXRoLCAibm9uZSIpIHx8CgkgICAgc3RyZXEocGF0aCwgInByb2MiKSB8fAoJICAgIHN0cmVxKHBhdGgsICJkZXZwdHMiKSkKCQlyZXR1cm4geHN0cmR1cChwYXRoKTsKI2VuZGlmCglpZiAocmVhbHBhdGggKHBhdGgsIGNhbm9uaWNhbCkpCgkJcmV0dXJuIHhzdHJkdXAoY2Fub25pY2FsKTsKCglyZXR1cm4geHN0cmR1cChwYXRoKTsKfQoKLyogRmF0YWwgZXJyb3IuICBQcmludCBtZXNzYWdlIGFuZCBleGl0LiAgKi8Kdm9pZApkaWUoaW50IGVyciwgY29uc3QgY2hhciAqZm10LCAuLi4pIHsKCXZhX2xpc3QgYXJnczsKCgl2YV9zdGFydChhcmdzLCBmbXQpOwoJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOwoJZnByaW50ZihzdGRlcnIsICJcbiIpOwoJdmFfZW5kKGFyZ3MpOwoKCWlmIChhdF9kaWUpCgkJKCphdF9kaWUpKCk7CgoJZXhpdChlcnIpOwp9CgpzdGF0aWMgdm9pZApkaWVfaWZfbnVsbCh2b2lkICp0KSB7CglpZiAodCA9PSBOVUxMKQoJCWRpZShFWF9TWVNFUlIsIF8oIm5vdCBlbm91Z2ggbWVtb3J5IikpOwp9Cgp2b2lkICoKeG1hbGxvYyAoc2l6ZV90IHNpemUpIHsKCXZvaWQgKnQ7CgoJaWYgKHNpemUgPT0gMCkKCQlyZXR1cm4gTlVMTDsKCgl0ID0gbWFsbG9jKHNpemUpOwoJZGllX2lmX251bGwodCk7CgoJcmV0dXJuIHQ7Cn0KCnZvaWQgKgp4cmVhbGxvYyAodm9pZCAqcCwgc2l6ZV90IHNpemUpIHsKCXZvaWQgKnQ7CgoJdCA9IHJlYWxsb2MocCwgc2l6ZSk7CglkaWVfaWZfbnVsbCh0KTsKCglyZXR1cm4gdDsKfQoKdm9pZAp4ZnJlZSh2b2lkICpwdHIpCnsKCWZyZWUocHRyKTsKfQoKY2hhciAqCnhzdHJkdXAgKGNvbnN0IGNoYXIgKnMpIHsKCWNoYXIgKnQ7CgoJaWYgKHMgPT0gTlVMTCkKCQlyZXR1cm4gTlVMTDsKCgl0ID0gc3RyZHVwKHMpOwoJZGllX2lmX251bGwodCk7CgoJcmV0dXJuIHQ7Cn0K