LyoKICogRElTUERJQi5kbGwKICogCiAqIENvcHlyaWdodCAxOTk4IE92ZSBL5XZlbiAod2l0aCBzb21lIGhlbHAgZnJvbSBNYXJjdXMgTWVpc3NuZXIpCiAqCiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbmUvd2luZ2RpMTYuaCIKI2luY2x1ZGUgIm1pc2NlbXUuaCIKI2luY2x1ZGUgImRpc3BkaWIuaCIKI2luY2x1ZGUgInZnYS5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgoKREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKCnN0YXRpYyBpbnQgZGlzcGRpYl9tdWx0aSA9IDA7CgpzdGF0aWMgV09SRCBESVNQRElCX0JlZ2luKFdPUkQgd0ZsYWdzKQp7CiAgICB1bnNpZ25lZCBYcmVzLFlyZXMsRGVwdGg7CgogICAgc3dpdGNoKHdGbGFncyZESVNQTEFZRElCX01PREUpIHsKICAgICAgICBjYXNlIERJU1BMQVlESUJfTU9ERV9ERUZBVUxUOgogICAgICAgICAgICAvKiBGSVhNRTogaXMgdGhpcyBzdXBwb3NlZCB0byBhdXRvZGV0ZWN0PyAqLwogICAgICAgIGNhc2UgRElTUExBWURJQl9NT0RFXzMyMHgyMDB4ODoKICAgICAgICAgICAgWHJlcz0zMjA7IFlyZXM9MjAwOyBEZXB0aD04OyBicmVhazsKICAgICAgICBjYXNlIERJU1BMQVlESUJfTU9ERV8zMjB4MjQweDg6CiAgICAgICAgICAgIFhyZXM9MzIwOyBZcmVzPTI0MDsgRGVwdGg9ODsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIERJU1BMQVlESUJfTk9UU1VQUE9SVEVEOwogICAgfQogICAgLyogbW9yZSBvciBsZXNzIGR1bW15IGNhbGxzIHRvIERlYXRoL1Jlc3VycmVjdGlvbiwgZm9yIGNvbXBsZXRlbmVzcyAqLwogICAgLyogRklYTUU6IHdoYXQgYXJndW1lbnRzIHNob3VsZCB0aGV5IGdldD8gKi8KICAgIERlYXRoMTYoMCk7CiAgICBpZiAoVkdBX1NldE1vZGUoWHJlcyxZcmVzLERlcHRoKSkgewogICAgICAgICBSZXN1cnJlY3Rpb24xNigwLDAsMCwwLDAsMCwwKTsKICAgICAgICAgcmV0dXJuIERJU1BMQVlESUJfTk9UU1VQUE9SVEVEOwogICAgfQogICAgcmV0dXJuIERJU1BMQVlESUJfTk9FUlJPUjsKfQoKc3RhdGljIHZvaWQgRElTUERJQl9FbmQodm9pZCkKewogICAgUmVzdXJyZWN0aW9uMTYoMCwwLDAsMCwwLDAsMCk7IC8qIEZJWE1FOiBhcmd1bWVudHMgKi8KICAgIFZHQV9FeGl0KCk7Cn0KCnN0YXRpYyB2b2lkIERJU1BESUJfUGFsZXR0ZShMUEJJVE1BUElORk8gbHBiaSkKewogICAgVkdBX1NldFF1YWRQYWxldHRlKGxwYmktPmJtaUNvbG9ycywwLDI1Nik7Cn0KCnN0YXRpYyB2b2lkIERJU1BESUJfU2hvdyhMUEJJVE1BUElORk9IRUFERVIgbHBiaSxMUFNUUiBscEJpdHMsV09SRCB1RmxhZ3MpCnsKICAgIGludCBYb2ZzLFlvZnMsV2lkdGg9bHBiaS0+YmlXaWR0aCxIZWlnaHQ9bHBiaS0+YmlIZWlnaHQsRGVsdGE7CiAgICB1bnNpZ25lZCBQaXRjaD0oV2lkdGgrMykmfjMsc1BpdGNoLHNXaWR0aCxzSGVpZ2h0OwogICAgTFBTVFIgc3VyZiA9IERPU01FTV9NYXBEb3NUb0xpbmVhcigweGEwMDAwKTsKCiAgICBpZiAoVkdBX0dldE1vZGUoJnNIZWlnaHQsJnNXaWR0aCxOVUxMKSkgcmV0dXJuOwogICAgc1BpdGNoPTMyMDsKCiAgICBEZWx0YT0oSGVpZ2h0PDApKjItMTsKICAgIEhlaWdodCo9LURlbHRhOyBQaXRjaCo9RGVsdGE7CgogICAgaWYgKHVGbGFncyZESVNQTEFZRElCX05PQ0VOVEVSKSB7CiAgICAgICAgWG9mcz0wOyBZb2ZzPTA7CiAgICB9IGVsc2UgewogICAgICAgIFhvZnM9KHNXaWR0aC1XaWR0aCkvMjsKICAgICAgICBZb2ZzPShzSGVpZ2h0LUhlaWdodCkvMjsKICAgIH0KICAgIHN1cmYgKz0gKFlvZnMqc1BpdGNoKStYb2ZzOwogICAgaWYgKFBpdGNoPDApIGxwQml0cy09UGl0Y2gqKEhlaWdodC0xKTsKICAgIGZvciAoOyBIZWlnaHQ7IEhlaWdodC0tLGxwQml0cys9UGl0Y2gsc3VyZis9c1BpdGNoKSB7CiAgICAgICAgbWVtY3B5KHN1cmYsbHBCaXRzLFdpZHRoKTsKICAgIH0KCiAgICBWR0FfUG9sbCgwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglEaXNwbGF5RGliCShESVNQRElCLjEpCiAqCiAqICBEaXNhYmxlcyBHREkgYW5kIHRha2VzIG92ZXIgdGhlIFZHQSBzY3JlZW4gdG8gc2hvdyBESUJzIGluIGZ1bGwgc2NyZWVuLgogKgogKiBGTEFHUwogKgogKiAgRElTUExBWURJQl9OT1BBTEVUVEU6IGRvbid0IGNoYW5nZSBwYWxldHRlCiAqICBESVNQTEFZRElCX05PQ0VOVEVSOiBkb24ndCBjZW50ZXIgYml0bWFwCiAqICBESVNQTEFZRElCX05PV0FJVDogZG9uJ3Qgd2FpdCAoZm9yIGtleXByZXNzKSBiZWZvcmUgcmV0dXJuaW5nCiAqICBESVNQTEFZRElCX0JFR0lOOiBzdGFydCBvZiBtdWx0aXBsZSBjYWxscyAoZG9lcyBub3QgcmVzdG9yZSB0aGUgc2NyZWVuKQogKiAgRElTUExBWURJQl9FTkQ6IGVuZCBvZiBtdWx0aXBsZSBjYWxscyAocmVzdG9yZXMgdGhlIHNjcmVlbikKICogIERJU1BMQVlESUJfTU9ERV9ERUZBVUxUOiBkZWZhdWx0IGRpc3BsYXkgbW9kZQogKiAgRElTUExBWURJQl9NT0RFXzMyMHgyMDB4ODogU3RhbmRhcmQgVkdBIDMyMHgyMDAgMjU2IGNvbG9ycwogKiAgRElTUExBWURJQl9NT0RFXzMyMHgyNDB4ODogVHdlYWtlZCBWR0EgMzIweDI0MCAyNTYgY29sb3JzCiAqCiAqIFJFVFVSTlMKICoKICogIERJU1BMQVlESUJfTk9FUlJPUjogc3VjY2VzcwogKiAgRElTUExBWURJQl9OT1RTVVBQT1JURUQ6IGZ1bmN0aW9uIG5vdCBzdXBwb3J0ZWQKICogIERJU1BMQVlESUJfSU5WQUxJRERJQjogbnVsbCBvciBpbnZhbGlkIERJQiBoZWFkZXIKICogIERJU1BMQVlESUJfSU5WQUxJREZPUk1BVDogaW52YWxpZCBESUIgZm9ybWF0CiAqICBESVNQTEFZRElCX0lOVkFMSURUQVNLOiBub3QgY2FsbGVkIGZyb20gY3VycmVudCB0YXNrCiAqCiAqIEJVR1MKICoKICogIFdhaXRpbmcgZm9yIGtleXByZXNzZXMgaXMgbm90IGltcGxlbWVudGVkLgogKi8KV09SRCBXSU5BUEkgRGlzcGxheURpYigKCQlMUEJJVE1BUElORk8gbHBiaSwgLyogRElCIGhlYWRlciB3aXRoIHJlc29sdXRpb24gYW5kIHBhbGV0dGUgKi8KCQlMUFNUUiBscEJpdHMsIC8qIEJpdG1hcCBiaXRzIHRvIHNob3cgKi8KCQlXT1JEIHdGbGFncwoJKQp7CiAgICBXT1JEIHJldDsKCiAgICBpZiAod0ZsYWdzJkRJU1BMQVlESUJfRU5EKSB7CiAgICAgICAgaWYgKGRpc3BkaWJfbXVsdGkpIERJU1BESUJfRW5kKCk7CiAgICAgICAgZGlzcGRpYl9tdWx0aSA9IDA7CiAgICAgICAgcmV0dXJuIERJU1BMQVlESUJfTk9FUlJPUjsKICAgIH0KICAgIGlmICghZGlzcGRpYl9tdWx0aSkgewogICAgICAgIHJldD1ESVNQRElCX0JlZ2luKHdGbGFncyk7CiAgICAgICAgaWYgKHJldCkgcmV0dXJuIHJldDsKICAgIH0KICAgIGlmICh3RmxhZ3MmRElTUExBWURJQl9CRUdJTikgZGlzcGRpYl9tdWx0aSA9IDE7CiAgICBpZiAoISh3RmxhZ3MmRElTUExBWURJQl9OT1BBTEVUVEUpKSB7CiAgICAgICAgRElTUERJQl9QYWxldHRlKGxwYmkpOwogICAgfQogICAgLyogRklYTUU6IG5vdCBzdXJlIGlmIGl0J3MgdmFsaWQgdG8gZHJhdyBpbWFnZXMgaW4gRElTUExBWURJQl9CRUdJTiwgc28uLi4gKi8KICAgIGlmIChscEJpdHMpIHsKICAgICAgICBESVNQRElCX1Nob3coJihscGJpLT5ibWlIZWFkZXIpLGxwQml0cyx3RmxhZ3MpOwogICAgfQogICAgaWYgKCEod0ZsYWdzJkRJU1BMQVlESUJfTk9XQUlUKSkgewogICAgICAgIEZJWE1FKCJ3YWl0IG5vdCBpbXBsZW1lbnRlZFxuIik7CiAgICB9CiAgICBpZiAoIWRpc3BkaWJfbXVsdGkpIERJU1BESUJfRW5kKCk7CiAgICByZXR1cm4gRElTUExBWURJQl9OT0VSUk9SOwp9Cg==