LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBpMmMtYWxnby1zaWJ5dGUuYyBpMmMgZHJpdmVyIGFsZ29yaXRobXMgZm9yIGJpdC1zaGlmdCBhZGFwdGVycwkJICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIsMjAwMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICAgIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFNpbW9uIEcuIFZvZ2wKCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4JCSAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogV2l0aCBzb21lIGNoYW5nZXMgZnJvbSBLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4gYW5kIGV2ZW4KICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPi4gICovCgovKiBQb3J0ZWQgZm9yIFNpQnl0ZSBTT0NzIGJ5IEJyb2FkY29tIENvcnBvcmF0aW9uLiAgKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfcmVncy5oPgojaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfc21idXMuaD4KCiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLXNpYnl0ZS5oPgoKLyogLS0tLS0gZ2xvYmFsIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KI2RlZmluZSBTTUJfQ1NSKGEscikgKChsb25nKShhLT5yZWdfYmFzZSArIHIpKQoKLyogLS0tLS0gZ2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KCi8qIG1vZHVsZSBwYXJhbWV0ZXJzOgogKi8Kc3RhdGljIGludCBiaXRfc2NhbjsJLyogaGF2ZSBhIGxvb2sgYXQgd2hhdCdzIGhhbmdpbmcgJ3JvdW5kCQkqLwoKCnN0YXRpYyBpbnQgc21idXNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCB1MTYgYWRkciwgCiAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLAogICAgICAgICAgICAgICAgICAgICAgdTggY29tbWFuZCwgaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKewoJc3RydWN0IGkyY19hbGdvX3NpYnl0ZV9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKICAgICAgICBpbnQgZGF0YV9ieXRlcyA9IDA7CiAgICAgICAgaW50IGVycm9yOwoKICAgICAgICB3aGlsZSAoY3NyX2luMzIoU01CX0NTUihhZGFwLCBSX1NNQl9TVEFUVVMpKSAmIE1fU01CX0JVU1kpCiAgICAgICAgICAgICAgICA7CgogICAgICAgIHN3aXRjaCAoc2l6ZSkgewogICAgICAgIGNhc2UgSTJDX1NNQlVTX1FVSUNLOgogICAgICAgICAgICAgICAgY3NyX291dDMyKChWX1NNQl9BRERSKGFkZHIpIHwgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQgPyBNX1NNQl9RREFUQSA6IDApIHwKCQkJICAgVl9TTUJfVFRfUVVJQ0tDTUQpLCBTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVJUKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEkyQ19TTUJVU19CWVRFOgogICAgICAgICAgICAgICAgaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKChWX1NNQl9BRERSKGFkZHIpIHwgVl9TTUJfVFRfUkQxQllURSksCgkJCQkgIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBUlQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9ieXRlcyA9IDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoVl9TTUJfQ01EKGNvbW1hbmQpLCBTTUJfQ1NSKGFkYXAsIFJfU01CX0NNRCkpOwogICAgICAgICAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoKFZfU01CX0FERFIoYWRkcikgfCBWX1NNQl9UVF9XUjFCWVRFKSwKCQkJCSAgU01CX0NTUihhZGFwLCBSX1NNQl9TVEFSVCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgogICAgICAgICAgICAgICAgY3NyX291dDMyKFZfU01CX0NNRChjb21tYW5kKSwgU01CX0NTUihhZGFwLCBSX1NNQl9DTUQpKTsKICAgICAgICAgICAgICAgIGlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMigoVl9TTUJfQUREUihhZGRyKSB8IFZfU01CX1RUX0NNRF9SRDFCWVRFKSwKCQkJCSAgU01CX0NTUihhZGFwLCBSX1NNQl9TVEFSVCkpOwogICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2J5dGVzID0gMTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMihWX1NNQl9MQihkYXRhLT5ieXRlKSwgU01CX0NTUihhZGFwLCBSX1NNQl9EQVRBKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMigoVl9TTUJfQUREUihhZGRyKSB8IFZfU01CX1RUX1dSMkJZVEUpLAoJCQkJICBTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVJUKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6CiAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoVl9TTUJfQ01EKGNvbW1hbmQpLCBTTUJfQ1NSKGFkYXAsIFJfU01CX0NNRCkpOwogICAgICAgICAgICAgICAgaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKChWX1NNQl9BRERSKGFkZHIpIHwgVl9TTUJfVFRfQ01EX1JEMkJZVEUpLAoJCQkJICBTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVJUKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfYnl0ZXMgPSAyOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKFZfU01CX0xCKGRhdGEtPndvcmQgJiAweGZmKSwgU01CX0NTUihhZGFwLCBSX1NNQl9EQVRBKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMihWX1NNQl9NQihkYXRhLT53b3JkID4+IDgpLCBTTUJfQ1NSKGFkYXAsIFJfU01CX0RBVEEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKChWX1NNQl9BRERSKGFkZHIpIHwgVl9TTUJfVFRfV1IyQllURSksCgkJCQkgIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBUlQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgLyogWFhYS1cgYmV0dGVyIGVycm9yIGNvZGU/ICovCiAgICAgICAgfQoKICAgICAgICB3aGlsZSAoY3NyX2luMzIoU01CX0NTUihhZGFwLCBSX1NNQl9TVEFUVVMpKSAmIE1fU01CX0JVU1kpCiAgICAgICAgICAgICAgICA7CgogICAgICAgIGVycm9yID0gY3NyX2luMzIoU01CX0NTUihhZGFwLCBSX1NNQl9TVEFUVVMpKTsKICAgICAgICBpZiAoZXJyb3IgJiBNX1NNQl9FUlJPUikgewogICAgICAgICAgICAgICAgLyogQ2xlYXIgZXJyb3IgYml0IGJ5IHdyaXRpbmcgYSAxICovCiAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoTV9TTUJfRVJST1IsIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBVFVTKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgLyogWFhYS1cgYmV0dGVyIGVycm9yIGNvZGU/ICovCiAgICAgICAgfQoKICAgICAgICBpZiAoZGF0YV9ieXRlcyA9PSAxKQogICAgICAgICAgICAgICAgZGF0YS0+Ynl0ZSA9IGNzcl9pbjMyKFNNQl9DU1IoYWRhcCwgUl9TTUJfREFUQSkpICYgMHhmZjsKICAgICAgICBpZiAoZGF0YV9ieXRlcyA9PSAyKQogICAgICAgICAgICAgICAgZGF0YS0+d29yZCA9IGNzcl9pbjMyKFNNQl9DU1IoYWRhcCwgUl9TTUJfREFUQSkpICYgMHhmZmZmOwoKICAgICAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCBhbGdvX2NvbnRyb2woc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCAKCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglyZXR1cm4gMDsKfQoKc3RhdGljIHUzMiBiaXRfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCXJldHVybiAoSTJDX0ZVTkNfU01CVVNfUVVJQ0sgfCBJMkNfRlVOQ19TTUJVU19CWVRFIHwKICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8IEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSk7Cn0KCgovKiAtLS0tLWV4cG9ydGVkIGFsZ29yaXRobSBkYXRhOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCgpzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gaTJjX3NpYnl0ZV9hbGdvID0gewoJLnNtYnVzX3hmZXIJPSBzbWJ1c194ZmVyLAoJLmFsZ29fY29udHJvbAk9IGFsZ29fY29udHJvbCwgLyogaW9jdGwgKi8KCS5mdW5jdGlvbmFsaXR5CT0gYml0X2Z1bmMsCn07CgovKiAKICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGxvYWQgYWxnb3JpdGhtcyBhdCBydW50aW1lIAogKi8KaW50IGkyY19zaWJ5dGVfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBpbnQgc3BlZWQpCnsKCWludCBpOwoJc3RydWN0IGkyY19hbGdvX3NpYnl0ZV9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKCgkvKiByZWdpc3RlciBuZXcgYWRhcHRlciB0byBpMmMgbW9kdWxlLi4uICovCglpMmNfYWRhcC0+YWxnbyA9ICZpMmNfc2lieXRlX2FsZ287CiAgICAgICAgCiAgICAgICAgLyogU2V0IHRoZSBmcmVxdWVuY3kgdG8gMTAwIGtIeiAqLwogICAgICAgIGNzcl9vdXQzMihzcGVlZCwgU01CX0NTUihhZGFwLFJfU01CX0ZSRVEpKTsKICAgICAgICBjc3Jfb3V0MzIoMCwgU01CX0NTUihhZGFwLFJfU01CX0NPTlRST0wpKTsKCgkvKiBzY2FuIGJ1cyAqLwoJaWYgKGJpdF9zY2FuKSB7CiAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwogICAgICAgICAgICAgICAgaW50IHJjOwoJCXByaW50ayhLRVJOX0lORk8gIiBpMmMtYWxnby1zaWJ5dGUubzogc2Nhbm5pbmcgYnVzICVzLlxuIiwKCQkgICAgICAgaTJjX2FkYXAtPm5hbWUpOwoJCWZvciAoaSA9IDB4MDA7IGkgPCAweDdmOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYS1cgaXMgdGhpcyBhIHJlYWxpc3RpYyBwcm9iZT8gKi8KICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBzbWJ1c194ZmVyKGkyY19hZGFwLCBpLCAwLCBJMkNfU01CVVNfUkVBRCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19TTUJVU19CWVRFX0RBVEEsICZkYXRhKTsKCQkJaWYgKCFyYykgewoJCQkJcHJpbnRrKCIoJTAyeCkiLGkpOyAKCQkJfSBlbHNlIAoJCQkJcHJpbnRrKCIuIik7IAoJCX0KCQlwcmludGsoIlxuIik7Cgl9CgoJaTJjX2FkZF9hZGFwdGVyKGkyY19hZGFwKTsKCglyZXR1cm4gMDsKfQoKCmludCBpMmNfc2lieXRlX2RlbF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CglpbnQgcmVzOwoKCWlmICgocmVzID0gaTJjX2RlbF9hZGFwdGVyKGFkYXApKSA8IDApCgkJcmV0dXJuIHJlczsKCglyZXR1cm4gMDsKfQoKaW50IF9faW5pdCBpMmNfYWxnb19zaWJ5dGVfaW5pdCAodm9pZCkKewoJcHJpbnRrKCJpMmMtYWxnby1zaWJ5dGUubzogaTJjIFNpQnl0ZSBhbGdvcml0aG0gbW9kdWxlXG4iKTsKCXJldHVybiAwOwp9CgoKRVhQT1JUX1NZTUJPTChpMmNfc2lieXRlX2FkZF9idXMpOwpFWFBPUlRfU1lNQk9MKGkyY19zaWJ5dGVfZGVsX2J1cyk7CgojaWZkZWYgTU9EVUxFCk1PRFVMRV9BVVRIT1IoIktpcCBXYWxrZXIsIEJyb2FkY29tIENvcnAuIik7Ck1PRFVMRV9ERVNDUklQVElPTigiU2lCeXRlIEkyQy1CdXMgYWxnb3JpdGhtIik7Cm1vZHVsZV9wYXJhbShiaXRfc2NhbiwgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhiaXRfc2NhbiwgIlNjYW4gZm9yIGFjdGl2ZSBjaGlwcyBvbiB0aGUgYnVzIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCmludCBpbml0X21vZHVsZSh2b2lkKSAKewoJcmV0dXJuIGkyY19hbGdvX3NpYnl0ZV9pbml0KCk7Cn0KCnZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkgCnsKfQojZW5kaWYK