LyoKICogJFhGcmVlODY6ICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgImZjaW50LmgiCgpzdGF0aWMgdW5zaWduZWQgaW50CkZjRmlsZUNhY2hlSGFzaCAoY29uc3QgY2hhciAqc3RyaW5nKQp7CiAgICB1bnNpZ25lZCBpbnQgICAgaCA9IDA7CiAgICBjaGFyCSAgICBjOwoKICAgIHdoaWxlICgoYyA9ICpzdHJpbmcrKykpCgloID0gKGggPDwgMSkgXiBjOwogICAgcmV0dXJuIGg7Cn0KCmNoYXIgKgpGY0ZpbGVDYWNoZUZpbmQgKEZjRmlsZUNhY2hlCSpjYWNoZSwKCQkgY29uc3QgY2hhcgkqZmlsZSwKCQkgaW50CQlpZCwKCQkgaW50CQkqY291bnQpCnsKICAgIHVuc2lnbmVkIGludCAgICBoYXNoOwogICAgY29uc3QgY2hhcgkgICAgKm1hdGNoOwogICAgRmNGaWxlQ2FjaGVFbnQgKmMsICpuYW1lOwogICAgaW50CQkgICAgbWF4aWQ7CiAgICBzdHJ1Y3Qgc3RhdAkgICAgc3RhdGI7CiAgICAKICAgIG1hdGNoID0gZmlsZTsKICAgIAogICAgaGFzaCA9IEZjRmlsZUNhY2hlSGFzaCAobWF0Y2gpOwogICAgbmFtZSA9IDA7CiAgICBtYXhpZCA9IC0xOwogICAgZm9yIChjID0gY2FjaGUtPmVudHNbaGFzaCAlIEZDX0ZJTEVfQ0FDSEVfSEFTSF9TSVpFXTsgYzsgYyA9IGMtPm5leHQpCiAgICB7CglpZiAoYy0+aGFzaCA9PSBoYXNoICYmICFzdHJjbXAgKG1hdGNoLCBjLT5maWxlKSkKCXsKCSAgICBpZiAoYy0+aWQgPiBtYXhpZCkKCQltYXhpZCA9IGMtPmlkOwoJICAgIGlmIChjLT5pZCA9PSBpZCkKCSAgICB7CgkJaWYgKHN0YXQgKGZpbGUsICZzdGF0YikgPCAwKQoJCXsKCQkgICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEUpCgkJCXByaW50ZiAoIiBmaWxlIG1pc3NpbmdcbiIpOwoJCSAgICByZXR1cm4gMDsKCQl9CgkJaWYgKHN0YXRiLnN0X210aW1lICE9IGMtPnRpbWUpCgkJewoJCSAgICBpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19DQUNIRSkKCQkJcHJpbnRmICgiIHRpbWVzdGFtcCBtaXNtYXRjaCAod2FzICVkIGlzICVkKVxuIiwKCQkJCShpbnQpIGMtPnRpbWUsIChpbnQpIHN0YXRiLnN0X210aW1lKTsKCQkgICAgcmV0dXJuIDA7CgkJfQoJCWlmICghYy0+cmVmZXJlbmNlZCkKCQl7CgkJICAgIGNhY2hlLT5yZWZlcmVuY2VkKys7CgkJICAgIGMtPnJlZmVyZW5jZWQgPSBGY1RydWU7CgkJfQoJCW5hbWUgPSBjOwoJICAgIH0KCX0KICAgIH0KICAgIGlmICghbmFtZSkKCXJldHVybiAwOwogICAgKmNvdW50ID0gbWF4aWQgKyAxOwogICAgcmV0dXJuIG5hbWUtPm5hbWU7Cn0KCi8qCiAqIENhY2hlIGZpbGUgc3ludGF4IGlzIHF1aXRlIHNpbXBsZToKICoKICogImZpbGVfbmFtZSIgaWQgdGltZSAiZm9udF9uYW1lIiBcbgogKi8KIApzdGF0aWMgRmNCb29sCkZjRmlsZUNhY2hlUmVhZFN0cmluZyAoRklMRSAqZiwgY2hhciAqZGVzdCwgaW50IGxlbikKewogICAgaW50CSAgICBjOwogICAgRmNCb29sICAgIGVzY2FwZTsKCiAgICB3aGlsZSAoKGMgPSBnZXRjIChmKSkgIT0gRU9GKQoJaWYgKGMgPT0gJyInKQoJICAgIGJyZWFrOwogICAgaWYgKGMgPT0gRU9GKQoJcmV0dXJuIEZjRmFsc2U7CiAgICBpZiAobGVuID09IDApCglyZXR1cm4gRmNGYWxzZTsKICAgIAogICAgZXNjYXBlID0gRmNGYWxzZTsKICAgIHdoaWxlICgoYyA9IGdldGMgKGYpKSAhPSBFT0YpCiAgICB7CglpZiAoIWVzY2FwZSkKCXsKCSAgICBzd2l0Y2ggKGMpIHsKCSAgICBjYXNlICciJzoKCQkqZGVzdCsrID0gJ1wwJzsKCQlyZXR1cm4gRmNUcnVlOwoJICAgIGNhc2UgJ1xcJzoKCQllc2NhcGUgPSBGY1RydWU7CgkJY29udGludWU7CgkgICAgfQoJfQogICAgICAgIGlmICgtLWxlbiA8PSAxKQoJICAgIHJldHVybiBGY0ZhbHNlOwoJKmRlc3QrKyA9IGM7Cgllc2NhcGUgPSBGY0ZhbHNlOwogICAgfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNGaWxlQ2FjaGVSZWFkVWxvbmcgKEZJTEUgKmYsIHVuc2lnbmVkIGxvbmcgKmRlc3QpCnsKICAgIHVuc2lnbmVkIGxvbmcgICB0OwogICAgaW50CQkgICAgYzsKCiAgICB3aGlsZSAoKGMgPSBnZXRjIChmKSkgIT0gRU9GKQogICAgewoJaWYgKCFpc3NwYWNlIChjKSkKCSAgICBicmVhazsKICAgIH0KICAgIGlmIChjID09IEVPRikKCXJldHVybiBGY0ZhbHNlOwogICAgdCA9IDA7CiAgICBmb3IgKDs7KQogICAgewoJaWYgKGMgPT0gRU9GIHx8IGlzc3BhY2UgKGMpKQoJICAgIGJyZWFrOwoJaWYgKCFpc2RpZ2l0IChjKSkKCSAgICByZXR1cm4gRmNGYWxzZTsKCXQgPSB0ICogMTAgKyAoYyAtICcwJyk7CgljID0gZ2V0YyAoZik7CiAgICB9CiAgICAqZGVzdCA9IHQ7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNCb29sCkZjRmlsZUNhY2hlUmVhZEludCAoRklMRSAqZiwgaW50ICpkZXN0KQp7CiAgICB1bnNpZ25lZCBsb25nICAgdDsKICAgIEZjQm9vbAkgICAgcmV0OwoKICAgIHJldCA9IEZjRmlsZUNhY2hlUmVhZFVsb25nIChmLCAmdCk7CiAgICBpZiAocmV0KQoJKmRlc3QgPSAoaW50KSB0OwogICAgcmV0dXJuIHJldDsKfQoKc3RhdGljIEZjQm9vbApGY0ZpbGVDYWNoZVJlYWRUaW1lIChGSUxFICpmLCB0aW1lX3QgKmRlc3QpCnsKICAgIHVuc2lnbmVkIGxvbmcgICB0OwogICAgRmNCb29sCSAgICByZXQ7CgogICAgcmV0ID0gRmNGaWxlQ2FjaGVSZWFkVWxvbmcgKGYsICZ0KTsKICAgIGlmIChyZXQpCgkqZGVzdCA9ICh0aW1lX3QpIHQ7CiAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgRmNCb29sCkZjRmlsZUNhY2hlQWRkIChGY0ZpbGVDYWNoZQkqY2FjaGUsCgkJIGNvbnN0IGNoYXIJKmZpbGUsCgkJIGludAkJaWQsCgkJIHRpbWVfdAkJdGltZSwKCQkgY29uc3QgY2hhcgkqbmFtZSwKCQkgRmNCb29sCQlyZXBsYWNlKQp7CiAgICBGY0ZpbGVDYWNoZUVudCAgICAqYzsKICAgIEZjRmlsZUNhY2hlRW50ICAgICoqcHJldiwgKm9sZDsKICAgIHVuc2lnbmVkIGludCAgICBoYXNoOwoKICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX0NBQ0hFKQogICAgewoJcHJpbnRmICgiJXMgZmFjZSAlcy8lZCBhcyAlc1xuIiwgcmVwbGFjZSA/ICJSZXBsYWNlIiA6ICJBZGQiLAoJCWZpbGUsIGlkLCBuYW1lKTsKICAgIH0KICAgIGhhc2ggPSBGY0ZpbGVDYWNoZUhhc2ggKGZpbGUpOwogICAgZm9yIChwcmV2ID0gJmNhY2hlLT5lbnRzW2hhc2ggJSBGQ19GSUxFX0NBQ0hFX0hBU0hfU0laRV07IAoJIChvbGQgPSAqcHJldik7CgkgcHJldiA9ICYoKnByZXYpLT5uZXh0KQogICAgewoJaWYgKG9sZC0+aGFzaCA9PSBoYXNoICYmIG9sZC0+aWQgPT0gaWQgJiYgIXN0cmNtcCAob2xkLT5maWxlLCBmaWxlKSkKCSAgICBicmVhazsKICAgIH0KICAgIGlmICgqcHJldikKICAgIHsKCWlmICghcmVwbGFjZSkKCSAgICByZXR1cm4gRmNGYWxzZTsKCglvbGQgPSAqcHJldjsKCWlmIChvbGQtPnJlZmVyZW5jZWQpCgkgICAgY2FjaGUtPnJlZmVyZW5jZWQtLTsKCSpwcmV2ID0gb2xkLT5uZXh0OwoJZnJlZSAob2xkKTsKCWNhY2hlLT5lbnRyaWVzLS07CiAgICB9CgkKICAgIGMgPSBtYWxsb2MgKHNpemVvZiAoRmNGaWxlQ2FjaGVFbnQpICsKCQlzdHJsZW4gKGZpbGUpICsgMSArCgkJc3RybGVuIChuYW1lKSArIDEpOwogICAgaWYgKCFjKQoJcmV0dXJuIEZjRmFsc2U7CiAgICBjLT5uZXh0ID0gKnByZXY7CiAgICAqcHJldiA9IGM7CiAgICBjLT5oYXNoID0gaGFzaDsKICAgIGMtPmZpbGUgPSAoY2hhciAqKSAoYyArIDEpOwogICAgYy0+aWQgPSBpZDsKICAgIGMtPm5hbWUgPSBjLT5maWxlICsgc3RybGVuIChmaWxlKSArIDE7CiAgICBzdHJjcHkgKGMtPmZpbGUsIGZpbGUpOwogICAgYy0+dGltZSA9IHRpbWU7CiAgICBjLT5yZWZlcmVuY2VkID0gcmVwbGFjZTsKICAgIHN0cmNweSAoYy0+bmFtZSwgbmFtZSk7CiAgICBjYWNoZS0+ZW50cmllcysrOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKRmNGaWxlQ2FjaGUgKgpGY0ZpbGVDYWNoZUNyZWF0ZSAodm9pZCkKewogICAgRmNGaWxlQ2FjaGUJKmNhY2hlOwogICAgaW50CQloOwoKICAgIGNhY2hlID0gbWFsbG9jIChzaXplb2YgKEZjRmlsZUNhY2hlKSk7CiAgICBpZiAoIWNhY2hlKQoJcmV0dXJuIDA7CiAgICBmb3IgKGggPSAwOyBoIDwgRkNfRklMRV9DQUNIRV9IQVNIX1NJWkU7IGgrKykKCWNhY2hlLT5lbnRzW2hdID0gMDsKICAgIGNhY2hlLT5lbnRyaWVzID0gMDsKICAgIGNhY2hlLT5yZWZlcmVuY2VkID0gMDsKICAgIGNhY2hlLT51cGRhdGVkID0gRmNGYWxzZTsKICAgIHJldHVybiBjYWNoZTsKfQoKdm9pZApGY0ZpbGVDYWNoZURlc3Ryb3kgKEZjRmlsZUNhY2hlICpjYWNoZSkKewogICAgRmNGaWxlQ2FjaGVFbnQgKmMsICpuZXh0OwogICAgaW50CQkgICAgaDsKCiAgICBmb3IgKGggPSAwOyBoIDwgRkNfRklMRV9DQUNIRV9IQVNIX1NJWkU7IGgrKykKICAgIHsKCWZvciAoYyA9IGNhY2hlLT5lbnRzW2hdOyBjOyBjID0gbmV4dCkKCXsKCSAgICBuZXh0ID0gYy0+bmV4dDsKCSAgICBmcmVlIChjKTsKCX0KICAgIH0KICAgIGZyZWUgKGNhY2hlKTsKfQoKdm9pZApGY0ZpbGVDYWNoZUxvYWQgKEZjRmlsZUNhY2hlCSpjYWNoZSwKCQkgY29uc3QgY2hhcgkqY2FjaGVfZmlsZSkKewogICAgRklMRQkgICAgKmY7CiAgICBjaGFyCSAgICBmaWxlWzgxOTJdOwogICAgaW50CQkgICAgaWQ7CiAgICB0aW1lX3QJICAgIHRpbWU7CiAgICBjaGFyCSAgICBuYW1lWzgxOTJdOwoKICAgIGYgPSBmb3BlbiAoY2FjaGVfZmlsZSwgInIiKTsKICAgIGlmICghZikKCXJldHVybjsKCiAgICBjYWNoZS0+dXBkYXRlZCA9IEZjRmFsc2U7CiAgICB3aGlsZSAoRmNGaWxlQ2FjaGVSZWFkU3RyaW5nIChmLCBmaWxlLCBzaXplb2YgKGZpbGUpKSAmJgoJICAgRmNGaWxlQ2FjaGVSZWFkSW50IChmLCAmaWQpICYmCgkgICBGY0ZpbGVDYWNoZVJlYWRUaW1lIChmLCAmdGltZSkgJiYKCSAgIEZjRmlsZUNhY2hlUmVhZFN0cmluZyAoZiwgbmFtZSwgc2l6ZW9mIChuYW1lKSkpCiAgICB7Cgkodm9pZCkgRmNGaWxlQ2FjaGVBZGQgKGNhY2hlLCBmaWxlLCBpZCwgdGltZSwgbmFtZSwgRmNGYWxzZSk7CiAgICB9CiAgICBmY2xvc2UgKGYpOwp9CgpGY0Jvb2wKRmNGaWxlQ2FjaGVVcGRhdGUgKEZjRmlsZUNhY2hlCSpjYWNoZSwKCQkgICBjb25zdCBjaGFyCSpmaWxlLAoJCSAgIGludAkJaWQsCgkJICAgY29uc3QgY2hhcgkqbmFtZSkKewogICAgY29uc3QgY2hhcgkgICAgKm1hdGNoOwogICAgc3RydWN0IHN0YXQJICAgIHN0YXRiOwogICAgRmNCb29sCSAgICByZXQ7CgogICAgbWF0Y2ggPSBmaWxlOwoKICAgIGlmIChzdGF0IChmaWxlLCAmc3RhdGIpIDwgMCkKCXJldHVybiBGY0ZhbHNlOwogICAgcmV0ID0gRmNGaWxlQ2FjaGVBZGQgKGNhY2hlLCBtYXRjaCwgaWQsIAoJCQkgICAgc3RhdGIuc3RfbXRpbWUsIG5hbWUsIEZjVHJ1ZSk7CiAgICBpZiAocmV0KQoJY2FjaGUtPnVwZGF0ZWQgPSBGY1RydWU7CiAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgRmNCb29sCkZjRmlsZUNhY2hlV3JpdGVTdHJpbmcgKEZJTEUgKmYsIGNoYXIgKnN0cmluZykKewogICAgY2hhciAgICBjOwoKICAgIGlmIChwdXRjICgnIicsIGYpID09IEVPRikKCXJldHVybiBGY0ZhbHNlOwogICAgd2hpbGUgKChjID0gKnN0cmluZysrKSkKICAgIHsKCXN3aXRjaCAoYykgewoJY2FzZSAnIic6CgljYXNlICdcXCc6CgkgICAgaWYgKHB1dGMgKCdcXCcsIGYpID09IEVPRikKCQlyZXR1cm4gRmNGYWxzZTsKCSAgICAvKiBmYWxsIHRocm91Z2ggKi8KCWRlZmF1bHQ6CgkgICAgaWYgKHB1dGMgKGMsIGYpID09IEVPRikKCQlyZXR1cm4gRmNGYWxzZTsKCX0KICAgIH0KICAgIGlmIChwdXRjICgnIicsIGYpID09IEVPRikKCXJldHVybiBGY0ZhbHNlOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY0ZpbGVDYWNoZVdyaXRlVWxvbmcgKEZJTEUgKmYsIHVuc2lnbmVkIGxvbmcgdCkKewogICAgaW50CSAgICBwb3c7CiAgICB1bnNpZ25lZCBsb25nICAgdGVtcCwgZGlnaXQ7CgogICAgdGVtcCA9IHQ7CiAgICBwb3cgPSAxOwogICAgd2hpbGUgKHRlbXAgPj0gMTApCiAgICB7Cgl0ZW1wIC89IDEwOwoJcG93ICo9IDEwOwogICAgfQogICAgdGVtcCA9IHQ7CiAgICB3aGlsZSAocG93KQogICAgewoJZGlnaXQgPSB0ZW1wIC8gcG93OwoJaWYgKHB1dGMgKChjaGFyKSBkaWdpdCArICcwJywgZikgPT0gRU9GKQoJICAgIHJldHVybiBGY0ZhbHNlOwoJdGVtcCA9IHRlbXAgLSBwb3cgKiBkaWdpdDsKCXBvdyA9IHBvdyAvIDEwOwogICAgfQogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY0ZpbGVDYWNoZVdyaXRlSW50IChGSUxFICpmLCBpbnQgaSkKewogICAgcmV0dXJuIEZjRmlsZUNhY2hlV3JpdGVVbG9uZyAoZiwgKHVuc2lnbmVkIGxvbmcpIGkpOwp9CgpzdGF0aWMgRmNCb29sCkZjRmlsZUNhY2hlV3JpdGVUaW1lIChGSUxFICpmLCB0aW1lX3QgdCkKewogICAgcmV0dXJuIEZjRmlsZUNhY2hlV3JpdGVVbG9uZyAoZiwgKHVuc2lnbmVkIGxvbmcpIHQpOwp9CgpGY0Jvb2wKRmNGaWxlQ2FjaGVTYXZlIChGY0ZpbGVDYWNoZQkqY2FjaGUsCgkJIGNvbnN0IGNoYXIJKmNhY2hlX2ZpbGUpCnsKICAgIGNoYXIJICAgICpsY2s7CiAgICBjaGFyCSAgICAqdG1wOwogICAgRklMRQkgICAgKmY7CiAgICBpbnQJCSAgICBoOwogICAgRmNGaWxlQ2FjaGVFbnQgKmM7CgogICAgaWYgKCFjYWNoZS0+dXBkYXRlZCAmJiBjYWNoZS0+cmVmZXJlbmNlZCA9PSBjYWNoZS0+ZW50cmllcykKCXJldHVybiBGY1RydWU7CiAgICAKICAgIGxjayA9IG1hbGxvYyAoc3RybGVuIChjYWNoZV9maWxlKSoyICsgNCk7CiAgICBpZiAoIWxjaykKCWdvdG8gYmFpbDA7CiAgICB0bXAgPSBsY2sgKyBzdHJsZW4gKGNhY2hlX2ZpbGUpICsgMjsKICAgIHN0cmNweSAobGNrLCBjYWNoZV9maWxlKTsKICAgIHN0cmNhdCAobGNrLCAiTCIpOwogICAgc3RyY3B5ICh0bXAsIGNhY2hlX2ZpbGUpOwogICAgc3RyY2F0ICh0bXAsICJUIik7CiAgICBpZiAobGluayAobGNrLCBjYWNoZV9maWxlKSA8IDAgJiYgZXJybm8gIT0gRU5PRU5UKQoJZ290byBiYWlsMTsKICAgIGlmIChhY2Nlc3MgKHRtcCwgRl9PSykgPT0gMCkKCWdvdG8gYmFpbDI7CiAgICBmID0gZm9wZW4gKHRtcCwgInciKTsKICAgIGlmICghZikKCWdvdG8gYmFpbDI7CgogICAgZm9yIChoID0gMDsgaCA8IEZDX0ZJTEVfQ0FDSEVfSEFTSF9TSVpFOyBoKyspCiAgICB7Cglmb3IgKGMgPSBjYWNoZS0+ZW50c1toXTsgYzsgYyA9IGMtPm5leHQpCgl7CgkgICAgaWYgKCFjLT5yZWZlcmVuY2VkKQoJCWNvbnRpbnVlOwoJICAgIGlmICghRmNGaWxlQ2FjaGVXcml0ZVN0cmluZyAoZiwgYy0+ZmlsZSkpCgkJZ290byBiYWlsNDsKCSAgICBpZiAocHV0YyAoJyAnLCBmKSA9PSBFT0YpCgkJZ290byBiYWlsNDsKCSAgICBpZiAoIUZjRmlsZUNhY2hlV3JpdGVJbnQgKGYsIGMtPmlkKSkKCQlnb3RvIGJhaWw0OwoJICAgIGlmIChwdXRjICgnICcsIGYpID09IEVPRikKCQlnb3RvIGJhaWw0OwoJICAgIGlmICghRmNGaWxlQ2FjaGVXcml0ZVRpbWUgKGYsIGMtPnRpbWUpKQoJCWdvdG8gYmFpbDQ7CgkgICAgaWYgKHB1dGMgKCcgJywgZikgPT0gRU9GKQoJCWdvdG8gYmFpbDQ7CgkgICAgaWYgKCFGY0ZpbGVDYWNoZVdyaXRlU3RyaW5nIChmLCBjLT5uYW1lKSkKCQlnb3RvIGJhaWw0OwoJICAgIGlmIChwdXRjICgnXG4nLCBmKSA9PSBFT0YpCgkJZ290byBiYWlsNDsKCX0KICAgIH0KCiAgICBpZiAoZmNsb3NlIChmKSA9PSBFT0YpCglnb3RvIGJhaWwzOwogICAgCiAgICBpZiAocmVuYW1lICh0bXAsIGNhY2hlX2ZpbGUpIDwgMCkKCWdvdG8gYmFpbDM7CiAgICAKICAgIHVubGluayAobGNrKTsKICAgIGNhY2hlLT51cGRhdGVkID0gRmNGYWxzZTsKICAgIHJldHVybiBGY1RydWU7CgpiYWlsNDoKICAgIGZjbG9zZSAoZik7CmJhaWwzOgogICAgdW5saW5rICh0bXApOwpiYWlsMjoKICAgIHVubGluayAobGNrKTsKYmFpbDE6CiAgICBmcmVlIChsY2spOwpiYWlsMDoKICAgIHJldHVybiBGY0ZhbHNlOwp9CgpGY0Jvb2wKRmNGaWxlQ2FjaGVSZWFkRGlyIChGY0ZvbnRTZXQgKnNldCwgY29uc3QgY2hhciAqY2FjaGVfZmlsZSkKewogICAgRmNQYXR0ZXJuCSAgICAqZm9udDsKICAgIEZJTEUJICAgICpmOwogICAgY2hhcgkgICAgKnBhdGg7CiAgICBjaGFyCSAgICAqYmFzZTsKICAgIGNoYXIJICAgIGZpbGVbODE5Ml07CiAgICBpbnQJCSAgICBpZDsKICAgIGNoYXIJICAgIG5hbWVbODE5Ml07CiAgICBGY0Jvb2wJICAgIHJldCA9IEZjRmFsc2U7CgogICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEUpCiAgICB7CglwcmludGYgKCJGY0ZpbGVDYWNoZVJlYWREaXIgY2FjaGVfZmlsZSBcIiVzXCJcbiIsIGNhY2hlX2ZpbGUpOwogICAgfQogICAgCiAgICBmID0gZm9wZW4gKGNhY2hlX2ZpbGUsICJyIik7CiAgICBpZiAoIWYpCiAgICB7CglpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19DQUNIRSkKCXsKCSAgICBwcmludGYgKCIgbm8gY2FjaGUgZmlsZVxuIik7Cgl9Cglnb3RvIGJhaWwwOwogICAgfQoKICAgIGJhc2UgPSBzdHJyY2hyIChjYWNoZV9maWxlLCAnLycpOwogICAgaWYgKCFiYXNlKQoJZ290byBiYWlsMTsKICAgIGJhc2UrKzsKICAgIHBhdGggPSBtYWxsb2MgKGJhc2UgLSBjYWNoZV9maWxlICsgODE5MiArIDEpOwogICAgaWYgKCFwYXRoKQoJZ290byBiYWlsMTsKICAgIG1lbWNweSAocGF0aCwgY2FjaGVfZmlsZSwgYmFzZSAtIGNhY2hlX2ZpbGUpOwogICAgYmFzZSA9IHBhdGggKyAoYmFzZSAtIGNhY2hlX2ZpbGUpOwogICAgCiAgICB3aGlsZSAoRmNGaWxlQ2FjaGVSZWFkU3RyaW5nIChmLCBmaWxlLCBzaXplb2YgKGZpbGUpKSAmJgoJICAgRmNGaWxlQ2FjaGVSZWFkSW50IChmLCAmaWQpICYmCgkgICBGY0ZpbGVDYWNoZVJlYWRTdHJpbmcgKGYsIG5hbWUsIHNpemVvZiAobmFtZSkpKQogICAgewoJZm9udCA9IEZjTmFtZVBhcnNlIChuYW1lKTsKCWlmIChmb250KQoJewoJICAgIHN0cmNweSAoYmFzZSwgZmlsZSk7CgkgICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEVWKQoJICAgIHsKCQlwcmludGYgKCIgZGlyIGNhY2hlIGZpbGUgXCIlc1wiXG4iLCBmaWxlKTsKCSAgICB9CgkgICAgRmNQYXR0ZXJuQWRkU3RyaW5nIChmb250LCBGQ19GSUxFLCBwYXRoKTsKCSAgICBpZiAoIUZjRm9udFNldEFkZCAoc2V0LCBmb250KSkKCQlnb3RvIGJhaWwyOwoJfQogICAgfQogICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEUpCiAgICB7CglwcmludGYgKCIgY2FjaGUgbG9hZGVkXG4iKTsKICAgIH0KICAgIAogICAgcmV0ID0gRmNUcnVlOwpiYWlsMjoKICAgIGZyZWUgKHBhdGgpOwpiYWlsMToKICAgIGZjbG9zZSAoZik7CmJhaWwwOgogICAgcmV0dXJuIHJldDsKfQoKRmNCb29sCkZjRmlsZUNhY2hlV3JpdGVEaXIgKEZjRm9udFNldCAqc2V0LCBjb25zdCBjaGFyICpjYWNoZV9maWxlKQp7CiAgICBGY1BhdHRlcm4JICAgICpmb250OwogICAgRklMRQkgICAgKmY7CiAgICBjaGFyCSAgICAqbmFtZTsKICAgIGNoYXIJICAgICpmaWxlLCAqYmFzZTsKICAgIGludAkJICAgIG47CiAgICBpbnQJCSAgICBpZDsKICAgIEZjQm9vbAkgICAgcmV0OwoKICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX0NBQ0hFKQoJcHJpbnRmICgiRmNGaWxlQ2FjaGVXcml0ZURpciBjYWNoZV9maWxlIFwiJXNcIlxuIiwgY2FjaGVfZmlsZSk7CiAgICAKICAgIGYgPSBmb3BlbiAoY2FjaGVfZmlsZSwgInciKTsKICAgIGlmICghZikKICAgIHsKCWlmIChGY0RlYnVnICgpICYgRkNfREJHX0NBQ0hFKQoJICAgIHByaW50ZiAoIiBjYW4ndCBjcmVhdGUgXCIlc1wiXG4iLCBjYWNoZV9maWxlKTsKCWdvdG8gYmFpbDA7CiAgICB9CiAgICBmb3IgKG4gPSAwOyBuIDwgc2V0LT5uZm9udDsgbisrKQogICAgewoJZm9udCA9IHNldC0+Zm9udHNbbl07CglpZiAoRmNQYXR0ZXJuR2V0U3RyaW5nIChmb250LCBGQ19GSUxFLCAwLCAmZmlsZSkgIT0gRmNSZXN1bHRNYXRjaCkKCSAgICBnb3RvIGJhaWwxOwoJYmFzZSA9IHN0cnJjaHIgKGZpbGUsICcvJyk7CglpZiAoYmFzZSkKCSAgICBiYXNlID0gYmFzZSArIDE7CgllbHNlCgkgICAgYmFzZSA9IGZpbGU7CglpZiAoRmNQYXR0ZXJuR2V0SW50ZWdlciAoZm9udCwgRkNfSU5ERVgsIDAsICZpZCkgIT0gRmNSZXN1bHRNYXRjaCkKCSAgICBnb3RvIGJhaWwxOwoJaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEVWKQoJICAgIHByaW50ZiAoIiB3cml0ZSBmaWxlIFwiJXNcIlxuIiwgYmFzZSk7CglpZiAoIUZjRmlsZUNhY2hlV3JpdGVTdHJpbmcgKGYsIGJhc2UpKQoJICAgIGdvdG8gYmFpbDE7CglpZiAocHV0YyAoJyAnLCBmKSA9PSBFT0YpCgkgICAgZ290byBiYWlsMTsKCWlmICghRmNGaWxlQ2FjaGVXcml0ZUludCAoZiwgaWQpKQoJICAgIGdvdG8gYmFpbDE7CiAgICAgICAgaWYgKHB1dGMgKCcgJywgZikgPT0gRU9GKQoJICAgIGdvdG8gYmFpbDE7CgluYW1lID0gRmNOYW1lVW5wYXJzZSAoZm9udCk7CglpZiAoIW5hbWUpCgkgICAgZ290byBiYWlsMTsKCXJldCA9IEZjRmlsZUNhY2hlV3JpdGVTdHJpbmcgKGYsIG5hbWUpOwoJZnJlZSAobmFtZSk7CglpZiAoIXJldCkKCSAgICBnb3RvIGJhaWwxOwoJaWYgKHB1dGMgKCdcbicsIGYpID09IEVPRikKCSAgICBnb3RvIGJhaWwxOwogICAgfQogICAgaWYgKGZjbG9zZSAoZikgPT0gRU9GKQoJZ290byBiYWlsMDsKICAgIAogICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEUpCglwcmludGYgKCIgY2FjaGUgd3JpdHRlblxuIik7CiAgICByZXR1cm4gRmNUcnVlOwogICAgCmJhaWwxOgogICAgZmNsb3NlIChmKTsKYmFpbDA6CiAgICB1bmxpbmsgKGNhY2hlX2ZpbGUpOwogICAgcmV0dXJuIEZjRmFsc2U7Cn0K