LyoKICAgIGkyYy12aWFwcm8uYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCiAgICAgICAgICAgICAgbW9uaXRvcmluZwogICAgQ29weXJpZ2h0IChjKSAxOTk4IC0gMjAwMiAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwgCiAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+LCBLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4sCiAgICBNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+CgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiovCgovKgogICBTdXBwb3J0cyBWaWEgZGV2aWNlczoKCTgyQzU5NkEvQiAoMHgzMDUwKQoJODJDNTk2QiAoMHgzMDUxKQoJODJDNjg2QS9CCgk4MjMxCgk4MjMzCgk4MjMzQSAoMHgzMTQ3IGFuZCAweDMxNzcpCgk4MjM1Cgk4MjM3CiAgIE5vdGU6IHdlIGFzc3VtZSB0aGVyZSBjYW4gb25seSBiZSBvbmUgZGV2aWNlLCB3aXRoIG9uZSBTTUJ1cyBpbnRlcmZhY2UuCiovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgojaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqdnQ1OTZfcGRldjsKCiNkZWZpbmUgU01CQkExCSAgIAkgMHg5MAojZGVmaW5lIFNNQkJBMiAgICAgCSAweDgwCiNkZWZpbmUgU01CQkEzICAgICAJIDB4RDAKCi8qIFNNQnVzIGFkZHJlc3Mgb2Zmc2V0cyAqLwpzdGF0aWMgdW5zaWduZWQgc2hvcnQgdnQ1OTZfc21iYTsKI2RlZmluZSBTTUJIU1RTVFMJKHZ0NTk2X3NtYmEgKyAwKQojZGVmaW5lIFNNQkhTTFZTVFMJKHZ0NTk2X3NtYmEgKyAxKQojZGVmaW5lIFNNQkhTVENOVAkodnQ1OTZfc21iYSArIDIpCiNkZWZpbmUgU01CSFNUQ01ECSh2dDU5Nl9zbWJhICsgMykKI2RlZmluZSBTTUJIU1RBREQJKHZ0NTk2X3NtYmEgKyA0KQojZGVmaW5lIFNNQkhTVERBVDAJKHZ0NTk2X3NtYmEgKyA1KQojZGVmaW5lIFNNQkhTVERBVDEJKHZ0NTk2X3NtYmEgKyA2KQojZGVmaW5lIFNNQkJMS0RBVAkodnQ1OTZfc21iYSArIDcpCiNkZWZpbmUgU01CU0xWQ05UCSh2dDU5Nl9zbWJhICsgOCkKI2RlZmluZSBTTUJTSERXQ01ECSh2dDU5Nl9zbWJhICsgOSkKI2RlZmluZSBTTUJTTFZFVlQJKHZ0NTk2X3NtYmEgKyAweEEpCiNkZWZpbmUgU01CU0xWREFUCSh2dDU5Nl9zbWJhICsgMHhDKQoKLyogUENJIEFkZHJlc3MgQ29uc3RhbnRzICovCgovKiBTTUJ1cyBkYXRhIGluIGNvbmZpZ3VyYXRpb24gc3BhY2UgY2FuIGJlIGZvdW5kIGluIHR3byBwbGFjZXMsCiAgIFdlIHRyeSB0byBzZWxlY3QgdGhlIGJldHRlciBvbmUqLwoKc3RhdGljIHVuc2lnbmVkIHNob3J0IHNtYl9jZl9oc3RjZmcgPSAweEQyOwoKI2RlZmluZSBTTUJIU1RDRkcgICAoc21iX2NmX2hzdGNmZykKI2RlZmluZSBTTUJTTFZDICAgICAoc21iX2NmX2hzdGNmZyArIDEpCiNkZWZpbmUgU01CU0hEVzEgICAgKHNtYl9jZl9oc3RjZmcgKyAyKQojZGVmaW5lIFNNQlNIRFcyICAgIChzbWJfY2ZfaHN0Y2ZnICsgMykKI2RlZmluZSBTTUJSRVYgICAgICAoc21iX2NmX2hzdGNmZyArIDQpCgovKiBPdGhlciBzZXR0aW5ncyAqLwojZGVmaW5lIE1BWF9USU1FT1VUCTUwMAojZGVmaW5lIEVOQUJMRV9JTlQ5CTAKCi8qIFZUODJDNTk2IGNvbnN0YW50cyAqLwojZGVmaW5lIFZUNTk2X1FVSUNLICAgICAgMHgwMAojZGVmaW5lIFZUNTk2X0JZVEUgICAgICAgMHgwNAojZGVmaW5lIFZUNTk2X0JZVEVfREFUQSAgMHgwOAojZGVmaW5lIFZUNTk2X1dPUkRfREFUQSAgMHgwQwojZGVmaW5lIFZUNTk2X0JMT0NLX0RBVEEgMHgxNAoKCi8qIElmIGZvcmNlIGlzIHNldCB0byBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSAwLCB3ZSBmb3JjaWJseSBlbmFibGUgdGhlCiAgIFZUNTk2LiBEQU5HRVJPVVMhICovCnN0YXRpYyBpbnQgZm9yY2U7Cm1vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoZm9yY2UsICJGb3JjaWJseSBlbmFibGUgdGhlIFNNQnVzLiBEQU5HRVJPVVMhIik7CgovKiBJZiBmb3JjZV9hZGRyIGlzIHNldCB0byBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSAwLCB3ZSBmb3JjaWJseSBlbmFibGUKICAgdGhlIFZUNTk2IGF0IHRoZSBnaXZlbiBhZGRyZXNzLiBWRVJZIERBTkdFUk9VUyEgKi8Kc3RhdGljIHUxNiBmb3JjZV9hZGRyOwptb2R1bGVfcGFyYW0oZm9yY2VfYWRkciwgdXNob3J0LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9hZGRyLAoJCSAiRm9yY2libHkgZW5hYmxlIHRoZSBTTUJ1cyBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIgoJCSAiRVhUUkVNRUxZIERBTkdFUk9VUyEiKTsKCgpzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHZ0NTk2X2FkYXB0ZXI7CgovKiBBbm90aGVyIGludGVybmFsbHkgdXNlZCBmdW5jdGlvbiAqLwpzdGF0aWMgaW50IHZ0NTk2X3RyYW5zYWN0aW9uKHZvaWQpCnsKCWludCB0ZW1wOwoJaW50IHJlc3VsdCA9IDA7CglpbnQgdGltZW91dCA9IDA7CgoJZGV2X2RiZygmdnQ1OTZfYWRhcHRlci5kZXYsICJUcmFuc2FjdGlvbiAocHJlKTogQ05UPSUwMngsIENNRD0lMDJ4LCAiCgkJIkFERD0lMDJ4LCBEQVQwPSUwMngsIERBVDE9JTAyeFxuIiwgaW5iX3AoU01CSFNUQ05UKSwgCgkJaW5iX3AoU01CSFNUQ01EKSwgaW5iX3AoU01CSFNUQUREKSwgaW5iX3AoU01CSFNUREFUMCksIAoJCWluYl9wKFNNQkhTVERBVDEpKTsKCgkvKiBNYWtlIHN1cmUgdGhlIFNNQnVzIGhvc3QgaXMgcmVhZHkgdG8gc3RhcnQgdHJhbnNtaXR0aW5nICovCglpZiAoKHRlbXAgPSBpbmJfcChTTUJIU1RTVFMpKSAmIDB4MUYpIHsKCQlkZXZfZGJnKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIlNNQnVzIGJ1c3kgKDB4JTAyeCkuICIKCQkJCSJSZXNldHRpbmcuLi5cbiIsIHRlbXApOwoJCQoJCW91dGJfcCh0ZW1wLCBTTUJIU1RTVFMpOwoJCWlmICgodGVtcCA9IGluYl9wKFNNQkhTVFNUUykpICYgMHgxRikgewoJCQlkZXZfZGJnKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIkZhaWxlZCEgKDB4JTAyeClcbiIsIHRlbXApOwoJCQkKCQkJcmV0dXJuIC0xOwoJCX0gZWxzZSB7CgkJCWRldl9kYmcoJnZ0NTk2X2FkYXB0ZXIuZGV2LCAiU3VjY2Vzc2Z1bGwhXG4iKTsKCQl9Cgl9CgoJLyogc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGJ5IHNldHRpbmcgYml0IDYgKi8KCW91dGJfcChpbmIoU01CSFNUQ05UKSB8IDB4MDQwLCBTTUJIU1RDTlQpOwoKCS8qIFdlIHdpbGwgYWx3YXlzIHdhaXQgZm9yIGEgZnJhY3Rpb24gb2YgYSBzZWNvbmQhIAoJICAgSSBkb24ndCBrbm93IGlmIFZJQSBuZWVkcyB0aGlzLCBJbnRlbCBkaWQgICovCglkbyB7CgkJbXNsZWVwKDEpOwoJCXRlbXAgPSBpbmJfcChTTUJIU1RTVFMpOwoJfSB3aGlsZSAoKHRlbXAgJiAweDAxKSAmJiAodGltZW91dCsrIDwgTUFYX1RJTUVPVVQpKTsKCgkvKiBJZiB0aGUgU01CdXMgaXMgc3RpbGwgYnVzeSwgd2UgZ2l2ZSB1cCAqLwoJaWYgKHRpbWVvdXQgPj0gTUFYX1RJTUVPVVQpIHsKCQlyZXN1bHQgPSAtMTsKCQlkZXZfZGJnKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIlNNQnVzIFRpbWVvdXQhXG4iKTsKCX0KCglpZiAodGVtcCAmIDB4MTApIHsKCQlyZXN1bHQgPSAtMTsKCQlkZXZfZGJnKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIkVycm9yOiBGYWlsZWQgYnVzIHRyYW5zYWN0aW9uXG4iKTsKCX0KCglpZiAodGVtcCAmIDB4MDgpIHsKCQlyZXN1bHQgPSAtMTsKCQlkZXZfaW5mbygmdnQ1OTZfYWRhcHRlci5kZXYsICJCdXMgY29sbGlzaW9uISBTTUJ1cyBtYXkgYmUgIgoJCQkibG9ja2VkIHVudGlsIG5leHQgaGFyZFxucmVzZXQuIChzb3JyeSEpXG4iKTsKCQkvKiBDbG9jayBzdG9wcyBhbmQgc2xhdmUgaXMgc3R1Y2sgaW4gbWlkLXRyYW5zbWlzc2lvbiAqLwoJfQoKCWlmICh0ZW1wICYgMHgwNCkgewoJCXJlc3VsdCA9IC0xOwoJCWRldl9kYmcoJnZ0NTk2X2FkYXB0ZXIuZGV2LCAiRXJyb3I6IG5vIHJlc3BvbnNlIVxuIik7Cgl9CgoJaWYgKCh0ZW1wID0gaW5iX3AoU01CSFNUU1RTKSkgJiAweDFGKSB7CgkJb3V0Yl9wKHRlbXAsIFNNQkhTVFNUUyk7CgkJaWYgKCh0ZW1wID0gaW5iX3AoU01CSFNUU1RTKSkgJiAweDFGKSB7CgkJCWRldl93YXJuKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIkZhaWxlZCByZXNldCBhdCBlbmQgIgoJCQkJICJvZiB0cmFuc2FjdGlvbiAoJTAyeClcbiIsIHRlbXApOwoJCX0KCX0KCglkZXZfZGJnKCZ2dDU5Nl9hZGFwdGVyLmRldiwgIlRyYW5zYWN0aW9uIChwb3N0KTogQ05UPSUwMngsIENNRD0lMDJ4LCAiCgkJIkFERD0lMDJ4LCBEQVQwPSUwMngsIERBVDE9JTAyeFxuIiwgaW5iX3AoU01CSFNUQ05UKSwKCQlpbmJfcChTTUJIU1RDTUQpLCBpbmJfcChTTUJIU1RBREQpLCBpbmJfcChTTUJIU1REQVQwKSwgCgkJaW5iX3AoU01CSFNUREFUMSkpOwoJCglyZXR1cm4gcmVzdWx0Owp9CgovKiBSZXR1cm4gLTEgb24gZXJyb3IuICovCnN0YXRpYyBzMzIgdnQ1OTZfYWNjZXNzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdTE2IGFkZHIsCgkJdW5zaWduZWQgc2hvcnQgZmxhZ3MsICBjaGFyIHJlYWRfd3JpdGUsIHU4IGNvbW1hbmQsCgkJaW50IHNpemUsICB1bmlvbiBpMmNfc21idXNfZGF0YSAqZGF0YSkKewoJaW50IGksIGxlbjsKCglzd2l0Y2ggKHNpemUpIHsKCWNhc2UgSTJDX1NNQlVTX1BST0NfQ0FMTDoKCQlkZXZfaW5mbygmdnQ1OTZfYWRhcHRlci5kZXYsCgkJCSAiSTJDX1NNQlVTX1BST0NfQ0FMTCBub3Qgc3VwcG9ydGVkIVxuIik7CgkJcmV0dXJuIC0xOwoJY2FzZSBJMkNfU01CVVNfUVVJQ0s6CgkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKCQkgICAgICAgU01CSFNUQUREKTsKCQlzaXplID0gVlQ1OTZfUVVJQ0s7CgkJYnJlYWs7CgljYXNlIEkyQ19TTUJVU19CWVRFOgoJCW91dGJfcCgoKGFkZHIgJiAweDdmKSA8PCAxKSB8IChyZWFkX3dyaXRlICYgMHgwMSksCgkJICAgICAgIFNNQkhTVEFERCk7CgkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKQoJCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKCQlzaXplID0gVlQ1OTZfQllURTsKCQlicmVhazsKCWNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKCQlvdXRiX3AoKChhZGRyICYgMHg3ZikgPDwgMSkgfCAocmVhZF93cml0ZSAmIDB4MDEpLAoJCSAgICAgICBTTUJIU1RBREQpOwoJCW91dGJfcChjb21tYW5kLCBTTUJIU1RDTUQpOwoJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkKCQkJb3V0Yl9wKGRhdGEtPmJ5dGUsIFNNQkhTVERBVDApOwoJCXNpemUgPSBWVDU5Nl9CWVRFX0RBVEE7CgkJYnJlYWs7CgljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6CgkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKCQkgICAgICAgU01CSFNUQUREKTsKCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKCQkJb3V0Yl9wKGRhdGEtPndvcmQgJiAweGZmLCBTTUJIU1REQVQwKTsKCQkJb3V0Yl9wKChkYXRhLT53b3JkICYgMHhmZjAwKSA+PiA4LCBTTUJIU1REQVQxKTsKCQl9CgkJc2l6ZSA9IFZUNTk2X1dPUkRfREFUQTsKCQlicmVhazsKCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6CgkJb3V0Yl9wKCgoYWRkciAmIDB4N2YpIDw8IDEpIHwgKHJlYWRfd3JpdGUgJiAweDAxKSwKCQkgICAgICAgU01CSFNUQUREKTsKCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKCQkJbGVuID0gZGF0YS0+YmxvY2tbMF07CgkJCWlmIChsZW4gPCAwKQoJCQkJbGVuID0gMDsKCQkJaWYgKGxlbiA+IEkyQ19TTUJVU19CTE9DS19NQVgpCgkJCQlsZW4gPSBJMkNfU01CVVNfQkxPQ0tfTUFYOwoJCQlvdXRiX3AobGVuLCBTTUJIU1REQVQwKTsKCQkJaSA9IGluYl9wKFNNQkhTVENOVCk7CS8qIFJlc2V0IFNNQkJMS0RBVCAqLwoJCQlmb3IgKGkgPSAxOyBpIDw9IGxlbjsgaSsrKQoJCQkJb3V0Yl9wKGRhdGEtPmJsb2NrW2ldLCBTTUJCTEtEQVQpOwoJCX0KCQlzaXplID0gVlQ1OTZfQkxPQ0tfREFUQTsKCQlicmVhazsKCX0KCglvdXRiX3AoKHNpemUgJiAweDFDKSArIChFTkFCTEVfSU5UOSAmIDEpLCBTTUJIU1RDTlQpOwoKCWlmICh2dDU5Nl90cmFuc2FjdGlvbigpKSAvKiBFcnJvciBpbiB0cmFuc2FjdGlvbiAqLwoJCXJldHVybiAtMTsKCglpZiAoKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB8fCAoc2l6ZSA9PSBWVDU5Nl9RVUlDSykpCgkJcmV0dXJuIDA7CgoJc3dpdGNoIChzaXplKSB7CgljYXNlIFZUNTk2X0JZVEU6CgkJLyogV2hlcmUgaXMgdGhlIHJlc3VsdCBwdXQ/IEkgYXNzdW1lIGhlcmUgaXQgaXMgaW4KCQkgKiBTTUJIU1REQVQwIGJ1dCBpdCBtaWdodCBqdXN0IGFzIHdlbGwgYmUgaW4gdGhlCgkJICogU01CSFNUQ01ELiBObyBjbHVlIGluIHRoZSBkb2NzIAoJCSAqLwoJCWRhdGEtPmJ5dGUgPSBpbmJfcChTTUJIU1REQVQwKTsKCQlicmVhazsKCWNhc2UgVlQ1OTZfQllURV9EQVRBOgoJCWRhdGEtPmJ5dGUgPSBpbmJfcChTTUJIU1REQVQwKTsKCQlicmVhazsKCWNhc2UgVlQ1OTZfV09SRF9EQVRBOgoJCWRhdGEtPndvcmQgPSBpbmJfcChTTUJIU1REQVQwKSArIChpbmJfcChTTUJIU1REQVQxKSA8PCA4KTsKCQlicmVhazsKCWNhc2UgVlQ1OTZfQkxPQ0tfREFUQToKCQlkYXRhLT5ibG9ja1swXSA9IGluYl9wKFNNQkhTVERBVDApOwoJCWlmIChkYXRhLT5ibG9ja1swXSA+IEkyQ19TTUJVU19CTE9DS19NQVgpCgkJCWRhdGEtPmJsb2NrWzBdID0gSTJDX1NNQlVTX0JMT0NLX01BWDsKCQlpID0gaW5iX3AoU01CSFNUQ05UKTsJLyogUmVzZXQgU01CQkxLREFUICovCgkJZm9yIChpID0gMTsgaSA8PSBkYXRhLT5ibG9ja1swXTsgaSsrKQoJCQlkYXRhLT5ibG9ja1tpXSA9IGluYl9wKFNNQkJMS0RBVCk7CgkJYnJlYWs7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIHUzMiB2dDU5Nl9mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKewoJcmV0dXJuIEkyQ19GVU5DX1NNQlVTX1FVSUNLIHwgSTJDX0ZVTkNfU01CVVNfQllURSB8CgkgICAgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBIHwKCSAgICBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBOwp9CgpzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0gewoJLm5hbWUJCT0gIk5vbi1JMkMgU01CdXMgYWRhcHRlciIsCgkuaWQJCT0gSTJDX0FMR09fU01CVVMsCgkuc21idXNfeGZlcgk9IHZ0NTk2X2FjY2VzcywKCS5mdW5jdGlvbmFsaXR5CT0gdnQ1OTZfZnVuYywKfTsKCnN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgdnQ1OTZfYWRhcHRlciA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCgkuYWxnbwkJPSAmc21idXNfYWxnb3JpdGhtLAoJLm5hbWUJCT0gInVuc2V0IiwKfTsKCnN0YXRpYyBpbnQgX19kZXZpbml0IHZ0NTk2X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAoJCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKewoJdW5zaWduZWQgY2hhciB0ZW1wOwoJaW50IGVycm9yID0gLUVOT0RFVjsKCQoJLyogRGV0ZXJtaW5lIHRoZSBhZGRyZXNzIG9mIHRoZSBTTUJ1cyBhcmVhcyAqLwoJaWYgKGZvcmNlX2FkZHIpIHsKCQl2dDU5Nl9zbWJhID0gZm9yY2VfYWRkciAmIDB4ZmZmMDsKCQlmb3JjZSA9IDA7CgkJZ290byBmb3VuZDsKCX0KCglpZiAoKHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIGlkLT5kcml2ZXJfZGF0YSwgJnZ0NTk2X3NtYmEpKSB8fAoJICAgICEodnQ1OTZfc21iYSAmIDB4MSkpIHsKCQkvKiB0cnkgMm5kIGFkZHJlc3MgYW5kIGNvbmZpZyByZWcuIGZvciA1OTYgKi8KCQlpZiAoaWQtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OTZfMyAmJgoJCSAgICAhcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgU01CQkEyLCAmdnQ1OTZfc21iYSkgJiYKCQkgICAgKHZ0NTk2X3NtYmEgJiAweDEpKSB7CgkJCXNtYl9jZl9oc3RjZmcgPSAweDg0OwoJCX0gZWxzZSB7CgkJCS8qIG5vIG1hdGNoZXMgYXQgYWxsICovCgkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBjb25maWd1cmUgIgoJCQkJIlNNQnVzIEkvTyBCYXNlIGFkZHJlc3NcbiIpOwoJCQlyZXR1cm4gLUVOT0RFVjsKCQl9Cgl9CgoJdnQ1OTZfc21iYSAmPSAweGZmZjA7CglpZiAodnQ1OTZfc21iYSA9PSAwKSB7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAiU01CdXMgYmFzZSBhZGRyZXNzICIKCQkJInVuaW5pdGlhbGl6ZWQgLSB1cGdyYWRlIEJJT1Mgb3IgdXNlICIKCQkJImZvcmNlX2FkZHI9MHhhZGRyXG4iKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCiBmb3VuZDoKCWlmICghcmVxdWVzdF9yZWdpb24odnQ1OTZfc21iYSwgOCwgInZpYXByby1zbWJ1cyIpKSB7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAiU01CdXMgcmVnaW9uIDB4JXggYWxyZWFkeSBpbiB1c2UhXG4iLAoJCSAgICAgICAgdnQ1OTZfc21iYSk7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgU01CSFNUQ0ZHLCAmdGVtcCk7CgkvKiBJZiBmb3JjZV9hZGRyIGlzIHNldCwgd2UgcHJvZ3JhbSB0aGUgbmV3IGFkZHJlc3MgaGVyZS4gSnVzdCB0byBtYWtlCgkgICBzdXJlLCB3ZSBkaXNhYmxlIHRoZSBWVDU5NiBmaXJzdC4gKi8KCWlmIChmb3JjZV9hZGRyKSB7CgkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFNNQkhTVENGRywgdGVtcCAmIDB4ZmUpOwoJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBpZC0+ZHJpdmVyX2RhdGEsIHZ0NTk2X3NtYmEpOwoJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBTTUJIU1RDRkcsIHRlbXAgfCAweDAxKTsKCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiV0FSTklORzogU01CdXMgaW50ZXJmYWNlIHNldCB0byBuZXcgIgoJCSAgICAgImFkZHJlc3MgMHglMDR4IVxuIiwgdnQ1OTZfc21iYSk7Cgl9IGVsc2UgaWYgKCh0ZW1wICYgMSkgPT0gMCkgewoJCWlmIChmb3JjZSkgewoJCQkvKiBOT1RFOiBUaGlzIGFzc3VtZXMgSS9PIHNwYWNlIGFuZCBvdGhlciBhbGxvY2F0aW9ucyAKCQkJICogV0VSRSBkb25lIGJ5IHRoZSBCaW9zISAgRG9uJ3QgY29tcGxhaW4gaWYgeW91ciAKCQkJICogaGFyZHdhcmUgZG9lcyB3ZWlyZCB0aGluZ3MgYWZ0ZXIgZW5hYmxpbmcgdGhpcy4gCgkJCSAqIDonKSBDaGVjayBmb3IgQmlvcyB1cGRhdGVzIGJlZm9yZSByZXNvcnRpbmcgdG8gCgkJCSAqIHRoaXMuCgkJCSAqLwoJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgU01CSFNUQ0ZHLCB0ZW1wIHwgMSk7CgkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJFbmFibGluZyBTTUJ1cyBkZXZpY2VcbiIpOwoJCX0gZWxzZSB7CgkJCWRldl9lcnIoJnBkZXYtPmRldiwgIlNNQlVTOiBFcnJvcjogSG9zdCBTTUJ1cyAiCgkJCQkiY29udHJvbGxlciBub3QgZW5hYmxlZCEgLSB1cGdyYWRlIEJJT1Mgb3IgIgoJCQkJInVzZSBmb3JjZT0xXG4iKTsKCQkJZ290byByZWxlYXNlX3JlZ2lvbjsKCQl9Cgl9CgoJaWYgKCh0ZW1wICYgMHgwRSkgPT0gOCkKCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJ1c2luZyBJbnRlcnJ1cHQgOSBmb3IgU01CdXMuXG4iKTsKCWVsc2UgaWYgKCh0ZW1wICYgMHgwRSkgPT0gMCkKCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJ1c2luZyBJbnRlcnJ1cHQgU01JIyBmb3IgU01CdXMuXG4iKTsKCWVsc2UKCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJJbGxlZ2FsIEludGVycnVwdCBjb25maWd1cmF0aW9uICIKCQkJIihvciBjb2RlIG91dCBvZiBkYXRlKSFcbiIpOwoKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFNNQlJFViwgJnRlbXApOwoJZGV2X2RiZygmcGRldi0+ZGV2LCAiU01CUkVWID0gMHglWFxuIiwgdGVtcCk7CglkZXZfZGJnKCZwZGV2LT5kZXYsICJWVDU5Nl9zbWJhID0gMHglWFxuIiwgdnQ1OTZfc21iYSk7CgoJdnQ1OTZfYWRhcHRlci5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKCXNucHJpbnRmKHZ0NTk2X2FkYXB0ZXIubmFtZSwgSTJDX05BTUVfU0laRSwKCQkJIlNNQnVzIFZpYSBQcm8gYWRhcHRlciBhdCAlMDR4IiwgdnQ1OTZfc21iYSk7CgkKCXZ0NTk2X3BkZXYgPSBwY2lfZGV2X2dldChwZGV2KTsKCWlmIChpMmNfYWRkX2FkYXB0ZXIoJnZ0NTk2X2FkYXB0ZXIpKSB7CgkJcGNpX2Rldl9wdXQodnQ1OTZfcGRldik7CgkJdnQ1OTZfcGRldiA9IE5VTEw7Cgl9CgoJLyogQWx3YXlzIHJldHVybiBmYWlsdXJlIGhlcmUuICBUaGlzIGlzIHRvIGFsbG93IG90aGVyIGRyaXZlcnMgdG8gYmluZAoJICogdG8gdGhpcyBwY2kgZGV2aWNlLiAgV2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gaGF2ZSBjb250cm9sIG92ZXIgdGhlCgkgKiBwY2kgZGV2aWNlLCB3ZSBvbmx5IHdhbnRlZCB0byByZWFkIGFzIGZldyByZWdpc3RlciB2YWx1ZXMgZnJvbSBpdC4KCSAqLwoJcmV0dXJuIC1FTk9ERVY7CgogcmVsZWFzZV9yZWdpb246CglyZWxlYXNlX3JlZ2lvbih2dDU5Nl9zbWJhLCA4KTsKCXJldHVybiBlcnJvcjsKfQoKc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZ0NTk2X2lkc1tdID0gewoJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OTZfMyksCgkgIC5kcml2ZXJfZGF0YSA9IFNNQkJBMSB9LAoJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OTZCXzMpLAoJICAuZHJpdmVyX2RhdGEgPSBTTUJCQTEgfSwKCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2XzQpLAoJICAuZHJpdmVyX2RhdGEgPSBTTUJCQTEgfSwKCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODIzM18wKSwKCSAgLmRyaXZlcl9kYXRhID0gU01CQkEzIH0sCgl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyMzNBKSwKCSAgLmRyaXZlcl9kYXRhID0gU01CQkEzIH0sCgl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyMzUpLAoJICAuZHJpdmVyX2RhdGEgPSBTTUJCQTMgfSwKCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODIzNyksCgkgIC5kcml2ZXJfZGF0YSA9IFNNQkJBMyB9LAoJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MjMxXzQpLAoJICAuZHJpdmVyX2RhdGEgPSBTTUJCQTEgfSwKCXsgMCwgfQp9OwoKTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCB2dDU5Nl9pZHMpOwoKc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZ0NTk2X2RyaXZlciA9IHsKCS5uYW1lCQk9ICJ2dDU5Nl9zbWJ1cyIsCgkuaWRfdGFibGUJPSB2dDU5Nl9pZHMsCgkucHJvYmUJCT0gdnQ1OTZfcHJvYmUsCn07CgpzdGF0aWMgaW50IF9faW5pdCBpMmNfdnQ1OTZfaW5pdCh2b2lkKQp7CglyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdnQ1OTZfZHJpdmVyKTsKfQoKCnN0YXRpYyB2b2lkIF9fZXhpdCBpMmNfdnQ1OTZfZXhpdCh2b2lkKQp7CglwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZ0NTk2X2RyaXZlcik7CglpZiAodnQ1OTZfcGRldiAhPSBOVUxMKSB7CgkJaTJjX2RlbF9hZGFwdGVyKCZ2dDU5Nl9hZGFwdGVyKTsKCQlyZWxlYXNlX3JlZ2lvbih2dDU5Nl9zbWJhLCA4KTsKCQlwY2lfZGV2X3B1dCh2dDU5Nl9wZGV2KTsKCQl2dDU5Nl9wZGV2ID0gTlVMTDsKCX0KfQoKTU9EVUxFX0FVVEhPUigKICAgICJGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+IGFuZCAiCiAgICAiUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oInZ0ODJjNTk2IFNNQnVzIGRyaXZlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cgptb2R1bGVfaW5pdChpMmNfdnQ1OTZfaW5pdCk7Cm1vZHVsZV9leGl0KGkyY192dDU5Nl9leGl0KTsK