LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBpMmMtYWxnby1zaWJ5dGUuYyBpMmMgZHJpdmVyIGFsZ29yaXRobXMgZm9yIGJpdC1zaGlmdCBhZGFwdGVycwkJICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIsMjAwMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICAgIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFNpbW9uIEcuIFZvZ2wKCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4JCSAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogV2l0aCBzb21lIGNoYW5nZXMgZnJvbSBLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4gYW5kIGV2ZW4KICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPi4gICovCgovKiBQb3J0ZWQgZm9yIFNpQnl0ZSBTT0NzIGJ5IEJyb2FkY29tIENvcnBvcmF0aW9uLiAgKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfcmVncy5oPgojaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfc21idXMuaD4KCiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLXNpYnl0ZS5oPgoKLyogLS0tLS0gZ2xvYmFsIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KI2RlZmluZSBTTUJfQ1NSKGEscikgKChsb25nKShhLT5yZWdfYmFzZSArIHIpKQoKLyogLS0tLS0gZ2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KCi8qIG1vZHVsZSBwYXJhbWV0ZXJzOgogKi8Kc3RhdGljIGludCBiaXRfc2NhbjsJLyogaGF2ZSBhIGxvb2sgYXQgd2hhdCdzIGhhbmdpbmcgJ3JvdW5kCQkqLwoKCnN0YXRpYyBpbnQgc21idXNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCB1MTYgYWRkciwgCiAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLAogICAgICAgICAgICAgICAgICAgICAgdTggY29tbWFuZCwgaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKewoJc3RydWN0IGkyY19hbGdvX3NpYnl0ZV9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKICAgICAgICBpbnQgZGF0YV9ieXRlcyA9IDA7CiAgICAgICAgaW50IGVycm9yOwoKICAgICAgICB3aGlsZSAoY3NyX2luMzIoU01CX0NTUihhZGFwLCBSX1NNQl9TVEFUVVMpKSAmIE1fU01CX0JVU1kpCiAgICAgICAgICAgICAgICA7CgogICAgICAgIHN3aXRjaCAoc2l6ZSkgewogICAgICAgIGNhc2UgSTJDX1NNQlVTX1FVSUNLOgogICAgICAgICAgICAgICAgY3NyX291dDMyKChWX1NNQl9BRERSKGFkZHIpIHwgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQgPyBNX1NNQl9RREFUQSA6IDApIHwKCQkJICAgVl9TTUJfVFRfUVVJQ0tDTUQpLCBTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVJUKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEkyQ19TTUJVU19CWVRFOgogICAgICAgICAgICAgICAgaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKChWX1NNQl9BRERSKGFkZHIpIHwgVl9TTUJfVFRfUkQxQllURSksCgkJCQkgIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBUlQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9ieXRlcyA9IDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoVl9TTUJfQ01EKGNvbW1hbmQpLCBTTUJfQ1NSKGFkYXAsIFJfU01CX0NNRCkpOwogICAgICAgICAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoKFZfU01CX0FERFIoYWRkcikgfCBWX1NNQl9UVF9XUjFCWVRFKSwKCQkJCSAgU01CX0NTUihhZGFwLCBSX1NNQl9TVEFSVCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgogICAgICAgICAgICAgICAgY3NyX291dDMyKFZfU01CX0NNRChjb21tYW5kKSwgU01CX0NTUihhZGFwLCBSX1NNQl9DTUQpKTsKICAgICAgICAgICAgICAgIGlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMigoVl9TTUJfQUREUihhZGRyKSB8IFZfU01CX1RUX0NNRF9SRDFCWVRFKSwKCQkJCSAgU01CX0NTUihhZGFwLCBSX1NNQl9TVEFSVCkpOwogICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2J5dGVzID0gMTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMihWX1NNQl9MQihkYXRhLT5ieXRlKSwgU01CX0NTUihhZGFwLCBSX1NNQl9EQVRBKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMigoVl9TTUJfQUREUihhZGRyKSB8IFZfU01CX1RUX1dSMkJZVEUpLAoJCQkJICBTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVJUKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6CiAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoVl9TTUJfQ01EKGNvbW1hbmQpLCBTTUJfQ1NSKGFkYXAsIFJfU01CX0NNRCkpOwogICAgICAgICAgICAgICAgaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKChWX1NNQl9BRERSKGFkZHIpIHwgVl9TTUJfVFRfQ01EX1JEMkJZVEUpLAoJCQkJICBTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVJUKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfYnl0ZXMgPSAyOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKFZfU01CX0xCKGRhdGEtPndvcmQgJiAweGZmKSwgU01CX0NTUihhZGFwLCBSX1NNQl9EQVRBKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMihWX1NNQl9NQihkYXRhLT53b3JkID4+IDgpLCBTTUJfQ1NSKGFkYXAsIFJfU01CX0RBVEEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKChWX1NNQl9BRERSKGFkZHIpIHwgVl9TTUJfVFRfV1IyQllURSksCgkJCQkgIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBUlQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgLyogWFhYS1cgYmV0dGVyIGVycm9yIGNvZGU/ICovCiAgICAgICAgfQoKICAgICAgICB3aGlsZSAoY3NyX2luMzIoU01CX0NTUihhZGFwLCBSX1NNQl9TVEFUVVMpKSAmIE1fU01CX0JVU1kpCiAgICAgICAgICAgICAgICA7CgogICAgICAgIGVycm9yID0gY3NyX2luMzIoU01CX0NTUihhZGFwLCBSX1NNQl9TVEFUVVMpKTsKICAgICAgICBpZiAoZXJyb3IgJiBNX1NNQl9FUlJPUikgewogICAgICAgICAgICAgICAgLyogQ2xlYXIgZXJyb3IgYml0IGJ5IHdyaXRpbmcgYSAxICovCiAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoTV9TTUJfRVJST1IsIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBVFVTKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgLyogWFhYS1cgYmV0dGVyIGVycm9yIGNvZGU/ICovCiAgICAgICAgfQoKICAgICAgICBpZiAoZGF0YV9ieXRlcyA9PSAxKQogICAgICAgICAgICAgICAgZGF0YS0+Ynl0ZSA9IGNzcl9pbjMyKFNNQl9DU1IoYWRhcCwgUl9TTUJfREFUQSkpICYgMHhmZjsKICAgICAgICBpZiAoZGF0YV9ieXRlcyA9PSAyKQogICAgICAgICAgICAgICAgZGF0YS0+d29yZCA9IGNzcl9pbjMyKFNNQl9DU1IoYWRhcCwgUl9TTUJfREFUQSkpICYgMHhmZmZmOwoKICAgICAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCBhbGdvX2NvbnRyb2woc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCAKCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglyZXR1cm4gMDsKfQoKc3RhdGljIHUzMiBiaXRfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCXJldHVybiAoSTJDX0ZVTkNfU01CVVNfUVVJQ0sgfCBJMkNfRlVOQ19TTUJVU19CWVRFIHwKICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8IEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSk7Cn0KCgovKiAtLS0tLWV4cG9ydGVkIGFsZ29yaXRobSBkYXRhOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCgpzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gaTJjX3NpYnl0ZV9hbGdvID0gewoJLnNtYnVzX3hmZXIJPSBzbWJ1c194ZmVyLAoJLmFsZ29fY29udHJvbAk9IGFsZ29fY29udHJvbCwgLyogaW9jdGwgKi8KCS5mdW5jdGlvbmFsaXR5CT0gYml0X2Z1bmMsCn07CgovKiAKICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGxvYWQgYWxnb3JpdGhtcyBhdCBydW50aW1lIAogKi8KaW50IGkyY19zaWJ5dGVfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBpbnQgc3BlZWQpCnsKCWludCBpOwoJc3RydWN0IGkyY19hbGdvX3NpYnl0ZV9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKCgkvKiByZWdpc3RlciBuZXcgYWRhcHRlciB0byBpMmMgbW9kdWxlLi4uICovCglpMmNfYWRhcC0+YWxnbyA9ICZpMmNfc2lieXRlX2FsZ287CiAgICAgICAgCiAgICAgICAgLyogU2V0IHRoZSBmcmVxdWVuY3kgdG8gMTAwIGtIeiAqLwogICAgICAgIGNzcl9vdXQzMihzcGVlZCwgU01CX0NTUihhZGFwLFJfU01CX0ZSRVEpKTsKICAgICAgICBjc3Jfb3V0MzIoMCwgU01CX0NTUihhZGFwLFJfU01CX0NPTlRST0wpKTsKCgkvKiBzY2FuIGJ1cyAqLwoJaWYgKGJpdF9zY2FuKSB7CiAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwogICAgICAgICAgICAgICAgaW50IHJjOwoJCXByaW50ayhLRVJOX0lORk8gIiBpMmMtYWxnby1zaWJ5dGUubzogc2Nhbm5pbmcgYnVzICVzLlxuIiwKCQkgICAgICAgaTJjX2FkYXAtPm5hbWUpOwoJCWZvciAoaSA9IDB4MDA7IGkgPCAweDdmOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYS1cgaXMgdGhpcyBhIHJlYWxpc3RpYyBwcm9iZT8gKi8KICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBzbWJ1c194ZmVyKGkyY19hZGFwLCBpLCAwLCBJMkNfU01CVVNfUkVBRCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19TTUJVU19CWVRFX0RBVEEsICZkYXRhKTsKCQkJaWYgKCFyYykgewoJCQkJcHJpbnRrKCIoJTAyeCkiLGkpOyAKCQkJfSBlbHNlIAoJCQkJcHJpbnRrKCIuIik7IAoJCX0KCQlwcmludGsoIlxuIik7Cgl9CgoJcmV0dXJuIGkyY19hZGRfYWRhcHRlcihpMmNfYWRhcCk7Cn0KCgppbnQgaTJjX3NpYnl0ZV9kZWxfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKewoJaW50IHJlczsKCglpZiAoKHJlcyA9IGkyY19kZWxfYWRhcHRlcihhZGFwKSkgPCAwKQoJCXJldHVybiByZXM7CgoJcmV0dXJuIDA7Cn0KCmludCBfX2luaXQgaTJjX2FsZ29fc2lieXRlX2luaXQgKHZvaWQpCnsKCXByaW50aygiaTJjLWFsZ28tc2lieXRlLm86IGkyYyBTaUJ5dGUgYWxnb3JpdGhtIG1vZHVsZVxuIik7CglyZXR1cm4gMDsKfQoKCkVYUE9SVF9TWU1CT0woaTJjX3NpYnl0ZV9hZGRfYnVzKTsKRVhQT1JUX1NZTUJPTChpMmNfc2lieXRlX2RlbF9idXMpOwoKI2lmZGVmIE1PRFVMRQpNT0RVTEVfQVVUSE9SKCJLaXAgV2Fsa2VyLCBCcm9hZGNvbSBDb3JwLiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlNpQnl0ZSBJMkMtQnVzIGFsZ29yaXRobSIpOwptb2R1bGVfcGFyYW0oYml0X3NjYW4sIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoYml0X3NjYW4sICJTY2FuIGZvciBhY3RpdmUgY2hpcHMgb24gdGhlIGJ1cyIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgppbnQgaW5pdF9tb2R1bGUodm9pZCkgCnsKCXJldHVybiBpMmNfYWxnb19zaWJ5dGVfaW5pdCgpOwp9Cgp2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpIAp7Cn0KI2VuZGlmCg==