ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggZGE1YmVlNS4uZWQ4Y2IyNyAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTQ1OSw2ICs0NTksNyBAQAogICAgICAgIHNyYy90aW1lLm8gc3JjL2ZkLm8gc3JjL3BpcGUubyBzcmMvcmVnZXgubyBzcmMvY2ZncGFyc2UubyBzcmMvc2VydmVyLm8gXAogICAgICAgIHNyYy9jaGVja3MubyBzcmMvcXVldWUubyBzcmMvY2xpZW50Lm8gc3JjL3Byb3h5Lm8gc3JjL3Byb3RvX3V4c3QubyBcCiAgICAgICAgc3JjL3Byb3RvX2h0dHAubyBzcmMvc3RyZWFtX3NvY2subyBzcmMvYXBwc2Vzc2lvbi5vIHNyYy9iYWNrZW5kLm8gXAorICAgICAgIHNyYy9sYl9md2xjLm8gc3JjL2xiX2Z3cnIubyBzcmMvbGJfbWFwLm8gXAogICAgICAgIHNyYy9zdHJlYW1faW50ZXJmYWNlLm8gc3JjL2R1bXBzdGF0cy5vIHNyYy9wcm90b190Y3AubyBcCiAgICAgICAgc3JjL3Nlc3Npb24ubyBzcmMvaGRyX2lkeC5vIHNyYy9ldl9zZWxlY3QubyBzcmMvc2lnbmFsLm8gXAogICAgICAgIHNyYy9hY2wubyBzcmMvbWVtb3J5Lm8gc3JjL2ZyZXFfY3RyLm8gXApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYnNkIGIvTWFrZWZpbGUuYnNkCmluZGV4IDVkNTc3MjUuLmViMmI2YjAgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLmJzZAorKysgYi9NYWtlZmlsZS5ic2QKQEAgLTEwNSw2ICsxMDUsNyBAQAogICAgICAgIHNyYy9wcm90b19odHRwLm8gc3JjL3N0cmVhbV9zb2NrLm8gc3JjL2FwcHNlc3Npb24ubyBzcmMvYmFja2VuZC5vIFwKICAgICAgICBzcmMvc3RyZWFtX2ludGVyZmFjZS5vIHNyYy9kdW1wc3RhdHMubyBzcmMvcHJvdG9fdGNwLm8gXAogICAgICAgIHNyYy9zZXNzaW9uLm8gc3JjL2hkcl9pZHgubyBzcmMvZXZfc2VsZWN0Lm8gc3JjL3NpZ25hbC5vIFwKKyAgICAgICBzcmMvbGJfZndsYy5vIHNyYy9sYl9md3JyLm8gc3JjL2xiX21hcC5vIFwKICAgICAgICBzcmMvZXZfcG9sbC5vIHNyYy9ldl9rcXVldWUubyBcCiAgICAgICAgc3JjL2FjbC5vIHNyYy9tZW1vcnkubyBzcmMvZnJlcV9jdHIubyBcCiAgICAgICAgc3JjL2VidHJlZS5vIHNyYy9lYjMydHJlZS5vCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5vc3ggYi9NYWtlZmlsZS5vc3gKaW5kZXggMjM0OTRhNC4uOWJhMTQ2YiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUub3N4CisrKyBiL01ha2VmaWxlLm9zeApAQCAtMTAyLDYgKzEwMiw3IEBACiAgICAgICAgc3JjL3Byb3RvX2h0dHAubyBzcmMvc3RyZWFtX3NvY2subyBzcmMvYXBwc2Vzc2lvbi5vIHNyYy9iYWNrZW5kLm8gXAogICAgICAgIHNyYy9zdHJlYW1faW50ZXJmYWNlLm8gc3JjL2R1bXBzdGF0cy5vIHNyYy9wcm90b190Y3AubyBcCiAgICAgICAgc3JjL3Nlc3Npb24ubyBzcmMvaGRyX2lkeC5vIHNyYy9ldl9zZWxlY3QubyBzcmMvc2lnbmFsLm8gXAorICAgICAgIHNyYy9sYl9md2xjLm8gc3JjL2xiX2Z3cnIubyBzcmMvbGJfbWFwLm8gXAogICAgICAgIHNyYy9ldl9wb2xsLm8gXAogICAgICAgIHNyYy9hY2wubyBzcmMvbWVtb3J5Lm8gc3JjL2ZyZXFfY3RyLm8gXAogICAgICAgIHNyYy9lYnRyZWUubyBzcmMvZWIzMnRyZWUubwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcm90by9iYWNrZW5kLmggYi9pbmNsdWRlL3Byb3RvL2JhY2tlbmQuaAppbmRleCAxNTc4NTBhLi43YTI0OGRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Byb3RvL2JhY2tlbmQuaAorKysgYi9pbmNsdWRlL3Byb3RvL2JhY2tlbmQuaApAQCAtMiw3ICsyLDcgQEAKICAgaW5jbHVkZS9wcm90by9iYWNrZW5kLmgKICAgRnVuY3Rpb25zIHByb3RvdHlwZXMgZm9yIHRoZSBiYWNrZW5kLgogCi0gIENvcHlyaWdodCAoQykgMjAwMC0yMDA4IFdpbGx5IFRhcnJlYXUgLSB3QDF3dC5ldQorICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwOSBXaWxseSBUYXJyZWF1IC0gd0Axd3QuZXUKICAgCiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpAQCAtMjUsMTAgKzI1LDEwIEBACiAjaW5jbHVkZSA8Y29tbW9uL2NvbmZpZy5oPgogCiAjaW5jbHVkZSA8dHlwZXMvYmFja2VuZC5oPgorI2luY2x1ZGUgPHR5cGVzL3Byb3h5Lmg+CisjaW5jbHVkZSA8dHlwZXMvc2VydmVyLmg+CiAjaW5jbHVkZSA8dHlwZXMvc2Vzc2lvbi5oPgogCi0jaW5jbHVkZSA8cHJvdG8vcXVldWUuaD4KLQogaW50IGFzc2lnbl9zZXJ2ZXIoc3RydWN0IHNlc3Npb24gKnMpOwogaW50IGFzc2lnbl9zZXJ2ZXJfYWRkcmVzcyhzdHJ1Y3Qgc2Vzc2lvbiAqcyk7CiBpbnQgYXNzaWduX3NlcnZlcl9hbmRfcXVldWUoc3RydWN0IHNlc3Npb24gKnMpOwpAQCAtMzcsMTQgKzM3LDkgQEAKIGludCBiYWNrZW5kX3BhcnNlX2JhbGFuY2UoY29uc3QgY2hhciAqKmFyZ3MsIGNoYXIgKmVyciwKIAkJCSAgaW50IGVycmxlbiwgc3RydWN0IHByb3h5ICpjdXJwcm94eSk7CiAKLXZvaWQgcmVjYWxjX3NlcnZlcl9tYXAoc3RydWN0IHByb3h5ICpweCk7CiBpbnQgYmVfZG93bnRpbWUoc3RydWN0IHByb3h5ICpweCk7Ci12b2lkIGluaXRfc2VydmVyX21hcChzdHJ1Y3QgcHJveHkgKnApOwotdm9pZCBmd3JyX2luaXRfc2VydmVyX2dyb3VwcyhzdHJ1Y3QgcHJveHkgKnApOwotdm9pZCBmd2xjX2luaXRfc2VydmVyX3RyZWUoc3RydWN0IHByb3h5ICpwKTsKIHZvaWQgcmVjb3VudF9zZXJ2ZXJzKHN0cnVjdCBwcm94eSAqcHgpOwogdm9pZCB1cGRhdGVfYmFja2VuZF93ZWlnaHQoc3RydWN0IHByb3h5ICpweCk7Ci1zdHJ1Y3Qgc2VydmVyICpnZXRfc2VydmVyX3JyX3dpdGhfY29ubnMoc3RydWN0IHByb3h5ICpweCwgc3RydWN0IHNlcnZlciAqc3J2dG9hdm9pZCk7CiBzdHJ1Y3Qgc2VydmVyICpnZXRfc2VydmVyX3NoKHN0cnVjdCBwcm94eSAqcHgsIGNvbnN0IGNoYXIgKmFkZHIsIGludCBsZW4pOwogc3RydWN0IHNlcnZlciAqZ2V0X3NlcnZlcl91aChzdHJ1Y3QgcHJveHkgKnB4LCBjaGFyICp1cmksIGludCB1cmlfbGVuKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcm90by9sYl9md2xjLmggYi9pbmNsdWRlL3Byb3RvL2xiX2Z3bGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzU2NzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wcm90by9sYl9md2xjLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIGluY2x1ZGUvcHJvdG8vbGJfZndsYy5oCisgKiBGYXN0IFdlaWdodGVkIExlYXN0IENvbm5lY3Rpb24gbG9hZCBiYWxhbmNpbmcgYWxnb3JpdGhtLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA5IFdpbGx5IFRhcnJlYXUgLSB3QDF3dC5ldQorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuMQorICogZXhjbHVzaXZlbHkuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBfUFJPVE9fTEJfRldMQ19ICisjZGVmaW5lIF9QUk9UT19MQl9GV0xDX0gKKworI2luY2x1ZGUgPGNvbW1vbi9jb25maWcuaD4KKyNpbmNsdWRlIDx0eXBlcy9wcm94eS5oPgorI2luY2x1ZGUgPHR5cGVzL3NlcnZlci5oPgorCitzdHJ1Y3Qgc2VydmVyICpmd2xjX2dldF9uZXh0X3NlcnZlcihzdHJ1Y3QgcHJveHkgKnAsIHN0cnVjdCBzZXJ2ZXIgKnNydnRvYXZvaWQpOwordm9pZCBmd2xjX2luaXRfc2VydmVyX3RyZWUoc3RydWN0IHByb3h5ICpwKTsKKworI2VuZGlmIC8qIF9QUk9UT19MQl9GV0xDX0ggKi8KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJvdG8vbGJfZndyci5oIGIvaW5jbHVkZS9wcm90by9sYl9md3JyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4OWMzOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHJvdG8vbGJfZndyci5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBpbmNsdWRlL3Byb3RvL2xiX2Z3cnIuaAorICogRmFzdCBXZWlnaHRlZCBSb3VuZCBSb2JpbiBsb2FkIGJhbGFuY2luZyBhbGdvcml0aG0uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDkgV2lsbHkgVGFycmVhdSAtIHdAMXd0LmV1CisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4xCisgKiBleGNsdXNpdmVseS4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIF9QUk9UT19MQl9GV1JSX0gKKyNkZWZpbmUgX1BST1RPX0xCX0ZXUlJfSAorCisjaW5jbHVkZSA8Y29tbW9uL2NvbmZpZy5oPgorI2luY2x1ZGUgPHR5cGVzL3Byb3h5Lmg+CisjaW5jbHVkZSA8dHlwZXMvc2VydmVyLmg+CisKK3ZvaWQgZndycl9pbml0X3NlcnZlcl9ncm91cHMoc3RydWN0IHByb3h5ICpwKTsKK3N0cnVjdCBzZXJ2ZXIgKmZ3cnJfZ2V0X25leHRfc2VydmVyKHN0cnVjdCBwcm94eSAqcCwgc3RydWN0IHNlcnZlciAqc3J2dG9hdm9pZCk7CisKKyNlbmRpZiAvKiBfUFJPVE9fTEJfRldSUl9IICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Byb3RvL2xiX21hcC5oIGIvaW5jbHVkZS9wcm90by9sYl9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWZkNjBlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wcm90by9sYl9tYXAuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogIGluY2x1ZGUvcHJvdG8vbGJfbWFwLmgKKyAqIE1hcC1iYXNlZCBsb2FkLWJhbGFuY2luZyAoUlIgYW5kIEhBU0gpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDkgV2lsbHkgVGFycmVhdSAtIHdAMXd0LmV1CisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4xCisgKiBleGNsdXNpdmVseS4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIF9QUk9UT19MQl9NQVBfSAorI2RlZmluZSBfUFJPVE9fTEJfTUFQX0gKKworI2luY2x1ZGUgPGNvbW1vbi9jb25maWcuaD4KKyNpbmNsdWRlIDx0eXBlcy9wcm94eS5oPgorI2luY2x1ZGUgPHR5cGVzL3NlcnZlci5oPgorCit2b2lkIG1hcF9zZXRfc2VydmVyX3N0YXR1c19kb3duKHN0cnVjdCBzZXJ2ZXIgKnNydik7Cit2b2lkIG1hcF9zZXRfc2VydmVyX3N0YXR1c191cChzdHJ1Y3Qgc2VydmVyICpzcnYpOwordm9pZCByZWNhbGNfc2VydmVyX21hcChzdHJ1Y3QgcHJveHkgKnB4KTsKK3ZvaWQgaW5pdF9zZXJ2ZXJfbWFwKHN0cnVjdCBwcm94eSAqcCk7CitzdHJ1Y3Qgc2VydmVyICptYXBfZ2V0X3NlcnZlcl9ycihzdHJ1Y3QgcHJveHkgKnB4LCBzdHJ1Y3Qgc2VydmVyICpzcnZ0b2F2b2lkKTsKKworI2VuZGlmIC8qIF9QUk9UT19MQl9NQVBfSCAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQuYyBiL3NyYy9iYWNrZW5kLmMKaW5kZXggZTdlZTNlNC4uZDhkN2UyZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQuYworKysgYi9zcmMvYmFja2VuZC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIEJhY2tlbmQgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMuCiAgKgotICogQ29weXJpZ2h0IDIwMDAtMjAwOCBXaWxseSBUYXJyZWF1IDx3QDF3dC5ldT4KKyAqIENvcHlyaWdodCAyMDAwLTIwMDkgV2lsbHkgVGFycmVhdSA8d0Axd3QuZXU+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxjb21tb24vY29tcGF0Lmg+CiAjaW5jbHVkZSA8Y29tbW9uL2NvbmZpZy5oPgogI2luY2x1ZGUgPGNvbW1vbi9kZWJ1Zy5oPgotI2luY2x1ZGUgPGNvbW1vbi9lYjMydHJlZS5oPgogI2luY2x1ZGUgPGNvbW1vbi90aWNrcy5oPgogI2luY2x1ZGUgPGNvbW1vbi90aW1lLmg+CiAKQEAgLTMxLDYgKzMwLDkgQEAKICNpbmNsdWRlIDxwcm90by9hY2wuaD4KICNpbmNsdWRlIDxwcm90by9iYWNrZW5kLmg+CiAjaW5jbHVkZSA8cHJvdG8vY2xpZW50Lmg+CisjaW5jbHVkZSA8cHJvdG8vbGJfZndsYy5oPgorI2luY2x1ZGUgPHByb3RvL2xiX2Z3cnIuaD4KKyNpbmNsdWRlIDxwcm90by9sYl9tYXAuaD4KICNpbmNsdWRlIDxwcm90by9wcm90b19odHRwLmg+CiAjaW5jbHVkZSA8cHJvdG8vcHJvdG9fdGNwLmg+CiAjaW5jbHVkZSA8cHJvdG8vcXVldWUuaD4KQEAgLTM4LDEyICs0MCw2IEBACiAjaW5jbHVkZSA8cHJvdG8vc2Vzc2lvbi5oPgogI2luY2x1ZGUgPHByb3RvL3Rhc2suaD4KIAotc3RhdGljIGlubGluZSB2b2lkIGZ3cnJfcmVtb3ZlX2Zyb21fdHJlZShzdHJ1Y3Qgc2VydmVyICpzKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3F1ZXVlX2J5X3dlaWdodChzdHJ1Y3QgZWJfcm9vdCAqcm9vdCwgc3RydWN0IHNlcnZlciAqcyk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgZndycl9kZXF1ZXVlX3NydihzdHJ1Y3Qgc2VydmVyICpzKTsKLXN0YXRpYyB2b2lkIGZ3cnJfZ2V0X3NydihzdHJ1Y3Qgc2VydmVyICpzKTsKLXN0YXRpYyB2b2lkIGZ3cnJfcXVldWVfc3J2KHN0cnVjdCBzZXJ2ZXIgKnMpOwotCiAvKgogICogVGhpcyBmdW5jdGlvbiByZWNvdW50cyB0aGUgbnVtYmVyIG9mIHVzYWJsZSBhY3RpdmUgYW5kIGJhY2t1cCBzZXJ2ZXJzIGZvcgogICogcHJveHkgPHA+LiBUaGVzZSBudW1iZXJzIGFyZSByZXR1cm5lZCBpbnRvIHRoZSBwLT5zcnZfYWN0IGFuZCBwLT5zcnZfYmNrLgpAQCAtOTQsMTAxNyArOTAsOCBAQAogCQlweC0+bGJwcm0udG90X3dlaWdodCA9IHB4LT5sYnBybS50b3Rfd2JjazsKIAkJcHgtPmxicHJtLnRvdF91c2VkICAgPSBweC0+c3J2X2JjazsKIAl9Ci19Ci0KLS8qIHRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgbWFwIGFjY29yZGluZyB0byBzZXJ2ZXIgPHNydj4ncyBuZXcgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIG1hcF9zZXRfc2VydmVyX3N0YXR1c19kb3duKHN0cnVjdCBzZXJ2ZXIgKnNydikKLXsKLQlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OwotCi0JaWYgKHNydi0+c3RhdGUgPT0gc3J2LT5wcmV2X3N0YXRlICYmCi0JICAgIHNydi0+ZXdlaWdodCA9PSBzcnYtPnByZXZfZXdlaWdodCkKLQkJcmV0dXJuOwotCi0JaWYgKHNydl9pc191c2FibGUoc3J2LT5zdGF0ZSwgc3J2LT5ld2VpZ2h0KSkKLQkJZ290byBvdXRfdXBkYXRlX3N0YXRlOwotCi0JLyogRklYTUU6IGNvdWxkIGJlIG9wdGltaXplZCBzaW5jZSB3ZSBrbm93IHdoYXQgY2hhbmdlZCAqLwotCXJlY291bnRfc2VydmVycyhwKTsKLQl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7Ci0JcC0+bGJwcm0ubWFwLnN0YXRlIHw9IFBSX01BUF9SRUNBTEM7Ci0gb3V0X3VwZGF0ZV9zdGF0ZToKLQlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOwotCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIG1hcCBhY2NvcmRpbmcgdG8gc2VydmVyIDxzcnY+J3MgbmV3IHN0YXRlICovCi1zdGF0aWMgdm9pZCBtYXBfc2V0X3NlcnZlcl9zdGF0dXNfdXAoc3RydWN0IHNlcnZlciAqc3J2KQotewotCXN0cnVjdCBwcm94eSAqcCA9IHNydi0+cHJveHk7Ci0KLQlpZiAoc3J2LT5zdGF0ZSA9PSBzcnYtPnByZXZfc3RhdGUgJiYKLQkgICAgc3J2LT5ld2VpZ2h0ID09IHNydi0+cHJldl9ld2VpZ2h0KQotCQlyZXR1cm47Ci0KLQlpZiAoIXNydl9pc191c2FibGUoc3J2LT5zdGF0ZSwgc3J2LT5ld2VpZ2h0KSkKLQkJZ290byBvdXRfdXBkYXRlX3N0YXRlOwotCi0JLyogRklYTUU6IGNvdWxkIGJlIG9wdGltaXplZCBzaW5jZSB3ZSBrbm93IHdoYXQgY2hhbmdlZCAqLwotCXJlY291bnRfc2VydmVycyhwKTsKLQl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7Ci0JcC0+bGJwcm0ubWFwLnN0YXRlIHw9IFBSX01BUF9SRUNBTEM7Ci0gb3V0X3VwZGF0ZV9zdGF0ZToKLQlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOwotCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJlY29tcHV0ZXMgdGhlIHNlcnZlciBtYXAgZm9yIHByb3h5IHB4LiBJdCByZWxpZXMgb24KLSAqIHB4LT5sYnBybS50b3Rfd2FjdCwgdG90X3diY2ssIHRvdF91c2VkLCB0b3Rfd2VpZ2h0LCBzbyBpdCBtdXN0IGJlCi0gKiBjYWxsZWQgYWZ0ZXIgcmVjb3VudF9zZXJ2ZXJzKCkuIEl0IGFsc28gZXhwZWN0cyBweC0+bGJwcm0ubWFwLnNydgotICogdG8gYmUgYWxsb2NhdGVkIHdpdGggdGhlIGxhcmdlc3Qgc2l6ZSBuZWVkZWQuIEl0IHVwZGF0ZXMgdG90X3dlaWdodC4KLSAqLwotdm9pZCByZWNhbGNfc2VydmVyX21hcChzdHJ1Y3QgcHJveHkgKnB4KQotewotCWludCBvLCB0b3QsIGZsYWc7Ci0Jc3RydWN0IHNlcnZlciAqY3VyLCAqYmVzdDsKLQotCXN3aXRjaCAocHgtPmxicHJtLnRvdF91c2VkKSB7Ci0JY2FzZSAwOgkvKiBubyBzZXJ2ZXIgKi8KLQkJcHgtPmxicHJtLm1hcC5zdGF0ZSAmPSB+UFJfTUFQX1JFQ0FMQzsKLQkJcmV0dXJuOwotCWNhc2UgMTogLyogb25seSBvbmUgc2VydmVyLCBqdXN0IGZpbGwgZmlyc3QgZW50cnkgKi8KLQkJdG90ID0gMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJdG90ID0gcHgtPmxicHJtLnRvdF93ZWlnaHQ7Ci0JCWJyZWFrOwotCX0KLQotCS8qIGhlcmUgd2UgKmtub3cqIHRoYXQgd2UgaGF2ZSBzb21lIHNlcnZlcnMgKi8KLQlpZiAocHgtPnNydl9hY3QpCi0JCWZsYWcgPSBTUlZfUlVOTklORzsKLQllbHNlCi0JCWZsYWcgPSBTUlZfUlVOTklORyB8IFNSVl9CQUNLVVA7Ci0KLQkvKiB0aGlzIGFsZ29yaXRobSBnaXZlcyBwcmlvcml0eSB0byB0aGUgZmlyc3Qgc2VydmVyLCB3aGljaCBtZWFucyB0aGF0Ci0JICogaXQgd2lsbCByZXNwZWN0IHRoZSBkZWNsYXJhdGlvbiBvcmRlciBmb3IgZXF1aXZhbGVudCB3ZWlnaHRzLCBhbmQKLQkgKiB0aGF0IHdoYXRldmVyIHRoZSB3ZWlnaHRzLCB0aGUgZmlyc3Qgc2VydmVyIGNhbGxlZCB3aWxsIGFsd2F5cyBiZQotCSAqIHRoZSBmaXJzdCBkZWNsYXJlZC4gVGhpcyBpcyBhbiBpbXBvcnRhbnQgYXN1bXB0aW9uIGZvciB0aGUgYmFja3VwCi0JICogY2FzZSwgd2hlcmUgd2Ugd2FudCB0aGUgZmlyc3Qgc2VydmVyIG9ubHkuCi0JICovCi0JZm9yIChjdXIgPSBweC0+c3J2OyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkKLQkJY3VyLT53c2NvcmUgPSAwOwotCi0JZm9yIChvID0gMDsgbyA8IHRvdDsgbysrKSB7Ci0JCWludCBtYXggPSAwOwotCQliZXN0ID0gTlVMTDsKLQkJZm9yIChjdXIgPSBweC0+c3J2OyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgewotCQkJaWYgKGN1ci0+ZXdlaWdodCAmJgotCQkJICAgIGZsYWcgPT0gKGN1ci0+c3RhdGUgJgotCQkJCSAgICAgKFNSVl9SVU5OSU5HIHwgU1JWX0dPSU5HRE9XTiB8IFNSVl9CQUNLVVApKSkgewotCQkJCWludCB2OwotCi0JCQkJLyogSWYgd2UgYXJlIGZvcmNlZCB0byByZXR1cm4gb25seSBvbmUgc2VydmVyLCB3ZSBkb24ndCB3YW50IHRvCi0JCQkJICogZ28gZnVydGhlciwgYmVjYXVzZSB3ZSB3b3VsZCByZXR1cm4gdGhlIHdyb25nIG9uZSBkdWUgdG8KLQkJCQkgKiBkaXZpZGUgb3ZlcmZsb3cuCi0JCQkJICovCi0JCQkJaWYgKHRvdCA9PSAxKSB7Ci0JCQkJCWJlc3QgPSBjdXI7Ci0JCQkJCS8qIG5vdGUgdGhhdCBiZXN0LT53c2NvcmUgd2lsbCBiZSB3cm9uZyBidXQgd2UgZG9uJ3QgY2FyZSAqLwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQljdXItPndzY29yZSArPSBjdXItPmV3ZWlnaHQ7Ci0JCQkJdiA9IChjdXItPndzY29yZSArIHRvdCkgLyB0b3Q7IC8qIHJlc3VsdCBiZXR3ZWVuIDAgYW5kIDMgKi8KLQkJCQlpZiAoYmVzdCA9PSBOVUxMIHx8IHYgPiBtYXgpIHsKLQkJCQkJbWF4ID0gdjsKLQkJCQkJYmVzdCA9IGN1cjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHgtPmxicHJtLm1hcC5zcnZbb10gPSBiZXN0OwotCQliZXN0LT53c2NvcmUgLT0gdG90OwotCX0KLQlweC0+bGJwcm0ubWFwLnN0YXRlICY9IH5QUl9NQVBfUkVDQUxDOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIG9mIGJ1aWxkaW5nIHRoZSBzZXJ2ZXIgTUFQIGZvciBtYXAtYmFzZWQgTEIKLSAqIGFsZ29yaXRobXMsIGFsbG9jYXRpbmcgdGhlIG1hcCwgYW5kIHNldHRpbmcgcC0+bGJwcm0ud211bHQgdG8gdGhlIEdDRCBvZiB0aGUKLSAqIHdlaWdodHMgaWYgYXBwbGljYWJsZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHByb3h5LCBhdCBjb25maWcKLSAqIHRpbWUuCi0gKi8KLXZvaWQgaW5pdF9zZXJ2ZXJfbWFwKHN0cnVjdCBwcm94eSAqcCkKLXsKLQlzdHJ1Y3Qgc2VydmVyICpzcnY7Ci0JaW50IHBnY2Q7Ci0JaW50IGFjdCwgYmNrOwotCi0JcC0+bGJwcm0uc2V0X3NlcnZlcl9zdGF0dXNfdXAgICA9IG1hcF9zZXRfc2VydmVyX3N0YXR1c191cDsKLQlwLT5sYnBybS5zZXRfc2VydmVyX3N0YXR1c19kb3duID0gbWFwX3NldF9zZXJ2ZXJfc3RhdHVzX2Rvd247Ci0JcC0+bGJwcm0udXBkYXRlX3NlcnZlcl9ld2VpZ2h0ID0gTlVMTDsKLSAKLQlpZiAoIXAtPnNydikKLQkJcmV0dXJuOwotCi0JLyogV2Ugd2lsbCBmYWN0b3IgdGhlIHdlaWdodHMgdG8gcmVkdWNlIHRoZSB0YWJsZSwKLQkgKiB1c2luZyBFdWNsaWRlJ3MgbGFyZ2VzdCBjb21tb24gZGl2aXNvciBhbGdvcml0aG0uCi0JICogU2luY2Ugd2UgbWF5IGhhdmUgemVybyB3ZWlnaHRzLCB3ZSBoYXZlIHRvIGZpcnN0Ci0JICogZmluZCBhIG5vbi16ZXJvIHdlaWdodCBzZXJ2ZXIuCi0JICovCi0JcGdjZCA9IDE7Ci0Jc3J2ID0gcC0+c3J2OwotCXdoaWxlIChzcnYgJiYgIXNydi0+dXdlaWdodCkKLQkJc3J2ID0gc3J2LT5uZXh0OwotCi0JaWYgKHNydikgewotCQlwZ2NkID0gc3J2LT51d2VpZ2h0OyAvKiBub3RlOiBjYW5ub3QgYmUgemVybyAqLwotCQl3aGlsZSAocGdjZCA+IDEgJiYgKHNydiA9IHNydi0+bmV4dCkpIHsKLQkJCWludCB3ID0gc3J2LT51d2VpZ2h0OwotCQkJd2hpbGUgKHcpIHsKLQkJCQlpbnQgdCA9IHBnY2QgJSB3OwotCQkJCXBnY2QgPSB3OwotCQkJCXcgPSB0OwotCQkJfQotCQl9Ci0JfQotCi0JLyogSXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBrbm93IHdoYXQgZmFjdG9yIHRvIGFwcGx5Ci0JICogdG8gdGhlIGJhY2tlbmQncyBlZmZlY3RpdmUgd2VpZ2h0IHRvIGtub3cgaXRzIHJlYWwKLQkgKiB3ZWlnaHQuCi0JICovCi0JcC0+bGJwcm0ud211bHQgPSBwZ2NkOwotCi0JYWN0ID0gYmNrID0gMDsKLQlmb3IgKHNydiA9IHAtPnNydjsgc3J2OyBzcnYgPSBzcnYtPm5leHQpIHsKLQkJc3J2LT5ld2VpZ2h0ID0gc3J2LT51d2VpZ2h0IC8gcGdjZDsKLQkJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7Ci0JCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7Ci0JCWlmIChzcnYtPnN0YXRlICYgU1JWX0JBQ0tVUCkKLQkJCWJjayArPSBzcnYtPmV3ZWlnaHQ7Ci0JCWVsc2UKLQkJCWFjdCArPSBzcnYtPmV3ZWlnaHQ7Ci0JfQotCi0JLyogdGhpcyBpcyB0aGUgbGFyZ2VzdCBtYXAgd2Ugd2lsbCBldmVyIG5lZWQgZm9yIHRoaXMgc2VydmVycyBsaXN0ICovCi0JaWYgKGFjdCA8IGJjaykKLQkJYWN0ID0gYmNrOwotCi0JaWYgKCFhY3QpCi0JCWFjdCA9IDE7Ci0KLQlwLT5sYnBybS5tYXAuc3J2ID0gKHN0cnVjdCBzZXJ2ZXIgKiopY2FsbG9jKGFjdCwgc2l6ZW9mKHN0cnVjdCBzZXJ2ZXIgKikpOwotCS8qIHJlY291bnRzIHNlcnZlcnMgYW5kIHRoZWlyIHdlaWdodHMgKi8KLQlwLT5sYnBybS5tYXAuc3RhdGUgPSBQUl9NQVBfUkVDQUxDOwotCXJlY291bnRfc2VydmVycyhwKTsKLQl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7Ci0JcmVjYWxjX3NlcnZlcl9tYXAocCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgc2VydmVyIHRyZWVzIGFjY29yZGluZyB0byBzZXJ2ZXIgPHNydj4ncyBuZXcKLSAqIHN0YXRlLiBJdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gc2VydmVyIDxzcnY+J3Mgc3RhdHVzIGNoYW5nZXMgdG8gZG93bi4KLSAqIEl0IGlzIG5vdCBpbXBvcnRhbnQgd2hldGhlciB0aGUgc2VydmVyIHdhcyBhbHJlYWR5IGRvd24gb3Igbm90LiBJdCBpcyBub3QKLSAqIGltcG9ydGFudCBlaXRoZXIgdGhhdCB0aGUgbmV3IHN0YXRlIGlzIGNvbXBsZXRlbHkgZG93biAodGhlIGNhbGxlciBtYXkgbm90Ci0gKiBrbm93IGFsbCB0aGUgdmFyaWFibGVzIG9mIGEgc2VydmVyJ3Mgc3RhdGUpLgotICovCi1zdGF0aWMgdm9pZCBmd3JyX3NldF9zZXJ2ZXJfc3RhdHVzX2Rvd24oc3RydWN0IHNlcnZlciAqc3J2KQotewotCXN0cnVjdCBwcm94eSAqcCA9IHNydi0+cHJveHk7Ci0Jc3RydWN0IGZ3cnJfZ3JvdXAgKmdycDsKLQotCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgotCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCi0JCXJldHVybjsKLQotCWlmIChzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCi0JCWdvdG8gb3V0X3VwZGF0ZV9zdGF0ZTsKLQotCWlmICghc3J2X2lzX3VzYWJsZShzcnYtPnByZXZfc3RhdGUsIHNydi0+cHJldl9ld2VpZ2h0KSkKLQkJLyogc2VydmVyIHdhcyBhbHJlYWR5IGRvd24gKi8KLQkJZ290byBvdXRfdXBkYXRlX2JhY2tlbmQ7Ci0KLQlncnAgPSAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApID8gJnAtPmxicHJtLmZ3cnIuYmNrIDogJnAtPmxicHJtLmZ3cnIuYWN0OwotCWdycC0+bmV4dF93ZWlnaHQgLT0gc3J2LT5wcmV2X2V3ZWlnaHQ7Ci0KLQlpZiAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApIHsKLQkJcC0+bGJwcm0udG90X3diY2sgPSBwLT5sYnBybS5md3JyLmJjay5uZXh0X3dlaWdodDsKLQkJcC0+c3J2X2Jjay0tOwotCi0JCWlmIChzcnYgPT0gcC0+bGJwcm0uZmJjaykgewotCQkJLyogd2UgbG9zdCB0aGUgZmlyc3QgYmFja3VwIHNlcnZlciBpbiBhIHNpbmdsZS1iYWNrdXAKLQkJCSAqIGNvbmZpZ3VyYXRpb24sIHdlIG11c3Qgc2VhcmNoIGFub3RoZXIgb25lLgotCQkJICovCi0JCQlzdHJ1Y3Qgc2VydmVyICpzcnYyID0gcC0+bGJwcm0uZmJjazsKLQkJCWRvIHsKLQkJCQlzcnYyID0gc3J2Mi0+bmV4dDsKLQkJCX0gd2hpbGUgKHNydjIgJiYKLQkJCQkgISgoc3J2Mi0+c3RhdGUgJiBTUlZfQkFDS1VQKSAmJgotCQkJCSAgIHNydl9pc191c2FibGUoc3J2Mi0+c3RhdGUsIHNydjItPmV3ZWlnaHQpKSk7Ci0JCQlwLT5sYnBybS5mYmNrID0gc3J2MjsKLQkJfQotCX0gZWxzZSB7Ci0JCXAtPmxicHJtLnRvdF93YWN0ID0gcC0+bGJwcm0uZndyci5hY3QubmV4dF93ZWlnaHQ7Ci0JCXAtPnNydl9hY3QtLTsKLQl9Ci0KLQlmd3JyX2RlcXVldWVfc3J2KHNydik7Ci0JZndycl9yZW1vdmVfZnJvbV90cmVlKHNydik7Ci0KLW91dF91cGRhdGVfYmFja2VuZDoKLQkvKiBjaGVjay91cGRhdGUgdG90X3VzZWQsIHRvdF93ZWlnaHQgKi8KLQl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7Ci0gb3V0X3VwZGF0ZV9zdGF0ZToKLQlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOwotCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHNlcnZlciB0cmVlcyBhY2NvcmRpbmcgdG8gc2VydmVyIDxzcnY+J3MgbmV3Ci0gKiBzdGF0ZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHNlcnZlciA8c3J2PidzIHN0YXR1cyBjaGFuZ2VzIHRvIHVwLgotICogSXQgaXMgbm90IGltcG9ydGFudCB3aGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGFscmVhZHkgZG93biBvciBub3QuIEl0IGlzIG5vdAotICogaW1wb3J0YW50IGVpdGhlciB0aGF0IHRoZSBuZXcgc3RhdGUgaXMgY29tcGxldGVseSBVUCAodGhlIGNhbGxlciBtYXkgbm90Ci0gKiBrbm93IGFsbCB0aGUgdmFyaWFibGVzIG9mIGEgc2VydmVyJ3Mgc3RhdGUpLiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IGNoYW5nZQotICogdGhlIHdlaWdodCBvZiBhIHNlcnZlciB3aGljaCB3YXMgYWxyZWFkeSB1cC4KLSAqLwotc3RhdGljIHZvaWQgZndycl9zZXRfc2VydmVyX3N0YXR1c191cChzdHJ1Y3Qgc2VydmVyICpzcnYpCi17Ci0Jc3RydWN0IHByb3h5ICpwID0gc3J2LT5wcm94eTsKLQlzdHJ1Y3QgZndycl9ncm91cCAqZ3JwOwotCi0JaWYgKHNydi0+c3RhdGUgPT0gc3J2LT5wcmV2X3N0YXRlICYmCi0JICAgIHNydi0+ZXdlaWdodCA9PSBzcnYtPnByZXZfZXdlaWdodCkKLQkJcmV0dXJuOwotCi0JaWYgKCFzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCi0JCWdvdG8gb3V0X3VwZGF0ZV9zdGF0ZTsKLQotCWlmIChzcnZfaXNfdXNhYmxlKHNydi0+cHJldl9zdGF0ZSwgc3J2LT5wcmV2X2V3ZWlnaHQpKQotCQkvKiBzZXJ2ZXIgd2FzIGFscmVhZHkgdXAgKi8KLQkJZ290byBvdXRfdXBkYXRlX2JhY2tlbmQ7Ci0KLQlncnAgPSAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApID8gJnAtPmxicHJtLmZ3cnIuYmNrIDogJnAtPmxicHJtLmZ3cnIuYWN0OwotCWdycC0+bmV4dF93ZWlnaHQgKz0gc3J2LT5ld2VpZ2h0OwotCi0JaWYgKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSB7Ci0JCXAtPmxicHJtLnRvdF93YmNrID0gcC0+bGJwcm0uZndyci5iY2submV4dF93ZWlnaHQ7Ci0JCXAtPnNydl9iY2srKzsKLQotCQlpZiAoIShwLT5vcHRpb25zICYgUFJfT19VU0VfQUxMX0JLKSkgewotCQkJaWYgKCFwLT5sYnBybS5mYmNrKSB7Ci0JCQkJLyogdGhlcmUgd2FzIG5vIGJhY2t1cCBzZXJ2ZXIgYW55bW9yZSAqLwotCQkJCXAtPmxicHJtLmZiY2sgPSBzcnY7Ci0JCQl9IGVsc2UgewotCQkJCS8qIHdlIG1heSBoYXZlIHJlc3RvcmVkIGEgYmFja3VwIHNlcnZlciBwcmlvciB0byBmYmNrLAotCQkJCSAqIGluIHdoaWNoIGNhc2UgaXQgc2hvdWxkIHJlcGxhY2UgaXQuCi0JCQkJICovCi0JCQkJc3RydWN0IHNlcnZlciAqc3J2MiA9IHNydjsKLQkJCQlkbyB7Ci0JCQkJCXNydjIgPSBzcnYyLT5uZXh0OwotCQkJCX0gd2hpbGUgKHNydjIgJiYgKHNydjIgIT0gcC0+bGJwcm0uZmJjaykpOwotCQkJCWlmIChzcnYyKQotCQkJCQlwLT5sYnBybS5mYmNrID0gc3J2OwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJcC0+bGJwcm0udG90X3dhY3QgPSBwLT5sYnBybS5md3JyLmFjdC5uZXh0X3dlaWdodDsKLQkJcC0+c3J2X2FjdCsrOwotCX0KLQotCS8qIG5vdGUgdGhhdCBld2VpZ2h0IGNhbm5vdCBiZSAwIGhlcmUgKi8KLQlmd3JyX2dldF9zcnYoc3J2KTsKLQlzcnYtPm5wb3MgPSBncnAtPmN1cnJfcG9zICsgKGdycC0+bmV4dF93ZWlnaHQgKyBncnAtPmN1cnJfd2VpZ2h0IC0gZ3JwLT5jdXJyX3BvcykgLyBzcnYtPmV3ZWlnaHQ7Ci0JZndycl9xdWV1ZV9zcnYoc3J2KTsKLQotb3V0X3VwZGF0ZV9iYWNrZW5kOgotCS8qIGNoZWNrL3VwZGF0ZSB0b3RfdXNlZCwgdG90X3dlaWdodCAqLwotCXVwZGF0ZV9iYWNrZW5kX3dlaWdodChwKTsKLSBvdXRfdXBkYXRlX3N0YXRlOgotCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7Ci0Jc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYW4gdXBkYXRlIHRvIHNlcnZlciA8c3J2PidzIGVmZmVjdGl2ZQotICogd2VpZ2h0LiBJdCBtYXkgYmUgY2FsbGVkIGFmdGVyIGEgc3RhdGUgY2hhbmdlIHRvby4KLSAqLwotc3RhdGljIHZvaWQgZndycl91cGRhdGVfc2VydmVyX3dlaWdodChzdHJ1Y3Qgc2VydmVyICpzcnYpCi17Ci0JaW50IG9sZF9zdGF0ZSwgbmV3X3N0YXRlOwotCXN0cnVjdCBwcm94eSAqcCA9IHNydi0+cHJveHk7Ci0Jc3RydWN0IGZ3cnJfZ3JvdXAgKmdycDsKLQotCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgotCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCi0JCXJldHVybjsKLQotCS8qIElmIGNoYW5naW5nIHRoZSBzZXJ2ZXIncyB3ZWlnaHQgY2hhbmdlcyBpdHMgc3RhdGUsIHdlIHNpbXBseSBhcHBseQotCSAqIHRoZSBwcm9jZWR1cmVzIHdlIGFscmVhZHkgaGF2ZSBmb3Igc3RhdHVzIGNoYW5nZS4gSWYgdGhlIHN0YXRlCi0JICogcmVtYWlucyBkb3duLCB0aGUgc2VydmVyIGlzIG5vdCBpbiBhbnkgdHJlZSwgc28gaXQncyBhcyBlYXN5IGFzCi0JICogdXBkYXRpbmcgaXRzIHZhbHVlcy4gSWYgdGhlIHN0YXRlIHJlbWFpbnMgdXAgd2l0aCBkaWZmZXJlbnQgd2VpZ2h0cywKLQkgKiB0aGVyZSBhcmUgc29tZSBjb21wdXRhdGlvbnMgdG8gcGVyZm9ybSB0byBmaW5kIGEgbmV3IHBsYWNlIGFuZAotCSAqIHBvc3NpYmx5IGEgbmV3IHRyZWUgZm9yIHRoaXMgc2VydmVyLgotCSAqLwotCSAKLQlvbGRfc3RhdGUgPSBzcnZfaXNfdXNhYmxlKHNydi0+cHJldl9zdGF0ZSwgc3J2LT5wcmV2X2V3ZWlnaHQpOwotCW5ld19zdGF0ZSA9IHNydl9pc191c2FibGUoc3J2LT5zdGF0ZSwgc3J2LT5ld2VpZ2h0KTsKLQotCWlmICghb2xkX3N0YXRlICYmICFuZXdfc3RhdGUpIHsKLQkJc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQkJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSBpZiAoIW9sZF9zdGF0ZSAmJiBuZXdfc3RhdGUpIHsKLQkJZndycl9zZXRfc2VydmVyX3N0YXR1c191cChzcnYpOwotCQlyZXR1cm47Ci0JfQotCWVsc2UgaWYgKG9sZF9zdGF0ZSAmJiAhbmV3X3N0YXRlKSB7Ci0JCWZ3cnJfc2V0X3NlcnZlcl9zdGF0dXNfZG93bihzcnYpOwotCQlyZXR1cm47Ci0JfQotCi0JZ3JwID0gKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/ICZwLT5sYnBybS5md3JyLmJjayA6ICZwLT5sYnBybS5md3JyLmFjdDsKLQlncnAtPm5leHRfd2VpZ2h0ID0gZ3JwLT5uZXh0X3dlaWdodCAtIHNydi0+cHJldl9ld2VpZ2h0ICsgc3J2LT5ld2VpZ2h0OwotCi0JcC0+bGJwcm0udG90X3dhY3QgPSBwLT5sYnBybS5md3JyLmFjdC5uZXh0X3dlaWdodDsKLQlwLT5sYnBybS50b3Rfd2JjayA9IHAtPmxicHJtLmZ3cnIuYmNrLm5leHRfd2VpZ2h0OwotCi0JaWYgKHNydi0+bGJfdHJlZSA9PSBncnAtPmluaXQpIHsKLQkJZndycl9kZXF1ZXVlX3NydihzcnYpOwotCQlmd3JyX3F1ZXVlX2J5X3dlaWdodChncnAtPmluaXQsIHNydik7Ci0JfQotCWVsc2UgaWYgKCFzcnYtPmxiX3RyZWUpIHsKLQkJLyogRklYTUU6IHNlcnZlciB3YXMgZG93bi4gVGhpcyBpcyBub3QgcG9zc2libGUgcmlnaHQgbm93IGJ1dAotCQkgKiBtYXkgYmUgbmVlZGVkIHNvb24gZm9yIHNsb3dzdGFydCBvciBncmFjZWZ1bCBzaHV0ZG93bi4KLQkJICovCi0JCWZ3cnJfZGVxdWV1ZV9zcnYoc3J2KTsKLQkJZndycl9nZXRfc3J2KHNydik7Ci0JCXNydi0+bnBvcyA9IGdycC0+Y3Vycl9wb3MgKyAoZ3JwLT5uZXh0X3dlaWdodCArIGdycC0+Y3Vycl93ZWlnaHQgLSBncnAtPmN1cnJfcG9zKSAvIHNydi0+ZXdlaWdodDsKLQkJZndycl9xdWV1ZV9zcnYoc3J2KTsKLQl9IGVsc2UgewotCQkvKiBUaGUgc2VydmVyIGlzIGVpdGhlciBhY3RpdmUgb3IgaW4gdGhlIG5leHQgcXVldWUuIElmIGl0J3MKLQkJICogc3RpbGwgaW4gdGhlIGFjdGl2ZSBxdWV1ZSBhbmQgaXQgaGFzIG5vdCBjb25zdW1lZCBhbGwgb2YgaXRzCi0JCSAqIHBsYWNlcywgbGV0J3MgYWRqdXN0IGl0cyBuZXh0IHBvc2l0aW9uLgotCQkgKi8KLQkJZndycl9nZXRfc3J2KHNydik7Ci0KLQkJaWYgKHNydi0+ZXdlaWdodCA+IDApIHsKLQkJCWludCBwcmV2X25leHQgPSBzcnYtPm5wb3M7Ci0JCQlpbnQgc3RlcCA9IGdycC0+bmV4dF93ZWlnaHQgLyBzcnYtPmV3ZWlnaHQ7Ci0KLQkJCXNydi0+bnBvcyA9IHNydi0+bHBvcyArIHN0ZXA7Ci0JCQlzcnYtPnJ3ZWlnaHQgPSAwOwotCi0JCQlpZiAoc3J2LT5ucG9zID4gcHJldl9uZXh0KQotCQkJCXNydi0+bnBvcyA9IHByZXZfbmV4dDsKLQkJCWlmIChzcnYtPm5wb3MgPCBncnAtPmN1cnJfcG9zICsgMikKLQkJCQlzcnYtPm5wb3MgPSBncnAtPmN1cnJfcG9zICsgc3RlcDsKLQkJfSBlbHNlIHsKLQkJCS8qIHB1c2ggaXQgaW50byB0aGUgbmV4dCB0cmVlICovCi0JCQlzcnYtPm5wb3MgPSBncnAtPmN1cnJfcG9zICsgZ3JwLT5jdXJyX3dlaWdodDsKLQkJfQotCi0JCWZ3cnJfZGVxdWV1ZV9zcnYoc3J2KTsKLQkJZndycl9xdWV1ZV9zcnYoc3J2KTsKLQl9Ci0KLQl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7Ci0Jc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKLX0KLQotLyogUmVtb3ZlIGEgc2VydmVyIGZyb20gYSB0cmVlLiBJdCBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuIGRlcXVldWVkLiBUaGlzCi0gKiBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBjYWxsZWQgd2hlbiBhIHNlcnZlciBpcyBnb2luZyBkb3duIG9yIGhhcyBpdHMKLSAqIHdlaWdodCBkaXNhYmxlZC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGZ3cnJfcmVtb3ZlX2Zyb21fdHJlZShzdHJ1Y3Qgc2VydmVyICpzKQotewotCXMtPmxiX3RyZWUgPSBOVUxMOwotfQotCi0vKiBRdWV1ZSBhIHNlcnZlciBpbiB0aGUgd2VpZ2h0IHRyZWUgPHJvb3Q+LCBhc3N1bWluZyB0aGUgd2VpZ2h0IGlzID4wLgotICogV2Ugd2FudCB0byBzb3J0IHRoZW0gYnkgaW52ZXJ0ZWQgd2VpZ2h0cywgYmVjYXVzZSB3ZSBuZWVkIHRvIHBsYWNlCi0gKiBoZWF2eSBzZXJ2ZXJzIGZpcnN0IGluIG9yZGVyIHRvIGdldCBhIHNtb290aCBkaXN0cmlidXRpb24uCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3F1ZXVlX2J5X3dlaWdodChzdHJ1Y3QgZWJfcm9vdCAqcm9vdCwgc3RydWN0IHNlcnZlciAqcykKLXsKLQlzLT5sYl9ub2RlLmtleSA9IFNSVl9FV0dIVF9NQVggLSBzLT5ld2VpZ2h0OwotCWViMzJfaW5zZXJ0KHJvb3QsICZzLT5sYl9ub2RlKTsKLQlzLT5sYl90cmVlID0gcm9vdDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYnVpbGRpbmcgdGhlIHdlaWdodCB0cmVlcyBpbiBjYXNlIG9mIGZhc3QKLSAqIHdlaWdodGVkIHJvdW5kLXJvYmluLiBJdCBhbHNvIHNldHMgcC0+bGJwcm0ud2RpdiB0byB0aGUgZXdlaWdodCB0byB1d2VpZ2h0Ci0gKiByYXRpby4gQm90aCBhY3RpdmUgYW5kIGJhY2t1cCBncm91cHMgYXJlIGluaXRpYWxpemVkLgotICovCi12b2lkIGZ3cnJfaW5pdF9zZXJ2ZXJfZ3JvdXBzKHN0cnVjdCBwcm94eSAqcCkKLXsKLQlzdHJ1Y3Qgc2VydmVyICpzcnY7Ci0Jc3RydWN0IGViX3Jvb3QgaW5pdF9oZWFkID0gRUJfUk9PVDsKLQotCXAtPmxicHJtLnNldF9zZXJ2ZXJfc3RhdHVzX3VwICAgPSBmd3JyX3NldF9zZXJ2ZXJfc3RhdHVzX3VwOwotCXAtPmxicHJtLnNldF9zZXJ2ZXJfc3RhdHVzX2Rvd24gPSBmd3JyX3NldF9zZXJ2ZXJfc3RhdHVzX2Rvd247Ci0JcC0+bGJwcm0udXBkYXRlX3NlcnZlcl9ld2VpZ2h0ICA9IGZ3cnJfdXBkYXRlX3NlcnZlcl93ZWlnaHQ7Ci0KLQlwLT5sYnBybS53ZGl2ID0gQkVfV0VJR0hUX1NDQUxFOwotCWZvciAoc3J2ID0gcC0+c3J2OyBzcnY7IHNydiA9IHNydi0+bmV4dCkgewotCQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodCA9IHNydi0+dXdlaWdodCAqIEJFX1dFSUdIVF9TQ0FMRTsKLQkJc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQl9Ci0KLQlyZWNvdW50X3NlcnZlcnMocCk7Ci0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotCi0JLyogcHJlcGFyZSB0aGUgYWN0aXZlIHNlcnZlcnMgZ3JvdXAgKi8KLQlwLT5sYnBybS5md3JyLmFjdC5jdXJyX3BvcyA9IHAtPmxicHJtLmZ3cnIuYWN0LmN1cnJfd2VpZ2h0ID0KLQkJcC0+bGJwcm0uZndyci5hY3QubmV4dF93ZWlnaHQgPSBwLT5sYnBybS50b3Rfd2FjdDsKLQlwLT5sYnBybS5md3JyLmFjdC5jdXJyID0gcC0+bGJwcm0uZndyci5hY3QudDAgPQotCQlwLT5sYnBybS5md3JyLmFjdC50MSA9IGluaXRfaGVhZDsKLQlwLT5sYnBybS5md3JyLmFjdC5pbml0ID0gJnAtPmxicHJtLmZ3cnIuYWN0LnQwOwotCXAtPmxicHJtLmZ3cnIuYWN0Lm5leHQgPSAmcC0+bGJwcm0uZndyci5hY3QudDE7Ci0KLQkvKiBwcmVwYXJlIHRoZSBiYWNrdXAgc2VydmVycyBncm91cCAqLwotCXAtPmxicHJtLmZ3cnIuYmNrLmN1cnJfcG9zID0gcC0+bGJwcm0uZndyci5iY2suY3Vycl93ZWlnaHQgPQotCQlwLT5sYnBybS5md3JyLmJjay5uZXh0X3dlaWdodCA9IHAtPmxicHJtLnRvdF93YmNrOwotCXAtPmxicHJtLmZ3cnIuYmNrLmN1cnIgPSBwLT5sYnBybS5md3JyLmJjay50MCA9Ci0JCXAtPmxicHJtLmZ3cnIuYmNrLnQxID0gaW5pdF9oZWFkOwotCXAtPmxicHJtLmZ3cnIuYmNrLmluaXQgPSAmcC0+bGJwcm0uZndyci5iY2sudDA7Ci0JcC0+bGJwcm0uZndyci5iY2submV4dCA9ICZwLT5sYnBybS5md3JyLmJjay50MTsKLQotCS8qIHF1ZXVlIGFjdGl2ZSBhbmQgYmFja3VwIHNlcnZlcnMgaW4gdHdvIGRpc3RpbmN0IGdyb3VwcyAqLwotCWZvciAoc3J2ID0gcC0+c3J2OyBzcnY7IHNydiA9IHNydi0+bmV4dCkgewotCQlpZiAoIXNydl9pc191c2FibGUoc3J2LT5zdGF0ZSwgc3J2LT5ld2VpZ2h0KSkKLQkJCWNvbnRpbnVlOwotCQlmd3JyX3F1ZXVlX2J5X3dlaWdodCgoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApID8KLQkJCQlwLT5sYnBybS5md3JyLmJjay5pbml0IDoKLQkJCQlwLT5sYnBybS5md3JyLmFjdC5pbml0LAotCQkJCXNydik7Ci0JfQotfQotCi0vKiBzaW1wbHkgcmVtb3ZlcyBhIHNlcnZlciBmcm9tIGEgd2VpZ2h0IHRyZWUgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX2RlcXVldWVfc3J2KHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0JZWIzMl9kZWxldGUoJnMtPmxiX25vZGUpOwotfQotCi0vKiBxdWV1ZXMgYSBzZXJ2ZXIgaW50byB0aGUgYXBwcm9wcmlhdGUgZ3JvdXAgYW5kIHRyZWUgZGVwZW5kaW5nIG9uIGl0cwotICogYmFja3VwIHN0YXR1cywgYW5kIC0+bnBvcy4gSWYgdGhlIHNlcnZlciBpcyBkaXNhYmxlZCwgc2ltcGx5IGFzc2lnbgotICogaXQgdG8gdGhlIE5VTEwgdHJlZS4KLSAqLwotc3RhdGljIHZvaWQgZndycl9xdWV1ZV9zcnYoc3RydWN0IHNlcnZlciAqcykKLXsKLQlzdHJ1Y3QgcHJveHkgKnAgPSBzLT5wcm94eTsKLQlzdHJ1Y3QgZndycl9ncm91cCAqZ3JwOwotCi0JZ3JwID0gKHMtPnN0YXRlICYgU1JWX0JBQ0tVUCkgPyAmcC0+bGJwcm0uZndyci5iY2sgOiAmcC0+bGJwcm0uZndyci5hY3Q7Ci0JCi0JLyogRGVsYXkgZXZlcnl0aGluZyB3aGljaCBkb2VzIG5vdCBmaXQgaW50byB0aGUgd2luZG93IGFuZCBldmVyeXRoaW5nCi0JICogd2hpY2ggZG9lcyBub3QgZml0IGludG8gdGhlIHRoZW9yaWNhbCBuZXcgd2luZG93LgotCSAqLwotCWlmICghc3J2X2lzX3VzYWJsZShzLT5zdGF0ZSwgcy0+ZXdlaWdodCkpIHsKLQkJZndycl9yZW1vdmVfZnJvbV90cmVlKHMpOwotCX0KLQllbHNlIGlmIChzLT5ld2VpZ2h0IDw9IDAgfHwKLQkJIHMtPm5wb3MgPj0gMiAqIGdycC0+Y3Vycl93ZWlnaHQgfHwKLQkJIHMtPm5wb3MgPj0gZ3JwLT5jdXJyX3dlaWdodCArIGdycC0+bmV4dF93ZWlnaHQpIHsKLQkJLyogcHV0IGludG8gbmV4dCB0cmVlLCBhbmQgcmVhZGp1c3QgbnBvcyBpbiBjYXNlIHdlIGNvdWxkCi0JCSAqIGZpbmFsbHkgdGFrZSB0aGlzIGJhY2sgdG8gY3VycmVudC4gKi8KLQkJcy0+bnBvcyAtPSBncnAtPmN1cnJfd2VpZ2h0OwotCQlmd3JyX3F1ZXVlX2J5X3dlaWdodChncnAtPm5leHQsIHMpOwotCX0KLQllbHNlIHsKLQkJLyogVGhlIHNvcnRpbmcga2V5IGlzIHN0b3JlZCBpbiB1bml0cyBvZiBzLT5ucG9zICogdXNlcl93ZWlnaHQKLQkJICogaW4gb3JkZXIgdG8gYXZvaWQgb3ZlcmZsb3dzLiBBcyBzdGF0ZWQgaW4gYmFja2VuZC5oLCB0aGUKLQkJICogbG93ZXIgdGhlIHNjYWxlLCB0aGUgcm91Z2hlciB0aGUgd2VpZ2h0cyBtb2R1bGF0aW9uLCBhbmQgdGhlCi0JCSAqIGhpZ2hlciB0aGUgc2NhbGUsIHRoZSBsb3dlciB0aGUgbnVtYmVyIG9mIHNlcnZlcnMgd2l0aG91dAotCQkgKiBvdmVyZmxvdy4gV2l0aCB0aGlzIGZvcm11bGEsIHRoZSByZXN1bHQgaXMgYWx3YXlzIHBvc2l0aXZlLAotCQkgKiBzbyB3ZSBjYW4gdXNlIGViM+lfaW5zZXJ0KCkuCi0JCSAqLwotCQlzLT5sYl9ub2RlLmtleSA9IFNSVl9VV0dIVF9SQU5HRSAqIHMtPm5wb3MgKwotCQkJKHVuc2lnbmVkKShTUlZfRVdHSFRfTUFYICsgcy0+cndlaWdodCAtIHMtPmV3ZWlnaHQpIC8gQkVfV0VJR0hUX1NDQUxFOwotCi0JCWViMzJfaW5zZXJ0KCZncnAtPmN1cnIsICZzLT5sYl9ub2RlKTsKLQkJcy0+bGJfdHJlZSA9ICZncnAtPmN1cnI7Ci0JfQotfQotCi0vKiBwcmVwYXJlcyBhIHNlcnZlciB3aGVuIGV4dHJhY3RpbmcgaXQgZnJvbSB0aGUgImluaXQiIHRyZWUgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX2dldF9zcnZfaW5pdChzdHJ1Y3Qgc2VydmVyICpzKQotewotCXMtPm5wb3MgPSBzLT5yd2VpZ2h0ID0gMDsKLX0KLQotLyogcHJlcGFyZXMgYSBzZXJ2ZXIgd2hlbiBleHRyYWN0aW5nIGl0IGZyb20gdGhlICJuZXh0IiB0cmVlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndycl9nZXRfc3J2X25leHQoc3RydWN0IHNlcnZlciAqcykKLXsKLQlzdHJ1Y3QgZndycl9ncm91cCAqZ3JwID0gKHMtPnN0YXRlICYgU1JWX0JBQ0tVUCkgPwotCQkmcy0+cHJveHktPmxicHJtLmZ3cnIuYmNrIDoKLQkJJnMtPnByb3h5LT5sYnBybS5md3JyLmFjdDsKLQotCXMtPm5wb3MgKz0gZ3JwLT5jdXJyX3dlaWdodDsKLX0KLQotLyogcHJlcGFyZXMgYSBzZXJ2ZXIgd2hlbiBpdCB3YXMgbWFya2VkIGRvd24gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX2dldF9zcnZfZG93bihzdHJ1Y3Qgc2VydmVyICpzKQotewotCXN0cnVjdCBmd3JyX2dyb3VwICpncnAgPSAocy0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/Ci0JCSZzLT5wcm94eS0+bGJwcm0uZndyci5iY2sgOgotCQkmcy0+cHJveHktPmxicHJtLmZ3cnIuYWN0OwotCi0Jcy0+bnBvcyA9IGdycC0+Y3Vycl9wb3M7Ci19Ci0KLS8qIHByZXBhcmVzIGEgc2VydmVyIHdoZW4gZXh0cmFjdGluZyBpdCBmcm9tIGl0cyB0cmVlICovCi1zdGF0aWMgdm9pZCBmd3JyX2dldF9zcnYoc3RydWN0IHNlcnZlciAqcykKLXsKLQlzdHJ1Y3QgcHJveHkgKnAgPSBzLT5wcm94eTsKLQlzdHJ1Y3QgZndycl9ncm91cCAqZ3JwID0gKHMtPnN0YXRlICYgU1JWX0JBQ0tVUCkgPwotCQkmcC0+bGJwcm0uZndyci5iY2sgOgotCQkmcC0+bGJwcm0uZndyci5hY3Q7Ci0KLQlpZiAocy0+bGJfdHJlZSA9PSBncnAtPmluaXQpIHsKLQkJZndycl9nZXRfc3J2X2luaXQocyk7Ci0JfQotCWVsc2UgaWYgKHMtPmxiX3RyZWUgPT0gZ3JwLT5uZXh0KSB7Ci0JCWZ3cnJfZ2V0X3Nydl9uZXh0KHMpOwotCX0KLQllbHNlIGlmIChzLT5sYl90cmVlID09IE5VTEwpIHsKLQkJZndycl9nZXRfc3J2X2Rvd24ocyk7Ci0JfQotfQotCi0vKiBzd2l0Y2hlcyB0cmVlcyAiaW5pdCIgYW5kICJuZXh0IiBmb3IgRldSUiBncm91cCA8Z3JwPi4gImluaXQiIHNob3VsZCBiZSBlbXB0eQotICogd2hlbiB0aGlzIGhhcHBlbnMsIGFuZCAibmV4dCIgZmlsbGVkIHdpdGggc2VydmVycyBzb3J0ZWQgYnkgd2VpZ2h0cy4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGZ3cnJfc3dpdGNoX3RyZWVzKHN0cnVjdCBmd3JyX2dyb3VwICpncnApCi17Ci0Jc3RydWN0IGViX3Jvb3QgKnN3YXA7Ci0Jc3dhcCA9IGdycC0+aW5pdDsKLQlncnAtPmluaXQgPSBncnAtPm5leHQ7Ci0JZ3JwLT5uZXh0ID0gc3dhcDsKLQlncnAtPmN1cnJfd2VpZ2h0ID0gZ3JwLT5uZXh0X3dlaWdodDsKLQlncnAtPmN1cnJfcG9zID0gZ3JwLT5jdXJyX3dlaWdodDsKLX0KLQotLyogcmV0dXJuIG5leHQgc2VydmVyIGZyb20gdGhlIGN1cnJlbnQgdHJlZSBpbiBGV1JSIGdyb3VwIDxncnA+LCBvciBhIHNlcnZlcgotICogZnJvbSB0aGUgImluaXQiIHRyZWUgaWYgYXBwcm9wcmlhdGUuIElmIGJvdGggdHJlZXMgYXJlIGVtcHR5LCByZXR1cm4gTlVMTC4KLSAqLwotc3RhdGljIHN0cnVjdCBzZXJ2ZXIgKmZ3cnJfZ2V0X3NlcnZlcl9mcm9tX2dyb3VwKHN0cnVjdCBmd3JyX2dyb3VwICpncnApCi17Ci0Jc3RydWN0IGViMzJfbm9kZSAqbm9kZTsKLQlzdHJ1Y3Qgc2VydmVyICpzOwotCi0Jbm9kZSA9IGViMzJfZmlyc3QoJmdycC0+Y3Vycik7Ci0JcyA9IGViMzJfZW50cnkobm9kZSwgc3RydWN0IHNlcnZlciwgbGJfbm9kZSk7Ci0JCi0JaWYgKCFub2RlIHx8IHMtPm5wb3MgPiBncnAtPmN1cnJfcG9zKSB7Ci0JCS8qIGVpdGhlciB3ZSBoYXZlIG5vIHNlcnZlciBsZWZ0LCBvciB3ZSBoYXZlIGEgaG9sZSAqLwotCQlzdHJ1Y3QgZWIzMl9ub2RlICpub2RlMjsKLQkJbm9kZTIgPSBlYjMyX2ZpcnN0KGdycC0+aW5pdCk7Ci0JCWlmIChub2RlMikgewotCQkJbm9kZSA9IG5vZGUyOwotCQkJcyA9IGViMzJfZW50cnkobm9kZSwgc3RydWN0IHNlcnZlciwgbGJfbm9kZSk7Ci0JCQlmd3JyX2dldF9zcnZfaW5pdChzKTsKLQkJCWlmIChzLT5ld2VpZ2h0ID09IDApIC8qIEZJWE1FOiBpcyBpdCBwb3NzaWJsZSBhdCBhbGwgPyAqLwotCQkJCW5vZGUgPSBOVUxMOwotCQl9Ci0JfQotCWlmIChub2RlKQotCQlyZXR1cm4gczsKLQllbHNlCi0JCXJldHVybiBOVUxMOwotfQotCi0vKiBDb21wdXRlcyBuZXh0IHBvc2l0aW9uIG9mIHNlcnZlciA8cz4gaW4gdGhlIGdyb3VwLiBJdCBpcyBtYW5kYXRvcnkgZm9yIDxzPgotICogdG8gaGF2ZSBhIG5vbi16ZXJvLCBwb3NpdGl2ZSBld2VpZ2h0LgotKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3VwZGF0ZV9wb3NpdGlvbihzdHJ1Y3QgZndycl9ncm91cCAqZ3JwLCBzdHJ1Y3Qgc2VydmVyICpzKQotewotCWlmICghcy0+bnBvcykgewotCQkvKiBmaXJzdCB0aW1lIGV2ZXIgZm9yIHRoaXMgc2VydmVyICovCi0JCXMtPmxwb3MgPSBncnAtPmN1cnJfcG9zOwotCQlzLT5ucG9zID0gZ3JwLT5jdXJyX3BvcyArIGdycC0+bmV4dF93ZWlnaHQgLyBzLT5ld2VpZ2h0OwotCQlzLT5yd2VpZ2h0ICs9IGdycC0+bmV4dF93ZWlnaHQgJSBzLT5ld2VpZ2h0OwotCi0JCWlmIChzLT5yd2VpZ2h0ID49IHMtPmV3ZWlnaHQpIHsKLQkJCXMtPnJ3ZWlnaHQgLT0gcy0+ZXdlaWdodDsKLQkJCXMtPm5wb3MrKzsKLQkJfQotCX0gZWxzZSB7Ci0JCXMtPmxwb3MgPSBzLT5ucG9zOwotCQlzLT5ucG9zICs9IGdycC0+bmV4dF93ZWlnaHQgLyBzLT5ld2VpZ2h0OwotCQlzLT5yd2VpZ2h0ICs9IGdycC0+bmV4dF93ZWlnaHQgJSBzLT5ld2VpZ2h0OwotCi0JCWlmIChzLT5yd2VpZ2h0ID49IHMtPmV3ZWlnaHQpIHsKLQkJCXMtPnJ3ZWlnaHQgLT0gcy0+ZXdlaWdodDsKLQkJCXMtPm5wb3MrKzsKLQkJfQotCX0KLX0KLQotLyogUmV0dXJuIG5leHQgc2VydmVyIGZyb20gdGhlIGN1cnJlbnQgdHJlZSBpbiBiYWNrZW5kIDxwPiwgb3IgYSBzZXJ2ZXIgZnJvbQotICogdGhlIGluaXQgdHJlZSBpZiBhcHByb3ByaWF0ZS4gSWYgYm90aCB0cmVlcyBhcmUgZW1wdHksIHJldHVybiBOVUxMLgotICogU2F0dXJhdGVkIHNlcnZlcnMgYXJlIHNraXBwZWQgYW5kIHJlcXVldWVkLgotICovCi1zdGF0aWMgc3RydWN0IHNlcnZlciAqZndycl9nZXRfbmV4dF9zZXJ2ZXIoc3RydWN0IHByb3h5ICpwLCBzdHJ1Y3Qgc2VydmVyICpzcnZ0b2F2b2lkKQotewotCXN0cnVjdCBzZXJ2ZXIgKnNydiwgKmZ1bGwsICphdm9pZGVkOwotCXN0cnVjdCBmd3JyX2dyb3VwICpncnA7Ci0JaW50IHN3aXRjaGVkOwotCi0JaWYgKHAtPnNydl9hY3QpCi0JCWdycCA9ICZwLT5sYnBybS5md3JyLmFjdDsKLQllbHNlIGlmIChwLT5sYnBybS5mYmNrKQotCQlyZXR1cm4gcC0+bGJwcm0uZmJjazsKLQllbHNlIGlmIChwLT5zcnZfYmNrKQotCQlncnAgPSAmcC0+bGJwcm0uZndyci5iY2s7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLQotCXN3aXRjaGVkID0gMDsKLQlhdm9pZGVkID0gTlVMTDsKLQlmdWxsID0gTlVMTDsgLyogTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2Ygc2F0dXJhdGVkIHNlcnZlcnMgKi8KLQl3aGlsZSAoMSkgewotCQkvKiBpZiB3ZSBzZWUgYW4gZW1wdHkgZ3JvdXAsIGxldCdzIGZpcnN0IHRyeSB0byBjb2xsZWN0IHdlaWdodHMKLQkJICogd2hpY2ggbWlnaHQgaGF2ZSByZWNlbnRseSBjaGFuZ2VkLgotCQkgKi8KLQkJaWYgKCFncnAtPmN1cnJfd2VpZ2h0KQotCQkJZ3JwLT5jdXJyX3BvcyA9IGdycC0+Y3Vycl93ZWlnaHQgPSBncnAtPm5leHRfd2VpZ2h0OwotCi0JCS8qIGdldCBmaXJzdCBzZXJ2ZXIgZnJvbSB0aGUgImN1cnJlbnQiIHRyZWUuIFdoZW4gdGhlIGVuZCBvZgotCQkgKiB0aGUgdHJlZSBpcyByZWFjaGVkLCB3ZSBtYXkgaGF2ZSB0byBzd2l0Y2gsIGJ1dCBvbmx5IG9uY2UuCi0JCSAqLwotCQl3aGlsZSAoMSkgewotCQkJc3J2ID0gZndycl9nZXRfc2VydmVyX2Zyb21fZ3JvdXAoZ3JwKTsKLQkJCWlmIChzcnYpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoc3dpdGNoZWQpIHsKLQkJCQlpZiAoYXZvaWRlZCkgewotCQkJCQlzcnYgPSBhdm9pZGVkOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZ290byByZXF1ZXVlX3NlcnZlcnM7Ci0JCQl9Ci0JCQlzd2l0Y2hlZCA9IDE7Ci0JCQlmd3JyX3N3aXRjaF90cmVlcyhncnApOwotCi0JCX0KLQotCQkvKiBPSywgd2UgaGF2ZSBhIHNlcnZlci4gSG93ZXZlciwgaXQgbWF5IGJlIHNhdHVyYXRlZCwgaW4gd2hpY2gKLQkJICogY2FzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29uc2lkZXIgaXQgZm9yIG5vdy4gV2UnbGwgdXBkYXRlCi0JCSAqIGl0cyBwb3NpdGlvbiBhbmQgZGVxdWV1ZSBpdCBhbnl3YXksIHNvIHRoYXQgd2UgY2FuIG1vdmUgaXQKLQkJICogdG8gYSBiZXR0ZXIgcGxhY2UgYWZ0ZXJ3YXJkcy4KLQkJICovCi0JCWZ3cnJfdXBkYXRlX3Bvc2l0aW9uKGdycCwgc3J2KTsKLQkJZndycl9kZXF1ZXVlX3NydihzcnYpOwotCQlncnAtPmN1cnJfcG9zKys7Ci0JCWlmICghc3J2LT5tYXhjb25uIHx8ICghc3J2LT5uYnBlbmQgJiYgc3J2LT5zZXJ2ZWQgPCBzcnZfZHluYW1pY19tYXhjb25uKHNydikpKSB7Ci0JCQkvKiBtYWtlIHN1cmUgaXQgaXMgbm90IHRoZSBzZXJ2ZXIgd2UgYXJlIHRyeWluZyB0byBleGNsdWRlLi4uICovCi0JCQlpZiAoc3J2ICE9IHNydnRvYXZvaWQgfHwgYXZvaWRlZCkKLQkJCQlicmVhazsKLQotCQkJYXZvaWRlZCA9IHNydjsgLyogLi4uYnV0IHJlbWVtYmVyIHRoYXQgaXMgd2FzIHNlbGVjdGVkIHlldCBhdm9pZGVkICovCi0JCX0KLQotCQkvKiB0aGUgc2VydmVyIGlzIHNhdHVyYXRlZCBvciBhdm9pZGVkLCBsZXQncyBjaGFpbiBpdCBmb3IgbGF0ZXIgcmVpbnNlcnRpb24gKi8KLQkJc3J2LT5uZXh0X2Z1bGwgPSBmdWxsOwotCQlmdWxsID0gc3J2OwotCX0KLQotCS8qIE9LLCB3ZSBnb3QgdGhlIGJlc3Qgc2VydmVyLCBsZXQncyB1cGRhdGUgaXQgKi8KLQlmd3JyX3F1ZXVlX3NydihzcnYpOwotCi0gcmVxdWV1ZV9zZXJ2ZXJzOgotCS8qIFJlcXVldWUgYWxsIGV4dHJhY3RlZCBzZXJ2ZXJzLiBJZiBmdWxsPT1zcnYgdGhlbiBpdCB3YXMKLQkgKiBhdm9pZGVkICh1bnN1Y2Vzc2Z1bGx5KSBhbmQgY2hhaW5lZCwgb21pdCBpdCBub3cuCi0JICovCi0JaWYgKHVubGlrZWx5KGZ1bGwgIT0gTlVMTCkpIHsKLQkJaWYgKHN3aXRjaGVkKSB7Ci0JCQkvKiB0aGUgdHJlZSBoYXMgc3dpdGNoZWQsIHJlcXVldWUgYWxsIGV4dHJhY3RlZCBzZXJ2ZXJzCi0JCQkgKiBpbnRvICJpbml0IiwgYmVjYXVzZSB0aGVpciBwbGFjZSB3YXMgbG9zdCwgYW5kIG9ubHkKLQkJCSAqIHRoZWlyIHdlaWdodCBtYXR0ZXJzLgotCQkJICovCi0JCQlkbyB7Ci0JCQkJaWYgKGxpa2VseShmdWxsICE9IHNydikpCi0JCQkJCWZ3cnJfcXVldWVfYnlfd2VpZ2h0KGdycC0+aW5pdCwgZnVsbCk7Ci0JCQkJZnVsbCA9IGZ1bGwtPm5leHRfZnVsbDsKLQkJCX0gd2hpbGUgKGZ1bGwpOwotCQl9IGVsc2UgewotCQkJLyogcmVxdWV1ZSBhbGwgZXh0cmFjdGVkIHNlcnZlcnMganVzdCBhcyBpZiB0aGV5IHdlcmUgY29uc3VtZWQKLQkJCSAqIHNvIHRoYXQgdGhleSByZWdhaW4gdGhlaXIgZXhwZWN0ZWQgcGxhY2UuCi0JCQkgKi8KLQkJCWRvIHsKLQkJCQlpZiAobGlrZWx5KGZ1bGwgIT0gc3J2KSkKLQkJCQkJZndycl9xdWV1ZV9zcnYoZnVsbCk7Ci0JCQkJZnVsbCA9IGZ1bGwtPm5leHRfZnVsbDsKLQkJCX0gd2hpbGUgKGZ1bGwpOwotCQl9Ci0JfQotCXJldHVybiBzcnY7CiB9CiAKLS8qIFJlbW92ZSBhIHNlcnZlciBmcm9tIGEgdHJlZS4gSXQgbXVzdCBoYXZlIHByZXZpb3VzbHkgYmVlbiBkZXF1ZXVlZC4gVGhpcwotICogZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgY2FsbGVkIHdoZW4gYSBzZXJ2ZXIgaXMgZ29pbmcgZG93biBvciBoYXMgaXRzCi0gKiB3ZWlnaHQgZGlzYWJsZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmd2xjX3JlbW92ZV9mcm9tX3RyZWUoc3RydWN0IHNlcnZlciAqcykKLXsKLQlzLT5sYl90cmVlID0gTlVMTDsKLX0KLQotLyogc2ltcGx5IHJlbW92ZXMgYSBzZXJ2ZXIgZnJvbSBhIHRyZWUgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmd2xjX2RlcXVldWVfc3J2KHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0JZWIzMl9kZWxldGUoJnMtPmxiX25vZGUpOwotfQotCi0vKiBRdWV1ZSBhIHNlcnZlciBpbiBpdHMgYXNzb2NpYXRlZCB0cmVlLCBhc3N1bWluZyB0aGUgd2VpZ2h0IGlzID4wLgotICogU2VydmVycyBhcmUgc29ydGVkIGJ5ICNjb25ucy93ZWlnaHQuIFRvIGVuc3VyZSBtYXhpbXVtIGFjY3VyYWN5LAotICogd2UgdXNlICNjb25ucypTUlZfRVdHSFRfTUFYL2V3ZWlnaHQgYXMgdGhlIHNvcnRpbmcga2V5LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndsY19xdWV1ZV9zcnYoc3RydWN0IHNlcnZlciAqcykKLXsKLQlzLT5sYl9ub2RlLmtleSA9IHMtPnNlcnZlZCAqIFNSVl9FV0dIVF9NQVggLyBzLT5ld2VpZ2h0OwotCWViMzJfaW5zZXJ0KHMtPmxiX3RyZWUsICZzLT5sYl9ub2RlKTsKLX0KLQotLyogUmUtcG9zaXRpb24gdGhlIHNlcnZlciBpbiB0aGUgRldMQyB0cmVlIGFmdGVyIGl0IGhhcyBiZWVuIGFzc2lnbmVkIG9uZQotICogY29ubmVjdGlvbiBvciBhZnRlciBpdCBoYXMgcmVsZWFzZWQgb25lLiBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdGhhdAotICogdGhlIHNlcnZlciBoYXMgYmVlbiBtb3ZlZCBvdXQgb2YgdGhlIHRyZWUgZHVlIHRvIGZhaWxlZCBoZWFsdGgtY2hlY2tzLgotICovCi1zdGF0aWMgdm9pZCBmd2xjX3Nydl9yZXBvc2l0aW9uKHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0JaWYgKCFzLT5sYl90cmVlKQotCQlyZXR1cm47Ci0JZndsY19kZXF1ZXVlX3NydihzKTsKLQlmd2xjX3F1ZXVlX3NydihzKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBzZXJ2ZXIgdHJlZXMgYWNjb3JkaW5nIHRvIHNlcnZlciA8c3J2PidzIG5ldwotICogc3RhdGUuIEl0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBzZXJ2ZXIgPHNydj4ncyBzdGF0dXMgY2hhbmdlcyB0byBkb3duLgotICogSXQgaXMgbm90IGltcG9ydGFudCB3aGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGFscmVhZHkgZG93biBvciBub3QuIEl0IGlzIG5vdAotICogaW1wb3J0YW50IGVpdGhlciB0aGF0IHRoZSBuZXcgc3RhdGUgaXMgY29tcGxldGVseSBkb3duICh0aGUgY2FsbGVyIG1heSBub3QKLSAqIGtub3cgYWxsIHRoZSB2YXJpYWJsZXMgb2YgYSBzZXJ2ZXIncyBzdGF0ZSkuCi0gKi8KLXN0YXRpYyB2b2lkIGZ3bGNfc2V0X3NlcnZlcl9zdGF0dXNfZG93bihzdHJ1Y3Qgc2VydmVyICpzcnYpCi17Ci0Jc3RydWN0IHByb3h5ICpwID0gc3J2LT5wcm94eTsKLQotCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgotCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCi0JCXJldHVybjsKLQotCWlmIChzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCi0JCWdvdG8gb3V0X3VwZGF0ZV9zdGF0ZTsKLQotCWlmICghc3J2X2lzX3VzYWJsZShzcnYtPnByZXZfc3RhdGUsIHNydi0+cHJldl9ld2VpZ2h0KSkKLQkJLyogc2VydmVyIHdhcyBhbHJlYWR5IGRvd24gKi8KLQkJZ290byBvdXRfdXBkYXRlX2JhY2tlbmQ7Ci0KLQlpZiAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApIHsKLQkJcC0+bGJwcm0udG90X3diY2sgLT0gc3J2LT5wcmV2X2V3ZWlnaHQ7Ci0JCXAtPnNydl9iY2stLTsKLQotCQlpZiAoc3J2ID09IHAtPmxicHJtLmZiY2spIHsKLQkJCS8qIHdlIGxvc3QgdGhlIGZpcnN0IGJhY2t1cCBzZXJ2ZXIgaW4gYSBzaW5nbGUtYmFja3VwCi0JCQkgKiBjb25maWd1cmF0aW9uLCB3ZSBtdXN0IHNlYXJjaCBhbm90aGVyIG9uZS4KLQkJCSAqLwotCQkJc3RydWN0IHNlcnZlciAqc3J2MiA9IHAtPmxicHJtLmZiY2s7Ci0JCQlkbyB7Ci0JCQkJc3J2MiA9IHNydjItPm5leHQ7Ci0JCQl9IHdoaWxlIChzcnYyICYmCi0JCQkJICEoKHNydjItPnN0YXRlICYgU1JWX0JBQ0tVUCkgJiYKLQkJCQkgICBzcnZfaXNfdXNhYmxlKHNydjItPnN0YXRlLCBzcnYyLT5ld2VpZ2h0KSkpOwotCQkJcC0+bGJwcm0uZmJjayA9IHNydjI7Ci0JCX0KLQl9IGVsc2UgewotCQlwLT5sYnBybS50b3Rfd2FjdCAtPSBzcnYtPnByZXZfZXdlaWdodDsKLQkJcC0+c3J2X2FjdC0tOwotCX0KLQotCWZ3bGNfZGVxdWV1ZV9zcnYoc3J2KTsKLQlmd2xjX3JlbW92ZV9mcm9tX3RyZWUoc3J2KTsKLQotb3V0X3VwZGF0ZV9iYWNrZW5kOgotCS8qIGNoZWNrL3VwZGF0ZSB0b3RfdXNlZCwgdG90X3dlaWdodCAqLwotCXVwZGF0ZV9iYWNrZW5kX3dlaWdodChwKTsKLSBvdXRfdXBkYXRlX3N0YXRlOgotCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7Ci0Jc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgc2VydmVyIHRyZWVzIGFjY29yZGluZyB0byBzZXJ2ZXIgPHNydj4ncyBuZXcKLSAqIHN0YXRlLiBJdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gc2VydmVyIDxzcnY+J3Mgc3RhdHVzIGNoYW5nZXMgdG8gdXAuCi0gKiBJdCBpcyBub3QgaW1wb3J0YW50IHdoZXRoZXIgdGhlIHNlcnZlciB3YXMgYWxyZWFkeSBkb3duIG9yIG5vdC4gSXQgaXMgbm90Ci0gKiBpbXBvcnRhbnQgZWl0aGVyIHRoYXQgdGhlIG5ldyBzdGF0ZSBpcyBjb21wbGV0ZWx5IFVQICh0aGUgY2FsbGVyIG1heSBub3QKLSAqIGtub3cgYWxsIHRoZSB2YXJpYWJsZXMgb2YgYSBzZXJ2ZXIncyBzdGF0ZSkuIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgY2hhbmdlCi0gKiB0aGUgd2VpZ2h0IG9mIGEgc2VydmVyIHdoaWNoIHdhcyBhbHJlYWR5IHVwLgotICovCi1zdGF0aWMgdm9pZCBmd2xjX3NldF9zZXJ2ZXJfc3RhdHVzX3VwKHN0cnVjdCBzZXJ2ZXIgKnNydikKLXsKLQlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OwotCi0JaWYgKHNydi0+c3RhdGUgPT0gc3J2LT5wcmV2X3N0YXRlICYmCi0JICAgIHNydi0+ZXdlaWdodCA9PSBzcnYtPnByZXZfZXdlaWdodCkKLQkJcmV0dXJuOwotCi0JaWYgKCFzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCi0JCWdvdG8gb3V0X3VwZGF0ZV9zdGF0ZTsKLQotCWlmIChzcnZfaXNfdXNhYmxlKHNydi0+cHJldl9zdGF0ZSwgc3J2LT5wcmV2X2V3ZWlnaHQpKQotCQkvKiBzZXJ2ZXIgd2FzIGFscmVhZHkgdXAgKi8KLQkJZ290byBvdXRfdXBkYXRlX2JhY2tlbmQ7Ci0KLQlpZiAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApIHsKLQkJc3J2LT5sYl90cmVlID0gJnAtPmxicHJtLmZ3bGMuYmNrOwotCQlwLT5sYnBybS50b3Rfd2JjayArPSBzcnYtPmV3ZWlnaHQ7Ci0JCXAtPnNydl9iY2srKzsKLQotCQlpZiAoIShwLT5vcHRpb25zICYgUFJfT19VU0VfQUxMX0JLKSkgewotCQkJaWYgKCFwLT5sYnBybS5mYmNrKSB7Ci0JCQkJLyogdGhlcmUgd2FzIG5vIGJhY2t1cCBzZXJ2ZXIgYW55bW9yZSAqLwotCQkJCXAtPmxicHJtLmZiY2sgPSBzcnY7Ci0JCQl9IGVsc2UgewotCQkJCS8qIHdlIG1heSBoYXZlIHJlc3RvcmVkIGEgYmFja3VwIHNlcnZlciBwcmlvciB0byBmYmNrLAotCQkJCSAqIGluIHdoaWNoIGNhc2UgaXQgc2hvdWxkIHJlcGxhY2UgaXQuCi0JCQkJICovCi0JCQkJc3RydWN0IHNlcnZlciAqc3J2MiA9IHNydjsKLQkJCQlkbyB7Ci0JCQkJCXNydjIgPSBzcnYyLT5uZXh0OwotCQkJCX0gd2hpbGUgKHNydjIgJiYgKHNydjIgIT0gcC0+bGJwcm0uZmJjaykpOwotCQkJCWlmIChzcnYyKQotCQkJCQlwLT5sYnBybS5mYmNrID0gc3J2OwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJc3J2LT5sYl90cmVlID0gJnAtPmxicHJtLmZ3bGMuYWN0OwotCQlwLT5sYnBybS50b3Rfd2FjdCArPSBzcnYtPmV3ZWlnaHQ7Ci0JCXAtPnNydl9hY3QrKzsKLQl9Ci0KLQkvKiBub3RlIHRoYXQgZXdlaWdodCBjYW5ub3QgYmUgMCBoZXJlICovCi0JZndsY19xdWV1ZV9zcnYoc3J2KTsKLQotIG91dF91cGRhdGVfYmFja2VuZDoKLQkvKiBjaGVjay91cGRhdGUgdG90X3VzZWQsIHRvdF93ZWlnaHQgKi8KLQl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7Ci0gb3V0X3VwZGF0ZV9zdGF0ZToKLQlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOwotCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFuIHVwZGF0ZSB0byBzZXJ2ZXIgPHNydj4ncyBlZmZlY3RpdmUKLSAqIHdlaWdodC4gSXQgbWF5IGJlIGNhbGxlZCBhZnRlciBhIHN0YXRlIGNoYW5nZSB0b28uCi0gKi8KLXN0YXRpYyB2b2lkIGZ3bGNfdXBkYXRlX3NlcnZlcl93ZWlnaHQoc3RydWN0IHNlcnZlciAqc3J2KQotewotCWludCBvbGRfc3RhdGUsIG5ld19zdGF0ZTsKLQlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OwotCi0JaWYgKHNydi0+c3RhdGUgPT0gc3J2LT5wcmV2X3N0YXRlICYmCi0JICAgIHNydi0+ZXdlaWdodCA9PSBzcnYtPnByZXZfZXdlaWdodCkKLQkJcmV0dXJuOwotCi0JLyogSWYgY2hhbmdpbmcgdGhlIHNlcnZlcidzIHdlaWdodCBjaGFuZ2VzIGl0cyBzdGF0ZSwgd2Ugc2ltcGx5IGFwcGx5Ci0JICogdGhlIHByb2NlZHVyZXMgd2UgYWxyZWFkeSBoYXZlIGZvciBzdGF0dXMgY2hhbmdlLiBJZiB0aGUgc3RhdGUKLQkgKiByZW1haW5zIGRvd24sIHRoZSBzZXJ2ZXIgaXMgbm90IGluIGFueSB0cmVlLCBzbyBpdCdzIGFzIGVhc3kgYXMKLQkgKiB1cGRhdGluZyBpdHMgdmFsdWVzLiBJZiB0aGUgc3RhdGUgcmVtYWlucyB1cCB3aXRoIGRpZmZlcmVudCB3ZWlnaHRzLAotCSAqIHRoZXJlIGFyZSBzb21lIGNvbXB1dGF0aW9ucyB0byBwZXJmb3JtIHRvIGZpbmQgYSBuZXcgcGxhY2UgYW5kCi0JICogcG9zc2libHkgYSBuZXcgdHJlZSBmb3IgdGhpcyBzZXJ2ZXIuCi0JICovCi0JIAotCW9sZF9zdGF0ZSA9IHNydl9pc191c2FibGUoc3J2LT5wcmV2X3N0YXRlLCBzcnYtPnByZXZfZXdlaWdodCk7Ci0JbmV3X3N0YXRlID0gc3J2X2lzX3VzYWJsZShzcnYtPnN0YXRlLCBzcnYtPmV3ZWlnaHQpOwotCi0JaWYgKCFvbGRfc3RhdGUgJiYgIW5ld19zdGF0ZSkgewotCQlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOwotCQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKLQkJcmV0dXJuOwotCX0KLQllbHNlIGlmICghb2xkX3N0YXRlICYmIG5ld19zdGF0ZSkgewotCQlmd2xjX3NldF9zZXJ2ZXJfc3RhdHVzX3VwKHNydik7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSBpZiAob2xkX3N0YXRlICYmICFuZXdfc3RhdGUpIHsKLQkJZndsY19zZXRfc2VydmVyX3N0YXR1c19kb3duKHNydik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoc3J2LT5sYl90cmVlKQotCQlmd2xjX2RlcXVldWVfc3J2KHNydik7Ci0KLQlpZiAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApIHsKLQkJcC0+bGJwcm0udG90X3diY2sgKz0gc3J2LT5ld2VpZ2h0IC0gc3J2LT5wcmV2X2V3ZWlnaHQ7Ci0JCXNydi0+bGJfdHJlZSA9ICZwLT5sYnBybS5md2xjLmJjazsKLQl9IGVsc2UgewotCQlwLT5sYnBybS50b3Rfd2FjdCArPSBzcnYtPmV3ZWlnaHQgLSBzcnYtPnByZXZfZXdlaWdodDsKLQkJc3J2LT5sYl90cmVlID0gJnAtPmxicHJtLmZ3bGMuYWN0OwotCX0KLQotCWZ3bGNfcXVldWVfc3J2KHNydik7Ci0KLQl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7Ci0Jc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYnVpbGRpbmcgdGhlIHRyZWVzIGluIGNhc2Ugb2YgZmFzdAotICogd2VpZ2h0ZWQgbGVhc3QtY29ubnMuIEl0IGFsc28gc2V0cyBwLT5sYnBybS53ZGl2IHRvIHRoZSBld2VpZ2h0IHRvCi0gKiB1d2VpZ2h0IHJhdGlvLiBCb3RoIGFjdGl2ZSBhbmQgYmFja3VwIGdyb3VwcyBhcmUgaW5pdGlhbGl6ZWQuCi0gKi8KLXZvaWQgZndsY19pbml0X3NlcnZlcl90cmVlKHN0cnVjdCBwcm94eSAqcCkKLXsKLQlzdHJ1Y3Qgc2VydmVyICpzcnY7Ci0Jc3RydWN0IGViX3Jvb3QgaW5pdF9oZWFkID0gRUJfUk9PVDsKLQotCXAtPmxicHJtLnNldF9zZXJ2ZXJfc3RhdHVzX3VwICAgPSBmd2xjX3NldF9zZXJ2ZXJfc3RhdHVzX3VwOwotCXAtPmxicHJtLnNldF9zZXJ2ZXJfc3RhdHVzX2Rvd24gPSBmd2xjX3NldF9zZXJ2ZXJfc3RhdHVzX2Rvd247Ci0JcC0+bGJwcm0udXBkYXRlX3NlcnZlcl9ld2VpZ2h0ICA9IGZ3bGNfdXBkYXRlX3NlcnZlcl93ZWlnaHQ7Ci0JcC0+bGJwcm0uc2VydmVyX3Rha2VfY29ubiA9IGZ3bGNfc3J2X3JlcG9zaXRpb247Ci0JcC0+bGJwcm0uc2VydmVyX2Ryb3BfY29ubiA9IGZ3bGNfc3J2X3JlcG9zaXRpb247Ci0KLQlwLT5sYnBybS53ZGl2ID0gQkVfV0VJR0hUX1NDQUxFOwotCWZvciAoc3J2ID0gcC0+c3J2OyBzcnY7IHNydiA9IHNydi0+bmV4dCkgewotCQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodCA9IHNydi0+dXdlaWdodCAqIEJFX1dFSUdIVF9TQ0FMRTsKLQkJc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQl9Ci0KLQlyZWNvdW50X3NlcnZlcnMocCk7Ci0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotCi0JcC0+bGJwcm0uZndsYy5hY3QgPSBpbml0X2hlYWQ7Ci0JcC0+bGJwcm0uZndsYy5iY2sgPSBpbml0X2hlYWQ7Ci0KLQkvKiBxdWV1ZSBhY3RpdmUgYW5kIGJhY2t1cCBzZXJ2ZXJzIGluIHR3byBkaXN0aW5jdCBncm91cHMgKi8KLQlmb3IgKHNydiA9IHAtPnNydjsgc3J2OyBzcnYgPSBzcnYtPm5leHQpIHsKLQkJaWYgKCFzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCi0JCQljb250aW51ZTsKLQkJc3J2LT5sYl90cmVlID0gKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/ICZwLT5sYnBybS5md2xjLmJjayA6ICZwLT5sYnBybS5md2xjLmFjdDsKLQkJZndsY19xdWV1ZV9zcnYoc3J2KTsKLQl9Ci19Ci0KLS8qIFJldHVybiBuZXh0IHNlcnZlciBmcm9tIHRoZSBGV0xDIHRyZWUgaW4gYmFja2VuZCA8cD4uIElmIHRoZSB0cmVlIGlzIGVtcHR5LAotICogcmV0dXJuIE5VTEwuIFNhdHVyYXRlZCBzZXJ2ZXJzIGFyZSBza2lwcGVkLgotICovCi1zdGF0aWMgc3RydWN0IHNlcnZlciAqZndsY19nZXRfbmV4dF9zZXJ2ZXIoc3RydWN0IHByb3h5ICpwLCBzdHJ1Y3Qgc2VydmVyICpzcnZ0b2F2b2lkKQotewotCXN0cnVjdCBzZXJ2ZXIgKnNydiwgKmF2b2lkZWQ7Ci0Jc3RydWN0IGViMzJfbm9kZSAqbm9kZTsKLQotCXNydiA9IGF2b2lkZWQgPSBOVUxMOwotCi0JaWYgKHAtPnNydl9hY3QpCi0JCW5vZGUgPSBlYjMyX2ZpcnN0KCZwLT5sYnBybS5md2xjLmFjdCk7Ci0JZWxzZSBpZiAocC0+bGJwcm0uZmJjaykKLQkJcmV0dXJuIHAtPmxicHJtLmZiY2s7Ci0JZWxzZSBpZiAocC0+c3J2X2JjaykKLQkJbm9kZSA9IGViMzJfZmlyc3QoJnAtPmxicHJtLmZ3bGMuYmNrKTsKLQllbHNlCi0JCXJldHVybiBOVUxMOwotCi0Jd2hpbGUgKG5vZGUpIHsKLQkJLyogT0ssIHdlIGhhdmUgYSBzZXJ2ZXIuIEhvd2V2ZXIsIGl0IG1heSBiZSBzYXR1cmF0ZWQsIGluIHdoaWNoCi0JCSAqIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvbnNpZGVyIGl0IGZvciBub3csIHNvIHdlJ2xsIHNpbXBseQotCQkgKiBza2lwIGl0LiBTYW1lIGlmIGl0J3MgdGhlIHNlcnZlciB3ZSB0cnkgdG8gYXZvaWQsIGluIHdoaWNoCi0JCSAqIGNhc2Ugd2Ugc2ltcGx5IHJlbWVtYmVyIGl0IGZvciBsYXRlciB1c2UgaWYgbmVlZGVkLgotCQkgKi8KLQkJc3RydWN0IHNlcnZlciAqczsKLQotCQlzID0gZWIzMl9lbnRyeShub2RlLCBzdHJ1Y3Qgc2VydmVyLCBsYl9ub2RlKTsKLQkJaWYgKCFzLT5tYXhjb25uIHx8ICghcy0+bmJwZW5kICYmIHMtPnNlcnZlZCA8IHNydl9keW5hbWljX21heGNvbm4ocykpKSB7Ci0JCQlpZiAocyAhPSBzcnZ0b2F2b2lkKSB7Ci0JCQkJc3J2ID0gczsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWF2b2lkZWQgPSBzOwotCQl9Ci0JCW5vZGUgPSBlYjMyX25leHQobm9kZSk7Ci0JfQotCi0JaWYgKCFzcnYpCi0JCXNydiA9IGF2b2lkZWQ7Ci0KLQlyZXR1cm4gc3J2OwotfQotCiAvKiAKICAqIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gZmluZCBhIHJ1bm5pbmcgc2VydmVyIGZvciB0aGUgcHJveHkgPHB4PiBmb2xsb3dpbmcKICAqIHRoZSBVUkwgcGFyYW1ldGVyIGhhc2ggbWV0aG9kLiBJdCBsb29rcyBmb3IgYSBzcGVjaWZpYyBwYXJhbWV0ZXIgaW4gdGhlCkBAIC0xNDk1LDcgKzQ4Miw3IEBACiAKIAkJCWlmICghcy0+c3J2KSB7CiAJCQkJLyogcGFyYW1ldGVyIG5vdCBmb3VuZCwgZmFsbCBiYWNrIHRvIHJvdW5kIHJvYmluIG9uIHRoZSBtYXAgKi8KLQkJCQlzLT5zcnYgPSBnZXRfc2VydmVyX3JyX3dpdGhfY29ubnMocy0+YmUsIHMtPnByZXZfc3J2KTsKKwkJCQlzLT5zcnYgPSBtYXBfZ2V0X3NlcnZlcl9ycihzLT5iZSwgcy0+cHJldl9zcnYpOwogCQkJCWlmICghcy0+c3J2KSB7CiAJCQkJCWVyciA9IFNSVl9TVEFUVVNfRlVMTDsKIAkJCQkJZ290byBvdXQ7CkBAIC0xNTA4LDcgKzQ5NSw3IEBACiAKIAkJCWlmICghcy0+c3J2KSB7CiAJCQkJLyogcGFyYW1ldGVyIG5vdCBmb3VuZCwgZmFsbCBiYWNrIHRvIHJvdW5kIHJvYmluIG9uIHRoZSBtYXAgKi8KLQkJCQlzLT5zcnYgPSBnZXRfc2VydmVyX3JyX3dpdGhfY29ubnMocy0+YmUsIHMtPnByZXZfc3J2KTsKKwkJCQlzLT5zcnYgPSBtYXBfZ2V0X3NlcnZlcl9ycihzLT5iZSwgcy0+cHJldl9zcnYpOwogCQkJCWlmICghcy0+c3J2KSB7CiAJCQkJCWVyciA9IFNSVl9TVEFUVVNfRlVMTDsKIAkJCQkJZ290byBvdXQ7CkBAIC0xNTIxLDcgKzUwOCw3IEBACiAKIAkJCWlmICghcy0+c3J2KSB7CiAJCQkJLyogcGFyYW1ldGVyIG5vdCBmb3VuZCwgZmFsbCBiYWNrIHRvIHJvdW5kIHJvYmluIG9uIHRoZSBtYXAgKi8KLQkJCQlzLT5zcnYgPSBnZXRfc2VydmVyX3JyX3dpdGhfY29ubnMocy0+YmUsIHMtPnByZXZfc3J2KTsKKwkJCQlzLT5zcnYgPSBtYXBfZ2V0X3NlcnZlcl9ycihzLT5iZSwgcy0+cHJldl9zcnYpOwogCQkJCWlmICghcy0+c3J2KSB7CiAJCQkJCWVyciA9IFNSVl9TVEFUVVNfRlVMTDsKIAkJCQkJZ290byBvdXQ7CkBAIC0yMTY2LDUzICsxMTUzLDYgQEAKIH0KIAogLyoKLSAqIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gZmluZCBhIHJ1bm5pbmcgc2VydmVyIHdpdGggZnJlZSBjb25uZWN0aW9uIHNsb3RzIGZvcgotICogdGhlIHByb3h5IDxweD4gZm9sbG93aW5nIHRoZSByb3VuZC1yb2JpbiBtZXRob2QuCi0gKiBJZiBhbnkgc2VydmVyIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIGFuZCBweC0+bGJwcm0ubWFwLnJyX2lkeCB3aWxsIGJlIHVwZGF0ZWQKLSAqIHRvIHBvaW50IHRvIHRoZSBuZXh0IHNlcnZlci4gSWYgbm8gdmFsaWQgc2VydmVyIGlzIGZvdW5kLCBOVUxMIGlzIHJldHVybmVkLgotICovCi1zdHJ1Y3Qgc2VydmVyICpnZXRfc2VydmVyX3JyX3dpdGhfY29ubnMoc3RydWN0IHByb3h5ICpweCwgc3RydWN0IHNlcnZlciAqc3J2dG9hdm9pZCkKLXsKLQlpbnQgbmV3aWR4LCBhdm9pZGlkeDsKLQlzdHJ1Y3Qgc2VydmVyICpzcnYsICphdm9pZGVkOwotCi0JaWYgKHB4LT5sYnBybS50b3Rfd2VpZ2h0ID09IDApCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKHB4LT5sYnBybS5tYXAuc3RhdGUgJiBQUl9NQVBfUkVDQUxDKQotCQlyZWNhbGNfc2VydmVyX21hcChweCk7Ci0KLQlpZiAocHgtPmxicHJtLm1hcC5ycl9pZHggPCAwIHx8IHB4LT5sYnBybS5tYXAucnJfaWR4ID49IHB4LT5sYnBybS50b3Rfd2VpZ2h0KQotCQlweC0+bGJwcm0ubWFwLnJyX2lkeCA9IDA7Ci0JbmV3aWR4ID0gcHgtPmxicHJtLm1hcC5ycl9pZHg7Ci0KLQlhdm9pZGVkID0gTlVMTDsKLQlhdm9pZGlkeCA9IDA7IC8qIHNodXQgYSBnY2Mgd2FybmluZyAqLwotCWRvIHsKLQkJc3J2ID0gcHgtPmxicHJtLm1hcC5zcnZbbmV3aWR4KytdOwotCQlpZiAoIXNydi0+bWF4Y29ubiB8fCBzcnYtPmN1cl9zZXNzIDwgc3J2X2R5bmFtaWNfbWF4Y29ubihzcnYpKSB7Ci0JCQkvKiBtYWtlIHN1cmUgaXQgaXMgbm90IHRoZSBzZXJ2ZXIgd2UgYXJlIHRyeSB0byBleGNsdWRlLi4uICovCi0JCQlpZiAoc3J2ICE9IHNydnRvYXZvaWQpIHsKLQkJCQlweC0+bGJwcm0ubWFwLnJyX2lkeCA9IG5ld2lkeDsKLQkJCQlyZXR1cm4gc3J2OwotCQkJfQotCi0JCQlhdm9pZGVkID0gc3J2OwkvKiAuLi5idXQgcmVtZW1iZXIgdGhhdCBpcyB3YXMgc2VsZWN0ZWQgeWV0IGF2b2lkZWQgKi8KLQkJCWF2b2lkaWR4ID0gbmV3aWR4OwotCQl9Ci0JCWlmIChuZXdpZHggPT0gcHgtPmxicHJtLnRvdF93ZWlnaHQpCi0JCQluZXdpZHggPSAwOwotCX0gd2hpbGUgKG5ld2lkeCAhPSBweC0+bGJwcm0ubWFwLnJyX2lkeCk7Ci0KLQlpZiAoYXZvaWRlZCkKLQkJcHgtPmxicHJtLm1hcC5ycl9pZHggPSBhdm9pZGlkeDsKLQotCS8qIHJldHVybiBOVUxMIG9yIHNydnRvYXZvaWQgaWYgZm91bmQgKi8KLQlyZXR1cm4gYXZvaWRlZDsKLX0KLQotCi0vKgogICogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBmaW5kIGEgcnVubmluZyBzZXJ2ZXIgZm9yIHRoZSBwcm94eSA8cHg+IGZvbGxvd2luZwogICogdGhlIHNvdXJjZSBoYXNoIG1ldGhvZC4gRGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgYWN0aXZlL2JhY2t1cCBzZXJ2ZXJzLAogICogaXQgd2lsbCBlaXRoZXIgbG9vayBmb3IgYWN0aXZlIHNlcnZlcnMsIG9yIGZvciBiYWNrdXAgc2VydmVycy4KZGlmZiAtLWdpdCBhL3NyYy9jZmdwYXJzZS5jIGIvc3JjL2NmZ3BhcnNlLmMKaW5kZXggZmQyNzNiMC4uNzkzODY1NCAxMDA2NDQKLS0tIGEvc3JjL2NmZ3BhcnNlLmMKKysrIGIvc3JjL2NmZ3BhcnNlLmMKQEAgLTQyLDYgKzQyLDkgQEAKICNpbmNsdWRlIDxwcm90by9jaGVja3MuaD4KICNpbmNsdWRlIDxwcm90by9kdW1wc3RhdHMuaD4KICNpbmNsdWRlIDxwcm90by9odHRwZXJyLmg+CisjaW5jbHVkZSA8cHJvdG8vbGJfZndsYy5oPgorI2luY2x1ZGUgPHByb3RvL2xiX2Z3cnIuaD4KKyNpbmNsdWRlIDxwcm90by9sYl9tYXAuaD4KICNpbmNsdWRlIDxwcm90by9sb2cuaD4KICNpbmNsdWRlIDxwcm90by9wb3J0X3JhbmdlLmg+CiAjaW5jbHVkZSA8cHJvdG8vcHJvdG9jb2xzLmg+CmRpZmYgLS1naXQgYS9zcmMvbGJfZndsYy5jIGIvc3JjL2xiX2Z3bGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDFhMzFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xiX2Z3bGMuYwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIEZhc3QgV2VpZ2h0ZWQgTGVhc3QgQ29ubmVjdGlvbiBsb2FkIGJhbGFuY2luZyBhbGdvcml0aG0uCisgKgorICogQ29weXJpZ2h0IDIwMDAtMjAwOSBXaWxseSBUYXJyZWF1IDx3QDF3dC5ldT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uL2NvbXBhdC5oPgorI2luY2x1ZGUgPGNvbW1vbi9jb25maWcuaD4KKyNpbmNsdWRlIDxjb21tb24vZGVidWcuaD4KKyNpbmNsdWRlIDxjb21tb24vZWIzMnRyZWUuaD4KKworI2luY2x1ZGUgPHR5cGVzL2dsb2JhbC5oPgorI2luY2x1ZGUgPHR5cGVzL3NlcnZlci5oPgorCisjaW5jbHVkZSA8cHJvdG8vYmFja2VuZC5oPgorI2luY2x1ZGUgPHByb3RvL3F1ZXVlLmg+CisKKworLyogUmVtb3ZlIGEgc2VydmVyIGZyb20gYSB0cmVlLiBJdCBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuIGRlcXVldWVkLiBUaGlzCisgKiBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBjYWxsZWQgd2hlbiBhIHNlcnZlciBpcyBnb2luZyBkb3duIG9yIGhhcyBpdHMKKyAqIHdlaWdodCBkaXNhYmxlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZ3bGNfcmVtb3ZlX2Zyb21fdHJlZShzdHJ1Y3Qgc2VydmVyICpzKQoreworCXMtPmxiX3RyZWUgPSBOVUxMOworfQorCisvKiBzaW1wbHkgcmVtb3ZlcyBhIHNlcnZlciBmcm9tIGEgdHJlZSAqLworc3RhdGljIGlubGluZSB2b2lkIGZ3bGNfZGVxdWV1ZV9zcnYoc3RydWN0IHNlcnZlciAqcykKK3sKKwllYjMyX2RlbGV0ZSgmcy0+bGJfbm9kZSk7Cit9CisKKy8qIFF1ZXVlIGEgc2VydmVyIGluIGl0cyBhc3NvY2lhdGVkIHRyZWUsIGFzc3VtaW5nIHRoZSB3ZWlnaHQgaXMgPjAuCisgKiBTZXJ2ZXJzIGFyZSBzb3J0ZWQgYnkgI2Nvbm5zL3dlaWdodC4gVG8gZW5zdXJlIG1heGltdW0gYWNjdXJhY3ksCisgKiB3ZSB1c2UgI2Nvbm5zKlNSVl9FV0dIVF9NQVgvZXdlaWdodCBhcyB0aGUgc29ydGluZyBrZXkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmd2xjX3F1ZXVlX3NydihzdHJ1Y3Qgc2VydmVyICpzKQoreworCXMtPmxiX25vZGUua2V5ID0gcy0+c2VydmVkICogU1JWX0VXR0hUX01BWCAvIHMtPmV3ZWlnaHQ7CisJZWIzMl9pbnNlcnQocy0+bGJfdHJlZSwgJnMtPmxiX25vZGUpOworfQorCisvKiBSZS1wb3NpdGlvbiB0aGUgc2VydmVyIGluIHRoZSBGV0xDIHRyZWUgYWZ0ZXIgaXQgaGFzIGJlZW4gYXNzaWduZWQgb25lCisgKiBjb25uZWN0aW9uIG9yIGFmdGVyIGl0IGhhcyByZWxlYXNlZCBvbmUuIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0aGF0CisgKiB0aGUgc2VydmVyIGhhcyBiZWVuIG1vdmVkIG91dCBvZiB0aGUgdHJlZSBkdWUgdG8gZmFpbGVkIGhlYWx0aC1jaGVja3MuCisgKi8KK3N0YXRpYyB2b2lkIGZ3bGNfc3J2X3JlcG9zaXRpb24oc3RydWN0IHNlcnZlciAqcykKK3sKKwlpZiAoIXMtPmxiX3RyZWUpCisJCXJldHVybjsKKwlmd2xjX2RlcXVldWVfc3J2KHMpOworCWZ3bGNfcXVldWVfc3J2KHMpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHNlcnZlciB0cmVlcyBhY2NvcmRpbmcgdG8gc2VydmVyIDxzcnY+J3MgbmV3CisgKiBzdGF0ZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHNlcnZlciA8c3J2PidzIHN0YXR1cyBjaGFuZ2VzIHRvIGRvd24uCisgKiBJdCBpcyBub3QgaW1wb3J0YW50IHdoZXRoZXIgdGhlIHNlcnZlciB3YXMgYWxyZWFkeSBkb3duIG9yIG5vdC4gSXQgaXMgbm90CisgKiBpbXBvcnRhbnQgZWl0aGVyIHRoYXQgdGhlIG5ldyBzdGF0ZSBpcyBjb21wbGV0ZWx5IGRvd24gKHRoZSBjYWxsZXIgbWF5IG5vdAorICoga25vdyBhbGwgdGhlIHZhcmlhYmxlcyBvZiBhIHNlcnZlcidzIHN0YXRlKS4KKyAqLworc3RhdGljIHZvaWQgZndsY19zZXRfc2VydmVyX3N0YXR1c19kb3duKHN0cnVjdCBzZXJ2ZXIgKnNydikKK3sKKwlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OworCisJaWYgKHNydi0+c3RhdGUgPT0gc3J2LT5wcmV2X3N0YXRlICYmCisJICAgIHNydi0+ZXdlaWdodCA9PSBzcnYtPnByZXZfZXdlaWdodCkKKwkJcmV0dXJuOworCisJaWYgKHNydl9pc191c2FibGUoc3J2LT5zdGF0ZSwgc3J2LT5ld2VpZ2h0KSkKKwkJZ290byBvdXRfdXBkYXRlX3N0YXRlOworCisJaWYgKCFzcnZfaXNfdXNhYmxlKHNydi0+cHJldl9zdGF0ZSwgc3J2LT5wcmV2X2V3ZWlnaHQpKQorCQkvKiBzZXJ2ZXIgd2FzIGFscmVhZHkgZG93biAqLworCQlnb3RvIG91dF91cGRhdGVfYmFja2VuZDsKKworCWlmIChzcnYtPnN0YXRlICYgU1JWX0JBQ0tVUCkgeworCQlwLT5sYnBybS50b3Rfd2JjayAtPSBzcnYtPnByZXZfZXdlaWdodDsKKwkJcC0+c3J2X2Jjay0tOworCisJCWlmIChzcnYgPT0gcC0+bGJwcm0uZmJjaykgeworCQkJLyogd2UgbG9zdCB0aGUgZmlyc3QgYmFja3VwIHNlcnZlciBpbiBhIHNpbmdsZS1iYWNrdXAKKwkJCSAqIGNvbmZpZ3VyYXRpb24sIHdlIG11c3Qgc2VhcmNoIGFub3RoZXIgb25lLgorCQkJICovCisJCQlzdHJ1Y3Qgc2VydmVyICpzcnYyID0gcC0+bGJwcm0uZmJjazsKKwkJCWRvIHsKKwkJCQlzcnYyID0gc3J2Mi0+bmV4dDsKKwkJCX0gd2hpbGUgKHNydjIgJiYKKwkJCQkgISgoc3J2Mi0+c3RhdGUgJiBTUlZfQkFDS1VQKSAmJgorCQkJCSAgIHNydl9pc191c2FibGUoc3J2Mi0+c3RhdGUsIHNydjItPmV3ZWlnaHQpKSk7CisJCQlwLT5sYnBybS5mYmNrID0gc3J2MjsKKwkJfQorCX0gZWxzZSB7CisJCXAtPmxicHJtLnRvdF93YWN0IC09IHNydi0+cHJldl9ld2VpZ2h0OworCQlwLT5zcnZfYWN0LS07CisJfQorCisJZndsY19kZXF1ZXVlX3NydihzcnYpOworCWZ3bGNfcmVtb3ZlX2Zyb21fdHJlZShzcnYpOworCitvdXRfdXBkYXRlX2JhY2tlbmQ6CisJLyogY2hlY2svdXBkYXRlIHRvdF91c2VkLCB0b3Rfd2VpZ2h0ICovCisJdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOworIG91dF91cGRhdGVfc3RhdGU6CisJc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKKwlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKK30KKworLyogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBzZXJ2ZXIgdHJlZXMgYWNjb3JkaW5nIHRvIHNlcnZlciA8c3J2PidzIG5ldworICogc3RhdGUuIEl0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBzZXJ2ZXIgPHNydj4ncyBzdGF0dXMgY2hhbmdlcyB0byB1cC4KKyAqIEl0IGlzIG5vdCBpbXBvcnRhbnQgd2hldGhlciB0aGUgc2VydmVyIHdhcyBhbHJlYWR5IGRvd24gb3Igbm90LiBJdCBpcyBub3QKKyAqIGltcG9ydGFudCBlaXRoZXIgdGhhdCB0aGUgbmV3IHN0YXRlIGlzIGNvbXBsZXRlbHkgVVAgKHRoZSBjYWxsZXIgbWF5IG5vdAorICoga25vdyBhbGwgdGhlIHZhcmlhYmxlcyBvZiBhIHNlcnZlcidzIHN0YXRlKS4gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjaGFuZ2UKKyAqIHRoZSB3ZWlnaHQgb2YgYSBzZXJ2ZXIgd2hpY2ggd2FzIGFscmVhZHkgdXAuCisgKi8KK3N0YXRpYyB2b2lkIGZ3bGNfc2V0X3NlcnZlcl9zdGF0dXNfdXAoc3RydWN0IHNlcnZlciAqc3J2KQoreworCXN0cnVjdCBwcm94eSAqcCA9IHNydi0+cHJveHk7CisKKwlpZiAoc3J2LT5zdGF0ZSA9PSBzcnYtPnByZXZfc3RhdGUgJiYKKwkgICAgc3J2LT5ld2VpZ2h0ID09IHNydi0+cHJldl9ld2VpZ2h0KQorCQlyZXR1cm47CisKKwlpZiAoIXNydl9pc191c2FibGUoc3J2LT5zdGF0ZSwgc3J2LT5ld2VpZ2h0KSkKKwkJZ290byBvdXRfdXBkYXRlX3N0YXRlOworCisJaWYgKHNydl9pc191c2FibGUoc3J2LT5wcmV2X3N0YXRlLCBzcnYtPnByZXZfZXdlaWdodCkpCisJCS8qIHNlcnZlciB3YXMgYWxyZWFkeSB1cCAqLworCQlnb3RvIG91dF91cGRhdGVfYmFja2VuZDsKKworCWlmIChzcnYtPnN0YXRlICYgU1JWX0JBQ0tVUCkgeworCQlzcnYtPmxiX3RyZWUgPSAmcC0+bGJwcm0uZndsYy5iY2s7CisJCXAtPmxicHJtLnRvdF93YmNrICs9IHNydi0+ZXdlaWdodDsKKwkJcC0+c3J2X2JjaysrOworCisJCWlmICghKHAtPm9wdGlvbnMgJiBQUl9PX1VTRV9BTExfQkspKSB7CisJCQlpZiAoIXAtPmxicHJtLmZiY2spIHsKKwkJCQkvKiB0aGVyZSB3YXMgbm8gYmFja3VwIHNlcnZlciBhbnltb3JlICovCisJCQkJcC0+bGJwcm0uZmJjayA9IHNydjsKKwkJCX0gZWxzZSB7CisJCQkJLyogd2UgbWF5IGhhdmUgcmVzdG9yZWQgYSBiYWNrdXAgc2VydmVyIHByaW9yIHRvIGZiY2ssCisJCQkJICogaW4gd2hpY2ggY2FzZSBpdCBzaG91bGQgcmVwbGFjZSBpdC4KKwkJCQkgKi8KKwkJCQlzdHJ1Y3Qgc2VydmVyICpzcnYyID0gc3J2OworCQkJCWRvIHsKKwkJCQkJc3J2MiA9IHNydjItPm5leHQ7CisJCQkJfSB3aGlsZSAoc3J2MiAmJiAoc3J2MiAhPSBwLT5sYnBybS5mYmNrKSk7CisJCQkJaWYgKHNydjIpCisJCQkJCXAtPmxicHJtLmZiY2sgPSBzcnY7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlzcnYtPmxiX3RyZWUgPSAmcC0+bGJwcm0uZndsYy5hY3Q7CisJCXAtPmxicHJtLnRvdF93YWN0ICs9IHNydi0+ZXdlaWdodDsKKwkJcC0+c3J2X2FjdCsrOworCX0KKworCS8qIG5vdGUgdGhhdCBld2VpZ2h0IGNhbm5vdCBiZSAwIGhlcmUgKi8KKwlmd2xjX3F1ZXVlX3NydihzcnYpOworCisgb3V0X3VwZGF0ZV9iYWNrZW5kOgorCS8qIGNoZWNrL3VwZGF0ZSB0b3RfdXNlZCwgdG90X3dlaWdodCAqLworCXVwZGF0ZV9iYWNrZW5kX3dlaWdodChwKTsKKyBvdXRfdXBkYXRlX3N0YXRlOgorCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7CisJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYW4gdXBkYXRlIHRvIHNlcnZlciA8c3J2PidzIGVmZmVjdGl2ZQorICogd2VpZ2h0LiBJdCBtYXkgYmUgY2FsbGVkIGFmdGVyIGEgc3RhdGUgY2hhbmdlIHRvby4KKyAqLworc3RhdGljIHZvaWQgZndsY191cGRhdGVfc2VydmVyX3dlaWdodChzdHJ1Y3Qgc2VydmVyICpzcnYpCit7CisJaW50IG9sZF9zdGF0ZSwgbmV3X3N0YXRlOworCXN0cnVjdCBwcm94eSAqcCA9IHNydi0+cHJveHk7CisKKwlpZiAoc3J2LT5zdGF0ZSA9PSBzcnYtPnByZXZfc3RhdGUgJiYKKwkgICAgc3J2LT5ld2VpZ2h0ID09IHNydi0+cHJldl9ld2VpZ2h0KQorCQlyZXR1cm47CisKKwkvKiBJZiBjaGFuZ2luZyB0aGUgc2VydmVyJ3Mgd2VpZ2h0IGNoYW5nZXMgaXRzIHN0YXRlLCB3ZSBzaW1wbHkgYXBwbHkKKwkgKiB0aGUgcHJvY2VkdXJlcyB3ZSBhbHJlYWR5IGhhdmUgZm9yIHN0YXR1cyBjaGFuZ2UuIElmIHRoZSBzdGF0ZQorCSAqIHJlbWFpbnMgZG93biwgdGhlIHNlcnZlciBpcyBub3QgaW4gYW55IHRyZWUsIHNvIGl0J3MgYXMgZWFzeSBhcworCSAqIHVwZGF0aW5nIGl0cyB2YWx1ZXMuIElmIHRoZSBzdGF0ZSByZW1haW5zIHVwIHdpdGggZGlmZmVyZW50IHdlaWdodHMsCisJICogdGhlcmUgYXJlIHNvbWUgY29tcHV0YXRpb25zIHRvIHBlcmZvcm0gdG8gZmluZCBhIG5ldyBwbGFjZSBhbmQKKwkgKiBwb3NzaWJseSBhIG5ldyB0cmVlIGZvciB0aGlzIHNlcnZlci4KKwkgKi8KKwkgCisJb2xkX3N0YXRlID0gc3J2X2lzX3VzYWJsZShzcnYtPnByZXZfc3RhdGUsIHNydi0+cHJldl9ld2VpZ2h0KTsKKwluZXdfc3RhdGUgPSBzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCk7CisKKwlpZiAoIW9sZF9zdGF0ZSAmJiAhbmV3X3N0YXRlKSB7CisJCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7CisJCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OworCQlyZXR1cm47CisJfQorCWVsc2UgaWYgKCFvbGRfc3RhdGUgJiYgbmV3X3N0YXRlKSB7CisJCWZ3bGNfc2V0X3NlcnZlcl9zdGF0dXNfdXAoc3J2KTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmIChvbGRfc3RhdGUgJiYgIW5ld19zdGF0ZSkgeworCQlmd2xjX3NldF9zZXJ2ZXJfc3RhdHVzX2Rvd24oc3J2KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzcnYtPmxiX3RyZWUpCisJCWZ3bGNfZGVxdWV1ZV9zcnYoc3J2KTsKKworCWlmIChzcnYtPnN0YXRlICYgU1JWX0JBQ0tVUCkgeworCQlwLT5sYnBybS50b3Rfd2JjayArPSBzcnYtPmV3ZWlnaHQgLSBzcnYtPnByZXZfZXdlaWdodDsKKwkJc3J2LT5sYl90cmVlID0gJnAtPmxicHJtLmZ3bGMuYmNrOworCX0gZWxzZSB7CisJCXAtPmxicHJtLnRvdF93YWN0ICs9IHNydi0+ZXdlaWdodCAtIHNydi0+cHJldl9ld2VpZ2h0OworCQlzcnYtPmxiX3RyZWUgPSAmcC0+bGJwcm0uZndsYy5hY3Q7CisJfQorCisJZndsY19xdWV1ZV9zcnYoc3J2KTsKKworCXVwZGF0ZV9iYWNrZW5kX3dlaWdodChwKTsKKwlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOworCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBidWlsZGluZyB0aGUgdHJlZXMgaW4gY2FzZSBvZiBmYXN0CisgKiB3ZWlnaHRlZCBsZWFzdC1jb25ucy4gSXQgYWxzbyBzZXRzIHAtPmxicHJtLndkaXYgdG8gdGhlIGV3ZWlnaHQgdG8KKyAqIHV3ZWlnaHQgcmF0aW8uIEJvdGggYWN0aXZlIGFuZCBiYWNrdXAgZ3JvdXBzIGFyZSBpbml0aWFsaXplZC4KKyAqLwordm9pZCBmd2xjX2luaXRfc2VydmVyX3RyZWUoc3RydWN0IHByb3h5ICpwKQoreworCXN0cnVjdCBzZXJ2ZXIgKnNydjsKKwlzdHJ1Y3QgZWJfcm9vdCBpbml0X2hlYWQgPSBFQl9ST09UOworCisJcC0+bGJwcm0uc2V0X3NlcnZlcl9zdGF0dXNfdXAgICA9IGZ3bGNfc2V0X3NlcnZlcl9zdGF0dXNfdXA7CisJcC0+bGJwcm0uc2V0X3NlcnZlcl9zdGF0dXNfZG93biA9IGZ3bGNfc2V0X3NlcnZlcl9zdGF0dXNfZG93bjsKKwlwLT5sYnBybS51cGRhdGVfc2VydmVyX2V3ZWlnaHQgID0gZndsY191cGRhdGVfc2VydmVyX3dlaWdodDsKKwlwLT5sYnBybS5zZXJ2ZXJfdGFrZV9jb25uID0gZndsY19zcnZfcmVwb3NpdGlvbjsKKwlwLT5sYnBybS5zZXJ2ZXJfZHJvcF9jb25uID0gZndsY19zcnZfcmVwb3NpdGlvbjsKKworCXAtPmxicHJtLndkaXYgPSBCRV9XRUlHSFRfU0NBTEU7CisJZm9yIChzcnYgPSBwLT5zcnY7IHNydjsgc3J2ID0gc3J2LT5uZXh0KSB7CisJCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0ID0gc3J2LT51d2VpZ2h0ICogQkVfV0VJR0hUX1NDQUxFOworCQlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOworCX0KKworCXJlY291bnRfc2VydmVycyhwKTsKKwl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7CisKKwlwLT5sYnBybS5md2xjLmFjdCA9IGluaXRfaGVhZDsKKwlwLT5sYnBybS5md2xjLmJjayA9IGluaXRfaGVhZDsKKworCS8qIHF1ZXVlIGFjdGl2ZSBhbmQgYmFja3VwIHNlcnZlcnMgaW4gdHdvIGRpc3RpbmN0IGdyb3VwcyAqLworCWZvciAoc3J2ID0gcC0+c3J2OyBzcnY7IHNydiA9IHNydi0+bmV4dCkgeworCQlpZiAoIXNydl9pc191c2FibGUoc3J2LT5zdGF0ZSwgc3J2LT5ld2VpZ2h0KSkKKwkJCWNvbnRpbnVlOworCQlzcnYtPmxiX3RyZWUgPSAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApID8gJnAtPmxicHJtLmZ3bGMuYmNrIDogJnAtPmxicHJtLmZ3bGMuYWN0OworCQlmd2xjX3F1ZXVlX3NydihzcnYpOworCX0KK30KKworLyogUmV0dXJuIG5leHQgc2VydmVyIGZyb20gdGhlIEZXTEMgdHJlZSBpbiBiYWNrZW5kIDxwPi4gSWYgdGhlIHRyZWUgaXMgZW1wdHksCisgKiByZXR1cm4gTlVMTC4gU2F0dXJhdGVkIHNlcnZlcnMgYXJlIHNraXBwZWQuCisgKi8KK3N0cnVjdCBzZXJ2ZXIgKmZ3bGNfZ2V0X25leHRfc2VydmVyKHN0cnVjdCBwcm94eSAqcCwgc3RydWN0IHNlcnZlciAqc3J2dG9hdm9pZCkKK3sKKwlzdHJ1Y3Qgc2VydmVyICpzcnYsICphdm9pZGVkOworCXN0cnVjdCBlYjMyX25vZGUgKm5vZGU7CisKKwlzcnYgPSBhdm9pZGVkID0gTlVMTDsKKworCWlmIChwLT5zcnZfYWN0KQorCQlub2RlID0gZWIzMl9maXJzdCgmcC0+bGJwcm0uZndsYy5hY3QpOworCWVsc2UgaWYgKHAtPmxicHJtLmZiY2spCisJCXJldHVybiBwLT5sYnBybS5mYmNrOworCWVsc2UgaWYgKHAtPnNydl9iY2spCisJCW5vZGUgPSBlYjMyX2ZpcnN0KCZwLT5sYnBybS5md2xjLmJjayk7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKKworCXdoaWxlIChub2RlKSB7CisJCS8qIE9LLCB3ZSBoYXZlIGEgc2VydmVyLiBIb3dldmVyLCBpdCBtYXkgYmUgc2F0dXJhdGVkLCBpbiB3aGljaAorCQkgKiBjYXNlIHdlIGRvbid0IHdhbnQgdG8gcmVjb25zaWRlciBpdCBmb3Igbm93LCBzbyB3ZSdsbCBzaW1wbHkKKwkJICogc2tpcCBpdC4gU2FtZSBpZiBpdCdzIHRoZSBzZXJ2ZXIgd2UgdHJ5IHRvIGF2b2lkLCBpbiB3aGljaAorCQkgKiBjYXNlIHdlIHNpbXBseSByZW1lbWJlciBpdCBmb3IgbGF0ZXIgdXNlIGlmIG5lZWRlZC4KKwkJICovCisJCXN0cnVjdCBzZXJ2ZXIgKnM7CisKKwkJcyA9IGViMzJfZW50cnkobm9kZSwgc3RydWN0IHNlcnZlciwgbGJfbm9kZSk7CisJCWlmICghcy0+bWF4Y29ubiB8fCAoIXMtPm5icGVuZCAmJiBzLT5zZXJ2ZWQgPCBzcnZfZHluYW1pY19tYXhjb25uKHMpKSkgeworCQkJaWYgKHMgIT0gc3J2dG9hdm9pZCkgeworCQkJCXNydiA9IHM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlhdm9pZGVkID0gczsKKwkJfQorCQlub2RlID0gZWIzMl9uZXh0KG5vZGUpOworCX0KKworCWlmICghc3J2KQorCQlzcnYgPSBhdm9pZGVkOworCisJcmV0dXJuIHNydjsKK30KKworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2xiX2Z3cnIuYyBiL3NyYy9sYl9md3JyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkMTc5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYl9md3JyLmMKQEAgLTAsMCArMSw1NzYgQEAKKy8qCisgKiBGYXN0IFdlaWdodGVkIFJvdW5kIFJvYmluIGxvYWQgYmFsYW5jaW5nIGFsZ29yaXRobS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMC0yMDA5IFdpbGx5IFRhcnJlYXUgPHdAMXd0LmV1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24vY29tcGF0Lmg+CisjaW5jbHVkZSA8Y29tbW9uL2NvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi9kZWJ1Zy5oPgorI2luY2x1ZGUgPGNvbW1vbi9lYjMydHJlZS5oPgorCisjaW5jbHVkZSA8dHlwZXMvZ2xvYmFsLmg+CisjaW5jbHVkZSA8dHlwZXMvc2VydmVyLmg+CisKKyNpbmNsdWRlIDxwcm90by9iYWNrZW5kLmg+CisjaW5jbHVkZSA8cHJvdG8vcXVldWUuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZ3cnJfcmVtb3ZlX2Zyb21fdHJlZShzdHJ1Y3Qgc2VydmVyICpzKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3F1ZXVlX2J5X3dlaWdodChzdHJ1Y3QgZWJfcm9vdCAqcm9vdCwgc3RydWN0IHNlcnZlciAqcyk7CitzdGF0aWMgaW5saW5lIHZvaWQgZndycl9kZXF1ZXVlX3NydihzdHJ1Y3Qgc2VydmVyICpzKTsKK3N0YXRpYyB2b2lkIGZ3cnJfZ2V0X3NydihzdHJ1Y3Qgc2VydmVyICpzKTsKK3N0YXRpYyB2b2lkIGZ3cnJfcXVldWVfc3J2KHN0cnVjdCBzZXJ2ZXIgKnMpOworCisKKy8qIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgc2VydmVyIHRyZWVzIGFjY29yZGluZyB0byBzZXJ2ZXIgPHNydj4ncyBuZXcKKyAqIHN0YXRlLiBJdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gc2VydmVyIDxzcnY+J3Mgc3RhdHVzIGNoYW5nZXMgdG8gZG93bi4KKyAqIEl0IGlzIG5vdCBpbXBvcnRhbnQgd2hldGhlciB0aGUgc2VydmVyIHdhcyBhbHJlYWR5IGRvd24gb3Igbm90LiBJdCBpcyBub3QKKyAqIGltcG9ydGFudCBlaXRoZXIgdGhhdCB0aGUgbmV3IHN0YXRlIGlzIGNvbXBsZXRlbHkgZG93biAodGhlIGNhbGxlciBtYXkgbm90CisgKiBrbm93IGFsbCB0aGUgdmFyaWFibGVzIG9mIGEgc2VydmVyJ3Mgc3RhdGUpLgorICovCitzdGF0aWMgdm9pZCBmd3JyX3NldF9zZXJ2ZXJfc3RhdHVzX2Rvd24oc3RydWN0IHNlcnZlciAqc3J2KQoreworCXN0cnVjdCBwcm94eSAqcCA9IHNydi0+cHJveHk7CisJc3RydWN0IGZ3cnJfZ3JvdXAgKmdycDsKKworCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgorCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCisJCXJldHVybjsKKworCWlmIChzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCisJCWdvdG8gb3V0X3VwZGF0ZV9zdGF0ZTsKKworCWlmICghc3J2X2lzX3VzYWJsZShzcnYtPnByZXZfc3RhdGUsIHNydi0+cHJldl9ld2VpZ2h0KSkKKwkJLyogc2VydmVyIHdhcyBhbHJlYWR5IGRvd24gKi8KKwkJZ290byBvdXRfdXBkYXRlX2JhY2tlbmQ7CisKKwlncnAgPSAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApID8gJnAtPmxicHJtLmZ3cnIuYmNrIDogJnAtPmxicHJtLmZ3cnIuYWN0OworCWdycC0+bmV4dF93ZWlnaHQgLT0gc3J2LT5wcmV2X2V3ZWlnaHQ7CisKKwlpZiAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApIHsKKwkJcC0+bGJwcm0udG90X3diY2sgPSBwLT5sYnBybS5md3JyLmJjay5uZXh0X3dlaWdodDsKKwkJcC0+c3J2X2Jjay0tOworCisJCWlmIChzcnYgPT0gcC0+bGJwcm0uZmJjaykgeworCQkJLyogd2UgbG9zdCB0aGUgZmlyc3QgYmFja3VwIHNlcnZlciBpbiBhIHNpbmdsZS1iYWNrdXAKKwkJCSAqIGNvbmZpZ3VyYXRpb24sIHdlIG11c3Qgc2VhcmNoIGFub3RoZXIgb25lLgorCQkJICovCisJCQlzdHJ1Y3Qgc2VydmVyICpzcnYyID0gcC0+bGJwcm0uZmJjazsKKwkJCWRvIHsKKwkJCQlzcnYyID0gc3J2Mi0+bmV4dDsKKwkJCX0gd2hpbGUgKHNydjIgJiYKKwkJCQkgISgoc3J2Mi0+c3RhdGUgJiBTUlZfQkFDS1VQKSAmJgorCQkJCSAgIHNydl9pc191c2FibGUoc3J2Mi0+c3RhdGUsIHNydjItPmV3ZWlnaHQpKSk7CisJCQlwLT5sYnBybS5mYmNrID0gc3J2MjsKKwkJfQorCX0gZWxzZSB7CisJCXAtPmxicHJtLnRvdF93YWN0ID0gcC0+bGJwcm0uZndyci5hY3QubmV4dF93ZWlnaHQ7CisJCXAtPnNydl9hY3QtLTsKKwl9CisKKwlmd3JyX2RlcXVldWVfc3J2KHNydik7CisJZndycl9yZW1vdmVfZnJvbV90cmVlKHNydik7CisKK291dF91cGRhdGVfYmFja2VuZDoKKwkvKiBjaGVjay91cGRhdGUgdG90X3VzZWQsIHRvdF93ZWlnaHQgKi8KKwl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7Cisgb3V0X3VwZGF0ZV9zdGF0ZToKKwlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOworCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHNlcnZlciB0cmVlcyBhY2NvcmRpbmcgdG8gc2VydmVyIDxzcnY+J3MgbmV3CisgKiBzdGF0ZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHNlcnZlciA8c3J2PidzIHN0YXR1cyBjaGFuZ2VzIHRvIHVwLgorICogSXQgaXMgbm90IGltcG9ydGFudCB3aGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGFscmVhZHkgZG93biBvciBub3QuIEl0IGlzIG5vdAorICogaW1wb3J0YW50IGVpdGhlciB0aGF0IHRoZSBuZXcgc3RhdGUgaXMgY29tcGxldGVseSBVUCAodGhlIGNhbGxlciBtYXkgbm90CisgKiBrbm93IGFsbCB0aGUgdmFyaWFibGVzIG9mIGEgc2VydmVyJ3Mgc3RhdGUpLiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IGNoYW5nZQorICogdGhlIHdlaWdodCBvZiBhIHNlcnZlciB3aGljaCB3YXMgYWxyZWFkeSB1cC4KKyAqLworc3RhdGljIHZvaWQgZndycl9zZXRfc2VydmVyX3N0YXR1c191cChzdHJ1Y3Qgc2VydmVyICpzcnYpCit7CisJc3RydWN0IHByb3h5ICpwID0gc3J2LT5wcm94eTsKKwlzdHJ1Y3QgZndycl9ncm91cCAqZ3JwOworCisJaWYgKHNydi0+c3RhdGUgPT0gc3J2LT5wcmV2X3N0YXRlICYmCisJICAgIHNydi0+ZXdlaWdodCA9PSBzcnYtPnByZXZfZXdlaWdodCkKKwkJcmV0dXJuOworCisJaWYgKCFzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCisJCWdvdG8gb3V0X3VwZGF0ZV9zdGF0ZTsKKworCWlmIChzcnZfaXNfdXNhYmxlKHNydi0+cHJldl9zdGF0ZSwgc3J2LT5wcmV2X2V3ZWlnaHQpKQorCQkvKiBzZXJ2ZXIgd2FzIGFscmVhZHkgdXAgKi8KKwkJZ290byBvdXRfdXBkYXRlX2JhY2tlbmQ7CisKKwlncnAgPSAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApID8gJnAtPmxicHJtLmZ3cnIuYmNrIDogJnAtPmxicHJtLmZ3cnIuYWN0OworCWdycC0+bmV4dF93ZWlnaHQgKz0gc3J2LT5ld2VpZ2h0OworCisJaWYgKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSB7CisJCXAtPmxicHJtLnRvdF93YmNrID0gcC0+bGJwcm0uZndyci5iY2submV4dF93ZWlnaHQ7CisJCXAtPnNydl9iY2srKzsKKworCQlpZiAoIShwLT5vcHRpb25zICYgUFJfT19VU0VfQUxMX0JLKSkgeworCQkJaWYgKCFwLT5sYnBybS5mYmNrKSB7CisJCQkJLyogdGhlcmUgd2FzIG5vIGJhY2t1cCBzZXJ2ZXIgYW55bW9yZSAqLworCQkJCXAtPmxicHJtLmZiY2sgPSBzcnY7CisJCQl9IGVsc2UgeworCQkJCS8qIHdlIG1heSBoYXZlIHJlc3RvcmVkIGEgYmFja3VwIHNlcnZlciBwcmlvciB0byBmYmNrLAorCQkJCSAqIGluIHdoaWNoIGNhc2UgaXQgc2hvdWxkIHJlcGxhY2UgaXQuCisJCQkJICovCisJCQkJc3RydWN0IHNlcnZlciAqc3J2MiA9IHNydjsKKwkJCQlkbyB7CisJCQkJCXNydjIgPSBzcnYyLT5uZXh0OworCQkJCX0gd2hpbGUgKHNydjIgJiYgKHNydjIgIT0gcC0+bGJwcm0uZmJjaykpOworCQkJCWlmIChzcnYyKQorCQkJCQlwLT5sYnBybS5mYmNrID0gc3J2OworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcC0+bGJwcm0udG90X3dhY3QgPSBwLT5sYnBybS5md3JyLmFjdC5uZXh0X3dlaWdodDsKKwkJcC0+c3J2X2FjdCsrOworCX0KKworCS8qIG5vdGUgdGhhdCBld2VpZ2h0IGNhbm5vdCBiZSAwIGhlcmUgKi8KKwlmd3JyX2dldF9zcnYoc3J2KTsKKwlzcnYtPm5wb3MgPSBncnAtPmN1cnJfcG9zICsgKGdycC0+bmV4dF93ZWlnaHQgKyBncnAtPmN1cnJfd2VpZ2h0IC0gZ3JwLT5jdXJyX3BvcykgLyBzcnYtPmV3ZWlnaHQ7CisJZndycl9xdWV1ZV9zcnYoc3J2KTsKKworb3V0X3VwZGF0ZV9iYWNrZW5kOgorCS8qIGNoZWNrL3VwZGF0ZSB0b3RfdXNlZCwgdG90X3dlaWdodCAqLworCXVwZGF0ZV9iYWNrZW5kX3dlaWdodChwKTsKKyBvdXRfdXBkYXRlX3N0YXRlOgorCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7CisJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYW4gdXBkYXRlIHRvIHNlcnZlciA8c3J2PidzIGVmZmVjdGl2ZQorICogd2VpZ2h0LiBJdCBtYXkgYmUgY2FsbGVkIGFmdGVyIGEgc3RhdGUgY2hhbmdlIHRvby4KKyAqLworc3RhdGljIHZvaWQgZndycl91cGRhdGVfc2VydmVyX3dlaWdodChzdHJ1Y3Qgc2VydmVyICpzcnYpCit7CisJaW50IG9sZF9zdGF0ZSwgbmV3X3N0YXRlOworCXN0cnVjdCBwcm94eSAqcCA9IHNydi0+cHJveHk7CisJc3RydWN0IGZ3cnJfZ3JvdXAgKmdycDsKKworCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgorCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCisJCXJldHVybjsKKworCS8qIElmIGNoYW5naW5nIHRoZSBzZXJ2ZXIncyB3ZWlnaHQgY2hhbmdlcyBpdHMgc3RhdGUsIHdlIHNpbXBseSBhcHBseQorCSAqIHRoZSBwcm9jZWR1cmVzIHdlIGFscmVhZHkgaGF2ZSBmb3Igc3RhdHVzIGNoYW5nZS4gSWYgdGhlIHN0YXRlCisJICogcmVtYWlucyBkb3duLCB0aGUgc2VydmVyIGlzIG5vdCBpbiBhbnkgdHJlZSwgc28gaXQncyBhcyBlYXN5IGFzCisJICogdXBkYXRpbmcgaXRzIHZhbHVlcy4gSWYgdGhlIHN0YXRlIHJlbWFpbnMgdXAgd2l0aCBkaWZmZXJlbnQgd2VpZ2h0cywKKwkgKiB0aGVyZSBhcmUgc29tZSBjb21wdXRhdGlvbnMgdG8gcGVyZm9ybSB0byBmaW5kIGEgbmV3IHBsYWNlIGFuZAorCSAqIHBvc3NpYmx5IGEgbmV3IHRyZWUgZm9yIHRoaXMgc2VydmVyLgorCSAqLworCSAKKwlvbGRfc3RhdGUgPSBzcnZfaXNfdXNhYmxlKHNydi0+cHJldl9zdGF0ZSwgc3J2LT5wcmV2X2V3ZWlnaHQpOworCW5ld19zdGF0ZSA9IHNydl9pc191c2FibGUoc3J2LT5zdGF0ZSwgc3J2LT5ld2VpZ2h0KTsKKworCWlmICghb2xkX3N0YXRlICYmICFuZXdfc3RhdGUpIHsKKwkJc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKKwkJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZiAoIW9sZF9zdGF0ZSAmJiBuZXdfc3RhdGUpIHsKKwkJZndycl9zZXRfc2VydmVyX3N0YXR1c191cChzcnYpOworCQlyZXR1cm47CisJfQorCWVsc2UgaWYgKG9sZF9zdGF0ZSAmJiAhbmV3X3N0YXRlKSB7CisJCWZ3cnJfc2V0X3NlcnZlcl9zdGF0dXNfZG93bihzcnYpOworCQlyZXR1cm47CisJfQorCisJZ3JwID0gKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/ICZwLT5sYnBybS5md3JyLmJjayA6ICZwLT5sYnBybS5md3JyLmFjdDsKKwlncnAtPm5leHRfd2VpZ2h0ID0gZ3JwLT5uZXh0X3dlaWdodCAtIHNydi0+cHJldl9ld2VpZ2h0ICsgc3J2LT5ld2VpZ2h0OworCisJcC0+bGJwcm0udG90X3dhY3QgPSBwLT5sYnBybS5md3JyLmFjdC5uZXh0X3dlaWdodDsKKwlwLT5sYnBybS50b3Rfd2JjayA9IHAtPmxicHJtLmZ3cnIuYmNrLm5leHRfd2VpZ2h0OworCisJaWYgKHNydi0+bGJfdHJlZSA9PSBncnAtPmluaXQpIHsKKwkJZndycl9kZXF1ZXVlX3NydihzcnYpOworCQlmd3JyX3F1ZXVlX2J5X3dlaWdodChncnAtPmluaXQsIHNydik7CisJfQorCWVsc2UgaWYgKCFzcnYtPmxiX3RyZWUpIHsKKwkJLyogRklYTUU6IHNlcnZlciB3YXMgZG93bi4gVGhpcyBpcyBub3QgcG9zc2libGUgcmlnaHQgbm93IGJ1dAorCQkgKiBtYXkgYmUgbmVlZGVkIHNvb24gZm9yIHNsb3dzdGFydCBvciBncmFjZWZ1bCBzaHV0ZG93bi4KKwkJICovCisJCWZ3cnJfZGVxdWV1ZV9zcnYoc3J2KTsKKwkJZndycl9nZXRfc3J2KHNydik7CisJCXNydi0+bnBvcyA9IGdycC0+Y3Vycl9wb3MgKyAoZ3JwLT5uZXh0X3dlaWdodCArIGdycC0+Y3Vycl93ZWlnaHQgLSBncnAtPmN1cnJfcG9zKSAvIHNydi0+ZXdlaWdodDsKKwkJZndycl9xdWV1ZV9zcnYoc3J2KTsKKwl9IGVsc2UgeworCQkvKiBUaGUgc2VydmVyIGlzIGVpdGhlciBhY3RpdmUgb3IgaW4gdGhlIG5leHQgcXVldWUuIElmIGl0J3MKKwkJICogc3RpbGwgaW4gdGhlIGFjdGl2ZSBxdWV1ZSBhbmQgaXQgaGFzIG5vdCBjb25zdW1lZCBhbGwgb2YgaXRzCisJCSAqIHBsYWNlcywgbGV0J3MgYWRqdXN0IGl0cyBuZXh0IHBvc2l0aW9uLgorCQkgKi8KKwkJZndycl9nZXRfc3J2KHNydik7CisKKwkJaWYgKHNydi0+ZXdlaWdodCA+IDApIHsKKwkJCWludCBwcmV2X25leHQgPSBzcnYtPm5wb3M7CisJCQlpbnQgc3RlcCA9IGdycC0+bmV4dF93ZWlnaHQgLyBzcnYtPmV3ZWlnaHQ7CisKKwkJCXNydi0+bnBvcyA9IHNydi0+bHBvcyArIHN0ZXA7CisJCQlzcnYtPnJ3ZWlnaHQgPSAwOworCisJCQlpZiAoc3J2LT5ucG9zID4gcHJldl9uZXh0KQorCQkJCXNydi0+bnBvcyA9IHByZXZfbmV4dDsKKwkJCWlmIChzcnYtPm5wb3MgPCBncnAtPmN1cnJfcG9zICsgMikKKwkJCQlzcnYtPm5wb3MgPSBncnAtPmN1cnJfcG9zICsgc3RlcDsKKwkJfSBlbHNlIHsKKwkJCS8qIHB1c2ggaXQgaW50byB0aGUgbmV4dCB0cmVlICovCisJCQlzcnYtPm5wb3MgPSBncnAtPmN1cnJfcG9zICsgZ3JwLT5jdXJyX3dlaWdodDsKKwkJfQorCisJCWZ3cnJfZGVxdWV1ZV9zcnYoc3J2KTsKKwkJZndycl9xdWV1ZV9zcnYoc3J2KTsKKwl9CisKKwl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7CisJc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKKwlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKK30KKworLyogUmVtb3ZlIGEgc2VydmVyIGZyb20gYSB0cmVlLiBJdCBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuIGRlcXVldWVkLiBUaGlzCisgKiBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBjYWxsZWQgd2hlbiBhIHNlcnZlciBpcyBnb2luZyBkb3duIG9yIGhhcyBpdHMKKyAqIHdlaWdodCBkaXNhYmxlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZ3cnJfcmVtb3ZlX2Zyb21fdHJlZShzdHJ1Y3Qgc2VydmVyICpzKQoreworCXMtPmxiX3RyZWUgPSBOVUxMOworfQorCisvKiBRdWV1ZSBhIHNlcnZlciBpbiB0aGUgd2VpZ2h0IHRyZWUgPHJvb3Q+LCBhc3N1bWluZyB0aGUgd2VpZ2h0IGlzID4wLgorICogV2Ugd2FudCB0byBzb3J0IHRoZW0gYnkgaW52ZXJ0ZWQgd2VpZ2h0cywgYmVjYXVzZSB3ZSBuZWVkIHRvIHBsYWNlCisgKiBoZWF2eSBzZXJ2ZXJzIGZpcnN0IGluIG9yZGVyIHRvIGdldCBhIHNtb290aCBkaXN0cmlidXRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3F1ZXVlX2J5X3dlaWdodChzdHJ1Y3QgZWJfcm9vdCAqcm9vdCwgc3RydWN0IHNlcnZlciAqcykKK3sKKwlzLT5sYl9ub2RlLmtleSA9IFNSVl9FV0dIVF9NQVggLSBzLT5ld2VpZ2h0OworCWViMzJfaW5zZXJ0KHJvb3QsICZzLT5sYl9ub2RlKTsKKwlzLT5sYl90cmVlID0gcm9vdDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYnVpbGRpbmcgdGhlIHdlaWdodCB0cmVlcyBpbiBjYXNlIG9mIGZhc3QKKyAqIHdlaWdodGVkIHJvdW5kLXJvYmluLiBJdCBhbHNvIHNldHMgcC0+bGJwcm0ud2RpdiB0byB0aGUgZXdlaWdodCB0byB1d2VpZ2h0CisgKiByYXRpby4gQm90aCBhY3RpdmUgYW5kIGJhY2t1cCBncm91cHMgYXJlIGluaXRpYWxpemVkLgorICovCit2b2lkIGZ3cnJfaW5pdF9zZXJ2ZXJfZ3JvdXBzKHN0cnVjdCBwcm94eSAqcCkKK3sKKwlzdHJ1Y3Qgc2VydmVyICpzcnY7CisJc3RydWN0IGViX3Jvb3QgaW5pdF9oZWFkID0gRUJfUk9PVDsKKworCXAtPmxicHJtLnNldF9zZXJ2ZXJfc3RhdHVzX3VwICAgPSBmd3JyX3NldF9zZXJ2ZXJfc3RhdHVzX3VwOworCXAtPmxicHJtLnNldF9zZXJ2ZXJfc3RhdHVzX2Rvd24gPSBmd3JyX3NldF9zZXJ2ZXJfc3RhdHVzX2Rvd247CisJcC0+bGJwcm0udXBkYXRlX3NlcnZlcl9ld2VpZ2h0ICA9IGZ3cnJfdXBkYXRlX3NlcnZlcl93ZWlnaHQ7CisKKwlwLT5sYnBybS53ZGl2ID0gQkVfV0VJR0hUX1NDQUxFOworCWZvciAoc3J2ID0gcC0+c3J2OyBzcnY7IHNydiA9IHNydi0+bmV4dCkgeworCQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodCA9IHNydi0+dXdlaWdodCAqIEJFX1dFSUdIVF9TQ0FMRTsKKwkJc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKKwl9CisKKwlyZWNvdW50X3NlcnZlcnMocCk7CisJdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOworCisJLyogcHJlcGFyZSB0aGUgYWN0aXZlIHNlcnZlcnMgZ3JvdXAgKi8KKwlwLT5sYnBybS5md3JyLmFjdC5jdXJyX3BvcyA9IHAtPmxicHJtLmZ3cnIuYWN0LmN1cnJfd2VpZ2h0ID0KKwkJcC0+bGJwcm0uZndyci5hY3QubmV4dF93ZWlnaHQgPSBwLT5sYnBybS50b3Rfd2FjdDsKKwlwLT5sYnBybS5md3JyLmFjdC5jdXJyID0gcC0+bGJwcm0uZndyci5hY3QudDAgPQorCQlwLT5sYnBybS5md3JyLmFjdC50MSA9IGluaXRfaGVhZDsKKwlwLT5sYnBybS5md3JyLmFjdC5pbml0ID0gJnAtPmxicHJtLmZ3cnIuYWN0LnQwOworCXAtPmxicHJtLmZ3cnIuYWN0Lm5leHQgPSAmcC0+bGJwcm0uZndyci5hY3QudDE7CisKKwkvKiBwcmVwYXJlIHRoZSBiYWNrdXAgc2VydmVycyBncm91cCAqLworCXAtPmxicHJtLmZ3cnIuYmNrLmN1cnJfcG9zID0gcC0+bGJwcm0uZndyci5iY2suY3Vycl93ZWlnaHQgPQorCQlwLT5sYnBybS5md3JyLmJjay5uZXh0X3dlaWdodCA9IHAtPmxicHJtLnRvdF93YmNrOworCXAtPmxicHJtLmZ3cnIuYmNrLmN1cnIgPSBwLT5sYnBybS5md3JyLmJjay50MCA9CisJCXAtPmxicHJtLmZ3cnIuYmNrLnQxID0gaW5pdF9oZWFkOworCXAtPmxicHJtLmZ3cnIuYmNrLmluaXQgPSAmcC0+bGJwcm0uZndyci5iY2sudDA7CisJcC0+bGJwcm0uZndyci5iY2submV4dCA9ICZwLT5sYnBybS5md3JyLmJjay50MTsKKworCS8qIHF1ZXVlIGFjdGl2ZSBhbmQgYmFja3VwIHNlcnZlcnMgaW4gdHdvIGRpc3RpbmN0IGdyb3VwcyAqLworCWZvciAoc3J2ID0gcC0+c3J2OyBzcnY7IHNydiA9IHNydi0+bmV4dCkgeworCQlpZiAoIXNydl9pc191c2FibGUoc3J2LT5zdGF0ZSwgc3J2LT5ld2VpZ2h0KSkKKwkJCWNvbnRpbnVlOworCQlmd3JyX3F1ZXVlX2J5X3dlaWdodCgoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApID8KKwkJCQlwLT5sYnBybS5md3JyLmJjay5pbml0IDoKKwkJCQlwLT5sYnBybS5md3JyLmFjdC5pbml0LAorCQkJCXNydik7CisJfQorfQorCisvKiBzaW1wbHkgcmVtb3ZlcyBhIHNlcnZlciBmcm9tIGEgd2VpZ2h0IHRyZWUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX2RlcXVldWVfc3J2KHN0cnVjdCBzZXJ2ZXIgKnMpCit7CisJZWIzMl9kZWxldGUoJnMtPmxiX25vZGUpOworfQorCisvKiBxdWV1ZXMgYSBzZXJ2ZXIgaW50byB0aGUgYXBwcm9wcmlhdGUgZ3JvdXAgYW5kIHRyZWUgZGVwZW5kaW5nIG9uIGl0cworICogYmFja3VwIHN0YXR1cywgYW5kIC0+bnBvcy4gSWYgdGhlIHNlcnZlciBpcyBkaXNhYmxlZCwgc2ltcGx5IGFzc2lnbgorICogaXQgdG8gdGhlIE5VTEwgdHJlZS4KKyAqLworc3RhdGljIHZvaWQgZndycl9xdWV1ZV9zcnYoc3RydWN0IHNlcnZlciAqcykKK3sKKwlzdHJ1Y3QgcHJveHkgKnAgPSBzLT5wcm94eTsKKwlzdHJ1Y3QgZndycl9ncm91cCAqZ3JwOworCisJZ3JwID0gKHMtPnN0YXRlICYgU1JWX0JBQ0tVUCkgPyAmcC0+bGJwcm0uZndyci5iY2sgOiAmcC0+bGJwcm0uZndyci5hY3Q7CisJCisJLyogRGVsYXkgZXZlcnl0aGluZyB3aGljaCBkb2VzIG5vdCBmaXQgaW50byB0aGUgd2luZG93IGFuZCBldmVyeXRoaW5nCisJICogd2hpY2ggZG9lcyBub3QgZml0IGludG8gdGhlIHRoZW9yaWNhbCBuZXcgd2luZG93LgorCSAqLworCWlmICghc3J2X2lzX3VzYWJsZShzLT5zdGF0ZSwgcy0+ZXdlaWdodCkpIHsKKwkJZndycl9yZW1vdmVfZnJvbV90cmVlKHMpOworCX0KKwllbHNlIGlmIChzLT5ld2VpZ2h0IDw9IDAgfHwKKwkJIHMtPm5wb3MgPj0gMiAqIGdycC0+Y3Vycl93ZWlnaHQgfHwKKwkJIHMtPm5wb3MgPj0gZ3JwLT5jdXJyX3dlaWdodCArIGdycC0+bmV4dF93ZWlnaHQpIHsKKwkJLyogcHV0IGludG8gbmV4dCB0cmVlLCBhbmQgcmVhZGp1c3QgbnBvcyBpbiBjYXNlIHdlIGNvdWxkCisJCSAqIGZpbmFsbHkgdGFrZSB0aGlzIGJhY2sgdG8gY3VycmVudC4gKi8KKwkJcy0+bnBvcyAtPSBncnAtPmN1cnJfd2VpZ2h0OworCQlmd3JyX3F1ZXVlX2J5X3dlaWdodChncnAtPm5leHQsIHMpOworCX0KKwllbHNlIHsKKwkJLyogVGhlIHNvcnRpbmcga2V5IGlzIHN0b3JlZCBpbiB1bml0cyBvZiBzLT5ucG9zICogdXNlcl93ZWlnaHQKKwkJICogaW4gb3JkZXIgdG8gYXZvaWQgb3ZlcmZsb3dzLiBBcyBzdGF0ZWQgaW4gYmFja2VuZC5oLCB0aGUKKwkJICogbG93ZXIgdGhlIHNjYWxlLCB0aGUgcm91Z2hlciB0aGUgd2VpZ2h0cyBtb2R1bGF0aW9uLCBhbmQgdGhlCisJCSAqIGhpZ2hlciB0aGUgc2NhbGUsIHRoZSBsb3dlciB0aGUgbnVtYmVyIG9mIHNlcnZlcnMgd2l0aG91dAorCQkgKiBvdmVyZmxvdy4gV2l0aCB0aGlzIGZvcm11bGEsIHRoZSByZXN1bHQgaXMgYWx3YXlzIHBvc2l0aXZlLAorCQkgKiBzbyB3ZSBjYW4gdXNlIGViM+lfaW5zZXJ0KCkuCisJCSAqLworCQlzLT5sYl9ub2RlLmtleSA9IFNSVl9VV0dIVF9SQU5HRSAqIHMtPm5wb3MgKworCQkJKHVuc2lnbmVkKShTUlZfRVdHSFRfTUFYICsgcy0+cndlaWdodCAtIHMtPmV3ZWlnaHQpIC8gQkVfV0VJR0hUX1NDQUxFOworCisJCWViMzJfaW5zZXJ0KCZncnAtPmN1cnIsICZzLT5sYl9ub2RlKTsKKwkJcy0+bGJfdHJlZSA9ICZncnAtPmN1cnI7CisJfQorfQorCisvKiBwcmVwYXJlcyBhIHNlcnZlciB3aGVuIGV4dHJhY3RpbmcgaXQgZnJvbSB0aGUgImluaXQiIHRyZWUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX2dldF9zcnZfaW5pdChzdHJ1Y3Qgc2VydmVyICpzKQoreworCXMtPm5wb3MgPSBzLT5yd2VpZ2h0ID0gMDsKK30KKworLyogcHJlcGFyZXMgYSBzZXJ2ZXIgd2hlbiBleHRyYWN0aW5nIGl0IGZyb20gdGhlICJuZXh0IiB0cmVlICovCitzdGF0aWMgaW5saW5lIHZvaWQgZndycl9nZXRfc3J2X25leHQoc3RydWN0IHNlcnZlciAqcykKK3sKKwlzdHJ1Y3QgZndycl9ncm91cCAqZ3JwID0gKHMtPnN0YXRlICYgU1JWX0JBQ0tVUCkgPworCQkmcy0+cHJveHktPmxicHJtLmZ3cnIuYmNrIDoKKwkJJnMtPnByb3h5LT5sYnBybS5md3JyLmFjdDsKKworCXMtPm5wb3MgKz0gZ3JwLT5jdXJyX3dlaWdodDsKK30KKworLyogcHJlcGFyZXMgYSBzZXJ2ZXIgd2hlbiBpdCB3YXMgbWFya2VkIGRvd24gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX2dldF9zcnZfZG93bihzdHJ1Y3Qgc2VydmVyICpzKQoreworCXN0cnVjdCBmd3JyX2dyb3VwICpncnAgPSAocy0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/CisJCSZzLT5wcm94eS0+bGJwcm0uZndyci5iY2sgOgorCQkmcy0+cHJveHktPmxicHJtLmZ3cnIuYWN0OworCisJcy0+bnBvcyA9IGdycC0+Y3Vycl9wb3M7Cit9CisKKy8qIHByZXBhcmVzIGEgc2VydmVyIHdoZW4gZXh0cmFjdGluZyBpdCBmcm9tIGl0cyB0cmVlICovCitzdGF0aWMgdm9pZCBmd3JyX2dldF9zcnYoc3RydWN0IHNlcnZlciAqcykKK3sKKwlzdHJ1Y3QgcHJveHkgKnAgPSBzLT5wcm94eTsKKwlzdHJ1Y3QgZndycl9ncm91cCAqZ3JwID0gKHMtPnN0YXRlICYgU1JWX0JBQ0tVUCkgPworCQkmcC0+bGJwcm0uZndyci5iY2sgOgorCQkmcC0+bGJwcm0uZndyci5hY3Q7CisKKwlpZiAocy0+bGJfdHJlZSA9PSBncnAtPmluaXQpIHsKKwkJZndycl9nZXRfc3J2X2luaXQocyk7CisJfQorCWVsc2UgaWYgKHMtPmxiX3RyZWUgPT0gZ3JwLT5uZXh0KSB7CisJCWZ3cnJfZ2V0X3Nydl9uZXh0KHMpOworCX0KKwllbHNlIGlmIChzLT5sYl90cmVlID09IE5VTEwpIHsKKwkJZndycl9nZXRfc3J2X2Rvd24ocyk7CisJfQorfQorCisvKiBzd2l0Y2hlcyB0cmVlcyAiaW5pdCIgYW5kICJuZXh0IiBmb3IgRldSUiBncm91cCA8Z3JwPi4gImluaXQiIHNob3VsZCBiZSBlbXB0eQorICogd2hlbiB0aGlzIGhhcHBlbnMsIGFuZCAibmV4dCIgZmlsbGVkIHdpdGggc2VydmVycyBzb3J0ZWQgYnkgd2VpZ2h0cy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZ3cnJfc3dpdGNoX3RyZWVzKHN0cnVjdCBmd3JyX2dyb3VwICpncnApCit7CisJc3RydWN0IGViX3Jvb3QgKnN3YXA7CisJc3dhcCA9IGdycC0+aW5pdDsKKwlncnAtPmluaXQgPSBncnAtPm5leHQ7CisJZ3JwLT5uZXh0ID0gc3dhcDsKKwlncnAtPmN1cnJfd2VpZ2h0ID0gZ3JwLT5uZXh0X3dlaWdodDsKKwlncnAtPmN1cnJfcG9zID0gZ3JwLT5jdXJyX3dlaWdodDsKK30KKworLyogcmV0dXJuIG5leHQgc2VydmVyIGZyb20gdGhlIGN1cnJlbnQgdHJlZSBpbiBGV1JSIGdyb3VwIDxncnA+LCBvciBhIHNlcnZlcgorICogZnJvbSB0aGUgImluaXQiIHRyZWUgaWYgYXBwcm9wcmlhdGUuIElmIGJvdGggdHJlZXMgYXJlIGVtcHR5LCByZXR1cm4gTlVMTC4KKyAqLworc3RhdGljIHN0cnVjdCBzZXJ2ZXIgKmZ3cnJfZ2V0X3NlcnZlcl9mcm9tX2dyb3VwKHN0cnVjdCBmd3JyX2dyb3VwICpncnApCit7CisJc3RydWN0IGViMzJfbm9kZSAqbm9kZTsKKwlzdHJ1Y3Qgc2VydmVyICpzOworCisJbm9kZSA9IGViMzJfZmlyc3QoJmdycC0+Y3Vycik7CisJcyA9IGViMzJfZW50cnkobm9kZSwgc3RydWN0IHNlcnZlciwgbGJfbm9kZSk7CisJCisJaWYgKCFub2RlIHx8IHMtPm5wb3MgPiBncnAtPmN1cnJfcG9zKSB7CisJCS8qIGVpdGhlciB3ZSBoYXZlIG5vIHNlcnZlciBsZWZ0LCBvciB3ZSBoYXZlIGEgaG9sZSAqLworCQlzdHJ1Y3QgZWIzMl9ub2RlICpub2RlMjsKKwkJbm9kZTIgPSBlYjMyX2ZpcnN0KGdycC0+aW5pdCk7CisJCWlmIChub2RlMikgeworCQkJbm9kZSA9IG5vZGUyOworCQkJcyA9IGViMzJfZW50cnkobm9kZSwgc3RydWN0IHNlcnZlciwgbGJfbm9kZSk7CisJCQlmd3JyX2dldF9zcnZfaW5pdChzKTsKKwkJCWlmIChzLT5ld2VpZ2h0ID09IDApIC8qIEZJWE1FOiBpcyBpdCBwb3NzaWJsZSBhdCBhbGwgPyAqLworCQkJCW5vZGUgPSBOVUxMOworCQl9CisJfQorCWlmIChub2RlKQorCQlyZXR1cm4gczsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCisvKiBDb21wdXRlcyBuZXh0IHBvc2l0aW9uIG9mIHNlcnZlciA8cz4gaW4gdGhlIGdyb3VwLiBJdCBpcyBtYW5kYXRvcnkgZm9yIDxzPgorICogdG8gaGF2ZSBhIG5vbi16ZXJvLCBwb3NpdGl2ZSBld2VpZ2h0LgorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3VwZGF0ZV9wb3NpdGlvbihzdHJ1Y3QgZndycl9ncm91cCAqZ3JwLCBzdHJ1Y3Qgc2VydmVyICpzKQoreworCWlmICghcy0+bnBvcykgeworCQkvKiBmaXJzdCB0aW1lIGV2ZXIgZm9yIHRoaXMgc2VydmVyICovCisJCXMtPmxwb3MgPSBncnAtPmN1cnJfcG9zOworCQlzLT5ucG9zID0gZ3JwLT5jdXJyX3BvcyArIGdycC0+bmV4dF93ZWlnaHQgLyBzLT5ld2VpZ2h0OworCQlzLT5yd2VpZ2h0ICs9IGdycC0+bmV4dF93ZWlnaHQgJSBzLT5ld2VpZ2h0OworCisJCWlmIChzLT5yd2VpZ2h0ID49IHMtPmV3ZWlnaHQpIHsKKwkJCXMtPnJ3ZWlnaHQgLT0gcy0+ZXdlaWdodDsKKwkJCXMtPm5wb3MrKzsKKwkJfQorCX0gZWxzZSB7CisJCXMtPmxwb3MgPSBzLT5ucG9zOworCQlzLT5ucG9zICs9IGdycC0+bmV4dF93ZWlnaHQgLyBzLT5ld2VpZ2h0OworCQlzLT5yd2VpZ2h0ICs9IGdycC0+bmV4dF93ZWlnaHQgJSBzLT5ld2VpZ2h0OworCisJCWlmIChzLT5yd2VpZ2h0ID49IHMtPmV3ZWlnaHQpIHsKKwkJCXMtPnJ3ZWlnaHQgLT0gcy0+ZXdlaWdodDsKKwkJCXMtPm5wb3MrKzsKKwkJfQorCX0KK30KKworLyogUmV0dXJuIG5leHQgc2VydmVyIGZyb20gdGhlIGN1cnJlbnQgdHJlZSBpbiBiYWNrZW5kIDxwPiwgb3IgYSBzZXJ2ZXIgZnJvbQorICogdGhlIGluaXQgdHJlZSBpZiBhcHByb3ByaWF0ZS4gSWYgYm90aCB0cmVlcyBhcmUgZW1wdHksIHJldHVybiBOVUxMLgorICogU2F0dXJhdGVkIHNlcnZlcnMgYXJlIHNraXBwZWQgYW5kIHJlcXVldWVkLgorICovCitzdHJ1Y3Qgc2VydmVyICpmd3JyX2dldF9uZXh0X3NlcnZlcihzdHJ1Y3QgcHJveHkgKnAsIHN0cnVjdCBzZXJ2ZXIgKnNydnRvYXZvaWQpCit7CisJc3RydWN0IHNlcnZlciAqc3J2LCAqZnVsbCwgKmF2b2lkZWQ7CisJc3RydWN0IGZ3cnJfZ3JvdXAgKmdycDsKKwlpbnQgc3dpdGNoZWQ7CisKKwlpZiAocC0+c3J2X2FjdCkKKwkJZ3JwID0gJnAtPmxicHJtLmZ3cnIuYWN0OworCWVsc2UgaWYgKHAtPmxicHJtLmZiY2spCisJCXJldHVybiBwLT5sYnBybS5mYmNrOworCWVsc2UgaWYgKHAtPnNydl9iY2spCisJCWdycCA9ICZwLT5sYnBybS5md3JyLmJjazsKKwllbHNlCisJCXJldHVybiBOVUxMOworCisJc3dpdGNoZWQgPSAwOworCWF2b2lkZWQgPSBOVUxMOworCWZ1bGwgPSBOVUxMOyAvKiBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBzYXR1cmF0ZWQgc2VydmVycyAqLworCXdoaWxlICgxKSB7CisJCS8qIGlmIHdlIHNlZSBhbiBlbXB0eSBncm91cCwgbGV0J3MgZmlyc3QgdHJ5IHRvIGNvbGxlY3Qgd2VpZ2h0cworCQkgKiB3aGljaCBtaWdodCBoYXZlIHJlY2VudGx5IGNoYW5nZWQuCisJCSAqLworCQlpZiAoIWdycC0+Y3Vycl93ZWlnaHQpCisJCQlncnAtPmN1cnJfcG9zID0gZ3JwLT5jdXJyX3dlaWdodCA9IGdycC0+bmV4dF93ZWlnaHQ7CisKKwkJLyogZ2V0IGZpcnN0IHNlcnZlciBmcm9tIHRoZSAiY3VycmVudCIgdHJlZS4gV2hlbiB0aGUgZW5kIG9mCisJCSAqIHRoZSB0cmVlIGlzIHJlYWNoZWQsIHdlIG1heSBoYXZlIHRvIHN3aXRjaCwgYnV0IG9ubHkgb25jZS4KKwkJICovCisJCXdoaWxlICgxKSB7CisJCQlzcnYgPSBmd3JyX2dldF9zZXJ2ZXJfZnJvbV9ncm91cChncnApOworCQkJaWYgKHNydikKKwkJCQlicmVhazsKKwkJCWlmIChzd2l0Y2hlZCkgeworCQkJCWlmIChhdm9pZGVkKSB7CisJCQkJCXNydiA9IGF2b2lkZWQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlnb3RvIHJlcXVldWVfc2VydmVyczsKKwkJCX0KKwkJCXN3aXRjaGVkID0gMTsKKwkJCWZ3cnJfc3dpdGNoX3RyZWVzKGdycCk7CisKKwkJfQorCisJCS8qIE9LLCB3ZSBoYXZlIGEgc2VydmVyLiBIb3dldmVyLCBpdCBtYXkgYmUgc2F0dXJhdGVkLCBpbiB3aGljaAorCQkgKiBjYXNlIHdlIGRvbid0IHdhbnQgdG8gcmVjb25zaWRlciBpdCBmb3Igbm93LiBXZSdsbCB1cGRhdGUKKwkJICogaXRzIHBvc2l0aW9uIGFuZCBkZXF1ZXVlIGl0IGFueXdheSwgc28gdGhhdCB3ZSBjYW4gbW92ZSBpdAorCQkgKiB0byBhIGJldHRlciBwbGFjZSBhZnRlcndhcmRzLgorCQkgKi8KKwkJZndycl91cGRhdGVfcG9zaXRpb24oZ3JwLCBzcnYpOworCQlmd3JyX2RlcXVldWVfc3J2KHNydik7CisJCWdycC0+Y3Vycl9wb3MrKzsKKwkJaWYgKCFzcnYtPm1heGNvbm4gfHwgKCFzcnYtPm5icGVuZCAmJiBzcnYtPnNlcnZlZCA8IHNydl9keW5hbWljX21heGNvbm4oc3J2KSkpIHsKKwkJCS8qIG1ha2Ugc3VyZSBpdCBpcyBub3QgdGhlIHNlcnZlciB3ZSBhcmUgdHJ5aW5nIHRvIGV4Y2x1ZGUuLi4gKi8KKwkJCWlmIChzcnYgIT0gc3J2dG9hdm9pZCB8fCBhdm9pZGVkKQorCQkJCWJyZWFrOworCisJCQlhdm9pZGVkID0gc3J2OyAvKiAuLi5idXQgcmVtZW1iZXIgdGhhdCBpcyB3YXMgc2VsZWN0ZWQgeWV0IGF2b2lkZWQgKi8KKwkJfQorCisJCS8qIHRoZSBzZXJ2ZXIgaXMgc2F0dXJhdGVkIG9yIGF2b2lkZWQsIGxldCdzIGNoYWluIGl0IGZvciBsYXRlciByZWluc2VydGlvbiAqLworCQlzcnYtPm5leHRfZnVsbCA9IGZ1bGw7CisJCWZ1bGwgPSBzcnY7CisJfQorCisJLyogT0ssIHdlIGdvdCB0aGUgYmVzdCBzZXJ2ZXIsIGxldCdzIHVwZGF0ZSBpdCAqLworCWZ3cnJfcXVldWVfc3J2KHNydik7CisKKyByZXF1ZXVlX3NlcnZlcnM6CisJLyogUmVxdWV1ZSBhbGwgZXh0cmFjdGVkIHNlcnZlcnMuIElmIGZ1bGw9PXNydiB0aGVuIGl0IHdhcworCSAqIGF2b2lkZWQgKHVuc3VjZXNzZnVsbHkpIGFuZCBjaGFpbmVkLCBvbWl0IGl0IG5vdy4KKwkgKi8KKwlpZiAodW5saWtlbHkoZnVsbCAhPSBOVUxMKSkgeworCQlpZiAoc3dpdGNoZWQpIHsKKwkJCS8qIHRoZSB0cmVlIGhhcyBzd2l0Y2hlZCwgcmVxdWV1ZSBhbGwgZXh0cmFjdGVkIHNlcnZlcnMKKwkJCSAqIGludG8gImluaXQiLCBiZWNhdXNlIHRoZWlyIHBsYWNlIHdhcyBsb3N0LCBhbmQgb25seQorCQkJICogdGhlaXIgd2VpZ2h0IG1hdHRlcnMuCisJCQkgKi8KKwkJCWRvIHsKKwkJCQlpZiAobGlrZWx5KGZ1bGwgIT0gc3J2KSkKKwkJCQkJZndycl9xdWV1ZV9ieV93ZWlnaHQoZ3JwLT5pbml0LCBmdWxsKTsKKwkJCQlmdWxsID0gZnVsbC0+bmV4dF9mdWxsOworCQkJfSB3aGlsZSAoZnVsbCk7CisJCX0gZWxzZSB7CisJCQkvKiByZXF1ZXVlIGFsbCBleHRyYWN0ZWQgc2VydmVycyBqdXN0IGFzIGlmIHRoZXkgd2VyZSBjb25zdW1lZAorCQkJICogc28gdGhhdCB0aGV5IHJlZ2FpbiB0aGVpciBleHBlY3RlZCBwbGFjZS4KKwkJCSAqLworCQkJZG8geworCQkJCWlmIChsaWtlbHkoZnVsbCAhPSBzcnYpKQorCQkJCQlmd3JyX3F1ZXVlX3NydihmdWxsKTsKKwkJCQlmdWxsID0gZnVsbC0+bmV4dF9mdWxsOworCQkJfSB3aGlsZSAoZnVsbCk7CisJCX0KKwl9CisJcmV0dXJuIHNydjsKK30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3NyYy9sYl9tYXAuYyBiL3NyYy9sYl9tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODUwYTBhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xiX21hcC5jCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogTWFwLWJhc2VkIGxvYWQtYmFsYW5jaW5nIChSUiBhbmQgSEFTSCkKKyAqCisgKiBDb3B5cmlnaHQgMjAwMC0yMDA5IFdpbGx5IFRhcnJlYXUgPHdAMXd0LmV1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24vY29tcGF0Lmg+CisjaW5jbHVkZSA8Y29tbW9uL2NvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi9kZWJ1Zy5oPgorI2luY2x1ZGUgPGNvbW1vbi9lYjMydHJlZS5oPgorCisjaW5jbHVkZSA8dHlwZXMvZ2xvYmFsLmg+CisjaW5jbHVkZSA8dHlwZXMvc2VydmVyLmg+CisKKyNpbmNsdWRlIDxwcm90by9iYWNrZW5kLmg+CisjaW5jbHVkZSA8cHJvdG8vcHJvdG9faHR0cC5oPgorI2luY2x1ZGUgPHByb3RvL3Byb3RvX3RjcC5oPgorI2luY2x1ZGUgPHByb3RvL3F1ZXVlLmg+CisKKy8qIHRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgbWFwIGFjY29yZGluZyB0byBzZXJ2ZXIgPHNydj4ncyBuZXcgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIG1hcF9zZXRfc2VydmVyX3N0YXR1c19kb3duKHN0cnVjdCBzZXJ2ZXIgKnNydikKK3sKKwlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OworCisJaWYgKHNydi0+c3RhdGUgPT0gc3J2LT5wcmV2X3N0YXRlICYmCisJICAgIHNydi0+ZXdlaWdodCA9PSBzcnYtPnByZXZfZXdlaWdodCkKKwkJcmV0dXJuOworCisJaWYgKHNydl9pc191c2FibGUoc3J2LT5zdGF0ZSwgc3J2LT5ld2VpZ2h0KSkKKwkJZ290byBvdXRfdXBkYXRlX3N0YXRlOworCisJLyogRklYTUU6IGNvdWxkIGJlIG9wdGltaXplZCBzaW5jZSB3ZSBrbm93IHdoYXQgY2hhbmdlZCAqLworCXJlY291bnRfc2VydmVycyhwKTsKKwl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7CisJcC0+bGJwcm0ubWFwLnN0YXRlIHw9IFBSX01BUF9SRUNBTEM7Cisgb3V0X3VwZGF0ZV9zdGF0ZToKKwlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOworCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIG1hcCBhY2NvcmRpbmcgdG8gc2VydmVyIDxzcnY+J3MgbmV3IHN0YXRlICovCitzdGF0aWMgdm9pZCBtYXBfc2V0X3NlcnZlcl9zdGF0dXNfdXAoc3RydWN0IHNlcnZlciAqc3J2KQoreworCXN0cnVjdCBwcm94eSAqcCA9IHNydi0+cHJveHk7CisKKwlpZiAoc3J2LT5zdGF0ZSA9PSBzcnYtPnByZXZfc3RhdGUgJiYKKwkgICAgc3J2LT5ld2VpZ2h0ID09IHNydi0+cHJldl9ld2VpZ2h0KQorCQlyZXR1cm47CisKKwlpZiAoIXNydl9pc191c2FibGUoc3J2LT5zdGF0ZSwgc3J2LT5ld2VpZ2h0KSkKKwkJZ290byBvdXRfdXBkYXRlX3N0YXRlOworCisJLyogRklYTUU6IGNvdWxkIGJlIG9wdGltaXplZCBzaW5jZSB3ZSBrbm93IHdoYXQgY2hhbmdlZCAqLworCXJlY291bnRfc2VydmVycyhwKTsKKwl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7CisJcC0+bGJwcm0ubWFwLnN0YXRlIHw9IFBSX01BUF9SRUNBTEM7Cisgb3V0X3VwZGF0ZV9zdGF0ZToKKwlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOworCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHJlY29tcHV0ZXMgdGhlIHNlcnZlciBtYXAgZm9yIHByb3h5IHB4LiBJdCByZWxpZXMgb24KKyAqIHB4LT5sYnBybS50b3Rfd2FjdCwgdG90X3diY2ssIHRvdF91c2VkLCB0b3Rfd2VpZ2h0LCBzbyBpdCBtdXN0IGJlCisgKiBjYWxsZWQgYWZ0ZXIgcmVjb3VudF9zZXJ2ZXJzKCkuIEl0IGFsc28gZXhwZWN0cyBweC0+bGJwcm0ubWFwLnNydgorICogdG8gYmUgYWxsb2NhdGVkIHdpdGggdGhlIGxhcmdlc3Qgc2l6ZSBuZWVkZWQuIEl0IHVwZGF0ZXMgdG90X3dlaWdodC4KKyAqLwordm9pZCByZWNhbGNfc2VydmVyX21hcChzdHJ1Y3QgcHJveHkgKnB4KQoreworCWludCBvLCB0b3QsIGZsYWc7CisJc3RydWN0IHNlcnZlciAqY3VyLCAqYmVzdDsKKworCXN3aXRjaCAocHgtPmxicHJtLnRvdF91c2VkKSB7CisJY2FzZSAwOgkvKiBubyBzZXJ2ZXIgKi8KKwkJcHgtPmxicHJtLm1hcC5zdGF0ZSAmPSB+UFJfTUFQX1JFQ0FMQzsKKwkJcmV0dXJuOworCWNhc2UgMTogLyogb25seSBvbmUgc2VydmVyLCBqdXN0IGZpbGwgZmlyc3QgZW50cnkgKi8KKwkJdG90ID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdG90ID0gcHgtPmxicHJtLnRvdF93ZWlnaHQ7CisJCWJyZWFrOworCX0KKworCS8qIGhlcmUgd2UgKmtub3cqIHRoYXQgd2UgaGF2ZSBzb21lIHNlcnZlcnMgKi8KKwlpZiAocHgtPnNydl9hY3QpCisJCWZsYWcgPSBTUlZfUlVOTklORzsKKwllbHNlCisJCWZsYWcgPSBTUlZfUlVOTklORyB8IFNSVl9CQUNLVVA7CisKKwkvKiB0aGlzIGFsZ29yaXRobSBnaXZlcyBwcmlvcml0eSB0byB0aGUgZmlyc3Qgc2VydmVyLCB3aGljaCBtZWFucyB0aGF0CisJICogaXQgd2lsbCByZXNwZWN0IHRoZSBkZWNsYXJhdGlvbiBvcmRlciBmb3IgZXF1aXZhbGVudCB3ZWlnaHRzLCBhbmQKKwkgKiB0aGF0IHdoYXRldmVyIHRoZSB3ZWlnaHRzLCB0aGUgZmlyc3Qgc2VydmVyIGNhbGxlZCB3aWxsIGFsd2F5cyBiZQorCSAqIHRoZSBmaXJzdCBkZWNsYXJlZC4gVGhpcyBpcyBhbiBpbXBvcnRhbnQgYXN1bXB0aW9uIGZvciB0aGUgYmFja3VwCisJICogY2FzZSwgd2hlcmUgd2Ugd2FudCB0aGUgZmlyc3Qgc2VydmVyIG9ubHkuCisJICovCisJZm9yIChjdXIgPSBweC0+c3J2OyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkKKwkJY3VyLT53c2NvcmUgPSAwOworCisJZm9yIChvID0gMDsgbyA8IHRvdDsgbysrKSB7CisJCWludCBtYXggPSAwOworCQliZXN0ID0gTlVMTDsKKwkJZm9yIChjdXIgPSBweC0+c3J2OyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgeworCQkJaWYgKGN1ci0+ZXdlaWdodCAmJgorCQkJICAgIGZsYWcgPT0gKGN1ci0+c3RhdGUgJgorCQkJCSAgICAgKFNSVl9SVU5OSU5HIHwgU1JWX0dPSU5HRE9XTiB8IFNSVl9CQUNLVVApKSkgeworCQkJCWludCB2OworCisJCQkJLyogSWYgd2UgYXJlIGZvcmNlZCB0byByZXR1cm4gb25seSBvbmUgc2VydmVyLCB3ZSBkb24ndCB3YW50IHRvCisJCQkJICogZ28gZnVydGhlciwgYmVjYXVzZSB3ZSB3b3VsZCByZXR1cm4gdGhlIHdyb25nIG9uZSBkdWUgdG8KKwkJCQkgKiBkaXZpZGUgb3ZlcmZsb3cuCisJCQkJICovCisJCQkJaWYgKHRvdCA9PSAxKSB7CisJCQkJCWJlc3QgPSBjdXI7CisJCQkJCS8qIG5vdGUgdGhhdCBiZXN0LT53c2NvcmUgd2lsbCBiZSB3cm9uZyBidXQgd2UgZG9uJ3QgY2FyZSAqLworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljdXItPndzY29yZSArPSBjdXItPmV3ZWlnaHQ7CisJCQkJdiA9IChjdXItPndzY29yZSArIHRvdCkgLyB0b3Q7IC8qIHJlc3VsdCBiZXR3ZWVuIDAgYW5kIDMgKi8KKwkJCQlpZiAoYmVzdCA9PSBOVUxMIHx8IHYgPiBtYXgpIHsKKwkJCQkJbWF4ID0gdjsKKwkJCQkJYmVzdCA9IGN1cjsKKwkJCQl9CisJCQl9CisJCX0KKwkJcHgtPmxicHJtLm1hcC5zcnZbb10gPSBiZXN0OworCQliZXN0LT53c2NvcmUgLT0gdG90OworCX0KKwlweC0+bGJwcm0ubWFwLnN0YXRlICY9IH5QUl9NQVBfUkVDQUxDOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIG9mIGJ1aWxkaW5nIHRoZSBzZXJ2ZXIgTUFQIGZvciBtYXAtYmFzZWQgTEIKKyAqIGFsZ29yaXRobXMsIGFsbG9jYXRpbmcgdGhlIG1hcCwgYW5kIHNldHRpbmcgcC0+bGJwcm0ud211bHQgdG8gdGhlIEdDRCBvZiB0aGUKKyAqIHdlaWdodHMgaWYgYXBwbGljYWJsZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHByb3h5LCBhdCBjb25maWcKKyAqIHRpbWUuCisgKi8KK3ZvaWQgaW5pdF9zZXJ2ZXJfbWFwKHN0cnVjdCBwcm94eSAqcCkKK3sKKwlzdHJ1Y3Qgc2VydmVyICpzcnY7CisJaW50IHBnY2Q7CisJaW50IGFjdCwgYmNrOworCisJcC0+bGJwcm0uc2V0X3NlcnZlcl9zdGF0dXNfdXAgICA9IG1hcF9zZXRfc2VydmVyX3N0YXR1c191cDsKKwlwLT5sYnBybS5zZXRfc2VydmVyX3N0YXR1c19kb3duID0gbWFwX3NldF9zZXJ2ZXJfc3RhdHVzX2Rvd247CisJcC0+bGJwcm0udXBkYXRlX3NlcnZlcl9ld2VpZ2h0ID0gTlVMTDsKKyAKKwlpZiAoIXAtPnNydikKKwkJcmV0dXJuOworCisJLyogV2Ugd2lsbCBmYWN0b3IgdGhlIHdlaWdodHMgdG8gcmVkdWNlIHRoZSB0YWJsZSwKKwkgKiB1c2luZyBFdWNsaWRlJ3MgbGFyZ2VzdCBjb21tb24gZGl2aXNvciBhbGdvcml0aG0uCisJICogU2luY2Ugd2UgbWF5IGhhdmUgemVybyB3ZWlnaHRzLCB3ZSBoYXZlIHRvIGZpcnN0CisJICogZmluZCBhIG5vbi16ZXJvIHdlaWdodCBzZXJ2ZXIuCisJICovCisJcGdjZCA9IDE7CisJc3J2ID0gcC0+c3J2OworCXdoaWxlIChzcnYgJiYgIXNydi0+dXdlaWdodCkKKwkJc3J2ID0gc3J2LT5uZXh0OworCisJaWYgKHNydikgeworCQlwZ2NkID0gc3J2LT51d2VpZ2h0OyAvKiBub3RlOiBjYW5ub3QgYmUgemVybyAqLworCQl3aGlsZSAocGdjZCA+IDEgJiYgKHNydiA9IHNydi0+bmV4dCkpIHsKKwkJCWludCB3ID0gc3J2LT51d2VpZ2h0OworCQkJd2hpbGUgKHcpIHsKKwkJCQlpbnQgdCA9IHBnY2QgJSB3OworCQkJCXBnY2QgPSB3OworCQkJCXcgPSB0OworCQkJfQorCQl9CisJfQorCisJLyogSXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBrbm93IHdoYXQgZmFjdG9yIHRvIGFwcGx5CisJICogdG8gdGhlIGJhY2tlbmQncyBlZmZlY3RpdmUgd2VpZ2h0IHRvIGtub3cgaXRzIHJlYWwKKwkgKiB3ZWlnaHQuCisJICovCisJcC0+bGJwcm0ud211bHQgPSBwZ2NkOworCisJYWN0ID0gYmNrID0gMDsKKwlmb3IgKHNydiA9IHAtPnNydjsgc3J2OyBzcnYgPSBzcnYtPm5leHQpIHsKKwkJc3J2LT5ld2VpZ2h0ID0gc3J2LT51d2VpZ2h0IC8gcGdjZDsKKwkJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7CisJCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7CisJCWlmIChzcnYtPnN0YXRlICYgU1JWX0JBQ0tVUCkKKwkJCWJjayArPSBzcnYtPmV3ZWlnaHQ7CisJCWVsc2UKKwkJCWFjdCArPSBzcnYtPmV3ZWlnaHQ7CisJfQorCisJLyogdGhpcyBpcyB0aGUgbGFyZ2VzdCBtYXAgd2Ugd2lsbCBldmVyIG5lZWQgZm9yIHRoaXMgc2VydmVycyBsaXN0ICovCisJaWYgKGFjdCA8IGJjaykKKwkJYWN0ID0gYmNrOworCisJaWYgKCFhY3QpCisJCWFjdCA9IDE7CisKKwlwLT5sYnBybS5tYXAuc3J2ID0gKHN0cnVjdCBzZXJ2ZXIgKiopY2FsbG9jKGFjdCwgc2l6ZW9mKHN0cnVjdCBzZXJ2ZXIgKikpOworCS8qIHJlY291bnRzIHNlcnZlcnMgYW5kIHRoZWlyIHdlaWdodHMgKi8KKwlwLT5sYnBybS5tYXAuc3RhdGUgPSBQUl9NQVBfUkVDQUxDOworCXJlY291bnRfc2VydmVycyhwKTsKKwl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7CisJcmVjYWxjX3NlcnZlcl9tYXAocCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGZpbmQgYSBydW5uaW5nIHNlcnZlciB3aXRoIGZyZWUgY29ubmVjdGlvbiBzbG90cyBmb3IKKyAqIHRoZSBwcm94eSA8cHg+IGZvbGxvd2luZyB0aGUgcm91bmQtcm9iaW4gbWV0aG9kLgorICogSWYgYW55IHNlcnZlciBpcyBmb3VuZCwgaXQgd2lsbCBiZSByZXR1cm5lZCBhbmQgcHgtPmxicHJtLm1hcC5ycl9pZHggd2lsbCBiZSB1cGRhdGVkCisgKiB0byBwb2ludCB0byB0aGUgbmV4dCBzZXJ2ZXIuIElmIG5vIHZhbGlkIHNlcnZlciBpcyBmb3VuZCwgTlVMTCBpcyByZXR1cm5lZC4KKyAqLworc3RydWN0IHNlcnZlciAqbWFwX2dldF9zZXJ2ZXJfcnIoc3RydWN0IHByb3h5ICpweCwgc3RydWN0IHNlcnZlciAqc3J2dG9hdm9pZCkKK3sKKwlpbnQgbmV3aWR4LCBhdm9pZGlkeDsKKwlzdHJ1Y3Qgc2VydmVyICpzcnYsICphdm9pZGVkOworCisJaWYgKHB4LT5sYnBybS50b3Rfd2VpZ2h0ID09IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKHB4LT5sYnBybS5tYXAuc3RhdGUgJiBQUl9NQVBfUkVDQUxDKQorCQlyZWNhbGNfc2VydmVyX21hcChweCk7CisKKwlpZiAocHgtPmxicHJtLm1hcC5ycl9pZHggPCAwIHx8IHB4LT5sYnBybS5tYXAucnJfaWR4ID49IHB4LT5sYnBybS50b3Rfd2VpZ2h0KQorCQlweC0+bGJwcm0ubWFwLnJyX2lkeCA9IDA7CisJbmV3aWR4ID0gcHgtPmxicHJtLm1hcC5ycl9pZHg7CisKKwlhdm9pZGVkID0gTlVMTDsKKwlhdm9pZGlkeCA9IDA7IC8qIHNodXQgYSBnY2Mgd2FybmluZyAqLworCWRvIHsKKwkJc3J2ID0gcHgtPmxicHJtLm1hcC5zcnZbbmV3aWR4KytdOworCQlpZiAoIXNydi0+bWF4Y29ubiB8fCBzcnYtPmN1cl9zZXNzIDwgc3J2X2R5bmFtaWNfbWF4Y29ubihzcnYpKSB7CisJCQkvKiBtYWtlIHN1cmUgaXQgaXMgbm90IHRoZSBzZXJ2ZXIgd2UgYXJlIHRyeSB0byBleGNsdWRlLi4uICovCisJCQlpZiAoc3J2ICE9IHNydnRvYXZvaWQpIHsKKwkJCQlweC0+bGJwcm0ubWFwLnJyX2lkeCA9IG5ld2lkeDsKKwkJCQlyZXR1cm4gc3J2OworCQkJfQorCisJCQlhdm9pZGVkID0gc3J2OwkvKiAuLi5idXQgcmVtZW1iZXIgdGhhdCBpcyB3YXMgc2VsZWN0ZWQgeWV0IGF2b2lkZWQgKi8KKwkJCWF2b2lkaWR4ID0gbmV3aWR4OworCQl9CisJCWlmIChuZXdpZHggPT0gcHgtPmxicHJtLnRvdF93ZWlnaHQpCisJCQluZXdpZHggPSAwOworCX0gd2hpbGUgKG5ld2lkeCAhPSBweC0+bGJwcm0ubWFwLnJyX2lkeCk7CisKKwlpZiAoYXZvaWRlZCkKKwkJcHgtPmxicHJtLm1hcC5ycl9pZHggPSBhdm9pZGlkeDsKKworCS8qIHJldHVybiBOVUxMIG9yIHNydnRvYXZvaWQgaWYgZm91bmQgKi8KKwlyZXR1cm4gYXZvaWRlZDsKK30KKworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwo=