LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJsYW5fY2xpZW50X2V2ZW50LmMKICogVmVyc2lvbjogICAgICAgMC45CiAqIERlc2NyaXB0aW9uOiAgIElyTEFOIGNsaWVudCBzdGF0ZSBtYWNoaW5lCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBTdW4gQXVnIDMxIDIwOjE0OjM3IDE5OTcKICogTW9kaWZpZWQgYXQ6ICAgU3VuIERlYyAyNiAyMTo1MjoyNCAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogCiAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+LCAKICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICAKICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAogKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCiAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgoKI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL3RpbWVyLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcm1vZC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgoKI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NvbW1vbi5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fY2xpZW50Lmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9ldmVudC5oPgoKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfaWRsZSAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCgkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX3F1ZXJ5KHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAoJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOwpzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9jb25uIChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfaW5mbyAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCgkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX21lZGlhKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAoJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOwpzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9vcGVuIChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfd2FpdCAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCgkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2FyYiAgKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAoJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOwpzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9kYXRhIChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfY2xvc2Uoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCgkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CnN0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX3N5bmMgKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAoJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOwoKc3RhdGljIGludCAoKnN0YXRlW10pKHN0cnVjdCBpcmxhbl9jYiAqLCBJUkxBTl9FVkVOVCBldmVudCwgc3RydWN0IHNrX2J1ZmYgKikgPQp7IAoJaXJsYW5fY2xpZW50X3N0YXRlX2lkbGUsCglpcmxhbl9jbGllbnRfc3RhdGVfcXVlcnksCglpcmxhbl9jbGllbnRfc3RhdGVfY29ubiwKCWlybGFuX2NsaWVudF9zdGF0ZV9pbmZvLAoJaXJsYW5fY2xpZW50X3N0YXRlX21lZGlhLAoJaXJsYW5fY2xpZW50X3N0YXRlX29wZW4sCglpcmxhbl9jbGllbnRfc3RhdGVfd2FpdCwKCWlybGFuX2NsaWVudF9zdGF0ZV9hcmIsCglpcmxhbl9jbGllbnRfc3RhdGVfZGF0YSwKCWlybGFuX2NsaWVudF9zdGF0ZV9jbG9zZSwKCWlybGFuX2NsaWVudF9zdGF0ZV9zeW5jCn07Cgp2b2lkIGlybGFuX2RvX2NsaWVudF9ldmVudChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCnsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgoJKCpzdGF0ZVsgc2VsZi0+Y2xpZW50LnN0YXRlXSkgKHNlbGYsIGV2ZW50LCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfaWRsZSAoZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgSURMRSwgV2UgYXJlIHdhaXRpbmcgZm9yIGFuIGluZGljYXRpb24gdGhhdCB0aGVyZSBpcyBhIHByb3ZpZGVyCiAqICAgIGF2YWlsYWJsZS4KICovCnN0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2lkbGUoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCgkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm4gLTE7KTsKCQoJc3dpdGNoIChldmVudCkgewoJY2FzZSBJUkxBTl9ESVNDT1ZFUllfSU5ESUNBVElPTjoKCQlpZiAoc2VsZi0+Y2xpZW50LmlyaWFwKSB7CgkJCUlSREFfV0FSTklORygiJXMoKSwgYnVzeSB3aXRoIGEgcHJldmlvdXMgcXVlcnlcbiIsCgkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJCXJldHVybiAtRUJVU1k7CgkJfQoJCQoJCXNlbGYtPmNsaWVudC5pcmlhcCA9IGlyaWFwX29wZW4oTFNBUF9BTlksIElBU19DTElFTlQsIHNlbGYsCgkJCQkJCWlybGFuX2NsaWVudF9nZXRfdmFsdWVfY29uZmlybSk7CgkJLyogR2V0IHNvbWUgdmFsdWVzIGZyb20gcGVlciBJQVMgKi8KCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9RVUVSWSk7CgkJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3JlcXVlc3Qoc2VsZi0+Y2xpZW50LmlyaWFwLAoJCQkJCSAgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwKCQkJCQkgICAgICAiSXJMQU4iLCAiSXJEQTpUaW55VFA6THNhcFNlbCIpOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgoJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDQsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CgkJYnJlYWs7Cgl9CglpZiAoc2tiKSAKCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9zdGF0ZV9xdWVyeSAoZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgUVVFUlksIFdlIGhhdmUgcXVlcnllZCB0aGUgcmVtb3RlIElBUyBhbmQgaXMgcmVhZHkgdG8gY29ubmVjdAogKiAgICB0byBwcm92aWRlciwganVzdCB3YWl0aW5nIGZvciB0aGUgY29uZmlybS4KICoKICovCnN0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX3F1ZXJ5KHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAoJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpIAp7CglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybiAtMTspOwoJCglzd2l0Y2goZXZlbnQpIHsKCWNhc2UgSVJMQU5fSUFTX1BST1ZJREVSX0FWQUlMOgoJCUlSREFfQVNTRVJUKHNlbGYtPmR0c2FwX3NlbF9jdHJsICE9IDAsIHJldHVybiAtMTspOwoKCQlzZWxmLT5jbGllbnQub3Blbl9yZXRyaWVzID0gMDsKCQkKCQlpcnR0cF9jb25uZWN0X3JlcXVlc3Qoc2VsZi0+Y2xpZW50LnRzYXBfY3RybCwgCgkJCQkgICAgICBzZWxmLT5kdHNhcF9zZWxfY3RybCwgCgkJCQkgICAgICBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIsIE5VTEwsIAoJCQkJICAgICAgSVJMQU5fTVRVLCBOVUxMKTsKCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9DT05OKTsKCQlicmVhazsKCWNhc2UgSVJMQU5fSUFTX1BST1ZJREVSX05PVF9BVkFJTDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJQVNfUFJPVklERVJfTk9UX0FWQUlMXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKCgkJLyogR2l2ZSB0aGUgY2xpZW50IGEga2ljayEgKi8KCQlpZiAoKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSAmJiAKCQkgICAgKHNlbGYtPnByb3ZpZGVyLnN0YXRlICE9IElSTEFOX0lETEUpKQoJCQlpcmxhbl9jbGllbnRfd2FrZXVwKHNlbGYsIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkcik7CgkJYnJlYWs7CgljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOgoJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKCQlicmVhazsKCWNhc2UgSVJMQU5fV0FUQ0hET0dfVElNRU9VVDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJUkxBTl9XQVRDSERPR19USU1FT1VUXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOwoJCWJyZWFrOwoJfQoJaWYgKHNrYikKCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgkKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfY29ubiAoZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgQ09OTiwgV2UgaGF2ZSBjb25uZWN0ZWQgdG8gYSBwcm92aWRlciBidXQgaGFzIG5vdCBpc3N1ZWQgYW55CiAqICAgIGNvbW1hbmRzIHlldC4KICoKICovCnN0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2Nvbm4oc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCgkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgkKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgkKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgSVJMQU5fQ09OTkVDVF9DT01QTEVURToKCQkvKiBTZW5kIGdldGluZm8gY21kICovCgkJaXJsYW5fZ2V0X3Byb3ZpZGVyX2luZm8oc2VsZik7CgkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSU5GTyk7CgkJYnJlYWs7CgljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOgoJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKCQlicmVhazsKCWNhc2UgSVJMQU5fV0FUQ0hET0dfVElNRU9VVDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJUkxBTl9XQVRDSERPR19USU1FT1VUXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOwoJCWJyZWFrOwoJfQoJaWYgKHNrYikKCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgkKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfaW5mbyAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgSU5GTywgV2UgaGF2ZSBpc3N1ZWQgYSBHZXRJbmZvIGNvbW1hbmQgYW5kIGlzIGF3YWl0aW5nIGEgcmVwbHkuCiAqLwpzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9pbmZvKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAoJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgkKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgSVJMQU5fREFUQV9JTkRJQ0FUSU9OOgoJCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCQoJCWlybGFuX2NsaWVudF9wYXJzZV9yZXNwb25zZShzZWxmLCBza2IpOwoJCQoJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX01FRElBKTsKCQkKCQlpcmxhbl9nZXRfbWVkaWFfY2hhcihzZWxmKTsKCQlicmVhazsKCQkKCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6CgljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgoJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgoJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CgkJYnJlYWs7Cgl9CglpZiAoc2tiKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCQoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9zdGF0ZV9tZWRpYSAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgTUVESUEsIFRoZSBpcmxhbl9jbGllbnQgaGFzIGlzc3VlZCBhIEdldE1lZGlhIGNvbW1hbmQgYW5kIGlzIGF3YWl0aW5nIGEKICogICAgcmVwbHkuCiAqCiAqLwpzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9tZWRpYShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgkKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgoJc3dpdGNoKGV2ZW50KSB7CgljYXNlIElSTEFOX0RBVEFfSU5ESUNBVElPTjoKCQlpcmxhbl9jbGllbnRfcGFyc2VfcmVzcG9uc2Uoc2VsZiwgc2tiKTsKCQlpcmxhbl9vcGVuX2RhdGFfY2hhbm5lbChzZWxmKTsKCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9PUEVOKTsKCQlicmVhazsKCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6CgljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgoJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgoJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CgkJYnJlYWs7Cgl9CglpZiAoc2tiKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCQoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9zdGF0ZV9vcGVuIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICBPUEVOLCBUaGUgaXJsYW5fY2xpZW50IGhhcyBpc3N1ZWQgYSBPcGVuRGF0YSBjb21tYW5kIGFuZCBpcyBhd2FpdGluZyBhCiAqICAgIHJlcGx5CiAqCiAqLwpzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9vcGVuKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAoJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCnsKCXN0cnVjdCBxb3NfaW5mbyBxb3M7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgkKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgoJc3dpdGNoKGV2ZW50KSB7CgljYXNlIElSTEFOX0RBVEFfSU5ESUNBVElPTjoKCQlpcmxhbl9jbGllbnRfcGFyc2VfcmVzcG9uc2Uoc2VsZiwgc2tiKTsKCQkKCQkvKgoJCSAqICBDaGVjayBpZiB3ZSBoYXZlIGdvdCB0aGUgcmVtb3RlIFRTQVAgZm9yIGRhdGEgCgkJICogIGNvbW11bmljYXRpb25zCgkJICovCgkgIAlJUkRBX0FTU0VSVChzZWxmLT5kdHNhcF9zZWxfZGF0YSAhPSAwLCByZXR1cm4gLTE7KTsKCgkJLyogQ2hlY2sgd2hpY2ggYWNjZXNzIHR5cGUgd2UgYXJlIGRlYWxpbmcgd2l0aCAqLwoJCXN3aXRjaCAoc2VsZi0+Y2xpZW50LmFjY2Vzc190eXBlKSB7CgkJY2FzZSBBQ0NFU1NfUEVFUjoKCQkgICAgaWYgKHNlbGYtPnByb3ZpZGVyLnN0YXRlID09IElSTEFOX09QRU4pIHsKCQkJICAgIAoJCQkgICAgaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fQVJCKTsKCQkJICAgIGlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9DSEVDS19DT05fQVJCLCAKCQkJCQkJICBOVUxMKTsKCQkgICAgfSBlbHNlIHsKCQkJCgkJCSAgICBpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9XQUlUKTsKCQkgICAgfQoJCSAgICBicmVhazsKCQljYXNlIEFDQ0VTU19ESVJFQ1Q6CgkJY2FzZSBBQ0NFU1NfSE9TVEVEOgoJCQlxb3MubGlua19kaXNjX3RpbWUuYml0cyA9IDB4MDE7IC8qIDMgc2VjcyAqLwoJCQkKCQkJaXJ0dHBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXBfZGF0YSwgCgkJCQkJICAgICAgc2VsZi0+ZHRzYXBfc2VsX2RhdGEsIAoJCQkJCSAgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgJnFvcywgCgkJCQkJICAgICAgSVJMQU5fTVRVLCBOVUxMKTsKCQkJCgkJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0RBVEEpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1bmtub3duIGFjY2VzcyB0eXBlIVxuIiwgX19GVU5DVElPTl9fICk7CgkJCWJyZWFrOwoJCX0KCQlicmVhazsKCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6CgljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgoJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgoJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CgkJYnJlYWs7Cgl9CgkKCWlmIChza2IpCgkJZGV2X2tmcmVlX3NrYihza2IpOwoKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfd2FpdCAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgV0FJVCwgVGhlIGlybGFuX2NsaWVudCBpcyB3YWl0aW5nIGZvciB0aGUgbG9jYWwgcHJvdmlkZXIgdG8gZW50ZXIgdGhlCiAqICAgIHByb3ZpZGVyIE9QRU4gc3RhdGUuCiAqCiAqLwpzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV93YWl0KHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAoJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoJCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJCglzd2l0Y2goZXZlbnQpIHsKCWNhc2UgSVJMQU5fUFJPVklERVJfU0lHTkFMOgoJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0FSQik7CgkJaXJsYW5fZG9fY2xpZW50X2V2ZW50KHNlbGYsIElSTEFOX0NIRUNLX0NPTl9BUkIsIE5VTEwpOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9MTVBfRElTQ09OTkVDVDoKCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CgkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CgkJYnJlYWs7CgljYXNlIElSTEFOX1dBVENIRE9HX1RJTUVPVVQ6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSVJMQU5fV0FUQ0hET0dfVElNRU9VVFxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKCQlicmVhazsKCX0KCWlmIChza2IpCgkJZGV2X2tmcmVlX3NrYihza2IpOwoJCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfYXJiKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKewoJc3RydWN0IHFvc19pbmZvIHFvczsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJCglzd2l0Y2goZXZlbnQpIHsKCWNhc2UgSVJMQU5fQ0hFQ0tfQ09OX0FSQjoKCQlpZiAoc2VsZi0+Y2xpZW50LnJlY3ZfYXJiX3ZhbCA9PSBzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwpIHsKCQkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fQ0xPU0UpOwoJCQlpcmxhbl9jbG9zZV9kYXRhX2NoYW5uZWwoc2VsZik7CgkJfSBlbHNlIGlmIChzZWxmLT5jbGllbnQucmVjdl9hcmJfdmFsIDwgCgkJCSAgIHNlbGYtPnByb3ZpZGVyLnNlbmRfYXJiX3ZhbCkgCgkJewoJCQlxb3MubGlua19kaXNjX3RpbWUuYml0cyA9IDB4MDE7IC8qIDMgc2VjcyAqLwoKCQkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fREFUQSk7CgkJCWlydHRwX2Nvbm5lY3RfcmVxdWVzdChzZWxmLT50c2FwX2RhdGEsIAoJCQkJCSAgICAgIHNlbGYtPmR0c2FwX3NlbF9kYXRhLCAKCQkJCQkgICAgICBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIsICZxb3MsIAoJCQkJCSAgICAgIElSTEFOX01UVSwgTlVMTCk7CgkJfSBlbHNlIGlmIChzZWxmLT5jbGllbnQucmVjdl9hcmJfdmFsID4KCQkJICAgc2VsZi0+cHJvdmlkZXIuc2VuZF9hcmJfdmFsKSAKCQl7CgkJCUlSREFfREVCVUcoMiwgIiVzKCksIGxvc3QgdGhlIGJhdHRsZSA6LShcbiIsIF9fRlVOQ1RJT05fXyApOwoJCX0KCQlicmVhazsKCWNhc2UgSVJMQU5fREFUQV9DT05ORUNUX0lORElDQVRJT046CgkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fREFUQSk7CgkJYnJlYWs7CgljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOgoJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKCQlicmVhazsKCWNhc2UgSVJMQU5fV0FUQ0hET0dfVElNRU9VVDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJUkxBTl9XQVRDSERPR19USU1FT1VUXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOwoJCWJyZWFrOwoJfQoJaWYgKHNrYikKCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgkKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfZGF0YSAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKICoKICogICAgREFUQSwgVGhlIGRhdGEgY2hhbm5lbCBpcyBjb25uZWN0ZWQsIGFsbG93aW5nIGRhdGEgdHJhbnNmZXJzIGJldHdlZW4KICogICAgdGhlIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCiAqCiAqLwpzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9kYXRhKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAoJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CgoJc3dpdGNoKGV2ZW50KSB7CgljYXNlIElSTEFOX0RBVEFfSU5ESUNBVElPTjoKCQlpcmxhbl9jbGllbnRfcGFyc2VfcmVzcG9uc2Uoc2VsZiwgc2tiKTsKCQlicmVhazsJCQoJY2FzZSBJUkxBTl9MTVBfRElTQ09OTkVDVDogLyogRkFMTFRIUk9VR0ggKi8KCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CgkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKCQlicmVhazsKCX0KCWlmIChza2IpCgkJZGV2X2tmcmVlX3NrYihza2IpOwoJCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX2Nsb3NlIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQogKgogKiAgICAKICoKICovCnN0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2Nsb3NlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAoJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpIAp7CglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglpZiAoc2tiKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX3N5bmMgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCiAqCiAqICAgIAogKgogKi8Kc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfc3luYyhzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpIAp7CglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQoJaWYgKHNrYikKCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgkKCXJldHVybiAwOwp9CgoKCgoKCgoKCgoKCgo=