LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmlhcC5jCiAqIFZlcnNpb246ICAgICAgIDAuOAogKiBEZXNjcmlwdGlvbjogICBJbmZvcm1hdGlvbiBBY2Nlc3MgUHJvdG9jb2wgKElBUCkKICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFRodSBBdWcgMjEgMDA6MDI6MDcgMTk5NwogKiBNb2RpZmllZCBhdDogICBTYXQgRGVjIDI1IDE2OjQyOjQyIDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKgogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwKICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CiAqCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgoKI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFzX29iamVjdC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXBfZXZlbnQuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CgojaWZkZWYgQ09ORklHX0lSREFfREVCVUcKLyogRklYTUU6IFRoaXMgb25lIHNob3VsZCBnbyBpbiBpcmxtcC5jICovCnN0YXRpYyBjb25zdCBjaGFyICppYXNfY2hhcnNldF90eXBlc1tdID0gewoJIkNTX0FTQ0lJIiwKCSJDU19JU09fODg1OV8xIiwKCSJDU19JU09fODg1OV8yIiwKCSJDU19JU09fODg1OV8zIiwKCSJDU19JU09fODg1OV80IiwKCSJDU19JU09fODg1OV81IiwKCSJDU19JU09fODg1OV82IiwKCSJDU19JU09fODg1OV83IiwKCSJDU19JU09fODg1OV84IiwKCSJDU19JU09fODg1OV85IiwKCSJDU19VTklDT0RFIgp9OwojZW5kaWYJLyogQ09ORklHX0lSREFfREVCVUcgKi8KCnN0YXRpYyBoYXNoYmluX3QgKmlyaWFwID0gTlVMTDsKc3RhdGljIHZvaWQgKnNlcnZpY2VfaGFuZGxlOwoKc3RhdGljIHZvaWQgX19pcmlhcF9jbG9zZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYpOwpzdGF0aWMgaW50IGlyaWFwX3JlZ2lzdGVyX2xzYXAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBfX3U4IHNsc2FwX3NlbCwgaW50IG1vZGUpOwpzdGF0aWMgdm9pZCBpcmlhcF9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCQlMTV9SRUFTT04gcmVhc29uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIHZvaWQgaXJpYXBfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkgICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCBfX3UzMiBtYXhfc2R1X3NpemUsCgkJCQkgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLAoJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIHZvaWQgaXJpYXBfY29ubmVjdF9jb25maXJtKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLAoJCQkJICBfX3UzMiBtYXhfc2R1X3NpemUsIF9fdTggbWF4X2hlYWRlcl9zaXplLAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmlhcF9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKCnN0YXRpYyB2b2lkIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSk7CgpzdGF0aWMgaW5saW5lIHZvaWQgaXJpYXBfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc3RydWN0IGlyaWFwX2NiICpzZWxmLCAKCQkJCQkgICAgICBpbnQgdGltZW91dCkgCnsKCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyLCB0aW1lb3V0LCBzZWxmLCAKCQkJIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQpOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9pbml0ICh2b2lkKQogKgogKiAgICBJbml0aWFsaXplcyB0aGUgSXJJQVAgbGF5ZXIsIGNhbGxlZCBieSB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGNvZGUKICogICAgaW4gaXJtb2QuYwogKi8KaW50IF9faW5pdCBpcmlhcF9pbml0KHZvaWQpCnsKCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CglzdHJ1Y3QgaXJpYXBfY2IgKnNlcnZlcjsKCV9fdTggb2N0X3NlcVs2XTsKCV9fdTE2IGhpbnRzOwoKCS8qIEFsbG9jYXRlIG1hc3RlciBhcnJheSAqLwoJaXJpYXAgPSBoYXNoYmluX25ldyhIQl9MT0NLKTsKCWlmICghaXJpYXApCgkJcmV0dXJuIC1FTk9NRU07CgoJLyogT2JqZWN0IHJlcG9zaXRvcnkgLSBkZWZpbmVkIGluIGlyaWFzX29iamVjdC5jICovCglpcmlhc19vYmplY3RzID0gaGFzaGJpbl9uZXcoSEJfTE9DSyk7CglpZiAoIWlyaWFzX29iamVjdHMpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBDYW4ndCBhbGxvY2F0ZSBpcmlhc19vYmplY3RzIGhhc2hiaW4hXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJaGFzaGJpbl9kZWxldGUoaXJpYXAsIE5VTEwpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCS8qCgkgKiAgUmVnaXN0ZXIgc29tZSBkZWZhdWx0IHNlcnZpY2VzIGZvciBJckxNUAoJICovCgloaW50cyAgPSBpcmxtcF9zZXJ2aWNlX3RvX2hpbnQoU19DT01QVVRFUik7CglzZXJ2aWNlX2hhbmRsZSA9IGlybG1wX3JlZ2lzdGVyX3NlcnZpY2UoaGludHMpOwoKCS8qIFJlZ2lzdGVyIHRoZSBEZXZpY2Ugb2JqZWN0IHdpdGggTE0tSUFTICovCglvYmogPSBpcmlhc19uZXdfb2JqZWN0KCJEZXZpY2UiLCBJQVNfREVWSUNFX0lEKTsKCWlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKG9iaiwgIkRldmljZU5hbWUiLCAiTGludXgiLCBJQVNfS0VSTkVMX0FUVFIpOwoKCW9jdF9zZXFbMF0gPSAweDAxOyAgLyogVmVyc2lvbiAxICovCglvY3Rfc2VxWzFdID0gMHgwMDsgIC8qIElBUyBzdXBwb3J0IGJpdHMgKi8KCW9jdF9zZXFbMl0gPSAweDAwOyAgLyogTE0tTVVYIHN1cHBvcnQgYml0cyAqLwojaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKCW9jdF9zZXFbMl0gfD0gMHgwNDsgLyogQ29ubmVjdGlvbmxlc3MgRGF0YSBzdXBwb3J0ICovCiNlbmRpZgoJaXJpYXNfYWRkX29jdHNlcV9hdHRyaWIob2JqLCAiSXJMTVBTdXBwb3J0Iiwgb2N0X3NlcSwgMywKCQkJCUlBU19LRVJORUxfQVRUUik7Cglpcmlhc19pbnNlcnRfb2JqZWN0KG9iaik7CgoJLyoKCSAqICBSZWdpc3RlciBzZXJ2ZXIgc3VwcG9ydCB3aXRoIElyTE1QIHNvIHdlIGNhbiBhY2NlcHQgaW5jb21pbmcKCSAqICBjb25uZWN0aW9ucwoJICovCglzZXJ2ZXIgPSBpcmlhcF9vcGVuKExTQVBfSUFTLCBJQVNfU0VSVkVSLCBOVUxMLCBOVUxMKTsKCWlmICghc2VydmVyKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5hYmxlIHRvIG9wZW4gc2VydmVyXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiAtMTsKCX0KCWlyaWFwX3JlZ2lzdGVyX2xzYXAoc2VydmVyLCBMU0FQX0lBUywgSUFTX1NFUlZFUik7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2NsZWFudXAgKHZvaWQpCiAqCiAqICAgIEluaXRpYWxpemVzIHRoZSBJcklBUCBsYXllciwgY2FsbGVkIGJ5IHRoZSBtb2R1bGUgY2xlYW51cCBjb2RlIGluCiAqICAgIGlybW9kLmMKICovCnZvaWQgX19leGl0IGlyaWFwX2NsZWFudXAodm9pZCkKewoJaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKHNlcnZpY2VfaGFuZGxlKTsKCgloYXNoYmluX2RlbGV0ZShpcmlhcCwgKEZSRUVfRlVOQykgX19pcmlhcF9jbG9zZSk7CgloYXNoYmluX2RlbGV0ZShpcmlhc19vYmplY3RzLCAoRlJFRV9GVU5DKSBfX2lyaWFzX2RlbGV0ZV9vYmplY3QpOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9vcGVuICh2b2lkKQogKgogKiAgICBPcGVucyBhbiBpbnN0YW5jZSBvZiB0aGUgSXJJQVAgbGF5ZXIsIGFuZCByZWdpc3RlcnMgd2l0aCBJckxNUAogKi8Kc3RydWN0IGlyaWFwX2NiICppcmlhcF9vcGVuKF9fdTggc2xzYXBfc2VsLCBpbnQgbW9kZSwgdm9pZCAqcHJpdiwKCQkJICAgIENPTkZJUk1fQ0FMTEJBQ0sgY2FsbGJhY2spCnsKCXN0cnVjdCBpcmlhcF9jYiAqc2VsZjsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCXNlbGYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJpYXBfY2IpLCBHRlBfQVRPTUlDKTsKCWlmICghc2VsZikgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgkvKgoJICogIEluaXRpYWxpemUgaW5zdGFuY2UKCSAqLwoJbWVtc2V0KHNlbGYsIDAsIHNpemVvZihzdHJ1Y3QgaXJpYXBfY2IpKTsKCglzZWxmLT5tYWdpYyA9IElBU19NQUdJQzsKCXNlbGYtPm1vZGUgPSBtb2RlOwoJaWYgKG1vZGUgPT0gSUFTX0NMSUVOVCkKCQlpcmlhcF9yZWdpc3Rlcl9sc2FwKHNlbGYsIHNsc2FwX3NlbCwgbW9kZSk7CgoJc2VsZi0+Y29uZmlybSA9IGNhbGxiYWNrOwoJc2VsZi0+cHJpdiA9IHByaXY7CgoJLyogaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3JlcXVlc3QoKSB3aWxsIGNvbnN0cnVjdCBwYWNrZXRzIGJlZm9yZQoJICogd2UgY29ubmVjdCwgc28gdGhpcyBtdXN0IGhhdmUgYSBzYW5lIHZhbHVlLi4uIEplYW4gSUkgKi8KCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IExNUF9NQVhfSEVBREVSOwoKCWluaXRfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKCgloYXNoYmluX2luc2VydChpcmlhcCwgKGlyZGFfcXVldWVfdCAqKSBzZWxmLCAobG9uZykgc2VsZiwgTlVMTCk7CgoJLyogSW5pdGlhbGl6ZSBzdGF0ZSBtYWNoaW5lcyAqLwoJaXJpYXBfbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgU19ESVNDT05ORUNUKTsKCWlyaWFwX25leHRfY2FsbF9zdGF0ZShzZWxmLCBTX01BS0VfQ0FMTCk7CglpcmlhcF9uZXh0X3NlcnZlcl9zdGF0ZShzZWxmLCBSX0RJU0NPTk5FQ1QpOwoJaXJpYXBfbmV4dF9yX2Nvbm5lY3Rfc3RhdGUoc2VsZiwgUl9XQUlUSU5HKTsKCglyZXR1cm4gc2VsZjsKfQpFWFBPUlRfU1lNQk9MKGlyaWFwX29wZW4pOwoKLyoKICogRnVuY3Rpb24gX19pcmlhcF9jbG9zZSAoc2VsZikKICoKICogICAgUmVtb3ZlcyAoZGVhbGxvY2F0ZXMpIHRoZSBJcklBUCBpbnN0YW5jZQogKgogKi8Kc3RhdGljIHZvaWQgX19pcmlhcF9jbG9zZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CgoJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CgoJaWYgKHNlbGYtPnJlcXVlc3Rfc2tiKQoJCWRldl9rZnJlZV9za2Ioc2VsZi0+cmVxdWVzdF9za2IpOwoKCXNlbGYtPm1hZ2ljID0gMDsKCglrZnJlZShzZWxmKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfY2xvc2UgKHZvaWQpCiAqCiAqICAgIENsb3NlcyBJcklBUCBhbmQgZGVyZWdpc3RlcnMgd2l0aCBJckxNUAogKi8Kdm9pZCBpcmlhcF9jbG9zZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYpCnsKCXN0cnVjdCBpcmlhcF9jYiAqZW50cnk7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCglpZiAoc2VsZi0+bHNhcCkgewoJCWlybG1wX2Nsb3NlX2xzYXAoc2VsZi0+bHNhcCk7CgkJc2VsZi0+bHNhcCA9IE5VTEw7Cgl9CgoJZW50cnkgPSAoc3RydWN0IGlyaWFwX2NiICopIGhhc2hiaW5fcmVtb3ZlKGlyaWFwLCAobG9uZykgc2VsZiwgTlVMTCk7CglJUkRBX0FTU0VSVChlbnRyeSA9PSBzZWxmLCByZXR1cm47KTsKCglfX2lyaWFwX2Nsb3NlKHNlbGYpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXBfY2xvc2UpOwoKc3RhdGljIGludCBpcmlhcF9yZWdpc3Rlcl9sc2FwKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgX191OCBzbHNhcF9zZWwsIGludCBtb2RlKQp7Cglub3RpZnlfdCBub3RpZnk7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglpcmRhX25vdGlmeV9pbml0KCZub3RpZnkpOwoJbm90aWZ5LmNvbm5lY3RfY29uZmlybSAgICAgICA9IGlyaWFwX2Nvbm5lY3RfY29uZmlybTsKCW5vdGlmeS5jb25uZWN0X2luZGljYXRpb24gICAgPSBpcmlhcF9jb25uZWN0X2luZGljYXRpb247Cglub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uID0gaXJpYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uOwoJbm90aWZ5LmRhdGFfaW5kaWNhdGlvbiAgICAgICA9IGlyaWFwX2RhdGFfaW5kaWNhdGlvbjsKCW5vdGlmeS5pbnN0YW5jZSA9IHNlbGY7CglpZiAobW9kZSA9PSBJQVNfQ0xJRU5UKQoJCXN0cmNweShub3RpZnkubmFtZSwgIklySUFTIGNsaSIpOwoJZWxzZQoJCXN0cmNweShub3RpZnkubmFtZSwgIklySUFTIHNydiIpOwoKCXNlbGYtPmxzYXAgPSBpcmxtcF9vcGVuX2xzYXAoc2xzYXBfc2VsLCAmbm90aWZ5LCAwKTsKCWlmIChzZWxmLT5sc2FwID09IE5VTEwpIHsKCQlJUkRBX0VSUk9SKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlZCBMU0FQIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gLTE7Cgl9CglzZWxmLT5zbHNhcF9zZWwgPSBzZWxmLT5sc2FwLT5zbHNhcF9zZWw7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAoaGFuZGxlLCByZWFzb24pCiAqCiAqICAgIEdvdCBkaXNjb25uZWN0LCBzbyBjbGVhbiB1cCBldmVyeXRoaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbm5lY3Rpb24KICoKICovCnN0YXRpYyB2b2lkIGlyaWFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJCUxNX1JFQVNPTiByZWFzb24sCgkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGlyaWFwX2NiICpzZWxmOwoKCUlSREFfREVCVUcoNCwgIiVzKCksIHJlYXNvbj0lc1xuIiwgX19GVU5DVElPTl9fLCBpcmxtcF9yZWFzb25zW3JlYXNvbl0pOwoKCXNlbGYgPSAoc3RydWN0IGlyaWFwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCUlSREFfQVNTRVJUKGlyaWFwICE9IE5VTEwsIHJldHVybjspOwoKCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOwoKCS8qIE5vdCBuZWVkZWQgKi8KCWlmIChza2IpCgkJZGV2X2tmcmVlX3NrYihza2IpOwoKCWlmIChzZWxmLT5tb2RlID09IElBU19DTElFTlQpIHsKCQlJUkRBX0RFQlVHKDQsICIlcygpLCBkaXNjb25uZWN0IGFzIGNsaWVudFxuIiwgX19GVU5DVElPTl9fKTsKCgoJCWlyaWFwX2RvX2NsaWVudF9ldmVudChzZWxmLCBJQVBfTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OLAoJCQkJICAgICAgTlVMTCk7CgkJLyoKCQkgKiBJbmZvcm0gc2VydmljZSB1c2VyIHRoYXQgdGhlIHJlcXVlc3QgZmFpbGVkIGJ5IHNlbmRpbmcKCQkgKiBpdCBhIE5VTEwgdmFsdWUuIFdhcm5pbmcsIHRoZSBjbGllbnQgbWlnaHQgY2xvc2UgdXMsIHNvCgkJICogcmVtZW1iZXIgbm8gdG8gdXNlIHNlbGYgYW55bW9yZSBhZnRlciBjYWxsaW5nIGNvbmZpcm0KCQkgKi8KCQlpZiAoc2VsZi0+Y29uZmlybSkKCQkJc2VsZi0+Y29uZmlybShJQVNfRElTQ09OTkVDVCwgMCwgTlVMTCwgc2VsZi0+cHJpdik7Cgl9IGVsc2UgewoJCUlSREFfREVCVUcoNCwgIiVzKCksIGRpc2Nvbm5lY3QgYXMgc2VydmVyXG4iLCBfX0ZVTkNUSU9OX18pOwoJCWlyaWFwX2RvX3NlcnZlcl9ldmVudChzZWxmLCBJQVBfTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OLAoJCQkJICAgICAgTlVMTCk7CgkJaXJpYXBfY2xvc2Uoc2VsZik7Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2Rpc2Nvbm5lY3RfcmVxdWVzdCAoaGFuZGxlKQogKi8Kc3RhdGljIHZvaWQgaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCBpcmlhcF9jYiAqc2VsZikKewoJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCXR4X3NrYiA9IGRldl9hbGxvY19za2IoNjQpOwoJaWYgKHR4X3NrYiA9PSBOVUxMKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgQ291bGQgbm90IGFsbG9jYXRlIGFuIHNrX2J1ZmYgb2YgbGVuZ3RoICVkXG4iLCAKCQkJX19GVU5DVElPTl9fLCA2NCk7CgkJcmV0dXJuOwoJfQoKCS8qCgkgKiAgUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYIGNvbnRyb2wgYW5kIExBUCBoZWFkZXIKCSAqLwoJc2tiX3Jlc2VydmUodHhfc2tiLCBMTVBfTUFYX0hFQURFUik7CgoJaXJsbXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmxzYXAsIHR4X3NrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2dldHZhbHVlYnljbGFzcyAoYWRkciwgbmFtZSwgYXR0cikKICoKICogICAgUmV0cmlldmUgYWxsIHZhbHVlcyBmcm9tIGF0dHJpYnV0ZSBpbiBhbGwgb2JqZWN0cyB3aXRoIGdpdmVuIGNsYXNzCiAqICAgIG5hbWUKICovCmludCBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsCgkJCQkgIF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwKCQkJCSAgY2hhciAqbmFtZSwgY2hhciAqYXR0cikKewoJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKCWludCBuYW1lX2xlbiwgYXR0cl9sZW4sIHNrYl9sZW47CglfX3U4ICpmcmFtZTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm4gLTE7KTsKCgkvKiBDbGllbnQgbXVzdCBzdXBwbHkgdGhlIGRlc3RpbmF0aW9uIGRldmljZSBhZGRyZXNzICovCglpZiAoIWRhZGRyKQoJCXJldHVybiAtMTsKCglzZWxmLT5kYWRkciA9IGRhZGRyOwoJc2VsZi0+c2FkZHIgPSBzYWRkcjsKCgkvKgoJICogIFNhdmUgb3BlcmF0aW9uLCBzbyB3ZSBrbm93IHdoYXQgdGhlIGxhdGVyIGluZGljYXRpb24gaXMgYWJvdXQKCSAqLwoJc2VsZi0+b3BlcmF0aW9uID0gR0VUX1ZBTFVFX0JZX0NMQVNTOwoKCS8qIEdpdmUgb3Vyc2VsdmVzIDEwIHNlY3MgdG8gZmluaXNoIHRoaXMgb3BlcmF0aW9uICovCglpcmlhcF9zdGFydF93YXRjaGRvZ190aW1lcihzZWxmLCAxMCpIWik7CgoJbmFtZV9sZW4gPSBzdHJsZW4obmFtZSk7CS8qIFVwIHRvIElBU19NQVhfQ0xBU1NOQU1FID0gNjAgKi8KCWF0dHJfbGVuID0gc3RybGVuKGF0dHIpOwkvKiBVcCB0byBJQVNfTUFYX0FUVFJJQk5BTUUgPSA2MCAqLwoKCXNrYl9sZW4gPSBzZWxmLT5tYXhfaGVhZGVyX3NpemUrMituYW1lX2xlbisxK2F0dHJfbGVuKzQ7Cgl0eF9za2IgPSBkZXZfYWxsb2Nfc2tiKHNrYl9sZW4pOwoJaWYgKCF0eF9za2IpCgkJcmV0dXJuIC1FTk9NRU07CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZSh0eF9za2IsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHR4X3NrYiwgMytuYW1lX2xlbithdHRyX2xlbik7CglmcmFtZSA9IHR4X3NrYi0+ZGF0YTsKCgkvKiBCdWlsZCBmcmFtZSAqLwoJZnJhbWVbMF0gPSBJQVBfTFNUIHwgR0VUX1ZBTFVFX0JZX0NMQVNTOwoJZnJhbWVbMV0gPSBuYW1lX2xlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc2VydCBsZW5ndGggb2YgbmFtZSAqLwoJbWVtY3B5KGZyYW1lKzIsIG5hbWUsIG5hbWVfbGVuKTsgICAgICAgICAgIC8qIEluc2VydCBuYW1lICovCglmcmFtZVsyK25hbWVfbGVuXSA9IGF0dHJfbGVuOyAgICAgICAgICAgICAgLyogSW5zZXJ0IGxlbmd0aCBvZiBhdHRyICovCgltZW1jcHkoZnJhbWUrMytuYW1lX2xlbiwgYXR0ciwgYXR0cl9sZW4pOyAgLyogSW5zZXJ0IGF0dHIgKi8KCglpcmlhcF9kb19jbGllbnRfZXZlbnQoc2VsZiwgSUFQX0NBTExfUkVRVUVTVF9HVkJDLCB0eF9za2IpOwoKCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIHN0YXRlX3NfZGlzY29ubmVjdCgpLiAqLwoJZGV2X2tmcmVlX3NrYih0eF9za2IpOwoKCXJldHVybiAwOwp9CkVYUE9SVF9TWU1CT0woaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3JlcXVlc3QpOwoKLyoKICogRnVuY3Rpb24gaXJpYXBfZ2V0dmFsdWVieWNsYXNzX2NvbmZpcm0gKHNlbGYsIHNrYikKICoKICogICAgR290IHJlc3VsdCBmcm9tIEdldFZhbHVlQnlDbGFzcyBjb21tYW5kLiBQYXJzZSBpdCBhbmQgcmV0dXJuIHJlc3VsdAogKiAgICB0byBzZXJ2aWNlIHVzZXIuCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfY29uZmlybShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsCgkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZTsKCWludCBjaGFyc2V0OwoJX191MzIgdmFsdWVfbGVuOwoJX191MzIgdG1wX2NwdTMyOwoJX191MTYgb2JqX2lkOwoJX191MTYgbGVuOwoJX191OCAgdHlwZTsKCV9fdTggKmZwOwoJaW50IG47CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CgoJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KCWZwID0gc2tiLT5kYXRhOwoJbiA9IDI7CgoJLyogR2V0IGxlbmd0aCwgTVNCIGZpcnN0ICovCglsZW4gPSBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX3UxNiAqKShmcCtuKSkpOyBuICs9IDI7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKSwgbGVuPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CgoJLyogR2V0IG9iamVjdCBJRCwgTVNCIGZpcnN0ICovCglvYmpfaWQgPSBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX3UxNiAqKShmcCtuKSkpOyBuICs9IDI7CgoJdHlwZSA9IGZwW24rK107CglJUkRBX0RFQlVHKDQsICIlcygpLCBWYWx1ZSB0eXBlID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgdHlwZSk7CgoJc3dpdGNoICh0eXBlKSB7CgljYXNlIElBU19JTlRFR0VSOgoJCW1lbWNweSgmdG1wX2NwdTMyLCBmcCtuLCA0KTsgbiArPSA0OwoJCWJlMzJfdG9fY3B1cygmdG1wX2NwdTMyKTsKCQl2YWx1ZSA9IGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlKHRtcF9jcHUzMik7CgoJCS8qICBMZWdhbCB2YWx1ZXMgcmVzdHJpY3RlZCB0byAweDAxLTB4NmYsIHBhZ2UgMTUgaXJ0dHAgKi8KCQlJUkRBX0RFQlVHKDQsICIlcygpLCBsc2FwPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHZhbHVlLT50LmludGVnZXIpOwoJCWJyZWFrOwoJY2FzZSBJQVNfU1RSSU5HOgoJCWNoYXJzZXQgPSBmcFtuKytdOwoKCQlzd2l0Y2ggKGNoYXJzZXQpIHsKCQljYXNlIENTX0FTQ0lJOgoJCQlicmVhazsKLyoJCWNhc2UgQ1NfSVNPXzg4NTlfMTogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfMjogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfMzogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNDogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNTogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNjogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNzogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfODogKi8KLyoJCWNhc2UgQ1NfSVNPXzg4NTlfOTogKi8KLyoJCWNhc2UgQ1NfVU5JQ09ERTogKi8KCQlkZWZhdWx0OgoJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBjaGFyc2V0ICVzLCBub3Qgc3VwcG9ydGVkXG4iLAoJCQkJICAgX19GVU5DVElPTl9fLCBpYXNfY2hhcnNldF90eXBlc1tjaGFyc2V0XSk7CgoJCQkvKiBBYm9ydGluZywgY2xvc2UgY29ubmVjdGlvbiEgKi8KCQkJaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOwoJCQlyZXR1cm47CgkJCS8qIGJyZWFrOyAqLwoJCX0KCQl2YWx1ZV9sZW4gPSBmcFtuKytdOwoJCUlSREFfREVCVUcoNCwgIiVzKCksIHN0cmxlbj0lZFxuIiwgX19GVU5DVElPTl9fLCB2YWx1ZV9sZW4pOwoKCQkvKiBNYWtlIHN1cmUgdGhlIHN0cmluZyBpcyBudWxsLXRlcm1pbmF0ZWQgKi8KCQlmcFtuK3ZhbHVlX2xlbl0gPSAweDAwOwoJCUlSREFfREVCVUcoNCwgIkdvdCBzdHJpbmcgJXNcbiIsIGZwK24pOwoKCQkvKiBXaWxsIHRydW5jYXRlIHRvIElBU19NQVhfU1RSSU5HIGJ5dGVzICovCgkJdmFsdWUgPSBpcmlhc19uZXdfc3RyaW5nX3ZhbHVlKGZwK24pOwoJCWJyZWFrOwoJY2FzZSBJQVNfT0NUX1NFUToKCQl2YWx1ZV9sZW4gPSBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX3UxNiAqKShmcCtuKSkpOwoJCW4gKz0gMjsKCgkJLyogV2lsbCB0cnVuY2F0ZSB0byBJQVNfTUFYX09DVEVUX1NUUklORyBieXRlcyAqLwoJCXZhbHVlID0gaXJpYXNfbmV3X29jdHNlcV92YWx1ZShmcCtuLCB2YWx1ZV9sZW4pOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQl2YWx1ZSA9IGlyaWFzX25ld19taXNzaW5nX3ZhbHVlKCk7CgkJYnJlYWs7Cgl9CgoJLyogRmluaXNoZWQsIGNsb3NlIGNvbm5lY3Rpb24hICovCglpcmlhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZik7CgoJLyogV2FybmluZywgdGhlIGNsaWVudCBtaWdodCBjbG9zZSB1cywgc28gcmVtZW1iZXIgbm8gdG8gdXNlIHNlbGYKCSAqIGFueW1vcmUgYWZ0ZXIgY2FsbGluZyBjb25maXJtCgkgKi8KCWlmIChzZWxmLT5jb25maXJtKQoJCXNlbGYtPmNvbmZpcm0oSUFTX1NVQ0NFU1MsIG9ial9pZCwgdmFsdWUsIHNlbGYtPnByaXYpOwoJZWxzZSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgbWlzc2luZyBoYW5kbGVyIVxuIiwgX19GVU5DVElPTl9fKTsKCQlpcmlhc19kZWxldGVfdmFsdWUodmFsdWUpOwoJfQp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2UgKCkKICoKICogICAgU2VuZCBhbnN3ZXIgYmFjayB0byByZW1vdGUgTE0tSUFTCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2Uoc3RydWN0IGlyaWFwX2NiICpzZWxmLAoJCQkJCSAgIF9fdTE2IG9ial9pZCwKCQkJCQkgICBfX3U4IHJldF9jb2RlLAoJCQkJCSAgIHN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOwoJaW50IG47CglfX3UzMiB0bXBfYmUzMjsKCV9fYmUxNiB0bXBfYmUxNjsKCV9fdTggKmZwOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVCh2YWx1ZSAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHZhbHVlLT5sZW4gPD0gMTAyNCwgcmV0dXJuOyk7CgoJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KCW4gPSAwOwoKCS8qCgkgKiAgV2UgbXVzdCBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIHJlc3BvbnNlIGFmdGVyIHRoZSBsZW5ndGggb2YgdGhlCgkgKiAgdmFsdWUuIFdlIGFkZCAzMiBieXRlcyBiZWNhdXNlIG9mIHRoZSA2IGJ5dGVzIGZvciB0aGUgZnJhbWUgYW5kCgkgKiAgbWF4IDUgYnl0ZXMgZm9yIHRoZSB2YWx1ZSBjb2RpbmcuCgkgKi8KCXR4X3NrYiA9IGRldl9hbGxvY19za2IodmFsdWUtPmxlbiArIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSArIDMyKTsKCWlmICghdHhfc2tiKQoJCXJldHVybjsKCgkvKiBSZXNlcnZlIHNwYWNlIGZvciBNVVggYW5kIExBUCBoZWFkZXIgKi8KCXNrYl9yZXNlcnZlKHR4X3NrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQodHhfc2tiLCA2KTsKCglmcCA9IHR4X3NrYi0+ZGF0YTsKCgkvKiBCdWlsZCBmcmFtZSAqLwoJZnBbbisrXSA9IEdFVF9WQUxVRV9CWV9DTEFTUyB8IElBUF9MU1Q7CglmcFtuKytdID0gcmV0X2NvZGU7CgoJLyogSW5zZXJ0IGxpc3QgbGVuZ3RoIChNU0IgZmlyc3QpICovCgl0bXBfYmUxNiA9IF9fY29uc3RhbnRfaHRvbnMoMHgwMDAxKTsKCW1lbWNweShmcCtuLCAmdG1wX2JlMTYsIDIpOyAgbiArPSAyOwoKCS8qIEluc2VydCBvYmplY3QgaWRlbnRpZmllciAoIE1TQiBmaXJzdCkgKi8KCXRtcF9iZTE2ID0gY3B1X3RvX2JlMTYob2JqX2lkKTsKCW1lbWNweShmcCtuLCAmdG1wX2JlMTYsIDIpOyBuICs9IDI7CgoJc3dpdGNoICh2YWx1ZS0+dHlwZSkgewoJY2FzZSBJQVNfU1RSSU5HOgoJCXNrYl9wdXQodHhfc2tiLCAzICsgdmFsdWUtPmxlbik7CgkJZnBbbisrXSA9IHZhbHVlLT50eXBlOwoJCWZwW24rK10gPSAwOyAvKiBBU0NJSSAqLwoJCWZwW24rK10gPSAoX191OCkgdmFsdWUtPmxlbjsKCQltZW1jcHkoZnArbiwgdmFsdWUtPnQuc3RyaW5nLCB2YWx1ZS0+bGVuKTsgbis9dmFsdWUtPmxlbjsKCQlicmVhazsKCWNhc2UgSUFTX0lOVEVHRVI6CgkJc2tiX3B1dCh0eF9za2IsIDUpOwoJCWZwW24rK10gPSB2YWx1ZS0+dHlwZTsKCgkJdG1wX2JlMzIgPSBjcHVfdG9fYmUzMih2YWx1ZS0+dC5pbnRlZ2VyKTsKCQltZW1jcHkoZnArbiwgJnRtcF9iZTMyLCA0KTsgbiArPSA0OwoJCWJyZWFrOwoJY2FzZSBJQVNfT0NUX1NFUToKCQlza2JfcHV0KHR4X3NrYiwgMyArIHZhbHVlLT5sZW4pOwoJCWZwW24rK10gPSB2YWx1ZS0+dHlwZTsKCgkJdG1wX2JlMTYgPSBjcHVfdG9fYmUxNih2YWx1ZS0+bGVuKTsKCQltZW1jcHkoZnArbiwgJnRtcF9iZTE2LCAyKTsgbiArPSAyOwoJCW1lbWNweShmcCtuLCB2YWx1ZS0+dC5vY3Rfc2VxLCB2YWx1ZS0+bGVuKTsgbis9dmFsdWUtPmxlbjsKCQlicmVhazsKCWNhc2UgSUFTX01JU1NJTkc6CgkJSVJEQV9ERUJVRyggMywgIiVzOiBzZW5kaW5nIElBU19NSVNTSU5HXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXNrYl9wdXQodHhfc2tiLCAxKTsKCQlmcFtuKytdID0gdmFsdWUtPnR5cGU7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgIiVzKCksIHR5cGUgbm90IGltcGxlbWVudGVkIVxuIiwgX19GVU5DVElPTl9fKTsKCQlicmVhazsKCX0KCWlyaWFwX2RvX3JfY29ubmVjdF9ldmVudChzZWxmLCBJQVBfQ0FMTF9SRVNQT05TRSwgdHhfc2tiKTsKCgkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBzdGF0ZV9yX2V4ZWN1dGUoKS4gKi8KCWRldl9rZnJlZV9za2IodHhfc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfZ2V0dmFsdWVieWNsYXNzX2luZGljYXRpb24gKHNlbGYsIHNrYikKICoKICogICAgZ2V0dmFsdWVieWNsYXNzIGlzIHJlcXVlc3RlZCBmcm9tIHBlZXIgTE0tSUFTCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfaW5kaWNhdGlvbihzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsCgkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgaWFzX29iamVjdCAqb2JqOwoJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKCWludCBuYW1lX2xlbjsKCWludCBhdHRyX2xlbjsKCWNoYXIgbmFtZVtJQVNfTUFYX0NMQVNTTkFNRSArIDFdOwkvKiA2MCBieXRlcyAqLwoJY2hhciBhdHRyW0lBU19NQVhfQVRUUklCTkFNRSArIDFdOwkvKiA2MCBieXRlcyAqLwoJX191OCAqZnA7CglpbnQgbjsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOwoKCWZwID0gc2tiLT5kYXRhOwoJbiA9IDE7CgoJbmFtZV9sZW4gPSBmcFtuKytdOwoJbWVtY3B5KG5hbWUsIGZwK24sIG5hbWVfbGVuKTsgbis9bmFtZV9sZW47CgluYW1lW25hbWVfbGVuXSA9ICdcMCc7CgoJYXR0cl9sZW4gPSBmcFtuKytdOwoJbWVtY3B5KGF0dHIsIGZwK24sIGF0dHJfbGVuKTsgbis9YXR0cl9sZW47CglhdHRyW2F0dHJfbGVuXSA9ICdcMCc7CgoJSVJEQV9ERUJVRyg0LCAiTE0tSUFTOiBMb29raW5nIHVwICVzOiAlc1xuIiwgbmFtZSwgYXR0cik7CglvYmogPSBpcmlhc19maW5kX29iamVjdChuYW1lKTsKCglpZiAob2JqID09IE5VTEwpIHsKCQlJUkRBX0RFQlVHKDIsICJMTS1JQVM6IE9iamVjdCAlcyBub3QgZm91bmRcbiIsIG5hbWUpOwoJCWlyaWFwX2dldHZhbHVlYnljbGFzc19yZXNwb25zZShzZWxmLCAweDEyMzUsIElBU19DTEFTU19VTktOT1dOLAoJCQkJCSAgICAgICAmaXJpYXNfbWlzc2luZyk7CgkJcmV0dXJuOwoJfQoJSVJEQV9ERUJVRyg0LCAiTE0tSUFTOiBmb3VuZCAlcywgaWQ9JWRcbiIsIG9iai0+bmFtZSwgb2JqLT5pZCk7CgoJYXR0cmliID0gaXJpYXNfZmluZF9hdHRyaWIob2JqLCBhdHRyKTsKCWlmIChhdHRyaWIgPT0gTlVMTCkgewoJCUlSREFfREVCVUcoMiwgIkxNLUlBUzogQXR0cmlidXRlICVzIG5vdCBmb3VuZFxuIiwgYXR0cik7CgkJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3Jlc3BvbnNlKHNlbGYsIG9iai0+aWQsCgkJCQkJICAgICAgIElBU19BVFRSSUJfVU5LTk9XTiwgCgkJCQkJICAgICAgICZpcmlhc19taXNzaW5nKTsKCQlyZXR1cm47Cgl9CgoJLyogV2UgaGF2ZSBhIG1hdGNoOyBzZW5kIHRoZSB2YWx1ZS4gICovCglpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2Uoc2VsZiwgb2JqLT5pZCwgSUFTX1NVQ0NFU1MsCgkJCQkgICAgICAgYXR0cmliLT52YWx1ZSk7CgoJcmV0dXJuOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9zZW5kX2FjayAodm9pZCkKICoKICogICAgQ3VycmVudGx5IG5vdCB1c2VkCiAqCiAqLwp2b2lkIGlyaWFwX3NlbmRfYWNrKHN0cnVjdCBpcmlhcF9jYiAqc2VsZikKewoJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKCV9fdTggKmZyYW1lOwoKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CgoJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CglpZiAoIXR4X3NrYikKCQlyZXR1cm47CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZSh0eF9za2IsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHR4X3NrYiwgMSk7CglmcmFtZSA9IHR4X3NrYi0+ZGF0YTsKCgkvKiBCdWlsZCBmcmFtZSAqLwoJZnJhbWVbMF0gPSBJQVBfTFNUIHwgSUFQX0FDSyB8IHNlbGYtPm9wZXJhdGlvbjsKCglpcmxtcF9kYXRhX3JlcXVlc3Qoc2VsZi0+bHNhcCwgdHhfc2tiKTsKfQoKdm9pZCBpcmlhcF9jb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlyaWFwX2NiICpzZWxmKQp7CglpbnQgcmV0OwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCXJldCA9IGlybG1wX2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5sc2FwLCBMU0FQX0lBUywKCQkJCSAgICBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIsCgkJCQkgICAgTlVMTCwgTlVMTCk7CglpZiAocmV0IDwgMCkgewoJCUlSREFfREVCVUcoMCwgIiVzKCksIGNvbm5lY3QgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKCQlzZWxmLT5jb25maXJtKElBU19ESVNDT05ORUNULCAwLCBOVUxMLCBzZWxmLT5wcml2KTsKCX0KfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfY29ubmVjdF9jb25maXJtIChoYW5kbGUsIHNrYikKICoKICogICAgTFNBUCBjb25uZWN0aW9uIGNvbmZpcm1lZCEKICoKICovCnN0YXRpYyB2b2lkIGlyaWFwX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgX191MzIgbWF4X3NlZ19zaXplLAoJCQkJICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGlyaWFwX2NiICpzZWxmOwoKCXNlbGYgPSAoc3RydWN0IGlyaWFwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOwoKCXNlbGYtPm1heF9kYXRhX3NpemUgPSBtYXhfc2VnX3NpemU7CglzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CgoJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CgoJaXJpYXBfZG9fY2xpZW50X2V2ZW50KHNlbGYsIElBUF9MTV9DT05ORUNUX0NPTkZJUk0sIHNrYik7CgoJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgc3RhdGVfc19tYWtlX2NhbGwoKS4gKi8KCWRldl9rZnJlZV9za2Ioc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfY29ubmVjdF9pbmRpY2F0aW9uICggaGFuZGxlLCBza2IpCiAqCiAqICAgIFJlbW90ZSBMTS1JQVMgaXMgcmVxdWVzdGluZyBjb25uZWN0aW9uCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmlhcF9jb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZWdfc2l6ZSwKCQkJCSAgICAgX191OCBtYXhfaGVhZGVyX3NpemUsCgkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgKm5ldzsKCglJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCXNlbGYgPSAoc3RydWN0IGlyaWFwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgZ290byBvdXQ7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgZ290byBvdXQ7KTsKCgkvKiBTdGFydCBuZXcgc2VydmVyICovCgluZXcgPSBpcmlhcF9vcGVuKExTQVBfSUFTLCBJQVNfU0VSVkVSLCBOVUxMLCBOVUxMKTsKCWlmICghbmV3KSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgb3BlbiBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CgkJZ290byBvdXQ7Cgl9CgoJLyogTm93IGF0dGFjaCB1cCB0aGUgbmV3ICJzb2NrZXQiICovCgluZXctPmxzYXAgPSBpcmxtcF9kdXAoc2VsZi0+bHNhcCwgbmV3KTsKCWlmICghbmV3LT5sc2FwKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZHVwIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJZ290byBvdXQ7Cgl9CgoJbmV3LT5tYXhfZGF0YV9zaXplID0gbWF4X3NlZ19zaXplOwoJbmV3LT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CgoJLyogQ2xlYW4gdXAgdGhlIG9yaWdpbmFsIG9uZSB0byBrZWVwIGl0IGluIGxpc3RlbiBzdGF0ZSAqLwoJaXJsbXBfbGlzdGVuKHNlbGYtPmxzYXApOwoKCWlyaWFwX2RvX3NlcnZlcl9ldmVudChuZXcsIElBUF9MTV9DT05ORUNUX0lORElDQVRJT04sIHNrYik7CgpvdXQ6CgkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBzdGF0ZV9yX2Rpc2Nvbm5lY3QoKS4gKi8KCWRldl9rZnJlZV9za2Ioc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfZGF0YV9pbmRpY2F0aW9uIChoYW5kbGUsIHNrYikKICoKICogICAgUmVjZWl2ZXMgZGF0YSBmcm9tIGNvbm5lY3Rpb24gaWRlbnRpZmllZCBieSBoYW5kbGUgZnJvbSBJckxNUAogKgogKi8Kc3RhdGljIGludCBpcmlhcF9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgaXJpYXBfY2IgKnNlbGY7CglfX3U4ICAqZnJhbWU7CglfX3U4ICBvcGNvZGU7CgoJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBpbnN0YW5jZTsKCglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIDA7KTsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgZ290byBvdXQ7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgZ290byBvdXQ7KTsKCglmcmFtZSA9IHNrYi0+ZGF0YTsKCglpZiAoc2VsZi0+bW9kZSA9PSBJQVNfU0VSVkVSKSB7CgkJLyogQ2FsbCBzZXJ2ZXIgKi8KCQlJUkRBX0RFQlVHKDQsICIlcygpLCBDYWxsaW5nIHNlcnZlciFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJaXJpYXBfZG9fcl9jb25uZWN0X2V2ZW50KHNlbGYsIElBUF9SRUNWX0ZfTFNULCBza2IpOwoJCWdvdG8gb3V0OwoJfQoJb3Bjb2RlID0gZnJhbWVbMF07CglpZiAofm9wY29kZSAmIElBUF9MU1QpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiwgSXJJQVMgbXVsdGlmcmFtZSBjb21tYW5kcyBvciAiCgkJCSAgICAgInJlc3VsdHMgaXMgbm90IGltcGxlbWVudGVkIHlldCFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlnb3RvIG91dDsKCX0KCgkvKiBDaGVjayBmb3IgYWNrIGZyYW1lcyBzaW5jZSB0aGV5IGRvbid0IGNvbnRhaW4gYW55IGRhdGEgKi8KCWlmIChvcGNvZGUgJiBJQVBfQUNLKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSBHb3QgYWNrIGZyYW1lIVxuIiwgX19GVU5DVElPTl9fKTsKCQlnb3RvIG91dDsKCX0KCglvcGNvZGUgJj0gfklBUF9MU1Q7IC8qIE1hc2sgYXdheSBMU1QgYml0ICovCgoJc3dpdGNoIChvcGNvZGUpIHsKCWNhc2UgR0VUX0lORk9fQkFTRToKCQlJUkRBX0RFQlVHKDAsICJJckxNUCBHZXRJbmZvQmFzZURldGFpbHMgbm90IGltcGxlbWVudGVkIVxuIik7CgkJYnJlYWs7CgljYXNlIEdFVF9WQUxVRV9CWV9DTEFTUzoKCQlpcmlhcF9kb19jYWxsX2V2ZW50KHNlbGYsIElBUF9SRUNWX0ZfTFNULCBOVUxMKTsKCgkJc3dpdGNoIChmcmFtZVsxXSkgewoJCWNhc2UgSUFTX1NVQ0NFU1M6CgkJCWlyaWFwX2dldHZhbHVlYnljbGFzc19jb25maXJtKHNlbGYsIHNrYik7CgkJCWJyZWFrOwoJCWNhc2UgSUFTX0NMQVNTX1VOS05PV046CgkJCUlSREFfREVCVUcoMSwgIiVzKCksIE5vIHN1Y2ggY2xhc3MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCQkvKiBGaW5pc2hlZCwgY2xvc2UgY29ubmVjdGlvbiEgKi8KCQkJaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOwoKCQkJLyoKCQkJICogV2FybmluZywgdGhlIGNsaWVudCBtaWdodCBjbG9zZSB1cywgc28gcmVtZW1iZXIKCQkJICogbm8gdG8gdXNlIHNlbGYgYW55bW9yZSBhZnRlciBjYWxsaW5nIGNvbmZpcm0KCQkJICovCgkJCWlmIChzZWxmLT5jb25maXJtKQoJCQkJc2VsZi0+Y29uZmlybShJQVNfQ0xBU1NfVU5LTk9XTiwgMCwgTlVMTCwKCQkJCQkgICAgICBzZWxmLT5wcml2KTsKCQkJYnJlYWs7CgkJY2FzZSBJQVNfQVRUUklCX1VOS05PV046CgkJCUlSREFfREVCVUcoMSwgIiVzKCksIE5vIHN1Y2ggYXR0cmlidXRlIVxuIiwgX19GVU5DVElPTl9fKTsKCQkJLyogRmluaXNoZWQsIGNsb3NlIGNvbm5lY3Rpb24hICovCgkJCWlyaWFwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmKTsKCgkJCS8qCgkJCSAqIFdhcm5pbmcsIHRoZSBjbGllbnQgbWlnaHQgY2xvc2UgdXMsIHNvIHJlbWVtYmVyCgkJCSAqIG5vIHRvIHVzZSBzZWxmIGFueW1vcmUgYWZ0ZXIgY2FsbGluZyBjb25maXJtCgkJCSAqLwoJCQlpZiAoc2VsZi0+Y29uZmlybSkKCQkJCXNlbGYtPmNvbmZpcm0oSUFTX0FUVFJJQl9VTktOT1dOLCAwLCBOVUxMLAoJCQkJCSAgICAgIHNlbGYtPnByaXYpOwoJCQlicmVhazsKCQl9CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gb3AtY29kZTogJTAyeFxuIiwgX19GVU5DVElPTl9fLAoJCQkgICBvcGNvZGUpOwoJCWJyZWFrOwoJfQoKb3V0OgoJLyogQ2xlYW51cCAtIHN1Yi1jYWxscyB3aWxsIGhhdmUgZG9uZSBza2JfZ2V0KCkgYXMgbmVlZGVkLiAqLwoJZGV2X2tmcmVlX3NrYihza2IpOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2NhbGxfaW5kaWNhdGlvbiAoc2VsZiwgc2tiKQogKgogKiAgICBSZWNlaXZlZCBjYWxsIHRvIHNlcnZlciBmcm9tIHBlZXIgTE0tSUFTCiAqCiAqLwp2b2lkIGlyaWFwX2NhbGxfaW5kaWNhdGlvbihzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCnsKCV9fdTggKmZwOwoJX191OCBvcGNvZGU7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKCglmcCA9IHNrYi0+ZGF0YTsKCglvcGNvZGUgPSBmcFswXTsKCWlmICh+b3Bjb2RlICYgMHg4MCkgewoJCUlSREFfV0FSTklORygiJXM6IElySUFTIG11bHRpZnJhbWUgY29tbWFuZHMgb3IgcmVzdWx0cyIKCQkJICAgICAiaXMgbm90IGltcGxlbWVudGVkIHlldCFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoJb3Bjb2RlICY9IDB4N2Y7IC8qIE1hc2sgYXdheSBMU1QgYml0ICovCgoJc3dpdGNoIChvcGNvZGUpIHsKCWNhc2UgR0VUX0lORk9fQkFTRToKCQlJUkRBX1dBUk5JTkcoIiVzOiBHZXRJbmZvQmFzZURldGFpbHMgbm90IGltcGxlbWVudGVkIHlldCFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlicmVhazsKCWNhc2UgR0VUX1ZBTFVFX0JZX0NMQVNTOgoJCWlyaWFwX2dldHZhbHVlYnljbGFzc19pbmRpY2F0aW9uKHNlbGYsIHNrYik7CgkJYnJlYWs7Cgl9CgkvKiBza2Igd2lsbCBiZSBjbGVhbmVkIHVwIGluIGlyaWFwX2RhdGFfaW5kaWNhdGlvbiAqLwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF93YXRjaGRvZ190aW1lcl9leHBpcmVkIChkYXRhKQogKgogKiAgICBRdWVyeSBoYXMgdGFrZW4gdG9vIGxvbmcgdGltZSwgc28gYWJvcnQKICoKICovCnN0YXRpYyB2b2lkIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGlyaWFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBkYXRhOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCS8qIGlyaWFwX2Nsb3NlKHNlbGYpOyAqLwp9CgojaWZkZWYgQ09ORklHX1BST0NfRlMKCnN0YXRpYyBjb25zdCBjaGFyICppYXNfdmFsdWVfdHlwZXNbXSA9IHsKCSJJQVNfTUlTU0lORyIsCgkiSUFTX0lOVEVHRVIiLAoJIklBU19PQ1RfU0VRIiwKCSJJQVNfU1RSSU5HIgp9OwoKc3RhdGljIGlubGluZSBzdHJ1Y3QgaWFzX29iamVjdCAqaXJpYXNfc2VxX2lkeChsb2ZmX3QgcG9zKSAKewoJc3RydWN0IGlhc19vYmplY3QgKm9iajsKCglmb3IgKG9iaiA9IChzdHJ1Y3QgaWFzX29iamVjdCAqKSBoYXNoYmluX2dldF9maXJzdChpcmlhc19vYmplY3RzKTsKCSAgICAgb2JqOyBvYmogPSAoc3RydWN0IGlhc19vYmplY3QgKikgaGFzaGJpbl9nZXRfbmV4dChpcmlhc19vYmplY3RzKSkgewoJCWlmIChwb3MtLSA9PSAwKQoJCQlicmVhazsKCX0KCQkKCXJldHVybiBvYmo7Cn0KCnN0YXRpYyB2b2lkICppcmlhc19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQp7CglzcGluX2xvY2tfaXJxKCZpcmlhc19vYmplY3RzLT5oYl9zcGlubG9jayk7CgoJcmV0dXJuICpwb3MgPyBpcmlhc19zZXFfaWR4KCpwb3MgLSAxKSA6IFNFUV9TVEFSVF9UT0tFTjsKfQoKc3RhdGljIHZvaWQgKmlyaWFzX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKewoJKysqcG9zOwoKCXJldHVybiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIAoJCT8gKHZvaWQgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJpYXNfb2JqZWN0cykKCQk6ICh2b2lkICopIGhhc2hiaW5fZ2V0X25leHQoaXJpYXNfb2JqZWN0cyk7Cn0KCnN0YXRpYyB2b2lkIGlyaWFzX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQp7CglzcGluX3VubG9ja19pcnEoJmlyaWFzX29iamVjdHMtPmhiX3NwaW5sb2NrKTsKfQoKc3RhdGljIGludCBpcmlhc19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKewoJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQoJCXNlcV9wdXRzKHNlcSwgIkxNLUlBUyBPYmplY3RzOlxuIik7CgllbHNlIHsKCQlzdHJ1Y3QgaWFzX29iamVjdCAqb2JqID0gdjsKCQlzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOwoKCQlJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybiAtRUlOVkFMOyk7CgoJCXNlcV9wcmludGYoc2VxLCAibmFtZTogJXMsIGlkPSVkXG4iLAoJCQkgICBvYmotPm5hbWUsIG9iai0+aWQpOwoKCQkvKiBDYXJlZnVsIGZvciBwcmlvcml0eSBpbnZlcnNpb25zIGhlcmUgIQoJCSAqIEFsbCBvdGhlciB1c2VzIG9mIGF0dHJpYiBzcGlubG9jayBhcmUgaW5kZXBlbmRlbnQgb2YKCQkgKiB0aGUgb2JqZWN0IHNwaW5sb2NrLCBzbyB3ZSBhcmUgc2FmZS4gSmVhbiBJSSAqLwoJCXNwaW5fbG9jaygmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jayk7CgoJCS8qIExpc3QgYWxsIGF0dHJpYnV0ZXMgZm9yIHRoaXMgb2JqZWN0ICovCgkJZm9yIChhdHRyaWIgPSAoc3RydWN0IGlhc19hdHRyaWIgKikgaGFzaGJpbl9nZXRfZmlyc3Qob2JqLT5hdHRyaWJzKTsKCQkgICAgIGF0dHJpYiAhPSBOVUxMOwoJCSAgICAgYXR0cmliID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGhhc2hiaW5fZ2V0X25leHQob2JqLT5hdHRyaWJzKSkgewoJCSAgICAgCgkJCUlSREFfQVNTRVJUKGF0dHJpYi0+bWFnaWMgPT0gSUFTX0FUVFJJQl9NQUdJQywKCQkJCSAgICBnb3RvIG91dGxvb3A7ICk7CgoJCQlzZXFfcHJpbnRmKHNlcSwgIiAtIEF0dHJpYnV0ZSBuYW1lOiBcIiVzXCIsICIsCgkJCQkgICBhdHRyaWItPm5hbWUpOwoJCQlzZXFfcHJpbnRmKHNlcSwgInZhbHVlWyVzXTogIiwKCQkJCSAgIGlhc192YWx1ZV90eXBlc1thdHRyaWItPnZhbHVlLT50eXBlXSk7CgoJCQlzd2l0Y2ggKGF0dHJpYi0+dmFsdWUtPnR5cGUpIHsKCQkJY2FzZSBJQVNfSU5URUdFUjoKCQkJCXNlcV9wcmludGYoc2VxLCAiJWRcbiIsCgkJCQkJICAgYXR0cmliLT52YWx1ZS0+dC5pbnRlZ2VyKTsKCQkJCWJyZWFrOwoJCQljYXNlIElBU19TVFJJTkc6CgkJCQlzZXFfcHJpbnRmKHNlcSwgIlwiJXNcIlxuIiwKCQkJCQkgICBhdHRyaWItPnZhbHVlLT50LnN0cmluZyk7CgkJCQlicmVhazsKCQkJY2FzZSBJQVNfT0NUX1NFUToKCQkJCXNlcV9wcmludGYoc2VxLCAib2N0ZXQgc2VxdWVuY2UgKCVkIGJ5dGVzKVxuIiwgCgkJCQkJICAgYXR0cmliLT52YWx1ZS0+bGVuKTsKCQkJCWJyZWFrOwoJCQljYXNlIElBU19NSVNTSU5HOgoJCQkJc2VxX3B1dHMoc2VxLCAibWlzc2luZ1xuIik7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXNlcV9wcmludGYoc2VxLCAidHlwZSAlZD9cbiIsIAoJCQkJCSAgIGF0dHJpYi0+dmFsdWUtPnR5cGUpOwoJCQl9CgkJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CgoJCX0KCUlSREFfQVNTRVJUX0xBQkVMKG91dGxvb3A6KQoJCXNwaW5fdW5sb2NrKCZvYmotPmF0dHJpYnMtPmhiX3NwaW5sb2NrKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcmlhc19zZXFfb3BzID0gewoJLnN0YXJ0ICA9IGlyaWFzX3NlcV9zdGFydCwKCS5uZXh0ICAgPSBpcmlhc19zZXFfbmV4dCwKCS5zdG9wICAgPSBpcmlhc19zZXFfc3RvcCwKCS5zaG93ICAgPSBpcmlhc19zZXFfc2hvdywKfTsKCnN0YXRpYyBpbnQgaXJpYXNfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCUlSREFfQVNTRVJUKCBpcmlhc19vYmplY3RzICE9IE5VTEwsIHJldHVybiAtRUlOVkFMOyk7CgoJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZpcmlhc19zZXFfb3BzKTsKfQoKc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcmlhc19zZXFfZm9wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5vcGVuICAgICAgICAgICA9IGlyaWFzX3NlcV9vcGVuLAoJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCgkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCgkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAp9OwoKI2VuZGlmIC8qIFBST0NfRlMgKi8K