LyoKICogUlBDIGVuZHBvaW50IG1hcHBlcgogKgogKiBDb3B5cmlnaHQgMjAwMiBHcmVnIFR1cm5lcgogKiBDb3B5cmlnaHQgMjAwMSBPdmUgS+V2ZW4sIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICoKICogVE9ETzoKICogIC0gYWN0dWFsbHkgZG8gdGhpbmdzIHJpZ2h0CiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKCiNpbmNsdWRlICJycGMuaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgojaW5jbHVkZSAicnBjX2JpbmRpbmcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKG9sZSk7CgovKiBUaGUgInJlYWwiIFJQQyBwb3J0bWFwcGVyIGVuZHBvaW50cyB0aGF0IEkga25vdyBvZiBhcmU6CiAqCiAqICBuY2FkZ19pcF91ZHA6IDEzNQogKiAgbmNhY25faXBfdGNwOiAxMzUKICogIG5jYWNuX25wOiBcXHBpcGVcZXBtYXBwZXIgKD8pCiAqICBuY2FscnBjOiBlcG1hcHBlcgogKgogKiBJZiB0aGUgdXNlcidzIG1hY2hpbmUgcmFuIGEgRENFIFJQQyBkYWVtb24sIGl0IHdvdWxkCiAqIHByb2JhYmx5IGJlIHBvc3NpYmxlIHRvIGNvbm5lY3QgdG8gaXQsIGJ1dCB0aGVyZSBhcmUgbWFueQogKiByZWFzb25zIG5vdCB0bywgbGlrZToKICogIC0gdGhlIHVzZXIgcHJvYmFibHkgZG9lcyAqbm90KiBydW4gb25lLCBhbmQgcHJvYmFibHkKICogICAgc2hvdWxkbid0IGJlIGZvcmNlZCB0byBydW4gb25lIGp1c3QgZm9yIGxvY2FsIENPTQogKiAgLSB2ZXJ5IGZldyBVbml4IHN5c3RlbXMgdXNlIERDRSBSUEMuLi4gaWYgdGhleSBydW4gYSBSUEMKICogICAgZGFlbW9uIGF0IGFsbCwgaXQncyB1c3VhbGx5IFN1biBSUEMKICogIC0gRENFIFJQQyByZWdpc3RyYXRpb25zIGFyZSBwZXJzaXN0ZW50IGFuZCBzYXZlZCBvbiBkaXNrLAogKiAgICB3aGlsZSBNUy1SUEMgcmVnaXN0cmF0aW9ucyBhcmUgZG9jdW1lbnRlZCBhcyBub24tcGVyc2lzdGVudAogKiAgICBhbmQgc3RvcmVkIG9ubHkgaW4gUkFNLCBhbmQgYXV0by1kZXN0cm95ZWQgd2hlbiB0aGUgcHJvY2VzcwogKiAgICBkaWVzIChzb21ldGhpbmcgRENFIFJQQyBjYW4ndCBkbykKICoKICogT2YgY291cnNlLCBpZiB0aGUgdXNlciAqZGlkKiB3YW50IHRvIHJ1biBhIERDRSBSUEMgZGFlbW9uIGFueXdheSwKICogdGhlcmUgd291bGQgYmUgaW50ZXJvcGVyYWJpbGl0eSBhZHZhbnRhZ2VzLCBsaWtlIHRoZSBwb3NzaWJpbGl0eQogKiBvZiBydW5uaW5nIGEgZnVsbHkgZnVuY3Rpb25hbCBEQ09NIHNlcnZlciB1c2luZyBXaW5lLi4uCiAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY0VwUmVnaXN0ZXJBIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY0VwUmVnaXN0ZXJBKCBSUENfSUZfSEFORExFIElmU3BlYywgUFJQQ19CSU5ESU5HX1ZFQ1RPUiBCaW5kaW5nVmVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVVSURfVkVDVE9SIFV1aWRWZWN0b3IsIExQU1RSIEFubm90YXRpb24gKQp7CiAgUlBDU1NfTlBfTUVTU0FHRSBtc2c7CiAgUlBDU1NfTlBfUkVQTFkgcmVwbHk7CiAgY2hhciAqdmFyZGF0YV9wYXlsb2FkLCAqdnA7CiAgUFJQQ19TRVJWRVJfSU5URVJGQUNFIElmID0gKFBSUENfU0VSVkVSX0lOVEVSRkFDRSlJZlNwZWM7CiAgdW5zaWduZWQgbG9uZyBjOwogIFJQQ19TVEFUVVMgcnNsdCA9IFJQQ19TX09LOwoKICBUUkFDRSgiKCVwLCVwLCVwLCVzKVxuIiwgSWZTcGVjLCBCaW5kaW5nVmVjdG9yLCBVdWlkVmVjdG9yLCBkZWJ1Z3N0cl9hKEFubm90YXRpb24pKTsKICBUUkFDRSgiIGlmaWQ9JXNcbiIsIGRlYnVnc3RyX2d1aWQoJklmLT5JbnRlcmZhY2VJZC5TeW50YXhHVUlEKSk7CiAgZm9yIChjPTA7IGM8QmluZGluZ1ZlY3Rvci0+Q291bnQ7IGMrKykgewogICAgUnBjQmluZGluZyogYmluZCA9IChScGNCaW5kaW5nKikoQmluZGluZ1ZlY3Rvci0+QmluZGluZ0hbY10pOwogICAgVFJBQ0UoIiBwcm90c2VxWyVsZF09JXNcbiIsIGMsIGRlYnVnc3RyX2EoYmluZC0+UHJvdHNlcSkpOwogICAgVFJBQ0UoIiBlbmRwb2ludFslbGRdPSVzXG4iLCBjLCBkZWJ1Z3N0cl9hKGJpbmQtPkVuZHBvaW50KSk7CiAgfQogIGlmIChVdWlkVmVjdG9yKSB7CiAgICBmb3IgKGM9MDsgYzxVdWlkVmVjdG9yLT5Db3VudDsgYysrKQogICAgICBUUkFDRSgiIG9ialslbGRdPSVzXG4iLCBjLCBkZWJ1Z3N0cl9ndWlkKFV1aWRWZWN0b3ItPlV1aWRbY10pKTsKICB9CgogIC8qIEZJWE1FOiBEbyBzb21ldGhpbmcgd2l0aCBhbm5vdGF0aW9uLiAqLwoKICAvKiBjb25zdHJ1Y3QgdGhlIG1lc3NhZ2UgdG8gcnBjc3MgKi8KICBtc2cubWVzc2FnZV90eXBlID0gUlBDU1NfTlBfTUVTU0FHRV9UWVBFSURfUkVHSVNURVJFUE1TRzsKICBtc2cubWVzc2FnZS5yZWdpc3RlcmVwbXNnLmlmYWNlID0gSWYtPkludGVyZmFjZUlkOwogIG1zZy5tZXNzYWdlLnJlZ2lzdGVyZXBtc2cubm9fcmVwbGFjZSA9IDA7CgogIG1zZy5tZXNzYWdlLnJlZ2lzdGVyZXBtc2cub2JqZWN0X2NvdW50ID0gKFV1aWRWZWN0b3IpID8gVXVpZFZlY3Rvci0+Q291bnQgOiAwOwogIG1zZy5tZXNzYWdlLnJlZ2lzdGVyZXBtc2cuYmluZGluZ19jb3VudCA9IEJpbmRpbmdWZWN0b3ItPkNvdW50OwoKICAvKiBjYWxjdWxhdGUgdmFyZGF0YSBwYXlsb2FkIHNpemUgKi8KICBtc2cudmFyZGF0YV9wYXlsb2FkX3NpemUgPSBtc2cubWVzc2FnZS5yZWdpc3RlcmVwbXNnLm9iamVjdF9jb3VudCAqIHNpemVvZihVVUlEKTsKICBmb3IgKGM9MDsgYyA8IG1zZy5tZXNzYWdlLnJlZ2lzdGVyZXBtc2cuYmluZGluZ19jb3VudDsgYysrKSB7CiAgICBScGNCaW5kaW5nICpiaW5kID0gKFJwY0JpbmRpbmcgKikoQmluZGluZ1ZlY3Rvci0+QmluZGluZ0hbY10pOwogICAgbXNnLnZhcmRhdGFfcGF5bG9hZF9zaXplICs9IHN0cmxlbihiaW5kLT5Qcm90c2VxKSArIDE7CiAgICBtc2cudmFyZGF0YV9wYXlsb2FkX3NpemUgKz0gc3RybGVuKGJpbmQtPkVuZHBvaW50KSArIDE7CiAgfQoKICAvKiBhbGxvY2F0ZSB0aGUgcGF5bG9hZCBidWZmZXIgKi8KICB2cCA9IHZhcmRhdGFfcGF5bG9hZCA9IExvY2FsQWxsb2MoTFBUUiwgbXNnLnZhcmRhdGFfcGF5bG9hZF9zaXplKTsKICBpZiAoIXZhcmRhdGFfcGF5bG9hZCkKICAgIHJldHVybiBSUENfU19PVVRfT0ZfTUVNT1JZOwoKICAvKiBwb3B1bGF0ZSB0aGUgcGF5bG9hZCBkYXRhICovCiAgZm9yIChjPTA7IGMgPCBtc2cubWVzc2FnZS5yZWdpc3RlcmVwbXNnLm9iamVjdF9jb3VudDsgYysrKSB7CiAgICBDb3B5TWVtb3J5KHZwLCBVdWlkVmVjdG9yLT5VdWlkW2NdLCBzaXplb2YoVVVJRCkpOwogICAgdnAgKz0gc2l6ZW9mKFVVSUQpOwogIH0KCiAgZm9yIChjPTA7IGMgPCBtc2cubWVzc2FnZS5yZWdpc3RlcmVwbXNnLmJpbmRpbmdfY291bnQ7IGMrKykgewogICAgUnBjQmluZGluZyAqYmluZCA9IChScGNCaW5kaW5nKikoQmluZGluZ1ZlY3Rvci0+QmluZGluZ0hbY10pOwogICAgdW5zaWduZWQgbG9uZyBwc2xlbiA9IHN0cmxlbihiaW5kLT5Qcm90c2VxKSArIDEsIGVwbGVuID0gc3RybGVuKGJpbmQtPkVuZHBvaW50KSArIDE7CiAgICBDb3B5TWVtb3J5KHZwLCBiaW5kLT5Qcm90c2VxLCBwc2xlbik7CiAgICB2cCArPSBwc2xlbjsKICAgIENvcHlNZW1vcnkodnAsIGJpbmQtPkVuZHBvaW50LCBlcGxlbik7CiAgICB2cCArPSBlcGxlbjsKICB9CgogIC8qIHNlbmQgb3VyIHJlcXVlc3QgKi8KICBpZiAoIVJQQ1JUNF9SUENTU09uRGVtYW5kQ2FsbCgmbXNnLCB2YXJkYXRhX3BheWxvYWQsICZyZXBseSkpCiAgICByc2x0ID0gUlBDX1NfT1VUX09GX01FTU9SWTsKCiAgLyogZnJlZSB0aGUgcGF5bG9hZCBidWZmZXIgKi8KICBMb2NhbEZyZWUodmFyZGF0YV9wYXlsb2FkKTsKCiAgcmV0dXJuIHJzbHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNFcFVucmVnaXN0ZXIgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjRXBVbnJlZ2lzdGVyKCBSUENfSUZfSEFORExFIElmU3BlYywgUFJQQ19CSU5ESU5HX1ZFQ1RPUiBCaW5kaW5nVmVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVVUlEX1ZFQ1RPUiBVdWlkVmVjdG9yICkKewogIFJQQ1NTX05QX01FU1NBR0UgbXNnOwogIFJQQ1NTX05QX1JFUExZIHJlcGx5OwogIGNoYXIgKnZhcmRhdGFfcGF5bG9hZCwgKnZwOwogIFBSUENfU0VSVkVSX0lOVEVSRkFDRSBJZiA9IChQUlBDX1NFUlZFUl9JTlRFUkZBQ0UpSWZTcGVjOwogIHVuc2lnbmVkIGxvbmcgYzsKICBSUENfU1RBVFVTIHJzbHQgPSBSUENfU19PSzsKCiAgVFJBQ0UoIiglcCwlcCwlcClcbiIsIElmU3BlYywgQmluZGluZ1ZlY3RvciwgVXVpZFZlY3Rvcik7CiAgVFJBQ0UoIiBpZmlkPSVzXG4iLCBkZWJ1Z3N0cl9ndWlkKCZJZi0+SW50ZXJmYWNlSWQuU3ludGF4R1VJRCkpOwogIGZvciAoYz0wOyBjPEJpbmRpbmdWZWN0b3ItPkNvdW50OyBjKyspIHsKICAgIFJwY0JpbmRpbmcqIGJpbmQgPSAoUnBjQmluZGluZyopKEJpbmRpbmdWZWN0b3ItPkJpbmRpbmdIW2NdKTsKICAgIFRSQUNFKCIgcHJvdHNlcVslbGRdPSVzXG4iLCBjLCBkZWJ1Z3N0cl9hKGJpbmQtPlByb3RzZXEpKTsKICAgIFRSQUNFKCIgZW5kcG9pbnRbJWxkXT0lc1xuIiwgYywgZGVidWdzdHJfYShiaW5kLT5FbmRwb2ludCkpOwogIH0KICBpZiAoVXVpZFZlY3RvcikgewogICAgZm9yIChjPTA7IGM8VXVpZFZlY3Rvci0+Q291bnQ7IGMrKykKICAgICAgVFJBQ0UoIiBvYmpbJWxkXT0lc1xuIiwgYywgZGVidWdzdHJfZ3VpZChVdWlkVmVjdG9yLT5VdWlkW2NdKSk7CiAgfQoKICAvKiBjb25zdHJ1Y3QgdGhlIG1lc3NhZ2UgdG8gcnBjc3MgKi8KICBtc2cubWVzc2FnZV90eXBlID0gUlBDU1NfTlBfTUVTU0FHRV9UWVBFSURfVU5SRUdJU1RFUkVQTVNHOwogIG1zZy5tZXNzYWdlLnVucmVnaXN0ZXJlcG1zZy5pZmFjZSA9IElmLT5JbnRlcmZhY2VJZDsKCiAgbXNnLm1lc3NhZ2UudW5yZWdpc3RlcmVwbXNnLm9iamVjdF9jb3VudCA9IChVdWlkVmVjdG9yKSA/IFV1aWRWZWN0b3ItPkNvdW50IDogMDsKICBtc2cubWVzc2FnZS51bnJlZ2lzdGVyZXBtc2cuYmluZGluZ19jb3VudCA9IEJpbmRpbmdWZWN0b3ItPkNvdW50OwoKICAvKiBjYWxjdWxhdGUgdmFyZGF0YSBwYXlsb2FkIHNpemUgKi8KICBtc2cudmFyZGF0YV9wYXlsb2FkX3NpemUgPSBtc2cubWVzc2FnZS51bnJlZ2lzdGVyZXBtc2cub2JqZWN0X2NvdW50ICogc2l6ZW9mKFVVSUQpOwogIGZvciAoYz0wOyBjIDwgbXNnLm1lc3NhZ2UudW5yZWdpc3RlcmVwbXNnLmJpbmRpbmdfY291bnQ7IGMrKykgewogICAgUnBjQmluZGluZyAqYmluZCA9IChScGNCaW5kaW5nICopKEJpbmRpbmdWZWN0b3ItPkJpbmRpbmdIW2NdKTsKICAgIG1zZy52YXJkYXRhX3BheWxvYWRfc2l6ZSArPSBzdHJsZW4oYmluZC0+UHJvdHNlcSkgKyAxOwogICAgbXNnLnZhcmRhdGFfcGF5bG9hZF9zaXplICs9IHN0cmxlbihiaW5kLT5FbmRwb2ludCkgKyAxOwogIH0KCiAgLyogYWxsb2NhdGUgdGhlIHBheWxvYWQgYnVmZmVyICovCiAgdnAgPSB2YXJkYXRhX3BheWxvYWQgPSBMb2NhbEFsbG9jKExQVFIsIG1zZy52YXJkYXRhX3BheWxvYWRfc2l6ZSk7CiAgaWYgKCF2YXJkYXRhX3BheWxvYWQpCiAgICByZXR1cm4gUlBDX1NfT1VUX09GX01FTU9SWTsKCiAgLyogcG9wdWxhdGUgdGhlIHBheWxvYWQgZGF0YSAqLwogIGZvciAoYz0wOyBjIDwgbXNnLm1lc3NhZ2UudW5yZWdpc3RlcmVwbXNnLm9iamVjdF9jb3VudDsgYysrKSB7CiAgICBDb3B5TWVtb3J5KHZwLCBVdWlkVmVjdG9yLT5VdWlkW2NdLCBzaXplb2YoVVVJRCkpOwogICAgdnAgKz0gc2l6ZW9mKFVVSUQpOwogIH0KCiAgZm9yIChjPTA7IGMgPCBtc2cubWVzc2FnZS51bnJlZ2lzdGVyZXBtc2cuYmluZGluZ19jb3VudDsgYysrKSB7CiAgICBScGNCaW5kaW5nICpiaW5kID0gKFJwY0JpbmRpbmcqKShCaW5kaW5nVmVjdG9yLT5CaW5kaW5nSFtjXSk7CiAgICB1bnNpZ25lZCBsb25nIHBzbGVuID0gc3RybGVuKGJpbmQtPlByb3RzZXEpICsgMSwgZXBsZW4gPSBzdHJsZW4oYmluZC0+RW5kcG9pbnQpICsgMTsKICAgIENvcHlNZW1vcnkodnAsIGJpbmQtPlByb3RzZXEsIHBzbGVuKTsKICAgIHZwICs9IHBzbGVuOwogICAgQ29weU1lbW9yeSh2cCwgYmluZC0+RW5kcG9pbnQsIGVwbGVuKTsKICAgIHZwICs9IGVwbGVuOwogIH0KCiAgLyogc2VuZCBvdXIgcmVxdWVzdCAqLwogIGlmICghUlBDUlQ0X1JQQ1NTT25EZW1hbmRDYWxsKCZtc2csIHZhcmRhdGFfcGF5bG9hZCwgJnJlcGx5KSkKICAgIHJzbHQgPSBSUENfU19PVVRfT0ZfTUVNT1JZOwoKICAvKiBmcmVlIHRoZSBwYXlsb2FkIGJ1ZmZlciAqLwogIExvY2FsRnJlZSh2YXJkYXRhX3BheWxvYWQpOwoKICByZXR1cm4gcnNsdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY0VwUmVzb2x2ZUJpbmRpbmcgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjRXBSZXNvbHZlQmluZGluZyggUlBDX0JJTkRJTkdfSEFORExFIEJpbmRpbmcsIFJQQ19JRl9IQU5ETEUgSWZTcGVjICkKewogIFJQQ1NTX05QX01FU1NBR0UgbXNnOwogIFJQQ1NTX05QX1JFUExZIHJlcGx5OwogIFBSUENfQ0xJRU5UX0lOVEVSRkFDRSBJZiA9IChQUlBDX0NMSUVOVF9JTlRFUkZBQ0UpSWZTcGVjOwogIFJwY0JpbmRpbmcqIGJpbmQgPSAoUnBjQmluZGluZyopQmluZGluZzsKCiAgVFJBQ0UoIiglcCwlcClcbiIsIEJpbmRpbmcsIElmU3BlYyk7CiAgVFJBQ0UoIiBwcm90c2VxPSVzXG4iLCBkZWJ1Z3N0cl9hKGJpbmQtPlByb3RzZXEpKTsKICBUUkFDRSgiIG9iaj0lc1xuIiwgZGVidWdzdHJfZ3VpZCgmYmluZC0+T2JqZWN0VXVpZCkpOwogIFRSQUNFKCIgaWZpZD0lc1xuIiwgZGVidWdzdHJfZ3VpZCgmSWYtPkludGVyZmFjZUlkLlN5bnRheEdVSUQpKTsKCiAgLyogRklYTUU6IHRvdGFsbHkgdW50ZXN0ZWQgKi8KCiAgLyoganVzdCByZXR1cm4gZm9yIGZ1bGx5IGJvdW5kIGhhbmRsZXMgKi8KICBpZiAoYmluZC0+RW5kcG9pbnQgJiYgKGJpbmQtPkVuZHBvaW50WzBdICE9ICdcMCcpKQogICAgcmV0dXJuIFJQQ19TX09LOwoKICAvKiBjb25zdHJ1Y3QgdGhlIG1lc3NhZ2UgdG8gcnBjc3MgKi8KICBtc2cubWVzc2FnZV90eXBlID0gUlBDU1NfTlBfTUVTU0FHRV9UWVBFSURfUkVTT0xWRUVQTVNHOwogIG1zZy5tZXNzYWdlLnJlc29sdmVlcG1zZy5pZmFjZSA9IElmLT5JbnRlcmZhY2VJZDsKICBtc2cubWVzc2FnZS5yZXNvbHZlZXBtc2cub2JqZWN0ID0gYmluZC0+T2JqZWN0VXVpZDsKIAogIG1zZy52YXJkYXRhX3BheWxvYWRfc2l6ZSA9IHN0cmxlbihiaW5kLT5Qcm90c2VxKSArIDE7CgogIC8qIHNlbmQgdGhlIG1lc3NhZ2UgKi8KICBpZiAoIVJQQ1JUNF9SUENTU09uRGVtYW5kQ2FsbCgmbXNnLCBiaW5kLT5Qcm90c2VxLCAmcmVwbHkpKQogICAgcmV0dXJuIFJQQ19TX09VVF9PRl9NRU1PUlk7CgogIC8qIGVtcHR5LXN0cmluZyByZXN1bHQgbWVhbnMgbm90IHJlZ2lzdGVyZWQgKi8KICBpZiAocmVwbHkuYXNfc3RyaW5nWzBdID09ICdcMCcpCiAgICByZXR1cm4gRVBUX1NfTk9UX1JFR0lTVEVSRUQ7CiAgCiAgLyogb3RoZXJ3aXNlIHdlIGZ1bGx5IGJpbmQgdGhlIGhhbmRsZSAmIHJldHVybiBSUENfU19PSyAqLwogIHJldHVybiBSUENSVDRfUmVzb2x2ZUJpbmRpbmcoQmluZGluZywgcmVwbHkuYXNfc3RyaW5nKTsKfQo=