LyoKICogcHRocmVhZCBlbXVsYXRpb24gYmFzZWQgb24ga2VybmVsIHRocmVhZHMKICoKICogV2UgY2FuJ3QgdXNlIHB0aHJlYWRzIGRpcmVjdGx5LCBzbyB3aHkgbm90IGxldCBsaWJjcwogKiB0aGF0IHdhbnQgcHRocmVhZHMgdXNlIFdpbmUncyBvd24gdGhyZWFkaW5nIGluc3RlYWQuLi4KICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqIENvcHlyaWdodCAyMDAzIEFsZXhhbmRyZSBKdWxsaWFyZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCnN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlcjsKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8c2V0am1wLmg+CiNpZmRlZiBIQVZFX1VOSVNURF9ICiMgaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICiMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX01NQU5fSAojaW5jbHVkZSA8c3lzL21tYW4uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX05FVElORVRfSU5fSAojIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX0FSUEFfTkFNRVNFUl9ICiMgaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9SRVNPTFZfSAojIGluY2x1ZGUgPHJlc29sdi5oPgojZW5kaWYKI2lmZGVmIEhBVkVfVkFMR1JJTkRfTUVNQ0hFQ0tfSAojaW5jbHVkZSA8dmFsZ3JpbmQvbWVtY2hlY2suaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19TWVNDQUxMX0gKIyBpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX0xXUF9ICiMgaW5jbHVkZSA8c3lzL2x3cC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfVUNPTlRFWFRfSAojIGluY2x1ZGUgPHVjb250ZXh0Lmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TQ0hFRF9ICiNpbmNsdWRlIDxzY2hlZC5oPgojZW5kaWYKCiNpbmNsdWRlICJ3aW5lL2xpYnJhcnkuaCIKI2luY2x1ZGUgIndpbmUvcHRocmVhZC5oIgoKI2RlZmluZSBQX09VVFBVVChzdHVmZikgd3JpdGUoMixzdHVmZixzdHJsZW4oc3R1ZmYpKQoKI2RlZmluZSBQU1RSKHN0cikgX19BU01fTkFNRSgjc3RyKQoKc3RhdGljIHN0cnVjdCB3aW5lX3B0aHJlYWRfZnVuY3Rpb25zIGZ1bmNzOwoKLyogdGhyZWFkIGRlc2NyaXB0b3IgKi8KCiNkZWZpbmUgRklSU1RfS0VZIDAKI2RlZmluZSBNQVhfS0VZUyAxNiAvKiBsaWJjNiBkb2Vzbid0IHVzZSB0aGF0IG1hbnksIGJ1dC4uLiAqLwojZGVmaW5lIE1BWF9UU0QgIDE2CgpzdHJ1Y3QgcHRocmVhZF9kZXNjcl9zdHJ1Y3QKewogICAgY2hhciAgICAgICAgICAgICAgIGR1bW15WzIwNDhdOwogICAgaW50ICAgICAgICAgICAgICAgIHRocmVhZF9lcnJubzsKICAgIGludCAgICAgICAgICAgICAgICB0aHJlYWRfaF9lcnJubzsKICAgIGludCAgICAgICAgICAgICAgICBjYW5jZWxfc3RhdGU7CiAgICBpbnQgICAgICAgICAgICAgICAgY2FuY2VsX3R5cGU7CiAgICBzdHJ1Y3QgX19yZXNfc3RhdGUgcmVzX3N0YXRlOwogICAgY29uc3Qgdm9pZCAgICAgICAgKmtleV9kYXRhW01BWF9LRVlTXTsgIC8qIGZvciBub3JtYWwgcHRocmVhZCBrZXlzICovCiAgICBjb25zdCB2b2lkICAgICAgICAqdHNkX2RhdGFbTUFYX1RTRF07ICAgLyogZm9yIGxpYmMgaW50ZXJuYWwgdHNkIHZhcmlhYmxlcyAqLwp9OwoKdHlwZWRlZiBzdHJ1Y3QgcHRocmVhZF9kZXNjcl9zdHJ1Y3QgKnB0aHJlYWRfZGVzY3I7CgpzdGF0aWMgc3RydWN0IHB0aHJlYWRfZGVzY3Jfc3RydWN0IGluaXRpYWxfZGVzY3I7CgpwdGhyZWFkX2Rlc2NyIF9fcHRocmVhZF90aHJlYWRfc2VsZih2b2lkKQp7CiAgICBzdHJ1Y3QgcHRocmVhZF9kZXNjcl9zdHJ1Y3QgKmRlc2NyOwogICAgaWYgKCFmdW5jcy5wdHJfZ2V0X3RocmVhZF9kYXRhKSByZXR1cm4gJmluaXRpYWxfZGVzY3I7CiAgICBkZXNjciA9IGZ1bmNzLnB0cl9nZXRfdGhyZWFkX2RhdGEoKTsKICAgIGlmICghZGVzY3IpIHJldHVybiAmaW5pdGlhbF9kZXNjcjsKICAgIHJldHVybiBkZXNjcjsKfQoKc3RhdGljIGludCAoKmxpYmNfdXNlbG9jYWxlKShpbnQgc2V0KTsKc3RhdGljIGludCAqbGliY19tdWx0aXBsZV90aHJlYWRzOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBfX2Vycm5vX2xvY2F0aW9uL19fZXJyb3IvX19lcnJuby9fX19lcnJuby9fX3Rocl9lcnJubwogKgogKiBHZXQgdGhlIHBlci10aHJlYWQgZXJybm8gbG9jYXRpb24uCiAqLwppbnQgKl9fZXJybm9fbG9jYXRpb24odm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGludXggKi8KewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgcmV0dXJuICZkZXNjci0+dGhyZWFkX2Vycm5vOwp9CmludCAqX19lcnJvcih2b2lkKSAgICAgeyByZXR1cm4gX19lcnJub19sb2NhdGlvbigpOyB9ICAvKiBGcmVlQlNEICovCmludCAqX19lcnJubyh2b2lkKSAgICAgeyByZXR1cm4gX19lcnJub19sb2NhdGlvbigpOyB9ICAvKiBOZXRCU0QgKi8KaW50ICpfX19lcnJubyh2b2lkKSAgICB7IHJldHVybiBfX2Vycm5vX2xvY2F0aW9uKCk7IH0gIC8qIFNvbGFyaXMgKi8KaW50ICpfX3Rocl9lcnJubyh2b2lkKSB7IHJldHVybiBfX2Vycm5vX2xvY2F0aW9uKCk7IH0gIC8qIFVuaXhXYXJlICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIF9faF9lcnJub19sb2NhdGlvbgogKgogKiBHZXQgdGhlIHBlci10aHJlYWQgaF9lcnJubyBsb2NhdGlvbi4KICovCmludCAqX19oX2Vycm5vX2xvY2F0aW9uKHZvaWQpCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIHJldHVybiAmZGVzY3ItPnRocmVhZF9oX2Vycm5vOwp9CgpzdHJ1Y3QgX19yZXNfc3RhdGUgKl9fcmVzX3N0YXRlKHZvaWQpCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIHJldHVybiAmZGVzY3ItPnJlc19zdGF0ZTsKfQoKc3RhdGljIGlubGluZSB2b2lkIHdyaXRlanVtcCggY29uc3QgY2hhciAqc3ltYm9sLCB2b2lkICpkZXN0ICkKewojaWYgZGVmaW5lZChfX0dMSUJDX18pICYmIGRlZmluZWQoX19pMzg2X18pCiAgICB1bnNpZ25lZCBjaGFyICphZGRyID0gd2luZV9kbHN5bSggUlRMRF9ORVhULCBzeW1ib2wsIE5VTEwsIDAgKTsKCiAgICBpZiAoIWFkZHIpIHJldHVybjsKCiAgICAvKiB3cml0ZSBhIHJlbGF0aXZlIGp1bXAgYXQgdGhlIGZ1bmN0aW9uIGFkZHJlc3MgKi8KICAgIG1wcm90ZWN0KCh2b2lkKikoKHVuc2lnbmVkIGludClhZGRyICYgfihnZXRwYWdlc2l6ZSgpLTEpKSwgNSwgUFJPVF9SRUFEfFBST1RfRVhFQ3xQUk9UX1dSSVRFKTsKICAgIGFkZHJbMF0gPSAweGU5OwogICAgKihpbnQgKikoYWRkcisxKSA9ICh1bnNpZ25lZCBjaGFyICopZGVzdCAtIChhZGRyICsgNSk7CiAgICBtcHJvdGVjdCgodm9pZCopKCh1bnNpZ25lZCBpbnQpYWRkciAmIH4oZ2V0cGFnZXNpemUoKS0xKSksIDUsIFBST1RfUkVBRHxQUk9UX0VYRUMpOwoKIyBpZmRlZiBIQVZFX1ZBTEdSSU5EX01FTUNIRUNLX0gKICAgIFZBTEdSSU5EX0RJU0NBUkRfVFJBTlNMQVRJT05TKCBhZGRyLCA1ICk7CiMgZW5kaWYKI2VuZGlmICAvKiBfX0dMSUJDX18gJiYgX19pMzg2X18gKi8KfQoKLyogdGVtcG9yYXJ5IHN0YWNrcyB1c2VkIG9uIHRocmVhZCBleGl0ICovCiNkZWZpbmUgVEVNUF9TVEFDS19TSVpFIDEwMjQKI2RlZmluZSBOQl9URU1QX1NUQUNLUyAgOApzdGF0aWMgY2hhciB0ZW1wX3N0YWNrc1tOQl9URU1QX1NUQUNLU11bVEVNUF9TVEFDS19TSVpFXTsKc3RhdGljIExPTkcgbmV4dF90ZW1wX3N0YWNrOyAgLyogbmV4dCB0ZW1wIHN0YWNrIHRvIHVzZSAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBnZXRfdGVtcF9zdGFjawogKgogKiBHZXQgYSB0ZW1wb3Jhcnkgc3RhY2sgYWRkcmVzcyB0byBydW4gdGhlIHRocmVhZCBleGl0IGNvZGUgb24uCiAqLwppbmxpbmUgc3RhdGljIGNoYXIgKmdldF90ZW1wX3N0YWNrKHZvaWQpCnsKICAgIHVuc2lnbmVkIGludCBuZXh0ID0gaW50ZXJsb2NrZWRfeGNoZ19hZGQoICZuZXh0X3RlbXBfc3RhY2ssIDEgKTsKICAgIHJldHVybiB0ZW1wX3N0YWNrc1tuZXh0ICUgTkJfVEVNUF9TVEFDS1NdICsgVEVNUF9TVEFDS19TSVpFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBjbGVhbnVwX3RocmVhZAogKgogKiBDbGVhbnVwIHRoZSByZW1haW5zIG9mIGEgdGhyZWFkLiBSdW5zIG9uIGEgdGVtcG9yYXJ5IHN0YWNrLgogKi8Kc3RhdGljIHZvaWQgY2xlYW51cF90aHJlYWQoIHZvaWQgKnB0ciApCnsKICAgIC8qIGNvcHkgdGhlIGluZm8gc3RydWN0dXJlIHNpbmNlIGl0IGlzIG9uIHRoZSBzdGFjayB3ZSB3aWxsIGZyZWUgKi8KICAgIHN0cnVjdCB3aW5lX3B0aHJlYWRfdGhyZWFkX2luZm8gaW5mbyA9ICooc3RydWN0IHdpbmVfcHRocmVhZF90aHJlYWRfaW5mbyAqKXB0cjsKICAgIHdpbmVfbGR0X2ZyZWVfZnMoIGluZm8udGViX3NlbCApOwogICAgbXVubWFwKCBpbmZvLnN0YWNrX2Jhc2UsIGluZm8uc3RhY2tfc2l6ZSApOwogICAgbXVubWFwKCBpbmZvLnRlYl9iYXNlLCBpbmZvLnRlYl9zaXplICk7CiNpZmRlZiBIQVZFX19MV1BfQ1JFQVRFCiAgICBfbHdwX2V4aXQoKTsKI2VuZGlmCiAgICBfZXhpdCggaW5mby5leGl0X3N0YXR1cyApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICB3aW5lX3B0aHJlYWRfaW5pdF9wcm9jZXNzCiAqCiAqIEluaXRpYWxpemF0aW9uIGZvciBhIG5ld2x5IGNyZWF0ZWQgcHJvY2Vzcy4KICovCnZvaWQgd2luZV9wdGhyZWFkX2luaXRfcHJvY2VzcyggY29uc3Qgc3RydWN0IHdpbmVfcHRocmVhZF9mdW5jdGlvbnMgKmZ1bmN0aW9ucyApCnsKICAgIG1lbWNweSggJmZ1bmNzLCBmdW5jdGlvbnMsIG1pbihmdW5jdGlvbnMtPnNpemUsc2l6ZW9mKGZ1bmNzKSkgKTsKICAgIGZ1bmNzLnB0cl9zZXRfdGhyZWFkX2RhdGEoICZpbml0aWFsX2Rlc2NyICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIHdpbmVfcHRocmVhZF9pbml0X3RocmVhZAogKgogKiBJbml0aWFsaXphdGlvbiBmb3IgYSBuZXdseSBjcmVhdGVkIHRocmVhZC4KICovCnZvaWQgd2luZV9wdGhyZWFkX2luaXRfdGhyZWFkKCBzdHJ1Y3Qgd2luZV9wdGhyZWFkX3RocmVhZF9pbmZvICppbmZvICkKewogICAgc3RydWN0IHB0aHJlYWRfZGVzY3Jfc3RydWN0ICpkZXNjcjsKCiAgICBpZiAoZnVuY3MucHRyX3NldF90aHJlYWRfZGF0YSkKICAgIHsKICAgICAgICBkZXNjciA9IGNhbGxvYyggMSwgc2l6ZW9mKCpkZXNjcikgKTsKICAgICAgICBmdW5jcy5wdHJfc2V0X3RocmVhZF9kYXRhKCBkZXNjciApOwogICAgICAgIGlmIChsaWJjX211bHRpcGxlX3RocmVhZHMpICpsaWJjX211bHRpcGxlX3RocmVhZHMgPSAxOwogICAgfQogICAgZWxzZSAgLyogZmlyc3QgdGhyZWFkICovCiAgICB7CiAgICAgICAgZGVzY3IgPSAmaW5pdGlhbF9kZXNjcjsKICAgICAgICB3cml0ZWp1bXAoICJfX2Vycm5vX2xvY2F0aW9uIiwgX19lcnJub19sb2NhdGlvbiApOwogICAgICAgIHdyaXRlanVtcCggIl9faF9lcnJub19sb2NhdGlvbiIsIF9faF9lcnJub19sb2NhdGlvbiApOwogICAgICAgIHdyaXRlanVtcCggIl9fcmVzX3N0YXRlIiwgX19yZXNfc3RhdGUgKTsKICAgIH0KICAgIGRlc2NyLT5jYW5jZWxfc3RhdGUgPSBQVEhSRUFEX0NBTkNFTF9FTkFCTEU7CiAgICBkZXNjci0+Y2FuY2VsX3R5cGUgID0gUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTOwogICAgaWYgKGxpYmNfdXNlbG9jYWxlKSBsaWJjX3VzZWxvY2FsZSggLTEgLypMQ19HTE9CQUxfTE9DQUxFKi8gKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgd2luZV9wdGhyZWFkX2NyZWF0ZV90aHJlYWQKICovCmludCB3aW5lX3B0aHJlYWRfY3JlYXRlX3RocmVhZCggc3RydWN0IHdpbmVfcHRocmVhZF90aHJlYWRfaW5mbyAqaW5mbyApCnsKICAgIGlmICghaW5mby0+c3RhY2tfYmFzZSkKICAgIHsKICAgICAgICBpbmZvLT5zdGFja19iYXNlID0gd2luZV9hbm9uX21tYXAoIE5VTEwsIGluZm8tPnN0YWNrX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLCAwICk7CiAgICAgICAgaWYgKGluZm8tPnN0YWNrX2Jhc2UgPT0gKHZvaWQgKiktMSkgcmV0dXJuIC0xOwogICAgfQojaWZkZWYgSEFWRV9DTE9ORQogICAgaWYgKGNsb25lKCAoaW50ICgqKSh2b2lkICopKWluZm8tPmVudHJ5LCAoY2hhciAqKWluZm8tPnN0YWNrX2Jhc2UgKyBpbmZvLT5zdGFja19zaXplLAogICAgICAgICAgICAgICBDTE9ORV9WTSB8IENMT05FX0ZTIHwgQ0xPTkVfRklMRVMgfCBTSUdDSExELCBpbmZvICkgPCAwKQogICAgICAgIHJldHVybiAtMTsKICAgIHJldHVybiAwOwojZWxpZiBkZWZpbmVkKEhBVkVfUkZPUkspCiAgICB7CiAgICAgICAgdm9pZCAqKnNwID0gKHZvaWQgKiopKChjaGFyICopaW5mby0+c3RhY2tfYmFzZSArIGluZm8tPnN0YWNrX3NpemUpOwogICAgICAgICotLXNwID0gaW5mbzsKICAgICAgICAqLS1zcCA9IDA7CiAgICAgICAgKi0tc3AgPSBpbmZvLT5lbnRyeTsKICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygKICAgICAgICAgICAgInB1c2hsICUyO1xuXHQiICAgICAgICAgICAgIC8qIGZsYWdzICovCiAgICAgICAgICAgICJwdXNobCAkMDtcblx0IiAgICAgICAgICAgICAvKiAwID8gKi8KICAgICAgICAgICAgIm1vdmwgJTEsJSVlYXg7XG5cdCIgICAgICAgIC8qIFNZU19yZm9yayAqLwogICAgICAgICAgICAiLmJ5dGUgMHg5YTsgLmxvbmcgMDsgLndvcmQgNztcblx0IiAvKiBsY2FsbCA3OjAuLi4gRnJlZUJTRCBzeXNjYWxsICovCiAgICAgICAgICAgICJjbXBsICQwLCAlJWVkeDtcblx0IgogICAgICAgICAgICAiamUgMWY7XG5cdCIKICAgICAgICAgICAgIm1vdmwgJTAsJSVlc3A7XG5cdCIgICAgICAgIC8qIGNoaWxkIC0+IG5ldyB0aHJlYWQgKi8KICAgICAgICAgICAgInJldDtcbiIKICAgICAgICAgICAgIjE6XG5cdCIgICAgICAgICAgICAgICAgICAgIC8qIHBhcmVudCAtPiBjYWxsZXIgdGhyZWFkICovCiAgICAgICAgICAgICJhZGRsICQ4LCUlZXNwIiA6CiAgICAgICAgICAgIDogInIiIChzcCksICJyIiAoU1lTX3Jmb3JrKSwgInIiIChSRlBST0MgfCBSRk1FTSB8IFJGVEhSRUFEKQogICAgICAgICAgICA6ICJlYXgiLCAiZWR4Iik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbGlmIGRlZmluZWQoSEFWRV9fTFdQX0NSRUFURSkKICAgIHsKICAgICAgICB1Y29udGV4dF90IGNvbnRleHQ7CiAgICAgICAgX2x3cF9tYWtlY29udGV4dCggJmNvbnRleHQsICh2b2lkKCopKHZvaWQgKikpaW5mby0+ZW50cnksIGluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgaW5mby0+c3RhY2tfYmFzZSwgaW5mby0+c3RhY2tfc2l6ZSApOwogICAgICAgIGlmICggX2x3cF9jcmVhdGUoICZjb250ZXh0LCAwLCBOVUxMICkgKQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbmRpZgogICAgcmV0dXJuIC0xOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICB3aW5lX3B0aHJlYWRfaW5pdF9jdXJyZW50X3RlYgogKgogKiBTZXQgdGhlIGN1cnJlbnQgVEVCIGZvciBhIG5ldyB0aHJlYWQuCiAqLwp2b2lkIHdpbmVfcHRocmVhZF9pbml0X2N1cnJlbnRfdGViKCBzdHJ1Y3Qgd2luZV9wdGhyZWFkX3RocmVhZF9pbmZvICppbmZvICkKewojaWZkZWYgX19pMzg2X18KICAgIC8qIE9uIHRoZSBpMzg2LCB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW4gdGhlICVmcyByZWdpc3RlciAqLwogICAgTERUX0VOVFJZIGZzX2VudHJ5OwoKICAgIHdpbmVfbGR0X3NldF9iYXNlKCAmZnNfZW50cnksIGluZm8tPnRlYl9iYXNlICk7CiAgICB3aW5lX2xkdF9zZXRfbGltaXQoICZmc19lbnRyeSwgaW5mby0+dGViX3NpemUgLSAxICk7CiAgICB3aW5lX2xkdF9zZXRfZmxhZ3MoICZmc19lbnRyeSwgV0lORV9MRFRfRkxBR1NfREFUQXxXSU5FX0xEVF9GTEFHU18zMkJJVCApOwogICAgd2luZV9sZHRfaW5pdF9mcyggaW5mby0+dGViX3NlbCwgJmZzX2VudHJ5ICk7CiNlbGlmIGRlZmluZWQoSEFWRV9fTFdQX0NSRUFURSkKICAgIC8qIE9uIG5vbi1pMzg2IFNvbGFyaXMsIHdlIHVzZSB0aGUgTFdQIHByaXZhdGUgcG9pbnRlciAqLwogICAgX2x3cF9zZXRwcml2YXRlKCBpbmZvLT50ZWJfYmFzZSApOwojZWxpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQogICAgLyogT24gUG93ZXJQQywgdGhlIGN1cnJlbnQgVEVCIGlzIGluIHRoZSBncHIxMyByZWdpc3RlciAqLwojIGlmZGVmIF9fQVBQTEVfXwogICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yIHIxMywgJTAiIDogOiAiciIgKGluZm8tPnRlYl9iYXNlKSk7CiMgZWxzZQogICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yIDIsICUwIiA6IDogInIiIChpbmZvLT50ZWJfYmFzZSkpOwojIGVuZGlmCiNlbGlmIGRlZmluZWQoX19BTFBIQV9fKQogICAgLyogRklYTUU6IE9uIEFscGhhLCB0aGUgY3VycmVudCBURUIgaXMgbm90IGFjY2Vzc2libGUgdG8gdXNlci1zcGFjZSAqLwovKiAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygpOyovCiNlbHNlCiMgZXJyb3IgWW91IG11c3QgaW1wbGVtZW50IHdpbmVfcHRocmVhZF9pbml0X2N1cnJlbnRfdGViIGZvciB5b3VyIHBsYXRmb3JtCiNlbmRpZgoKICAgIC8qIHNldCBwaWQgYW5kIHRpZCAqLwogICAgaW5mby0+cGlkID0gZ2V0cGlkKCk7CiNpZmRlZiBIQVZFX19MV1BfU0VMRgogICAgaW5mby0+dGlkID0gX2x3cF9zZWxmKCk7CiNlbHNlCiAgICBpbmZvLT50aWQgPSAtMTsKI2VuZGlmCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIHdpbmVfcHRocmVhZF9nZXRfY3VycmVudF90ZWIKICovCnZvaWQgKndpbmVfcHRocmVhZF9nZXRfY3VycmVudF90ZWIodm9pZCkKewogICAgdm9pZCAqcmV0OwoKI2lmZGVmIF9faTM4Nl9fCiAgICBfX2FzbV9fKCAiLmJ5dGUgMHg2NFxuXHRtb3ZsIDB4MTgsJTAiIDogIj1yIiAocmV0KSApOwojZWxpZiBkZWZpbmVkKEhBVkVfX0xXUF9DUkVBVEUpCiAgICByZXQgPSBfbHdwX2dldHByaXZhdGUoKTsKI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKIyBpZmRlZiBfX0FQUExFX18KICAgIF9fYXNtX18oICJtciAlMCxyMTMiIDogIj1yIiAocmV0KSApOwojIGVsc2UKICAgIF9fYXNtX18oICJtciAlMCwyIiA6ICI9ciIgKHJldCkgKTsKIyBlbmRpZgojZWxpZiBkZWZpbmVkKF9fQUxQSEFfXykKICAgIC8qIDB4MDBhYiBpcyB0aGUgUEFMIG9wY29kZSBmb3IgcmR0ZWIgKi8KICAgIF9fYXNtX18oICJsZGEgJDMwLDgoJDMwKVxuXHQiCiAgICAgICAgICAgICAic3RxICQwLDAoJDMwKVxuXHQiCiAgICAgICAgICAgICAiY2FsbF9wYWwgMHgwMGFiXG5cdCIKICAgICAgICAgICAgICJtb3YgJDAsJTBcblx0IgogICAgICAgICAgICAgImxkcSAkMCwwKCQzMClcblx0IgogICAgICAgICAgICAgImxkYSAkMzAsLTgoJDMwKSIgOiAiPXIiIChyZXQpICk7CiNlbHNlCiMgZXJyb3Igd2luZV9wdGhyZWFkX2dldF9jdXJyZW50X3RlYiBub3QgZGVmaW5lZCBmb3IgdGhpcyBhcmNoaXRlY3R1cmUKI2VuZGlmICAvKiBfX2kzODZfXyAqLwoKICAgIHJldHVybiByZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIHdpbmVfcHRocmVhZF9leGl0X3RocmVhZAogKi8Kdm9pZCB3aW5lX3B0aHJlYWRfZXhpdF90aHJlYWQoIHN0cnVjdCB3aW5lX3B0aHJlYWRfdGhyZWFkX2luZm8gKmluZm8gKQp7CiAgICB3aW5lX3N3aXRjaF90b19zdGFjayggY2xlYW51cF90aHJlYWQsIGluZm8sIGdldF90ZW1wX3N0YWNrKCkgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgd2luZV9wdGhyZWFkX2Fib3J0X3RocmVhZAogKi8Kdm9pZCB3aW5lX3B0aHJlYWRfYWJvcnRfdGhyZWFkKCBpbnQgc3RhdHVzICkKewojaWZkZWYgSEFWRV9fTFdQX0NSRUFURQogICAgX2x3cF9leGl0KCk7CiNlbmRpZgogICAgX2V4aXQoIHN0YXR1cyApOwp9CgoKLyogQ3VycmVudGx5IHRoaXMgcHJvYmFibHkgd29ya3Mgb25seSBmb3IgZ2xpYmMyLAogKiB3aGljaCBjaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBvZiBkb3VibGUtdW5kZXJzY29yZS1wcmVwZW5kZWQKICogcHRocmVhZCBwcmltaXRpdmVzLCBhbmQgdXNlIHRoZW0gaWYgYXZhaWxhYmxlLgogKiBJZiB0aGV5IGFyZSBub3QgYXZhaWxhYmxlLCB0aGUgbGliYyBkZWZhdWx0cyB0bwogKiBub24tdGhyZWFkc2FmZSBvcGVyYXRpb24gKG5vdCBnb29kKS4gKi8KCiNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRF9IKSAmJiAoZGVmaW5lZChfX0dMSUJDX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pKQoKLyogYWRhcHQgYXMgbmVjZXNzYXJ5IChhIGNvbnN0cnVjdCBsaWtlIHRoaXMgaXMgdXNlZCBpbiBnbGliYyBzb3VyY2VzKSAqLwojZGVmaW5lIHN0cm9uZ19hbGlhcyhvcmlnLCBhbGlhcykgXAogYXNtKCIuZ2xvYmwgIiBQU1RSKGFsaWFzKSAiXG4iIFwKICAgICAiXHQuc2V0ICIgUFNUUihhbGlhcykgIiwiIFBTVFIob3JpZykpCgpzdHJ1Y3QgZm9ya19ibG9jazsKCi8qIHB0aHJlYWQgZnVuY3Rpb25zIHJlZGlyZWN0aW9uICovCgpzdHJ1Y3QgcHRocmVhZF9mdW5jdGlvbnMKewogIHBpZF90ICgqcHRyX3B0aHJlYWRfZm9yaykgKHN0cnVjdCBmb3JrX2Jsb2NrICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfZGVzdHJveSkgKHB0aHJlYWRfYXR0cl90ICopOwogIGludCAoKnB0cl9fX3B0aHJlYWRfYXR0cl9pbml0XzJfMCkgKHB0aHJlYWRfYXR0cl90ICopOwogIGludCAoKnB0cl9fX3B0aHJlYWRfYXR0cl9pbml0XzJfMSkgKHB0aHJlYWRfYXR0cl90ICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfZ2V0ZGV0YWNoc3RhdGUpIChjb25zdCBwdGhyZWFkX2F0dHJfdCAqLCBpbnQgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSkgKHB0aHJlYWRfYXR0cl90ICosIGludCk7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9nZXRpbmhlcml0c2NoZWQpIChjb25zdCBwdGhyZWFkX2F0dHJfdCAqLCBpbnQgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9zZXRpbmhlcml0c2NoZWQpIChwdGhyZWFkX2F0dHJfdCAqLCBpbnQpOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfZ2V0c2NoZWRwYXJhbSkgKGNvbnN0IHB0aHJlYWRfYXR0cl90ICosIHN0cnVjdCBzY2hlZF9wYXJhbSAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0pIChwdGhyZWFkX2F0dHJfdCAqLCBjb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9nZXRzY2hlZHBvbGljeSkgKGNvbnN0IHB0aHJlYWRfYXR0cl90ICosIGludCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5KSAocHRocmVhZF9hdHRyX3QgKiwgaW50KTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX2dldHNjb3BlKSAoY29uc3QgcHRocmVhZF9hdHRyX3QgKiwgaW50ICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfc2V0c2NvcGUpIChwdGhyZWFkX2F0dHJfdCAqLCBpbnQpOwogIGludCAoKnB0cl9wdGhyZWFkX2NvbmRhdHRyX2Rlc3Ryb3kpIChwdGhyZWFkX2NvbmRhdHRyX3QgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfY29uZGF0dHJfaW5pdCkgKHB0aHJlYWRfY29uZGF0dHJfdCAqKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2NvbmRfYnJvYWRjYXN0KSAocHRocmVhZF9jb25kX3QgKik7CiAgaW50ICgqcHRyX19fcHRocmVhZF9jb25kX2Rlc3Ryb3kpIChwdGhyZWFkX2NvbmRfdCAqKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2NvbmRfaW5pdCkgKHB0aHJlYWRfY29uZF90ICosIGNvbnN0IHB0aHJlYWRfY29uZGF0dHJfdCAqKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2NvbmRfc2lnbmFsKSAocHRocmVhZF9jb25kX3QgKik7CiAgaW50ICgqcHRyX19fcHRocmVhZF9jb25kX3dhaXQpIChwdGhyZWFkX2NvbmRfdCAqLCBwdGhyZWFkX211dGV4X3QgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfZXF1YWwpIChwdGhyZWFkX3QsIHB0aHJlYWRfdCk7CiAgdm9pZCAoKnB0cl9fX3B0aHJlYWRfZXhpdCkgKHZvaWQgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfZ2V0c2NoZWRwYXJhbSkgKHB0aHJlYWRfdCwgaW50ICosIHN0cnVjdCBzY2hlZF9wYXJhbSAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9zZXRzY2hlZHBhcmFtKSAocHRocmVhZF90LCBpbnQsIGNvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9tdXRleF9kZXN0cm95KSAocHRocmVhZF9tdXRleF90ICopOwogIGludCAoKnB0cl9wdGhyZWFkX211dGV4X2luaXQpIChwdGhyZWFkX211dGV4X3QgKiwgY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9tdXRleF9sb2NrKSAocHRocmVhZF9tdXRleF90ICopOwogIGludCAoKnB0cl9wdGhyZWFkX211dGV4X3RyeWxvY2spIChwdGhyZWFkX211dGV4X3QgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKSAocHRocmVhZF9tdXRleF90ICopOwogIHB0aHJlYWRfdCAoKnB0cl9wdGhyZWFkX3NlbGYpICh2b2lkKTsKICBpbnQgKCpwdHJfcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSkgKGludCwgaW50ICopOwogIGludCAoKnB0cl9wdGhyZWFkX3NldGNhbmNlbHR5cGUpIChpbnQsIGludCAqKTsKICB2b2lkICgqcHRyX3B0aHJlYWRfZG9fZXhpdCkgKHZvaWQgKnJldHZhbCwgY2hhciAqY3VycmVudGZyYW1lKTsKICB2b2lkICgqcHRyX3B0aHJlYWRfY2xlYW51cF91cHRvKSAoam1wX2J1ZiB0YXJnZXQsIGNoYXIgKnRhcmdldGZyYW1lKTsKICBwdGhyZWFkX2Rlc2NyICgqcHRyX3B0aHJlYWRfdGhyZWFkX3NlbGYpICh2b2lkKTsKICBpbnQgKCpwdHJfcHRocmVhZF9pbnRlcm5hbF90c2Rfc2V0KSAoaW50IGtleSwgY29uc3Qgdm9pZCAqcG9pbnRlcik7CiAgdm9pZCAqICgqcHRyX3B0aHJlYWRfaW50ZXJuYWxfdHNkX2dldCkgKGludCBrZXkpOwogIHZvaWQgKiogX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpICgqcHRyX3B0aHJlYWRfaW50ZXJuYWxfdHNkX2FkZHJlc3MpIChpbnQga2V5KTsKICBpbnQgKCpwdHJfcHRocmVhZF9zaWdhY3Rpb24pIChpbnQgc2lnLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICogYWN0LCBzdHJ1Y3Qgc2lnYWN0aW9uICpvYWN0KTsKICBpbnQgKCpwdHJfcHRocmVhZF9zaWd3YWl0KSAoY29uc3Qgc2lnc2V0X3QgKnNldCwgaW50ICpzaWcpOwogIGludCAoKnB0cl9wdGhyZWFkX3JhaXNlKSAoaW50IHNpZyk7CiAgaW50ICgqcHRyX19fcHRocmVhZF9jb25kX3RpbWVkd2FpdCkgKHB0aHJlYWRfY29uZF90ICosIHB0aHJlYWRfbXV0ZXhfdCAqLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKik7CiAgdm9pZCAoKnB0cl9fcHRocmVhZF9jbGVhbnVwX3B1c2gpIChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKiBidWZmZXIsIHZvaWQgKCpyb3V0aW5lKSh2b2lkICopLCB2b2lkICogYXJnKTsKICB2b2lkICgqcHRyX19wdGhyZWFkX2NsZWFudXBfcG9wKSAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICogYnVmZmVyLCBpbnQgZXhlY3V0ZSk7Cn07CgpzdGF0aWMgcGlkX3QgKCpsaWJjX2ZvcmspKHZvaWQpOwpzdGF0aWMgaW50ICgqbGliY19zaWdhY3Rpb24pKGludCBzaWdudW0sIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKmFjdCwgc3RydWN0IHNpZ2FjdGlvbiAqb2xkYWN0KTsKc3RhdGljIGludCAqKCpsaWJjX3B0aHJlYWRfaW5pdCkoIGNvbnN0IHN0cnVjdCBwdGhyZWFkX2Z1bmN0aW9ucyAqZnVuY3MgKTsKCnN0YXRpYyBzdHJ1Y3QgcHRocmVhZF9mdW5jdGlvbnMgbGliY19wdGhyZWFkX2Z1bmN0aW9uczsKCnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfdGhyZWFkX3NlbGYsIHB0aHJlYWRfdGhyZWFkX3NlbGYpOwoKLyogcmVkZWZpbmUgdGhpcyB0byBwcmV2ZW50IGxpYnB0aHJlYWQgZnJvbSBvdmVycmlkaW5nIG91ciBmdW5jdGlvbiBwb2ludGVycyAqLwppbnQgKl9fbGliY19wdGhyZWFkX2luaXQoIGNvbnN0IHN0cnVjdCBwdGhyZWFkX2Z1bmN0aW9ucyAqZnVuY3MgKQp7CiAgICByZXR1cm4gbGliY19tdWx0aXBsZV90aHJlYWRzOwp9Cgp0eXBlZGVmIHN0cnVjdCBfd2luZV9jbGVhbnVwIHsKICB2b2lkICgqcm91dGluZSkodm9pZCAqKTsKICB2b2lkICphcmc7Cn0gKndpbmVfY2xlYW51cDsKCmludCBwdGhyZWFkX2NyZWF0ZShwdGhyZWFkX3QqIHRocmVhZCwgY29uc3QgcHRocmVhZF9hdHRyX3QqIGF0dHIsIHZvaWQqCiAgICAgICAgKCpzdGFydF9yb3V0aW5lKSh2b2lkICopLCB2b2lkKiBhcmcpCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfY3JlYXRlICk7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfY3JlYXRlKCB0aHJlYWQsIGF0dHIsIHN0YXJ0X3JvdXRpbmUsIGFyZyApOwp9CgppbnQgcHRocmVhZF9jYW5jZWwocHRocmVhZF90IHRocmVhZCkKewogICAgYXNzZXJ0KCBmdW5jcy5wdHJfcHRocmVhZF9jYW5jZWwgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9jYW5jZWwoIHRocmVhZCApOwp9CgppbnQgcHRocmVhZF9qb2luKHB0aHJlYWRfdCB0aHJlYWQsIHZvaWQgKip2YWx1ZV9wdHIpCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfam9pbiApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2pvaW4oIHRocmVhZCwgdmFsdWVfcHRyICk7Cn0KCmludCBwdGhyZWFkX2RldGFjaChwdGhyZWFkX3QgdGhyZWFkKQp7CiAgICBhc3NlcnQoIGZ1bmNzLnB0cl9wdGhyZWFkX2RldGFjaCApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2RldGFjaCggdGhyZWFkICk7Cn0KCi8qIEZJWE1FOiB3ZSBoYXZlIG5vIGVxdWl2YWxlbnRzIGluIHdpbjMyIGZvciB0aGUgcG9saWN5cyAqLwovKiBzbyBqdXN0IGtlZXAgdGhpcyBhcyBhIHN0dWIgKi8KaW50IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeShwdGhyZWFkX2F0dHJfdCAqYXR0ciwgaW50IHBvbGljeSkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3lcbiIpOwogIHJldHVybiAwOwp9CgovKiBGSVhNRTogbm8gd2luMzIgZXF1aXZhbGVudCBmb3Igc2NvcGUgKi8KaW50IHB0aHJlYWRfYXR0cl9zZXRzY29wZShwdGhyZWFkX2F0dHJfdCAqYXR0ciwgaW50IHNjb3BlKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfYXR0cl9zZXRzY29wZVxuIik7CiAgcmV0dXJuIDA7IC8qIHJldHVybiBzdWNjZXNzICovCn0KCi8qIEZJWE1FOiBubyB3aW4zMiBlcXVpdmFsZW50IGZvciBzY2hlZHVsZSBwYXJhbSAqLwppbnQgcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0ocHRocmVhZF9hdHRyX3QgKmF0dHIsCiAgICBjb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKnBhcmFtKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtXG4iKTsKICByZXR1cm4gMDsgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQoKLyogRklYTUUgKi8KaW50IHB0aHJlYWRfYXR0cl9zZXRzdGFjayhwdGhyZWFkX2F0dHJfdCAqYXR0ciwgdm9pZCAqYWRkciwgc2l6ZV90IHNpemUpCnsKICByZXR1cm4gMDsgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQoKaW50IF9fcHRocmVhZF9vbmNlKHB0aHJlYWRfb25jZV90ICpvbmNlX2NvbnRyb2wsIHZvaWQgKCppbml0X3JvdXRpbmUpKHZvaWQpKQp7CiAgICBzdGF0aWMgcHRocmVhZF9vbmNlX3QgdGhlX29uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKICAgIGxvbmcgb25jZV9ub3c7CgogICAgbWVtY3B5KCZvbmNlX25vdywmdGhlX29uY2Usc2l6ZW9mKG9uY2Vfbm93KSk7CiAgICBpZiAoaW50ZXJsb2NrZWRfY21weGNoZygobG9uZyopb25jZV9jb250cm9sLCBvbmNlX25vdysxLCBvbmNlX25vdykgPT0gb25jZV9ub3cpCiAgICAgICAgKCppbml0X3JvdXRpbmUpKCk7CiAgICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX29uY2UsIHB0aHJlYWRfb25jZSk7Cgp2b2lkIF9fcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnAodm9pZCkKewogICAgLyogd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlICovCn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnAsIHB0aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wKTsKCi8qKioqKiBhdGZvcmsgKioqKiovCgojZGVmaW5lIE1BWF9BVEZPUksgOCAgLyogbGliYyBkb2Vzbid0IG5lZWQgdGhhdCBtYW55IGFueXdheSAqLwoKc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBhdGZvcmtfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwoKdHlwZWRlZiB2b2lkICgqYXRmb3JrX2hhbmRsZXIpKCk7CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfcHJlcGFyZVtNQVhfQVRGT1JLXTsKc3RhdGljIGF0Zm9ya19oYW5kbGVyIGF0Zm9ya19wYXJlbnRbTUFYX0FURk9SS107CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfY2hpbGRbTUFYX0FURk9SS107CnN0YXRpYyBpbnQgYXRmb3JrX2NvdW50OwoKaW50IF9fcHRocmVhZF9hdGZvcmsodm9pZCAoKnByZXBhcmUpKHZvaWQpLCB2b2lkICgqcGFyZW50KSh2b2lkKSwgdm9pZCAoKmNoaWxkKSh2b2lkKSkKewogICAgcHRocmVhZF9tdXRleF9sb2NrKCAmYXRmb3JrX211dGV4ICk7CiAgICBhc3NlcnQoIGF0Zm9ya19jb3VudCA8IE1BWF9BVEZPUksgKTsKICAgIGF0Zm9ya19wcmVwYXJlW2F0Zm9ya19jb3VudF0gPSBwcmVwYXJlOwogICAgYXRmb3JrX3BhcmVudFthdGZvcmtfY291bnRdID0gcGFyZW50OwogICAgYXRmb3JrX2NoaWxkW2F0Zm9ya19jb3VudF0gPSBjaGlsZDsKICAgIGF0Zm9ya19jb3VudCsrOwogICAgcHRocmVhZF9tdXRleF91bmxvY2soICZhdGZvcmtfbXV0ZXggKTsKICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfYXRmb3JrLCBwdGhyZWFkX2F0Zm9yayk7CgpwaWRfdCBfX2Zvcmsodm9pZCkKewogICAgcGlkX3QgcGlkOwogICAgaW50IGk7CgogICAgaWYgKCFsaWJjX2ZvcmspCiAgICB7CiAgICAgICAgbGliY19mb3JrID0gd2luZV9kbHN5bSggUlRMRF9ORVhULCAiZm9yayIsIE5VTEwsIDAgKTsKICAgICAgICBhc3NlcnQoIGxpYmNfZm9yayApOwogICAgfQogICAgcHRocmVhZF9tdXRleF9sb2NrKCAmYXRmb3JrX211dGV4ICk7CiAgICAvKiBwcmVwYXJlIGhhbmRsZXJzIGFyZSBjYWxsZWQgaW4gcmV2ZXJzZSBpbnNlcnRpb24gb3JkZXIgKi8KICAgIGZvciAoaSA9IGF0Zm9ya19jb3VudCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoYXRmb3JrX3ByZXBhcmVbaV0pIGF0Zm9ya19wcmVwYXJlW2ldKCk7CiAgICBpZiAoIShwaWQgPSBsaWJjX2ZvcmsoKSkpCiAgICB7CiAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCAmYXRmb3JrX211dGV4LCBOVUxMICk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0Zm9ya19jb3VudDsgaSsrKSBpZiAoYXRmb3JrX2NoaWxkW2ldKSBhdGZvcmtfY2hpbGRbaV0oKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXRmb3JrX2NvdW50OyBpKyspIGlmIChhdGZvcmtfcGFyZW50W2ldKSBhdGZvcmtfcGFyZW50W2ldKCk7CiAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soICZhdGZvcmtfbXV0ZXggKTsKICAgIH0KICAgIHJldHVybiBwaWQ7Cn0Kc3Ryb25nX2FsaWFzKF9fZm9yaywgZm9yayk7CgovKioqKiogTVVURVhFUyAqKioqKi8KCmludCBfX3B0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4X3QgKm11dGV4LCBjb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICptdXRleGF0dHIpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfaW5pdCkgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfaW5pdCggbXV0ZXgsIG11dGV4YXR0ciApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfaW5pdCwgcHRocmVhZF9tdXRleF9pbml0KTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfbG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX211dGV4X2xvY2spIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX211dGV4X2xvY2soIG11dGV4ICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9sb2NrLCBwdGhyZWFkX211dGV4X2xvY2spOwoKaW50IF9fcHRocmVhZF9tdXRleF90cnlsb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaykgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayggbXV0ZXggKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X3RyeWxvY2ssIHB0aHJlYWRfbXV0ZXhfdHJ5bG9jayk7CgppbnQgX19wdGhyZWFkX211dGV4X3VubG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX211dGV4X3VubG9jaykgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKCBtdXRleCApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCBwdGhyZWFkX211dGV4X3VubG9jayk7CgppbnQgX19wdGhyZWFkX211dGV4X2Rlc3Ryb3kocHRocmVhZF9tdXRleF90ICptdXRleCkKewogICAgaWYgKCFmdW5jcy5wdHJfcHRocmVhZF9tdXRleF9kZXN0cm95KSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9tdXRleF9kZXN0cm95KCBtdXRleCApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSwgcHRocmVhZF9tdXRleF9kZXN0cm95KTsKCgovKioqKiogTVVURVggQVRUUklCVVRFUyAqKioqKi8KLyoganVzdCBkdW1taWVzLCBzaW5jZSBjcml0aWNhbCBzZWN0aW9ucyBhcmUgYWx3YXlzIHJlY3Vyc2l2ZSAqLwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfaW5pdChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfaW5pdCwgcHRocmVhZF9tdXRleGF0dHJfaW5pdCk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9kZXN0cm95LCBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnAocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0ciwgaW50IGtpbmQpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9zZXRraW5kX25wLCBwdGhyZWFkX211dGV4YXR0cl9zZXRraW5kX25wKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnAocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0ciwgaW50ICpraW5kKQp7CiAgKmtpbmQgPSBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9nZXRraW5kX25wLCBwdGhyZWFkX211dGV4YXR0cl9nZXRraW5kX25wKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0ciwgaW50IGtpbmQpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlLCBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUoY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqYXR0ciwgaW50ICpraW5kKQp7CiAgKmtpbmQgPSBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9nZXR0eXBlLCBwdGhyZWFkX211dGV4YXR0cl9nZXR0eXBlKTsKCgovKioqKiogVEhSRUFELVNQRUNJRklDIFZBUklBQkxFUyAoS0VZUykgKioqKiovCgppbnQgX19wdGhyZWFkX2tleV9jcmVhdGUocHRocmVhZF9rZXlfdCAqa2V5LCB2b2lkICgqZGVzdHJfZnVuY3Rpb24pKHZvaWQgKikpCnsKICAgIHN0YXRpYyBsb25nIGtleWNudCA9IEZJUlNUX0tFWTsKICAgICprZXkgPSBpbnRlcmxvY2tlZF94Y2hnX2FkZCgma2V5Y250LCAxKTsKICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfa2V5X2NyZWF0ZSwgcHRocmVhZF9rZXlfY3JlYXRlKTsKCmludCBfX3B0aHJlYWRfa2V5X2RlbGV0ZShwdGhyZWFkX2tleV90IGtleSkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfa2V5X2RlbGV0ZSwgcHRocmVhZF9rZXlfZGVsZXRlKTsKCmludCBfX3B0aHJlYWRfc2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXksIGNvbnN0IHZvaWQgKnBvaW50ZXIpCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIGRlc2NyLT5rZXlfZGF0YVtrZXldID0gcG9pbnRlcjsKICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfc2V0c3BlY2lmaWMsIHB0aHJlYWRfc2V0c3BlY2lmaWMpOwoKdm9pZCAqX19wdGhyZWFkX2dldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5KQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICByZXR1cm4gKHZvaWQgKilkZXNjci0+a2V5X2RhdGFba2V5XTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2dldHNwZWNpZmljLCBwdGhyZWFkX2dldHNwZWNpZmljKTsKCnN0YXRpYyBpbnQgcHRocmVhZF9pbnRlcm5hbF90c2Rfc2V0KCBpbnQga2V5LCBjb25zdCB2b2lkICpwb2ludGVyICkKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgZGVzY3ItPnRzZF9kYXRhW2tleV0gPSBwb2ludGVyOwogICAgcmV0dXJuIDA7Cn0KaW50ICgqX19saWJjX2ludGVybmFsX3RzZF9zZXQpKGludCwgY29uc3Qgdm9pZCAqKSA9IHB0aHJlYWRfaW50ZXJuYWxfdHNkX3NldDsKCnN0YXRpYyB2b2lkICpwdGhyZWFkX2ludGVybmFsX3RzZF9nZXQoIGludCBrZXkgKQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICByZXR1cm4gKHZvaWQgKilkZXNjci0+dHNkX2RhdGFba2V5XTsKfQp2b2lkKiAoKl9fbGliY19pbnRlcm5hbF90c2RfZ2V0KShpbnQpID0gcHRocmVhZF9pbnRlcm5hbF90c2RfZ2V0OwoKc3RhdGljIHZvaWQgKiogX19hdHRyaWJ1dGVfXygoY29uc3QpKSBwdGhyZWFkX2ludGVybmFsX3RzZF9hZGRyZXNzKCBpbnQga2V5ICkKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgcmV0dXJuICh2b2lkICoqKSZkZXNjci0+dHNkX2RhdGFba2V5XTsKfQp2b2lkKiogKCpfX2xpYmNfaW50ZXJuYWxfdHNkX2FkZHJlc3MpKGludCkgPSBwdGhyZWFkX2ludGVybmFsX3RzZF9hZGRyZXNzOwoKLyoqKioqICJFWENFUFRJT04iIEZSQU1FUyAqKioqKi8KLyogbm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdyAqLwoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3B1c2goc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsIHZvaWQgKCpyb3V0aW5lKSh2b2lkICopLCB2b2lkICphcmcpCnsKICAoKHdpbmVfY2xlYW51cClidWZmZXIpLT5yb3V0aW5lID0gcm91dGluZTsKICAoKHdpbmVfY2xlYW51cClidWZmZXIpLT5hcmcgPSBhcmc7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3Aoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsIGludCBleGVjdXRlKQp7CiAgaWYgKGV4ZWN1dGUpICgqKCgod2luZV9jbGVhbnVwKWJ1ZmZlciktPnJvdXRpbmUpKSgoKHdpbmVfY2xlYW51cClidWZmZXIpLT5hcmcpOwp9Cgp2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlcihzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKiksIHZvaWQgKmFyZykKewogIF9wdGhyZWFkX2NsZWFudXBfcHVzaChidWZmZXIsIHJvdXRpbmUsIGFyZyk7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZShzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgaW50IGV4ZWN1dGUpCnsKICBfcHRocmVhZF9jbGVhbnVwX3BvcChidWZmZXIsIGV4ZWN1dGUpOwp9Cgp2b2lkIF9fcHRocmVhZF9jbGVhbnVwX3VwdG8oam1wX2J1ZiB0YXJnZXQsIGNoYXIgKmZyYW1lKQp7CiAgICAvKiBGSVhNRSAqLwp9CgovKioqKiogQ09ORElUSU9OUyAqKioqKi8KCmludCBfX3B0aHJlYWRfY29uZF9pbml0KHB0aHJlYWRfY29uZF90ICpjb25kLCBjb25zdCBwdGhyZWFkX2NvbmRhdHRyX3QgKmNvbmRfYXR0cikKewogICAgaWYgKCFmdW5jcy5wdHJfcHRocmVhZF9jb25kX2luaXQpIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfaW5pdChjb25kLCBjb25kX2F0dHIpOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF9pbml0LCBwdGhyZWFkX2NvbmRfaW5pdCk7CgppbnQgX19wdGhyZWFkX2NvbmRfZGVzdHJveShwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogICAgaWYgKCFmdW5jcy5wdHJfcHRocmVhZF9jb25kX2Rlc3Ryb3kpIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfZGVzdHJveShjb25kKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2NvbmRfZGVzdHJveSwgcHRocmVhZF9jb25kX2Rlc3Ryb3kpOwoKaW50IF9fcHRocmVhZF9jb25kX3NpZ25hbChwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogICAgaWYgKCFmdW5jcy5wdHJfcHRocmVhZF9jb25kX3NpZ25hbCkgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfY29uZF9zaWduYWwoY29uZCk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9jb25kX3NpZ25hbCwgcHRocmVhZF9jb25kX3NpZ25hbCk7CgppbnQgX19wdGhyZWFkX2NvbmRfYnJvYWRjYXN0KHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfYnJvYWRjYXN0KSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9jb25kX2Jyb2FkY2FzdChjb25kKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2NvbmRfYnJvYWRjYXN0LCBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KTsKCmludCBfX3B0aHJlYWRfY29uZF93YWl0KHB0aHJlYWRfY29uZF90ICpjb25kLCBwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfd2FpdCkgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfY29uZF93YWl0KGNvbmQsIG11dGV4KTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2NvbmRfd2FpdCwgcHRocmVhZF9jb25kX3dhaXQpOwoKaW50IF9fcHRocmVhZF9jb25kX3RpbWVkd2FpdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgcHRocmVhZF9tdXRleF90ICptdXRleCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICphYnN0aW1lKQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfdGltZWR3YWl0KSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9jb25kX3RpbWVkd2FpdChjb25kLCBtdXRleCwgYWJzdGltZSk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9jb25kX3RpbWVkd2FpdCwgcHRocmVhZF9jb25kX3RpbWVkd2FpdCk7CgovKioqKiBDT05ESVRJT04gQVRUUklCVVRFUyAqKioqKi8KLyogbm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdyAqLwoKaW50IHB0aHJlYWRfY29uZGF0dHJfaW5pdChwdGhyZWFkX2NvbmRhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfY29uZGF0dHJfZGVzdHJveShwdGhyZWFkX2NvbmRhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQoKLyoqKioqIFJFQUQtV1JJVEUgTE9DS1MgKioqKiovCgppbnQgX19wdGhyZWFkX3J3bG9ja19pbml0KHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaywgY29uc3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKnJ3bG9ja19hdHRyKQp7CiAgICBhc3NlcnQoIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja19pbml0ICk7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX2luaXQoIHJ3bG9jaywgcndsb2NrX2F0dHIgKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja19pbml0LCBwdGhyZWFkX3J3bG9ja19pbml0KTsKCmludCBfX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3kocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgICBhc3NlcnQoIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja19kZXN0cm95ICk7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3koIHJ3bG9jayApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3ksIHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3kpOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfcmRsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogICAgaWYgKCFmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfcmRsb2NrKSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfcmRsb2NrKCByd2xvY2sgKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja19yZGxvY2ssIHB0aHJlYWRfcndsb2NrX3JkbG9jayk7CgppbnQgX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgICBhc3NlcnQoIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja190cnlyZGxvY2sgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKCByd2xvY2sgKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2ssIHB0aHJlYWRfcndsb2NrX3RyeXJkbG9jayk7CgppbnQgX19wdGhyZWFkX3J3bG9ja193cmxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgICBhc3NlcnQoIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja193cmxvY2sgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCByd2xvY2sgKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja193cmxvY2ssIHB0aHJlYWRfcndsb2NrX3dybG9jayk7CgppbnQgX19wdGhyZWFkX3J3bG9ja190cnl3cmxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgICBhc3NlcnQoIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja190cnl3cmxvY2sgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKCByd2xvY2sgKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja190cnl3cmxvY2ssIHB0aHJlYWRfcndsb2NrX3RyeXdybG9jayk7CgppbnQgX19wdGhyZWFkX3J3bG9ja191bmxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja191bmxvY2spIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja191bmxvY2soIHJ3bG9jayApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3VubG9jaywgcHRocmVhZF9yd2xvY2tfdW5sb2NrKTsKCi8qKioqIFJFQUQtV1JJVEUgTE9DSyBBVFRSSUJVVEVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgppbnQgcHRocmVhZF9yd2xvY2thdHRyX2luaXQocHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQoKaW50IF9fcHRocmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3kocHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja2F0dHJfZGVzdHJveSwgcHRocmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3kpOwoKaW50IHB0aHJlYWRfcndsb2NrYXR0cl9nZXRraW5kX25wKGNvbnN0IHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyLCBpbnQgKnByZWYpCnsKICAqcHJlZiA9IDA7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX3J3bG9ja2F0dHJfc2V0a2luZF9ucChwdGhyZWFkX3J3bG9ja2F0dHJfdCAqYXR0ciwgaW50IHByZWYpCnsKICByZXR1cm4gMDsKfQoKLyoqKioqIE1JU0MgKioqKiovCgpwdGhyZWFkX3QgcHRocmVhZF9zZWxmKHZvaWQpCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfc2VsZiApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX3NlbGYoKTsKfQoKaW50IHB0aHJlYWRfZXF1YWwocHRocmVhZF90IHRocmVhZDEsIHB0aHJlYWRfdCB0aHJlYWQyKQp7CiAgICBhc3NlcnQoIGZ1bmNzLnB0cl9wdGhyZWFkX2VxdWFsICk7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfZXF1YWwoIHRocmVhZDEsIHRocmVhZDIgKTsKfQoKdm9pZCBfX3B0aHJlYWRfZG9fZXhpdCh2b2lkICpyZXR2YWwsIGNoYXIgKmN1cnJlbnRmcmFtZSkKewogICAgYXNzZXJ0KCBmdW5jcy5wdHJfcHRocmVhZF9leGl0ICk7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfZXhpdCggcmV0dmFsLCBjdXJyZW50ZnJhbWUgKTsKfQoKdm9pZCBfX3B0aHJlYWRfZXhpdCh2b2lkICpyZXR2YWwpCnsKICAgIF9fcHRocmVhZF9kb19leGl0KCByZXR2YWwsIE5VTEwgKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2V4aXQsIHB0aHJlYWRfZXhpdCk7CgppbnQgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZShpbnQgc3RhdGUsIGludCAqb2xkc3RhdGUpCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIGlmIChvbGRzdGF0ZSkgKm9sZHN0YXRlID0gZGVzY3ItPmNhbmNlbF9zdGF0ZTsKICAgIGRlc2NyLT5jYW5jZWxfc3RhdGUgPSBzdGF0ZTsKICAgIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9zZXRjYW5jZWx0eXBlKGludCB0eXBlLCBpbnQgKm9sZHR5cGUpCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIGlmIChvbGR0eXBlKSAqb2xkdHlwZSA9IGRlc2NyLT5jYW5jZWxfdHlwZTsKICAgIGRlc2NyLT5jYW5jZWxfdHlwZSA9IHR5cGU7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqIEFOVEktT1ZFUlJJREVTICoqKioqLwovKiBwdGhyZWFkcyB0cmllcyB0byBvdmVycmlkZSB0aGVzZSwgcG9pbnQgdGhlbSBiYWNrIHRvIGxpYmMgKi8KCmludCBzaWdhY3Rpb24oaW50IHNpZ251bSwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqYWN0LCBzdHJ1Y3Qgc2lnYWN0aW9uICpvbGRhY3QpCnsKICAgIGlmICghbGliY19zaWdhY3Rpb24pCiAgICB7CiAgICAgICAgbGliY19zaWdhY3Rpb24gPSB3aW5lX2Rsc3ltKCBSVExEX05FWFQsICJzaWdhY3Rpb24iLCBOVUxMLCAwICk7CiAgICAgICAgYXNzZXJ0KCBsaWJjX3NpZ2FjdGlvbiApOwogICAgfQogICAgcmV0dXJuIGxpYmNfc2lnYWN0aW9uKHNpZ251bSwgYWN0LCBvbGRhY3QpOwp9Cgp2b2lkIF9fcHRocmVhZF9pbml0aWFsaXplKHZvaWQpCnsKICAgIHN0YXRpYyBpbnQgZG9uZTsKCiAgICBpZiAoIWRvbmUpCiAgICB7CiAgICAgICAgZG9uZSA9IDE7CiAgICAgICAgbGliY19mb3JrID0gd2luZV9kbHN5bSggUlRMRF9ORVhULCAiZm9yayIsIE5VTEwsIDAgKTsKICAgICAgICBsaWJjX3NpZ2FjdGlvbiA9IHdpbmVfZGxzeW0oIFJUTERfTkVYVCwgInNpZ2FjdGlvbiIsIE5VTEwsIDAgKTsKICAgICAgICBsaWJjX3VzZWxvY2FsZSA9IHdpbmVfZGxzeW0oIFJUTERfREVGQVVMVCwgInVzZWxvY2FsZSIsIE5VTEwsIDAgKTsKICAgICAgICBsaWJjX3B0aHJlYWRfaW5pdCA9IHdpbmVfZGxzeW0oIFJUTERfTkVYVCwgIl9fbGliY19wdGhyZWFkX2luaXQiLCBOVUxMLCAwICk7CiAgICAgICAgaWYgKGxpYmNfcHRocmVhZF9pbml0KSBsaWJjX211bHRpcGxlX3RocmVhZHMgPSBsaWJjX3B0aHJlYWRfaW5pdCggJmxpYmNfcHRocmVhZF9mdW5jdGlvbnMgKTsKICAgIH0KfQpERUNMX0dMT0JBTF9DT05TVFJVQ1RPUihpbml0KSB7IF9fcHRocmVhZF9pbml0aWFsaXplKCk7IH0KCnN0YXRpYyBzdHJ1Y3QgcHRocmVhZF9mdW5jdGlvbnMgbGliY19wdGhyZWFkX2Z1bmN0aW9ucyA9CnsKICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9mb3JrICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9kZXN0cm95ICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX19fcHRocmVhZF9hdHRyX2luaXRfMl8wICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX19fcHRocmVhZF9hdHRyX2luaXRfMl8xICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9nZXRkZXRhY2hzdGF0ZSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX2dldGluaGVyaXRzY2hlZCAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfc2V0aW5oZXJpdHNjaGVkICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9nZXRzY2hlZHBhcmFtICovCiAgICBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSwgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9nZXRzY2hlZHBvbGljeSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX2dldHNjb3BlICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9zZXRzY29wZSAqLwogICAgcHRocmVhZF9jb25kYXR0cl9kZXN0cm95LCAgICAgIC8qIHB0cl9wdGhyZWFkX2NvbmRhdHRyX2Rlc3Ryb3kgKi8KICAgIHB0aHJlYWRfY29uZGF0dHJfaW5pdCwgICAgICAgICAvKiBwdHJfcHRocmVhZF9jb25kYXR0cl9pbml0ICovCiAgICBfX3B0aHJlYWRfY29uZF9icm9hZGNhc3QsICAgICAgLyogcHRyX19fcHRocmVhZF9jb25kX2Jyb2FkY2FzdCAqLwogICAgX19wdGhyZWFkX2NvbmRfZGVzdHJveSwgICAgICAgIC8qIHB0cl9fX3B0aHJlYWRfY29uZF9kZXN0cm95ICovCiAgICBfX3B0aHJlYWRfY29uZF9pbml0LCAgICAgICAgICAgLyogcHRyX19fcHRocmVhZF9jb25kX2luaXQgKi8KICAgIF9fcHRocmVhZF9jb25kX3NpZ25hbCwgICAgICAgICAvKiBwdHJfX19wdGhyZWFkX2NvbmRfc2lnbmFsICovCiAgICBfX3B0aHJlYWRfY29uZF93YWl0LCAgICAgICAgICAgLyogcHRyX19fcHRocmVhZF9jb25kX3dhaXQgKi8KICAgIHB0aHJlYWRfZXF1YWwsICAgICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9lcXVhbCAqLwogICAgX19wdGhyZWFkX2V4aXQsICAgICAgICAgICAgICAgIC8qIHB0cl9fX3B0aHJlYWRfZXhpdCAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2dldHNjaGVkcGFyYW0gKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9zZXRzY2hlZHBhcmFtICovCiAgICBfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSwgICAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSAqLwogICAgX19wdGhyZWFkX211dGV4X2luaXQsICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X2luaXQgKi8KICAgIF9fcHRocmVhZF9tdXRleF9sb2NrLCAgICAgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF9sb2NrICovCiAgICBfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaywgICAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayAqLwogICAgX19wdGhyZWFkX211dGV4X3VubG9jaywgICAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X3VubG9jayAqLwogICAgcHRocmVhZF9zZWxmLCAgICAgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3NlbGYgKi8KICAgIHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUsICAgICAgICAvKiBwdHJfcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSAqLwogICAgcHRocmVhZF9zZXRjYW5jZWx0eXBlLCAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3NldGNhbmNlbHR5cGUgKi8KICAgIF9fcHRocmVhZF9kb19leGl0LCAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9kb19leGl0ICovCiAgICBfX3B0aHJlYWRfY2xlYW51cF91cHRvLCAgICAgICAgLyogcHRyX3B0aHJlYWRfY2xlYW51cF91cHRvICovCiAgICBfX3B0aHJlYWRfdGhyZWFkX3NlbGYsICAgICAgICAgLyogcHRyX3B0aHJlYWRfdGhyZWFkX3NlbGYgKi8KICAgIHB0aHJlYWRfaW50ZXJuYWxfdHNkX3NldCwgICAgICAvKiBwdHJfcHRocmVhZF9pbnRlcm5hbF90c2Rfc2V0ICovCiAgICBwdGhyZWFkX2ludGVybmFsX3RzZF9nZXQsICAgICAgLyogcHRyX3B0aHJlYWRfaW50ZXJuYWxfdHNkX2dldCAqLwogICAgcHRocmVhZF9pbnRlcm5hbF90c2RfYWRkcmVzcywgIC8qIHB0cl9wdGhyZWFkX2ludGVybmFsX3RzZF9hZGRyZXNzICovCiAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfc2lnYWN0aW9uICovCiAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfc2lnd2FpdCAqLwogICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3JhaXNlICovCiAgICBfX3B0aHJlYWRfY29uZF90aW1lZHdhaXQsICAgICAgLyogcHRyX19fcHRocmVhZF9jb25kX3RpbWVkd2FpdCAqLwogICAgX3B0aHJlYWRfY2xlYW51cF9wdXNoLCAgICAgICAgIC8qIHB0cl9fcHRocmVhZF9jbGVhbnVwX3B1c2ggKi8KICAgIF9wdGhyZWFkX2NsZWFudXBfcG9wICAgICAgICAgICAvKiBwdHJfX3B0aHJlYWRfY2xlYW51cF9wb3AgKi8KfTsKCiNlbmRpZiAvKiBIQVZFX1BUSFJFQURfSCAmJiAoX19HTElCQ19fIHx8IF9fRlJFRUJTRF9fKSAqLwo=