LyoKCXRveSB2bQoJcmVnaXN0ZXIgQSwgQiA6IDMyYml0CglQQyA6IHByb2dyYW0gY291bnRlcgoKCW1lbV8gIDRieXRlIHggNjU1MzYKCgmkuaTZpMakzsy/zuGkzzRieXRluMfE6goJwqjDzaTPwbSkxjE2Yml0CgoJUiA9IEEgb3IgQgoJdmxkaVIsIGltbSAgOyBSID0gaW1tCgl2bGRSLCBpZHggICA7IFIgPSBtZW1fW2lkeF0KCXZzdFIsIGlkeCAgIDsgbWVtX1tpZHhdID0gUgoJdmFkZGlSLCBpbW0gOyBSICs9IGltbQoJdnN1YmlSLCBpbW0gOyBSIC09IGltbQoJdmFkZFIsIGlkeCAgOyBSICs9IG1lbV9baWR4XQoJdnN1YlIsIGlkeCAgOyBSIC09IG1lbV9baWR4XQoJdnB1dFIgICAgICAgOyBwcmludCBSCgl2am56Uiwgb2Zmc2V0OyBpZiAoUiAhPSAwKSB0aGVuIGptcChQQyArPSBvZmZzZXQoc2lnbmVkKSkKKi8KI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA8PSAxMjAwKQoJI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDUxNCkKCSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ3ODYpCiNlbmRpZgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bWVtb3J5Lmg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNkZWZpbmUgWEJZQUtfTk9fT1BfTkFNRVMKI2luY2x1ZGUgInhieWFrL3hieWFrLmgiCiNpbmNsdWRlICJ4Ynlhay94Ynlha191dGlsLmgiCiNkZWZpbmUgTlVNX09GX0FSUkFZKHgpIChzaXplb2YoeCkgLyBzaXplb2YoeFswXSkpCgojaWZkZWYgWEJZQUs2NAoJI2Vycm9yICJvbmx5IDMyYml0IgojZW5kaWYKCnVzaW5nIG5hbWVzcGFjZSBYYnlhazsKCmNsYXNzIFRveVZtIDogcHVibGljIFhieWFrOjpDb2RlR2VuZXJhdG9yIHsKCXR5cGVkZWYgc3RkOjp2ZWN0b3I8dWludDMyPiBCdWZmZXI7CnB1YmxpYzoKCWVudW0gUmVnIHsKCQlBLCBCCgl9OwoJZW51bSBDb2RlIHsKCQlMRCwgTERJLCBTVCwgQURELCBBRERJLCBTVUIsIFNVQkksIFBVVCwgSk5aLAoJCUVORF9PRl9DT0RFCgl9OwoJVG95Vm0oKQoJCSA6IG1hcmtfKDApCgl7CgkJOjptZW1zZXQobWVtXywgMCwgc2l6ZW9mKG1lbV8pKTsKCX0KCXZvaWQgdmxkaShSZWcgciwgdWludDE2IGltbSkgeyBlbmNvZGUoTERJLCByLCBpbW0pOyB9Cgl2b2lkIHZsZChSZWcgciwgdWludDE2IGlkeCkgeyBlbmNvZGUoTEQsIHIsIGlkeCk7IH0KCXZvaWQgdnN0KFJlZyByLCB1aW50MTYgaWR4KSB7IGVuY29kZShTVCwgciwgaWR4KTsgfQoJdm9pZCB2YWRkKFJlZyByLCB1aW50MTYgaWR4KSB7IGVuY29kZShBREQsIHIsIGlkeCk7IH0KCXZvaWQgdmFkZGkoUmVnIHIsIHVpbnQxNiBpbW0pIHsgZW5jb2RlKEFEREksIHIsIGltbSk7IH0KCXZvaWQgdnN1YihSZWcgciwgdWludDE2IGlkeCkgeyBlbmNvZGUoU1VCLCByLCBpZHgpOyB9Cgl2b2lkIHZzdWJpKFJlZyByLCB1aW50MTYgaW1tKSB7IGVuY29kZShTVUJJLCByLCBpbW0pOyB9Cgl2b2lkIHZqbnooUmVnIHIsIGludCBvZmZzZXQpIHsgZW5jb2RlKEpOWiwgciwgc3RhdGljX2Nhc3Q8dWludDE2PihvZmZzZXQpKTsgfQoJdm9pZCB2cHV0KFJlZyByKSB7IGVuY29kZShQVVQsIHIpOyB9Cgl2b2lkIHNldE1hcmsoKQoJewoJCW1hcmtfID0gKGludCljb2RlXy5zaXplKCk7Cgl9CglpbnQgZ2V0TWFya09mZnNldCgpCgl7CgkJcmV0dXJuIG1hcmtfIC0gKGludCljb2RlXy5zaXplKCkgLSAxOwoJfQoJdm9pZCBydW4oKQoJewoJCWJvb2wgZGVidWcgPSBmYWxzZTsvL3RydWU7CgkJdWludDMyIHJlZ1syXSA9IHsgMCwgMCB9OwoJCWNvbnN0IHNpemVfdCBlbmQgPSBjb2RlXy5zaXplKCk7CgkJdWludDMyIHBjID0gMDsKCQlmb3IgKDs7KSB7CgkJCXVpbnQzMiB4ID0gY29kZV9bcGNdOwoJCQl1aW50MzIgY29kZSwgciwgaW1tOwoJCQlkZWNvZGUoY29kZSwgciwgaW1tLCB4KTsKCQkJaWYgKGRlYnVnKSB7CgkJCQlwcmludGYoIi0tLVxuIik7CgkJCQlwcmludGYoIkEgJTA4eCBCICUwOHhcbiIsIHJlZ1swXSwgcmVnWzFdKTsKCQkJCXByaW50ZigibWVtX1tdID0gJTA4eCAlMDh4ICUwOHhcbiIsIG1lbV9bMF0sIG1lbV9bMV0sIG1lbV9bMl0pOwoJCQkJcHJpbnRmKCJwYz0lNGQsIGNvZGU9JTAyeCwgcj0lZCwgaW1tPSUwNHhcbiIsIHBjLCBjb2RlLCByLCBpbW0pOwoJCQl9CgkJCXN3aXRjaCAoY29kZSkgewoJCQljYXNlIExESToKCQkJCXJlZ1tyXSA9IGltbTsKCQkJCWJyZWFrOwoJCQljYXNlIExEOgoJCQkJcmVnW3JdID0gbWVtX1tpbW1dOwoJCQkJYnJlYWs7CgkJCWNhc2UgU1Q6CgkJCQltZW1fW2ltbV0gPSByZWdbcl07CgkJCQlicmVhazsKCQkJY2FzZSBBREQ6CgkJCQlyZWdbcl0gKz0gbWVtX1tpbW1dOwoJCQkJYnJlYWs7CgkJCWNhc2UgQURESToKCQkJCXJlZ1tyXSArPSBpbW07CgkJCQlicmVhazsKCQkJY2FzZSBTVUI6CgkJCQlyZWdbcl0gLT0gbWVtX1tpbW1dOwoJCQkJYnJlYWs7CgkJCWNhc2UgU1VCSToKCQkJCXJlZ1tyXSAtPSBpbW07CgkJCQlicmVhazsKCQkJY2FzZSBQVVQ6CgkJCQlwcmludGYoIiVjICU4ZCgweCUwOHgpXG4iLCAnQScgKyByLCByZWdbcl0sIHJlZ1tyXSk7CgkJCQlicmVhazsKCQkJY2FzZSBKTlo6CgkJCQlpZiAocmVnW3JdICE9IDApIHBjICs9IHN0YXRpY19jYXN0PHNpZ25lZCBzaG9ydD4oaW1tKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJYXNzZXJ0KDApOwoJCQkJYnJlYWs7CgkJCX0KCQkJcGMrKzsKCQkJaWYgKHBjID49IGVuZCkgYnJlYWs7CgkJfSAvLyBmb3IgKDs7KQoJfQoJdm9pZCByZWNvbXBpbGUoKQoJewoJCXVzaW5nIG5hbWVzcGFjZSBYYnlhazsKCQkvKgoJCQllc2kgOiBBCgkJCWVkaSA6IEIKCQkJZWJ4IDogbWVtXwoJCQlmb3Igc3BlZWQgdXAKCQkJbWVtX1swXSA6IGVheAoJCQltZW1fWzFdIDogZWN4CgkJCW1lbV9bMl0gOiBlZHgKCQkqLwoJCXB1c2goZWJ4KTsKCQlwdXNoKGVzaSk7CgkJcHVzaChlZGkpOwoKCQljb25zdCBSZWczMiByZWdbMl0gPSB7IGVzaSwgZWRpIH07CgkJY29uc3QgUmVnMzIgbWVtKGVieCk7CgoJCWNvbnN0IFJlZzMyIG1lbVRibFtdID0geyBlYXgsIGVjeCwgZWR4IH07CgkJY29uc3Qgc2l6ZV90IG1lbVRibE51bSA9IE5VTV9PRl9BUlJBWShtZW1UYmwpOwoJCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVtVGJsTnVtOyBpKyspIHhvcl8obWVtVGJsW2ldLCBtZW1UYmxbaV0pOwoKCQl4b3JfKGVzaSwgZXNpKTsKCQl4b3JfKGVkaSwgZWRpKTsKCQltb3YobWVtLCAoc2l6ZV90KW1lbV8pOwoJCWNvbnN0IHNpemVfdCBlbmQgPSBjb2RlXy5zaXplKCk7CgkJdWludDMyIHBjID0gMDsKCQl1aW50MzIgbGFiZWxOdW0gPSAwOwoJCWZvciAoOzspIHsKCQkJdWludDMyIHggPSBjb2RlX1twY107CgkJCXVpbnQzMiBjb2RlLCByLCBpbW07CgkJCWRlY29kZShjb2RlLCByLCBpbW0sIHgpOwoJCUwoTGFiZWw6OnRvU3RyKGxhYmVsTnVtKyspKTsKCQkJc3dpdGNoIChjb2RlKSB7CgkJCWNhc2UgTERJOgoJCQkJbW92KHJlZ1tyXSwgaW1tKTsKCQkJCWJyZWFrOwoJCQljYXNlIExEOgoJCQkJaWYgKGltbSA8IG1lbVRibE51bSkgewoJCQkJCW1vdihyZWdbcl0sIG1lbVRibFtpbW1dKTsKCQkJCX0gZWxzZSB7CgkJCQkJbW92KHJlZ1tyXSwgcHRyW21lbSArIGltbSAqIDRdKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlIFNUOgoJCQkJaWYgKGltbSA8IG1lbVRibE51bSkgewoJCQkJCW1vdihtZW1UYmxbaW1tXSwgcmVnW3JdKTsKCQkJCX0gZWxzZSB7CgkJCQkJbW92KHB0ciBbbWVtICsgaW1tICogNF0sIHJlZ1tyXSk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSBBREQ6CgkJCQlpZiAoaW1tIDwgbWVtVGJsTnVtKSB7CgkJCQkJYWRkKHJlZ1tyXSwgbWVtVGJsW2ltbV0pOwoJCQkJfSBlbHNlIHsKCQkJCQlhZGQocmVnW3JdLCBwdHIgW21lbSArIGltbSAqIDRdKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlIEFEREk6CgkJCQlhZGQocmVnW3JdLCBpbW0pOwoJCQkJYnJlYWs7CgkJCWNhc2UgU1VCOgoJCQkJaWYgKGltbSA8IG1lbVRibE51bSkgewoJCQkJCXN1YihyZWdbcl0sIG1lbVRibFtpbW1dKTsKCQkJCX0gZWxzZSB7CgkJCQkJc3ViKHJlZ1tyXSwgcHRyIFttZW0gKyBpbW0gKiA0XSk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSBTVUJJOgoJCQkJc3ViKHJlZ1tyXSwgaW1tKTsKCQkJCWJyZWFrOwoJCQljYXNlIFBVVDoKCQkJCXsKCQkJCQlzdGF0aWMgY29uc3QgY2hhciAqc3RyID0gIiVjICU4ZCgweCUwOHgpXG4iOwoJCQkJCXB1c2goZWF4KTsKCQkJCQlwdXNoKGVkeCk7CgkJCQkJcHVzaChlY3gpOwoJCQkJCXB1c2gocmVnW3JdKTsKCQkJCQlwdXNoKHJlZ1tyXSk7CgkJCQkJcHVzaCgnQScgKyByKTsKCQkJCQlwdXNoKChpbnQpc3RyKTsKCQkJCQljYWxsKFhieWFrOjpDYXN0VG88dm9pZCo+KHByaW50ZikpOwoJCQkJCWFkZChlc3AsIDQgKiA0KTsKCQkJCQlwb3AoZWN4KTsKCQkJCQlwb3AoZWR4KTsKCQkJCQlwb3AoZWF4KTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlIEpOWjoKCQkJCXRlc3QocmVnW3JdLCByZWdbcl0pOwoJCQkJam56KExhYmVsOjp0b1N0cihsYWJlbE51bSArIHN0YXRpY19jYXN0PHNpZ25lZCBzaG9ydD4oaW1tKSkpOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlhc3NlcnQoMCk7CgkJCQlicmVhazsKCQkJfQoJCQlwYysrOwoJCQlpZiAocGMgPj0gZW5kKSBicmVhazsKCQl9IC8vIGZvciAoOzspCgoJCXBvcChlZGkpOwoJCXBvcChlc2kpOwoJCXBvcChlYngpOwoJCXJldCgpOwoJfQpwcml2YXRlOgoJdWludDMyIG1lbV9bNjU1MzZdOwoJQnVmZmVyIGNvZGVfOwoJaW50IG1hcmtfOwoJdm9pZCBkZWNvZGUodWludDMyJiBjb2RlLCB1aW50MzImIHIsIHVpbnQzMiYgaW1tLCB1aW50MzIgeCkKCXsKCQljb2RlID0geCA+PiAyNDsKCQlyID0gKHggPj4gMTYpICYgMHhmZjsKCQlpbW0gPSB4ICYgMHhmZmZmOwoJfQoJdm9pZCBlbmNvZGUoQ29kZSBjb2RlLCBSZWcgciwgdWludDE2IGltbSA9IDApCgl7CgkJdWludDMyIHggPSAoY29kZSA8PCAyNCkgfCAociA8PCAxNikgfCBpbW07CgkJY29kZV8ucHVzaF9iYWNrKHgpOwoJfQp9OwoKY2xhc3MgRmliIDogcHVibGljIFRveVZtIHsKcHVibGljOgoJRmliKGludCBuKQoJewoJCWlmIChuID49IDY1NTM2KSB7CgkJCWZwcmludGYoc3RkZXJyLCAiY3VycmVudCB2ZXJzaW9uIHN1cHBvcnQgb25seSBpbW0xNlxuIik7CgkJCXJldHVybjsKCQl9CgkJLyoKCQkJQSA6IGMKCQkJQiA6IHRlbXBvcmFyeQoJCQltZW1fWzBdIDogcAoJCQltZW1fWzFdIDogdAoJCQltZW1fWzJdIDogbgoJCSovCgkJdmxkaShBLCAxKTsgLy8gYwoJCXZzdChBLCAwKTsgLy8gcCgxKQoJCXZsZGkoQiwgc3RhdGljX2Nhc3Q8dWludDE2PihuKSk7CgkJdnN0KEIsIDIpOyAvLyBuCgkJLy8gbHAKCXNldE1hcmsoKTsKCQl2c3QoQSwgMSk7IC8vIHQgPSBjCgkJdmFkZChBLCAwKTsgLy8gYyArPSBwCgkJdmxkKEIsIDEpOwoJCXZzdChCLCAwKTsgLy8gcCA9IHQKLy8JCXZwdXQoQSk7CgkJdmxkKEIsIDIpOwoJCXZzdWJpKEIsIDEpOwoJCXZzdChCLCAyKTsgLy8gbi0tCgkJdmpueihCLCBnZXRNYXJrT2Zmc2V0KCkpOwoJCXZwdXQoQSk7Cgl9Cgl2b2lkIHJ1bkJ5SklUKCkKCXsKCQlnZXRDb2RlPHZvaWQgKCopKCk+KCk7Cgl9Cn07Cgp2b2lkIGZpYkModWludDMyIG4pCnsKCXVpbnQzMiBwLCBjLCB0OwoJcCA9IDE7CgljID0gMTsKbHA6Cgl0ID0gYzsKCWMgKz0gcDsKCXAgPSB0OwoJbi0tOwoJaWYgKG4gIT0gMCkgZ290byBscDsKCXByaW50ZigiYz0lZCgweCUwOHgpXG4iLCBjLCBjKTsKfQoKaW50IG1haW4oKQp7Cgl0cnkgewoJCWNvbnN0IGludCBuID0gMTAwMDA7CgkJRmliIGZpYihuKTsKCgkJZmliLnJlY29tcGlsZSgpOwoKCQl7CgkJCVhieWFrOjp1dGlsOjpDbG9jayBjbGs7CgkJCWNsay5iZWdpbigpOwoJCQlmaWIucnVuKCk7CgkJCWNsay5lbmQoKTsKCQkJcHJpbnRmKCJ2bSAgICAgICAlLjJmS2Nsa1xuIiwgY2xrLmdldENsb2NrKCkgKiAxZS0zKTsKCQl9CgoJCXsKCQkJWGJ5YWs6OnV0aWw6OkNsb2NrIGNsazsKCQkJY2xrLmJlZ2luKCk7CgkJCWZpYi5ydW5CeUpJVCgpOwoJCQljbGsuZW5kKCk7CgkJCXByaW50Zigiaml0ICAgICAgJS4yZktjbGtcbiIsIGNsay5nZXRDbG9jaygpICogMWUtMyk7CgkJfQoKCQl7CgkJCVhieWFrOjp1dGlsOjpDbG9jayBjbGs7CgkJCWNsay5iZWdpbigpOwoJCQlmaWJDKG4pOwoJCQljbGsuZW5kKCk7CgkJCXByaW50ZigibmF0aXZlIEMgJS4yZktjbGtcbiIsIGNsay5nZXRDbG9jaygpICogMWUtMyk7CgkJfQoJfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKCQlwcmludGYoIkVSUjolc1xuIiwgZS53aGF0KCkpOwoJfSBjYXRjaCAoLi4uKSB7CgkJcHJpbnRmKCJ1bmtub3duIGVycm9yXG4iKTsKCX0KCXJldHVybiAwOwp9CgovKgoJdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IFhieWFrCiAgIHB1c2ggICAgICAgIGVieAogICBwdXNoICAgICAgICBlc2kKICAgcHVzaCAgICAgICAgZWRpCiAgIHhvciAgICAgICAgIGVheCxlYXgKICAgeG9yICAgICAgICAgZWN4LGVjeAogICB4b3IgICAgICAgICBlZHgsZWR4CiAgIHhvciAgICAgICAgIGVzaSxlc2kKICAgeG9yICAgICAgICAgZWRpLGVkaQogICBtb3YgICAgICAgICBlYngsMEVGRjU4aAogICBtb3YgICAgICAgICBlc2ksMQogICBtb3YgICAgICAgICBlYXgsZXNpCiAgIG1vdiAgICAgICAgIGVkaSwyNzEwaAogICBtb3YgICAgICAgICBlZHgsZWRpCi5scDoKICAgbW92ICAgICAgICAgZWN4LGVzaQogICBhZGQgICAgICAgICBlc2ksZWF4CiAgIG1vdiAgICAgICAgIGVkaSxlY3gKICAgbW92ICAgICAgICAgZWF4LGVkaQogICBtb3YgICAgICAgICBlZGksZWR4CiAgIHN1YiAgICAgICAgIGVkaSwxCiAgIG1vdiAgICAgICAgIGVkeCxlZGkKICAgdGVzdCAgICAgICAgZWRpLGVkaQogICBqbmUgICAgICAgICAubHAKICAgcHVzaCAgICAgICAgZWF4CiAgIHB1c2ggICAgICAgIGVkeAogICBwdXNoICAgICAgICBlY3gKICAgcHVzaCAgICAgICAgZXNpCiAgIHB1c2ggICAgICAgIGVzaQogICBwdXNoICAgICAgICA0MWgKICAgcHVzaCAgICAgICAgNDJDNDM0aAogICBjYWxsICAgICAgICBwcmludGYgKDQwOTM0MmgpCiAgIGFkZCAgICAgICAgIGVzcCwxMGgKICAgcG9wICAgICAgICAgZWN4CiAgIHBvcCAgICAgICAgIGVkeAogICBwb3AgICAgICAgICBlYXgKICAgcG9wICAgICAgICAgZWRpCiAgIHBvcCAgICAgICAgIGVzaQogICBwb3AgICAgICAgICBlYngKICAgcmV0CiovCg==