LyoKICogc2V0c2lkLmMgLS0gZXhlY3V0ZSBhIGNvbW1hbmQgaW4gYSBuZXcgc2Vzc2lvbgogKiBSaWNrIFNsYWRrZXkgPGpyc0B3b3JsZC5zdGQuY29tPgogKiBJbiB0aGUgcHVibGljIGRvbWFpbi4KICoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICoKICogMjAwMS0wMS0xOCBKb2huIEZyZW1saW4gPHZpaUBwZW5ndWlucG93ZXJlZC5jb20+CiAqIC0gZm9yayBpbiBjYXNlIHdlIGFyZSBwcm9jZXNzIGdyb3VwIGxlYWRlcgogKgogKi8KCiNpbmNsdWRlIDxnZXRvcHQuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CgojaW5jbHVkZSAiYy5oIgojaW5jbHVkZSAibmxzLmgiCiNpbmNsdWRlICJjbG9zZXN0cmVhbS5oIgoKc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpIHVzYWdlKEZJTEUgKiBvdXQpCnsKCWZwdXRzKFVTQUdFX0hFQURFUiwgb3V0KTsKCWZwcmludGYob3V0LCBfKAoJCSIgJXMgW29wdGlvbnNdIDxwcm9ncmFtPiBbYXJndW1lbnRzIC4uLl1cbiIpLAoJCXByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lKTsKCglmcHV0cyhVU0FHRV9PUFRJT05TLCBvdXQpOwoJZnB1dHMoXygiIC1jLCAtLWN0dHkgICAgIHNldCB0aGUgY29udHJvbGxpbmcgdGVybWluYWwgdG8gdGhlIGN1cnJlbnQgb25lXG4iKSwKCQlvdXQpOwoKCWZwdXRzKFVTQUdFX0hFTFAsIG91dCk7CglmcHV0cyhVU0FHRV9WRVJTSU9OLCBvdXQpOwoKCWZwcmludGYob3V0LCBVU0FHRV9NQU5fVEFJTCgic2V0c2lkKDEpIikpOwoJZXhpdChvdXQgPT0gc3RkZXJyID8gRVhJVF9GQUlMVVJFIDogRVhJVF9TVUNDRVNTKTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CglpbnQgY2g7CglpbnQgY3R0eSA9IDA7CgoJc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKCQl7ImN0dHkiLCBub19hcmd1bWVudCwgTlVMTCwgJ2MnfSwKCQl7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgJ1YnfSwKCQl7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKCQl7TlVMTCwgMCwgTlVMTCwgMH0KCX07CgoJc2V0bG9jYWxlKExDX0FMTCwgIiIpOwoJYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKCXRleHRkb21haW4oUEFDS0FHRSk7CglhdGV4aXQoY2xvc2Vfc3Rkb3V0KTsKCgl3aGlsZSAoKGNoID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIitWaGMiLCBsb25nb3B0cywgTlVMTCkpICE9IC0xKQoJCXN3aXRjaCAoY2gpIHsKCQljYXNlICdWJzoKCQkJcHJpbnRmKFVUSUxfTElOVVhfVkVSU0lPTik7CgkJCXJldHVybiBFWElUX1NVQ0NFU1M7CgkJY2FzZSAnYyc6CgkJCWN0dHk9MTsKCQkJYnJlYWs7CgkJY2FzZSAnaCc6CgkJCXVzYWdlKHN0ZG91dCk7CgkJZGVmYXVsdDoKCQkJdXNhZ2Uoc3RkZXJyKTsKCQl9CgoJaWYgKGFyZ2MgPCAyKQoJCXVzYWdlKHN0ZGVycik7CgoJaWYgKGdldHBncnAoKSA9PSBnZXRwaWQoKSkgewoJCXN3aXRjaCAoZm9yaygpKSB7CgkJY2FzZSAtMToKCQkJZXJyKEVYSVRfRkFJTFVSRSwgXygiZm9yayIpKTsKCQljYXNlIDA6CgkJCS8qIGNoaWxkICovCgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCS8qIHBhcmVudCAqLwoJCQlyZXR1cm4gMDsKCQl9Cgl9CglpZiAoc2V0c2lkKCkgPCAwKQoJCS8qIGNhbm5vdCBoYXBwZW4gKi8KCQllcnIoRVhJVF9GQUlMVVJFLCBfKCJzZXRzaWQgZmFpbGVkIikpOwoKCWlmIChjdHR5KSB7CgkJaWYgKGlvY3RsKFNURElOX0ZJTEVOTywgVElPQ1NDVFRZLCAxKSkKCQkJd2FybihfKCJmYWlsZWQgdG8gc2V0IHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCIpKTsKCX0KCWV4ZWN2cChhcmd2W29wdGluZF0sIGFyZ3YgKyBvcHRpbmQpOwoJZXJyKEVYSVRfRkFJTFVSRSwgXygiZXhlY3ZwIGZhaWxlZCIpKTsKfQo=