LyoKICogRGVidWdnZXIgc3RhY2sgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAqIENvcHlyaWdodCAxOTk2IEVyaWMgWW91bmdkYWxlCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojaW5jbHVkZSAiZGVidWdnZXIuaCIKI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKCiNpZmRlZiBfX2kzODZfXwovKgogKiBXZSBrZWVwIHRoaXMgaW5mbyBmb3IgZWFjaCBmcmFtZSwgc28gdGhhdCB3ZSBjYW4KICogZmluZCBsb2NhbCB2YXJpYWJsZSBpbmZvcm1hdGlvbiBjb3JyZWN0bHkuCiAqLwpzdHJ1Y3QgYnRfaW5mbwp7CiAgdW5zaWduZWQgaW50CSAgICAgY3M7CiAgdW5zaWduZWQgaW50CSAgICAgZWlwOwogIHVuc2lnbmVkIGludAkgICAgIHNzOwogIHVuc2lnbmVkIGludAkgICAgIGVicDsKICBzdHJ1Y3Qgc3ltYm9sX2luZm8gZnJhbWU7Cn07CgpzdGF0aWMgaW50IG5mcmFtZTsKc3RhdGljIHN0cnVjdCBidF9pbmZvICogZnJhbWVzID0gTlVMTDsKaW50IGN1cnJfZnJhbWU7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBXT1JEIGJwOwogICAgV09SRCBpcDsKICAgIFdPUkQgY3M7Cn0gRlJBTUUxNjsKCnR5cGVkZWYgc3RydWN0CnsKICAgIERXT1JEIGJwOwogICAgRFdPUkQgaXA7CiAgICBXT1JEIGNzOwp9IEZSQU1FMzI7CiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgREVCVUdfSW5mb1N0YWNrCiAqCiAqIER1bXAgdGhlIHRvcCBvZiB0aGUgc3RhY2sKICovCnZvaWQgREVCVUdfSW5mb1N0YWNrKHZvaWQpCnsKI2lmZGVmIF9faTM4Nl9fCiAgICBEQkdfVkFMVUUJdmFsdWU7CiAgICAKICAgIHZhbHVlLnR5cGUgPSBOVUxMOwogICAgdmFsdWUuY29va2llID0gRFZfVEFSR0VUOwogICAgdmFsdWUuYWRkci5zZWcgPSBERUJVR19jb250ZXh0LlNlZ1NzOwogICAgdmFsdWUuYWRkci5vZmYgPSBERUJVR19jb250ZXh0LkVzcDsKCiAgICBERUJVR19QcmludGYoREJHX0NITl9NRVNHLCJTdGFjayBkdW1wOlxuIik7CiAgICBzd2l0Y2ggKERFQlVHX0dldFNlbGVjdG9yVHlwZSh2YWx1ZS5hZGRyLnNlZykpIHsKICAgIGNhc2UgMzI6IC8qIDMyLWJpdCBtb2RlICovCiAgICAgICBERUJVR19FeGFtaW5lTWVtb3J5KCAmdmFsdWUsIDI0LCAneCcgKTsKICAgICAgIGJyZWFrOwogICAgY2FzZSAxNjogIC8qIDE2LWJpdCBtb2RlICovCiAgICAgICAgdmFsdWUuYWRkci5vZmYgJj0gMHhmZmZmOwogICAgICAgIERFQlVHX0V4YW1pbmVNZW1vcnkoICZ2YWx1ZSwgMjQsICd3JyApOwoJYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywgIkJhZCBzZWdtZW50ICglbGQpXG4iLCB2YWx1ZS5hZGRyLnNlZyk7CiAgICB9CiAgICBERUJVR19QcmludGYoREJHX0NITl9NRVNHLCJcbiIpOwojZW5kaWYKfQoKI2lmZGVmIF9faTM4Nl9fCnN0YXRpYyB2b2lkIERFQlVHX0ZvcmNlRnJhbWUoREJHX0FERFIgKnN0YWNrLCBEQkdfQUREUiAqY29kZSwgaW50IGZyYW1lbm8sIGludCBiaXRzLCBpbnQgbm9pc3kpCnsKICAgIGludCB0aGVmcmFtZSA9IG5mcmFtZSsrOwogICAgZnJhbWVzID0gKHN0cnVjdCBidF9pbmZvICopREJHX3JlYWxsb2MoZnJhbWVzLAoJCQkJCSAgIG5mcmFtZSpzaXplb2Yoc3RydWN0IGJ0X2luZm8pKTsKICAgIGlmIChub2lzeSkKICAgICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywiJXMlZCAiLCAodGhlZnJhbWUgPT0gY3Vycl9mcmFtZSA/ICI9PiIgOiAiICAiKSwKICAgICAgICAgICAgICBmcmFtZW5vKTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uY3MgPSBjb2RlLT5zZWc7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVpcCA9IGNvZGUtPm9mZjsKICAgIGlmIChub2lzeSkKICAgICAgZnJhbWVzW3RoZWZyYW1lXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzc0FuZEFyZ3MoIGNvZGUsIGJpdHMsIAoJCQkJCQkJICBzdGFjay0+b2ZmLCBUUlVFICk7CiAgICBlbHNlCiAgICAgIERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCBjb2RlLCBUUlVFLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLnN5bSwgc3RhY2stPm9mZiwgCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5saXN0KTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uc3MgPSBzdGFjay0+c2VnOwogICAgZnJhbWVzW3RoZWZyYW1lXS5lYnAgPSBzdGFjay0+b2ZmOwogICAgaWYgKG5vaXN5KSB7CiAgICAgIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAoYml0cyA9PSAxNikgPyAiIChicD0lMDRseClcbiIgOiAiIChlYnA9JTA4bHgpXG4iLCBzdGFjay0+b2ZmICk7CiAgICB9Cn0KCnN0YXRpYyBCT09MIERFQlVHX0ZyYW1lMTYoREJHX0FERFIgKmFkZHIsIHVuc2lnbmVkIGludCAqY3MsIGludCBmcmFtZW5vLCBpbnQgbm9pc3kpCnsKICAgIHVuc2lnbmVkIGludAlzcyA9IGFkZHItPnNlZywgcG9zc2libGVfY3MgPSAwOwogICAgRlJBTUUxNiAJCWZyYW1lOwogICAgaW50IAkJdGhlZnJhbWUgPSBuZnJhbWU7CiAgICB2b2lkKgkJcCA9ICh2b2lkKilERUJVR19Ub0xpbmVhcihhZGRyKTsKICAgIAogICAgaWYgKCFwKSByZXR1cm4gRkFMU0U7CiAgICAKICAgIGlmICghREVCVUdfUkVBRF9NRU0ocCwgJmZyYW1lLCBzaXplb2YoZnJhbWUpKSkgewogICAgICAgIGlmIChub2lzeSkgREVCVUdfSW52YWxBZGRyKGFkZHIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogICAgaWYgKCFmcmFtZS5icCkgcmV0dXJuIEZBTFNFOwogICAgbmZyYW1lKys7CiAgICBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKilEQkdfcmVhbGxvYyhmcmFtZXMsCgkJCQkJICAgbmZyYW1lKnNpemVvZihzdHJ1Y3QgYnRfaW5mbykpOwogICAgaWYgKG5vaXN5KQogICAgICAgIERFQlVHX1ByaW50ZihEQkdfQ0hOX01FU0csIiVzJWQgIiwgKHRoZWZyYW1lID09IGN1cnJfZnJhbWUgPyAiPT4iIDogIiAgIiksCgkJICAgICBmcmFtZW5vKTsKICAgIGlmIChmcmFtZS5icCAmIDEpICpjcyA9IGZyYW1lLmNzOwogICAgZWxzZSB7CiAgICAgICAgLyogbm90IGV4cGxpY2l0bHkgbWFya2VkIGFzIGZhciBjYWxsLAoJICogYnV0IGNoZWNrIHdoZXRoZXIgaXQgY291bGQgYmUgYW55d2F5ICovCiAgICAgICAgaWYgKCgoZnJhbWUuY3MmNyk9PTcpICYmIChmcmFtZS5jcyAhPSAqY3MpKSB7CgkgICAgTERUX0VOVFJZCWxlOwoJIAoJICAgIGlmIChHZXRUaHJlYWRTZWxlY3RvckVudHJ5KCBERUJVR19DdXJyVGhyZWFkLT5oYW5kbGUsIGZyYW1lLmNzLCAmbGUpICYmCgkJKGxlLkhpZ2hXb3JkLkJpdHMuVHlwZSAmIDB4MDgpKSB7IC8qIGNvZGUgc2VnbWVudCAqLwoJICAgICAgICAvKiBpdCBpcyB2ZXJ5IHVuY29tbW9uIHRvIHB1c2ggYSBjb2RlIHNlZ21lbnQgY3MgYXMKCQkgKiBhIHBhcmFtZXRlciwgc28gdGhpcyBzaG91bGQgd29yayBpbiBtb3N0IGNhc2VzICovCgkgICAgICAgICpjcyA9IHBvc3NpYmxlX2NzID0gZnJhbWUuY3M7CgkgICAgfQoJfQogICAgfQogICAgZnJhbWVzW3RoZWZyYW1lXS5jcyA9IGFkZHItPnNlZyA9ICpjczsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWlwID0gYWRkci0+b2ZmID0gZnJhbWUuaXA7CiAgICBpZiAobm9pc3kpCiAgICAgICAgZnJhbWVzW3RoZWZyYW1lXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzc0FuZEFyZ3MoIGFkZHIsIDE2LCAKCQkJCQkJCSAgICBmcmFtZS5icCwgVFJVRSApOwogICAgZWxzZQogICAgICAgIERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCBhZGRyLCBUUlVFLCAKCQkJCSAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5zeW0sIGZyYW1lLmJwLCAKCQkJCSAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5saXN0KTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uc3MgPSBhZGRyLT5zZWcgPSBzczsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWJwID0gYWRkci0+b2ZmID0gZnJhbWUuYnAgJiB+MTsKICAgIGlmIChub2lzeSkgewogICAgICAgIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiIChicD0lMDRseCIsIGFkZHItPm9mZiApOwogICAgICAgIGlmIChwb3NzaWJsZV9jcykgewoJICAgIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiLCBmYXIgY2FsbCBhc3N1bWVkIiApOwoJfQoJREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICIpXG4iICk7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIEJPT0wgREVCVUdfRnJhbWUzMihEQkdfQUREUiAqYWRkciwgdW5zaWduZWQgaW50ICpjcywgaW50IGZyYW1lbm8sIGludCBub2lzeSkKewogICAgdW5zaWduZWQgaW50IAlzcyA9IGFkZHItPnNlZzsKICAgIEZSQU1FMzIgCQlmcmFtZTsKICAgIGludCAJCXRoZWZyYW1lID0gbmZyYW1lOwogICAgdm9pZCoJCXAgPSAodm9pZCopREVCVUdfVG9MaW5lYXIoYWRkcik7CiAgICAKICAgIGlmICghcCkgcmV0dXJuIEZBTFNFOwogICAgCiAgICBpZiAoIURFQlVHX1JFQURfTUVNKHAsICZmcmFtZSwgc2l6ZW9mKGZyYW1lKSkpIHsKICAgICAgIGlmIChub2lzeSkgREVCVUdfSW52YWxBZGRyKGFkZHIpOwogICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgaWYgKCFmcmFtZS5pcCkgcmV0dXJuIEZBTFNFOwogICAgCiAgICBuZnJhbWUrKzsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKURCR19yZWFsbG9jKGZyYW1lcywKCQkJCQkgICBuZnJhbWUqc2l6ZW9mKHN0cnVjdCBidF9pbmZvKSk7CiAgICBpZiAobm9pc3kpCiAgICAgICBERUJVR19QcmludGYoREJHX0NITl9NRVNHLCIlcyVkICIsICh0aGVmcmFtZSA9PSBjdXJyX2ZyYW1lID8gIj0+IiA6ICIgICIpLAoJCSAgICBmcmFtZW5vKTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uY3MgPSBhZGRyLT5zZWcgPSAqY3M7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVpcCA9IGFkZHItPm9mZiA9IGZyYW1lLmlwOwogICAgaWYgKG5vaXN5KQogICAgICAgIGZyYW1lc1t0aGVmcmFtZV0uZnJhbWUgPSBERUJVR19QcmludEFkZHJlc3NBbmRBcmdzKCBhZGRyLCAzMiwgCgkJCQkJCQkgICAgZnJhbWUuYnAsIFRSVUUgKTsKICAgIGVsc2UKICAgICAgICBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggYWRkciwgVFJVRSwgCgkJCQkgJmZyYW1lc1t0aGVmcmFtZV0uZnJhbWUuc3ltLCBmcmFtZS5icCwgCgkJCQkgJmZyYW1lc1t0aGVmcmFtZV0uZnJhbWUubGlzdCk7CiAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiIChlYnA9JTA4bHgpXG4iLCBmcmFtZS5icCApOwogICAgZnJhbWVzW3RoZWZyYW1lXS5zcyA9IGFkZHItPnNlZyA9IHNzOwogICAgZnJhbWVzW3RoZWZyYW1lXS5lYnAgPSBmcmFtZS5icDsKICAgIGlmIChhZGRyLT5vZmYgPT0gZnJhbWUuYnApIHJldHVybiBGQUxTRTsKICAgIGFkZHItPm9mZiA9IGZyYW1lLmJwOwogICAgcmV0dXJuIFRSVUU7Cn0KI2VuZGlmCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBERUJVR19CYWNrVHJhY2UKICoKICogRGlzcGxheSBhIHN0YWNrIGJhY2stdHJhY2UuCiAqLwp2b2lkIERFQlVHX0JhY2tUcmFjZShCT09MIG5vaXN5KQp7CiNpZmRlZiBfX2kzODYKICAgIERCR19BRERSIAkJYWRkciwgc3dfYWRkciwgY29kZSwgdG1wOwogICAgdW5zaWduZWQgaW50IAlzcyA9IERFQlVHX2NvbnRleHQuU2VnU3M7CiAgICB1bnNpZ25lZCBpbnQJY3MgPSBERUJVR19jb250ZXh0LlNlZ0NzOwogICAgaW50IAkJZnJhbWVubyA9IDAsIGlzMTYsIG9rOwogICAgRFdPUkQgCQluZXh0X3N3aXRjaCwgY3VyX3N3aXRjaCwgcDsKICAgIFNUQUNLMTZGUkFNRSAgICAgICAJZnJhbWUxNjsKICAgIFNUQUNLMzJGUkFNRSAgICAgICAJZnJhbWUzMjsKICAgIGNoYXIJCWNoOwoKICAgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJCYWNrdHJhY2U6XG4iICk7CgogICAgbmZyYW1lID0gMTsKICAgIGlmIChmcmFtZXMpIERCR19mcmVlKCBmcmFtZXMgKTsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKSBEQkdfYWxsb2MoIHNpemVvZihzdHJ1Y3QgYnRfaW5mbykgKTsKICAgIGlmIChub2lzeSkKICAgICAgICBERUJVR19QcmludGYoREJHX0NITl9NRVNHLCIlcyVkICIsKGN1cnJfZnJhbWUgPT0gMCA/ICI9PiIgOiAiICAiKSwgZnJhbWVubyk7CgogICAgaWYgKERFQlVHX0lzU2VsZWN0b3JTeXN0ZW0oc3MpKSBzcyA9IDA7CiAgICBpZiAoREVCVUdfSXNTZWxlY3RvclN5c3RlbShjcykpIGNzID0gMDsKCiAgICAvKiBmaXJzdCBzdGFjayBmcmFtZSBmcm9tIHJlZ2lzdGVycyAqLwogICAgc3dpdGNoIChERUJVR19HZXRTZWxlY3RvclR5cGUoc3MpKQogICAgewogICAgY2FzZSAzMjoKICAgICAgICBmcmFtZXNbMF0uY3MgPSBhZGRyLnNlZyA9IGNzOwogICAgICAgIGZyYW1lc1swXS5laXAgPSBhZGRyLm9mZiA9IERFQlVHX2NvbnRleHQuRWlwOwogICAgICAgIGlmIChub2lzeSkKICAgICAgICAgICAgZnJhbWVzWzBdLmZyYW1lID0gREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgMzIsIFRSVUUgKTsKICAgICAgICBlbHNlCgkgICAgREVCVUdfRmluZE5lYXJlc3RTeW1ib2woICZhZGRyLCBUUlVFLCAmZnJhbWVzWzBdLmZyYW1lLnN5bSwgMCwgCgkJCQkgICAgICZmcmFtZXNbMF0uZnJhbWUubGlzdCk7CiAgICAgICAgZnJhbWVzWzBdLnNzID0gYWRkci5zZWcgPSBzczsKCWZyYW1lc1swXS5lYnAgPSBhZGRyLm9mZiA9IERFQlVHX2NvbnRleHQuRWJwOwogICAgICAgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICIgKGVicD0lMDh4KVxuIiwgZnJhbWVzWzBdLmVicCApOwogICAgICAgIGlzMTYgPSBGQUxTRTsKCWJyZWFrOwogICAgY2FzZSAxNjoKICAgICAgICBmcmFtZXNbMF0uY3MgPSBhZGRyLnNlZyA9IGNzOwogICAgICAgIGZyYW1lc1swXS5laXAgPSBhZGRyLm9mZiA9IExPV09SRChERUJVR19jb250ZXh0LkVpcCk7CiAgICAgICAgaWYgKG5vaXN5KQoJICAgIGZyYW1lc1swXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzcyggJmFkZHIsIDE2LCBUUlVFICk7CiAgICAgICAgZWxzZQoJICAgIERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCAmYWRkciwgVFJVRSwgJmZyYW1lc1swXS5mcmFtZS5zeW0sIDAsIAoJCQkJICAgICAmZnJhbWVzWzBdLmZyYW1lLmxpc3QpOwogICAgICAgIGZyYW1lc1swXS5zcyA9IGFkZHIuc2VnID0gc3M7CglmcmFtZXNbMF0uZWJwID0gYWRkci5vZmYgPSBMT1dPUkQoREVCVUdfY29udGV4dC5FYnApOwogICAgICAgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICIgKGJwPSUwNHgpXG4iLCBmcmFtZXNbMF0uZWJwICk7CiAgICAgICAgaXMxNiA9IFRSVUU7CglicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzZWdtZW50ICcldSdcbiIsIHNzKTsKCXJldHVybjsKICAgIH0KCiAgICAvKiBjdXJfc3dpdGNoIGhvbGRzIGFkZHJlc3Mgb2YgY3Vycl9zdGFjaydzIGZpZWxkIGluIFRFQiBpbiBkZWJ1Z2dlZSAKICAgICAqIGFkZHJlc3Mgc3BhY2UgCiAgICAgKi8KICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpREVCVUdfQ3VyclRocmVhZC0+dGViICsgT0ZGU0VUX09GKFRFQiwgY3VyX3N0YWNrKTsKICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKWN1cl9zd2l0Y2gsICZuZXh0X3N3aXRjaCwgc2l6ZW9mKG5leHRfc3dpdGNoKSkpIHsKICAgICAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQ2FuJ3QgcmVhZCBURUI6Y3VyX3N0YWNrXG4iKTsKCXJldHVybjsKICAgIH0KCiAgICBpZiAoaXMxNikgewogICAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKW5leHRfc3dpdGNoLCAmZnJhbWUzMiwgc2l6ZW9mKFNUQUNLMzJGUkFNRSkpKSB7CgkgICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzdGFjayBmcmFtZSAlcFxuIiwgCgkJCQkgICAgIChTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoICk7CgkgICAgcmV0dXJuOwoJfQoJY3VyX3N3aXRjaCA9IChEV09SRClmcmFtZTMyLmZyYW1lMTY7Cglzd19hZGRyLnNlZyA9IFNFTEVDVE9ST0YoY3VyX3N3aXRjaCk7Cglzd19hZGRyLm9mZiA9IE9GRlNFVE9GKGN1cl9zd2l0Y2gpOwogICAgfSBlbHNlIHsKICAgICAgICB0bXAuc2VnID0gU0VMRUNUT1JPRihuZXh0X3N3aXRjaCk7Cgl0bXAub2ZmID0gT0ZGU0VUT0YobmV4dF9zd2l0Y2gpOwoJcCA9IERFQlVHX1RvTGluZWFyKCZ0bXApOwoJCglpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKilwLCAmZnJhbWUxNiwgc2l6ZW9mKFNUQUNLMTZGUkFNRSkpKSB7CgkgICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzdGFjayBmcmFtZSAlcFxuIiwgKFNUQUNLMTZGUkFNRSopcCApOwoJICAgIHJldHVybjsKCX0KCWN1cl9zd2l0Y2ggPSAoRFdPUkQpZnJhbWUxNi5mcmFtZTMyOwoJc3dfYWRkci5zZWcgPSBzczsKCXN3X2FkZHIub2ZmID0gY3VyX3N3aXRjaDsKICAgIH0KICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKURFQlVHX1RvTGluZWFyKCZzd19hZGRyKSwgJmNoLCBzaXplb2YoY2gpKSkgewogICAgICAgIHN3X2FkZHIuc2VnID0gKERXT1JEKS0xOwoJc3dfYWRkci5vZmYgPSAoRFdPUkQpLTE7CiAgICB9CiAgICAKICAgIGZvciAob2sgPSBUUlVFOyBvazspIHsKICAgICAgICBpZiAoKGZyYW1lc1tmcmFtZW5vXS5zcyA9PSBzd19hZGRyLnNlZykgJiYKCSAgICAoZnJhbWVzW2ZyYW1lbm9dLmVicCA+PSBzd19hZGRyLm9mZikpIHsKCSAgIC8qIDE2PC0+MzIgc3dpdGNoLi4uCgkgICAgKiB5ZXMsIEkga25vdyB0aGlzIGlzIGNvbmZ1c2luZywgaXQgZ2F2ZSBtZSBhIGhlYWRhY2hlIHRvbyAqLwoJICAgaWYgKGlzMTYpIHsKCSAgICAgIAoJICAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKW5leHRfc3dpdGNoLCAmZnJhbWUzMiwgc2l6ZW9mKFNUQUNLMzJGUkFNRSkpKSB7CgkJICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lICVwXG4iLCAoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCApOwoJCSAgcmV0dXJuOwoJICAgICAgIH0KCgkgICAgICAgY29kZS5zZWcgID0gMDsKCSAgICAgICBjb2RlLm9mZiAgPSBmcmFtZTMyLnJldGFkZHI7CgkgICAgICAgCgkgICAgICAgY3MgPSAwOwoJICAgICAgIGFkZHIuc2VnID0gMDsKCSAgICAgICBhZGRyLm9mZiA9IGZyYW1lMzIuZWJwOwoJICAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgKytmcmFtZW5vLCAzMiwgbm9pc3kgKTsKCSAgICAgICAKCSAgICAgICBuZXh0X3N3aXRjaCA9IGN1cl9zd2l0Y2g7CgkgICAgICAgdG1wLnNlZyA9IFNFTEVDVE9ST0YobmV4dF9zd2l0Y2gpOwoJICAgICAgIHRtcC5vZmYgPSBPRkZTRVRPRihuZXh0X3N3aXRjaCk7CgkgICAgICAgcCA9IERFQlVHX1RvTGluZWFyKCZ0bXApOwoJICAgICAgIAoJICAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKXAsICZmcmFtZTE2LCBzaXplb2YoU1RBQ0sxNkZSQU1FKSkpIHsKCQkgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lICVwXG4iLCAKCQkJCQkgICAgKFNUQUNLMTZGUkFNRSopcCApOwoJCSAgIHJldHVybjsKCSAgICAgICB9CgkgICAgICAgY3VyX3N3aXRjaCA9IChEV09SRClmcmFtZTE2LmZyYW1lMzI7CgkgICAgICAgc3dfYWRkci5zZWcgPSAwOwoJICAgICAgIHN3X2FkZHIub2ZmID0gY3VyX3N3aXRjaDsKCSAgICAgICAKCSAgICAgICBpczE2ID0gRkFMU0U7CgkgICB9IGVsc2UgewoJICAgICAgdG1wLnNlZyA9IFNFTEVDVE9ST0YobmV4dF9zd2l0Y2gpOwoJICAgICAgdG1wLm9mZiA9IE9GRlNFVE9GKG5leHRfc3dpdGNoKTsKCSAgICAgIHAgPSBERUJVR19Ub0xpbmVhcigmdG1wKTsKCSAgICAgIAoJICAgICAgaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopcCwgJmZyYW1lMTYsIHNpemVvZihTVEFDSzE2RlJBTUUpKSkgewoJCSAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzdGFjayBmcmFtZSAlcFxuIiwKCQkJCQkgICAoU1RBQ0sxNkZSQU1FKilwICk7CgkJICByZXR1cm47CgkgICAgICB9CgkgICAgICAKCSAgICAgIGNvZGUuc2VnICA9IGZyYW1lMTYuY3M7CgkgICAgICBjb2RlLm9mZiAgPSBmcmFtZTE2LmlwOwoJICAgICAgCgkgICAgICBjcyA9IGZyYW1lMTYuY3M7CgkgICAgICBhZGRyLnNlZyA9IFNFTEVDVE9ST0YobmV4dF9zd2l0Y2gpOwoJICAgICAgYWRkci5vZmYgPSBmcmFtZTE2LmJwOwoJICAgICAgREVCVUdfRm9yY2VGcmFtZSggJmFkZHIsICZjb2RlLCArK2ZyYW1lbm8sIDE2LCBub2lzeSApOwoJICAgICAgCgkgICAgICBuZXh0X3N3aXRjaCA9IGN1cl9zd2l0Y2g7CgkgICAgICBpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKiluZXh0X3N3aXRjaCwgJmZyYW1lMzIsIHNpemVvZihTVEFDSzMyRlJBTUUpKSkgewoJCSBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lICVwXG4iLCAKCQkJCQkgIChTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoICk7CgkJIHJldHVybjsKCSAgICAgIH0KCSAgICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpZnJhbWUzMi5mcmFtZTE2OwoJICAgICAgc3dfYWRkci5zZWcgPSBTRUxFQ1RPUk9GKGN1cl9zd2l0Y2gpOwoJICAgICAgc3dfYWRkci5vZmYgPSBPRkZTRVRPRihjdXJfc3dpdGNoKTsKCSAgICAgIAoJICAgICAgaXMxNiA9IFRSVUU7CgkgICB9CgkgICBpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKilERUJVR19Ub0xpbmVhcigmc3dfYWRkciksICZjaCwgc2l6ZW9mKGNoKSkpIHsKCSAgICAgIHN3X2FkZHIuc2VnID0gKERXT1JEKS0xOwoJICAgICAgc3dfYWRkci5vZmYgPSAoRFdPUkQpLTE7CgkgICB9Cgl9IGVsc2UgewoJICAgIC8qIG9yZGluYXJ5IHN0YWNrIGZyYW1lICovCgkgICBvayA9IGlzMTYgPyBERUJVR19GcmFtZTE2KCAmYWRkciwgJmNzLCArK2ZyYW1lbm8sIG5vaXN5KQoJICAgICAgOiBERUJVR19GcmFtZTMyKCAmYWRkciwgJmNzLCArK2ZyYW1lbm8sIG5vaXN5KTsKCX0KICAgIH0KICAgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJcbiIgKTsKI2VuZGlmCn0KCmludApERUJVR19TZXRGcmFtZShpbnQgbmV3ZnJhbWUpCnsKICBpbnQJCXJ0biA9IEZBTFNFOwoKICBjdXJyX2ZyYW1lID0gbmV3ZnJhbWU7CgogIGlmKCBjdXJyX2ZyYW1lID49IG5mcmFtZSApCiAgICB7CiAgICAgIGN1cnJfZnJhbWUgPSBuZnJhbWUgLSAxOwogICAgfQoKICBpZiggY3Vycl9mcmFtZSA8IDAgKQogICAgewogICAgICBjdXJyX2ZyYW1lID0gMDsKICAgIH0KCiAgIGlmKCBmcmFtZXMgJiYgZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3Quc291cmNlZmlsZSAhPSBOVUxMICkKICAgIHsKICAgICAgREVCVUdfTGlzdCgmZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3QsIE5VTEwsIDApOwogICAgfQoKICBydG4gPSBUUlVFOwogIHJldHVybiAocnRuKTsKfQoKaW50CkRFQlVHX0dldEN1cnJlbnRGcmFtZShzdHJ1Y3QgbmFtZV9oYXNoICoqIG5hbWUsIHVuc2lnbmVkIGludCAqIGVpcCwKCQkgICAgICB1bnNpZ25lZCBpbnQgKiBlYnApCnsKICAvKgogICAqIElmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBiYWNrdHJhY2UsIHRoZW4ganVzdCByZXR1cm4uCiAgICovCiAgaWYoIGZyYW1lcyA9PSBOVUxMICkKICAgIHsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAvKgogICAqIElmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgY3VycmVudCBmdW5jdGlvbiBpcywgdGhlbiB3ZSBhbHNvIGhhdmUKICAgKiBub3RoaW5nIHRvIHJlcG9ydCBoZXJlLgogICAqLwogIGlmKCBmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWUuc3ltID09IE5VTEwgKQogICAgewogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICpuYW1lID0gZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLnN5bTsKICAqZWlwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVpcDsKICAqZWJwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVicDsKCiAgcmV0dXJuIFRSVUU7Cn0KCg==