LyoKICogRElTUERJQi5kbGwKICogCiAqIENvcHlyaWdodCAxOTk4IE92ZSBL5XZlbiAod2l0aCBzb21lIGhlbHAgZnJvbSBNYXJjdXMgTWVpc3NuZXIpCiAqCiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbmUvd2luZ2RpMTYuaCIKI2luY2x1ZGUgImRpc3BkaWIuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7CgojaWYgMAoKc3RhdGljIGludCBkaXNwZGliX211bHRpID0gMDsKCnN0YXRpYyBXT1JEIERJU1BESUJfQmVnaW4oV09SRCB3RmxhZ3MpCnsKICAgIHVuc2lnbmVkIFhyZXMsWXJlcyxEZXB0aDsKCiAgICBzd2l0Y2god0ZsYWdzJkRJU1BMQVlESUJfTU9ERSkgewogICAgICAgIGNhc2UgRElTUExBWURJQl9NT0RFX0RFRkFVTFQ6CiAgICAgICAgICAgIC8qIEZJWE1FOiBpcyB0aGlzIHN1cHBvc2VkIHRvIGF1dG9kZXRlY3Q/ICovCiAgICAgICAgY2FzZSBESVNQTEFZRElCX01PREVfMzIweDIwMHg4OgogICAgICAgICAgICBYcmVzPTMyMDsgWXJlcz0yMDA7IERlcHRoPTg7IGJyZWFrOwogICAgICAgIGNhc2UgRElTUExBWURJQl9NT0RFXzMyMHgyNDB4ODoKICAgICAgICAgICAgWHJlcz0zMjA7IFlyZXM9MjQwOyBEZXB0aD04OyBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gRElTUExBWURJQl9OT1RTVVBQT1JURUQ7CiAgICB9CiAgICAvKiBtb3JlIG9yIGxlc3MgZHVtbXkgY2FsbHMgdG8gRGVhdGgvUmVzdXJyZWN0aW9uLCBmb3IgY29tcGxldGVuZXNzICovCiAgICAvKiBGSVhNRTogd2hhdCBhcmd1bWVudHMgc2hvdWxkIHRoZXkgZ2V0PyAqLwogICAgRGVhdGgxNigwKTsKICAgIGlmIChWR0FfU2V0TW9kZShYcmVzLFlyZXMsRGVwdGgpKSB7CiAgICAgICAgIFJlc3VycmVjdGlvbjE2KDAsMCwwLDAsMCwwLDApOwogICAgICAgICByZXR1cm4gRElTUExBWURJQl9OT1RTVVBQT1JURUQ7CiAgICB9CiAgICByZXR1cm4gRElTUExBWURJQl9OT0VSUk9SOwp9CgpzdGF0aWMgdm9pZCBESVNQRElCX0VuZCh2b2lkKQp7CiAgICBSZXN1cnJlY3Rpb24xNigwLDAsMCwwLDAsMCwwKTsgLyogRklYTUU6IGFyZ3VtZW50cyAqLwogICAgVkdBX0V4aXQoKTsKfQoKc3RhdGljIHZvaWQgRElTUERJQl9QYWxldHRlKExQQklUTUFQSU5GTyBscGJpKQp7CiAgICBWR0FfU2V0UXVhZFBhbGV0dGUobHBiaS0+Ym1pQ29sb3JzLDAsMjU2KTsKfQoKc3RhdGljIHZvaWQgRElTUERJQl9TaG93KExQQklUTUFQSU5GT0hFQURFUiBscGJpLExQU1RSIGxwQml0cyxXT1JEIHVGbGFncykKewogICAgaW50IFhvZnMsWW9mcyxXaWR0aD1scGJpLT5iaVdpZHRoLEhlaWdodD1scGJpLT5iaUhlaWdodCxEZWx0YTsKICAgIGludCBQaXRjaCA9IChXaWR0aCArIDMpICYgfjM7CiAgICB1bnNpZ25lZCBpbnQgc1BpdGNoLHNXaWR0aCxzSGVpZ2h0OwogICAgTFBTVFIgc3VyZiA9IERPU01FTV9NYXBEb3NUb0xpbmVhcigweGEwMDAwKTsKCiAgICBpZiAoVkdBX0dldE1vZGUoJnNIZWlnaHQsJnNXaWR0aCxOVUxMKSkgcmV0dXJuOwogICAgc1BpdGNoPTMyMDsKCiAgICBEZWx0YT0oSGVpZ2h0PDApKjItMTsKICAgIEhlaWdodCo9LURlbHRhOyBQaXRjaCo9RGVsdGE7CgogICAgaWYgKHVGbGFncyZESVNQTEFZRElCX05PQ0VOVEVSKSB7CiAgICAgICAgWG9mcz0wOyBZb2ZzPTA7CiAgICB9IGVsc2UgewogICAgICAgIFhvZnM9KHNXaWR0aC1XaWR0aCkvMjsKICAgICAgICBZb2ZzPShzSGVpZ2h0LUhlaWdodCkvMjsKICAgIH0KICAgIHN1cmYgKz0gKFlvZnMqc1BpdGNoKStYb2ZzOwogICAgaWYgKFBpdGNoPDApIGxwQml0cy09UGl0Y2gqKEhlaWdodC0xKTsKICAgIGZvciAoOyBIZWlnaHQ7IEhlaWdodC0tLGxwQml0cys9UGl0Y2gsc3VyZis9c1BpdGNoKSB7CiAgICAgICAgbWVtY3B5KHN1cmYsbHBCaXRzLFdpZHRoKTsKICAgIH0KCiAgICBWR0FfUG9sbCgwKTsKfQojZW5kaWYKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCURpc3BsYXlEaWIJKERJU1BESUIuMSkKICoKICogIERpc2FibGVzIEdESSBhbmQgdGFrZXMgb3ZlciB0aGUgVkdBIHNjcmVlbiB0byBzaG93IERJQnMgaW4gZnVsbCBzY3JlZW4uCiAqCiAqIEZMQUdTCiAqCiAqICBESVNQTEFZRElCX05PUEFMRVRURTogZG9uJ3QgY2hhbmdlIHBhbGV0dGUKICogIERJU1BMQVlESUJfTk9DRU5URVI6IGRvbid0IGNlbnRlciBiaXRtYXAKICogIERJU1BMQVlESUJfTk9XQUlUOiBkb24ndCB3YWl0IChmb3Iga2V5cHJlc3MpIGJlZm9yZSByZXR1cm5pbmcKICogIERJU1BMQVlESUJfQkVHSU46IHN0YXJ0IG9mIG11bHRpcGxlIGNhbGxzIChkb2VzIG5vdCByZXN0b3JlIHRoZSBzY3JlZW4pCiAqICBESVNQTEFZRElCX0VORDogZW5kIG9mIG11bHRpcGxlIGNhbGxzIChyZXN0b3JlcyB0aGUgc2NyZWVuKQogKiAgRElTUExBWURJQl9NT0RFX0RFRkFVTFQ6IGRlZmF1bHQgZGlzcGxheSBtb2RlCiAqICBESVNQTEFZRElCX01PREVfMzIweDIwMHg4OiBTdGFuZGFyZCBWR0EgMzIweDIwMCAyNTYgY29sb3JzCiAqICBESVNQTEFZRElCX01PREVfMzIweDI0MHg4OiBUd2Vha2VkIFZHQSAzMjB4MjQwIDI1NiBjb2xvcnMKICoKICogUkVUVVJOUwogKgogKiAgRElTUExBWURJQl9OT0VSUk9SOiBzdWNjZXNzCiAqICBESVNQTEFZRElCX05PVFNVUFBPUlRFRDogZnVuY3Rpb24gbm90IHN1cHBvcnRlZAogKiAgRElTUExBWURJQl9JTlZBTElERElCOiBudWxsIG9yIGludmFsaWQgRElCIGhlYWRlcgogKiAgRElTUExBWURJQl9JTlZBTElERk9STUFUOiBpbnZhbGlkIERJQiBmb3JtYXQKICogIERJU1BMQVlESUJfSU5WQUxJRFRBU0s6IG5vdCBjYWxsZWQgZnJvbSBjdXJyZW50IHRhc2sKICoKICogQlVHUwogKgogKiAgV2FpdGluZyBmb3Iga2V5cHJlc3NlcyBpcyBub3QgaW1wbGVtZW50ZWQuCiAqLwpXT1JEIFdJTkFQSSBEaXNwbGF5RGliKAoJCUxQQklUTUFQSU5GTyBscGJpLCAvKiBbaW5dIERJQiBoZWFkZXIgd2l0aCByZXNvbHV0aW9uIGFuZCBwYWxldHRlICovCgkJTFBTVFIgbHBCaXRzLCAgICAgIC8qIFtpbl0gQml0bWFwIGJpdHMgdG8gc2hvdyAqLwoJCVdPUkQgd0ZsYWdzICAgICAgICAvKiBbaW5dICovCgkpCnsKI2lmIDAKICAgIFdPUkQgcmV0OwoKICAgIGlmICh3RmxhZ3MmRElTUExBWURJQl9FTkQpIHsKICAgICAgICBpZiAoZGlzcGRpYl9tdWx0aSkgRElTUERJQl9FbmQoKTsKICAgICAgICBkaXNwZGliX211bHRpID0gMDsKICAgICAgICByZXR1cm4gRElTUExBWURJQl9OT0VSUk9SOwogICAgfQogICAgaWYgKCFkaXNwZGliX211bHRpKSB7CiAgICAgICAgcmV0PURJU1BESUJfQmVnaW4od0ZsYWdzKTsKICAgICAgICBpZiAocmV0KSByZXR1cm4gcmV0OwogICAgfQogICAgaWYgKHdGbGFncyZESVNQTEFZRElCX0JFR0lOKSBkaXNwZGliX211bHRpID0gMTsKICAgIGlmICghKHdGbGFncyZESVNQTEFZRElCX05PUEFMRVRURSkpIHsKICAgICAgICBESVNQRElCX1BhbGV0dGUobHBiaSk7CiAgICB9CiAgICAvKiBGSVhNRTogbm90IHN1cmUgaWYgaXQncyB2YWxpZCB0byBkcmF3IGltYWdlcyBpbiBESVNQTEFZRElCX0JFR0lOLCBzby4uLiAqLwogICAgaWYgKGxwQml0cykgewogICAgICAgIERJU1BESUJfU2hvdygmKGxwYmktPmJtaUhlYWRlciksbHBCaXRzLHdGbGFncyk7CiAgICB9CiAgICBpZiAoISh3RmxhZ3MmRElTUExBWURJQl9OT1dBSVQpKSB7CiAgICAgICAgRklYTUUoIndhaXQgbm90IGltcGxlbWVudGVkXG4iKTsKICAgIH0KICAgIGlmICghZGlzcGRpYl9tdWx0aSkgRElTUERJQl9FbmQoKTsKI2VuZGlmCiAgICBGSVhNRSggImJyb2tlbiwgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBkZHJhd1xuIiApOwogICAgcmV0dXJuIERJU1BMQVlESUJfTk9FUlJPUjsKfQo=