LyoKICogU2VydmVyLXNpZGUgc29ja2V0IG1hbmFnZW1lbnQKICoKICogQ29weXJpZ2h0IChDKSAxOTk5IE1hcmN1cyBNZWlzc25lciwgT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBGSVhNRTogd2UgdXNlIHJlYWR8d3JpdGUgYWNjZXNzIGluIGFsbCBjYXNlcy4gU2hvdWxkbid0IHdlIGRlcGVuZCB0aGF0CiAqIG9uIHRoZSBhY2Nlc3Mgb2YgdGhlIGN1cnJlbnQgaGFuZGxlPwogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZmRlZiBIQVZFX1NZU19FUlJOT19ICiMgaW5jbHVkZSA8c3lzL2Vycm5vLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpZmRlZiBIQVZFX1NZU19GSUxJT19ICiMgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CiNlbmRpZgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgInByb2Nlc3MuaCIKI2luY2x1ZGUgImhhbmRsZS5oIgojaW5jbHVkZSAidGhyZWFkLmgiCiNpbmNsdWRlICJyZXF1ZXN0LmgiCiNpbmNsdWRlICJ1c2VyLmgiCiNpbmNsdWRlICJhc3luYy5oIgoKLyogVG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIFVuaXggc29ja2V0IGhlYWRlcnMuIFBsdXMgd2Ugb25seSBuZWVkIGEgZmV3CiAqIG1hY3JvcyBhbnl3YXkuCiAqLwojZGVmaW5lIFVTRV9XU19QUkVGSVgKI2luY2x1ZGUgIndpbnNvY2syLmgiCgpzdHJ1Y3Qgc29jawp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICAgICAgIG9iajsgICAgICAgICAvKiBvYmplY3QgaGVhZGVyICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHN0YXRlOyAgICAgICAvKiBzdGF0dXMgYml0cyAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBtYXNrOyAgICAgICAgLyogZXZlbnQgbWFzayAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBobWFzazsgICAgICAgLyogaGVsZCAoYmxvY2tlZCkgZXZlbnRzICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHBtYXNrOyAgICAgICAvKiBwZW5kaW5nIGV2ZW50cyAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBmbGFnczsgICAgICAgLyogc29ja2V0IGZsYWdzICovCiAgICBzdHJ1Y3QgZXZlbnQgICAgICAgKmV2ZW50OyAgICAgICAvKiBldmVudCBvYmplY3QgKi8KICAgIHVzZXJfaGFuZGxlX3QgICAgICAgd2luZG93OyAgICAgIC8qIHdpbmRvdyB0byBzZW5kIHRoZSBtZXNzYWdlIHRvICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIG1lc3NhZ2U7ICAgICAvKiBtZXNzYWdlIHRvIHNlbmQgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgd3BhcmFtOyAgICAgIC8qIG1lc3NhZ2Ugd3BhcmFtIChzb2NrZXQgaGFuZGxlKSAqLwogICAgaW50ICAgICAgICAgICAgICAgICBlcnJvcnNbRkRfTUFYX0VWRU5UU107IC8qIGV2ZW50IGVycm9ycyAqLwogICAgc3RydWN0IHNvY2sqICAgICAgICBkZWZlcnJlZDsgICAgLyogc29ja2V0IHRoYXQgd2FpdHMgZm9yIGEgZGVmZXJyZWQgYWNjZXB0ICovCiAgICBzdHJ1Y3QgYXN5bmNfcXVldWUgIHJlYWRfcTsgICAgICAvKiBRdWV1ZSBmb3IgYXN5bmNocm9ub3VzIHJlYWRzICovCiAgICBzdHJ1Y3QgYXN5bmNfcXVldWUgIHdyaXRlX3E7ICAgICAvKiBRdWV1ZSBmb3IgYXN5bmNocm9ub3VzIHdyaXRlcyAqLwp9OwoKc3RhdGljIHZvaWQgc29ja19kdW1wKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB2ZXJib3NlICk7CnN0YXRpYyBpbnQgc29ja19zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKTsKc3RhdGljIGludCBzb2NrX2dldF9wb2xsX2V2ZW50cyggc3RydWN0IG9iamVjdCAqb2JqICk7CnN0YXRpYyB2b2lkIHNvY2tfcG9sbF9ldmVudCggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgZXZlbnQgKTsKc3RhdGljIGludCBzb2NrX2dldF9mZCggc3RydWN0IG9iamVjdCAqb2JqICk7CnN0YXRpYyBpbnQgc29ja19nZXRfaW5mbyggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgZ2V0X2ZpbGVfaW5mb19yZXBseSAqcmVwbHksIGludCAqZmxhZ3MgKTsKc3RhdGljIHZvaWQgc29ja19kZXN0cm95KCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKc3RhdGljIGludCBzb2NrX2dldF9lcnJvciggaW50IGVyciApOwpzdGF0aWMgdm9pZCBzb2NrX3NldF9lcnJvcih2b2lkKTsKc3RhdGljIHZvaWQgc29ja19xdWV1ZV9hc3luYyhzdHJ1Y3Qgb2JqZWN0ICpvYmosIHZvaWQgKnB0ciwgdW5zaWduZWQgaW50IHN0YXR1cywgaW50IHR5cGUsIGludCBjb3VudCk7CgpzdGF0aWMgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgc29ja19vcHMgPQp7CiAgICBzaXplb2Yoc3RydWN0IHNvY2spLCAgICAgICAgICAvKiBzaXplICovCiAgICBzb2NrX2R1bXAsICAgICAgICAgICAgICAgICAgICAvKiBkdW1wICovCiAgICBhZGRfcXVldWUsICAgICAgICAgICAgICAgICAgICAvKiBhZGRfcXVldWUgKi8KICAgIHJlbW92ZV9xdWV1ZSwgICAgICAgICAgICAgICAgIC8qIHJlbW92ZV9xdWV1ZSAqLwogICAgc29ja19zaWduYWxlZCwgICAgICAgICAgICAgICAgLyogc2lnbmFsZWQgKi8KICAgIG5vX3NhdGlzZmllZCwgICAgICAgICAgICAgICAgIC8qIHNhdGlzZmllZCAqLwogICAgc29ja19nZXRfcG9sbF9ldmVudHMsICAgICAgICAgLyogZ2V0X3BvbGxfZXZlbnRzICovCiAgICBzb2NrX3BvbGxfZXZlbnQsICAgICAgICAgICAgICAvKiBwb2xsX2V2ZW50ICovCiAgICBzb2NrX2dldF9mZCwgICAgICAgICAgICAgICAgICAvKiBnZXRfZmQgKi8KICAgIG5vX2ZsdXNoLCAgICAgICAgICAgICAgICAgICAgIC8qIGZsdXNoICovCiAgICBzb2NrX2dldF9pbmZvLCAgICAgICAgICAgICAgICAvKiBnZXRfZmlsZV9pbmZvICovCiAgICBzb2NrX3F1ZXVlX2FzeW5jLCAgICAgICAgICAgICAvKiBxdWV1ZV9hc3luYyAqLwogICAgc29ja19kZXN0cm95ICAgICAgICAgICAgICAgICAgLyogZGVzdHJveSAqLwp9OwoKCi8qIFBlcm11dGF0aW9uIG9mIDAuLkZEX01BWF9FVkVOVFMgLSAxIHJlcHJlc2VudGluZyB0aGUgb3JkZXIgaW4gd2hpY2gKICogd2UgcG9zdCBtZXNzYWdlcyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZXZlbnRzLiAgVXNlZCB0byBzZW5kCiAqIG1lc3NhZ2VzLiAgVGhlIHByb2JsZW0gaXMgaWYgdGhlcmUgaXMgYm90aCBhIEZEX0NPTk5FQ1QgZXZlbnQgYW5kLAogKiBzYXksIGFuIEZEX1JFQUQgZXZlbnQgYXZhaWxhYmxlIG9uIHRoZSBzYW1lIHNvY2tldCwgd2Ugd2FudCB0bwogKiBub3RpZnkgdGhlIGFwcCBvZiB0aGUgY29ubmVjdCBldmVudCBmaXJzdC4gIE90aGVyd2lzZSBpdCBtYXkKICogZGlzY2FyZCB0aGUgcmVhZCBldmVudCBiZWNhdXNlIGl0IHRoaW5rcyBpdCBoYXNuJ3QgY29ubmVjdGVkIHlldC4KICovCnN0YXRpYyBjb25zdCBpbnQgZXZlbnRfYml0b3JkZXJbRkRfTUFYX0VWRU5UU10gPQp7CiAgICBGRF9DT05ORUNUX0JJVCwKICAgIEZEX0FDQ0VQVF9CSVQsCiAgICBGRF9PT0JfQklULAogICAgRkRfV1JJVEVfQklULAogICAgRkRfUkVBRF9CSVQsCiAgICBGRF9DTE9TRV9CSVQsCiAgICA2LCA3LCA4LCA5ICAvKiBsZWZ0b3ZlcnMgKi8KfTsKCgpzdGF0aWMgaW50IHNvY2tfcmVzZWxlY3QoIHN0cnVjdCBzb2NrICpzb2NrICkKewogICAgaW50IGV2ID0gc29ja19nZXRfcG9sbF9ldmVudHMoICZzb2NrLT5vYmogKTsKCiAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgZnByaW50ZihzdGRlcnIsInNvY2tfcmVzZWxlY3QoJWQpOiBuZXcgbWFzayAleFxuIiwgc29jay0+b2JqLmZkLCBldik7CgogICAgaWYgKHNvY2stPm9iai5zZWxlY3QgPT0gLTEpIHsKICAgICAgICAvKiBwcmV2aW91c2x5IHVuY29ubmVjdGVkIHNvY2tldCwgaXMgdGhpcyByZXNlbGVjdCBzdXBwb3NlZCB0byBjb25uZWN0IGl0PyAqLwogICAgICAgIGlmICghKHNvY2stPnN0YXRlICYgfkZEX1dJTkVfTk9OQkxPQ0tJTkcpKSByZXR1cm4gMDsKICAgICAgICAvKiBvaywgaXQgaXMsIGF0dGFjaCBpdCB0byB0aGUgd2luZXNlcnZlcidzIG1haW4gcG9sbCBsb29wICovCiAgICAgICAgYWRkX3NlbGVjdF91c2VyKCAmc29jay0+b2JqICk7CiAgICB9CiAgICAvKiB1cGRhdGUgY29uZGl0aW9uIG1hc2sgKi8KICAgIHNldF9zZWxlY3RfZXZlbnRzKCAmc29jay0+b2JqLCBldiApOwogICAgcmV0dXJuIGV2Owp9CgovKiBBZnRlciBQT0xMSFVQIGlzIHJlY2VpdmVkLCB0aGUgc29ja2V0IHdpbGwgbm8gbG9uZ2VyIGJlIGluIHRoZSBtYWluIHNlbGVjdCBsb29wLgogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2lnbmFsIHBlbmRpbmcgZXZlbnRzIG5ldmVydGhlbGVzcyAqLwpzdGF0aWMgdm9pZCBzb2NrX3RyeV9ldmVudCAoIHN0cnVjdCBzb2NrICpzb2NrLCBpbnQgZXZlbnQgKQp7CiAgICBzdHJ1Y3QgcG9sbGZkIHBmZDsKCiAgICBwZmQuZmQgPSBzb2NrLT5vYmouZmQ7CiAgICBwZmQuZXZlbnRzID0gZXZlbnQ7CiAgICBwZmQucmV2ZW50cyA9IDA7CiAgICBwb2xsICgmcGZkLCAxLCAwKTsKCiAgICBpZiAoIHBmZC5yZXZlbnRzICkKICAgIHsKICAgICAgICBpZiAoIGRlYnVnX2xldmVsICkgZnByaW50ZiAoIHN0ZGVyciwgInNvY2tfdHJ5X2V2ZW50OiAleFxuIiwgcGZkLnJldmVudHMgKTsKICAgICAgICBzb2NrX3BvbGxfZXZlbnQgKCAmc29jay0+b2JqLCBwZmQucmV2ZW50cyApOwogICAgfQp9CgovKiB3YWtlIGFueWJvZHkgd2FpdGluZyBvbiB0aGUgc29ja2V0IGV2ZW50IG9yIHNlbmQgdGhlIGFzc29jaWF0ZWQgbWVzc2FnZSAqLwpzdGF0aWMgdm9pZCBzb2NrX3dha2VfdXAoIHN0cnVjdCBzb2NrICpzb2NrLCBpbnQgcG9sbGV2ICkKewogICAgdW5zaWduZWQgaW50IGV2ZW50cyA9IHNvY2stPnBtYXNrICYgc29jay0+bWFzazsKICAgIGludCBpOwogICAgaW50IGFzeW5jX2FjdGl2ZSA9IDA7CgogICAgaWYgKCBzb2NrLT5mbGFncyAmIEZEX0ZMQUdfT1ZFUkxBUFBFRCApCiAgICB7CiAgICAgICAgaWYoIHBvbGxldiAmIChQT0xMSU58UE9MTFBSSSkgJiYgSVNfUkVBRFkoIHNvY2stPnJlYWRfcSApICkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50ZiAoIHN0ZGVyciwgImFjdGl2YXRpbmcgcmVhZCBxdWV1ZSBmb3Igc29ja2V0ICVwXG4iLCBzb2NrICk7CiAgICAgICAgICAgIGFzeW5jX25vdGlmeSggc29jay0+cmVhZF9xLmhlYWQsIFNUQVRVU19BTEVSVEVEICk7CiAgICAgICAgICAgIGFzeW5jX2FjdGl2ZSA9IDE7CiAgICAgICAgfQogICAgICAgIGlmKCBwb2xsZXYgJiBQT0xMT1VUICYmIElTX1JFQURZKCBzb2NrLT53cml0ZV9xICkgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmICggc3RkZXJyLCAiYWN0aXZhdGluZyB3cml0ZSBxdWV1ZSBmb3Igc29ja2V0ICVwXG4iLCBzb2NrICk7CiAgICAgICAgICAgIGFzeW5jX25vdGlmeSggc29jay0+d3JpdGVfcS5oZWFkLCBTVEFUVVNfQUxFUlRFRCApOwogICAgICAgICAgICBhc3luY19hY3RpdmUgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBEbyBub3Qgc2lnbmFsIGV2ZW50cyBpZiB0aGVyZSBhcmUgc3RpbGwgcGVuZGluZyBhc3luY2hyb25vdXMgSU8gcmVxdWVzdHMgKi8KICAgIC8qIFdlIG5lZWQgdGhpcyB0byBkZWxheSBGRF9DTE9TRSBldmVudHMgdW50aWwgYWxsIHBlbmRpbmcgb3ZlcmxhcHBlZCByZXF1ZXN0cyBhcmUgcHJvY2Vzc2VkICovCiAgICBpZiAoICFldmVudHMgfHwgYXN5bmNfYWN0aXZlICkgcmV0dXJuOwoKICAgIGlmIChldmVudHMgJiBGRF9DTE9TRSkgc29jay0+aG1hc2sgfD0gRkRfQ0xPU0U7CgogICAgaWYgKHNvY2stPmV2ZW50KQogICAgewogICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50ZihzdGRlcnIsICJzaWduYWxsaW5nIGV2ZW50cyAleCBwdHIgJXBcbiIsIGV2ZW50cywgc29jay0+ZXZlbnQgKTsKICAgICAgICBzZXRfZXZlbnQoIHNvY2stPmV2ZW50ICk7CiAgICB9CiAgICBpZiAoc29jay0+d2luZG93KQogICAgewogICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50ZihzdGRlcnIsICJzaWduYWxsaW5nIGV2ZW50cyAleCB3aW4gJXhcbiIsIGV2ZW50cywgc29jay0+d2luZG93ICk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IEZEX01BWF9FVkVOVFM7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGludCBldmVudCA9IGV2ZW50X2JpdG9yZGVyW2ldOwogICAgICAgICAgICBpZiAoc29jay0+cG1hc2sgJiAoMSA8PCBldmVudCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBscGFyYW0gPSAoMSA8PCBldmVudCkgfCAoc29jay0+ZXJyb3JzW2V2ZW50XSA8PCAxNik7CiAgICAgICAgICAgICAgICBwb3N0X21lc3NhZ2UoIHNvY2stPndpbmRvdywgc29jay0+bWVzc2FnZSwgc29jay0+d3BhcmFtLCBscGFyYW0gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzb2NrLT5wbWFzayA9IDA7CiAgICAgICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgfQp9CgppbmxpbmUgc3RhdGljIGludCBzb2NrX2Vycm9yKGludCBzKQp7CiAgICB1bnNpZ25lZCBpbnQgb3B0dmFsID0gMCwgb3B0bGVuOwogICAgCiAgICBvcHRsZW4gPSBzaXplb2Yob3B0dmFsKTsKICAgIGdldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fRVJST1IsICh2b2lkICopICZvcHR2YWwsICZvcHRsZW4pOwogICAgcmV0dXJuIG9wdHZhbCA/IHNvY2tfZ2V0X2Vycm9yKG9wdHZhbCkgOiAwOwp9CgpzdGF0aWMgdm9pZCBzb2NrX3BvbGxfZXZlbnQoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IGV2ZW50ICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICBpbnQgZW1wdHlfcmVjdiA9IDA7CgogICAgYXNzZXJ0KCBzb2NrLT5vYmoub3BzID09ICZzb2NrX29wcyApOwogICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIHNlbGVjdCBldmVudDogJXhcbiIsIHNvY2stPm9iai5mZCwgZXZlbnQpOwogICAgaWYgKHNvY2stPnN0YXRlICYgRkRfQ09OTkVDVCkKICAgIHsKICAgICAgICAvKiBjb25uZWN0aW5nICovCiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTE9VVCkKICAgICAgICB7CiAgICAgICAgICAgIC8qIHdlIGdvdCBjb25uZWN0ZWQgKi8KICAgICAgICAgICAgc29jay0+c3RhdGUgfD0gRkRfV0lORV9DT05ORUNURUR8RkRfUkVBRHxGRF9XUklURTsKICAgICAgICAgICAgc29jay0+c3RhdGUgJj0gfkZEX0NPTk5FQ1Q7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0NPTk5FQ1Q7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9DT05ORUNUX0JJVF0gPSAwOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlZCBjb25uZWN0aW9uIHN1Y2Nlc3NcbiIsIHNvY2stPm9iai5mZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGV2ZW50ICYgKFBPTExFUlJ8UE9MTEhVUCkpCiAgICAgICAgewogICAgICAgICAgICAvKiB3ZSBkaWRuJ3QgZ2V0IGNvbm5lY3RlZD8gKi8KICAgICAgICAgICAgc29jay0+c3RhdGUgJj0gfkZEX0NPTk5FQ1Q7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0NPTk5FQ1Q7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9DT05ORUNUX0JJVF0gPSBzb2NrX2Vycm9yKCBzb2NrLT5vYmouZmQgKTsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgY29ubmVjdGlvbiBmYWlsdXJlXG4iLCBzb2NrLT5vYmouZmQpOwogICAgICAgICAgICBzZXRfc2VsZWN0X2V2ZW50cyggJnNvY2stPm9iaiwgLTEgKTsKICAgICAgICB9CiAgICB9IGVsc2UKICAgIGlmIChzb2NrLT5zdGF0ZSAmIEZEX1dJTkVfTElTVEVOSU5HKQogICAgewogICAgICAgIC8qIGxpc3RlbmluZyAqLwogICAgICAgIGlmIChldmVudCAmIFBPTExJTikKICAgICAgICB7CiAgICAgICAgICAgIC8qIGluY29taW5nIGNvbm5lY3Rpb24gKi8KICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQUNDRVBUX0JJVF0gPSAwOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9BQ0NFUFQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGV2ZW50ICYgKFBPTExFUlJ8UE9MTEhVUCkpCiAgICAgICAgewogICAgICAgICAgICAvKiBmYWlsZWQgaW5jb21pbmcgY29ubmVjdGlvbj8gKi8KICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQUNDRVBUX0JJVF0gPSBzb2NrX2Vycm9yKCBzb2NrLT5vYmouZmQgKTsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgICAgICBzZXRfc2VsZWN0X2V2ZW50cyggJnNvY2stPm9iaiwgLTEgKTsKICAgICAgICB9CiAgICB9IGVsc2UKICAgIHsKICAgICAgICAvKiBub3JtYWwgZGF0YSBmbG93ICovCiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTElOKQogICAgICAgIHsKICAgICAgICAgICAgY2hhciBkdW1teTsKICAgICAgICAgICAgaW50IG5yOwoKICAgICAgICAgICAgLyogTGludXggMi40IGRvZXNuJ3QgcmVwb3J0IFBPTExIVVAgaWYgb25seSBvbmUgc2lkZSBvZiB0aGUgc29ja2V0CiAgICAgICAgICAgICAqIGhhcyBiZWVuIGNsb3NlZCwgc28gd2UgbmVlZCB0byBjaGVjayBmb3IgaXQgZXhwbGljaXRseSBoZXJlICovCiAgICAgICAgICAgIG5yICA9IHJlY3YoIHNvY2stPm9iai5mZCwgJmR1bW15LCAxLCBNU0dfUEVFSyApOwogICAgICAgICAgICBpZiAoIG5yID4gMCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGluY29taW5nIGRhdGEgKi8KICAgICAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX1JFQUQ7CiAgICAgICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9SRUFEOwogICAgICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX1JFQURfQklUXSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgaXMgcmVhZGFibGVcbiIsIHNvY2stPm9iai5mZCApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBuciA9PSAwICkKICAgICAgICAgICAgICAgIGVtcHR5X3JlY3YgPSAxOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEVBR0FJTiBjYW4gaGFwcGVuIGlmIGFuIGFzeW5jIHJlY3YoKSBmYWxscyBiZXR3ZWVuIHRoZSBzZXJ2ZXIncyBwb2xsKCkKICAgICAgICAgICAgICAgICAgIGNhbGwgYW5kIHRoZSBpbnZvY2F0aW9uIG9mIHRoaXMgcm91dGluZSAqLwogICAgICAgICAgICAgICAgaWYgKCBlcnJubyA9PSBFQUdBSU4gKQogICAgICAgICAgICAgICAgICAgIGV2ZW50ICY9IH5QT0xMSU47CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWJ1Z19sZXZlbCApCiAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJyZWN2IGVycm9yIG9uIHNvY2tldCAlZDogJWRcbiIsIHNvY2stPm9iai5mZCwgZXJybm8gKTsKICAgICAgICAgICAgICAgICAgICBldmVudCA9IFBPTExFUlI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGlmIChldmVudCAmIFBPTExPVVQpCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9XUklURTsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9XUklURV9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgaXMgd3JpdGFibGVcbiIsIHNvY2stPm9iai5mZCk7CiAgICAgICAgfQogICAgICAgIGlmIChldmVudCAmIFBPTExQUkkpCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9PT0I7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX09PQjsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX09PQl9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgZ290IE9PQiBkYXRhXG4iLCBzb2NrLT5vYmouZmQpOwogICAgICAgIH0KICAgICAgICAvKiBBY2NvcmRpbmcgdG8gV1MyIHNwZWNzLCBGRF9DTE9TRSBpcyBvbmx5IGRlbGl2ZXJlZCB3aGVuIHRoZXJlIGlzCiAgICAgICAgICAgbm8gbW9yZSBkYXRhIHRvIGJlIHJlYWQgKGkuZS4gZW1wdHlfcmVjdiA9IDEpICovCiAgICAgICAgZWxzZSBpZiAoIGVtcHR5X3JlY3YgJiYgKHNvY2stPnN0YXRlICYgKEZEX1JFQUR8RkRfV1JJVEUpICkpCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ0xPU0VfQklUXSA9IHNvY2tfZXJyb3IoIHNvY2stPm9iai5mZCApOwogICAgICAgICAgICBpZiAoIGV2ZW50ICYgKCBQT0xMRVJSfFBPTExIVVAgKSApCiAgICAgICAgICAgICAgICAgc29jay0+c3RhdGUgJj0gfihGRF9XSU5FX0NPTk5FQ1RFRHxGRF9XUklURSk7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0NMT1NFOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlZCBhYm9ydGVkIGJ5IGVycm9yICVkLCBldmVudDogJXggLSByZW1vdmluZyBmcm9tIHNlbGVjdCBsb29wXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBzb2NrLT5vYmouZmQsIHNvY2stPmVycm9yc1tGRF9DTE9TRV9CSVRdLCBldmVudCk7CiAgICAgICAgICAgIHNldF9zZWxlY3RfZXZlbnRzKCAmc29jay0+b2JqLCAtMSApOwogICAgICAgIH0KICAgIH0KCiAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CgogICAgLyogd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBmb3Igd2hhdGV2ZXIganVzdCBoYXBwZW5lZCAqLwogICAgaWYgKCBzb2NrLT5wbWFzayAmIHNvY2stPm1hc2sgfHwgc29jay0+ZmxhZ3MgJiBGRF9GTEFHX09WRVJMQVBQRUQgKSBzb2NrX3dha2VfdXAoIHNvY2ssIGV2ZW50ICk7CgogICAgLyogaWYgYW55b25lIGlzIHN0dXBpZCBlbm91Z2ggdG8gd2FpdCBvbiB0aGUgc29ja2V0IG9iamVjdCBpdHNlbGYsCiAgICAgKiBtYXliZSB3ZSBzaG91bGQgd2FrZSB0aGVtIHVwIHRvbywganVzdCBpbiBjYXNlPyAqLwogICAgd2FrZV91cCggJnNvY2stPm9iaiwgMCApOwp9CgpzdGF0aWMgdm9pZCBzb2NrX2R1bXAoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CiAgICBwcmludGYoICJTb2NrZXQgZmQ9JWQsIHN0YXRlPSV4LCBtYXNrPSV4LCBwZW5kaW5nPSV4LCBoZWxkPSV4XG4iLAogICAgICAgICAgICBzb2NrLT5vYmouZmQsIHNvY2stPnN0YXRlLAogICAgICAgICAgICBzb2NrLT5tYXNrLCBzb2NrLT5wbWFzaywgc29jay0+aG1hc2sgKTsKfQoKc3RhdGljIGludCBzb2NrX3NpZ25hbGVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICByZXR1cm4gY2hlY2tfc2VsZWN0X2V2ZW50cyggc29jay0+b2JqLmZkLCBzb2NrX2dldF9wb2xsX2V2ZW50cyggJnNvY2stPm9iaiApICk7Cn0KCnN0YXRpYyBpbnQgc29ja19nZXRfcG9sbF9ldmVudHMoIHN0cnVjdCBvYmplY3QgKm9iaiApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgdW5zaWduZWQgaW50IG1hc2sgPSBzb2NrLT5tYXNrICYgc29jay0+c3RhdGUgJiB+c29jay0+aG1hc2s7CiAgICBpbnQgZXYgPSAwOwoKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgaWYgKHNvY2stPnN0YXRlICYgRkRfQ09OTkVDVCkKICAgICAgICAvKiBjb25uZWN0aW5nLCB3YWl0IGZvciB3cml0YWJsZSAqLwogICAgICAgIHJldHVybiBQT0xMT1VUOwogICAgaWYgKHNvY2stPnN0YXRlICYgRkRfV0lORV9MSVNURU5JTkcpCiAgICAgICAgLyogbGlzdGVuaW5nLCB3YWl0IGZvciByZWFkYWJsZSAqLwogICAgICAgIHJldHVybiAoc29jay0+aG1hc2sgJiBGRF9BQ0NFUFQpID8gMCA6IFBPTExJTjsKCiAgICBpZiAobWFzayAmIChGRF9SRUFEKSB8fCAoc29jay0+ZmxhZ3MgJiBXU0FfRkxBR19PVkVSTEFQUEVEICYmIElTX1JFQURZIChzb2NrLT5yZWFkX3EpKSkKICAgICAgICBldiB8PSBQT0xMSU4gfCBQT0xMUFJJOwogICAgaWYgKG1hc2sgJiBGRF9XUklURSB8fCAoc29jay0+ZmxhZ3MgJiBXU0FfRkxBR19PVkVSTEFQUEVEICYmIElTX1JFQURZIChzb2NrLT53cml0ZV9xKSkpCiAgICAgICAgZXYgfD0gUE9MTE9VVDsKICAgIC8qIFdlIHVzZSBQT0xMSU4gd2l0aCAwIGJ5dGVzIHJlY3YoKSBhcyBGRF9DTE9TRSBpbmRpY2F0aW9uLiAqLwogICAgaWYgKHNvY2stPm1hc2sgJiB+c29jay0+aG1hc2sgJiBGRF9DTE9TRSAmJiAhKHNvY2stPmhtYXNrICYgRkRfUkVBRCkgKQogICAgICAgIGV2IHw9IFBPTExJTjsKCiAgICByZXR1cm4gZXY7Cn0KCnN0YXRpYyBpbnQgc29ja19nZXRfZmQoIHN0cnVjdCBvYmplY3QgKm9iaiApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKICAgIHJldHVybiBzb2NrLT5vYmouZmQ7Cn0KCnN0YXRpYyBpbnQgc29ja19nZXRfaW5mbyggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgZ2V0X2ZpbGVfaW5mb19yZXBseSAqcmVwbHksIGludCAqZmxhZ3MgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayopIG9iajsKICAgIGFzc2VydCAoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwoKICAgIGlmIChyZXBseSkKICAgIHsKICAgICAgICByZXBseS0+dHlwZSAgICAgICAgPSBGSUxFX1RZUEVfUElQRTsKICAgICAgICByZXBseS0+YXR0ciAgICAgICAgPSAwOwogICAgICAgIHJlcGx5LT5hY2Nlc3NfdGltZSA9IDA7CiAgICAgICAgcmVwbHktPndyaXRlX3RpbWUgID0gMDsKICAgICAgICByZXBseS0+c2l6ZV9oaWdoICAgPSAwOwogICAgICAgIHJlcGx5LT5zaXplX2xvdyAgICA9IDA7CiAgICAgICAgcmVwbHktPmxpbmtzICAgICAgID0gMDsKICAgICAgICByZXBseS0+aW5kZXhfaGlnaCAgPSAwOwogICAgICAgIHJlcGx5LT5pbmRleF9sb3cgICA9IDA7CiAgICAgICAgcmVwbHktPnNlcmlhbCAgICAgID0gMDsKICAgIH0KICAgICpmbGFncyA9IDA7CiAgICBpZiAoc29jay0+ZmxhZ3MgJiBXU0FfRkxBR19PVkVSTEFQUEVEKSAqZmxhZ3MgfD0gRkRfRkxBR19PVkVSTEFQUEVEOwogICAgaWYgKCAhKHNvY2stPnN0YXRlICYgRkRfUkVBRCApICkgICpmbGFncyB8PSBGRF9GTEFHX1JFQ1ZfU0hVVERPV047CiAgICBpZiAoICEoc29jay0+c3RhdGUgJiBGRF9XUklURSApICkgKmZsYWdzIHw9IEZEX0ZMQUdfU0VORF9TSFVURE9XTjsKICAgIHJldHVybiBGRF9UWVBFX0RFRkFVTFQ7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfcXVldWVfYXN5bmMoc3RydWN0IG9iamVjdCAqb2JqLCB2b2lkICpwdHIsIHVuc2lnbmVkIGludCBzdGF0dXMsIGludCB0eXBlLCBpbnQgY291bnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgc3RydWN0IGFzeW5jX3F1ZXVlICpxOwogICAgc3RydWN0IGFzeW5jICphc3luYzsKICAgIGludCBwb2xsZXY7CgogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICBpZiAoICEoc29jay0+ZmxhZ3MgJiBXU0FfRkxBR19PVkVSTEFQUEVEKSApCiAgICB7CiAgICAgICAgc2V0X2Vycm9yICggU1RBVFVTX0lOVkFMSURfSEFORExFICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHN3aXRjaCggdHlwZSApCiAgICB7CiAgICBjYXNlIEFTWU5DX1RZUEVfUkVBRDoKICAgICAgICBxID0gJnNvY2stPnJlYWRfcTsKICAgICAgICBicmVhazsKICAgIGNhc2UgQVNZTkNfVFlQRV9XUklURToKICAgICAgICBxID0gJnNvY2stPndyaXRlX3E7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIHNldF9lcnJvciggU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGFzeW5jID0gZmluZF9hc3luYyAoIHEsIGN1cnJlbnQsIHB0ciApOwoKICAgIGlmICggc3RhdHVzID09IFNUQVRVU19QRU5ESU5HICkKICAgIHsKICAgICAgICBpZiAoICggISggc29jay0+c3RhdGUgJiBGRF9SRUFEICkgJiYgdHlwZSA9PSBBU1lOQ19UWVBFX1JFQUQgICkgfHwKICAgICAgICAgICAgICggISggc29jay0+c3RhdGUgJiBGRF9XUklURSApICYmIHR5cGUgPT0gQVNZTkNfVFlQRV9XUklURSApICkKICAgICAgICB7CiAgICAgICAgICAgIHNldF9lcnJvciAoIFNUQVRVU19QSVBFX0RJU0NPTk5FQ1RFRCApOwogICAgICAgICAgICBpZiAoIGFzeW5jICkgZGVzdHJveV9hc3luYyAoIGFzeW5jICk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmICggIWFzeW5jICkKICAgICAgICAgICAgICAgIGFzeW5jID0gY3JlYXRlX2FzeW5jICggb2JqLCBjdXJyZW50LCBwdHIgKTsKICAgICAgICAgICAgaWYgKCAhYXN5bmMgKQogICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgYXN5bmMtPnN0YXR1cyA9IFNUQVRVU19QRU5ESU5HOwogICAgICAgICAgICBpZiAoICFhc3luYy0+cSApCiAgICAgICAgICAgICAgICBhc3luY19pbnNlcnQgKCBxLCBhc3luYyApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKCBhc3luYyApIGRlc3Ryb3lfYXN5bmMgKCBhc3luYyApOwogICAgZWxzZSBzZXRfZXJyb3IgKCBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgKTsKCiAgICBwb2xsZXYgPSBzb2NrX3Jlc2VsZWN0ICggc29jayApOwogICAgaWYgKCBwb2xsZXYgKSBzb2NrX3RyeV9ldmVudCAoIHNvY2ssIHBvbGxldiApOwp9CgpzdGF0aWMgdm9pZCBzb2NrX2Rlc3Ryb3koIHN0cnVjdCBvYmplY3QgKm9iaiApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICAvKiBGSVhNRTogc3BlY2lhbCBzb2NrZXQgc2h1dGRvd24gc3R1ZmY/ICovCgogICAgaWYgKCBzb2NrLT5kZWZlcnJlZCApCiAgICAgICAgcmVsZWFzZV9vYmplY3QgKCBzb2NrLT5kZWZlcnJlZCApOwoKICAgIGlmICggc29jay0+ZmxhZ3MgJiBXU0FfRkxBR19PVkVSTEFQUEVEICkKICAgIHsKICAgICAgICBkZXN0cm95X2FzeW5jX3F1ZXVlICggJnNvY2stPnJlYWRfcSApOwogICAgICAgIGRlc3Ryb3lfYXN5bmNfcXVldWUgKCAmc29jay0+d3JpdGVfcSApOwogICAgfQogICAgaWYgKHNvY2stPmV2ZW50KSByZWxlYXNlX29iamVjdCggc29jay0+ZXZlbnQgKTsKfQoKLyogY3JlYXRlIGEgbmV3IGFuZCB1bmNvbm5lY3RlZCBzb2NrZXQgKi8Kc3RhdGljIHN0cnVjdCBvYmplY3QgKmNyZWF0ZV9zb2NrZXQoIGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIHVuc2lnbmVkIGludCBmbGFncyApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgaW50IHNvY2tmZDsKCiAgICBzb2NrZmQgPSBzb2NrZXQoIGZhbWlseSwgdHlwZSwgcHJvdG9jb2wgKTsKICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICBmcHJpbnRmKHN0ZGVyciwic29ja2V0KCVkLCVkLCVkKT0lZFxuIixmYW1pbHksdHlwZSxwcm90b2NvbCxzb2NrZmQpOwogICAgaWYgKHNvY2tmZCA9PSAtMSkgewogICAgICAgIHNvY2tfc2V0X2Vycm9yKCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBmY250bChzb2NrZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOyAvKiBtYWtlIHNvY2tldCBub25ibG9ja2luZyAqLwogICAgaWYgKCEoc29jayA9IGFsbG9jX29iamVjdCggJnNvY2tfb3BzLCAtMSApKSkgcmV0dXJuIE5VTEw7CiAgICBzb2NrLT5vYmouZmQgPSBzb2NrZmQ7CiAgICBzb2NrLT5zdGF0ZSA9ICh0eXBlICE9IFNPQ0tfU1RSRUFNKSA/IChGRF9SRUFEfEZEX1dSSVRFKSA6IDA7CiAgICBzb2NrLT5tYXNrICAgID0gMDsKICAgIHNvY2stPmhtYXNrICAgPSAwOwogICAgc29jay0+cG1hc2sgICA9IDA7CiAgICBzb2NrLT5mbGFncyAgID0gZmxhZ3M7CiAgICBzb2NrLT5ldmVudCAgID0gTlVMTDsKICAgIHNvY2stPndpbmRvdyAgPSAwOwogICAgc29jay0+bWVzc2FnZSA9IDA7CiAgICBzb2NrLT53cGFyYW0gID0gMDsKICAgIHNvY2stPmRlZmVycmVkID0gTlVMTDsKICAgIGlmIChzb2NrLT5mbGFncyAmIFdTQV9GTEFHX09WRVJMQVBQRUQpCiAgICB7CiAgICAgICAgaW5pdF9hc3luY19xdWV1ZSAoJnNvY2stPnJlYWRfcSk7CiAgICAgICAgaW5pdF9hc3luY19xdWV1ZSAoJnNvY2stPndyaXRlX3EpOwogICAgfQogICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgY2xlYXJfZXJyb3IoKTsKICAgIHJldHVybiAmc29jay0+b2JqOwp9CgovKiBhY2NlcHQgYSBzb2NrZXQgKGNyZWF0ZXMgYSBuZXcgZmQpICovCnN0YXRpYyBzdHJ1Y3Qgc29jayAqYWNjZXB0X3NvY2tldCggaGFuZGxlX3QgaGFuZGxlICkKewogICAgc3RydWN0IHNvY2sgKmFjY2VwdHNvY2s7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKICAgIGludAlhY2NlcHRmZDsKICAgIHN0cnVjdCBzb2NrYWRkcglzYWRkcjsKICAgIGludAkJCXNsZW47CgogICAgc29jaz0oc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKGN1cnJlbnQtPnByb2Nlc3MsaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFfFNZTkNIUk9OSVpFLCZzb2NrX29wcyk7CiAgICBpZiAoIXNvY2spCiAgICAJcmV0dXJuIE5VTEw7CgogICAgaWYgKCBzb2NrLT5kZWZlcnJlZCApIHsKICAgICAgICBhY2NlcHRzb2NrID0gc29jay0+ZGVmZXJyZWQ7CiAgICAgICAgc29jay0+ZGVmZXJyZWQgPSBOVUxMOwogICAgfSBlbHNlIHsKCiAgICAgICAgLyogVHJ5IHRvIGFjY2VwdCgyKS4gV2UgY2FuJ3QgYmUgc2FmZSB0aGF0IHRoaXMgYW4gYWxyZWFkeSBjb25uZWN0ZWQgc29ja2V0CiAgICAgICAgICogb3IgdGhhdCBhY2NlcHQoKSBpcyBhbGxvd2VkIG9uIGl0LiBJbiB0aG9zZSBjYXNlcyB3ZSB3aWxsIGdldCAtMS9lcnJubwogICAgICAgICAqIHJldHVybi4KICAgICAgICAgKi8KICAgICAgICBzbGVuID0gc2l6ZW9mKHNhZGRyKTsKICAgICAgICBhY2NlcHRmZCA9IGFjY2VwdChzb2NrLT5vYmouZmQsJnNhZGRyLCZzbGVuKTsKICAgICAgICBpZiAoYWNjZXB0ZmQ9PS0xKSB7CiAgICAgICAgICAgIHNvY2tfc2V0X2Vycm9yKCk7CiAgICAgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBpZiAoIShhY2NlcHRzb2NrID0gYWxsb2Nfb2JqZWN0KCAmc29ja19vcHMsIC0xICkpKQogICAgICAgIHsKICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQoKICAgICAgICAvKiBuZXdseSBjcmVhdGVkIHNvY2tldCBnZXRzIHRoZSBzYW1lIHByb3BlcnRpZXMgb2YgdGhlIGxpc3RlbmluZyBzb2NrZXQgKi8KICAgICAgICBmY250bChhY2NlcHRmZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7IC8qIG1ha2Ugc29ja2V0IG5vbmJsb2NraW5nICovCiAgICAgICAgYWNjZXB0c29jay0+b2JqLmZkID0gYWNjZXB0ZmQ7CiAgICAgICAgYWNjZXB0c29jay0+c3RhdGUgID0gRkRfV0lORV9DT05ORUNURUR8RkRfUkVBRHxGRF9XUklURTsKICAgICAgICBpZiAoc29jay0+c3RhdGUgJiBGRF9XSU5FX05PTkJMT0NLSU5HKQogICAgICAgICAgICBhY2NlcHRzb2NrLT5zdGF0ZSB8PSBGRF9XSU5FX05PTkJMT0NLSU5HOwogICAgICAgIGFjY2VwdHNvY2stPm1hc2sgICAgPSBzb2NrLT5tYXNrOwogICAgICAgIGFjY2VwdHNvY2stPmhtYXNrICAgPSAwOwogICAgICAgIGFjY2VwdHNvY2stPnBtYXNrICAgPSAwOwogICAgICAgIGFjY2VwdHNvY2stPmV2ZW50ICAgPSBOVUxMOwogICAgICAgIGFjY2VwdHNvY2stPndpbmRvdyAgPSBzb2NrLT53aW5kb3c7CiAgICAgICAgYWNjZXB0c29jay0+bWVzc2FnZSA9IHNvY2stPm1lc3NhZ2U7CiAgICAgICAgYWNjZXB0c29jay0+d3BhcmFtICA9IDA7CiAgICAgICAgaWYgKHNvY2stPmV2ZW50KSBhY2NlcHRzb2NrLT5ldmVudCA9IChzdHJ1Y3QgZXZlbnQgKilncmFiX29iamVjdCggc29jay0+ZXZlbnQgKTsKICAgICAgICBhY2NlcHRzb2NrLT5mbGFncyA9IHNvY2stPmZsYWdzOwogICAgICAgIGFjY2VwdHNvY2stPmRlZmVycmVkID0gMDsKICAgICAgICBpZiAoIGFjY2VwdHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCApCiAgICAgICAgewogICAgICAgICAgICBpbml0X2FzeW5jX3F1ZXVlICggJmFjY2VwdHNvY2stPnJlYWRfcSApOwogICAgICAgICAgICBpbml0X2FzeW5jX3F1ZXVlICggJmFjY2VwdHNvY2stPndyaXRlX3EgKTsKICAgICAgICB9CiAgICB9CiAgICBjbGVhcl9lcnJvcigpOwogICAgc29jay0+cG1hc2sgJj0gfkZEX0FDQ0VQVDsKICAgIHNvY2stPmhtYXNrICY9IH5GRF9BQ0NFUFQ7CiAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgcmV0dXJuIGFjY2VwdHNvY2s7Cn0KCi8qIHNldCB0aGUgbGFzdCBlcnJvciBkZXBlbmRpbmcgb24gZXJybm8gKi8Kc3RhdGljIGludCBzb2NrX2dldF9lcnJvciggaW50IGVyciApCnsKICAgIHN3aXRjaCAoZXJyKQogICAgewogICAgICAgIGNhc2UgRUlOVFI6ICAgICAgICAgICAgIHJldHVybiBXU0FFSU5UUjsgYnJlYWs7CiAgICAgICAgY2FzZSBFQkFERjogICAgICAgICAgICAgcmV0dXJuIFdTQUVCQURGOyBicmVhazsKICAgICAgICBjYXNlIEVQRVJNOgogICAgICAgIGNhc2UgRUFDQ0VTOiAgICAgICAgICAgIHJldHVybiBXU0FFQUNDRVM7IGJyZWFrOwogICAgICAgIGNhc2UgRUZBVUxUOiAgICAgICAgICAgIHJldHVybiBXU0FFRkFVTFQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUlOVkFMOiAgICAgICAgICAgIHJldHVybiBXU0FFSU5WQUw7IGJyZWFrOwogICAgICAgIGNhc2UgRU1GSUxFOiAgICAgICAgICAgIHJldHVybiBXU0FFTUZJTEU7IGJyZWFrOwogICAgICAgIGNhc2UgRVdPVUxEQkxPQ0s6ICAgICAgIHJldHVybiBXU0FFV09VTERCTE9DSzsgYnJlYWs7CiAgICAgICAgY2FzZSBFSU5QUk9HUkVTUzogICAgICAgcmV0dXJuIFdTQUVJTlBST0dSRVNTOyBicmVhazsKICAgICAgICBjYXNlIEVBTFJFQURZOiAgICAgICAgICByZXR1cm4gV1NBRUFMUkVBRFk7IGJyZWFrOwogICAgICAgIGNhc2UgRU5PVFNPQ0s6ICAgICAgICAgIHJldHVybiBXU0FFTk9UU09DSzsgYnJlYWs7CiAgICAgICAgY2FzZSBFREVTVEFERFJSRVE6ICAgICAgcmV0dXJuIFdTQUVERVNUQUREUlJFUTsgYnJlYWs7CiAgICAgICAgY2FzZSBFTVNHU0laRTogICAgICAgICAgcmV0dXJuIFdTQUVNU0dTSVpFOyBicmVhazsKICAgICAgICBjYXNlIEVQUk9UT1RZUEU6ICAgICAgICByZXR1cm4gV1NBRVBST1RPVFlQRTsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9QUk9UT09QVDogICAgICAgcmV0dXJuIFdTQUVOT1BST1RPT1BUOyBicmVhazsKICAgICAgICBjYXNlIEVQUk9UT05PU1VQUE9SVDogICByZXR1cm4gV1NBRVBST1RPTk9TVVBQT1JUOyBicmVhazsKICAgICAgICBjYXNlIEVTT0NLVE5PU1VQUE9SVDogICByZXR1cm4gV1NBRVNPQ0tUTk9TVVBQT1JUOyBicmVhazsKICAgICAgICBjYXNlIEVPUE5PVFNVUFA6ICAgICAgICByZXR1cm4gV1NBRU9QTk9UU1VQUDsgYnJlYWs7CiAgICAgICAgY2FzZSBFUEZOT1NVUFBPUlQ6ICAgICAgcmV0dXJuIFdTQUVQRk5PU1VQUE9SVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQUZOT1NVUFBPUlQ6ICAgICAgcmV0dXJuIFdTQUVBRk5PU1VQUE9SVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQUREUklOVVNFOiAgICAgICAgcmV0dXJuIFdTQUVBRERSSU5VU0U7IGJyZWFrOwogICAgICAgIGNhc2UgRUFERFJOT1RBVkFJTDogICAgIHJldHVybiBXU0FFQUREUk5PVEFWQUlMOyBicmVhazsKICAgICAgICBjYXNlIEVORVRET1dOOiAgICAgICAgICByZXR1cm4gV1NBRU5FVERPV047IGJyZWFrOwogICAgICAgIGNhc2UgRU5FVFVOUkVBQ0g6ICAgICAgIHJldHVybiBXU0FFTkVUVU5SRUFDSDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTkVUUkVTRVQ6ICAgICAgICAgcmV0dXJuIFdTQUVORVRSRVNFVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQ09OTkFCT1JURUQ6ICAgICAgcmV0dXJuIFdTQUVDT05OQUJPUlRFRDsgYnJlYWs7CiAgICAgICAgY2FzZSBFUElQRToKICAgICAgICBjYXNlIEVDT05OUkVTRVQ6ICAgICAgICByZXR1cm4gV1NBRUNPTk5SRVNFVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9CVUZTOiAgICAgICAgICAgcmV0dXJuIFdTQUVOT0JVRlM7IGJyZWFrOwogICAgICAgIGNhc2UgRUlTQ09OTjogICAgICAgICAgIHJldHVybiBXU0FFSVNDT05OOyBicmVhazsKICAgICAgICBjYXNlIEVOT1RDT05OOiAgICAgICAgICByZXR1cm4gV1NBRU5PVENPTk47IGJyZWFrOwogICAgICAgIGNhc2UgRVNIVVRET1dOOiAgICAgICAgIHJldHVybiBXU0FFU0hVVERPV047IGJyZWFrOwogICAgICAgIGNhc2UgRVRPT01BTllSRUZTOiAgICAgIHJldHVybiBXU0FFVE9PTUFOWVJFRlM7IGJyZWFrOwogICAgICAgIGNhc2UgRVRJTUVET1VUOiAgICAgICAgIHJldHVybiBXU0FFVElNRURPVVQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUNPTk5SRUZVU0VEOiAgICAgIHJldHVybiBXU0FFQ09OTlJFRlVTRUQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUxPT1A6ICAgICAgICAgICAgIHJldHVybiBXU0FFTE9PUDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTkFNRVRPT0xPTkc6ICAgICAgcmV0dXJuIFdTQUVOQU1FVE9PTE9ORzsgYnJlYWs7CiAgICAgICAgY2FzZSBFSE9TVERPV046ICAgICAgICAgcmV0dXJuIFdTQUVIT1NURE9XTjsgYnJlYWs7CiAgICAgICAgY2FzZSBFSE9TVFVOUkVBQ0g6ICAgICAgcmV0dXJuIFdTQUVIT1NUVU5SRUFDSDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9URU1QVFk6ICAgICAgICAgcmV0dXJuIFdTQUVOT1RFTVBUWTsgYnJlYWs7CiNpZmRlZiBFUFJPQ0xJTQogICAgICAgIGNhc2UgRVBST0NMSU06ICAgICAgICAgIHJldHVybiBXU0FFUFJPQ0xJTTsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVVTRVJTCiAgICAgICAgY2FzZSBFVVNFUlM6ICAgICAgICAgICAgcmV0dXJuIFdTQUVVU0VSUzsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRURRVU9UCiAgICAgICAgY2FzZSBFRFFVT1Q6ICAgICAgICAgICAgcmV0dXJuIFdTQUVEUVVPVDsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVNUQUxFCiAgICAgICAgY2FzZSBFU1RBTEU6ICAgICAgICAgICAgcmV0dXJuIFdTQUVTVEFMRTsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVJFTU9URQogICAgICAgIGNhc2UgRVJFTU9URTogICAgICAgICAgIHJldHVybiBXU0FFUkVNT1RFOyBicmVhazsKI2VuZGlmCiAgICBkZWZhdWx0OiBlcnJubz1lcnI7IHBlcnJvcigic29ja19zZXRfZXJyb3IiKTsgcmV0dXJuIEVSUk9SX1VOS05PV047IGJyZWFrOwogICAgfQp9CgovKiBzZXQgdGhlIGxhc3QgZXJyb3IgZGVwZW5kaW5nIG9uIGVycm5vICovCnN0YXRpYyB2b2lkIHNvY2tfc2V0X2Vycm9yKHZvaWQpCnsKICAgIHNldF9lcnJvciggc29ja19nZXRfZXJyb3IoIGVycm5vICkgKTsKfQoKLyogY3JlYXRlIGEgc29ja2V0ICovCkRFQ0xfSEFORExFUihjcmVhdGVfc29ja2V0KQp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICpvYmo7CgogICAgcmVwbHktPmhhbmRsZSA9IDA7CiAgICBpZiAoKG9iaiA9IGNyZWF0ZV9zb2NrZXQoIHJlcS0+ZmFtaWx5LCByZXEtPnR5cGUsIHJlcS0+cHJvdG9jb2wsIHJlcS0+ZmxhZ3MgKSkgIT0gTlVMTCkKICAgIHsKICAgICAgICByZXBseS0+aGFuZGxlID0gYWxsb2NfaGFuZGxlKCBjdXJyZW50LT5wcm9jZXNzLCBvYmosIHJlcS0+YWNjZXNzLCByZXEtPmluaGVyaXQgKTsKICAgICAgICByZWxlYXNlX29iamVjdCggb2JqICk7CiAgICB9Cn0KCi8qIGFjY2VwdCBhIHNvY2tldCAqLwpERUNMX0hBTkRMRVIoYWNjZXB0X3NvY2tldCkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CgogICAgcmVwbHktPmhhbmRsZSA9IDA7CiAgICBpZiAoKHNvY2sgPSBhY2NlcHRfc29ja2V0KCByZXEtPmxoYW5kbGUgKSkgIT0gTlVMTCkKICAgIHsKICAgICAgICByZXBseS0+aGFuZGxlID0gYWxsb2NfaGFuZGxlKCBjdXJyZW50LT5wcm9jZXNzLCAmc29jay0+b2JqLCByZXEtPmFjY2VzcywgcmVxLT5pbmhlcml0ICk7CiAgICAgICAgc29jay0+d3BhcmFtID0gcmVwbHktPmhhbmRsZTsgIC8qIHdwYXJhbSBmb3IgbWVzc2FnZSBpcyB0aGUgc29ja2V0IGhhbmRsZSAqLwogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgICAgICByZWxlYXNlX29iamVjdCggJnNvY2stPm9iaiApOwogICAgfQp9CgovKiBzZXQgc29ja2V0IGV2ZW50IHBhcmFtZXRlcnMgKi8KREVDTF9IQU5ETEVSKHNldF9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgc3RydWN0IGV2ZW50ICpvbGRfZXZlbnQ7CiAgICBpbnQgcG9sbGV2OwoKICAgIGlmICghKHNvY2sgPSAoc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLCByZXEtPmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwgJnNvY2tfb3BzKSkpCiAgICAgICAgcmV0dXJuOwogICAgb2xkX2V2ZW50ID0gc29jay0+ZXZlbnQ7CiAgICBzb2NrLT5tYXNrICAgID0gcmVxLT5tYXNrOwogICAgc29jay0+ZXZlbnQgICA9IE5VTEw7CiAgICBzb2NrLT53aW5kb3cgID0gcmVxLT53aW5kb3c7CiAgICBzb2NrLT5tZXNzYWdlID0gcmVxLT5tc2c7CiAgICBzb2NrLT53cGFyYW0gID0gcmVxLT5oYW5kbGU7ICAvKiB3cGFyYW0gaXMgdGhlIHNvY2tldCBoYW5kbGUgKi8KICAgIGlmIChyZXEtPmV2ZW50KSBzb2NrLT5ldmVudCA9IGdldF9ldmVudF9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+ZXZlbnQsIEVWRU5UX01PRElGWV9TVEFURSApOwoKICAgIGlmIChkZWJ1Z19sZXZlbCAmJiBzb2NrLT5ldmVudCkgZnByaW50ZihzdGRlcnIsICJldmVudCBwdHI6ICVwXG4iLCBzb2NrLT5ldmVudCk7CgogICAgcG9sbGV2ID0gc29ja19yZXNlbGVjdCggc29jayApOwogICAgaWYgKCBwb2xsZXYgKSBzb2NrX3RyeV9ldmVudCAoIHNvY2ssIHBvbGxldiApOwoKICAgIGlmIChzb2NrLT5tYXNrKQogICAgICAgIHNvY2stPnN0YXRlIHw9IEZEX1dJTkVfTk9OQkxPQ0tJTkc7CgogICAgLyogaWYgYSBuZXR3b3JrIGV2ZW50IGlzIHBlbmRpbmcsIHNpZ25hbCB0aGUgZXZlbnQgb2JqZWN0IAogICAgICAgaXQgaXMgcG9zc2libGUgdGhhdCBGRF9DT05ORUNUIG9yIEZEX0FDQ0VQVCBuZXR3b3JrIGV2ZW50cyBoYXMgaGFwcGVuZWQKICAgICAgIGJlZm9yZSBhIFdTQUV2ZW50U2VsZWN0KCkgd2FzIGRvbmUgb24gaXQuIAogICAgICAgKHdoZW4gZGVhbGluZyB3aXRoIEFzeW5jaHJvbm91cyBzb2NrZXQpICAqLwogICAgaWYgKHNvY2stPnBtYXNrICYgc29jay0+bWFzaykgc29ja193YWtlX3VwKCBzb2NrLCBwb2xsZXYgKTsKCiAgICBpZiAob2xkX2V2ZW50KSByZWxlYXNlX29iamVjdCggb2xkX2V2ZW50ICk7IC8qIHdlJ3JlIHRocm91Z2ggd2l0aCBpdCAqLwogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQoKLyogZ2V0IHNvY2tldCBldmVudCBwYXJhbWV0ZXJzICovCkRFQ0xfSEFORExFUihnZXRfc29ja2V0X2V2ZW50KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKCiAgICBzb2NrPShzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooY3VycmVudC0+cHJvY2VzcyxyZXEtPmhhbmRsZSxHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwmc29ja19vcHMpOwogICAgaWYgKCFzb2NrKQogICAgewogICAgICAgIHJlcGx5LT5tYXNrICA9IDA7CiAgICAgICAgcmVwbHktPnBtYXNrID0gMDsKICAgICAgICByZXBseS0+c3RhdGUgPSAwOwogICAgICAgIHNldF9lcnJvciggV1NBRU5PVFNPQ0sgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICByZXBseS0+bWFzayAgPSBzb2NrLT5tYXNrOwogICAgcmVwbHktPnBtYXNrID0gc29jay0+cG1hc2s7CiAgICByZXBseS0+c3RhdGUgPSBzb2NrLT5zdGF0ZTsKICAgIHNldF9yZXBseV9kYXRhKCBzb2NrLT5lcnJvcnMsIG1pbiggZ2V0X3JlcGx5X21heF9zaXplKCksIHNpemVvZihzb2NrLT5lcnJvcnMpICkpOwoKICAgIGlmIChyZXEtPnNlcnZpY2UpCiAgICB7CiAgICAgICAgaWYgKHJlcS0+Y19ldmVudCkKICAgICAgICB7CiAgICAgICAgICAgIHN0cnVjdCBldmVudCAqY2V2ZW50ID0gZ2V0X2V2ZW50X29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5jX2V2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UX01PRElGWV9TVEFURSApOwogICAgICAgICAgICBpZiAoY2V2ZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXNldF9ldmVudCggY2V2ZW50ICk7CiAgICAgICAgICAgICAgICByZWxlYXNlX29iamVjdCggY2V2ZW50ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc29jay0+cG1hc2sgPSAwOwogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIH0KICAgIHJlbGVhc2Vfb2JqZWN0KCAmc29jay0+b2JqICk7Cn0KCi8qIHJlLWVuYWJsZSBwZW5kaW5nIHNvY2tldCBldmVudHMgKi8KREVDTF9IQU5ETEVSKGVuYWJsZV9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgaW50IHBvbGxldjsKCiAgICBpZiAoIShzb2NrID0gKHN0cnVjdCBzb2NrKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsICZzb2NrX29wcykpKQogICAgICAgIHJldHVybjsKCiAgICBzb2NrLT5wbWFzayAmPSB+cmVxLT5tYXNrOyAvKiBpcyB0aGlzIHNhZmU/ICovCiAgICBzb2NrLT5obWFzayAmPSB+cmVxLT5tYXNrOwogICAgc29jay0+c3RhdGUgfD0gcmVxLT5zc3RhdGU7CiAgICBzb2NrLT5zdGF0ZSAmPSB+cmVxLT5jc3RhdGU7CgogICAgcG9sbGV2ID0gc29ja19yZXNlbGVjdCggc29jayApOwogICAgaWYgKCBwb2xsZXYgKSBzb2NrX3RyeV9ldmVudCAoIHNvY2ssIHBvbGxldiApOwoKICAgIHJlbGVhc2Vfb2JqZWN0KCAmc29jay0+b2JqICk7Cn0KCkRFQ0xfSEFORExFUihzZXRfc29ja2V0X2RlZmVycmVkKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jaywgKmFjY2VwdHNvY2s7CgogICAgc29jaz0oc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLHJlcS0+aGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwmc29ja19vcHMgKTsKICAgIGlmICggIXNvY2sgKQogICAgewogICAgICAgIHNldF9lcnJvciAoIFdTQUVOT1RTT0NLICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgYWNjZXB0c29jayA9IChzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooIGN1cnJlbnQtPnByb2Nlc3MscmVxLT5kZWZlcnJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwmc29ja19vcHMgKTsKICAgIGlmICggIWFjY2VwdHNvY2sgKQogICAgewogICAgICAgIHJlbGVhc2Vfb2JqZWN0ICggc29jayApOwogICAgICAgIHNldF9lcnJvciAoIFdTQUVOT1RTT0NLICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgc29jay0+ZGVmZXJyZWQgPSBhY2NlcHRzb2NrOwogICAgcmVsZWFzZV9vYmplY3QgKCBzb2NrICk7Cn0K