LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJsYW5fcHJvdmlkZXIuYwogKiBWZXJzaW9uOiAgICAgICAwLjkKICogRGVzY3JpcHRpb246ICAgSXJEQSBMQU4gQWNjZXNzIFByb3RvY29sIEltcGxlbWVudGF0aW9uCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBTdW4gQXVnIDMxIDIwOjE0OjM3IDE5OTcKICogTW9kaWZpZWQgYXQ6ICAgU2F0IE9jdCAzMCAxMjo1MjoxMCAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogU291cmNlczogICAgICAgc2tlbGV0b24uYyBieSBEb25hbGQgQmVja2VyIDxiZWNrZXJAQ0VTRElTLmdzZmMubmFzYS5nb3Y+CiAqICAgICAgICAgICAgICAgIHNsaXAuYyBieSBMYXVyZW5jZSBDdWxoYW5lLCAgIDxsb3pAaG9sbWVzLmRlbW9uLmNvLnVrPgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHV3YWx0Lm5sLm11Z25ldC5vcmc+CiAqIAogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwgCiAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAgICAgCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgojaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgojaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgoKI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lydHRwLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXNfb2JqZWN0Lmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9jb21tb24uaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2V0aC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZXZlbnQuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX3Byb3ZpZGVyLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9maWx0ZXIuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NsaWVudC5oPgoKc3RhdGljIHZvaWQgaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAoJCQkJCSAgICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCAKCQkJCQkgICAgICBfX3UzMiBtYXhfc2R1X3NpemUsCgkJCQkJICAgICAgX191OCBtYXhfaGVhZGVyX3NpemUsCgkJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CgovKgogKiBGdW5jdGlvbiBpcmxhbl9wcm92aWRlcl9jb250cm9sX2RhdGFfaW5kaWNhdGlvbiAoaGFuZGxlLCBza2IpCiAqCiAqICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgZGF0YSB0aGF0IGlzIHJlY2VpdmVkIG9uIHRoZSBjb250cm9sIGNoYW5uZWwKICoKICovCnN0YXRpYyBpbnQgaXJsYW5fcHJvdmlkZXJfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAoJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCV9fdTggY29kZTsKCQoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgkKCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CgoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOwoKCWNvZGUgPSBza2ItPmRhdGFbMF07Cglzd2l0Y2goY29kZSkgewoJY2FzZSBDTURfR0VUX1BST1ZJREVSX0lORk86CgkJSVJEQV9ERUJVRyg0LCAiR290IEdFVF9QUk9WSURFUl9JTkZPIGNvbW1hbmQhXG4iKTsKCQlpcmxhbl9kb19wcm92aWRlcl9ldmVudChzZWxmLCBJUkxBTl9HRVRfSU5GT19DTUQsIHNrYik7IAoJCWJyZWFrOwoKCWNhc2UgQ01EX0dFVF9NRURJQV9DSEFSOgoJCUlSREFfREVCVUcoNCwgIkdvdCBHRVRfTUVESUFfQ0hBUiBjb21tYW5kIVxuIik7CgkJaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc2VsZiwgSVJMQU5fR0VUX01FRElBX0NNRCwgc2tiKTsgCgkJYnJlYWs7CgljYXNlIENNRF9PUEVOX0RBVEFfQ0hBTk5FTDoKCQlJUkRBX0RFQlVHKDQsICJHb3QgT1BFTl9EQVRBX0NIQU5ORUwgY29tbWFuZCFcbiIpOwoJCWlybGFuX2RvX3Byb3ZpZGVyX2V2ZW50KHNlbGYsIElSTEFOX09QRU5fREFUQV9DTUQsIHNrYik7IAoJCWJyZWFrOwoJY2FzZSBDTURfRklMVEVSX09QRVJBVElPTjoKCQlJUkRBX0RFQlVHKDQsICJHb3QgRklMVEVSX09QRVJBVElPTiBjb21tYW5kIVxuIik7CgkJaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc2VsZiwgSVJMQU5fRklMVEVSX0NPTkZJR19DTUQsIHNrYik7CgkJYnJlYWs7CgljYXNlIENNRF9SRUNPTk5FQ1RfREFUQV9DSEFOOgoJCUlSREFfREVCVUcoMiwgIiVzKCksIEdvdCBSRUNPTk5FQ1RfREFUQV9DSEFOIGNvbW1hbmRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCUlSREFfREVCVUcoMiwgIiVzKCksIE5PVCBJTVBMRU1FTlRFRFxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7CgljYXNlIENNRF9DTE9TRV9EQVRBX0NIQU46CgkJSVJEQV9ERUJVRygyLCAiR290IENMT1NFX0RBVEFfQ0hBTiBjb21tYW5kIVxuIik7CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgTk9UIElNUExFTUVOVEVEXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBjb21tYW5kIVxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7Cgl9CglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9pbmRpY2F0aW9uIChoYW5kbGUsIHNrYiwgcHJpdikKICoKICogICAgR290IGNvbm5lY3Rpb24gZnJvbSBwZWVyIElyTEFOIGNsaWVudAogKgogKi8Kc3RhdGljIHZvaWQgaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAoJCQkJCSAgICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLAoJCQkJCSAgICAgIF9fdTMyIG1heF9zZHVfc2l6ZSwgCgkJCQkJICAgICAgX191OCBtYXhfaGVhZGVyX3NpemUsCgkJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGlybGFuX2NiICpzZWxmOwoJc3RydWN0IHRzYXBfY2IgKnRzYXA7CglfX3UzMiBzYWRkciwgZGFkZHI7CgoJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgkKCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOwoJdHNhcCA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBzYXA7CgkKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgkKCUlSREFfQVNTRVJUKHRzYXAgPT0gc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsLHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+cHJvdmlkZXIuc3RhdGUgPT0gSVJMQU5fSURMRSwgcmV0dXJuOyk7CgoJZGFkZHIgPSBpcnR0cF9nZXRfZGFkZHIodHNhcCk7CglzYWRkciA9IGlydHRwX2dldF9zYWRkcih0c2FwKTsKCXNlbGYtPnByb3ZpZGVyLm1heF9zZHVfc2l6ZSA9IG1heF9zZHVfc2l6ZTsKCXNlbGYtPnByb3ZpZGVyLm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKCglpcmxhbl9kb19wcm92aWRlcl9ldmVudChzZWxmLCBJUkxBTl9DT05ORUNUX0lORElDQVRJT04sIE5VTEwpOwoKCS8qICAKCSAqIElmIHdlIGFyZSBpbiBwZWVyIG1vZGUsIHRoZSBjbGllbnQgbWF5IG5vdCBoYXZlIGdvdCB0aGUgZGlzY292ZXJ5CgkgKiBpbmRpY2F0aW9uIGl0IG5lZWRzIHRvIG1ha2UgcHJvZ3Jlc3MuIElmIHRoZSBjbGllbnQgaXMgc3RpbGwgaW4gCgkgKiBJRExFIHN0YXRlLCB3ZSBtdXN0IGtpY2sgaXQuIAoJICovCglpZiAoKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSAmJiAKCSAgICAoc2VsZi0+Y2xpZW50LnN0YXRlID09IElSTEFOX0lETEUpKSAKCXsKCQlpcmxhbl9jbGllbnRfd2FrZXVwKHNlbGYsIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkcik7Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX3Byb3ZpZGVyX2Nvbm5lY3RfcmVzcG9uc2UgKGhhbmRsZSkKICoKICogICAgQWNjZXB0IGluY29taW5nIGNvbm5lY3Rpb24KICoKICovCnZvaWQgaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9yZXNwb25zZShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsCgkJCQkgICAgIHN0cnVjdCB0c2FwX2NiICp0c2FwKQp7CglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCS8qIEp1c3QgYWNjZXB0ICovCglpcnR0cF9jb25uZWN0X3Jlc3BvbnNlKHRzYXAsIElSTEFOX01UVSwgTlVMTCk7Cn0KCnN0YXRpYyB2b2lkIGlybGFuX3Byb3ZpZGVyX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKCQkJCQkJIExNX1JFQVNPTiByZWFzb24sIAoJCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKSAKewoJc3RydWN0IGlybGFuX2NiICpzZWxmOwoJc3RydWN0IHRzYXBfY2IgKnRzYXA7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKSwgcmVhc29uPSVkXG4iLCBfX0ZVTkNUSU9OX18gLCByZWFzb24pOwoJCglzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKCXRzYXAgPSAoc3RydWN0IHRzYXBfY2IgKikgc2FwOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CQoJSVJEQV9BU1NFUlQodHNhcCAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHRzYXAtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKCQoJSVJEQV9BU1NFUlQodHNhcCA9PSBzZWxmLT5wcm92aWRlci50c2FwX2N0cmwsIHJldHVybjspOwoJCglpcmxhbl9kb19wcm92aWRlcl9ldmVudChzZWxmLCBJUkxBTl9MTVBfRElTQ09OTkVDVCwgTlVMTCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX3BhcnNlX29wZW5fZGF0YV9jbWQgKHNlbGYsIHNrYikKICoKICogICAgCiAqCiAqLwppbnQgaXJsYW5fcGFyc2Vfb3Blbl9kYXRhX2NtZChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCnsKCWludCByZXQ7CgkKCXJldCA9IGlybGFuX3Byb3ZpZGVyX3BhcnNlX2NvbW1hbmQoc2VsZiwgQ01EX09QRU5fREFUQV9DSEFOTkVMLCBza2IpOwoKCS8qIE9wZW4gZGF0YSBjaGFubmVsICovCglpcmxhbl9vcGVuX2RhdGFfdHNhcChzZWxmKTsKCglyZXR1cm4gcmV0Owp9CgovKgogKiBGdW5jdGlvbiBwYXJzZV9jb21tYW5kIChza2IpCiAqCiAqICAgIEV4dHJhY3QgYWxsIHBhcmFtZXRlcnMgZnJvbSByZWNlaXZlZCBidWZmZXIsIHRoZW4gZmVlZCB0aGVtIHRvIAogKiAgICBjaGVja19wYXJhbXMgZm9yIHBhcnNpbmcKICoKICovCmludCBpcmxhbl9wcm92aWRlcl9wYXJzZV9jb21tYW5kKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgaW50IGNtZCwKCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKewoJX191OCAqZnJhbWU7CglfX3U4ICpwdHI7CglpbnQgY291bnQ7CglfX3UxNiB2YWxfbGVuOwoJaW50IGk7CgljaGFyICpuYW1lOwogICAgICAgIGNoYXIgKnZhbHVlOwoJaW50IHJldCA9IFJTUF9TVUNDRVNTOwoJCglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC1SU1BfUFJPVE9DT0xfRVJST1I7KTsKCQoJSVJEQV9ERUJVRyg0LCAiJXMoKSwgc2tiLT5sZW49JWRcbiIsIF9fRlVOQ1RJT05fXyAsIChpbnQpc2tiLT5sZW4pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC1SU1BfUFJPVE9DT0xfRVJST1I7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm4gLVJTUF9QUk9UT0NPTF9FUlJPUjspOwoJCglpZiAoIXNrYikKCQlyZXR1cm4gLVJTUF9QUk9UT0NPTF9FUlJPUjsKCglmcmFtZSA9IHNrYi0+ZGF0YTsKCgluYW1lID0ga21hbGxvYygyNTUsIEdGUF9BVE9NSUMpOwoJaWYgKCFuYW1lKQoJCXJldHVybiAtUlNQX0lOU1VGRklDSUVOVF9SRVNPVVJDRVM7Cgl2YWx1ZSA9IGttYWxsb2MoMTAxNiwgR0ZQX0FUT01JQyk7CglpZiAoIXZhbHVlKSB7CgkJa2ZyZWUobmFtZSk7CgkJcmV0dXJuIC1SU1BfSU5TVUZGSUNJRU5UX1JFU09VUkNFUzsKCX0KCgkvKiBIb3cgbWFueSBwYXJhbWV0ZXJzPyAqLwoJY291bnQgPSBmcmFtZVsxXTsKCglJUkRBX0RFQlVHKDQsICJHb3QgJWQgcGFyYW1ldGVyc1xuIiwgY291bnQpOwoJCglwdHIgPSBmcmFtZSsyOwoJCgkvKiBGb3IgYWxsIHBhcmFtZXRlcnMgKi8KIAlmb3IgKGk9MDsgaTxjb3VudDtpKyspIHsKCQlyZXQgPSBpcmxhbl9leHRyYWN0X3BhcmFtKHB0ciwgbmFtZSwgdmFsdWUsICZ2YWxfbGVuKTsKCQlpZiAocmV0IDwgMCkgewoJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJckxBTiwgRXJyb3IhXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQkJYnJlYWs7CgkJfQoJCXB0cis9cmV0OwoJCXJldCA9IFJTUF9TVUNDRVNTOwoJCWlybGFuX2NoZWNrX2NvbW1hbmRfcGFyYW0oc2VsZiwgbmFtZSwgdmFsdWUpOwoJfQoJLyogQ2xlYW51cCAqLwoJa2ZyZWUobmFtZSk7CglrZnJlZSh2YWx1ZSk7CgoJcmV0dXJuIHJldDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fcHJvdmlkZXJfc2VuZF9yZXBseSAoc2VsZiwgaW5mbykKICoKICogICAgU2VuZCByZXBseSB0byBxdWVyeSB0byBwZWVyIElyTEFOIGxheWVyCiAqCiAqLwp2b2lkIGlybGFuX3Byb3ZpZGVyX3NlbmRfcmVwbHkoc3RydWN0IGlybGFuX2NiICpzZWxmLCBpbnQgY29tbWFuZCwgCgkJCSAgICAgICBpbnQgcmV0X2NvZGUpCnsKCXN0cnVjdCBza19idWZmICpza2I7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCglza2IgPSBkZXZfYWxsb2Nfc2tiKDEyOCk7CglpZiAoIXNrYikKCQlyZXR1cm47CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgVFRQLCBMTVAsIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZShza2IsIHNlbGYtPnByb3ZpZGVyLm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHNrYiwgMik7CiAgICAgICAKCXN3aXRjaCAoY29tbWFuZCkgewoJY2FzZSBDTURfR0VUX1BST1ZJREVSX0lORk86CgkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogU3VjY2VzcyAqLwoJCXNrYi0+ZGF0YVsxXSA9IDB4MDI7IC8qIDIgcGFyYW1ldGVycyAqLwoJCXN3aXRjaCAoc2VsZi0+bWVkaWEpIHsKCQljYXNlIE1FRElBXzgwMl8zOgoJCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIk1FRElBIiwgIjgwMi4zIik7CgkJCWJyZWFrOwoJCWNhc2UgTUVESUFfODAyXzU6CgkJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiTUVESUEiLCAiODAyLjUiKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgdW5rbm93biBtZWRpYSB0eXBlIVxuIiwgX19GVU5DVElPTl9fICk7CgkJCWJyZWFrOwoJCX0KCQlpcmxhbl9pbnNlcnRfc2hvcnRfcGFyYW0oc2tiLCAiSVJMQU5fVkVSIiwgMHgwMTAxKTsKCQlicmVhazsKCgljYXNlIENNRF9HRVRfTUVESUFfQ0hBUjoKCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCgkJc2tiLT5kYXRhWzFdID0gMHgwNTsgLyogNSBwYXJhbWV0ZXJzICovCgkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJESVJFQ1RFRCIpOwoJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX1RZUEUiLCAiQlJPQURDQVNUIik7CgkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJNVUxUSUNBU1QiKTsKCgkJc3dpdGNoIChzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSkgewoJCWNhc2UgQUNDRVNTX0RJUkVDVDoKCQkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJBQ0NFU1NfVFlQRSIsICJESVJFQ1QiKTsKCQkJYnJlYWs7CgkJY2FzZSBBQ0NFU1NfUEVFUjoKCQkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJBQ0NFU1NfVFlQRSIsICJQRUVSIik7CgkJCWJyZWFrOwoJCWNhc2UgQUNDRVNTX0hPU1RFRDoKCQkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJBQ0NFU1NfVFlQRSIsICJIT1NURUQiKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBhY2Nlc3MgdHlwZVxuIiwgX19GVU5DVElPTl9fICk7CgkJCWJyZWFrOwoJCX0KCQlpcmxhbl9pbnNlcnRfc2hvcnRfcGFyYW0oc2tiLCAiTUFYX0ZSQU1FIiwgMHgwNWVlKTsKCQlicmVhazsKCWNhc2UgQ01EX09QRU5fREFUQV9DSEFOTkVMOgoJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KCQlpZiAoc2VsZi0+cHJvdmlkZXIuc2VuZF9hcmJfdmFsKSB7CgkJCXNrYi0+ZGF0YVsxXSA9IDB4MDM7IC8qIDMgcGFyYW1ldGVycyAqLwoJCQlpcmxhbl9pbnNlcnRfc2hvcnRfcGFyYW0oc2tiLCAiQ09OX0FSQiIsIAoJCQkJCQkgc2VsZi0+cHJvdmlkZXIuc2VuZF9hcmJfdmFsKTsKCQl9IGVsc2UKCQkJc2tiLT5kYXRhWzFdID0gMHgwMjsgLyogMiBwYXJhbWV0ZXJzICovCgkJaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc2tiLCAiREFUQV9DSEFOIiwgc2VsZi0+c3RzYXBfc2VsX2RhdGEpOwoJCWlybGFuX2luc2VydF9hcnJheV9wYXJhbShza2IsICJSRUNPTk5FQ1RfS0VZIiwgIkxJTlVYIFJVTEVTISIsCgkJCQkJIDEyKTsKCQlicmVhazsKCWNhc2UgQ01EX0ZJTFRFUl9PUEVSQVRJT046CgkJaXJsYW5fZmlsdGVyX3JlcXVlc3Qoc2VsZiwgc2tiKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBjb21tYW5kIVxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7Cgl9CgoJaXJ0dHBfZGF0YV9yZXF1ZXN0KHNlbGYtPnByb3ZpZGVyLnRzYXBfY3RybCwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fcHJvdmlkZXJfcmVnaXN0ZXIodm9pZCkKICoKICogICAgUmVnaXN0ZXIgcHJvdmlkZXIgc3VwcG9ydCBzbyB3ZSBjYW4gYWNjZXB0IGluY29taW5nIGNvbm5lY3Rpb25zLgogKiAKICovCmludCBpcmxhbl9wcm92aWRlcl9vcGVuX2N0cmxfdHNhcChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCnsKCXN0cnVjdCB0c2FwX2NiICp0c2FwOwoJbm90aWZ5X3Qgbm90aWZ5OwoJCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybiAtMTspOwoKCS8qIENoZWNrIGlmIGFscmVhZHkgb3BlbiAqLwoJaWYgKHNlbGYtPnByb3ZpZGVyLnRzYXBfY3RybCkKCQlyZXR1cm4gLTE7CgkKCS8qCgkgKiAgRmlyc3QgcmVnaXN0ZXIgd2VsbCBrbm93biBjb250cm9sIFRTQVAKCSAqLwoJaXJkYV9ub3RpZnlfaW5pdCgmbm90aWZ5KTsKCW5vdGlmeS5kYXRhX2luZGljYXRpb24gICAgICAgPSBpcmxhbl9wcm92aWRlcl9kYXRhX2luZGljYXRpb247Cglub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uICAgID0gaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9pbmRpY2F0aW9uOwoJbm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiA9IGlybGFuX3Byb3ZpZGVyX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbjsKCW5vdGlmeS5pbnN0YW5jZSA9IHNlbGY7CglzdHJsY3B5KG5vdGlmeS5uYW1lLCAiSXJMQU4gY3RybCAocCkiLCBzaXplb2Yobm90aWZ5Lm5hbWUpKTsKCgl0c2FwID0gaXJ0dHBfb3Blbl90c2FwKExTQVBfQU5ZLCAxLCAmbm90aWZ5KTsKCWlmICghdHNhcCkgewoJCUlSREFfREVCVUcoMiwgIiVzKCksIEdvdCBubyB0c2FwIVxuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuIC0xOwoJfQoJc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsID0gdHNhcDsKCgkvKiBSZWdpc3RlciB3aXRoIExNLUlBUyAqLwoJaXJsYW5faWFzX3JlZ2lzdGVyKHNlbGYsIHRzYXAtPnN0c2FwX3NlbCk7CgoJcmV0dXJuIDA7Cn0KCg==