LyoKICogQ29weXJpZ2h0IChjKSAxOTk1IC0gMjAwMSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIAogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIAogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIAogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqIAogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICogCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCiAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCiAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQogKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCiAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqLwoKI2lmZGVmIEhBVkVfQ09ORklHX0gKI2luY2x1ZGUgImNvbmZpZy5oIgoKX19SQ1NJRCgiJEhlaW1kYWw6IG1kNS5jLHYgMS4xNSAyMDAxLzAxLzI5IDA0OjMzOjQ0IGFzc2FyIEV4cCAkIgogICAgICAgICIkTmV0QlNEOiBtZDUuYyx2IDEuMS4xLjQgMjAwMi8wOS8xMiAxMjo0MTo0MiBqb2RhIEV4cCAkIik7CiNlbmRpZgoKI2luY2x1ZGUgPGVuZGlhbi5oPgojaW5jbHVkZSAibWQ1LmgiCiNpbmNsdWRlICJoYXNoLmgiCgojZGVmaW5lIEEgbS0+Y291bnRlclswXQojZGVmaW5lIEIgbS0+Y291bnRlclsxXQojZGVmaW5lIEMgbS0+Y291bnRlclsyXQojZGVmaW5lIEQgbS0+Y291bnRlclszXQojZGVmaW5lIFggZGF0YQoKdm9pZApNRDVfSW5pdCAoc3RydWN0IG1kNSAqbSkKewogIG0tPnN6WzBdID0gMDsKICBtLT5zelsxXSA9IDA7CiAgRCA9IDB4MTAzMjU0NzY7CiAgQyA9IDB4OThiYWRjZmU7CiAgQiA9IDB4ZWZjZGFiODk7CiAgQSA9IDB4Njc0NTIzMDE7Cn0KCiNkZWZpbmUgRih4LHkseikgQ1JBWUZJWCgoeCAmIHkpIHwgKH54ICYgeikpCiNkZWZpbmUgRyh4LHkseikgQ1JBWUZJWCgoeCAmIHopIHwgKHkgJiB+eikpCiNkZWZpbmUgSCh4LHkseikgKHggXiB5IF4geikKI2RlZmluZSBJKHgseSx6KSBDUkFZRklYKHkgXiAoeCB8IH56KSkKCiNkZWZpbmUgRE9JVChhLGIsYyxkLGsscyxpLE9QKSBcCmEgPSBiICsgY3NoaWZ0KGEgKyBPUChiLGMsZCkgKyBYW2tdICsgKGkpLCBzKQoKI2RlZmluZSBETzEoYSxiLGMsZCxrLHMsaSkgRE9JVChhLGIsYyxkLGsscyxpLEYpCiNkZWZpbmUgRE8yKGEsYixjLGQsayxzLGkpIERPSVQoYSxiLGMsZCxrLHMsaSxHKQojZGVmaW5lIERPMyhhLGIsYyxkLGsscyxpKSBET0lUKGEsYixjLGQsayxzLGksSCkKI2RlZmluZSBETzQoYSxiLGMsZCxrLHMsaSkgRE9JVChhLGIsYyxkLGsscyxpLEkpCgpzdGF0aWMgaW5saW5lIHZvaWQKY2FsYyAoc3RydWN0IG1kNSAqbSwgdV9pbnQzMl90ICpkYXRhKQp7CiAgdV9pbnQzMl90IEFBLCBCQiwgQ0MsIEREOwoKICBBQSA9IEE7CiAgQkIgPSBCOwogIENDID0gQzsKICBERCA9IEQ7CgogIC8qIFJvdW5kIDEgKi8KCiAgRE8xKEEsQixDLEQsMCw3LDB4ZDc2YWE0NzgpOwogIERPMShELEEsQixDLDEsMTIsMHhlOGM3Yjc1Nik7CiAgRE8xKEMsRCxBLEIsMiwxNywweDI0MjA3MGRiKTsKICBETzEoQixDLEQsQSwzLDIyLDB4YzFiZGNlZWUpOwoKICBETzEoQSxCLEMsRCw0LDcsMHhmNTdjMGZhZik7CiAgRE8xKEQsQSxCLEMsNSwxMiwweDQ3ODdjNjJhKTsKICBETzEoQyxELEEsQiw2LDE3LDB4YTgzMDQ2MTMpOwogIERPMShCLEMsRCxBLDcsMjIsMHhmZDQ2OTUwMSk7CgogIERPMShBLEIsQyxELDgsNywweDY5ODA5OGQ4KTsKICBETzEoRCxBLEIsQyw5LDEyLDB4OGI0NGY3YWYpOwogIERPMShDLEQsQSxCLDEwLDE3LDB4ZmZmZjViYjEpOwogIERPMShCLEMsRCxBLDExLDIyLDB4ODk1Y2Q3YmUpOwoKICBETzEoQSxCLEMsRCwxMiw3LDB4NmI5MDExMjIpOwogIERPMShELEEsQixDLDEzLDEyLDB4ZmQ5ODcxOTMpOwogIERPMShDLEQsQSxCLDE0LDE3LDB4YTY3OTQzOGUpOwogIERPMShCLEMsRCxBLDE1LDIyLDB4NDliNDA4MjEpOwoKICAvKiBSb3VuZCAyICovCgogIERPMihBLEIsQyxELDEsNSwweGY2MWUyNTYyKTsKICBETzIoRCxBLEIsQyw2LDksMHhjMDQwYjM0MCk7CiAgRE8yKEMsRCxBLEIsMTEsMTQsMHgyNjVlNWE1MSk7CiAgRE8yKEIsQyxELEEsMCwyMCwweGU5YjZjN2FhKTsKCiAgRE8yKEEsQixDLEQsNSw1LDB4ZDYyZjEwNWQpOwogIERPMihELEEsQixDLDEwLDksMHgyNDQxNDUzKTsKICBETzIoQyxELEEsQiwxNSwxNCwweGQ4YTFlNjgxKTsKICBETzIoQixDLEQsQSw0LDIwLDB4ZTdkM2ZiYzgpOwoKICBETzIoQSxCLEMsRCw5LDUsMHgyMWUxY2RlNik7CiAgRE8yKEQsQSxCLEMsMTQsOSwweGMzMzcwN2Q2KTsKICBETzIoQyxELEEsQiwzLDE0LDB4ZjRkNTBkODcpOwogIERPMihCLEMsRCxBLDgsMjAsMHg0NTVhMTRlZCk7CgogIERPMihBLEIsQyxELDEzLDUsMHhhOWUzZTkwNSk7CiAgRE8yKEQsQSxCLEMsMiw5LDB4ZmNlZmEzZjgpOwogIERPMihDLEQsQSxCLDcsMTQsMHg2NzZmMDJkOSk7CiAgRE8yKEIsQyxELEEsMTIsMjAsMHg4ZDJhNGM4YSk7CgogIC8qIFJvdW5kIDMgKi8KCiAgRE8zKEEsQixDLEQsNSw0LDB4ZmZmYTM5NDIpOwogIERPMyhELEEsQixDLDgsMTEsMHg4NzcxZjY4MSk7CiAgRE8zKEMsRCxBLEIsMTEsMTYsMHg2ZDlkNjEyMik7CiAgRE8zKEIsQyxELEEsMTQsMjMsMHhmZGU1MzgwYyk7CgogIERPMyhBLEIsQyxELDEsNCwweGE0YmVlYTQ0KTsKICBETzMoRCxBLEIsQyw0LDExLDB4NGJkZWNmYTkpOwogIERPMyhDLEQsQSxCLDcsMTYsMHhmNmJiNGI2MCk7CiAgRE8zKEIsQyxELEEsMTAsMjMsMHhiZWJmYmM3MCk7CgogIERPMyhBLEIsQyxELDEzLDQsMHgyODliN2VjNik7CiAgRE8zKEQsQSxCLEMsMCwxMSwweGVhYTEyN2ZhKTsKICBETzMoQyxELEEsQiwzLDE2LDB4ZDRlZjMwODUpOwogIERPMyhCLEMsRCxBLDYsMjMsMHg0ODgxZDA1KTsKCiAgRE8zKEEsQixDLEQsOSw0LDB4ZDlkNGQwMzkpOwogIERPMyhELEEsQixDLDEyLDExLDB4ZTZkYjk5ZTUpOwogIERPMyhDLEQsQSxCLDE1LDE2LDB4MWZhMjdjZjgpOwogIERPMyhCLEMsRCxBLDIsMjMsMHhjNGFjNTY2NSk7CgogIC8qIFJvdW5kIDQgKi8KCiAgRE80KEEsQixDLEQsMCw2LDB4ZjQyOTIyNDQpOwogIERPNChELEEsQixDLDcsMTAsMHg0MzJhZmY5Nyk7CiAgRE80KEMsRCxBLEIsMTQsMTUsMHhhYjk0MjNhNyk7CiAgRE80KEIsQyxELEEsNSwyMSwweGZjOTNhMDM5KTsKCiAgRE80KEEsQixDLEQsMTIsNiwweDY1NWI1OWMzKTsKICBETzQoRCxBLEIsQywzLDEwLDB4OGYwY2NjOTIpOwogIERPNChDLEQsQSxCLDEwLDE1LDB4ZmZlZmY0N2QpOwogIERPNChCLEMsRCxBLDEsMjEsMHg4NTg0NWRkMSk7CgogIERPNChBLEIsQyxELDgsNiwweDZmYTg3ZTRmKTsKICBETzQoRCxBLEIsQywxNSwxMCwweGZlMmNlNmUwKTsKICBETzQoQyxELEEsQiw2LDE1LDB4YTMwMTQzMTQpOwogIERPNChCLEMsRCxBLDEzLDIxLDB4NGUwODExYTEpOwoKICBETzQoQSxCLEMsRCw0LDYsMHhmNzUzN2U4Mik7CiAgRE80KEQsQSxCLEMsMTEsMTAsMHhiZDNhZjIzNSk7CiAgRE80KEMsRCxBLEIsMiwxNSwweDJhZDdkMmJiKTsKICBETzQoQixDLEQsQSw5LDIxLDB4ZWI4NmQzOTEpOwoKICBBICs9IEFBOwogIEIgKz0gQkI7CiAgQyArPSBDQzsKICBEICs9IEREOwp9CgovKgogKiBGcm9tIGBQZXJmb3JtYW5jZSBhbmFseXNpcyBvZiBNRDUnIGJ5IEpvc2VwaCBELiBUb3VjaCA8dG91Y2hAaXNpLmVkdT4KICovCiNpZiAhZGVmaW5lZChfX0JZVEVfT1JERVIpIHx8ICFkZWZpbmVkIChfX0JJR19FTkRJQU4pCiNlcnJvciBfX0JZVEVfT1JERVIgbWFjcm9zIG5vdCBkZWZpbmVkCiNlbmRpZgoKI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4Kc3RhdGljIGlubGluZSB1X2ludDMyX3QKc3dhcF91X2ludDMyX3QgKHVfaW50MzJfdCB0KQp7CiAgdV9pbnQzMl90IHRlbXAxLCB0ZW1wMjsKCiAgdGVtcDEgICA9IGNzaGlmdCh0LCAxNik7CiAgdGVtcDIgICA9IHRlbXAxID4+IDg7CiAgdGVtcDEgICY9IDB4MDBmZjAwZmY7CiAgdGVtcDIgICY9IDB4MDBmZjAwZmY7CiAgdGVtcDEgPDw9IDg7CiAgcmV0dXJuIHRlbXAxIHwgdGVtcDI7Cn0KI2VuZGlmCgpzdHJ1Y3QgeDMyewogIHVuc2lnbmVkIGludCBhOjMyOwogIHVuc2lnbmVkIGludCBiOjMyOwp9OwoKdm9pZApNRDVfVXBkYXRlIChzdHJ1Y3QgbWQ1ICptLCBjb25zdCB2b2lkICp2LCBzaXplX3QgbGVuKQp7CiAgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHY7CiAgc2l6ZV90IG9sZF9zeiA9IG0tPnN6WzBdOwogIHNpemVfdCBvZmZzZXQ7CgogIG0tPnN6WzBdICs9IGxlbiAqIDg7CiAgaWYgKG0tPnN6WzBdIDwgb2xkX3N6KQogICAgICArK20tPnN6WzFdOwogIG9mZnNldCA9IChvbGRfc3ogLyA4KSAgJSA2NDsKICB3aGlsZShsZW4gPiAwKXsKICAgIHNpemVfdCBsID0gbWluKGxlbiwgNjQgLSBvZmZzZXQpOwogICAgbWVtY3B5KG0tPnNhdmUgKyBvZmZzZXQsIHAsIGwpOwogICAgb2Zmc2V0ICs9IGw7CiAgICBwICs9IGw7CiAgICBsZW4gLT0gbDsKICAgIGlmKG9mZnNldCA9PSA2NCl7CiNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCiAgICAgIGludCBpOwogICAgICB1X2ludDMyX3QgY3VycmVudFsxNl07CiAgICAgIHN0cnVjdCB4MzIgKnUgPSAoc3RydWN0IHgzMiopbS0+c2F2ZTsKICAgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKXsKCWN1cnJlbnRbMippKzBdID0gc3dhcF91X2ludDMyX3QodVtpXS5hKTsKCWN1cnJlbnRbMippKzFdID0gc3dhcF91X2ludDMyX3QodVtpXS5iKTsKICAgICAgfQogICAgICBjYWxjKG0sIGN1cnJlbnQpOwojZWxzZQogICAgICBjYWxjKG0sICh1X2ludDMyX3QqKW0tPnNhdmUpOwojZW5kaWYKICAgICAgb2Zmc2V0ID0gMDsKICAgIH0KICB9Cn0KCnZvaWQKTUQ1X0ZpbmFsICh2b2lkICpyZXMsIHN0cnVjdCBtZDUgKm0pCnsKICB1bnNpZ25lZCBjaGFyIHplcm9zWzcyXTsKICB1bnNpZ25lZCBvZmZzZXQgPSAobS0+c3pbMF0gLyA4KSAlIDY0OwogIHVuc2lnbmVkIGludCBkc3RhcnQgPSAoMTIwIC0gb2Zmc2V0IC0gMSkgJSA2NCArIDE7CgogICp6ZXJvcyA9IDB4ODA7CiAgbWVtc2V0ICh6ZXJvcyArIDEsIDAsIHNpemVvZih6ZXJvcykgLSAxKTsKICB6ZXJvc1tkc3RhcnQrMF0gPSAobS0+c3pbMF0gPj4gMCkgJiAweGZmOwogIHplcm9zW2RzdGFydCsxXSA9IChtLT5zelswXSA+PiA4KSAmIDB4ZmY7CiAgemVyb3NbZHN0YXJ0KzJdID0gKG0tPnN6WzBdID4+IDE2KSAmIDB4ZmY7CiAgemVyb3NbZHN0YXJ0KzNdID0gKG0tPnN6WzBdID4+IDI0KSAmIDB4ZmY7CiAgemVyb3NbZHN0YXJ0KzRdID0gKG0tPnN6WzFdID4+IDApICYgMHhmZjsKICB6ZXJvc1tkc3RhcnQrNV0gPSAobS0+c3pbMV0gPj4gOCkgJiAweGZmOwogIHplcm9zW2RzdGFydCs2XSA9IChtLT5zelsxXSA+PiAxNikgJiAweGZmOwogIHplcm9zW2RzdGFydCs3XSA9IChtLT5zelsxXSA+PiAyNCkgJiAweGZmOwogIE1ENV9VcGRhdGUgKG0sIHplcm9zLCBkc3RhcnQgKyA4KTsKICB7CiAgICAgIGludCBpOwogICAgICB1bnNpZ25lZCBjaGFyICpyID0gKHVuc2lnbmVkIGNoYXIgKilyZXM7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CgkgIHJbNCppXSAgID0gbS0+Y291bnRlcltpXSAmIDB4RkY7CgkgIHJbNCppKzFdID0gKG0tPmNvdW50ZXJbaV0gPj4gOCkgJiAweEZGOwoJICByWzQqaSsyXSA9IChtLT5jb3VudGVyW2ldID4+IDE2KSAmIDB4RkY7CgkgIHJbNCppKzNdID0gKG0tPmNvdW50ZXJbaV0gPj4gMjQpICYgMHhGRjsKICAgICAgfQogIH0KI2lmIDAKICB7CiAgICBpbnQgaTsKICAgIHVfaW50MzJfdCAqciA9ICh1X2ludDMyX3QgKilyZXM7CgogICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKICAgICAgcltpXSA9IHN3YXBfdV9pbnQzMl90IChtLT5jb3VudGVyW2ldKTsKICB9CiNlbmRpZgp9Cg==