LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJsbXBfZnJhbWUuYwogKiBWZXJzaW9uOiAgICAgICAwLjkKICogRGVzY3JpcHRpb246ICAgSXJMTVAgZnJhbWUgaW1wbGVtZW50YXRpb24KICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFR1ZSBBdWcgMTkgMDI6MDk6NTkgMTk5NwogKiBNb2RpZmllZCBhdDogICBNb24gRGVjIDEzIDEzOjQxOjEyIDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiAKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CiAqICAgICAKICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAogKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCiAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL3RpbWVyLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXBfZnJhbWUuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2Rpc2NvdmVyeS5oPgoKc3RhdGljIHN0cnVjdCBsc2FwX2NiICppcmxtcF9maW5kX2xzYXAoc3RydWN0IGxhcF9jYiAqc2VsZiwgX191OCBkbHNhcCwgCgkJCQkgICAgICAgX191OCBzbHNhcCwgaW50IHN0YXR1cywgaGFzaGJpbl90ICopOwoKaW5saW5lIHZvaWQgaXJsbXBfc2VuZF9kYXRhX3BkdShzdHJ1Y3QgbGFwX2NiICpzZWxmLCBfX3U4IGRsc2FwLCBfX3U4IHNsc2FwLAoJCQkJaW50IGV4cGVkaXRlZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc2tiLT5kYXRhWzBdID0gZGxzYXA7Cglza2ItPmRhdGFbMV0gPSBzbHNhcDsKCglpZiAoZXhwZWRpdGVkKSB7CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgc2VuZGluZyBleHBlZGl0ZWQgZGF0YVxuIiwgX19GVU5DVElPTl9fKTsKCQlpcmxhcF9kYXRhX3JlcXVlc3Qoc2VsZi0+aXJsYXAsIHNrYiwgVFJVRSk7Cgl9IGVsc2UKCQlpcmxhcF9kYXRhX3JlcXVlc3Qoc2VsZi0+aXJsYXAsIHNrYiwgRkFMU0UpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxtcF9zZW5kX2xjZl9wZHUgKGRsc2FwLCBzbHNhcCwgb3Bjb2RlLHNrYikKICoKICogICAgU2VuZCBMaW5rIENvbnRyb2wgRnJhbWUgdG8gSXJMQVAKICovCnZvaWQgaXJsbXBfc2VuZF9sY2ZfcGR1KHN0cnVjdCBsYXBfY2IgKnNlbGYsIF9fdTggZGxzYXAsIF9fdTggc2xzYXAsCgkJCV9fdTggb3Bjb2RlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKewoJX191OCAqZnJhbWU7CgkKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOwoJCglmcmFtZSA9IHNrYi0+ZGF0YTsKCQoJZnJhbWVbMF0gPSBkbHNhcCB8IENPTlRST0xfQklUOwoJZnJhbWVbMV0gPSBzbHNhcDsKCglmcmFtZVsyXSA9IG9wY29kZTsKCglpZiAob3Bjb2RlID09IERJU0NPTk5FQ1QpCgkJZnJhbWVbM10gPSAweDAxOyAvKiBTZXJ2aWNlIHVzZXIgcmVxdWVzdCAqLwoJZWxzZQoJCWZyYW1lWzNdID0gMHgwMDsgLyogcnN2ZCAqLwoKCWlybGFwX2RhdGFfcmVxdWVzdChzZWxmLT5pcmxhcCwgc2tiLCBGQUxTRSk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybG1wX2lucHV0IChza2IpCiAqCiAqICAgIFVzZWQgYnkgSXJMQVAgdG8gcGFzcyByZWNlaXZlZCBkYXRhIGZyYW1lcyB0byBJckxNUCBsYXllcgogKgogKi8Kdm9pZCBpcmxtcF9saW5rX2RhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgbGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKCQkJCWludCB1bnJlbGlhYmxlKQp7CglzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsKCV9fdTggICBzbHNhcF9zZWw7ICAgLyogU291cmNlICh0aGlzKSBMU0FQIGFkZHJlc3MgKi8KCV9fdTggICBkbHNhcF9zZWw7ICAgLyogRGVzdGluYXRpb24gTFNBUCBhZGRyZXNzICovCglfX3U4ICAgKmZwOwoJCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNrYi0+bGVuID4gMiwgcmV0dXJuOyk7CgoJZnAgPSBza2ItPmRhdGE7CgoJLyoKCSAqICBUaGUgbmV4dCBzdGF0ZW1lbnRzIG1heSBiZSBjb25mdXNpbmcsIGJ1dCB3ZSBkbyB0aGlzIHNvIHRoYXQgCgkgKiAgZGVzdGluYXRpb24gTFNBUCBvZiByZWNlaXZlZCBmcmFtZSBpcyBzb3VyY2UgTFNBUCBpbiBvdXIgdmlldwoJICovCglzbHNhcF9zZWwgPSBmcFswXSAmIExTQVBfTUFTSzsgCglkbHNhcF9zZWwgPSBmcFsxXTsJCgoJLyoKCSAqICBDaGVjayBpZiB0aGlzIGlzIGFuIGluY29taW5nIGNvbm5lY3Rpb24sIHNpbmNlIHdlIG11c3QgZGVhbCB3aXRoCgkgKiAgaXQgaW4gYSBkaWZmZXJlbnQgd2F5IHRoYW4gb3RoZXIgZXN0YWJsaXNoZWQgY29ubmVjdGlvbnMuCgkgKi8KCWlmICgoZnBbMF0gJiBDT05UUk9MX0JJVCkgJiYgKGZwWzJdID09IENPTk5FQ1RfQ01EKSkgewoJCUlSREFfREVCVUcoMywgIiVzKCksIGluY29taW5nIGNvbm5lY3Rpb24sICIKCQkJICAgInNvdXJjZSBMU0FQPSVkLCBkZXN0IExTQVA9JWRcbiIsCgkJCSAgIF9fRlVOQ1RJT05fXywgc2xzYXBfc2VsLCBkbHNhcF9zZWwpOwoJCQoJCS8qIFRyeSB0byBmaW5kIExTQVAgYW1vbmcgdGhlIHVuY29ubmVjdGVkIExTQVBzICovCgkJbHNhcCA9IGlybG1wX2ZpbmRfbHNhcChzZWxmLCBkbHNhcF9zZWwsIHNsc2FwX3NlbCwgQ09OTkVDVF9DTUQsCgkJCQkgICAgICAgaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzKTsKCQkKCQkvKiBNYXliZSBMU0FQIHdhcyBhbHJlYWR5IGNvbm5lY3RlZCwgc28gdHJ5IG9uZSBtb3JlIHRpbWUgKi8KCQlpZiAoIWxzYXApIHsKCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgaW5jb21pbmcgY29ubmVjdGlvbiBmb3IgTFNBUCBhbHJlYWR5IGNvbm5lY3RlZFxuIiwgX19GVU5DVElPTl9fKTsKCQkJbHNhcCA9IGlybG1wX2ZpbmRfbHNhcChzZWxmLCBkbHNhcF9zZWwsIHNsc2FwX3NlbCwgMCwKCQkJCQkgICAgICAgc2VsZi0+bHNhcHMpOwoJCX0KCX0gZWxzZQoJCWxzYXAgPSBpcmxtcF9maW5kX2xzYXAoc2VsZiwgZGxzYXBfc2VsLCBzbHNhcF9zZWwsIDAsIAoJCQkJICAgICAgIHNlbGYtPmxzYXBzKTsKCQoJaWYgKGxzYXAgPT0gTlVMTCkgewoJCUlSREFfREVCVUcoMiwgIklyTE1QLCBTb3JyeSwgbm8gTFNBUCBmb3IgcmVjZWl2ZWQgZnJhbWUhXG4iKTsKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBzbHNhcF9zZWwgPSAlMDJ4LCBkbHNhcF9zZWwgPSAlMDJ4XG4iLAoJCQkgICBfX0ZVTkNUSU9OX18sIHNsc2FwX3NlbCwgZGxzYXBfc2VsKTsKCQlpZiAoZnBbMF0gJiBDT05UUk9MX0JJVCkgewoJCQlJUkRBX0RFQlVHKDIsICIlcygpLCByZWNlaXZlZCBjb250cm9sIGZyYW1lICUwMnhcbiIsCgkJCQkgICBfX0ZVTkNUSU9OX18sIGZwWzJdKTsKCQl9IGVsc2UgewoJCQlJUkRBX0RFQlVHKDIsICIlcygpLCByZWNlaXZlZCBkYXRhIGZyYW1lXG4iLCBfX0ZVTkNUSU9OX18pOwoJCX0KCQlyZXR1cm47Cgl9CgoJLyogCgkgKiAgQ2hlY2sgaWYgd2UgcmVjZWl2ZWQgYSBjb250cm9sIGZyYW1lPyAKCSAqLwoJaWYgKGZwWzBdICYgQ09OVFJPTF9CSVQpIHsKCQlzd2l0Y2ggKGZwWzJdKSB7CgkJY2FzZSBDT05ORUNUX0NNRDoKCQkJbHNhcC0+bGFwID0gc2VsZjsKCQkJaXJsbXBfZG9fbHNhcF9ldmVudChsc2FwLCBMTV9DT05ORUNUX0lORElDQVRJT04sIHNrYik7CgkJCWJyZWFrOwoJCWNhc2UgQ09OTkVDVF9DTkY6CgkJCWlybG1wX2RvX2xzYXBfZXZlbnQobHNhcCwgTE1fQ09OTkVDVF9DT05GSVJNLCBza2IpOwoJCQlicmVhazsKCQljYXNlIERJU0NPTk5FQ1Q6CgkJCUlSREFfREVCVUcoNCwgIiVzKCksIERpc2Nvbm5lY3QgaW5kaWNhdGlvbiFcbiIsCgkJCQkgICBfX0ZVTkNUSU9OX18pOwoJCQlpcmxtcF9kb19sc2FwX2V2ZW50KGxzYXAsIExNX0RJU0NPTk5FQ1RfSU5ESUNBVElPTiwgCgkJCQkJICAgIHNrYik7CgkJCWJyZWFrOwoJCWNhc2UgQUNDRVNTTU9ERV9DTUQ6CgkJCUlSREFfREVCVUcoMCwgIkFjY2VzcyBtb2RlIGNtZCBub3QgaW1wbGVtZW50ZWQhXG4iKTsKCQkJYnJlYWs7CgkJY2FzZSBBQ0NFU1NNT0RFX0NORjoKCQkJSVJEQV9ERUJVRygwLCAiQWNjZXNzIG1vZGUgY25mIG5vdCBpbXBsZW1lbnRlZCFcbiIpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGNvbnRyb2wgZnJhbWUgJTAyeFxuIiwKCQkJCSAgIF9fRlVOQ1RJT05fXywgZnBbMl0pOwoJCQlicmVhazsKCQl9Cgl9IGVsc2UgaWYgKHVucmVsaWFibGUpIHsKCQkvKiBPcHRpbWl6ZSBhbmQgYnlwYXNzIHRoZSBzdGF0ZSBtYWNoaW5lIGlmIHBvc3NpYmxlICovCgkJaWYgKGxzYXAtPmxzYXBfc3RhdGUgPT0gTFNBUF9EQVRBX1RSQU5TRkVSX1JFQURZKQoJCQlpcmxtcF91ZGF0YV9pbmRpY2F0aW9uKGxzYXAsIHNrYik7CgkJZWxzZQoJCQlpcmxtcF9kb19sc2FwX2V2ZW50KGxzYXAsIExNX1VEQVRBX0lORElDQVRJT04sIHNrYik7Cgl9IGVsc2UgewkKCQkvKiBPcHRpbWl6ZSBhbmQgYnlwYXNzIHRoZSBzdGF0ZSBtYWNoaW5lIGlmIHBvc3NpYmxlICovCgkJaWYgKGxzYXAtPmxzYXBfc3RhdGUgPT0gTFNBUF9EQVRBX1RSQU5TRkVSX1JFQURZKQoJCQlpcmxtcF9kYXRhX2luZGljYXRpb24obHNhcCwgc2tiKTsKCQllbHNlCgkJCWlybG1wX2RvX2xzYXBfZXZlbnQobHNhcCwgTE1fREFUQV9JTkRJQ0FUSU9OLCBza2IpOwoJfQp9CgovKgogKiBGdW5jdGlvbiBpcmxtcF9saW5rX3VuaXRkYXRhX2luZGljYXRpb24gKHNlbGYsIHNrYikKICoKICogICAgCiAqCiAqLwojaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKdm9pZCBpcmxtcF9saW5rX3VuaXRkYXRhX2luZGljYXRpb24oc3RydWN0IGxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGxzYXBfY2IgKmxzYXA7CglfX3U4ICAgc2xzYXBfc2VsOyAgIC8qIFNvdXJjZSAodGhpcykgTFNBUCBhZGRyZXNzICovCglfX3U4ICAgZGxzYXBfc2VsOyAgIC8qIERlc3RpbmF0aW9uIExTQVAgYWRkcmVzcyAqLwoJX191OCAgIHBpZDsgICAgICAgICAvKiBQcm90b2NvbCBpZGVudGlmaWVyICovCglfX3U4ICAgKmZwOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCQoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChza2ItPmxlbiA+IDIsIHJldHVybjspOwoKCWZwID0gc2tiLT5kYXRhOwoKCS8qCgkgKiAgVGhlIG5leHQgc3RhdGVtZW50cyBtYXkgYmUgY29uZnVzaW5nLCBidXQgd2UgZG8gdGhpcyBzbyB0aGF0IAoJICogIGRlc3RpbmF0aW9uIExTQVAgb2YgcmVjZWl2ZWQgZnJhbWUgaXMgc291cmNlIExTQVAgaW4gb3VyIHZpZXcKCSAqLwoJc2xzYXBfc2VsID0gZnBbMF0gJiBMU0FQX01BU0s7IAoJZGxzYXBfc2VsID0gZnBbMV07CglwaWQgICAgICAgPSBmcFsyXTsKCQoJaWYgKHBpZCAmIDB4ODApIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBleHRlbnNpb24gaW4gUElEIG5vdCBzdXBwIVxuIiwKCQkJICAgX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgoJLyogQ2hlY2sgaWYgZnJhbWUgaXMgYWRkcmVzc2VkIHRvIHRoZSBjb25uZWN0aW9ubGVzcyBMU0FQICovCglpZiAoKHNsc2FwX3NlbCAhPSBMU0FQX0NPTk5MRVNTKSB8fCAoZGxzYXBfc2VsICE9IExTQVBfQ09OTkxFU1MpKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZHJvcHBpbmcgZnJhbWUhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCQoJLyogU2VhcmNoIHRoZSBjb25uZWN0aW9ubGVzcyBMU0FQICovCglzcGluX2xvY2tfaXJxc2F2ZSgmaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJbHNhcCA9IChzdHJ1Y3QgbHNhcF9jYiAqKSBoYXNoYmluX2dldF9maXJzdChpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMpOwoJd2hpbGUgKGxzYXAgIT0gTlVMTCkgewoJCS8qCgkJICogIENoZWNrIGlmIHNvdXJjZSBMU0FQIGFuZCBkZXN0IExTQVAgc2VsZWN0b3JzIGFuZCBQSUQgbWF0Y2guCgkJICovCgkJaWYgKChsc2FwLT5zbHNhcF9zZWwgPT0gc2xzYXBfc2VsKSAmJiAKCQkgICAgKGxzYXAtPmRsc2FwX3NlbCA9PSBkbHNhcF9zZWwpICYmIAoJCSAgICAobHNhcC0+cGlkID09IHBpZCkpIAoJCXsJCQkKCQkJYnJlYWs7CgkJfQoJCWxzYXAgPSAoc3RydWN0IGxzYXBfY2IgKikgaGFzaGJpbl9nZXRfbmV4dChpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMpOwoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoKCWlmIChsc2FwKQoJCWlybG1wX2Nvbm5sZXNzX2RhdGFfaW5kaWNhdGlvbihsc2FwLCBza2IpOwoJZWxzZSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZm91bmQgbm8gbWF0Y2hpbmcgTFNBUCFcbiIsIF9fRlVOQ1RJT05fXyk7Cgl9Cn0KI2VuZGlmIC8qIENPTkZJR19JUkRBX1VMVFJBICovCgovKgogKiBGdW5jdGlvbiBpcmxtcF9saW5rX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAocmVhc29uLCB1c2VyZGF0YSkKICoKICogICAgSXJMQVAgaGFzIGRpc2Nvbm5lY3RlZCAKICoKICovCnZvaWQgaXJsbXBfbGlua19kaXNjb25uZWN0X2luZGljYXRpb24oc3RydWN0IGxhcF9jYiAqbGFwLCAKCQkJCSAgICAgIHN0cnVjdCBpcmxhcF9jYiAqaXJsYXAsIAoJCQkJICAgICAgTEFQX1JFQVNPTiByZWFzb24sIAoJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChsYXAgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChsYXAtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOwoKCWxhcC0+cmVhc29uID0gcmVhc29uOwoJbGFwLT5kYWRkciA9IERFVl9BRERSX0FOWTsKCiAgICAgICAgLyogRklYTUU6IG11c3QgZG8gc29tZXRoaW5nIHdpdGggdGhlIHNrYiBpZiBhbnkgKi8KCQoJLyoKCSAqICBJbmZvcm0gc3RhdGlvbiBzdGF0ZSBtYWNoaW5lCgkgKi8KCWlybG1wX2RvX2xhcF9ldmVudChsYXAsIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT04sIE5VTEwpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxtcF9saW5rX2Nvbm5lY3RfaW5kaWNhdGlvbiAocW9zKQogKgogKiAgICBJbmNvbWluZyBMQVAgY29ubmVjdGlvbiEKICoKICovCnZvaWQgaXJsbXBfbGlua19jb25uZWN0X2luZGljYXRpb24oc3RydWN0IGxhcF9jYiAqc2VsZiwgX191MzIgc2FkZHIsIAoJCQkJICAgX191MzIgZGFkZHIsIHN0cnVjdCBxb3NfaW5mbyAqcW9zLAoJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJLyogQ29weSBRb1Mgc2V0dGluZ3MgZm9yIHRoaXMgc2Vzc2lvbiAqLwoJc2VsZi0+cW9zID0gcW9zOwoKCS8qIFVwZGF0ZSBkZXN0aW5hdGlvbiBkZXZpY2UgYWRkcmVzcyAqLwoJc2VsZi0+ZGFkZHIgPSBkYWRkcjsKCUlSREFfQVNTRVJUKHNlbGYtPnNhZGRyID09IHNhZGRyLCByZXR1cm47KTsKCglpcmxtcF9kb19sYXBfZXZlbnQoc2VsZiwgTE1fTEFQX0NPTk5FQ1RfSU5ESUNBVElPTiwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsbXBfbGlua19jb25uZWN0X2NvbmZpcm0gKHFvcykKICoKICogICAgTEFQIGNvbm5lY3Rpb24gY29uZmlybWVkIQogKgogKi8Kdm9pZCBpcmxtcF9saW5rX2Nvbm5lY3RfY29uZmlybShzdHJ1Y3QgbGFwX2NiICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgCgkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHFvcyAhPSBOVUxMLCByZXR1cm47KTsKCgkvKiBEb24ndCBuZWVkIHVzZSB0aGUgc2tiIGZvciBub3cgKi8KCgkvKiBDb3B5IFFvUyBzZXR0aW5ncyBmb3IgdGhpcyBzZXNzaW9uICovCglzZWxmLT5xb3MgPSBxb3M7CgoJaXJsbXBfZG9fbGFwX2V2ZW50KHNlbGYsIExNX0xBUF9DT05ORUNUX0NPTkZJUk0sIE5VTEwpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxtcF9saW5rX2Rpc2NvdmVyeV9pbmRpY2F0aW9uIChzZWxmLCBsb2cpCiAqCiAqICAgIERldmljZSBpcyBkaXNjb3ZlcmluZyB1cwogKgogKiBJdCdzIG5vdCBhbiBhbnN3ZXIgdG8gb3VyIG93biBkaXNjb3ZlcmllcywganVzdCBhbm90aGVyIGRldmljZSB0cnlpbmcKICogdG8gcGVyZm9ybSBkaXNjb3ZlcnksIGJ1dCB3ZSBkb24ndCB3YW50IHRvIG1pc3MgdGhlIG9wcG9ydHVuaXR5CiAqIHRvIGV4cGxvaXQgdGhpcyBpbmZvcm1hdGlvbiwgYmVjYXVzZSA6CiAqCW8gV2UgbWF5IG5vdCBhY3RpdmVseSBwZXJmb3JtIGRpc2NvdmVyeSAoanVzdCBwYXNzaXZlIGRpc2NvdmVyeSkKICoJbyBUaGlzIHR5cGUgb2YgZGlzY292ZXJ5IGlzIG11Y2ggbW9yZSByZWxpYWJsZS4gSW4gc29tZSBjYXNlcywgaXQKICoJICBzZWVtIHRoYXQgbGVzcyB0aGFuIDUwJSBvZiBvdXIgZGlzY292ZXJpZXMgZ2V0IGFuIGFuc3dlciwgd2hpbGUKICoJICB3ZSBhbHdheXMgZ2V0IH4xMDAlIG9mIHRoZXNlLgogKglvIE1ha2UgZmFzdGVyIGRpc2NvdmVyeSwgc3RhdGlzdGljYWxseSBkaXZpZGUgdGltZSBvZiBkaXNjb3ZlcnkKICoJICBldmVudHMgYnkgMiAoaW1wb3J0YW50IGZvciB0aGUgbGF0ZW5jeSBhc3BlY3QgYW5kIHVzZXIgZmVlbCkKICoJbyBFdmVuIGlzIHdlIGRvIGFjdGl2ZSBkaXNjb3ZlcnksIHRoZSBvdGhlciBub2RlIG1pZ2h0IG5vdAogKgkgIGFuc3dlciBvdXIgZGlzY292ZXJpZXMgKGV4OiBQYWxtKS4gVGhlIFBhbG0gd2lsbCBqdXN0IHBlcmZvcm0KICoJICBvbmUgYWN0aXZlIGRpc2NvdmVyeSBhbmQgY29ubmVjdCBkaXJlY3RseSB0byB1cy4KICoKICogSG93ZXZlciwgd2hlbiBib3RoIGRldmljZXMgZGlzY292ZXIgZWFjaCBvdGhlciwgdGhleSBtaWdodCBhdHRlbXB0IHRvCiAqIGNvbm5lY3QgdG8gZWFjaCBvdGhlciBmb2xsb3dpbmcgdGhlIGRpc2NvdmVyeSBldmVudCwgYW5kIGl0IHdvdWxkIGNyZWF0ZQogKiBjb2xsaXNpb25zIG9uIHRoZSBtZWRpdW0gKFNOUk0gYmF0dGxlKS4KICogVGhlICJmaXgiIGZvciB0aGF0IGlzIHRvIGRpc2FibGUgYWxsIGNvbm5lY3Rpb24gcmVxdWVzdHMgaW4gSXJMQVAKICogZm9yIDEwMG1zIGFmdGVyIGEgZGlzY292ZXJ5IGluZGljYXRpb24gYnkgc2V0dGluZyB0aGUgbWVkaWFfYnVzeSBmbGFnLgogKiBQcmV2aW91c2x5LCB3ZSB1c2VkIHRvIHBvc3Rwb25lIHRoZSBldmVudCB3aGljaCB3YXMgcXVpdGUgdWdseS4gTm93CiAqIHRoYXQgSXJMQVAgdGFrZXMgY2FyZSBvZiB0aGlzIHByb2JsZW0sIGp1c3QgcGFzcyB0aGUgZXZlbnQgdXAuLi4KICoKICogSmVhbiBJSQogKi8Kdm9pZCBpcmxtcF9saW5rX2Rpc2NvdmVyeV9pbmRpY2F0aW9uKHN0cnVjdCBsYXBfY2IgKnNlbGYsIAoJCQkJICAgICBkaXNjb3ZlcnlfdCAqZGlzY292ZXJ5KQp7CglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuOyk7CgoJLyogQWRkIHRvIG1haW4gbG9nLCBjbGVhbnVwICovCglpcmxtcF9hZGRfZGlzY292ZXJ5KGlybG1wLT5jYWNoZWxvZywgZGlzY292ZXJ5KTsKCQoJLyogSnVzdCBoYW5kbGUgaXQgdGhlIHNhbWUgd2F5IGFzIGEgZGlzY292ZXJ5IGNvbmZpcm0sCgkgKiBieXBhc3MgdGhlIExNX0xBUCBzdGF0ZSBtYWNoaW5lIChzZWUgYmVsb3cpICovCglpcmxtcF9kaXNjb3ZlcnlfY29uZmlybShpcmxtcC0+Y2FjaGVsb2csIERJU0NPVkVSWV9QQVNTSVZFKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsbXBfbGlua19kaXNjb3ZlcnlfY29uZmlybSAoc2VsZiwgbG9nKQogKgogKiAgICBDYWxsZWQgYnkgSXJMQVAgd2l0aCBhIGxpc3Qgb2YgZGlzY292ZXJpZXMgYWZ0ZXIgdGhlIGRpc2NvdmVyeQogKiAgICByZXF1ZXN0IGhhcyBiZWVuIGNhcnJpZWQgb3V0LiBBIE5VTEwgbG9nIGlzIHJlY2VpdmVkIGlmIElyTEFQCiAqICAgIHdhcyB1bmFibGUgdG8gY2Fycnkgb3V0IHRoZSBkaXNjb3ZlcnkgcmVxdWVzdAogKgogKi8Kdm9pZCBpcmxtcF9saW5rX2Rpc2NvdmVyeV9jb25maXJtKHN0cnVjdCBsYXBfY2IgKnNlbGYsIGhhc2hiaW5fdCAqbG9nKQp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKCQoJLyogQWRkIHRvIG1haW4gbG9nLCBjbGVhbnVwICovCglpcmxtcF9hZGRfZGlzY292ZXJ5X2xvZyhpcmxtcC0+Y2FjaGVsb2csIGxvZyk7CgoJLyogUHJvcGFnYXRlIGV2ZW50IHRvIHZhcmlvdXMgTFNBUHMgcmVnaXN0ZXJlZCBmb3IgaXQuCgkgKiBXZSBieXBhc3MgdGhlIExNX0xBUCBzdGF0ZSBtYWNoaW5lIGJlY2F1c2UKCSAqCTEpIFdlIGRvIGl0IHJlZ2FyZGxlc3Mgb2YgdGhlIExNX0xBUCBzdGF0ZQoJICoJMikgSXQgZG9lc24ndCBhZmZlY3QgdGhlIExNX0xBUCBzdGF0ZQoJICoJMykgRmFzdGVyLCBzbGltZXIsIHNpbXBsZXIsIC4uLgoJICogSmVhbiBJSSAqLwoJaXJsbXBfZGlzY292ZXJ5X2NvbmZpcm0oaXJsbXAtPmNhY2hlbG9nLCBESVNDT1ZFUllfQUNUSVZFKTsKfQoKI2lmZGVmIENPTkZJR19JUkRBX0NBQ0hFX0xBU1RfTFNBUApzdGF0aWMgaW5saW5lIHZvaWQgaXJsbXBfdXBkYXRlX2NhY2hlKHN0cnVjdCBsYXBfY2IgKmxhcCwKCQkJCSAgICAgIHN0cnVjdCBsc2FwX2NiICpsc2FwKQp7CgkvKiBQcmV2ZW50IGNvbmN1cnJlbnQgcmVhZCB0byBnZXQgZ2FyYmFnZSAqLwoJbGFwLT5jYWNoZS52YWxpZCA9IEZBTFNFOwoJLyogVXBkYXRlIGNhY2hlIGVudHJ5ICovCglsYXAtPmNhY2hlLmRsc2FwX3NlbCA9IGxzYXAtPmRsc2FwX3NlbDsKCWxhcC0+Y2FjaGUuc2xzYXBfc2VsID0gbHNhcC0+c2xzYXBfc2VsOwoJbGFwLT5jYWNoZS5sc2FwID0gbHNhcDsKCWxhcC0+Y2FjaGUudmFsaWQgPSBUUlVFOwp9CiNlbmRpZgoKLyoKICogRnVuY3Rpb24gaXJsbXBfZmluZF9oYW5kbGUgKHNlbGYsIGRsc2FwX3NlbCwgc2xzYXBfc2VsLCBzdGF0dXMsIHF1ZXVlKQogKgogKiAgICBGaW5kIGhhbmRsZSBhc3NvY2lhdGVkIHdpdGggZGVzdGluYXRpb24gYW5kIHNvdXJjZSBMU0FQCiAqCiAqIEFueSBJckRBIGNvbm5lY3Rpb24gKExTQVAvVFNBUCkgaXMgdW5pcXVlbHkgaWRlbnRpZmllZCBieQogKiAzIHBhcmFtZXRlcnMsIHRoZSBsb2NhbCBsc2FwLCB0aGUgcmVtb3RlIGxzYXAgYW5kIHRoZSByZW1vdGUgYWRkcmVzcy4gCiAqIFdlIG1heSBpbml0aWF0ZSBtdWx0aXBsZSBjb25uZWN0aW9ucyB0byB0aGUgc2FtZSByZW1vdGUgc2VydmljZQogKiAodGhleSB3aWxsIGhhdmUgZGlmZmVyZW50IGxvY2FsIGxzYXApLCBhIHJlbW90ZSBkZXZpY2UgbWF5IGluaXRpYXRlCiAqIG11bHRpcGxlIGNvbm5lY3Rpb25zIHRvIHRoZSBzYW1lIGxvY2FsIHNlcnZpY2UgKHRoZXkgd2lsbCBoYXZlCiAqIGRpZmZlcmVudCByZW1vdGUgbHNhcCksIG9yIG11bHRpcGxlIGRldmljZXMgbWF5IGNvbm5lY3QgdG8gdGhlIHNhbWUKICogc2VydmljZSBhbmQgbWF5IHVzZSB0aGUgc2FtZSByZW1vdGUgbHNhcCAoYW5kIHRoZXkgd2lsbCBoYXZlCiAqIGRpZmZlcmVudCByZW1vdGUgYWRkcmVzcykuCiAqIFNvLCB3aGVyZSBpcyB0aGUgcmVtb3RlIGFkZHJlc3MgPyBFYWNoIExBUCBjb25uZWN0aW9uIGlzIG1hZGUgd2l0aAogKiBhIHNpbmdsZSByZW1vdGUgZGV2aWNlLCBzbyBpbXBseSBhIHNwZWNpZmljIHJlbW90ZSBhZGRyZXNzLgogKiBKZWFuIElJCiAqLwpzdGF0aWMgc3RydWN0IGxzYXBfY2IgKmlybG1wX2ZpbmRfbHNhcChzdHJ1Y3QgbGFwX2NiICpzZWxmLCBfX3U4IGRsc2FwX3NlbCwKCQkJCSAgICAgICBfX3U4IHNsc2FwX3NlbCwgaW50IHN0YXR1cywKCQkJCSAgICAgICBoYXNoYmluX3QgKnF1ZXVlKSAKewoJc3RydWN0IGxzYXBfY2IgKmxzYXA7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJCgkvKiAKCSAqICBPcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlLiBXZSBhc3N1bWUgdGhhdCB0aGUgbGFzdCBmcmFtZQoJICogIHJlY2VpdmVkIGlzIGluIHRoZSBzYW1lIGNvbm5lY3Rpb24gYXMgdGhlIGxhc3Qgb25lLCBzbyBjaGVjayBpbgoJICogIGNhY2hlIGZpcnN0IHRvIGF2b2lkIHRoZSBsaW5lYXIgc2VhcmNoCgkgKi8KI2lmZGVmIENPTkZJR19JUkRBX0NBQ0hFX0xBU1RfTFNBUAoJaWYgKChzZWxmLT5jYWNoZS52YWxpZCkgJiYgCgkgICAgKHNlbGYtPmNhY2hlLnNsc2FwX3NlbCA9PSBzbHNhcF9zZWwpICYmIAoJICAgIChzZWxmLT5jYWNoZS5kbHNhcF9zZWwgPT0gZGxzYXBfc2VsKSkgCgl7CgkJcmV0dXJuIChzZWxmLT5jYWNoZS5sc2FwKTsKCX0KI2VuZGlmCgoJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoKCWxzYXAgPSAoc3RydWN0IGxzYXBfY2IgKikgaGFzaGJpbl9nZXRfZmlyc3QocXVldWUpOwoJd2hpbGUgKGxzYXAgIT0gTlVMTCkgewoJCS8qIAoJCSAqICBJZiB0aGlzIGlzIGFuIGluY29taW5nIGNvbm5lY3Rpb24sIHRoZW4gdGhlIGRlc3RpbmF0aW9uIAoJCSAqICBMU0FQIHNlbGVjdG9yIG1heSBoYXZlIGJlZW4gc3BlY2lmaWVkIGFzIExNX0FOWSBzbyB0aGF0IAoJCSAqICBhbnkgY2xpZW50IGNhbiBjb25uZWN0LiBJbiB0aGF0IGNhc2Ugd2Ugb25seSBuZWVkIHRvIGNoZWNrCgkJICogIGlmIHRoZSBzb3VyY2UgTFNBUCAoaW4gb3VyIHZpZXchKSBtYXRjaCEKCQkgKi8KCQlpZiAoKHN0YXR1cyA9PSBDT05ORUNUX0NNRCkgJiYgCgkJICAgIChsc2FwLT5zbHNhcF9zZWwgPT0gc2xzYXBfc2VsKSAmJiAgICAgIAoJCSAgICAobHNhcC0+ZGxzYXBfc2VsID09IExTQVBfQU5ZKSkgewoJCQkvKiBUaGlzIGlzIHdoZXJlIHRoZSBkZXN0IGxzYXAgc2VsIGlzIHNldCBvbiBpbmNvbWluZwoJCQkgKiBsc2FwcyAqLwoJCQlsc2FwLT5kbHNhcF9zZWwgPSBkbHNhcF9zZWw7CgkJCWJyZWFrOwoJCX0KCQkvKgoJCSAqICBDaGVjayBpZiBzb3VyY2UgTFNBUCBhbmQgZGVzdCBMU0FQIHNlbGVjdG9ycyBtYXRjaC4KCQkgKi8KCQlpZiAoKGxzYXAtPnNsc2FwX3NlbCA9PSBzbHNhcF9zZWwpICYmIAoJCSAgICAobHNhcC0+ZGxzYXBfc2VsID09IGRsc2FwX3NlbCkpIAoJCQlicmVhazsKCgkJbHNhcCA9IChzdHJ1Y3QgbHNhcF9jYiAqKSBoYXNoYmluX2dldF9uZXh0KHF1ZXVlKTsKCX0KI2lmZGVmIENPTkZJR19JUkRBX0NBQ0hFX0xBU1RfTFNBUAoJaWYobHNhcCkKCQlpcmxtcF91cGRhdGVfY2FjaGUoc2VsZiwgbHNhcCk7CiNlbmRpZgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmhiX3NwaW5sb2NrLCBmbGFncyk7CgoJLyogUmV0dXJuIHdoYXQgd2UndmUgZm91bmQgb3IgTlVMTCAqLwoJcmV0dXJuIGxzYXA7Cn0K