LyogZG1lc2cuYyAtLSBQcmludCBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBrZXJuZWwgcmluZyBidWZmZXIKICogQ3JlYXRlZDogU2F0IE9jdCAgOSAxNjoxOTo0NyAxOTkzCiAqIFJldmlzZWQ6IFRodSBPY3QgMjggMjE6NTI6MTcgMTk5MyBieSBmYWl0aEBjcy51bmMuZWR1CiAqIENvcHlyaWdodCAxOTkzIFRoZW9kb3JlIFRzJ28gKHR5dHNvQGF0aGVuYS5taXQuZWR1KQogKiBUaGlzIHByb2dyYW0gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgogKiBNb2RpZmljYXRpb25zIGJ5IFJpY2sgU2xhZGtleSAoanJzQHdvcmxkLnN0ZC5jb20pCiAqIExhcmdlciBidWZmZXJzaXplIDMgSnVuZSAxOTk4IGJ5IE5pY29sYWkgTGFuZ2ZlbGR0LCBiYXNlZCBvbiBhIHBhdGNoCiAqIGJ5IFBlZXRlciBKb290LiAgVGhpcyB3YXMgYWxzbyBzdWdnZXN0ZWQgYnkgSm9obiBIdWRzb24uCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIGZyb20gdXRpbC1saW51eCAtLSBhZGFwdGVkIGZvciBidXN5Ym94IGJ5IAogKiBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlZUBkZWJpYW4ub3JnPi4gSSByaXBwZWQgb3V0IE5hdGl2ZSBMYW5ndWFnZSAKICogU3VwcG9ydCwgcmVwbGFjZWQgZ2V0b3B0LCBhZGRlZCBzb21lIGdvdG9zIGZvciByZWR1bmRhbnQgc3R1ZmYuCiAqLwoKI2luY2x1ZGUgImludGVybmFsLmgiCiNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxnZXRvcHQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2lmIF9fR05VX0xJQlJBUllfXyA8IDUKCiNpZm5kZWYgX19hbHBoYV9fCiMgZGVmaW5lIF9fTlJfa2xvZ2N0bCBfX05SX3N5c2xvZwogIHN0YXRpYyBpbmxpbmUgX3N5c2NhbGwzKGludCwga2xvZ2N0bCwgaW50LCB0eXBlLCBjaGFyICosIGIsIGludCwgbGVuKTsKI2Vsc2UgLyogX19hbHBoYV9fICovCiNkZWZpbmUga2xvZ2N0bCBzeXNsb2cKI2VuZGlmCgojZWxzZQojIGluY2x1ZGUgPHN5cy9rbG9nLmg+CiNlbmRpZgoKc3RhdGljIGNvbnN0IGNoYXIgZG1lc2dfdXNhZ2VbXSA9ICJkbWVzZyBbLWNdIFstbiBsZXZlbF0gWy1zIGJ1ZnNpemVdXG4iOwoKaW50IGRtZXNnX21haW4oIGludCBhcmdjLCBjaGFyKiogYXJndiApCnsKICAgY2hhciAqYnVmOwogICBpbnQJYnVmc2l6ZT04MTk2OwogICBpbnQgIGk7CiAgIGludCAgbjsKICAgaW50ICBsZXZlbCA9IDA7CiAgIGludCAgbGFzdGM7CiAgIGludCAgY21kID0gMzsKICAgaW50IHN0b3BEb2luZ1RoYXQ7CgogICBhcmdjLS07CiAgIGFyZ3YrKzsKCiAgICAvKiBQYXJzZSBhbnkgb3B0aW9ucyAqLwogICAgd2hpbGUgKGFyZ2MgJiYgKiphcmd2ID09ICctJykgewoJc3RvcERvaW5nVGhhdCA9IEZBTFNFOwoJd2hpbGUgKHN0b3BEb2luZ1RoYXQgPT0gRkFMU0UgJiYgKisrKCphcmd2KSkgewoJICAgIHN3aXRjaCAoKiphcmd2KSB7CgkgICAgY2FzZSAnYyc6CgkJY21kID0gNDsKCQlicmVhazsKCSAgICBjYXNlICduJzoKCQljbWQgPSA4OwoJCWlmICgtLWFyZ2MgPT0gMCkKCQkgICAgZ290byBlbmQ7CgkJbGV2ZWwgPSBhdG9pICgqKCsrYXJndikpOwoJCWlmICgtLWFyZ2MgPiAwKQoJCSAgICArK2FyZ3Y7CgkJc3RvcERvaW5nVGhhdCA9IFRSVUU7CgkJYnJlYWs7CgkgICAgY2FzZSAncyc6CgkJaWYgKC0tYXJnYyA9PSAwKQoJCSAgICBnb3RvIGVuZDsKCQlidWZzaXplID0gYXRvaSAoKigrK2FyZ3YpKTsKCQlpZiAoLS1hcmdjID4gMCkKCQkgICAgKythcmd2OwoJCXN0b3BEb2luZ1RoYXQgPSBUUlVFOwoJCWJyZWFrOwoJICAgIGRlZmF1bHQ6CgkJZ290byBlbmQ7CgkgICAgfQoJfQogICAgfQogICAKICAgaWYgKGFyZ2MgPiAxKSB7Cglnb3RvIGVuZDsKICAgfQoKICAgaWYgKGNtZCA9PSA4KSB7CiAgICAgIG4gPSBrbG9nY3RsKCBjbWQsIE5VTEwsIGxldmVsICk7CiAgICAgIGlmIChuIDwgMCkgewoJICBnb3RvIGtsb2djdGxfZXJyb3I7CiAgICAgIH0KICAgICAgZXhpdCggVFJVRSApOwogICB9CgogICBpZiAoYnVmc2l6ZSA8IDQwOTYpIGJ1ZnNpemUgPSA0MDk2OwogICBidWYgPSAoY2hhciopbWFsbG9jKGJ1ZnNpemUpOwogICBuID0ga2xvZ2N0bCggY21kLCBidWYsIGJ1ZnNpemUgKTsKICAgaWYgKG4gPCAwKSB7CiAgICAgICBnb3RvIGtsb2djdGxfZXJyb3I7CiAgIH0KCiAgIGxhc3RjID0gJ1xuJzsKICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICBpZiAoKGkgPT0gMCB8fCBidWZbaSAtIDFdID09ICdcbicpICYmIGJ1ZltpXSA9PSAnPCcpIHsKCSBpKys7Cgkgd2hpbGUgKGJ1ZltpXSA+PSAnMCcgJiYgYnVmW2ldIDw9ICc5JykKCSAgICBpKys7CgkgaWYgKGJ1ZltpXSA9PSAnPicpCgkgICAgaSsrOwogICAgICB9CiAgICAgIGxhc3RjID0gYnVmW2ldOwogICAgICBwdXRjaGFyKCBsYXN0YyApOwogICB9CiAgIGlmIChsYXN0YyAhPSAnXG4nKQogICAgICBwdXRjaGFyKCAnXG4nICk7CiAgIGV4aXQoIFRSVUUpOwplbmQ6CiAgICB1c2FnZSggZG1lc2dfdXNhZ2UpOwogICAgZXhpdCAoRkFMU0UpOwprbG9nY3RsX2Vycm9yOgogICAgcGVycm9yKCAia2xvZ2N0bCIgKTsKICAgIGV4aXQoIEZBTFNFICk7Cgp9Cg==