LyoKICogQ29weXJpZ2h0IChjKSAxOTk1IC0gMjAwMSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIAogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIAogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIAogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqIAogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICogCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCiAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCiAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQogKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCiAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqLwoKI2lmZGVmIEhBVkVfQ09ORklHX0gKI2luY2x1ZGUgImNvbmZpZy5oIgoKX19SQ1NJRCgiJEhlaW1kYWw6IG1kNS5jLHYgMS4xNSAyMDAxLzAxLzI5IDA0OjMzOjQ0IGFzc2FyIEV4cCAkIgogICAgICAgICIkTmV0QlNEOiBtZDUuYyx2IDEuMS4xLjQgMjAwMi8wOS8xMiAxMjo0MTo0MiBqb2RhIEV4cCAkIik7CiNlbmRpZgoKI2luY2x1ZGUgIm1kNS5oIgojaW5jbHVkZSAiaGFzaC5oIgoKI2RlZmluZSBBIG0tPmNvdW50ZXJbMF0KI2RlZmluZSBCIG0tPmNvdW50ZXJbMV0KI2RlZmluZSBDIG0tPmNvdW50ZXJbMl0KI2RlZmluZSBEIG0tPmNvdW50ZXJbM10KI2RlZmluZSBYIGRhdGEKCnZvaWQKTUQ1X0luaXQgKHN0cnVjdCBtZDUgKm0pCnsKICBtLT5zelswXSA9IDA7CiAgbS0+c3pbMV0gPSAwOwogIEQgPSAweDEwMzI1NDc2OwogIEMgPSAweDk4YmFkY2ZlOwogIEIgPSAweGVmY2RhYjg5OwogIEEgPSAweDY3NDUyMzAxOwp9CgojZGVmaW5lIEYoeCx5LHopIENSQVlGSVgoKHggJiB5KSB8ICh+eCAmIHopKQojZGVmaW5lIEcoeCx5LHopIENSQVlGSVgoKHggJiB6KSB8ICh5ICYgfnopKQojZGVmaW5lIEgoeCx5LHopICh4IF4geSBeIHopCiNkZWZpbmUgSSh4LHkseikgQ1JBWUZJWCh5IF4gKHggfCB+eikpCgojZGVmaW5lIERPSVQoYSxiLGMsZCxrLHMsaSxPUCkgXAphID0gYiArIGNzaGlmdChhICsgT1AoYixjLGQpICsgWFtrXSArIChpKSwgcykKCiNkZWZpbmUgRE8xKGEsYixjLGQsayxzLGkpIERPSVQoYSxiLGMsZCxrLHMsaSxGKQojZGVmaW5lIERPMihhLGIsYyxkLGsscyxpKSBET0lUKGEsYixjLGQsayxzLGksRykKI2RlZmluZSBETzMoYSxiLGMsZCxrLHMsaSkgRE9JVChhLGIsYyxkLGsscyxpLEgpCiNkZWZpbmUgRE80KGEsYixjLGQsayxzLGkpIERPSVQoYSxiLGMsZCxrLHMsaSxJKQoKc3RhdGljIGlubGluZSB2b2lkCmNhbGMgKHN0cnVjdCBtZDUgKm0sIHVfaW50MzJfdCAqZGF0YSkKewogIHVfaW50MzJfdCBBQSwgQkIsIENDLCBERDsKCiAgQUEgPSBBOwogIEJCID0gQjsKICBDQyA9IEM7CiAgREQgPSBEOwoKICAvKiBSb3VuZCAxICovCgogIERPMShBLEIsQyxELDAsNywweGQ3NmFhNDc4KTsKICBETzEoRCxBLEIsQywxLDEyLDB4ZThjN2I3NTYpOwogIERPMShDLEQsQSxCLDIsMTcsMHgyNDIwNzBkYik7CiAgRE8xKEIsQyxELEEsMywyMiwweGMxYmRjZWVlKTsKCiAgRE8xKEEsQixDLEQsNCw3LDB4ZjU3YzBmYWYpOwogIERPMShELEEsQixDLDUsMTIsMHg0Nzg3YzYyYSk7CiAgRE8xKEMsRCxBLEIsNiwxNywweGE4MzA0NjEzKTsKICBETzEoQixDLEQsQSw3LDIyLDB4ZmQ0Njk1MDEpOwoKICBETzEoQSxCLEMsRCw4LDcsMHg2OTgwOThkOCk7CiAgRE8xKEQsQSxCLEMsOSwxMiwweDhiNDRmN2FmKTsKICBETzEoQyxELEEsQiwxMCwxNywweGZmZmY1YmIxKTsKICBETzEoQixDLEQsQSwxMSwyMiwweDg5NWNkN2JlKTsKCiAgRE8xKEEsQixDLEQsMTIsNywweDZiOTAxMTIyKTsKICBETzEoRCxBLEIsQywxMywxMiwweGZkOTg3MTkzKTsKICBETzEoQyxELEEsQiwxNCwxNywweGE2Nzk0MzhlKTsKICBETzEoQixDLEQsQSwxNSwyMiwweDQ5YjQwODIxKTsKCiAgLyogUm91bmQgMiAqLwoKICBETzIoQSxCLEMsRCwxLDUsMHhmNjFlMjU2Mik7CiAgRE8yKEQsQSxCLEMsNiw5LDB4YzA0MGIzNDApOwogIERPMihDLEQsQSxCLDExLDE0LDB4MjY1ZTVhNTEpOwogIERPMihCLEMsRCxBLDAsMjAsMHhlOWI2YzdhYSk7CgogIERPMihBLEIsQyxELDUsNSwweGQ2MmYxMDVkKTsKICBETzIoRCxBLEIsQywxMCw5LDB4MjQ0MTQ1Myk7CiAgRE8yKEMsRCxBLEIsMTUsMTQsMHhkOGExZTY4MSk7CiAgRE8yKEIsQyxELEEsNCwyMCwweGU3ZDNmYmM4KTsKCiAgRE8yKEEsQixDLEQsOSw1LDB4MjFlMWNkZTYpOwogIERPMihELEEsQixDLDE0LDksMHhjMzM3MDdkNik7CiAgRE8yKEMsRCxBLEIsMywxNCwweGY0ZDUwZDg3KTsKICBETzIoQixDLEQsQSw4LDIwLDB4NDU1YTE0ZWQpOwoKICBETzIoQSxCLEMsRCwxMyw1LDB4YTllM2U5MDUpOwogIERPMihELEEsQixDLDIsOSwweGZjZWZhM2Y4KTsKICBETzIoQyxELEEsQiw3LDE0LDB4Njc2ZjAyZDkpOwogIERPMihCLEMsRCxBLDEyLDIwLDB4OGQyYTRjOGEpOwoKICAvKiBSb3VuZCAzICovCgogIERPMyhBLEIsQyxELDUsNCwweGZmZmEzOTQyKTsKICBETzMoRCxBLEIsQyw4LDExLDB4ODc3MWY2ODEpOwogIERPMyhDLEQsQSxCLDExLDE2LDB4NmQ5ZDYxMjIpOwogIERPMyhCLEMsRCxBLDE0LDIzLDB4ZmRlNTM4MGMpOwoKICBETzMoQSxCLEMsRCwxLDQsMHhhNGJlZWE0NCk7CiAgRE8zKEQsQSxCLEMsNCwxMSwweDRiZGVjZmE5KTsKICBETzMoQyxELEEsQiw3LDE2LDB4ZjZiYjRiNjApOwogIERPMyhCLEMsRCxBLDEwLDIzLDB4YmViZmJjNzApOwoKICBETzMoQSxCLEMsRCwxMyw0LDB4Mjg5YjdlYzYpOwogIERPMyhELEEsQixDLDAsMTEsMHhlYWExMjdmYSk7CiAgRE8zKEMsRCxBLEIsMywxNiwweGQ0ZWYzMDg1KTsKICBETzMoQixDLEQsQSw2LDIzLDB4NDg4MWQwNSk7CgogIERPMyhBLEIsQyxELDksNCwweGQ5ZDRkMDM5KTsKICBETzMoRCxBLEIsQywxMiwxMSwweGU2ZGI5OWU1KTsKICBETzMoQyxELEEsQiwxNSwxNiwweDFmYTI3Y2Y4KTsKICBETzMoQixDLEQsQSwyLDIzLDB4YzRhYzU2NjUpOwoKICAvKiBSb3VuZCA0ICovCgogIERPNChBLEIsQyxELDAsNiwweGY0MjkyMjQ0KTsKICBETzQoRCxBLEIsQyw3LDEwLDB4NDMyYWZmOTcpOwogIERPNChDLEQsQSxCLDE0LDE1LDB4YWI5NDIzYTcpOwogIERPNChCLEMsRCxBLDUsMjEsMHhmYzkzYTAzOSk7CgogIERPNChBLEIsQyxELDEyLDYsMHg2NTViNTljMyk7CiAgRE80KEQsQSxCLEMsMywxMCwweDhmMGNjYzkyKTsKICBETzQoQyxELEEsQiwxMCwxNSwweGZmZWZmNDdkKTsKICBETzQoQixDLEQsQSwxLDIxLDB4ODU4NDVkZDEpOwoKICBETzQoQSxCLEMsRCw4LDYsMHg2ZmE4N2U0Zik7CiAgRE80KEQsQSxCLEMsMTUsMTAsMHhmZTJjZTZlMCk7CiAgRE80KEMsRCxBLEIsNiwxNSwweGEzMDE0MzE0KTsKICBETzQoQixDLEQsQSwxMywyMSwweDRlMDgxMWExKTsKCiAgRE80KEEsQixDLEQsNCw2LDB4Zjc1MzdlODIpOwogIERPNChELEEsQixDLDExLDEwLDB4YmQzYWYyMzUpOwogIERPNChDLEQsQSxCLDIsMTUsMHgyYWQ3ZDJiYik7CiAgRE80KEIsQyxELEEsOSwyMSwweGViODZkMzkxKTsKCiAgQSArPSBBQTsKICBCICs9IEJCOwogIEMgKz0gQ0M7CiAgRCArPSBERDsKfQoKLyoKICogRnJvbSBgUGVyZm9ybWFuY2UgYW5hbHlzaXMgb2YgTUQ1JyBieSBKb3NlcGggRC4gVG91Y2ggPHRvdWNoQGlzaS5lZHU+CiAqLwoKI2lmIGRlZmluZWQoV09SRFNfQklHRU5ESUFOKQpzdGF0aWMgaW5saW5lIHVfaW50MzJfdApzd2FwX3VfaW50MzJfdCAodV9pbnQzMl90IHQpCnsKICB1X2ludDMyX3QgdGVtcDEsIHRlbXAyOwoKICB0ZW1wMSAgID0gY3NoaWZ0KHQsIDE2KTsKICB0ZW1wMiAgID0gdGVtcDEgPj4gODsKICB0ZW1wMSAgJj0gMHgwMGZmMDBmZjsKICB0ZW1wMiAgJj0gMHgwMGZmMDBmZjsKICB0ZW1wMSA8PD0gODsKICByZXR1cm4gdGVtcDEgfCB0ZW1wMjsKfQojZW5kaWYKCnN0cnVjdCB4MzJ7CiAgdW5zaWduZWQgaW50IGE6MzI7CiAgdW5zaWduZWQgaW50IGI6MzI7Cn07Cgp2b2lkCk1ENV9VcGRhdGUgKHN0cnVjdCBtZDUgKm0sIGNvbnN0IHZvaWQgKnYsIHNpemVfdCBsZW4pCnsKICBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gdjsKICBzaXplX3Qgb2xkX3N6ID0gbS0+c3pbMF07CiAgc2l6ZV90IG9mZnNldDsKCiAgbS0+c3pbMF0gKz0gbGVuICogODsKICBpZiAobS0+c3pbMF0gPCBvbGRfc3opCiAgICAgICsrbS0+c3pbMV07CiAgb2Zmc2V0ID0gKG9sZF9zeiAvIDgpICAlIDY0OwogIHdoaWxlKGxlbiA+IDApewogICAgc2l6ZV90IGwgPSBtaW4obGVuLCA2NCAtIG9mZnNldCk7CiAgICBtZW1jcHkobS0+c2F2ZSArIG9mZnNldCwgcCwgbCk7CiAgICBvZmZzZXQgKz0gbDsKICAgIHAgKz0gbDsKICAgIGxlbiAtPSBsOwogICAgaWYob2Zmc2V0ID09IDY0KXsKI2lmIGRlZmluZWQoV09SRFNfQklHRU5ESUFOKQogICAgICBpbnQgaTsKICAgICAgdV9pbnQzMl90IGN1cnJlbnRbMTZdOwogICAgICBzdHJ1Y3QgeDMyICp1ID0gKHN0cnVjdCB4MzIqKW0tPnNhdmU7CiAgICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKyl7CgljdXJyZW50WzIqaSswXSA9IHN3YXBfdV9pbnQzMl90KHVbaV0uYSk7CgljdXJyZW50WzIqaSsxXSA9IHN3YXBfdV9pbnQzMl90KHVbaV0uYik7CiAgICAgIH0KICAgICAgY2FsYyhtLCBjdXJyZW50KTsKI2Vsc2UKICAgICAgY2FsYyhtLCAodV9pbnQzMl90KiltLT5zYXZlKTsKI2VuZGlmCiAgICAgIG9mZnNldCA9IDA7CiAgICB9CiAgfQp9Cgp2b2lkCk1ENV9GaW5hbCAodm9pZCAqcmVzLCBzdHJ1Y3QgbWQ1ICptKQp7CiAgdW5zaWduZWQgY2hhciB6ZXJvc1s3Ml07CiAgdW5zaWduZWQgb2Zmc2V0ID0gKG0tPnN6WzBdIC8gOCkgJSA2NDsKICB1bnNpZ25lZCBpbnQgZHN0YXJ0ID0gKDEyMCAtIG9mZnNldCAtIDEpICUgNjQgKyAxOwoKICAqemVyb3MgPSAweDgwOwogIG1lbXNldCAoemVyb3MgKyAxLCAwLCBzaXplb2YoemVyb3MpIC0gMSk7CiAgemVyb3NbZHN0YXJ0KzBdID0gKG0tPnN6WzBdID4+IDApICYgMHhmZjsKICB6ZXJvc1tkc3RhcnQrMV0gPSAobS0+c3pbMF0gPj4gOCkgJiAweGZmOwogIHplcm9zW2RzdGFydCsyXSA9IChtLT5zelswXSA+PiAxNikgJiAweGZmOwogIHplcm9zW2RzdGFydCszXSA9IChtLT5zelswXSA+PiAyNCkgJiAweGZmOwogIHplcm9zW2RzdGFydCs0XSA9IChtLT5zelsxXSA+PiAwKSAmIDB4ZmY7CiAgemVyb3NbZHN0YXJ0KzVdID0gKG0tPnN6WzFdID4+IDgpICYgMHhmZjsKICB6ZXJvc1tkc3RhcnQrNl0gPSAobS0+c3pbMV0gPj4gMTYpICYgMHhmZjsKICB6ZXJvc1tkc3RhcnQrN10gPSAobS0+c3pbMV0gPj4gMjQpICYgMHhmZjsKICBNRDVfVXBkYXRlIChtLCB6ZXJvcywgZHN0YXJ0ICsgOCk7CiAgewogICAgICBpbnQgaTsKICAgICAgdW5zaWduZWQgY2hhciAqciA9ICh1bnNpZ25lZCBjaGFyICopcmVzOwoKICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewoJICByWzQqaV0gICA9IG0tPmNvdW50ZXJbaV0gJiAweEZGOwoJICByWzQqaSsxXSA9IChtLT5jb3VudGVyW2ldID4+IDgpICYgMHhGRjsKCSAgcls0KmkrMl0gPSAobS0+Y291bnRlcltpXSA+PiAxNikgJiAweEZGOwoJICByWzQqaSszXSA9IChtLT5jb3VudGVyW2ldID4+IDI0KSAmIDB4RkY7CiAgICAgIH0KICB9CiNpZiAwCiAgewogICAgaW50IGk7CiAgICB1X2ludDMyX3QgKnIgPSAodV9pbnQzMl90ICopcmVzOwoKICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpCiAgICAgIHJbaV0gPSBzd2FwX3VfaW50MzJfdCAobS0+Y291bnRlcltpXSk7CiAgfQojZW5kaWYKfQo=