LyogbWVtLmMgLS0tIG1lbW9yeSBmb3IgTTMyQyBzaW11bGF0b3IuCgpDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkNvbnRyaWJ1dGVkIGJ5IFJlZCBIYXQsIEluYy4KClRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgc2ltdWxhdG9ycy4KClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KCiNpbmNsdWRlICJtZW0uaCIKI2luY2x1ZGUgImNwdS5oIgojaW5jbHVkZSAic3lzY2FsbHMuaCIKI2luY2x1ZGUgIm1pc2MuaCIKI2lmZGVmIFRJTUVSX0EKI2luY2x1ZGUgImludC5oIgojaW5jbHVkZSAidGltZXJfYS5oIgojZW5kaWYKCiNkZWZpbmUgTDFfQklUUyAgKDEwKQojZGVmaW5lIEwyX0JJVFMgICgxMCkKI2RlZmluZSBPRkZfQklUUyAoMTIpCgojZGVmaW5lIEwxX0xFTiAgKDEgPDwgTDFfQklUUykKI2RlZmluZSBMMl9MRU4gICgxIDw8IEwyX0JJVFMpCiNkZWZpbmUgT0ZGX0xFTiAoMSA8PCBPRkZfQklUUykKCnN0YXRpYyB1bnNpZ25lZCBjaGFyICoqcHRbTDFfTEVOXTsKCmludCBtMzJjX2NvbnNvbGVfaWZkID0gMDsKaW50IG0zMmNfY29uc29sZV9vZmQgPSAxOwoKI2lmZGVmIFRJTUVSX0EKVGltZXJfQSB0aW1lcl9hOwojZW5kaWYKCi8qIFsgZ2V0PTAvcHV0PTEgXVsgYnl0ZSBzaXplIF0gKi8Kc3RhdGljIHVuc2lnbmVkIGludCBtZW1fY291bnRlcnNbMl1bNV07CgojZGVmaW5lIENPVU5UKGlzcHV0LGJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogIGlmICh2ZXJib3NlICYmIGVuYWJsZV9jb3VudGluZykgbWVtX2NvdW50ZXJzW2lzcHV0XVtieXRlc10rKwoKdm9pZAppbml0X21lbSAodm9pZCkKewogIGludCBpLCBqOwoKICBmb3IgKGkgPSAwOyBpIDwgTDFfTEVOOyBpKyspCiAgICBpZiAocHRbaV0pCiAgICAgIHsKCWZvciAoaiA9IDA7IGogPCBMMl9MRU47IGorKykKCSAgaWYgKHB0W2ldW2pdKQoJICAgIGZyZWUgKHB0W2ldW2pdKTsKCWZyZWUgKHB0W2ldKTsKICAgICAgfQogIG1lbXNldCAocHQsIDAsIHNpemVvZiAocHQpKTsKICBtZW1zZXQgKG1lbV9jb3VudGVycywgMCwgc2l6ZW9mIChtZW1fY291bnRlcnMpKTsKfQoKc3RhdGljIHVuc2lnbmVkIGNoYXIgKgptZW1fcHRyIChhZGRyZXNzKQp7CiAgc3RhdGljIGludCByZWN1cnNpbmcgPSAwOwogIGludCBwdDEgPSAoYWRkcmVzcyA+PiAoTDJfQklUUyArIE9GRl9CSVRTKSkgJiAoKDEgPDwgTDFfQklUUykgLSAxKTsKICBpbnQgcHQyID0gKGFkZHJlc3MgPj4gT0ZGX0JJVFMpICYgKCgxIDw8IEwyX0JJVFMpIC0gMSk7CiAgaW50IHB0byA9IGFkZHJlc3MgJiAoKDEgPDwgT0ZGX0JJVFMpIC0gMSk7CgogIGlmIChhZGRyZXNzID09IDAgJiYgIXJlY3Vyc2luZykKICAgIHsKICAgICAgcmVjdXJzaW5nID0gMTsKICAgICAgcHV0X3JlZyAocGMsIG0zMmNfb3Bjb2RlX3BjKTsKICAgICAgcHJpbnRmICgiTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIGF0IHBjPTB4JXhcbiIsIGdldF9yZWcgKHBjKSk7CiAgICAgIHN0ZXBfcmVzdWx0ID0gTTMyQ19NQUtFX0hJVF9CUkVBSyAoKTsKI2lmIDAKICAgICAgLyogVGhpcyBjb2RlIGNhbiBiZSByZS1lbmFibGVkIHRvIGhlbHAgZGlhZ25vc2UgTlVMTCBwb2ludGVyCiAgICAgICAgIGJ1Z3MgdGhhdCBhcmVuJ3QgZGVidWdnYWJsZSBpbiBHREIuICAqLwogICAgICBtMzJjX2R1bXBfYWxsX3JlZ2lzdGVycyAoKTsKICAgICAgZXhpdCAoMSk7CiNlbmRpZgogICAgfQoKICBpZiAocHRbcHQxXSA9PSAwKQogICAgcHRbcHQxXSA9ICh1bnNpZ25lZCBjaGFyICoqKSBjYWxsb2MgKEwyX0xFTiwgc2l6ZW9mIChjaGFyICoqKSk7CiAgaWYgKHB0W3B0MV1bcHQyXSA9PSAwKQogICAgewogICAgICBwdFtwdDFdW3B0Ml0gPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKE9GRl9MRU4pOwogICAgICBtZW1zZXQgKHB0W3B0MV1bcHQyXSwgMCwgT0ZGX0xFTik7CiAgICB9CgogIHJldHVybiBwdFtwdDFdW3B0Ml0gKyBwdG87Cn0KCnN0YXRpYyB2b2lkCnVzZWQgKGludCByc3RhcnQsIGludCBpLCBpbnQgaikKewogIGludCByZW5kID0gaSA8PCAoTDJfQklUUyArIE9GRl9CSVRTKTsKICByZW5kICs9IGogPDwgT0ZGX0JJVFM7CiAgaWYgKHJzdGFydCA9PSAweGUwMDAwICYmIHJlbmQgPT0gMHhlMTAwMCkKICAgIHJldHVybjsKICBwcmludGYgKCJtZW06ICAgJTA4eCAtICUwOHggKCVkayBieXRlcylcbiIsIHJzdGFydCwgcmVuZCAtIDEsCgkgIChyZW5kIC0gcnN0YXJ0KSAvIDEwMjQpOwp9CgpzdGF0aWMgY2hhciAqCm1jcyAoaW50IGlzcHV0LCBpbnQgYnl0ZXMpCnsKICByZXR1cm4gY29tbWEgKG1lbV9jb3VudGVyc1tpc3B1dF1bYnl0ZXNdKTsKfQoKdm9pZAptZW1fdXNhZ2Vfc3RhdHMgKCkKewogIGludCBpLCBqOwogIGludCByc3RhcnQgPSAwOwogIGludCBwZW5kaW5nID0gMDsKCiAgZm9yIChpID0gMDsgaSA8IEwxX0xFTjsgaSsrKQogICAgaWYgKHB0W2ldKQogICAgICB7Cglmb3IgKGogPSAwOyBqIDwgTDJfTEVOOyBqKyspCgkgIGlmIChwdFtpXVtqXSkKCSAgICB7CgkgICAgICBpZiAoIXBlbmRpbmcpCgkJewoJCSAgcGVuZGluZyA9IDE7CgkJICByc3RhcnQgPSAoaSA8PCAoTDJfQklUUyArIE9GRl9CSVRTKSkgKyAoaiA8PCBPRkZfQklUUyk7CgkJfQoJICAgIH0KCSAgZWxzZSBpZiAocGVuZGluZykKCSAgICB7CgkgICAgICBwZW5kaW5nID0gMDsKCSAgICAgIHVzZWQgKHJzdGFydCwgaSwgaik7CgkgICAgfQogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCWlmIChwZW5kaW5nKQoJICB7CgkgICAgcGVuZGluZyA9IDA7CgkgICAgdXNlZCAocnN0YXJ0LCBpLCAwKTsKCSAgfQogICAgICB9CiAgLyogICAgICAgbWVtIGZvbzogMTIzNDU2Nzg5MDEyIDEyMzQ1Njc4OTAxMiAxMjM0NTY3ODkwMTIgMTIzNDU2Nzg5MDEyCiAgICAgICAgICAgIDEyMzQ1Njc4OTAxMiAqLwogIHByaW50ZiAoIiAgICAgICAgICAgICAgICAgYnl0ZSAgICAgICAgc2hvcnQgICAgICBwb2ludGVyICAgICAgICAgbG9uZyIKCSAgIiAgICAgICAgZmV0Y2hcbiIpOwogIHByaW50ZiAoIm1lbSBnZXQ6ICUxMnMgJTEycyAlMTJzICUxMnMgJTEyc1xuIiwgbWNzICgwLCAxKSwgbWNzICgwLCAyKSwKCSAgbWNzICgwLCAzKSwgbWNzICgwLCA0KSwgbWNzICgwLCAwKSk7CiAgcHJpbnRmICgibWVtIHB1dDogJTEycyAlMTJzICUxMnMgJTEyc1xuIiwgbWNzICgxLCAxKSwgbWNzICgxLCAyKSwKCSAgbWNzICgxLCAzKSwgbWNzICgxLCA0KSk7Cn0KCnN0YXRpYyBpbnQgdHByID0gMDsKc3RhdGljIHZvaWQKcyAoaW50IGFkZHJlc3MsIGNoYXIgKmRpcikKewogIGlmICh0cHIgPT0gMCkKICAgIHByaW50ZiAoIk1FTVslMCp4XSAlcyIsIG1lbWJ1c19tYXNrID09IDB4ZmZmZmYgPyA1IDogNiwgYWRkcmVzcywgZGlyKTsKICB0cHIrKzsKfQoKI2RlZmluZSBTKGQpIGlmICh0cmFjZSkgcyhhZGRyZXNzLCBkKQpzdGF0aWMgdm9pZAplICgpCnsKICBpZiAoIXRyYWNlKQogICAgcmV0dXJuOwogIHRwci0tOwogIGlmICh0cHIgPT0gMCkKICAgIHByaW50ZiAoIlxuIik7Cn0KCiNkZWZpbmUgRSgpIGlmICh0cmFjZSkgZSgpCgpleHRlcm4gaW50IG0zMmNfZGlzYXNzZW1ibGU7Cgp2b2lkCm1lbV9wdXRfYnl0ZSAoaW50IGFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCnsKICB1bnNpZ25lZCBjaGFyICptOwogIGFkZHJlc3MgJj0gbWVtYnVzX21hc2s7CiAgbSA9IG1lbV9wdHIgKGFkZHJlc3MpOwogIGlmICh0cmFjZSkKICAgIHByaW50ZiAoIiAlMDJ4IiwgdmFsdWUpOwogICptID0gdmFsdWU7CiAgc3dpdGNoIChhZGRyZXNzKQogICAgewogICAgY2FzZSAweDAwZTE6CiAgICAgIHsKCXN0YXRpYyBpbnQgb2xkX2xlZCA9IC0xOwoJc3RhdGljIGNoYXIgKmxlZF9vbltdID0KCSAgeyAiXDAzM1szMW0gTyAiLCAiXDAzM1szMm0gTyAiLCAiXDAzM1szNG0gTyAiIH07CglzdGF0aWMgY2hhciAqbGVkX29mZltdID0geyAiXDAzM1swbSC3ICIsICJcMDMzWzBtILcgIiwgIlwwMzNbMG0gtyAiIH07CglpbnQgaTsKCWlmIChvbGRfbGVkICE9IHZhbHVlKQoJICB7CgkgICAgZnB1dHMgKCIgICIsIHN0ZG91dCk7CgkgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKCSAgICAgIGlmICh2YWx1ZSAmICgxIDw8IGkpKQoJCWZwdXRzIChsZWRfb2ZmW2ldLCBzdGRvdXQpOwoJICAgICAgZWxzZQoJCWZwdXRzIChsZWRfb25baV0sIHN0ZG91dCk7CgkgICAgZnB1dHMgKCJcMDMzWzBtXHIiLCBzdGRvdXQpOwoJICAgIGZmbHVzaCAoc3Rkb3V0KTsKCSAgICBvbGRfbGVkID0gdmFsdWU7CgkgIH0KICAgICAgfQogICAgICBicmVhazsKI2lmZGVmIFRJTUVSX0EKICAgICAgLyogTTMyQyBUaW1lciBBICovCiAgICBjYXNlIDB4MzQ2OgkJLyogVEEwbG93ICovCiAgICAgIHRpbWVyX2EuY291bnQgPSAodGltZXJfYS5jb3VudCAmIDB4ZmYwMCkgfCB2YWx1ZTsKICAgICAgdGltZXJfYS5yZWxvYWQgPSB0aW1lcl9hLmNvdW50OwogICAgICBicmVhazsKICAgIGNhc2UgMHgzNDc6CQkvKiBUQTBoaWdoICovCiAgICAgIHRpbWVyX2EuY291bnQgPSAodGltZXJfYS5jb3VudCAmIDB4MDBmZikgfCAodmFsdWUgPDwgOCk7CiAgICAgIHRpbWVyX2EucmVsb2FkID0gdGltZXJfYS5jb3VudDsKICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MzQwOgkJLyogVEFCU1IgKi8KICAgICAgdGltZXJfYS5ic3IgPSB2YWx1ZTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MzU2OgkJLyogVEEwTVIgKi8KICAgICAgdGltZXJfYS5tb2RlID0gdmFsdWU7CiAgICAgIGJyZWFrOwogICAgY2FzZSAweDM1ZjoJCS8qIFRDU1BSICovCiAgICAgIHRpbWVyX2EudGNzcHIgPSB2YWx1ZTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MDA2YzoJCS8qIFRBMElDICovCiAgICAgIHRpbWVyX2EuaWMgPSB2YWx1ZTsKICAgICAgYnJlYWs7CgogICAgICAvKiBSOEMgVGltZXIgUkEgKi8KICAgIGNhc2UgMHgxMDA6CQkvKiBUUkFDUiAqLwogICAgICB0aW1lcl9hLmJzciA9IHZhbHVlOwogICAgICBicmVhazsKICAgIGNhc2UgMHgxMDI6CQkvKiBUUkFNUiAqLwogICAgICB0aW1lcl9hLm1vZGUgPSB2YWx1ZTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MTA0OgkJLyogVFJBICovCiAgICAgIHRpbWVyX2EuY291bnQgPSB2YWx1ZTsKICAgICAgdGltZXJfYS5yZWxvYWQgPSB2YWx1ZTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MTAzOgkJLyogVFJBUFJFICovCiAgICAgIHRpbWVyX2EudGNzcHIgPSB2YWx1ZTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MDA1NjoJCS8qIFRBMElDICovCiAgICAgIHRpbWVyX2EuaWMgPSB2YWx1ZTsKICAgICAgYnJlYWs7CiNlbmRpZgoKICAgIGNhc2UgMHgyZWE6CQkvKiBtMzJjIHVhcnQxdHggKi8KICAgIGNhc2UgMHgzYWE6CQkvKiBtMTZjIHVhcnQxdHggKi8KICAgICAgewoJc3RhdGljIGludCBwZW5kaW5nX2V4aXQgPSAwOwoJaWYgKHZhbHVlID09IDApCgkgIHsKCSAgICBpZiAocGVuZGluZ19leGl0KQoJICAgICAgewoJCXN0ZXBfcmVzdWx0ID0gTTMyQ19NQUtFX0VYSVRFRCAodmFsdWUpOwoJCXJldHVybjsKCSAgICAgIH0KCSAgICBwZW5kaW5nX2V4aXQgPSAxOwoJICB9CgllbHNlCgkgIHsKCSAgICB3cml0ZSAobTMyY19jb25zb2xlX29mZCwgJnZhbHVlLCAxKTsKCSAgfQogICAgICB9CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHg0MDA6CiAgICAgIG0zMmNfc3lzY2FsbCAodmFsdWUpOwogICAgICBicmVhazsKCiAgICBjYXNlIDB4NDAxOgogICAgICBwdXRjaGFyICh2YWx1ZSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHg0MDI6CiAgICAgIHByaW50ZiAoIlNpbVRyYWNlOiAlMDZseCAlMDJ4XG4iLCByZWdzLnJfcGMsIHZhbHVlKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSAweDQwMzoKICAgICAgcHJpbnRmICgiU2ltVHJhcDogJTA2bHggJTAyeFxuIiwgcmVncy5yX3BjLCB2YWx1ZSk7CiAgICAgIGFib3J0ICgpOwogICAgfQp9Cgp2b2lkCm1lbV9wdXRfcWkgKGludCBhZGRyZXNzLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQp7CiAgUyAoIjw9Iik7CiAgbWVtX3B1dF9ieXRlIChhZGRyZXNzLCB2YWx1ZSAmIDB4ZmYpOwogIEUgKCk7CiAgQ09VTlQgKDEsIDEpOwp9Cgp2b2lkCm1lbV9wdXRfaGkgKGludCBhZGRyZXNzLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKewogIGlmIChhZGRyZXNzID09IDB4NDAyKQogICAgewogICAgICBwcmludGYgKCJTaW1UcmFjZTogJTA2bHggJTA0eFxuIiwgcmVncy5yX3BjLCB2YWx1ZSk7CiAgICAgIHJldHVybjsKICAgIH0KICBTICgiPD0iKTsKICBtZW1fcHV0X2J5dGUgKGFkZHJlc3MsIHZhbHVlICYgMHhmZik7CiAgbWVtX3B1dF9ieXRlIChhZGRyZXNzICsgMSwgdmFsdWUgPj4gOCk7CiAgRSAoKTsKICBDT1VOVCAoMSwgMik7Cn0KCnZvaWQKbWVtX3B1dF9wc2kgKGludCBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHZhbHVlKQp7CiAgUyAoIjw9Iik7CiAgbWVtX3B1dF9ieXRlIChhZGRyZXNzLCB2YWx1ZSAmIDB4ZmYpOwogIG1lbV9wdXRfYnl0ZSAoYWRkcmVzcyArIDEsICh2YWx1ZSA+PiA4KSAmIDB4ZmYpOwogIG1lbV9wdXRfYnl0ZSAoYWRkcmVzcyArIDIsIHZhbHVlID4+IDE2KTsKICBFICgpOwogIENPVU5UICgxLCAzKTsKfQoKdm9pZAptZW1fcHV0X3NpIChpbnQgYWRkcmVzcywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKewogIFMgKCI8PSIpOwogIG1lbV9wdXRfYnl0ZSAoYWRkcmVzcywgdmFsdWUgJiAweGZmKTsKICBtZW1fcHV0X2J5dGUgKGFkZHJlc3MgKyAxLCAodmFsdWUgPj4gOCkgJiAweGZmKTsKICBtZW1fcHV0X2J5dGUgKGFkZHJlc3MgKyAyLCAodmFsdWUgPj4gMTYpICYgMHhmZik7CiAgbWVtX3B1dF9ieXRlIChhZGRyZXNzICsgMywgKHZhbHVlID4+IDI0KSAmIDB4ZmYpOwogIEUgKCk7CiAgQ09VTlQgKDEsIDQpOwp9Cgp2b2lkCm1lbV9wdXRfYmxrIChpbnQgYWRkcmVzcywgdm9pZCAqYnVmcHRyLCBpbnQgbmJ5dGVzKQp7CiAgUyAoIjw9Iik7CiAgaWYgKGVuYWJsZV9jb3VudGluZykKICAgIG1lbV9jb3VudGVyc1sxXVsxXSArPSBuYnl0ZXM7CiAgd2hpbGUgKG5ieXRlcy0tKQogICAgbWVtX3B1dF9ieXRlIChhZGRyZXNzKyssICoodW5zaWduZWQgY2hhciAqKSBidWZwdHIrKyk7CiAgRSAoKTsKfQoKdW5zaWduZWQgY2hhcgptZW1fZ2V0X3BjICgpCnsKICB1bnNpZ25lZCBjaGFyICptID0gbWVtX3B0ciAocmVncy5yX3BjICYgbWVtYnVzX21hc2spOwogIENPVU5UICgwLCAwKTsKICByZXR1cm4gKm07Cn0KCnN0YXRpYyBpbnQgY29uc29sZV9yYXcgPSAwOwpzdGF0aWMgc3RydWN0IHRlcm1pb3Mgb2F0dHI7CgpzdGF0aWMgaW50CnN0ZGluX3JlYWR5ICgpCnsKICBmZF9zZXQgaWZkOwogIGludCBuOwogIHN0cnVjdCB0aW1ldmFsIHQ7CgogIHQudHZfc2VjID0gMDsKICB0LnR2X3VzZWMgPSAwOwogIEZEX1pFUk8gKCZpZmQpOwogIEZEX1NFVCAobTMyY19jb25zb2xlX2lmZCwgJmlmZCk7CiAgbiA9IHNlbGVjdCAoMSwgJmlmZCwgMCwgMCwgJnQpOwogIHJldHVybiBuID4gMDsKfQoKdm9pZAptMzJjX3NpbV9yZXN0b3JlX2NvbnNvbGUgKCkKewogIHRjc2V0YXR0ciAobTMyY19jb25zb2xlX2lmZCwgVENTQU5PVywgJm9hdHRyKTsKICBjb25zb2xlX3JhdyA9IDA7Cn0KCnN0YXRpYyB1bnNpZ25lZCBjaGFyCm1lbV9nZXRfYnl0ZSAoaW50IGFkZHJlc3MpCnsKICB1bnNpZ25lZCBjaGFyICptOwogIGFkZHJlc3MgJj0gbWVtYnVzX21hc2s7CiAgbSA9IG1lbV9wdHIgKGFkZHJlc3MpOwogIHN3aXRjaCAoYWRkcmVzcykKICAgIHsKICAgIGNhc2UgMHgyZWQ6CQkvKiBtMzJjIHVhcnQxYzEgKi8KICAgIGNhc2UgMHgzYWQ6CQkvKiBtMTZjIHVhcnQxYzEgKi8KCiNpZiAwCiAgICAgIGlmICghY29uc29sZV9yYXcpCgl7CgkgIHRjZ2V0YXR0ciAobTMyY19jb25zb2xlX2lmZCwgJmF0dHIpOwoJICB0Y2dldGF0dHIgKG0zMmNfY29uc29sZV9pZmQsICZvYXR0cik7CgkgIC8qIFdlIHdhbnQgZWFjaCBrZXkgdG8gYmUgc2VudCBhcyB0aGUgdXNlciBwcmVzc2VzIHRoZW0uICAqLwoJICBhdHRyLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPIHwgRUNIT0UpOwoJICB0Y3NldGF0dHIgKG0zMmNfY29uc29sZV9pZmQsIFRDU0FOT1csICZhdHRyKTsKCSAgY29uc29sZV9yYXcgPSAxOwoJICBhdGV4aXQgKG0zMmNfc2ltX3Jlc3RvcmVfY29uc29sZSk7Cgl9CiNlbmRpZgoKICAgICAgaWYgKHN0ZGluX3JlYWR5ICgpKQoJcmV0dXJuIDB4MDI7CQkvKiB0eCBlbXB0eSBhbmQgcnggZnVsbCAqLwogICAgICBlbHNlCglyZXR1cm4gMHgwYTsJCS8qIHRyYW5zbWl0dGVyIGVtcHR5ICovCgogICAgY2FzZSAweDJlZToJCS8qIG0zMmMgdWFydDEgcnggKi8KICAgICAgewoJY2hhciBjOwoJcmVhZCAobTMyY19jb25zb2xlX2lmZCwgJmMsIDEpOwoJaWYgKG0zMmNfY29uc29sZV9pZmQgPT0gMCAmJiBjID09IDMpCS8qIEN0cmwtQyAqLwoJICB7CgkgICAgcHJpbnRmICgiQ3RybC1DIVxuIik7CgkgICAgZXhpdCAoMCk7CgkgIH0KCglpZiAobTMyY19jb25zb2xlX2lmZCAhPSAxKQoJICB7CgkgICAgaWYgKGlzZ3JhcGggKGMpKQoJICAgICAgcHJpbnRmICgiXDAzM1szMW0lY1wwMzNbMG0iLCBjKTsKCSAgICBlbHNlCgkgICAgICBwcmludGYgKCJcMDMzWzMxbSUwMnhcMDMzWzBtIiwgYyk7CgkgIH0KCXJldHVybiBjOwogICAgICB9CgojaWZkZWYgVElNRVJfQQogICAgY2FzZSAweDM0NjoJCS8qIFRBMGxvdyAqLwogICAgICByZXR1cm4gdGltZXJfYS5jb3VudCAmIDB4ZmY7CiAgICBjYXNlIDB4MzQ3OgkJLyogVEEwaGlnaCAqLwogICAgICByZXR1cm4gKHRpbWVyX2EuY291bnQgPj4gOCkgJiAweGZmOwogICAgY2FzZSAweDEwNDoJCS8qIFRSQSAqLwogICAgICByZXR1cm4gdGltZXJfYS5jb3VudDsKI2VuZGlmCgogICAgfQoKICBTICgiPT4iKTsKICBpZiAodHJhY2UpCiAgICBwcmludGYgKCIgJTAyeCIsICptKTsKICBFICgpOwogIHJldHVybiAqbTsKfQoKdW5zaWduZWQgY2hhcgptZW1fZ2V0X3FpIChpbnQgYWRkcmVzcykKewogIHVuc2lnbmVkIGNoYXIgcnY7CiAgUyAoIj0+Iik7CiAgcnYgPSBtZW1fZ2V0X2J5dGUgKGFkZHJlc3MpOwogIENPVU5UICgwLCAxKTsKICBFICgpOwogIHJldHVybiBydjsKfQoKdW5zaWduZWQgc2hvcnQKbWVtX2dldF9oaSAoaW50IGFkZHJlc3MpCnsKICB1bnNpZ25lZCBzaG9ydCBydjsKICBTICgiPT4iKTsKICBydiA9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyk7CiAgcnYgfD0gbWVtX2dldF9ieXRlIChhZGRyZXNzICsgMSkgKiAyNTY7CiAgQ09VTlQgKDAsIDIpOwogIEUgKCk7CiAgcmV0dXJuIHJ2Owp9Cgp1bnNpZ25lZCBsb25nCm1lbV9nZXRfcHNpIChpbnQgYWRkcmVzcykKewogIHVuc2lnbmVkIGxvbmcgcnY7CiAgUyAoIj0+Iik7CiAgcnYgPSBtZW1fZ2V0X2J5dGUgKGFkZHJlc3MpOwogIHJ2IHw9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyArIDEpICogMjU2OwogIHJ2IHw9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyArIDIpICogNjU1MzY7CiAgQ09VTlQgKDAsIDMpOwogIEUgKCk7CiAgcmV0dXJuIHJ2Owp9Cgp1bnNpZ25lZCBsb25nCm1lbV9nZXRfc2kgKGludCBhZGRyZXNzKQp7CiAgdW5zaWduZWQgbG9uZyBydjsKICBTICgiPT4iKTsKICBydiA9IG1lbV9nZXRfYnl0ZSAoYWRkcmVzcyk7CiAgcnYgfD0gbWVtX2dldF9ieXRlIChhZGRyZXNzICsgMSkgPDwgODsKICBydiB8PSBtZW1fZ2V0X2J5dGUgKGFkZHJlc3MgKyAyKSA8PCAxNjsKICBydiB8PSBtZW1fZ2V0X2J5dGUgKGFkZHJlc3MgKyAzKSA8PCAyNDsKICBDT1VOVCAoMCwgNCk7CiAgRSAoKTsKICByZXR1cm4gcnY7Cn0KCnZvaWQKbWVtX2dldF9ibGsgKGludCBhZGRyZXNzLCB2b2lkICpidWZwdHIsIGludCBuYnl0ZXMpCnsKICBTICgiPT4iKTsKICBpZiAoZW5hYmxlX2NvdW50aW5nKQogICAgbWVtX2NvdW50ZXJzWzBdWzFdICs9IG5ieXRlczsKICB3aGlsZSAobmJ5dGVzLS0pCiAgICAqKGNoYXIgKikgYnVmcHRyKysgPSBtZW1fZ2V0X2J5dGUgKGFkZHJlc3MrKyk7CiAgRSAoKTsKfQoKaW50CnNpZ25fZXh0IChpbnQgdiwgaW50IGJpdHMpCnsKICBpZiAoYml0cyA8IDMyKQogICAgewogICAgICB2ICY9ICgxIDw8IGJpdHMpIC0gMTsKICAgICAgaWYgKHYgJiAoMSA8PCAoYml0cyAtIDEpKSkKCXYgLT0gKDEgPDwgYml0cyk7CiAgICB9CiAgcmV0dXJuIHY7Cn0KCiNpZiBUSU1FUl9BCnZvaWQKdXBkYXRlX3RpbWVyX2EgKCkKewogIGlmICh0aW1lcl9hLmJzciAmIDEpCiAgICB7CiAgICAgIHRpbWVyX2EucHJlc2NhbGUtLTsKICAgICAgaWYgKHRpbWVyX2EucHJlc2NhbGUgPCAwKQoJewoJICBpZiAoQTI0KQoJICAgIHsKCSAgICAgIHN3aXRjaCAodGltZXJfYS5tb2RlICYgMHhjMCkKCQl7CgkJY2FzZSAweDAwOgoJCSAgdGltZXJfYS5wcmVzY2FsZSA9IDA7CgkJICBicmVhazsKCQljYXNlIDB4NDA6CgkJICB0aW1lcl9hLnByZXNjYWxlID0gODsKCQkgIGJyZWFrOwoJCWNhc2UgMHg4MDoKCQkgIHRpbWVyX2EucHJlc2NhbGUgPSB0aW1lcl9hLnRjc3ByICYgMHgwZjsKCQkgIGJyZWFrOwoJCWNhc2UgMHhjMDoKCQkgIHRpbWVyX2EucHJlc2NhbGUgPSAzMjsKCQkgIGJyZWFrOwoJCX0KCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICB0aW1lcl9hLnByZXNjYWxlID0gdGltZXJfYS50Y3NwcjsKCSAgICB9CgkgIHRpbWVyX2EuY291bnQtLTsKCSAgaWYgKHRpbWVyX2EuY291bnQgPCAwKQoJICAgIHsKCSAgICAgIHRpbWVyX2EuY291bnQgPSB0aW1lcl9hLnJlbG9hZDsKCSAgICAgIGlmICh0aW1lcl9hLmljICYgNykKCQl7CgkJICBpZiAoQTI0KQoJCSAgICBtZW1fcHV0X3FpICgweDZjLCB0aW1lcl9hLmljIHwgMHgwOCk7CgkJICBlbHNlCgkJICAgIG1lbV9wdXRfcWkgKDB4NTYsIHRpbWVyX2EuaWMgfCAweDA4KTsKCQl9CgkgICAgfQoJfQogICAgfQoKICBpZiAocmVncy5yX2ZsYWdzICYgRkxBR0JJVF9JCS8qIGludGVycnVwdHMgZW5hYmxlZCAqLwogICAgICAmJiB0aW1lcl9hLmljICYgMHgwOAkvKiB0aW1lciBBIGludGVycnVwdCB0cmlnZ2VyZWQgKi8KICAgICAgJiYgKHRpbWVyX2EuaWMgJiAweDA3KSA+ICgocmVncy5yX2ZsYWdzID4+IDEyKSAmIDB4MDcpKQogICAgewogICAgICBpZiAoQTI0KQoJdHJpZ2dlcl9wZXJpcGhlcmFsX2ludGVycnVwdCAoMTIsIDB4MDZjKTsKICAgICAgZWxzZQoJdHJpZ2dlcl9wZXJpcGhlcmFsX2ludGVycnVwdCAoMjIsIDB4MDU2KTsKICAgIH0KfQojZW5kaWYK