Ci8qIQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBcZmlsZQogKiAgICAgaWZ1bmN0aW9ucy5oCiAqCiAqICBcYnJpZWYKICogICAgIGRlZmluZSBzb21lIGlubGluZSBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCB3aXRoaW4gdGhlIGVuY29kZXIuCiAqCiAqICBcYXV0aG9yCiAqICAgICAgTWFpbiBjb250cmlidXRvcnMgKHNlZSBjb250cmlidXRvcnMuaCBmb3IgY29weXJpZ2h0LCBhZGRyZXNzIGFuZCBhZmZpbGlhdGlvbiBkZXRhaWxzKQogKiAgICAgIC0gS2Fyc3RlbiBT/GhyaW5nICAgICAgICAgICAgICAgICA8c3VlaHJpbmdAaGhpLmRlPgogKiAgICAgIC0gQWxleGlzIFRvdXJhcGlzICAgICAgICAgICAgICAgICA8YWxleGlzbXRAaWVlZS5vcmc+CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCiNpZm5kZWYgX0lGVU5DVElPTlNfSF8KI2RlZmluZSBfSUZVTkNUSU9OU19IXwoKc3RhdGljIGlubGluZSBpbnQgaW1pbihpbnQgYSwgaW50IGIpCnsKICByZXR1cm4gKChhKSA8IChiKSkgPyAoYSkgOiAoYik7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGltYXgoaW50IGEsIGludCBiKQp7CiAgcmV0dXJuICgoYSkgPiAoYikpID8gKGEpIDogKGIpOwp9CgpzdGF0aWMgaW5saW5lIGRvdWJsZSBkbWluKGRvdWJsZSBhLCBkb3VibGUgYikKewogIHJldHVybiAoKGEpIDwgKGIpKSA/IChhKSA6IChiKTsKfQoKc3RhdGljIGlubGluZSBkb3VibGUgZG1heChkb3VibGUgYSwgZG91YmxlIGIpCnsKICByZXR1cm4gKChhKSA+IChiKSkgPyAoYSkgOiAoYik7Cn0KCnN0YXRpYyBpbmxpbmUgaW50NjQgaTY0bWluKGludDY0IGEsIGludDY0IGIpCnsKICByZXR1cm4gKChhKSA8IChiKSkgPyAoYSkgOiAoYik7Cn0KCnN0YXRpYyBpbmxpbmUgaW50NjQgaTY0bWF4KGludDY0IGEsIGludDY0IGIpCnsKICByZXR1cm4gKChhKSA+IChiKSkgPyAoYSkgOiAoYik7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGlhYnMoaW50IHgpCnsKICByZXR1cm4gKCh4KSA8IDApID8gLSh4KSA6ICh4KTsKfQoKc3RhdGljIGlubGluZSBkb3VibGUgZGFicyhkb3VibGUgeCkKewogIHJldHVybiAoKHgpIDwgMCkgPyAtKHgpIDogKHgpOwp9CgpzdGF0aWMgaW5saW5lIGludCBpc2lnbihpbnQgeCkKewogIHJldHVybiAoKHgpIDwgMCkgPyAtMSA6IDE7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGlzaWduYWIoaW50IGEsIGludCBiKQp7CiAgcmV0dXJuICgoYikgPCAwKSA/IC1pYWJzKGEpIDogaWFicyhhKTsKfQoKc3RhdGljIGlubGluZSBpbnQgcnNoaWZ0X3JuZChpbnQgeCwgaW50IGEpCnsKICByZXR1cm4gKGEgPiAwKSA/ICgoeCArICgxIDw8IChhLTEpICkpID4+IGEpIDogKHggPDwgKC1hKSk7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJzaGlmdF9ybmRfdXModW5zaWduZWQgaW50IHgsIHVuc2lnbmVkIGludCBhKQp7CiAgcmV0dXJuIChhID4gMCkgPyAoKHggKyAoMSA8PCAoYS0xKSkpID4+IGEpIDogeDsKfQoKc3RhdGljIGlubGluZSBpbnQgcnNoaWZ0X3JuZF9zZihpbnQgeCwgaW50IGEpCnsKICByZXR1cm4gKCh4ICsgKDEgPDwgKGEtMSkgKSkgPj4gYSk7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJzaGlmdF9ybmRfdXNfc2YodW5zaWduZWQgaW50IHgsIHVuc2lnbmVkIGludCBhKQp7CiAgcmV0dXJuICgoeCArICgxIDw8IChhLTEpKSkgPj4gYSk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGlDbGlwMShpbnQgaGlnaCwgaW50IHgpCnsKICB4ID0gaW1heCh4LCAwKTsKICB4ID0gaW1pbih4LCBoaWdoKTsKCiAgcmV0dXJuIHg7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGlDbGlwMyhpbnQgbG93LCBpbnQgaGlnaCwgaW50IHgpCnsKICB4ID0gaW1heCh4LCBsb3cpOwogIHggPSBpbWluKHgsIGhpZ2gpOwoKICByZXR1cm4geDsKfQoKc3RhdGljIGlubGluZSBkb3VibGUgZENsaXAzKGRvdWJsZSBsb3csIGRvdWJsZSBoaWdoLCBkb3VibGUgeCkKewogIHggPSBkbWF4KHgsIGxvdyk7CiAgeCA9IGRtaW4oeCwgaGlnaCk7CgogIHJldHVybiB4Owp9CgpzdGF0aWMgaW5saW5lIGludCB3ZWlnaHRlZF9jb3N0KGludCBmYWN0b3IsIGludCBiaXRzKQp7CiAgcmV0dXJuICgoKGZhY3RvcikqKGJpdHMpKT4+TEFNQkRBX0FDQ1VSQUNZX0JJVFMpOwp9CgpzdGF0aWMgaW5saW5lIGludCBSU0QoaW50IHgpCnsKIHJldHVybiAoKHgmMik/KHh8MSk6KHgmKH4xKSkpOwp9CgojZW5kaWYKCg==