LyoKICogSVMtSVMgUm91dChlKWluZyBwcm90b2NvbCAtIGlzaXNfdGx2LmMKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTLUlTIFRMViByZWxhdGVkIHJvdXRpbmVzCiAqCiAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyICAgU2FtcG8gU2FhcmlzdG8KICogICAgICAgICAgICAgICAgICAgICAgICAgICBUYW1wZXJlIFVuaXZlcnNpdHkgb2YgVGVjaG5vbG9neSAgICAgIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RpdHV0ZSBvZiBDb21tdW5pY2F0aW9ucyBFbmdpbmVlcmluZwogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKICogYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLGJ1dCBXSVRIT1VUIAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCiAqIG1vcmUgZGV0YWlscy4KCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIAogKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAKICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCiAqLwoKI2luY2x1ZGUgPHplYnJhLmg+CgojaW5jbHVkZSAibG9nLmgiCiNpbmNsdWRlICJsaW5rbGlzdC5oIgojaW5jbHVkZSAic3RyZWFtLmgiCiNpbmNsdWRlICJtZW1vcnkuaCIKI2luY2x1ZGUgInByZWZpeC5oIgojaW5jbHVkZSAidnR5LmgiCiNpbmNsdWRlICJpZi5oIgoKI2luY2x1ZGUgImlzaXNkL2RpY3QuaCIKI2luY2x1ZGUgImlzaXNkL2lzaXNfY29uc3RhbnRzLmgiCiNpbmNsdWRlICJpc2lzZC9pc2lzX2NvbW1vbi5oIgojaW5jbHVkZSAiaXNpc2QvaXNpc19mbGFncy5oIgojaW5jbHVkZSAiaXNpc2QvaXNpc19jaXJjdWl0LmgiCiNpbmNsdWRlICJpc2lzZC9pc2lzX3Rsdi5oIgojaW5jbHVkZSAiaXNpc2QvaXNpc2QuaCIKI2luY2x1ZGUgImlzaXNkL2lzaXNfZHluaG4uaCIKI2luY2x1ZGUgImlzaXNkL2lzaXNfbWlzYy5oIgojaW5jbHVkZSAiaXNpc2QvaXNpc19wZHUuaCIKI2luY2x1ZGUgImlzaXNkL2lzaXNfbHNwLmgiCgpleHRlcm4gc3RydWN0IGlzaXMgKmlzaXM7Cgp2b2lkCmZyZWVfdGx2ICh2b2lkICp2YWwpCnsKICBYRlJFRSAoTVRZUEVfSVNJU19UTFYsIHZhbCk7CgogIHJldHVybjsKfQoKLyoKICogQ2FsbGVkIGFmdGVyIHBhcnNpbmcgb2YgYSBQRFUuIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgdGx2J3MgbGVmdCwgc28gdGhpcwogKiBpcyBvbmx5IGEgY2F1dGlvbiB0byBhdm9pZCBtZW1vcnkgbGVha3MKICovCnZvaWQKZnJlZV90bHZzIChzdHJ1Y3QgdGx2cyAqdGx2cykKewogIGlmICh0bHZzLT5hcmVhX2FkZHJzKQogICAgbGlzdF9kZWxldGUgKHRsdnMtPmFyZWFfYWRkcnMpOwogIGlmICh0bHZzLT5pc19uZWlnaHMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXNfbmVpZ2hzKTsKICBpZiAodGx2cy0+dGVfaXNfbmVpZ2hzKQogICAgbGlzdF9kZWxldGUgKHRsdnMtPnRlX2lzX25laWdocyk7CiAgaWYgKHRsdnMtPmVzX25laWdocykKICAgIGxpc3RfZGVsZXRlICh0bHZzLT5lc19uZWlnaHMpOwogIGlmICh0bHZzLT5sc3BfZW50cmllcykKICAgIGxpc3RfZGVsZXRlICh0bHZzLT5sc3BfZW50cmllcyk7CiAgaWYgKHRsdnMtPmxhbl9uZWlnaHMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+bGFuX25laWdocyk7CiAgaWYgKHRsdnMtPnByZWZpeF9uZWlnaHMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+cHJlZml4X25laWdocyk7CiAgaWYgKHRsdnMtPmlwdjRfYWRkcnMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXB2NF9hZGRycyk7CiAgaWYgKHRsdnMtPmlwdjRfaW50X3JlYWNocykKICAgIGxpc3RfZGVsZXRlICh0bHZzLT5pcHY0X2ludF9yZWFjaHMpOwogIGlmICh0bHZzLT5pcHY0X2V4dF9yZWFjaHMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXB2NF9leHRfcmVhY2hzKTsKICBpZiAodGx2cy0+dGVfaXB2NF9yZWFjaHMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+dGVfaXB2NF9yZWFjaHMpOwojaWZkZWYgSEFWRV9JUFY2CiAgaWYgKHRsdnMtPmlwdjZfYWRkcnMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXB2Nl9hZGRycyk7CiAgaWYgKHRsdnMtPmlwdjZfcmVhY2hzKQogICAgbGlzdF9kZWxldGUgKHRsdnMtPmlwdjZfcmVhY2hzKTsKI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogIAogIHJldHVybjsKfQoKLyoKICogUGFyc2VzIHRoZSB0bHZzIGZvdW5kIGluIHRoZSB2YXJpYW50IGxlbmd0aCBwYXJ0IG9mIHRoZSBQRFUuCiAqIENhbGxlciB0ZWxscyB3aXRoIGZsYWdzIGluICJleHBlY3RlZCIgd2hpY2ggVExWJ3MgaXQgaXMgaW50ZXJlc3RlZCBpbi4KICovCmludApwYXJzZV90bHZzIChjaGFyICphcmVhdGFnLCB1X2NoYXIgKiBzdHJlYW0sIGludCBzaXplLCB1X2ludDMyX3QgKiBleHBlY3RlZCwKCSAgICB1X2ludDMyX3QgKiBmb3VuZCwgc3RydWN0IHRsdnMgKnRsdnMpCnsKICB1X2NoYXIgdHlwZSwgbGVuZ3RoOwogIHN0cnVjdCBsYW5fbmVpZ2ggKmxhbl9uZWk7CiAgc3RydWN0IGFyZWFfYWRkciAqYXJlYV9hZGRyOwogIHN0cnVjdCBpc19uZWlnaCAqaXNfbmVpOwogIHN0cnVjdCB0ZV9pc19uZWlnaCAqdGVfaXNfbmVpOwogIHN0cnVjdCBlc19uZWlnaCAqZXNfbmVpOwogIHN0cnVjdCBsc3BfZW50cnkgKmxzcF9lbnRyeTsKICBzdHJ1Y3QgaW5fYWRkciAqaXB2NF9hZGRyOwogIHN0cnVjdCBpcHY0X3JlYWNoYWJpbGl0eSAqaXB2NF9yZWFjaDsKICBzdHJ1Y3QgdGVfaXB2NF9yZWFjaGFiaWxpdHkgKnRlX2lwdjRfcmVhY2g7CiNpZmRlZiBIQVZFX0lQVjYKICBzdHJ1Y3QgaW42X2FkZHIgKmlwdjZfYWRkcjsKICBzdHJ1Y3QgaXB2Nl9yZWFjaGFiaWxpdHkgKmlwdjZfcmVhY2g7CiAgaW50IHByZWZpeF9vY3RldHM7CiNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KICB1X2NoYXIgdmlydHVhbDsKICBpbnQgdmFsdWVfbGVuLCByZXR2YWwgPSBJU0lTX09LOwogIHVfY2hhciAqcG50ID0gc3RyZWFtOwoKICAqZm91bmQgPSAwOwogIG1lbXNldCAodGx2cywgMCwgc2l6ZW9mIChzdHJ1Y3QgdGx2cykpOwoKICB3aGlsZSAocG50IDwgc3RyZWFtICsgc2l6ZSAtIDIpCiAgICB7CiAgICAgIHR5cGUgPSAqcG50OwogICAgICBsZW5ndGggPSAqKHBudCArIDEpOwogICAgICBwbnQgKz0gMjsKICAgICAgdmFsdWVfbGVuID0gMDsKICAgICAgaWYgKHBudCArIGxlbmd0aCA+IHN0cmVhbSArIHNpemUpCgl7CgkgIHpsb2dfd2FybiAoIklTSVMtVExWICglcyk6IFRMViAodHlwZSAlZCwgbGVuZ3RoICVkKSBleGNlZWRzIHBhY2tldCAiCgkJICAgICAiYm91bmRhcmllcyIsIGFyZWF0YWcsIHR5cGUsIGxlbmd0aCk7CgkgIHJldHZhbCA9IElTSVNfV0FSTklORzsKCSAgYnJlYWs7Cgl9CiAgICAgIHN3aXRjaCAodHlwZSkKCXsKCWNhc2UgQVJFQV9BRERSRVNTRVM6CgkgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICB8IAoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIEFyZWEgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX0FSRUFfQUREUlM7CiNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwoJICB6bG9nX2RlYnVnICgiVExWIEFyZWEgQWRyZXNzZXMgbGVuICVkIiwgbGVuZ3RoKTsKI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0FSRUFfQUREUlMpCgkgICAgewoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICBhcmVhX2FkZHIgPSAoc3RydWN0IGFyZWFfYWRkciAqKSBwbnQ7CgkJICB2YWx1ZV9sZW4gKz0gYXJlYV9hZGRyLT5hZGRyX2xlbiArIDE7CgkJICBwbnQgKz0gYXJlYV9hZGRyLT5hZGRyX2xlbiArIDE7CgkJICBpZiAoIXRsdnMtPmFyZWFfYWRkcnMpCgkJICAgIHRsdnMtPmFyZWFfYWRkcnMgPSBsaXN0X25ldyAoKTsKCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+YXJlYV9hZGRycywgYXJlYV9hZGRyKTsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgSVNfTkVJR0hCT1VSUzoKCSAgKmZvdW5kIHw9IFRMVkZMQUdfSVNfTkVJR0hTOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IElTIE5laWdoYm91cnMgbGVuZ3RoICVkIiwKCQkgICAgICBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKFRMVkZMQUdfSVNfTkVJR0hTICYgKmV4cGVjdGVkKQoJICAgIHsKCSAgICAgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgVmlydHVhbCBGbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAKCSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAgICAgKi8KCSAgICAgIHZpcnR1YWwgPSAqcG50OwkvKiBGSVhNRTogd2hhdCBpcyB0aGUgdXNlIGZvciB0aGlzPyAqLwoJICAgICAgcG50Kys7CgkgICAgICB2YWx1ZV9sZW4rKzsKCSAgICAgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAgICAgKiB8ICAgMCAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlZmF1bHQgTWV0cmljICAgICAgICAgICAgICAgICAgfCAKCSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAgICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlbGF5IE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfAoJICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICAgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRXhwZW5zZSBNZXRyaWMgICAgICAgICAgICAgICAgICB8CgkgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgICAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFcnJvciBNZXRyaWMgICAgICAgICAgICAgICAgICAgIHwKCSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgTmVpZ2hib3VyIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgfAoJICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICAgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CgkgICAgICAgKi8KCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCgkJewoJCSAgaXNfbmVpID0gKHN0cnVjdCBpc19uZWlnaCAqKSBwbnQ7CgkJICB2YWx1ZV9sZW4gKz0gNCArIElTSVNfU1lTX0lEX0xFTiArIDE7CgkJICBwbnQgKz0gNCArIElTSVNfU1lTX0lEX0xFTiArIDE7CgkJICBpZiAoIXRsdnMtPmlzX25laWdocykKCQkgICAgdGx2cy0+aXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7CgkJICBsaXN0bm9kZV9hZGQgKHRsdnMtPmlzX25laWdocywgaXNfbmVpKTsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgVEVfSVNfTkVJR0hCT1VSUzoKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIE5laWdoYm91ciBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNwoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgVEUgTWV0cmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzCgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBTdWJUTFZzIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICB8IDEKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX1RFX0lTX05FSUdIUzsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBFeHRlbmRlZCBJUyBOZWlnaGJvdXJzIGxlbmd0aCAlZCIsCgkJICAgICBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKFRMVkZMQUdfVEVfSVNfTkVJR0hTICYgKmV4cGVjdGVkKQoJICAgIHsKCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCgkJewoJCSAgdGVfaXNfbmVpID0gKHN0cnVjdCB0ZV9pc19uZWlnaCAqKSBwbnQ7CgkJICB2YWx1ZV9sZW4gKz0gMTE7CgkJICBwbnQgKz0gMTE7CgkJICAvKiBGSVhNRSAtIHN1YnRsdnMgYXJlIGhhbmRsZWQgaGVyZSwgZm9yIG5vdyB3ZSBza2lwICovCgkJICB2YWx1ZV9sZW4gKz0gdGVfaXNfbmVpLT5zdWJfdGx2c19sZW5ndGg7CgkJICBwbnQgKz0gdGVfaXNfbmVpLT5zdWJfdGx2c19sZW5ndGg7CgoJCSAgaWYgKCF0bHZzLT50ZV9pc19uZWlnaHMpCgkJICAgIHRsdnMtPnRlX2lzX25laWdocyA9IGxpc3RfbmV3ICgpOwoJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT50ZV9pc19uZWlnaHMsIHRlX2lzX25laSk7CgkJfQoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIHBudCArPSBsZW5ndGg7CgkgICAgfQoJICBicmVhazsKCgljYXNlIEVTX05FSUdIQk9VUlM6CgkgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAwICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVmYXVsdCBNZXRyaWMgICAgICAgICAgICAgICAgICB8IAoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlbGF5IE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfAoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEV4cGVuc2UgTWV0cmljICAgICAgICAgICAgICAgICAgfAoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEVycm9yIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfAoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgTmVpZ2hib3VyIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgfAoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgTmVpZ2hib3VyIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgfAoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgoJICAgKi8KI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBFUyBOZWlnaGJvdXJzIGxlbmd0aCAlZCIsCgkJICAgICBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfRVNfTkVJR0hTOwoJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19FU19ORUlHSFMpCgkgICAgewoJICAgICAgZXNfbmVpID0gKHN0cnVjdCBlc19uZWlnaCAqKSBwbnQ7CgkgICAgICB2YWx1ZV9sZW4gKz0gNDsKCSAgICAgIHBudCArPSA0OwoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICAvKiBGSVhNRSBGSVhNRSBGSVhNRSAtIGFkZCB0byB0aGUgbGlzdCAqLwoJCSAgLyogICAgICAgICAgc3lzX2lkLT5pZCA9IHBudDsgKi8KCQkgIHZhbHVlX2xlbiArPSBJU0lTX1NZU19JRF9MRU47CgkJICBwbnQgKz0gSVNJU19TWVNfSURfTEVOOwoJCSAgLyogIGlmICghZXNfbmVpLT5uZWlnaF9pZHMpIGVzX25laS0+bmVpZ2hfaWRzID0gc3lzaWQ7ICovCgkJfQoJICAgICAgaWYgKCF0bHZzLT5lc19uZWlnaHMpCgkJdGx2cy0+ZXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7CgkgICAgICBsaXN0bm9kZV9hZGQgKHRsdnMtPmVzX25laWdocywgZXNfbmVpKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICBwbnQgKz0gbGVuZ3RoOwoJICAgIH0KCSAgYnJlYWs7CgoJY2FzZSBMQU5fTkVJR0hCT1VSUzoKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIExBTiBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CgkgICAqLwoJICAqZm91bmQgfD0gVExWRkxBR19MQU5fTkVJR0hTOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IExBTiBOZWlnYm91cnMgbGVuZ3RoICVkIiwKCQkgICAgICBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKFRMVkZMQUdfTEFOX05FSUdIUyAmICpleHBlY3RlZCkKCSAgICB7CgkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQoJCXsKCQkgIGxhbl9uZWkgPSAoc3RydWN0IGxhbl9uZWlnaCAqKSBwbnQ7CgkJICBpZiAoIXRsdnMtPmxhbl9uZWlnaHMpCgkJICAgIHRsdnMtPmxhbl9uZWlnaHMgPSBsaXN0X25ldyAoKTsKCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+bGFuX25laWdocywgbGFuX25laSk7CgkJICB2YWx1ZV9sZW4gKz0gRVRIX0FMRU47CgkJICBwbnQgKz0gRVRIX0FMRU47CgkJfQoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIHBudCArPSBsZW5ndGg7CgkgICAgfQoJICBicmVhazsKCgljYXNlIFBBRERJTkc6CiNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwoJICB6bG9nX2RlYnVnICgiVExWIHBhZGRpbmcgJWQiLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgcG50ICs9IGxlbmd0aDsKCSAgYnJlYWs7CgoJY2FzZSBMU1BfRU5UUklFUzoKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgIFJlbWFpbmluZyBMaWZldGltZSAgICAgICAgICAgICAgICAgICAgICAgIHwgMgoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIExTUCBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpZCsyCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgTFNQIFNlcXVlbmNlIE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICB8oDQKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrc3VtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMgoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKi8KI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBMU1AgRW50cmllcyBsZW5ndGggJWQiLCBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfTFNQX0VOVFJJRVM7CgkgIGlmIChUTFZGTEFHX0xTUF9FTlRSSUVTICYgKmV4cGVjdGVkKQoJICAgIHsKCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCgkJewoJCSAgbHNwX2VudHJ5ID0gKHN0cnVjdCBsc3BfZW50cnkgKikgcG50OwoJCSAgdmFsdWVfbGVuICs9IDEwICsgSVNJU19TWVNfSURfTEVOOwoJCSAgcG50ICs9IDEwICsgSVNJU19TWVNfSURfTEVOOwoJCSAgaWYgKCF0bHZzLT5sc3BfZW50cmllcykKCQkgICAgdGx2cy0+bHNwX2VudHJpZXMgPSBsaXN0X25ldyAoKTsKCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+bHNwX2VudHJpZXMsIGxzcF9lbnRyeSk7CgkJfQoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIHBudCArPSBsZW5ndGg7CgkgICAgfQoJICBicmVhazsKCgljYXNlIENIRUNLU1VNOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgIDE2IGJpdCBmbGV0Y2hlciBDSEVDS1NVTSAgICAgICAgICAgICAgICAgICAgfAoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfQ0hFQ0tTVU07CiNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwoJICB6bG9nX2RlYnVnICgiSVNJUy1UTFYgKCVzKTogQ2hlY2tzdW0gbGVuZ3RoICVkIiwgYXJlYXRhZywgbGVuZ3RoKTsKI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0NIRUNLU1VNKQoJICAgIHsKCSAgICAgIHRsdnMtPmNoZWNrc3VtID0gKHN0cnVjdCBjaGVja3N1bSAqKSBwbnQ7CgkgICAgfQoJICBwbnQgKz0gbGVuZ3RoOwoJICBicmVhazsKCgljYXNlIFBST1RPQ09MU19TVVBQT1JURUQ6CgkgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgIE5MUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CgkgICAqLwoJICAqZm91bmQgfD0gVExWRkxBR19OTFBJRDsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBQcm90b2NvbHMgU3VwcG9ydGVkIGxlbmd0aCAlZCIsCgkJICAgICAgYXJlYXRhZywgbGVuZ3RoKTsKI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX05MUElEKQoJICAgIHsKCSAgICAgIHRsdnMtPm5scGlkcyA9IChzdHJ1Y3QgbmxwaWRzICopIChwbnQgLSAxKTsKCSAgICB9CgkgIHBudCArPSBsZW5ndGg7CgkgIGJyZWFrOwoKCWNhc2UgSVBWNF9BRERSOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiArICAgICAgICAgICAgICAgICBJUCB2ZXJzaW9uIDQgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgKyA0CgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CgkgICAqLwoJICAqZm91bmQgfD0gVExWRkxBR19JUFY0X0FERFI7CiNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwoJICB6bG9nX2RlYnVnICgiSVNJUy1UTFYgKCVzKTogSVB2NCBBZGRyZXNzIGxlbmd0aCAlZCIsCgkJICAgICAgYXJlYXRhZywgbGVuZ3RoKTsKI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0lQVjRfQUREUikKCSAgICB7CgkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQoJCXsKCQkgIGlwdjRfYWRkciA9IChzdHJ1Y3QgaW5fYWRkciAqKSBwbnQ7CiNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwoJCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcykgOiBJUCBBRERSICVzLCBwbnQgJXAiLCBhcmVhdGFnLAoJCQkgICAgICBpbmV0X250b2EgKCppcHY0X2FkZHIpLCBwbnQpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCQkgIGlmICghdGx2cy0+aXB2NF9hZGRycykKCQkgICAgdGx2cy0+aXB2NF9hZGRycyA9IGxpc3RfbmV3ICgpOwoJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5pcHY0X2FkZHJzLCBpcHY0X2FkZHIpOwoJCSAgdmFsdWVfbGVuICs9IDQ7CgkJICBwbnQgKz0gNDsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgQVVUSF9JTkZPOgoJICAqZm91bmQgfD0gVExWRkxBR19BVVRIX0lORk87CiNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwoJICB6bG9nX2RlYnVnICgiSVNJUy1UTFYgKCVzKTogSVMtSVMgQXV0aGVudGljYXRpb24gSW5mb3JtYXRpb24iLAoJCSAgICAgIGFyZWF0YWcpOwojZW5kaWYKCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfQVVUSF9JTkZPKQoJICAgIHsKCSAgICAgIHRsdnMtPmF1dGhfaW5mby50eXBlID0gKnBudDsKCSAgICAgIHRsdnMtPmF1dGhfaW5mby5sZW4gPSBsZW5ndGgtMTsKCSAgICAgIHBudCsrOwoJICAgICAgbWVtY3B5ICh0bHZzLT5hdXRoX2luZm8ucGFzc3dkLCBwbnQsIGxlbmd0aCAtIDEpOwoJICAgICAgcG50ICs9IGxlbmd0aCAtIDE7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgRFlOQU1JQ19IT1NUTkFNRToKCSAgKmZvdW5kIHw9IFRMVkZMQUdfRFlOX0hPU1ROQU1FOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IER5bmFtaWMgSG9zdG5hbWUgbGVuZ3RoICVkIiwKCQkgICAgICBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfRFlOX0hPU1ROQU1FKQoJICAgIHsKCSAgICAgIC8qIHRoZSBsZW5ndGggaXMgYWxzbyBpbmNsdWRlZCBpbiB0aGUgcG9pbnRlZCBzdHJ1Y3QgKi8KCSAgICAgIHRsdnMtPmhvc3RuYW1lID0gKHN0cnVjdCBob3N0bmFtZSAqKSAocG50IC0gMSk7CgkgICAgfQoJICBwbnQgKz0gbGVuZ3RoOwoJICBicmVhazsKCgljYXNlIFRFX1JPVVRFUl9JRDoKCSAgLyogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogKyAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZXIgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgNAoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfVEVfUk9VVEVSX0lEOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IFRFIFJvdXRlciBJRCAlZCIsIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19URV9ST1VURVJfSUQpCgkgICAgdGx2cy0+cm91dGVyX2lkID0gKHN0cnVjdCB0ZV9yb3V0ZXJfaWQgKikgKHBudCk7CgkgIHBudCArPSBsZW5ndGg7CgkgIGJyZWFrOwoKCWNhc2UgSVBWNF9JTlRfUkVBQ0hBQklMSVRZOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgMCAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlZmF1bHQgTWV0cmljICAgICAgICAgICAgICAgICAgfCAxCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVsYXkgTWV0cmljICAgICAgICAgICAgICAgICAgICB8IDEKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFeHBlbnNlIE1ldHJpYyAgICAgICAgICAgICAgICAgIHwgMQoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEVycm9yIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfCAxCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBpcCBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgbWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNAoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfSVBWNF9JTlRfUkVBQ0hBQklMSVRZOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IElQdjQgaW50ZXJuYWwgUmVhY2hhYmlsaXR5IGxlbmd0aCAlZCIsCgkJICAgICAgYXJlYXRhZywgbGVuZ3RoKTsKI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0lQVjRfSU5UX1JFQUNIQUJJTElUWSkKCSAgICB7CgkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQoJCXsKCQkgIGlwdjRfcmVhY2ggPSAoc3RydWN0IGlwdjRfcmVhY2hhYmlsaXR5ICopIHBudDsKCQkgIGlmICghdGx2cy0+aXB2NF9pbnRfcmVhY2hzKQoJCSAgICB0bHZzLT5pcHY0X2ludF9yZWFjaHMgPSBsaXN0X25ldyAoKTsKCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXB2NF9pbnRfcmVhY2hzLCBpcHY0X3JlYWNoKTsKCQkgIHZhbHVlX2xlbiArPSAxMjsKCQkgIHBudCArPSAxMjsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgSVBWNF9FWFRfUkVBQ0hBQklMSVRZOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgMCAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlZmF1bHQgTWV0cmljICAgICAgICAgICAgICAgICAgfCAxCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVsYXkgTWV0cmljICAgICAgICAgICAgICAgICAgICB8IDEKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFeHBlbnNlIE1ldHJpYyAgICAgICAgICAgICAgICAgIHwgMQoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEVycm9yIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfCAxCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBpcCBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgbWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNAoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfSVBWNF9FWFRfUkVBQ0hBQklMSVRZOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IElQdjQgZXh0ZXJuYWwgUmVhY2hhYmlsaXR5IGxlbmd0aCAlZCIsCgkJICAgICAgYXJlYXRhZywgbGVuZ3RoKTsKI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0lQVjRfRVhUX1JFQUNIQUJJTElUWSkKCSAgICB7CgkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQoJCXsKCQkgIGlwdjRfcmVhY2ggPSAoc3RydWN0IGlwdjRfcmVhY2hhYmlsaXR5ICopIHBudDsKCQkgIGlmICghdGx2cy0+aXB2NF9leHRfcmVhY2hzKQoJCSAgICB0bHZzLT5pcHY0X2V4dF9yZWFjaHMgPSBsaXN0X25ldyAoKTsKCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXB2NF9leHRfcmVhY2hzLCBpcHY0X3JlYWNoKTsKCQkgIHZhbHVlX2xlbiArPSAxMjsKCQkgIHBudCArPSAxMjsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgVEVfSVBWNF9SRUFDSEFCSUxJVFk6CgkgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBURSBNZXRyaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgVS9EICB8IHNUTFY/IHwgICAgICAgICAgICAgICBQcmVmaXggTWFzayBMZW4gICAgICAgICAgICAgICAgIHwgMQoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwLTQKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgdGx2cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX1RFX0lQVjRfUkVBQ0hBQklMSVRZOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IElQdjQgZXh0ZW5kZWQgUmVhY2hhYmlsaXR5IGxlbmd0aCAlZCIsCgkJICAgICAgYXJlYXRhZywgbGVuZ3RoKTsKI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX1RFX0lQVjRfUkVBQ0hBQklMSVRZKQoJICAgIHsKCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCgkJewoJCSAgdGVfaXB2NF9yZWFjaCA9IChzdHJ1Y3QgdGVfaXB2NF9yZWFjaGFiaWxpdHkgKikgcG50OwoJCSAgaWYgKCF0bHZzLT50ZV9pcHY0X3JlYWNocykKCQkgICAgdGx2cy0+dGVfaXB2NF9yZWFjaHMgPSBsaXN0X25ldyAoKTsKCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+dGVfaXB2NF9yZWFjaHMsIHRlX2lwdjRfcmVhY2gpOwoJCSAgLyogdGhpcyB0cmlja2VyeSBpcyBwZXJtaXRhYmxlIHNpbmNlIG5vIHN1YnRsdnMgYXJlIGRlZmluZWQgKi8KCQkgIHZhbHVlX2xlbiArPSA1ICsgKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgPwoJCQkJICAgICgoKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgLQoJCQkJICAgICAgIDEpID4+IDMpICsgMSkgOiAwKTsKCQkgIHBudCArPSA1ICsgKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgPwoJCSAgICAgICAgICAgICAgKCgoKHRlX2lwdjRfcmVhY2gtPmNvbnRyb2wgJiAweDNGKSAtIDEpID4+IDMpICsgMSkgOiAwKTsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKI2lmZGVmICBIQVZFX0lQVjYKCWNhc2UgSVBWNl9BRERSOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiArICAgICAgICAgICAgICAgICBJUCB2ZXJzaW9uIDYgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxNgoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfSVBWNl9BRERSOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IElQdjYgQWRkcmVzcyBsZW5ndGggJWQiLAoJCSAgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19JUFY2X0FERFIpCgkgICAgewoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICBpcHY2X2FkZHIgPSAoc3RydWN0IGluNl9hZGRyICopIHBudDsKCQkgIGlmICghdGx2cy0+aXB2Nl9hZGRycykKCQkgICAgdGx2cy0+aXB2Nl9hZGRycyA9IGxpc3RfbmV3ICgpOwoJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5pcHY2X2FkZHJzLCBpcHY2X2FkZHIpOwoJCSAgdmFsdWVfbGVuICs9IDE2OwoJCSAgcG50ICs9IDE2OwoJCX0KCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICBwbnQgKz0gbGVuZ3RoOwoJICAgIH0KCSAgYnJlYWs7CgoJY2FzZSBJUFY2X1JFQUNIQUJJTElUWToKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgRGVmYXVsdCBNZXRyaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNCAKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgSW5mb3JtYW50aW9uICAgICAgICAgICAgICAgICAgIHwKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIElQdjYgUHJlZml4IExlbmd0aCAgICAgICAgICAgICAgICAgICAgIHwtLSsKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIElQdjYgUHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHw8LSsKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX0lQVjZfUkVBQ0hBQklMSVRZOwoJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19JUFY2X1JFQUNIQUJJTElUWSkKCSAgICB7CgkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQoJCXsKCQkgIGlwdjZfcmVhY2ggPSAoc3RydWN0IGlwdjZfcmVhY2hhYmlsaXR5ICopIHBudDsKCQkgIHByZWZpeF9vY3RldHMgPSAoKGlwdjZfcmVhY2gtPnByZWZpeF9sZW4gKyA3KSAvIDgpOwoJCSAgdmFsdWVfbGVuICs9IHByZWZpeF9vY3RldHMgKyA2OwoJCSAgcG50ICs9IHByZWZpeF9vY3RldHMgKyA2OwoJCSAgLyogRklYTUU6IHN1Yi10bHZzICovCgkJICBpZiAoIXRsdnMtPmlwdjZfcmVhY2hzKQoJCSAgICB0bHZzLT5pcHY2X3JlYWNocyA9IGxpc3RfbmV3ICgpOwoJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5pcHY2X3JlYWNocywgaXB2Nl9yZWFjaCk7CgkJfQoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIHBudCArPSBsZW5ndGg7CgkgICAgfQoJICBicmVhazsKI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwoKCWNhc2UgV0FZM19IRUxMTzoKCSAgLyogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgIEFkamFjZW5jeSBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMQoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgRXh0ZW5kZWQgTG9jYWwgQ2lyY3VpdCBJRCAgICAgICAgICAgICAgICAgICAgfCA0CgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICBOZWlnaGJvciBTeXN0ZW0gSUQgKElmIGtub3duKSAgICAgICAgICAgICAgICB8IDAtOAoJICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2JhYmx5IDYpCgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICBOZWlnaGJvciBMb2NhbCBDaXJjdWl0IElEIChJZiBrbm93bikgICAgICAgICB8IDQKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHXzNXQVlfSEVMTE87CgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHXzNXQVlfSEVMTE8pCgkgICAgewoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICAvKiBGSVhNRTogbWFrZSB0aGlzIHdvcmsgKi8KLyogICAgICAgICAgIEFkamFjZW5jeSBTdGF0ZSAob25lIG9jdGV0KToKICAgICAgICAgICAgICAwID0gVXAKICAgICAgICAgICAgICAxID0gSW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgMiA9IERvd24KICAgICAgICAgICAgRXh0ZW5kZWQgTG9jYWwgQ2lyY3VpdCBJRCAoZm91ciBvY3RldHMpCiAgICAgICAgICAgIE5laWdoYm9yIFN5c3RlbSBJRCBpZiBrbm93biAoemVybyB0byBlaWdodCBvY3RldHMpCiAgICAgICAgICAgIE5laWdoYm9yIEV4dGVuZGVkIExvY2FsIENpcmN1aXQgSUQgKGZvdXIgb2N0ZXRzLCBpZiBOZWlnaGJvcgogICAgICAgICAgICAgIFN5c3RlbSBJRCBpcyBwcmVzZW50KSAqLwoJCSAgcG50ICs9IGxlbmd0aDsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgoJICBicmVhazsKCWNhc2UgR1JBQ0VGVUxfUkVTVEFSVDoKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgIHwgIFNBICAgfCAgUkEgICB8ICBSUiAgIHwgMQoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1haW5pbmcgVGltZSAgICAgICAgICAgICAgICAgICAgICAgfCAyCgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgUmVzdGFydGluZyBOZWlnaGJvciBJRCAoSWYga25vd24pICAgICAgICAgICAgICB8IDAtOAoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfR1JBQ0VGVUxfUkVTVEFSVDsKCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfR1JBQ0VGVUxfUkVTVEFSVCkKCSAgICB7CgkgICAgICAvKiBGSVhNRTogbWFrZSB0aGlzIHdvcmsgKi8KCSAgICB9CgkgIHBudCArPSBsZW5ndGg7CgkgIGJyZWFrOwoKCWRlZmF1bHQ6CgkgIHpsb2dfd2FybiAoIklTSVMtVExWICglcyk6IHVuc3VwcG9ydGVkIFRMViB0eXBlICVkLCBsZW5ndGggJWQiLAoJCSAgICAgYXJlYXRhZywgdHlwZSwgbGVuZ3RoKTsKCgkgIHJldHZhbCA9IElTSVNfV0FSTklORzsKCSAgcG50ICs9IGxlbmd0aDsKCSAgYnJlYWs7Cgl9CiAgICB9CgogIHJldHVybiByZXR2YWw7Cn0KCmludAphZGRfdGx2ICh1X2NoYXIgdGFnLCB1X2NoYXIgbGVuLCB1X2NoYXIgKiB2YWx1ZSwgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQp7CgogIGlmIChTVFJFQU1fU0laRSAoc3RyZWFtKSAtIHN0cmVhbV9nZXRfZW5kcCAoc3RyZWFtKSA8ICh1bnNpZ25lZCkgbGVuICsgMikKICAgIHsKICAgICAgemxvZ193YXJuICgiTm8gcm9vbSBmb3IgVExWIG9mIHR5cGUgJWQiLCB0YWcpOwogICAgICByZXR1cm4gSVNJU19XQVJOSU5HOwogICAgfQoKICBzdHJlYW1fcHV0YyAoc3RyZWFtLCB0YWcpOwkvKiBUQUcgKi8KICBzdHJlYW1fcHV0YyAoc3RyZWFtLCBsZW4pOwkvKiBMRU5HVEggKi8KICBzdHJlYW1fcHV0IChzdHJlYW0sIHZhbHVlLCAoaW50KSBsZW4pOwkvKiBWQUxVRSAqLwoKI2lmZGVmIEVYVFJFTUVfREVCVUcKICB6bG9nX2RlYnVnICgiQWRkZWQgVExWICVkIGxlbiAlZCIsIHRhZywgbGVuKTsKI2VuZGlmIC8qIEVYVFJFTUUgREVCVUcgKi8KICByZXR1cm4gSVNJU19PSzsKfQoKaW50CnRsdl9hZGRfYXJlYV9hZGRycyAoc3RydWN0IGxpc3QgKmFyZWFfYWRkcnMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICBzdHJ1Y3QgYXJlYV9hZGRyICphcmVhX2FkZHI7CgogIHVfY2hhciB2YWx1ZVsyNTVdOwogIHVfY2hhciAqcG9zID0gdmFsdWU7CgogIGZvciAoQUxMX0xJU1RfRUxFTUVOVFNfUk8gKGFyZWFfYWRkcnMsIG5vZGUsIGFyZWFfYWRkcikpCiAgICB7CiAgICAgIGlmIChwb3MgLSB2YWx1ZSArIGFyZWFfYWRkci0+YWRkcl9sZW4gPiAyNTUpCglnb3RvIGVycjsKICAgICAgKnBvcyA9IGFyZWFfYWRkci0+YWRkcl9sZW47CiAgICAgIHBvcysrOwogICAgICBtZW1jcHkgKHBvcywgYXJlYV9hZGRyLT5hcmVhX2FkZHIsIChpbnQpIGFyZWFfYWRkci0+YWRkcl9sZW4pOwogICAgICBwb3MgKz0gYXJlYV9hZGRyLT5hZGRyX2xlbjsKICAgIH0KCiAgcmV0dXJuIGFkZF90bHYgKEFSRUFfQUREUkVTU0VTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CgplcnI6CiAgemxvZ193YXJuICgidGx2X2FkZF9hcmVhX2FkZHJzKCk6IFRMViBsb25nZXIgdGhhbiAyNTUiKTsKICByZXR1cm4gSVNJU19XQVJOSU5HOwp9CgppbnQKdGx2X2FkZF9pc19uZWlnaHMgKHN0cnVjdCBsaXN0ICppc19uZWlnaHMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZSwgKm5ub2RlOwogIHN0cnVjdCBpc19uZWlnaCAqaXNfbmVpZ2g7CiAgdV9jaGFyIHZhbHVlWzI1NV07CiAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKICBpbnQgcmV0dmFsOwoKICAqcG9zID0gMDsJCQkvKmlzX25laWdoLT52aXJ0dWFsOyAqLwogIHBvcysrOwoKICBmb3IgKEFMTF9MSVNUX0VMRU1FTlRTIChpc19uZWlnaHMsIG5vZGUsIG5ub2RlLCBpc19uZWlnaCkpCiAgICB7CiAgICAgIGlmIChwb3MgLSB2YWx1ZSArIElTX05FSUdIQk9VUlNfTEVOID4gMjU1KQoJewoJICByZXR2YWwgPSBhZGRfdGx2IChJU19ORUlHSEJPVVJTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CgkgIGlmIChyZXR2YWwgIT0gSVNJU19PSykKCSAgICByZXR1cm4gcmV0dmFsOwoJICBwb3MgPSB2YWx1ZTsKCX0KICAgICAgKnBvcyA9IGlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19kZWZhdWx0OwogICAgICBwb3MrKzsKICAgICAgKnBvcyA9IGlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19kZWxheTsKICAgICAgcG9zKys7CiAgICAgICpwb3MgPSBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZXhwZW5zZTsKICAgICAgcG9zKys7CiAgICAgICpwb3MgPSBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZXJyb3I7CiAgICAgIHBvcysrOwogICAgICBtZW1jcHkgKHBvcywgaXNfbmVpZ2gtPm5laWdoX2lkLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKICAgICAgcG9zICs9IElTSVNfU1lTX0lEX0xFTiArIDE7CiAgICB9CgogIHJldHVybiBhZGRfdGx2IChJU19ORUlHSEJPVVJTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cn0KCmludAp0bHZfYWRkX2xhbl9uZWlnaHMgKHN0cnVjdCBsaXN0ICpsYW5fbmVpZ2hzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGUsICpubm9kZTsKICB1X2NoYXIgKnNucGE7CiAgdV9jaGFyIHZhbHVlWzI1NV07CiAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKICBpbnQgcmV0dmFsOwoKICBmb3IgKEFMTF9MSVNUX0VMRU1FTlRTIChsYW5fbmVpZ2hzLCBub2RlLCBubm9kZSwgc25wYSkpCiAgICB7CiAgICAgIGlmIChwb3MgLSB2YWx1ZSArIEVUSF9BTEVOID4gMjU1KQoJewoJICByZXR2YWwgPSBhZGRfdGx2IChMQU5fTkVJR0hCT1VSUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwoJICBpZiAocmV0dmFsICE9IElTSVNfT0spCgkgICAgcmV0dXJuIHJldHZhbDsKCSAgcG9zID0gdmFsdWU7Cgl9CiAgICAgIG1lbWNweSAocG9zLCBzbnBhLCBFVEhfQUxFTik7CiAgICAgIHBvcyArPSBFVEhfQUxFTjsKICAgIH0KCiAgcmV0dXJuIGFkZF90bHYgKExBTl9ORUlHSEJPVVJTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cn0KCi8qCiAgdV9jaGFyIHZhbHVlWzI1NV07CiAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKCiAgaWYgKGNpcmN1aXQtPmlwX3JvdXRlcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAqcG9zID0gICh1X2NoYXIpTkxQSURfSVA7CiAgICBwb3MgKys7CiAgfQogIGlmIChjaXJjdWl0LT5pcHY2X3JvdXRlcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICpwb3MgPSAodV9jaGFyKU5MUElEX0lQVjY7CiAgICBwb3MgKys7CiAgfQoqLwoKaW50CnRsdl9hZGRfbmxwaWQgKHN0cnVjdCBubHBpZHMgKm5scGlkcywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQp7CgogIHJldHVybiBhZGRfdGx2IChQUk9UT0NPTFNfU1VQUE9SVEVELCBubHBpZHMtPmNvdW50LCBubHBpZHMtPm5scGlkcywgc3RyZWFtKTsKfQoKaW50CnRsdl9hZGRfYXV0aGluZm8gKGNoYXIgYXV0aF90eXBlLCBjaGFyIGF1dGhfbGVuLCB1X2NoYXIgKmF1dGhfdmFsdWUsCgkJICBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogICpwb3MrKyA9IElTSVNfUEFTU1dEX1RZUEVfQ0xFQVJUWFQ7CiAgbWVtY3B5IChwb3MsIGF1dGhfdmFsdWUsIGF1dGhfbGVuKTsKCiAgcmV0dXJuIGFkZF90bHYgKEFVVEhfSU5GTywgYXV0aF9sZW4gKyAxLCB2YWx1ZSwgc3RyZWFtKTsKfQoKaW50CnRsdl9hZGRfY2hlY2tzdW0gKHN0cnVjdCBjaGVja3N1bSAqY2hlY2tzdW0sIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHVfY2hhciB2YWx1ZVsyNTVdOwogIHVfY2hhciAqcG9zID0gdmFsdWU7CiAgcmV0dXJuIGFkZF90bHYgKENIRUNLU1VNLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cn0KCmludAp0bHZfYWRkX2lwX2FkZHJzIChzdHJ1Y3QgbGlzdCAqaXBfYWRkcnMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZSwgKm5ub2RlOwogIHN0cnVjdCBwcmVmaXhfaXB2NCAqaXB2NDsKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogIGludCByZXR2YWw7CgogIGZvciAoQUxMX0xJU1RfRUxFTUVOVFMgKGlwX2FkZHJzLCBub2RlLCBubm9kZSwgaXB2NCkpCiAgICB7CiAgICAgIGlmIChwb3MgLSB2YWx1ZSArIElQVjRfTUFYX0JZVEVMRU4gPiAyNTUpCgl7CgkgIHJldHZhbCA9IGFkZF90bHYgKElQVjRfQUREUiwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwoJICBpZiAocmV0dmFsICE9IElTSVNfT0spCgkgICAgcmV0dXJuIHJldHZhbDsKCSAgcG9zID0gdmFsdWU7Cgl9CiAgICAgICoodV9pbnQzMl90ICopIHBvcyA9IGlwdjQtPnByZWZpeC5zX2FkZHI7CiAgICAgIHBvcyArPSBJUFY0X01BWF9CWVRFTEVOOwogICAgfQoKICByZXR1cm4gYWRkX3RsdiAoSVBWNF9BRERSLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cn0KCmludAp0bHZfYWRkX2R5bmFtaWNfaG9zdG5hbWUgKHN0cnVjdCBob3N0bmFtZSAqaG9zdG5hbWUsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHJldHVybiBhZGRfdGx2IChEWU5BTUlDX0hPU1ROQU1FLCBob3N0bmFtZS0+bmFtZWxlbiwgaG9zdG5hbWUtPm5hbWUsCgkJICBzdHJlYW0pOwp9CgppbnQKdGx2X2FkZF9sc3BfZW50cmllcyAoc3RydWN0IGxpc3QgKmxzcHMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZSwgKm5ub2RlOwogIHN0cnVjdCBpc2lzX2xzcCAqbHNwOwogIHVfY2hhciB2YWx1ZVsyNTVdOwogIHVfY2hhciAqcG9zID0gdmFsdWU7CiAgaW50IHJldHZhbDsKCiAgZm9yIChBTExfTElTVF9FTEVNRU5UUyAobHNwcywgbm9kZSwgbm5vZGUsIGxzcCkpCiAgICB7CiAgICAgIGlmIChwb3MgLSB2YWx1ZSArIExTUF9FTlRSSUVTX0xFTiA+IDI1NSkKCXsKCSAgcmV0dmFsID0gYWRkX3RsdiAoTFNQX0VOVFJJRVMsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKCSAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQoJICAgIHJldHVybiByZXR2YWw7CgkgIHBvcyA9IHZhbHVlOwoJfQogICAgICAqKCh1X2ludDE2X3QgKikgcG9zKSA9IGxzcC0+bHNwX2hlYWRlci0+cmVtX2xpZmV0aW1lOwogICAgICBwb3MgKz0gMjsKICAgICAgbWVtY3B5IChwb3MsIGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkLCBJU0lTX1NZU19JRF9MRU4gKyAyKTsKICAgICAgcG9zICs9IElTSVNfU1lTX0lEX0xFTiArIDI7CiAgICAgICooKHVfaW50MzJfdCAqKSBwb3MpID0gbHNwLT5sc3BfaGVhZGVyLT5zZXFfbnVtOwogICAgICBwb3MgKz0gNDsKICAgICAgKigodV9pbnQxNl90ICopIHBvcykgPSBsc3AtPmxzcF9oZWFkZXItPmNoZWNrc3VtOwogICAgICBwb3MgKz0gMjsKICAgIH0KCiAgcmV0dXJuIGFkZF90bHYgKExTUF9FTlRSSUVTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cn0KCmludAp0bHZfYWRkX2lwdjRfcmVhY2hzIChzdHJ1Y3QgbGlzdCAqaXB2NF9yZWFjaHMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZSwgKm5ub2RlOwogIHN0cnVjdCBpcHY0X3JlYWNoYWJpbGl0eSAqcmVhY2g7CiAgdV9jaGFyIHZhbHVlWzI1NV07CiAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKICBpbnQgcmV0dmFsOwoKICBmb3IgKEFMTF9MSVNUX0VMRU1FTlRTIChpcHY0X3JlYWNocywgbm9kZSwgbm5vZGUsIHJlYWNoKSkKICAgIHsKICAgICAgaWYgKHBvcyAtIHZhbHVlICsgSVBWNF9SRUFDSF9MRU4gPiAyNTUpCgl7CgkgIHJldHZhbCA9CgkgICAgYWRkX3RsdiAoSVBWNF9JTlRfUkVBQ0hBQklMSVRZLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CgkgIGlmIChyZXR2YWwgIT0gSVNJU19PSykKCSAgICByZXR1cm4gcmV0dmFsOwoJICBwb3MgPSB2YWx1ZTsKCX0KICAgICAgKnBvcyA9IHJlYWNoLT5tZXRyaWNzLm1ldHJpY19kZWZhdWx0OwogICAgICBwb3MrKzsKICAgICAgKnBvcyA9IHJlYWNoLT5tZXRyaWNzLm1ldHJpY19kZWxheTsKICAgICAgcG9zKys7CiAgICAgICpwb3MgPSByZWFjaC0+bWV0cmljcy5tZXRyaWNfZXhwZW5zZTsKICAgICAgcG9zKys7CiAgICAgICpwb3MgPSByZWFjaC0+bWV0cmljcy5tZXRyaWNfZXJyb3I7CiAgICAgIHBvcysrOwogICAgICAqKHVfaW50MzJfdCAqKSBwb3MgPSByZWFjaC0+cHJlZml4LnNfYWRkcjsKICAgICAgcG9zICs9IElQVjRfTUFYX0JZVEVMRU47CiAgICAgICoodV9pbnQzMl90ICopIHBvcyA9IHJlYWNoLT5tYXNrLnNfYWRkcjsKICAgICAgcG9zICs9IElQVjRfTUFYX0JZVEVMRU47CiAgICB9CgoKICByZXR1cm4gYWRkX3RsdiAoSVBWNF9JTlRfUkVBQ0hBQklMSVRZLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cn0KCiNpZmRlZiBIQVZFX0lQVjYKaW50CnRsdl9hZGRfaXB2Nl9hZGRycyAoc3RydWN0IGxpc3QgKmlwdjZfYWRkcnMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZSwgKm5ub2RlOwogIHN0cnVjdCBwcmVmaXhfaXB2NiAqaXB2NjsKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogIGludCByZXR2YWw7CgogIGZvciAoQUxMX0xJU1RfRUxFTUVOVFMgKGlwdjZfYWRkcnMsIG5vZGUsIG5ub2RlLCBpcHY2KSkKICAgIHsKICAgICAgaWYgKHBvcyAtIHZhbHVlICsgSVBWNl9NQVhfQllURUxFTiA+IDI1NSkKCXsKCSAgcmV0dmFsID0gYWRkX3RsdiAoSVBWNl9BRERSLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CgkgIGlmIChyZXR2YWwgIT0gSVNJU19PSykKCSAgICByZXR1cm4gcmV0dmFsOwoJICBwb3MgPSB2YWx1ZTsKCX0KICAgICAgbWVtY3B5IChwb3MsIGlwdjYtPnByZWZpeC5zNl9hZGRyLCBJUFY2X01BWF9CWVRFTEVOKTsKICAgICAgcG9zICs9IElQVjZfTUFYX0JZVEVMRU47CiAgICB9CgogIHJldHVybiBhZGRfdGx2IChJUFY2X0FERFIsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKfQoKaW50CnRsdl9hZGRfaXB2Nl9yZWFjaHMgKHN0cnVjdCBsaXN0ICppcHY2X3JlYWNocywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQp7CiAgc3RydWN0IGxpc3Rub2RlICpub2RlLCAqbm5vZGU7CiAgc3RydWN0IGlwdjZfcmVhY2hhYmlsaXR5ICppcDZyZWFjaDsKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogIGludCByZXR2YWwsIHByZWZpeF9vY3RldHM7CgogIGZvciAoQUxMX0xJU1RfRUxFTUVOVFMgKGlwdjZfcmVhY2hzLCBub2RlLCBubm9kZSwgaXA2cmVhY2gpKQogICAgewogICAgICBpZiAocG9zIC0gdmFsdWUgKyBJUFY2X01BWF9CWVRFTEVOICsgNiA+IDI1NSkKCXsKCSAgcmV0dmFsID0gYWRkX3RsdiAoSVBWNl9SRUFDSEFCSUxJVFksIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKCSAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQoJICAgIHJldHVybiByZXR2YWw7CgkgIHBvcyA9IHZhbHVlOwoJfQogICAgICAqKHVpbnQzMl90ICopIHBvcyA9IGlwNnJlYWNoLT5tZXRyaWM7CiAgICAgIHBvcyArPSA0OwogICAgICAqcG9zID0gaXA2cmVhY2gtPmNvbnRyb2xfaW5mbzsKICAgICAgcG9zKys7CiAgICAgIHByZWZpeF9vY3RldHMgPSAoKGlwNnJlYWNoLT5wcmVmaXhfbGVuICsgNykgLyA4KTsKICAgICAgKnBvcyA9IGlwNnJlYWNoLT5wcmVmaXhfbGVuOwogICAgICBwb3MrKzsKICAgICAgbWVtY3B5IChwb3MsIGlwNnJlYWNoLT5wcmVmaXgsIHByZWZpeF9vY3RldHMpOwogICAgICBwb3MgKz0gcHJlZml4X29jdGV0czsKICAgIH0KCiAgcmV0dXJuIGFkZF90bHYgKElQVjZfUkVBQ0hBQklMSVRZLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cn0KI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwoKaW50CnRsdl9hZGRfcGFkZGluZyAoc3RydWN0IHN0cmVhbSAqc3RyZWFtKQp7CiAgaW50IGZ1bGxwYWRzLCBpLCBsZWZ0OwoKICAvKgogICAqIEhvdyBtYW55IHRpbWVzIGNhbiB3ZSBhZGQgZnVsbCBwYWRkaW5nID8KICAgKi8KICBmdWxscGFkcyA9IChTVFJFQU1fU0laRSAoc3RyZWFtKSAtIHN0cmVhbV9nZXRfZW5kcCAoc3RyZWFtKSkgLyAyNTc7CiAgZm9yIChpID0gMDsgaSA8IGZ1bGxwYWRzOyBpKyspCiAgICB7CiAgICAgIGlmICghc3RyZWFtX3B1dGMgKHN0cmVhbSwgKHVfY2hhcikgUEFERElORykpCS8qIFRBRyAqLwoJZ290byBlcnI7CiAgICAgIGlmICghc3RyZWFtX3B1dGMgKHN0cmVhbSwgKHVfY2hhcikgMjU1KSkJLyogTEVOR0hUICovCglnb3RvIGVycjsKICAgICAgc3RyZWFtX3B1dCAoc3RyZWFtLCBOVUxMLCAyNTUpOwkJLyogemVybyBwYWRkaW5nICovCiAgICB9CgogIGxlZnQgPSBTVFJFQU1fU0laRSAoc3RyZWFtKSAtIHN0cmVhbV9nZXRfZW5kcCAoc3RyZWFtKTsKCiAgaWYgKGxlZnQgPCAyKQogICAgcmV0dXJuIElTSVNfT0s7CgogIGlmIChsZWZ0ID09IDIpCiAgICB7CiAgICAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIFBBRERJTkcpOwogICAgICBzdHJlYW1fcHV0YyAoc3RyZWFtLCAwKTsKICAgICAgcmV0dXJuIElTSVNfT0s7CiAgICB9CgogIHN0cmVhbV9wdXRjIChzdHJlYW0sIFBBRERJTkcpOwogIHN0cmVhbV9wdXRjIChzdHJlYW0sIGxlZnQgLSAyKTsKICBzdHJlYW1fcHV0IChzdHJlYW0sIE5VTEwsIGxlZnQtMik7CgogIHJldHVybiBJU0lTX09LOwoKZXJyOgogIHpsb2dfd2FybiAoInRsdl9hZGRfcGFkZGluZygpOiBubyByb29tIGZvciB0bHYiKTsKICByZXR1cm4gSVNJU19XQVJOSU5HOwp9Cg==