LyoKICogUUVNVSBGbG9wcHkgZGlzayBlbXVsYXRvciAoSW50ZWwgODIwNzgpCiAqCiAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBKb2NlbHluIE1heWVyCiAqIENvcHlyaWdodCAoYykgMjAwOCBIZXJ26SBQb3Vzc2luZWF1CiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwogKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwogKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgogKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KICogVEhFIFNPRlRXQVJFLgogKi8KLyoKICogVGhlIGNvbnRyb2xsZXIgaXMgdXNlZCBpbiBTdW40bSBzeXN0ZW1zIGluIGEgc2xpZ2h0bHkgZGlmZmVyZW50CiAqIHdheS4gVGhlcmUgYXJlIGNoYW5nZXMgaW4gRE9SIHJlZ2lzdGVyIGFuZCBETUEgaXMgbm90IGF2YWlsYWJsZS4KICovCgojaW5jbHVkZSAiaHcuaCIKI2luY2x1ZGUgImZkYy5oIgojaW5jbHVkZSAiYmxvY2suaCIKI2luY2x1ZGUgInFlbXUtdGltZXIuaCIKI2luY2x1ZGUgImlzYS5oIgojaW5jbHVkZSAic3lzYnVzLmgiCiNpbmNsdWRlICJxZGV2LWFkZHIuaCIKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogZGVidWcgRmxvcHB5IGRldmljZXMgKi8KLy8jZGVmaW5lIERFQlVHX0ZMT1BQWQoKI2lmZGVmIERFQlVHX0ZMT1BQWQojZGVmaW5lIEZMT1BQWV9EUFJJTlRGKGZtdCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgZG8geyBwcmludGYoIkZMT1BQWTogIiBmbXQgLCAjIyBfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCiNlbHNlCiNkZWZpbmUgRkxPUFBZX0RQUklOVEYoZm10LCAuLi4pCiNlbmRpZgoKI2RlZmluZSBGTE9QUFlfRVJST1IoZm10LCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgZG8geyBwcmludGYoIkZMT1BQWSBFUlJPUjogJXM6ICIgZm10LCBfX2Z1bmNfXyAsICMjIF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogRmxvcHB5IGRyaXZlIGVtdWxhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2RlZmluZSBHRVRfQ1VSX0RSVihmZGN0cmwpICgoZmRjdHJsKS0+Y3VyX2RydikKI2RlZmluZSBTRVRfQ1VSX0RSVihmZGN0cmwsIGRyaXZlKSAoKGZkY3RybCktPmN1cl9kcnYgPSAoZHJpdmUpKQoKLyogV2lsbCBhbHdheXMgYmUgYSBmaXhlZCBwYXJhbWV0ZXIgZm9yIHVzICovCiNkZWZpbmUgRkRfU0VDVE9SX0xFTiAgICAgICAgICA1MTIKI2RlZmluZSBGRF9TRUNUT1JfU0MgICAgICAgICAgIDIgICAvKiBTZWN0b3Igc2l6ZSBjb2RlICovCiNkZWZpbmUgRkRfUkVTRVRfU0VOU0VJX0NPVU5UICA0ICAgLyogTnVtYmVyIG9mIHNlbnNlIGludGVycnVwdHMgb24gUkVTRVQgKi8KCi8qIEZsb3BweSBkaXNrIGRyaXZlIGVtdWxhdGlvbiAqLwp0eXBlZGVmIGVudW0gZmRpc2tfdHlwZV90IHsKICAgIEZEUklWRV9ESVNLXzI4OCAgID0gMHgwMSwgLyogMi44OCBNQiBkaXNrICAgICAgICAgICAqLwogICAgRkRSSVZFX0RJU0tfMTQ0ICAgPSAweDAyLCAvKiAxLjQ0IE1CIGRpc2sgICAgICAgICAgICovCiAgICBGRFJJVkVfRElTS183MjAgICA9IDB4MDMsIC8qIDcyMCBrQiBkaXNrICAgICAgICAgICAgKi8KICAgIEZEUklWRV9ESVNLX1VTRVIgID0gMHgwNCwgLyogVXNlciBkZWZpbmVkIGdlb21ldHJ5ICAqLwogICAgRkRSSVZFX0RJU0tfTk9ORSAgPSAweDA1LCAvKiBObyBkaXNrICAgICAgICAgICAgICAgICovCn0gZmRpc2tfdHlwZV90OwoKdHlwZWRlZiBlbnVtIGZkcml2ZV90eXBlX3QgewogICAgRkRSSVZFX0RSVl8xNDQgID0gMHgwMCwgICAvKiAxLjQ0IE1CIDMiNSBkcml2ZSAgICAgICovCiAgICBGRFJJVkVfRFJWXzI4OCAgPSAweDAxLCAgIC8qIDIuODggTUIgMyI1IGRyaXZlICAgICAgKi8KICAgIEZEUklWRV9EUlZfMTIwICA9IDB4MDIsICAgLyogMS4yICBNQiA1IjI1IGRyaXZlICAgICAqLwogICAgRkRSSVZFX0RSVl9OT05FID0gMHgwMywgICAvKiBObyBkcml2ZSBjb25uZWN0ZWQgICAgICovCn0gZmRyaXZlX3R5cGVfdDsKCnR5cGVkZWYgZW51bSBmZGlza19mbGFnc190IHsKICAgIEZESVNLX0RCTF9TSURFUyAgPSAweDAxLAp9IGZkaXNrX2ZsYWdzX3Q7Cgp0eXBlZGVmIHN0cnVjdCBmZHJpdmVfdCB7CiAgICBCbG9ja0RyaXZlclN0YXRlICpiczsKICAgIC8qIERyaXZlIHN0YXR1cyAqLwogICAgZmRyaXZlX3R5cGVfdCBkcml2ZTsKICAgIHVpbnQ4X3QgcGVycGVuZGljdWxhcjsgICAgLyogMi44OCBNQiBhY2Nlc3MgbW9kZSAgICAqLwogICAgLyogUG9zaXRpb24gKi8KICAgIHVpbnQ4X3QgaGVhZDsKICAgIHVpbnQ4X3QgdHJhY2s7CiAgICB1aW50OF90IHNlY3Q7CiAgICAvKiBNZWRpYSAqLwogICAgZmRpc2tfZmxhZ3NfdCBmbGFnczsKICAgIHVpbnQ4X3QgbGFzdF9zZWN0OyAgICAgICAgLyogTmIgc2VjdG9yIHBlciB0cmFjayAgICAqLwogICAgdWludDhfdCBtYXhfdHJhY2s7ICAgICAgICAvKiBOYiBvZiB0cmFja3MgICAgICAgICAgICovCiAgICB1aW50MTZfdCBicHM7ICAgICAgICAgICAgIC8qIEJ5dGVzIHBlciBzZWN0b3IgICAgICAgKi8KICAgIHVpbnQ4X3Qgcm87ICAgICAgICAgICAgICAgLyogSXMgcmVhZC1vbmx5ICAgICAgICAgICAqLwp9IGZkcml2ZV90OwoKc3RhdGljIHZvaWQgZmRfaW5pdCAoZmRyaXZlX3QgKmRydiwgQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCnsKICAgIC8qIERyaXZlICovCiAgICBkcnYtPmJzID0gYnM7CiAgICBkcnYtPmRyaXZlID0gRkRSSVZFX0RSVl9OT05FOwogICAgZHJ2LT5wZXJwZW5kaWN1bGFyID0gMDsKICAgIC8qIERpc2sgKi8KICAgIGRydi0+bGFzdF9zZWN0ID0gMDsKICAgIGRydi0+bWF4X3RyYWNrID0gMDsKfQoKc3RhdGljIGludCBfZmRfc2VjdG9yICh1aW50OF90IGhlYWQsIHVpbnQ4X3QgdHJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZWN0LCB1aW50OF90IGxhc3Rfc2VjdCkKewogICAgcmV0dXJuICgoKHRyYWNrICogMikgKyBoZWFkKSAqIGxhc3Rfc2VjdCkgKyBzZWN0IC0gMTsKfQoKLyogUmV0dXJucyBjdXJyZW50IHBvc2l0aW9uLCBpbiBzZWN0b3JzLCBmb3IgZ2l2ZW4gZHJpdmUgKi8Kc3RhdGljIGludCBmZF9zZWN0b3IgKGZkcml2ZV90ICpkcnYpCnsKICAgIHJldHVybiBfZmRfc2VjdG9yKGRydi0+aGVhZCwgZHJ2LT50cmFjaywgZHJ2LT5zZWN0LCBkcnYtPmxhc3Rfc2VjdCk7Cn0KCi8qIFNlZWsgdG8gYSBuZXcgcG9zaXRpb246CiAqIHJldHVybnMgMCBpZiBhbHJlYWR5IG9uIHJpZ2h0IHRyYWNrCiAqIHJldHVybnMgMSBpZiB0cmFjayBjaGFuZ2VkCiAqIHJldHVybnMgMiBpZiB0cmFjayBpcyBpbnZhbGlkCiAqIHJldHVybnMgMyBpZiBzZWN0b3IgaXMgaW52YWxpZAogKiByZXR1cm5zIDQgaWYgc2VlayBpcyBkaXNhYmxlZAogKi8Kc3RhdGljIGludCBmZF9zZWVrIChmZHJpdmVfdCAqZHJ2LCB1aW50OF90IGhlYWQsIHVpbnQ4X3QgdHJhY2ssIHVpbnQ4X3Qgc2VjdCwKICAgICAgICAgICAgICAgICAgICBpbnQgZW5hYmxlX3NlZWspCnsKICAgIHVpbnQzMl90IHNlY3RvcjsKICAgIGludCByZXQ7CgogICAgaWYgKHRyYWNrID4gZHJ2LT5tYXhfdHJhY2sgfHwKICAgICAgICAoaGVhZCAhPSAwICYmIChkcnYtPmZsYWdzICYgRkRJU0tfREJMX1NJREVTKSA9PSAwKSkgewogICAgICAgIEZMT1BQWV9EUFJJTlRGKCJ0cnkgdG8gcmVhZCAlZCAlMDJ4ICUwMnggKG1heD0lZCAlZCAlMDJ4ICUwMngpXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGhlYWQsIHRyYWNrLCBzZWN0LCAxLAogICAgICAgICAgICAgICAgICAgICAgIChkcnYtPmZsYWdzICYgRkRJU0tfREJMX1NJREVTKSA9PSAwID8gMCA6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgZHJ2LT5tYXhfdHJhY2ssIGRydi0+bGFzdF9zZWN0KTsKICAgICAgICByZXR1cm4gMjsKICAgIH0KICAgIGlmIChzZWN0ID4gZHJ2LT5sYXN0X3NlY3QpIHsKICAgICAgICBGTE9QUFlfRFBSSU5URigidHJ5IHRvIHJlYWQgJWQgJTAyeCAlMDJ4IChtYXg9JWQgJWQgJTAyeCAlMDJ4KVxuIiwKICAgICAgICAgICAgICAgICAgICAgICBoZWFkLCB0cmFjaywgc2VjdCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAoZHJ2LT5mbGFncyAmIEZESVNLX0RCTF9TSURFUykgPT0gMCA/IDAgOiAxLAogICAgICAgICAgICAgICAgICAgICAgIGRydi0+bWF4X3RyYWNrLCBkcnYtPmxhc3Rfc2VjdCk7CiAgICAgICAgcmV0dXJuIDM7CiAgICB9CiAgICBzZWN0b3IgPSBfZmRfc2VjdG9yKGhlYWQsIHRyYWNrLCBzZWN0LCBkcnYtPmxhc3Rfc2VjdCk7CiAgICByZXQgPSAwOwogICAgaWYgKHNlY3RvciAhPSBmZF9zZWN0b3IoZHJ2KSkgewojaWYgMAogICAgICAgIGlmICghZW5hYmxlX3NlZWspIHsKICAgICAgICAgICAgRkxPUFBZX0VSUk9SKCJubyBpbXBsaWNpdCBzZWVrICVkICUwMnggJTAyeCAobWF4PSVkICUwMnggJTAyeClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkLCB0cmFjaywgc2VjdCwgMSwgZHJ2LT5tYXhfdHJhY2ssIGRydi0+bGFzdF9zZWN0KTsKICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgfQojZW5kaWYKICAgICAgICBkcnYtPmhlYWQgPSBoZWFkOwogICAgICAgIGlmIChkcnYtPnRyYWNrICE9IHRyYWNrKQogICAgICAgICAgICByZXQgPSAxOwogICAgICAgIGRydi0+dHJhY2sgPSB0cmFjazsKICAgICAgICBkcnYtPnNlY3QgPSBzZWN0OwogICAgfQoKICAgIHJldHVybiByZXQ7Cn0KCi8qIFNldCBkcml2ZSBiYWNrIHRvIHRyYWNrIDAgKi8Kc3RhdGljIHZvaWQgZmRfcmVjYWxpYnJhdGUgKGZkcml2ZV90ICpkcnYpCnsKICAgIEZMT1BQWV9EUFJJTlRGKCJyZWNhbGlicmF0ZVxuIik7CiAgICBkcnYtPmhlYWQgPSAwOwogICAgZHJ2LT50cmFjayA9IDA7CiAgICBkcnYtPnNlY3QgPSAxOwp9CgovKiBSZWNvZ25pemUgZmxvcHB5IGZvcm1hdHMgKi8KdHlwZWRlZiBzdHJ1Y3QgZmRfZm9ybWF0X3QgewogICAgZmRyaXZlX3R5cGVfdCBkcml2ZTsKICAgIGZkaXNrX3R5cGVfdCAgZGlzazsKICAgIHVpbnQ4X3QgbGFzdF9zZWN0OwogICAgdWludDhfdCBtYXhfdHJhY2s7CiAgICB1aW50OF90IG1heF9oZWFkOwogICAgY29uc3QgY2hhciAqc3RyOwp9IGZkX2Zvcm1hdF90OwoKc3RhdGljIGNvbnN0IGZkX2Zvcm1hdF90IGZkX2Zvcm1hdHNbXSA9IHsKICAgIC8qIEZpcnN0IGVudHJ5IGlzIGRlZmF1bHQgZm9ybWF0ICovCiAgICAvKiAxLjQ0IE1CIDMiMS8yIGZsb3BweSBkaXNrcyAqLwogICAgeyBGRFJJVkVfRFJWXzE0NCwgRkRSSVZFX0RJU0tfMTQ0LCAxOCwgODAsIDEsICIxLjQ0IE1CIDNcIjEvMiIsIH0sCiAgICB7IEZEUklWRV9EUlZfMTQ0LCBGRFJJVkVfRElTS18xNDQsIDIwLCA4MCwgMSwgICIxLjYgTUIgM1wiMS8yIiwgfSwKICAgIHsgRkRSSVZFX0RSVl8xNDQsIEZEUklWRV9ESVNLXzE0NCwgMjEsIDgwLCAxLCAiMS42OCBNQiAzXCIxLzIiLCB9LAogICAgeyBGRFJJVkVfRFJWXzE0NCwgRkRSSVZFX0RJU0tfMTQ0LCAyMSwgODIsIDEsICIxLjcyIE1CIDNcIjEvMiIsIH0sCiAgICB7IEZEUklWRV9EUlZfMTQ0LCBGRFJJVkVfRElTS18xNDQsIDIxLCA4MywgMSwgIjEuNzQgTUIgM1wiMS8yIiwgfSwKICAgIHsgRkRSSVZFX0RSVl8xNDQsIEZEUklWRV9ESVNLXzE0NCwgMjIsIDgwLCAxLCAiMS43NiBNQiAzXCIxLzIiLCB9LAogICAgeyBGRFJJVkVfRFJWXzE0NCwgRkRSSVZFX0RJU0tfMTQ0LCAyMywgODAsIDEsICIxLjg0IE1CIDNcIjEvMiIsIH0sCiAgICB7IEZEUklWRV9EUlZfMTQ0LCBGRFJJVkVfRElTS18xNDQsIDI0LCA4MCwgMSwgIjEuOTIgTUIgM1wiMS8yIiwgfSwKICAgIC8qIDIuODggTUIgMyIxLzIgZmxvcHB5IGRpc2tzICovCiAgICB7IEZEUklWRV9EUlZfMjg4LCBGRFJJVkVfRElTS18yODgsIDM2LCA4MCwgMSwgIjIuODggTUIgM1wiMS8yIiwgfSwKICAgIHsgRkRSSVZFX0RSVl8yODgsIEZEUklWRV9ESVNLXzI4OCwgMzksIDgwLCAxLCAiMy4xMiBNQiAzXCIxLzIiLCB9LAogICAgeyBGRFJJVkVfRFJWXzI4OCwgRkRSSVZFX0RJU0tfMjg4LCA0MCwgODAsIDEsICAiMy4yIE1CIDNcIjEvMiIsIH0sCiAgICB7IEZEUklWRV9EUlZfMjg4LCBGRFJJVkVfRElTS18yODgsIDQ0LCA4MCwgMSwgIjMuNTIgTUIgM1wiMS8yIiwgfSwKICAgIHsgRkRSSVZFX0RSVl8yODgsIEZEUklWRV9ESVNLXzI4OCwgNDgsIDgwLCAxLCAiMy44NCBNQiAzXCIxLzIiLCB9LAogICAgLyogNzIwIGtCIDMiMS8yIGZsb3BweSBkaXNrcyAqLwogICAgeyBGRFJJVkVfRFJWXzE0NCwgRkRSSVZFX0RJU0tfNzIwLCAgOSwgODAsIDEsICAiNzIwIGtCIDNcIjEvMiIsIH0sCiAgICB7IEZEUklWRV9EUlZfMTQ0LCBGRFJJVkVfRElTS183MjAsIDEwLCA4MCwgMSwgICI4MDAga0IgM1wiMS8yIiwgfSwKICAgIHsgRkRSSVZFX0RSVl8xNDQsIEZEUklWRV9ESVNLXzcyMCwgMTAsIDgyLCAxLCAgIjgyMCBrQiAzXCIxLzIiLCB9LAogICAgeyBGRFJJVkVfRFJWXzE0NCwgRkRSSVZFX0RJU0tfNzIwLCAxMCwgODMsIDEsICAiODMwIGtCIDNcIjEvMiIsIH0sCiAgICB7IEZEUklWRV9EUlZfMTQ0LCBGRFJJVkVfRElTS183MjAsIDEzLCA4MCwgMSwgIjEuMDQgTUIgM1wiMS8yIiwgfSwKICAgIHsgRkRSSVZFX0RSVl8xNDQsIEZEUklWRV9ESVNLXzcyMCwgMTQsIDgwLCAxLCAiMS4xMiBNQiAzXCIxLzIiLCB9LAogICAgLyogMS4yIE1CIDUiMS80IGZsb3BweSBkaXNrcyAqLwogICAgeyBGRFJJVkVfRFJWXzEyMCwgRkRSSVZFX0RJU0tfMjg4LCAxNSwgODAsIDEsICAiMS4yIGtCIDVcIjEvNCIsIH0sCiAgICB7IEZEUklWRV9EUlZfMTIwLCBGRFJJVkVfRElTS18yODgsIDE4LCA4MCwgMSwgIjEuNDQgTUIgNVwiMS80IiwgfSwKICAgIHsgRkRSSVZFX0RSVl8xMjAsIEZEUklWRV9ESVNLXzI4OCwgMTgsIDgyLCAxLCAiMS40OCBNQiA1XCIxLzQiLCB9LAogICAgeyBGRFJJVkVfRFJWXzEyMCwgRkRSSVZFX0RJU0tfMjg4LCAxOCwgODMsIDEsICIxLjQ5IE1CIDVcIjEvNCIsIH0sCiAgICB7IEZEUklWRV9EUlZfMTIwLCBGRFJJVkVfRElTS18yODgsIDIwLCA4MCwgMSwgICIxLjYgTUIgNVwiMS80IiwgfSwKICAgIC8qIDcyMCBrQiA1IjEvNCBmbG9wcHkgZGlza3MgKi8KICAgIHsgRkRSSVZFX0RSVl8xMjAsIEZEUklWRV9ESVNLXzI4OCwgIDksIDgwLCAxLCAgIjcyMCBrQiA1XCIxLzQiLCB9LAogICAgeyBGRFJJVkVfRFJWXzEyMCwgRkRSSVZFX0RJU0tfMjg4LCAxMSwgODAsIDEsICAiODgwIGtCIDVcIjEvNCIsIH0sCiAgICAvKiAzNjAga0IgNSIxLzQgZmxvcHB5IGRpc2tzICovCiAgICB7IEZEUklWRV9EUlZfMTIwLCBGRFJJVkVfRElTS18yODgsICA5LCA0MCwgMSwgICIzNjAga0IgNVwiMS80IiwgfSwKICAgIHsgRkRSSVZFX0RSVl8xMjAsIEZEUklWRV9ESVNLXzI4OCwgIDksIDQwLCAwLCAgIjE4MCBrQiA1XCIxLzQiLCB9LAogICAgeyBGRFJJVkVfRFJWXzEyMCwgRkRSSVZFX0RJU0tfMjg4LCAxMCwgNDEsIDEsICAiNDEwIGtCIDVcIjEvNCIsIH0sCiAgICB7IEZEUklWRV9EUlZfMTIwLCBGRFJJVkVfRElTS18yODgsIDEwLCA0MiwgMSwgICI0MjAga0IgNVwiMS80IiwgfSwKICAgIC8qIDMyMCBrQiA1IjEvNCBmbG9wcHkgZGlza3MgKi8KICAgIHsgRkRSSVZFX0RSVl8xMjAsIEZEUklWRV9ESVNLXzI4OCwgIDgsIDQwLCAxLCAgIjMyMCBrQiA1XCIxLzQiLCB9LAogICAgeyBGRFJJVkVfRFJWXzEyMCwgRkRSSVZFX0RJU0tfMjg4LCAgOCwgNDAsIDAsICAiMTYwIGtCIDVcIjEvNCIsIH0sCiAgICAvKiAzNjAga0IgbXVzdCBtYXRjaCA1IjEvNCBiZXR0ZXIgdGhhbiAzIjEvMi4uLiAqLwogICAgeyBGRFJJVkVfRFJWXzE0NCwgRkRSSVZFX0RJU0tfNzIwLCAgOSwgODAsIDAsICAiMzYwIGtCIDNcIjEvMiIsIH0sCiAgICAvKiBlbmQgKi8KICAgIHsgRkRSSVZFX0RSVl9OT05FLCBGRFJJVkVfRElTS19OT05FLCAtMSwgLTEsIDAsIE5VTEwsIH0sCn07CgovKiBSZXZhbGlkYXRlIGEgZGlzayBkcml2ZSBhZnRlciBhIGRpc2sgY2hhbmdlICovCnN0YXRpYyB2b2lkIGZkX3JldmFsaWRhdGUgKGZkcml2ZV90ICpkcnYpCnsKICAgIGNvbnN0IGZkX2Zvcm1hdF90ICpwYXJzZTsKICAgIHVpbnQ2NF90IG5iX3NlY3RvcnMsIHNpemU7CiAgICBpbnQgaSwgZmlyc3RfbWF0Y2gsIG1hdGNoOwogICAgaW50IG5iX2hlYWRzLCBtYXhfdHJhY2ssIGxhc3Rfc2VjdCwgcm87CgogICAgRkxPUFBZX0RQUklOVEYoInJldmFsaWRhdGVcbiIpOwogICAgaWYgKGRydi0+YnMgIT0gTlVMTCAmJiBiZHJ2X2lzX2luc2VydGVkKGRydi0+YnMpKSB7CiAgICAgICAgcm8gPSBiZHJ2X2lzX3JlYWRfb25seShkcnYtPmJzKTsKICAgICAgICBiZHJ2X2dldF9nZW9tZXRyeV9oaW50KGRydi0+YnMsICZuYl9oZWFkcywgJm1heF90cmFjaywgJmxhc3Rfc2VjdCk7CiAgICAgICAgaWYgKG5iX2hlYWRzICE9IDAgJiYgbWF4X3RyYWNrICE9IDAgJiYgbGFzdF9zZWN0ICE9IDApIHsKICAgICAgICAgICAgRkxPUFBZX0RQUklOVEYoIlVzZXIgZGVmaW5lZCBkaXNrICglZCAlZCAlZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9oZWFkcyAtIDEsIG1heF90cmFjaywgbGFzdF9zZWN0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBiZHJ2X2dldF9nZW9tZXRyeShkcnYtPmJzLCAmbmJfc2VjdG9ycyk7CiAgICAgICAgICAgIG1hdGNoID0gLTE7CiAgICAgICAgICAgIGZpcnN0X21hdGNoID0gLTE7CiAgICAgICAgICAgIGZvciAoaSA9IDA7OyBpKyspIHsKICAgICAgICAgICAgICAgIHBhcnNlID0gJmZkX2Zvcm1hdHNbaV07CiAgICAgICAgICAgICAgICBpZiAocGFyc2UtPmRyaXZlID09IEZEUklWRV9EUlZfTk9ORSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGlmIChkcnYtPmRyaXZlID09IHBhcnNlLT5kcml2ZSB8fAogICAgICAgICAgICAgICAgICAgIGRydi0+ZHJpdmUgPT0gRkRSSVZFX0RSVl9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IChwYXJzZS0+bWF4X2hlYWQgKyAxKSAqIHBhcnNlLT5tYXhfdHJhY2sgKgogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZS0+bGFzdF9zZWN0OwogICAgICAgICAgICAgICAgICAgIGlmIChuYl9zZWN0b3JzID09IHNpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0X21hdGNoID09IC0xKQogICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9tYXRjaCA9IGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1hdGNoID09IC0xKSB7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RfbWF0Y2ggPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAxOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmlyc3RfbWF0Y2g7CiAgICAgICAgICAgICAgICBwYXJzZSA9ICZmZF9mb3JtYXRzW21hdGNoXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuYl9oZWFkcyA9IHBhcnNlLT5tYXhfaGVhZCArIDE7CiAgICAgICAgICAgIG1heF90cmFjayA9IHBhcnNlLT5tYXhfdHJhY2s7CiAgICAgICAgICAgIGxhc3Rfc2VjdCA9IHBhcnNlLT5sYXN0X3NlY3Q7CiAgICAgICAgICAgIGRydi0+ZHJpdmUgPSBwYXJzZS0+ZHJpdmU7CiAgICAgICAgICAgIEZMT1BQWV9EUFJJTlRGKCIlcyBmbG9wcHkgZGlzayAoJWQgaCAlZCB0ICVkIHMpICVzXG4iLCBwYXJzZS0+c3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9oZWFkcywgbWF4X3RyYWNrLCBsYXN0X3NlY3QsIHJvID8gInJvIiA6ICJydyIpOwogICAgICAgIH0KICAgICAgICBpZiAobmJfaGVhZHMgPT0gMSkgewogICAgICAgICAgICBkcnYtPmZsYWdzICY9IH5GRElTS19EQkxfU0lERVM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZHJ2LT5mbGFncyB8PSBGRElTS19EQkxfU0lERVM7CiAgICAgICAgfQogICAgICAgIGRydi0+bWF4X3RyYWNrID0gbWF4X3RyYWNrOwogICAgICAgIGRydi0+bGFzdF9zZWN0ID0gbGFzdF9zZWN0OwogICAgICAgIGRydi0+cm8gPSBybzsKICAgIH0gZWxzZSB7CiAgICAgICAgRkxPUFBZX0RQUklOVEYoIk5vIGRpc2sgaW4gZHJpdmVcbiIpOwogICAgICAgIGRydi0+bGFzdF9zZWN0ID0gMDsKICAgICAgICBkcnYtPm1heF90cmFjayA9IDA7CiAgICAgICAgZHJ2LT5mbGFncyAmPSB+RkRJU0tfREJMX1NJREVTOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEludGVsIDgyMDc4IGZsb3BweSBkaXNrIGNvbnRyb2xsZXIgZW11bGF0aW9uICAgICAgICAgICovCgpzdGF0aWMgdm9pZCBmZGN0cmxfcmVzZXQgKGZkY3RybF90ICpmZGN0cmwsIGludCBkb19pcnEpOwpzdGF0aWMgdm9pZCBmZGN0cmxfcmVzZXRfZmlmbyAoZmRjdHJsX3QgKmZkY3RybCk7CnN0YXRpYyBpbnQgZmRjdHJsX3RyYW5zZmVyX2hhbmRsZXIgKHZvaWQgKm9wYXF1ZSwgaW50IG5jaGFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG1hX3BvcywgaW50IGRtYV9sZW4pOwpzdGF0aWMgdm9pZCBmZGN0cmxfcmFpc2VfaXJxIChmZGN0cmxfdCAqZmRjdHJsLCB1aW50OF90IHN0YXR1czApOwoKc3RhdGljIHVpbnQzMl90IGZkY3RybF9yZWFkX3N0YXR1c0EgKGZkY3RybF90ICpmZGN0cmwpOwpzdGF0aWMgdWludDMyX3QgZmRjdHJsX3JlYWRfc3RhdHVzQiAoZmRjdHJsX3QgKmZkY3RybCk7CnN0YXRpYyB1aW50MzJfdCBmZGN0cmxfcmVhZF9kb3IgKGZkY3RybF90ICpmZGN0cmwpOwpzdGF0aWMgdm9pZCBmZGN0cmxfd3JpdGVfZG9yIChmZGN0cmxfdCAqZmRjdHJsLCB1aW50MzJfdCB2YWx1ZSk7CnN0YXRpYyB1aW50MzJfdCBmZGN0cmxfcmVhZF90YXBlIChmZGN0cmxfdCAqZmRjdHJsKTsKc3RhdGljIHZvaWQgZmRjdHJsX3dyaXRlX3RhcGUgKGZkY3RybF90ICpmZGN0cmwsIHVpbnQzMl90IHZhbHVlKTsKc3RhdGljIHVpbnQzMl90IGZkY3RybF9yZWFkX21haW5fc3RhdHVzIChmZGN0cmxfdCAqZmRjdHJsKTsKc3RhdGljIHZvaWQgZmRjdHJsX3dyaXRlX3JhdGUgKGZkY3RybF90ICpmZGN0cmwsIHVpbnQzMl90IHZhbHVlKTsKc3RhdGljIHVpbnQzMl90IGZkY3RybF9yZWFkX2RhdGEgKGZkY3RybF90ICpmZGN0cmwpOwpzdGF0aWMgdm9pZCBmZGN0cmxfd3JpdGVfZGF0YSAoZmRjdHJsX3QgKmZkY3RybCwgdWludDMyX3QgdmFsdWUpOwpzdGF0aWMgdWludDMyX3QgZmRjdHJsX3JlYWRfZGlyIChmZGN0cmxfdCAqZmRjdHJsKTsKCmVudW0gewogICAgRkRfRElSX1dSSVRFICAgPSAwLAogICAgRkRfRElSX1JFQUQgICAgPSAxLAogICAgRkRfRElSX1NDQU5FICAgPSAyLAogICAgRkRfRElSX1NDQU5MICAgPSAzLAogICAgRkRfRElSX1NDQU5IICAgPSA0LAp9OwoKZW51bSB7CiAgICBGRF9TVEFURV9NVUxUSSAgPSAweDAxLAkvKiBtdWx0aSB0cmFjayBmbGFnICovCiAgICBGRF9TVEFURV9GT1JNQVQgPSAweDAyLAkvKiBmb3JtYXQgZmxhZyAqLwogICAgRkRfU1RBVEVfU0VFSyAgID0gMHgwNCwJLyogc2VlayBmbGFnICovCn07CgplbnVtIHsKICAgIEZEX1JFR19TUkEgPSAweDAwLAogICAgRkRfUkVHX1NSQiA9IDB4MDEsCiAgICBGRF9SRUdfRE9SID0gMHgwMiwKICAgIEZEX1JFR19URFIgPSAweDAzLAogICAgRkRfUkVHX01TUiA9IDB4MDQsCiAgICBGRF9SRUdfRFNSID0gMHgwNCwKICAgIEZEX1JFR19GSUZPID0gMHgwNSwKICAgIEZEX1JFR19ESVIgPSAweDA3LAp9OwoKZW51bSB7CiAgICBGRF9DTURfUkVBRF9UUkFDSyA9IDB4MDIsCiAgICBGRF9DTURfU1BFQ0lGWSA9IDB4MDMsCiAgICBGRF9DTURfU0VOU0VfRFJJVkVfU1RBVFVTID0gMHgwNCwKICAgIEZEX0NNRF9XUklURSA9IDB4MDUsCiAgICBGRF9DTURfUkVBRCA9IDB4MDYsCiAgICBGRF9DTURfUkVDQUxJQlJBVEUgPSAweDA3LAogICAgRkRfQ01EX1NFTlNFX0lOVEVSUlVQVF9TVEFUVVMgPSAweDA4LAogICAgRkRfQ01EX1dSSVRFX0RFTEVURUQgPSAweDA5LAogICAgRkRfQ01EX1JFQURfSUQgPSAweDBhLAogICAgRkRfQ01EX1JFQURfREVMRVRFRCA9IDB4MGMsCiAgICBGRF9DTURfRk9STUFUX1RSQUNLID0gMHgwZCwKICAgIEZEX0NNRF9EVU1QUkVHID0gMHgwZSwKICAgIEZEX0NNRF9TRUVLID0gMHgwZiwKICAgIEZEX0NNRF9WRVJTSU9OID0gMHgxMCwKICAgIEZEX0NNRF9TQ0FOX0VRVUFMID0gMHgxMSwKICAgIEZEX0NNRF9QRVJQRU5ESUNVTEFSX01PREUgPSAweDEyLAogICAgRkRfQ01EX0NPTkZJR1VSRSA9IDB4MTMsCiAgICBGRF9DTURfTE9DSyA9IDB4MTQsCiAgICBGRF9DTURfVkVSSUZZID0gMHgxNiwKICAgIEZEX0NNRF9QT1dFUkRPV05fTU9ERSA9IDB4MTcsCiAgICBGRF9DTURfUEFSVF9JRCA9IDB4MTgsCiAgICBGRF9DTURfU0NBTl9MT1dfT1JfRVFVQUwgPSAweDE5LAogICAgRkRfQ01EX1NDQU5fSElHSF9PUl9FUVVBTCA9IDB4MWQsCiAgICBGRF9DTURfU0FWRSA9IDB4MmMsCiAgICBGRF9DTURfT1BUSU9OID0gMHgzMywKICAgIEZEX0NNRF9SRVNUT1JFID0gMHg0YywKICAgIEZEX0NNRF9EUklWRV9TUEVDSUZJQ0FUSU9OX0NPTU1BTkQgPSAweDhlLAogICAgRkRfQ01EX1JFTEFUSVZFX1NFRUtfT1VUID0gMHg4ZiwKICAgIEZEX0NNRF9GT1JNQVRfQU5EX1dSSVRFID0gMHhjZCwKICAgIEZEX0NNRF9SRUxBVElWRV9TRUVLX0lOID0gMHhjZiwKfTsKCmVudW0gewogICAgRkRfQ09ORklHX1BSRVRSSyA9IDB4ZmYsIC8qIFByZS1jb21wZW5zYXRpb24gc2V0IHRvIHRyYWNrIDAgKi8KICAgIEZEX0NPTkZJR19GSUZPVEhSID0gMHgwZiwgLyogRklGTyB0aHJlc2hvbGQgc2V0IHRvIDEgYnl0ZSAqLwogICAgRkRfQ09ORklHX1BPTEwgID0gMHgxMCwgLyogUG9sbCBlbmFibGVkICovCiAgICBGRF9DT05GSUdfRUZJRk8gPSAweDIwLCAvKiBGSUZPIGRpc2FibGVkICovCiAgICBGRF9DT05GSUdfRUlTICAgPSAweDQwLCAvKiBObyBpbXBsaWVkIHNlZWtzICovCn07CgplbnVtIHsKICAgIEZEX1NSMF9FUVBNVCAgICA9IDB4MTAsCiAgICBGRF9TUjBfU0VFSyAgICAgPSAweDIwLAogICAgRkRfU1IwX0FCTlRFUk0gID0gMHg0MCwKICAgIEZEX1NSMF9JTlZDTUQgICA9IDB4ODAsCiAgICBGRF9TUjBfUkRZQ0hHICAgPSAweGMwLAp9OwoKZW51bSB7CiAgICBGRF9TUjFfRUMgICAgICAgPSAweDgwLCAvKiBFbmQgb2YgY3lsaW5kZXIgKi8KfTsKCmVudW0gewogICAgRkRfU1IyX1NOUyAgICAgID0gMHgwNCwgLyogU2NhbiBub3Qgc2F0aXNmaWVkICovCiAgICBGRF9TUjJfU0VIICAgICAgPSAweDA4LCAvKiBTY2FuIGVxdWFsIGhpdCAqLwp9OwoKZW51bSB7CiAgICBGRF9TUkFfRElSICAgICAgPSAweDAxLAogICAgRkRfU1JBX25XUCAgICAgID0gMHgwMiwKICAgIEZEX1NSQV9uSU5EWCAgICA9IDB4MDQsCiAgICBGRF9TUkFfSERTRUwgICAgPSAweDA4LAogICAgRkRfU1JBX25UUkswICAgID0gMHgxMCwKICAgIEZEX1NSQV9TVEVQICAgICA9IDB4MjAsCiAgICBGRF9TUkFfbkRSVjIgICAgPSAweDQwLAogICAgRkRfU1JBX0lOVFBFTkQgID0gMHg4MCwKfTsKCmVudW0gewogICAgRkRfU1JCX01UUjAgICAgID0gMHgwMSwKICAgIEZEX1NSQl9NVFIxICAgICA9IDB4MDIsCiAgICBGRF9TUkJfV0dBVEUgICAgPSAweDA0LAogICAgRkRfU1JCX1JEQVRBICAgID0gMHgwOCwKICAgIEZEX1NSQl9XREFUQSAgICA9IDB4MTAsCiAgICBGRF9TUkJfRFIwICAgICAgPSAweDIwLAp9OwoKZW51bSB7CiNpZiBNQVhfRkQgPT0gNAogICAgRkRfRE9SX1NFTE1BU0sgID0gMHgwMywKI2Vsc2UKICAgIEZEX0RPUl9TRUxNQVNLICA9IDB4MDEsCiNlbmRpZgogICAgRkRfRE9SX25SRVNFVCAgID0gMHgwNCwKICAgIEZEX0RPUl9ETUFFTiAgICA9IDB4MDgsCiAgICBGRF9ET1JfTU9URU4wICAgPSAweDEwLAogICAgRkRfRE9SX01PVEVOMSAgID0gMHgyMCwKICAgIEZEX0RPUl9NT1RFTjIgICA9IDB4NDAsCiAgICBGRF9ET1JfTU9URU4zICAgPSAweDgwLAp9OwoKZW51bSB7CiNpZiBNQVhfRkQgPT0gNAogICAgRkRfVERSX0JPT1RTRUwgID0gMHgwYywKI2Vsc2UKICAgIEZEX1REUl9CT09UU0VMICA9IDB4MDQsCiNlbmRpZgp9OwoKZW51bSB7CiAgICBGRF9EU1JfRFJBVEVNQVNLPSAweDAzLAogICAgRkRfRFNSX1BXUkRPV04gID0gMHg0MCwKICAgIEZEX0RTUl9TV1JFU0VUICA9IDB4ODAsCn07CgplbnVtIHsKICAgIEZEX01TUl9EUlYwQlVTWSA9IDB4MDEsCiAgICBGRF9NU1JfRFJWMUJVU1kgPSAweDAyLAogICAgRkRfTVNSX0RSVjJCVVNZID0gMHgwNCwKICAgIEZEX01TUl9EUlYzQlVTWSA9IDB4MDgsCiAgICBGRF9NU1JfQ01EQlVTWSAgPSAweDEwLAogICAgRkRfTVNSX05PTkRNQSAgID0gMHgyMCwKICAgIEZEX01TUl9ESU8gICAgICA9IDB4NDAsCiAgICBGRF9NU1JfUlFNICAgICAgPSAweDgwLAp9OwoKZW51bSB7CiAgICBGRF9ESVJfRFNLQ0hHICAgPSAweDgwLAp9OwoKI2RlZmluZSBGRF9NVUxUSV9UUkFDSyhzdGF0ZSkgKChzdGF0ZSkgJiBGRF9TVEFURV9NVUxUSSkKI2RlZmluZSBGRF9ESURfU0VFSyhzdGF0ZSkgKChzdGF0ZSkgJiBGRF9TVEFURV9TRUVLKQojZGVmaW5lIEZEX0ZPUk1BVF9DTUQoc3RhdGUpICgoc3RhdGUpICYgRkRfU1RBVEVfRk9STUFUKQoKc3RydWN0IGZkY3RybF90IHsKICAgIFN5c0J1c0RldmljZSBidXNkZXY7CiAgICAvKiBDb250cm9sbGVyJ3MgaWRlbnRpZmljYXRpb24gKi8KICAgIHVpbnQ4X3QgdmVyc2lvbjsKICAgIC8qIEhXICovCiAgICBxZW11X2lycSBpcnE7CiAgICBpbnQgZG1hX2NoYW5uOwogICAgdGFyZ2V0X3BoeXNfYWRkcl90IGlvX2Jhc2U7CiAgICAvKiBDb250cm9sbGVyIHN0YXRlICovCiAgICBRRU1VVGltZXIgKnJlc3VsdF90aW1lcjsKICAgIHVpbnQ4X3Qgc3JhOwogICAgdWludDhfdCBzcmI7CiAgICB1aW50OF90IGRvcjsKICAgIHVpbnQ4X3QgdGRyOwogICAgdWludDhfdCBkc3I7CiAgICB1aW50OF90IG1zcjsKICAgIHVpbnQ4X3QgY3VyX2RydjsKICAgIHVpbnQ4X3Qgc3RhdHVzMDsKICAgIHVpbnQ4X3Qgc3RhdHVzMTsKICAgIHVpbnQ4X3Qgc3RhdHVzMjsKICAgIC8qIENvbW1hbmQgRklGTyAqLwogICAgdWludDhfdCAqZmlmbzsKICAgIHVpbnQzMl90IGRhdGFfcG9zOwogICAgdWludDMyX3QgZGF0YV9sZW47CiAgICB1aW50OF90IGRhdGFfc3RhdGU7CiAgICB1aW50OF90IGRhdGFfZGlyOwogICAgdWludDhfdCBlb3Q7IC8qIGxhc3Qgd2FudGVkIHNlY3RvciAqLwogICAgLyogU3RhdGVzIGtlcHQgb25seSB0byBiZSByZXR1cm5lZCBiYWNrICovCiAgICAvKiBUaW1lcnMgc3RhdGUgKi8KICAgIHVpbnQ4X3QgdGltZXIwOwogICAgdWludDhfdCB0aW1lcjE7CiAgICAvKiBwcmVjb21wZW5zYXRpb24gKi8KICAgIHVpbnQ4X3QgcHJlY29tcF90cms7CiAgICB1aW50OF90IGNvbmZpZzsKICAgIHVpbnQ4X3QgbG9jazsKICAgIC8qIFBvd2VyIGRvd24gY29uZmlnIChhbHNvIHdpdGggc3RhdHVzIHJlZ0IgYWNjZXNzIG1vZGUgKi8KICAgIHVpbnQ4X3QgcHdyZDsKICAgIC8qIFN1bjRtIHF1aXJrcz8gKi8KICAgIGludCBzdW40bTsKICAgIC8qIEZsb3BweSBkcml2ZXMgKi8KICAgIGZkcml2ZV90IGRyaXZlc1tNQVhfRkRdOwogICAgaW50IHJlc2V0X3NlbnNlaTsKICAgIHVpbnQzMl90IHN0cmljdF9pbzsKICAgIHVpbnQzMl90IG1lbV9tYXBwZWQ7Cn07CgpzdGF0aWMgdWludDMyX3QgZmRjdHJsX3JlYWQgKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgcmVnKQp7CiAgICBmZGN0cmxfdCAqZmRjdHJsID0gb3BhcXVlOwogICAgdWludDMyX3QgcmV0dmFsOwoKICAgIHN3aXRjaCAocmVnKSB7CiAgICBjYXNlIEZEX1JFR19TUkE6CiAgICAgICAgcmV0dmFsID0gZmRjdHJsX3JlYWRfc3RhdHVzQShmZGN0cmwpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBGRF9SRUdfU1JCOgogICAgICAgIHJldHZhbCA9IGZkY3RybF9yZWFkX3N0YXR1c0IoZmRjdHJsKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgRkRfUkVHX0RPUjoKICAgICAgICByZXR2YWwgPSBmZGN0cmxfcmVhZF9kb3IoZmRjdHJsKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgRkRfUkVHX1REUjoKICAgICAgICByZXR2YWwgPSBmZGN0cmxfcmVhZF90YXBlKGZkY3RybCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIEZEX1JFR19NU1I6CiAgICAgICAgcmV0dmFsID0gZmRjdHJsX3JlYWRfbWFpbl9zdGF0dXMoZmRjdHJsKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgRkRfUkVHX0ZJRk86CiAgICAgICAgcmV0dmFsID0gZmRjdHJsX3JlYWRfZGF0YShmZGN0cmwpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBGRF9SRUdfRElSOgogICAgICAgIHJldHZhbCA9IGZkY3RybF9yZWFkX2RpcihmZGN0cmwpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICByZXR2YWwgPSAodWludDMyX3QpKC0xKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIEZMT1BQWV9EUFJJTlRGKCJyZWFkIHJlZyVkOiAweCUwMnhcbiIsIHJlZyAmIDcsIHJldHZhbCk7CgogICAgcmV0dXJuIHJldHZhbDsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX3dyaXRlICh2b2lkICpvcGFxdWUsIHVpbnQzMl90IHJlZywgdWludDMyX3QgdmFsdWUpCnsKICAgIGZkY3RybF90ICpmZGN0cmwgPSBvcGFxdWU7CgogICAgRkxPUFBZX0RQUklOVEYoIndyaXRlIHJlZyVkOiAweCUwMnhcbiIsIHJlZyAmIDcsIHZhbHVlKTsKCiAgICBzd2l0Y2ggKHJlZykgewogICAgY2FzZSBGRF9SRUdfRE9SOgogICAgICAgIGZkY3RybF93cml0ZV9kb3IoZmRjdHJsLCB2YWx1ZSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIEZEX1JFR19URFI6CiAgICAgICAgZmRjdHJsX3dyaXRlX3RhcGUoZmRjdHJsLCB2YWx1ZSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIEZEX1JFR19EU1I6CiAgICAgICAgZmRjdHJsX3dyaXRlX3JhdGUoZmRjdHJsLCB2YWx1ZSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIEZEX1JFR19GSUZPOgogICAgICAgIGZkY3RybF93cml0ZV9kYXRhKGZkY3RybCwgdmFsdWUpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBicmVhazsKICAgIH0KfQoKc3RhdGljIHVpbnQzMl90IGZkY3RybF9yZWFkX3BvcnQgKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgcmVnKQp7CiAgICByZXR1cm4gZmRjdHJsX3JlYWQob3BhcXVlLCByZWcgJiA3KTsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX3dyaXRlX3BvcnQgKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWx1ZSkKewogICAgZmRjdHJsX3dyaXRlKG9wYXF1ZSwgcmVnICYgNywgdmFsdWUpOwp9CgpzdGF0aWMgdWludDMyX3QgZmRjdHJsX3JlYWRfbWVtICh2b2lkICpvcGFxdWUsIHRhcmdldF9waHlzX2FkZHJfdCByZWcpCnsKICAgIHJldHVybiBmZGN0cmxfcmVhZChvcGFxdWUsICh1aW50MzJfdClyZWcpOwp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfd3JpdGVfbWVtICh2b2lkICpvcGFxdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9waHlzX2FkZHJfdCByZWcsIHVpbnQzMl90IHZhbHVlKQp7CiAgICBmZGN0cmxfd3JpdGUob3BhcXVlLCAodWludDMyX3QpcmVnLCB2YWx1ZSk7Cn0KCnN0YXRpYyBDUFVSZWFkTWVtb3J5RnVuYyAqZmRjdHJsX21lbV9yZWFkWzNdID0gewogICAgZmRjdHJsX3JlYWRfbWVtLAogICAgZmRjdHJsX3JlYWRfbWVtLAogICAgZmRjdHJsX3JlYWRfbWVtLAp9OwoKc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqZmRjdHJsX21lbV93cml0ZVszXSA9IHsKICAgIGZkY3RybF93cml0ZV9tZW0sCiAgICBmZGN0cmxfd3JpdGVfbWVtLAogICAgZmRjdHJsX3dyaXRlX21lbSwKfTsKCnN0YXRpYyBDUFVSZWFkTWVtb3J5RnVuYyAqZmRjdHJsX21lbV9yZWFkX3N0cmljdFszXSA9IHsKICAgIGZkY3RybF9yZWFkX21lbSwKICAgIE5VTEwsCiAgICBOVUxMLAp9OwoKc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqZmRjdHJsX21lbV93cml0ZV9zdHJpY3RbM10gPSB7CiAgICBmZGN0cmxfd3JpdGVfbWVtLAogICAgTlVMTCwKICAgIE5VTEwsCn07CgpzdGF0aWMgdm9pZCBmZF9zYXZlIChRRU1VRmlsZSAqZiwgZmRyaXZlX3QgKmZkKQp7CiAgICBxZW11X3B1dF84cyhmLCAmZmQtPmhlYWQpOwogICAgcWVtdV9wdXRfOHMoZiwgJmZkLT50cmFjayk7CiAgICBxZW11X3B1dF84cyhmLCAmZmQtPnNlY3QpOwp9CgpzdGF0aWMgdm9pZCBmZGNfc2F2ZSAoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSkKewogICAgZmRjdHJsX3QgKnMgPSBvcGFxdWU7CiAgICB1aW50OF90IHRtcDsKICAgIGludCBpOwogICAgdWludDhfdCBkb3IgPSBzLT5kb3IgfCBHRVRfQ1VSX0RSVihzKTsKCiAgICAvKiBDb250cm9sbGVyIHN0YXRlICovCiAgICBxZW11X3B1dF84cyhmLCAmcy0+c3JhKTsKICAgIHFlbXVfcHV0XzhzKGYsICZzLT5zcmIpOwogICAgcWVtdV9wdXRfOHMoZiwgJmRvcik7CiAgICBxZW11X3B1dF84cyhmLCAmcy0+dGRyKTsKICAgIHFlbXVfcHV0XzhzKGYsICZzLT5kc3IpOwogICAgcWVtdV9wdXRfOHMoZiwgJnMtPm1zcik7CiAgICBxZW11X3B1dF84cyhmLCAmcy0+c3RhdHVzMCk7CiAgICBxZW11X3B1dF84cyhmLCAmcy0+c3RhdHVzMSk7CiAgICBxZW11X3B1dF84cyhmLCAmcy0+c3RhdHVzMik7CiAgICAvKiBDb21tYW5kIEZJRk8gKi8KICAgIHFlbXVfcHV0X2J1ZmZlcihmLCBzLT5maWZvLCBGRF9TRUNUT1JfTEVOKTsKICAgIHFlbXVfcHV0X2JlMzJzKGYsICZzLT5kYXRhX3Bvcyk7CiAgICBxZW11X3B1dF9iZTMycyhmLCAmcy0+ZGF0YV9sZW4pOwogICAgcWVtdV9wdXRfOHMoZiwgJnMtPmRhdGFfc3RhdGUpOwogICAgcWVtdV9wdXRfOHMoZiwgJnMtPmRhdGFfZGlyKTsKICAgIHFlbXVfcHV0XzhzKGYsICZzLT5lb3QpOwogICAgLyogU3RhdGVzIGtlcHQgb25seSB0byBiZSByZXR1cm5lZCBiYWNrICovCiAgICBxZW11X3B1dF84cyhmLCAmcy0+dGltZXIwKTsKICAgIHFlbXVfcHV0XzhzKGYsICZzLT50aW1lcjEpOwogICAgcWVtdV9wdXRfOHMoZiwgJnMtPnByZWNvbXBfdHJrKTsKICAgIHFlbXVfcHV0XzhzKGYsICZzLT5jb25maWcpOwogICAgcWVtdV9wdXRfOHMoZiwgJnMtPmxvY2spOwogICAgcWVtdV9wdXRfOHMoZiwgJnMtPnB3cmQpOwoKICAgIHRtcCA9IE1BWF9GRDsKICAgIHFlbXVfcHV0XzhzKGYsICZ0bXApOwogICAgZm9yIChpID0gMDsgaSA8IE1BWF9GRDsgaSsrKQogICAgICAgIGZkX3NhdmUoZiwgJnMtPmRyaXZlc1tpXSk7Cn0KCnN0YXRpYyBpbnQgZmRfbG9hZCAoUUVNVUZpbGUgKmYsIGZkcml2ZV90ICpmZCkKewogICAgcWVtdV9nZXRfOHMoZiwgJmZkLT5oZWFkKTsKICAgIHFlbXVfZ2V0XzhzKGYsICZmZC0+dHJhY2spOwogICAgcWVtdV9nZXRfOHMoZiwgJmZkLT5zZWN0KTsKCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCBmZGNfbG9hZCAoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSwgaW50IHZlcnNpb25faWQpCnsKICAgIGZkY3RybF90ICpzID0gb3BhcXVlOwogICAgaW50IGksIHJldCA9IDA7CiAgICB1aW50OF90IG47CgogICAgaWYgKHZlcnNpb25faWQgIT0gMikKICAgICAgICByZXR1cm4gLUVJTlZBTDsKCiAgICAvKiBDb250cm9sbGVyIHN0YXRlICovCiAgICBxZW11X2dldF84cyhmLCAmcy0+c3JhKTsKICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5zcmIpOwogICAgcWVtdV9nZXRfOHMoZiwgJnMtPmRvcik7CiAgICBTRVRfQ1VSX0RSVihzLCBzLT5kb3IgJiBGRF9ET1JfU0VMTUFTSyk7CiAgICBzLT5kb3IgJj0gfkZEX0RPUl9TRUxNQVNLOwogICAgcWVtdV9nZXRfOHMoZiwgJnMtPnRkcik7CiAgICBxZW11X2dldF84cyhmLCAmcy0+ZHNyKTsKICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5tc3IpOwogICAgcWVtdV9nZXRfOHMoZiwgJnMtPnN0YXR1czApOwogICAgcWVtdV9nZXRfOHMoZiwgJnMtPnN0YXR1czEpOwogICAgcWVtdV9nZXRfOHMoZiwgJnMtPnN0YXR1czIpOwogICAgLyogQ29tbWFuZCBGSUZPICovCiAgICBxZW11X2dldF9idWZmZXIoZiwgcy0+ZmlmbywgRkRfU0VDVE9SX0xFTik7CiAgICBxZW11X2dldF9iZTMycyhmLCAmcy0+ZGF0YV9wb3MpOwogICAgcWVtdV9nZXRfYmUzMnMoZiwgJnMtPmRhdGFfbGVuKTsKICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5kYXRhX3N0YXRlKTsKICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5kYXRhX2Rpcik7CiAgICBxZW11X2dldF84cyhmLCAmcy0+ZW90KTsKICAgIC8qIFN0YXRlcyBrZXB0IG9ubHkgdG8gYmUgcmV0dXJuZWQgYmFjayAqLwogICAgcWVtdV9nZXRfOHMoZiwgJnMtPnRpbWVyMCk7CiAgICBxZW11X2dldF84cyhmLCAmcy0+dGltZXIxKTsKICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5wcmVjb21wX3Ryayk7CiAgICBxZW11X2dldF84cyhmLCAmcy0+Y29uZmlnKTsKICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5sb2NrKTsKICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5wd3JkKTsKICAgIHFlbXVfZ2V0XzhzKGYsICZuKTsKCiAgICBpZiAobiA+IE1BWF9GRCkKICAgICAgICByZXR1cm4gLUVJTlZBTDsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgcmV0ID0gZmRfbG9hZChmLCAmcy0+ZHJpdmVzW2ldKTsKICAgICAgICBpZiAocmV0ICE9IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiByZXQ7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9leHRlcm5hbF9yZXNldCh2b2lkICpvcGFxdWUpCnsKICAgIGZkY3RybF90ICpzID0gb3BhcXVlOwoKICAgIGZkY3RybF9yZXNldChzLCAwKTsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV90Yyh2b2lkICpvcGFxdWUsIGludCBpcnEsIGludCBsZXZlbCkKewogICAgLy9mZGN0cmxfdCAqcyA9IG9wYXF1ZTsKCiAgICBpZiAobGV2ZWwpIHsKICAgICAgICAvLyBYWFgKICAgICAgICBGTE9QUFlfRFBSSU5URigiVEMgcHVsc2VkXG4iKTsKICAgIH0KfQoKLyogWFhYOiBtYXkgY2hhbmdlIGlmIG1vdmVkIHRvIGJkcnYgKi8KaW50IGZkY3RybF9nZXRfZHJpdmVfdHlwZShmZGN0cmxfdCAqZmRjdHJsLCBpbnQgZHJpdmVfbnVtKQp7CiAgICByZXR1cm4gZmRjdHJsLT5kcml2ZXNbZHJpdmVfbnVtXS5kcml2ZTsKfQoKLyogQ2hhbmdlIElSUSBzdGF0ZSAqLwpzdGF0aWMgdm9pZCBmZGN0cmxfcmVzZXRfaXJxIChmZGN0cmxfdCAqZmRjdHJsKQp7CiAgICBpZiAoIShmZGN0cmwtPnNyYSAmIEZEX1NSQV9JTlRQRU5EKSkKICAgICAgICByZXR1cm47CiAgICBGTE9QUFlfRFBSSU5URigiUmVzZXQgaW50ZXJydXB0XG4iKTsKICAgIHFlbXVfc2V0X2lycShmZGN0cmwtPmlycSwgMCk7CiAgICBmZGN0cmwtPnNyYSAmPSB+RkRfU1JBX0lOVFBFTkQ7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9yYWlzZV9pcnEgKGZkY3RybF90ICpmZGN0cmwsIHVpbnQ4X3Qgc3RhdHVzMCkKewogICAgLyogU3BhcmMgbXV0YXRpb24gKi8KICAgIGlmIChmZGN0cmwtPnN1bjRtICYmIChmZGN0cmwtPm1zciAmIEZEX01TUl9DTURCVVNZKSkgewogICAgICAgIC8qIFhYWDogbm90IHN1cmUgKi8KICAgICAgICBmZGN0cmwtPm1zciAmPSB+RkRfTVNSX0NNREJVU1k7CiAgICAgICAgZmRjdHJsLT5tc3IgfD0gRkRfTVNSX1JRTSB8IEZEX01TUl9ESU87CiAgICAgICAgZmRjdHJsLT5zdGF0dXMwID0gc3RhdHVzMDsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIShmZGN0cmwtPnNyYSAmIEZEX1NSQV9JTlRQRU5EKSkgewogICAgICAgIHFlbXVfc2V0X2lycShmZGN0cmwtPmlycSwgMSk7CiAgICAgICAgZmRjdHJsLT5zcmEgfD0gRkRfU1JBX0lOVFBFTkQ7CiAgICB9CiAgICBmZGN0cmwtPnJlc2V0X3NlbnNlaSA9IDA7CiAgICBmZGN0cmwtPnN0YXR1czAgPSBzdGF0dXMwOwogICAgRkxPUFBZX0RQUklOVEYoIlNldCBpbnRlcnJ1cHQgc3RhdHVzIHRvIDB4JTAyeFxuIiwgZmRjdHJsLT5zdGF0dXMwKTsKfQoKLyogUmVzZXQgY29udHJvbGxlciAqLwpzdGF0aWMgdm9pZCBmZGN0cmxfcmVzZXQgKGZkY3RybF90ICpmZGN0cmwsIGludCBkb19pcnEpCnsKICAgIGludCBpOwoKICAgIEZMT1BQWV9EUFJJTlRGKCJyZXNldCBjb250cm9sbGVyXG4iKTsKICAgIGZkY3RybF9yZXNldF9pcnEoZmRjdHJsKTsKICAgIC8qIEluaXRpYWxpc2UgY29udHJvbGxlciAqLwogICAgZmRjdHJsLT5zcmEgPSAwOwogICAgZmRjdHJsLT5zcmIgPSAweGMwOwogICAgaWYgKCFmZGN0cmwtPmRyaXZlc1sxXS5icykKICAgICAgICBmZGN0cmwtPnNyYSB8PSBGRF9TUkFfbkRSVjI7CiAgICBmZGN0cmwtPmN1cl9kcnYgPSAwOwogICAgZmRjdHJsLT5kb3IgPSBGRF9ET1JfblJFU0VUOwogICAgZmRjdHJsLT5kb3IgfD0gKGZkY3RybC0+ZG1hX2NoYW5uICE9IC0xKSA/IEZEX0RPUl9ETUFFTiA6IDA7CiAgICBmZGN0cmwtPm1zciA9IEZEX01TUl9SUU07CiAgICAvKiBGSUZPIHN0YXRlICovCiAgICBmZGN0cmwtPmRhdGFfcG9zID0gMDsKICAgIGZkY3RybC0+ZGF0YV9sZW4gPSAwOwogICAgZmRjdHJsLT5kYXRhX3N0YXRlID0gMDsKICAgIGZkY3RybC0+ZGF0YV9kaXIgPSBGRF9ESVJfV1JJVEU7CiAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0ZEOyBpKyspCiAgICAgICAgZmRfcmVjYWxpYnJhdGUoJmZkY3RybC0+ZHJpdmVzW2ldKTsKICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7CiAgICBpZiAoZG9faXJxKSB7CiAgICAgICAgZmRjdHJsX3JhaXNlX2lycShmZGN0cmwsIEZEX1NSMF9SRFlDSEcpOwogICAgICAgIGZkY3RybC0+cmVzZXRfc2Vuc2VpID0gRkRfUkVTRVRfU0VOU0VJX0NPVU5UOwogICAgfQp9CgpzdGF0aWMgaW5saW5lIGZkcml2ZV90ICpkcnYwIChmZGN0cmxfdCAqZmRjdHJsKQp7CiAgICByZXR1cm4gJmZkY3RybC0+ZHJpdmVzWyhmZGN0cmwtPnRkciAmIEZEX1REUl9CT09UU0VMKSA+PiAyXTsKfQoKc3RhdGljIGlubGluZSBmZHJpdmVfdCAqZHJ2MSAoZmRjdHJsX3QgKmZkY3RybCkKewogICAgaWYgKChmZGN0cmwtPnRkciAmIEZEX1REUl9CT09UU0VMKSA8ICgxIDw8IDIpKQogICAgICAgIHJldHVybiAmZmRjdHJsLT5kcml2ZXNbMV07CiAgICBlbHNlCiAgICAgICAgcmV0dXJuICZmZGN0cmwtPmRyaXZlc1swXTsKfQoKI2lmIE1BWF9GRCA9PSA0CnN0YXRpYyBpbmxpbmUgZmRyaXZlX3QgKmRydjIgKGZkY3RybF90ICpmZGN0cmwpCnsKICAgIGlmICgoZmRjdHJsLT50ZHIgJiBGRF9URFJfQk9PVFNFTCkgPCAoMiA8PCAyKSkKICAgICAgICByZXR1cm4gJmZkY3RybC0+ZHJpdmVzWzJdOwogICAgZWxzZQogICAgICAgIHJldHVybiAmZmRjdHJsLT5kcml2ZXNbMV07Cn0KCnN0YXRpYyBpbmxpbmUgZmRyaXZlX3QgKmRydjMgKGZkY3RybF90ICpmZGN0cmwpCnsKICAgIGlmICgoZmRjdHJsLT50ZHIgJiBGRF9URFJfQk9PVFNFTCkgPCAoMyA8PCAyKSkKICAgICAgICByZXR1cm4gJmZkY3RybC0+ZHJpdmVzWzNdOwogICAgZWxzZQogICAgICAgIHJldHVybiAmZmRjdHJsLT5kcml2ZXNbMl07Cn0KI2VuZGlmCgpzdGF0aWMgZmRyaXZlX3QgKmdldF9jdXJfZHJ2IChmZGN0cmxfdCAqZmRjdHJsKQp7CiAgICBzd2l0Y2ggKGZkY3RybC0+Y3VyX2RydikgewogICAgICAgIGNhc2UgMDogcmV0dXJuIGRydjAoZmRjdHJsKTsKICAgICAgICBjYXNlIDE6IHJldHVybiBkcnYxKGZkY3RybCk7CiNpZiBNQVhfRkQgPT0gNAogICAgICAgIGNhc2UgMjogcmV0dXJuIGRydjIoZmRjdHJsKTsKICAgICAgICBjYXNlIDM6IHJldHVybiBkcnYzKGZkY3RybCk7CiNlbmRpZgogICAgICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOwogICAgfQp9CgovKiBTdGF0dXMgQSByZWdpc3RlciA6IDB4MDAgKHJlYWQtb25seSkgKi8Kc3RhdGljIHVpbnQzMl90IGZkY3RybF9yZWFkX3N0YXR1c0EgKGZkY3RybF90ICpmZGN0cmwpCnsKICAgIHVpbnQzMl90IHJldHZhbCA9IGZkY3RybC0+c3JhOwoKICAgIEZMT1BQWV9EUFJJTlRGKCJzdGF0dXMgcmVnaXN0ZXIgQTogMHglMDJ4XG4iLCByZXR2YWwpOwoKICAgIHJldHVybiByZXR2YWw7Cn0KCi8qIFN0YXR1cyBCIHJlZ2lzdGVyIDogMHgwMSAocmVhZC1vbmx5KSAqLwpzdGF0aWMgdWludDMyX3QgZmRjdHJsX3JlYWRfc3RhdHVzQiAoZmRjdHJsX3QgKmZkY3RybCkKewogICAgdWludDMyX3QgcmV0dmFsID0gZmRjdHJsLT5zcmI7CgogICAgRkxPUFBZX0RQUklOVEYoInN0YXR1cyByZWdpc3RlciBCOiAweCUwMnhcbiIsIHJldHZhbCk7CgogICAgcmV0dXJuIHJldHZhbDsKfQoKLyogRGlnaXRhbCBvdXRwdXQgcmVnaXN0ZXIgOiAweDAyICovCnN0YXRpYyB1aW50MzJfdCBmZGN0cmxfcmVhZF9kb3IgKGZkY3RybF90ICpmZGN0cmwpCnsKICAgIHVpbnQzMl90IHJldHZhbCA9IGZkY3RybC0+ZG9yOwoKICAgIC8qIFNlbGVjdGVkIGRyaXZlICovCiAgICByZXR2YWwgfD0gZmRjdHJsLT5jdXJfZHJ2OwogICAgRkxPUFBZX0RQUklOVEYoImRpZ2l0YWwgb3V0cHV0IHJlZ2lzdGVyOiAweCUwMnhcbiIsIHJldHZhbCk7CgogICAgcmV0dXJuIHJldHZhbDsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX3dyaXRlX2RvciAoZmRjdHJsX3QgKmZkY3RybCwgdWludDMyX3QgdmFsdWUpCnsKICAgIEZMT1BQWV9EUFJJTlRGKCJkaWdpdGFsIG91dHB1dCByZWdpc3RlciBzZXQgdG8gMHglMDJ4XG4iLCB2YWx1ZSk7CgogICAgLyogTW90b3JzICovCiAgICBpZiAodmFsdWUgJiBGRF9ET1JfTU9URU4wKQogICAgICAgIGZkY3RybC0+c3JiIHw9IEZEX1NSQl9NVFIwOwogICAgZWxzZQogICAgICAgIGZkY3RybC0+c3JiICY9IH5GRF9TUkJfTVRSMDsKICAgIGlmICh2YWx1ZSAmIEZEX0RPUl9NT1RFTjEpCiAgICAgICAgZmRjdHJsLT5zcmIgfD0gRkRfU1JCX01UUjE7CiAgICBlbHNlCiAgICAgICAgZmRjdHJsLT5zcmIgJj0gfkZEX1NSQl9NVFIxOwoKICAgIC8qIERyaXZlICovCiAgICBpZiAodmFsdWUgJiAxKQogICAgICAgIGZkY3RybC0+c3JiIHw9IEZEX1NSQl9EUjA7CiAgICBlbHNlCiAgICAgICAgZmRjdHJsLT5zcmIgJj0gfkZEX1NSQl9EUjA7CgogICAgLyogUmVzZXQgKi8KICAgIGlmICghKHZhbHVlICYgRkRfRE9SX25SRVNFVCkpIHsKICAgICAgICBpZiAoZmRjdHJsLT5kb3IgJiBGRF9ET1JfblJFU0VUKSB7CiAgICAgICAgICAgIEZMT1BQWV9EUFJJTlRGKCJjb250cm9sbGVyIGVudGVyIFJFU0VUIHN0YXRlXG4iKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGlmICghKGZkY3RybC0+ZG9yICYgRkRfRE9SX25SRVNFVCkpIHsKICAgICAgICAgICAgRkxPUFBZX0RQUklOVEYoImNvbnRyb2xsZXIgb3V0IG9mIFJFU0VUIHN0YXRlXG4iKTsKICAgICAgICAgICAgZmRjdHJsX3Jlc2V0KGZkY3RybCwgMSk7CiAgICAgICAgICAgIGZkY3RybC0+ZHNyICY9IH5GRF9EU1JfUFdSRE9XTjsKICAgICAgICB9CiAgICB9CiAgICAvKiBTZWxlY3RlZCBkcml2ZSAqLwogICAgZmRjdHJsLT5jdXJfZHJ2ID0gdmFsdWUgJiBGRF9ET1JfU0VMTUFTSzsKCiAgICBmZGN0cmwtPmRvciA9IHZhbHVlOwp9CgovKiBUYXBlIGRyaXZlIHJlZ2lzdGVyIDogMHgwMyAqLwpzdGF0aWMgdWludDMyX3QgZmRjdHJsX3JlYWRfdGFwZSAoZmRjdHJsX3QgKmZkY3RybCkKewogICAgdWludDMyX3QgcmV0dmFsID0gZmRjdHJsLT50ZHI7CgogICAgRkxPUFBZX0RQUklOVEYoInRhcGUgZHJpdmUgcmVnaXN0ZXI6IDB4JTAyeFxuIiwgcmV0dmFsKTsKCiAgICByZXR1cm4gcmV0dmFsOwp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfd3JpdGVfdGFwZSAoZmRjdHJsX3QgKmZkY3RybCwgdWludDMyX3QgdmFsdWUpCnsKICAgIC8qIFJlc2V0IG1vZGUgKi8KICAgIGlmICghKGZkY3RybC0+ZG9yICYgRkRfRE9SX25SRVNFVCkpIHsKICAgICAgICBGTE9QUFlfRFBSSU5URigiRmxvcHB5IGNvbnRyb2xsZXIgaW4gUkVTRVQgc3RhdGUgIVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgRkxPUFBZX0RQUklOVEYoInRhcGUgZHJpdmUgcmVnaXN0ZXIgc2V0IHRvIDB4JTAyeFxuIiwgdmFsdWUpOwogICAgLyogRGlzayBib290IHNlbGVjdGlvbiBpbmRpY2F0b3IgKi8KICAgIGZkY3RybC0+dGRyID0gdmFsdWUgJiBGRF9URFJfQk9PVFNFTDsKICAgIC8qIFRhcGUgaW5kaWNhdG9yczogbmV2ZXIgYWxsb3cgKi8KfQoKLyogTWFpbiBzdGF0dXMgcmVnaXN0ZXIgOiAweDA0IChyZWFkKSAqLwpzdGF0aWMgdWludDMyX3QgZmRjdHJsX3JlYWRfbWFpbl9zdGF0dXMgKGZkY3RybF90ICpmZGN0cmwpCnsKICAgIHVpbnQzMl90IHJldHZhbCA9IGZkY3RybC0+bXNyOwoKICAgIGZkY3RybC0+ZHNyICY9IH5GRF9EU1JfUFdSRE9XTjsKICAgIGZkY3RybC0+ZG9yIHw9IEZEX0RPUl9uUkVTRVQ7CgogICAgRkxPUFBZX0RQUklOVEYoIm1haW4gc3RhdHVzIHJlZ2lzdGVyOiAweCUwMnhcbiIsIHJldHZhbCk7CgogICAgcmV0dXJuIHJldHZhbDsKfQoKLyogRGF0YSBzZWxlY3QgcmF0ZSByZWdpc3RlciA6IDB4MDQgKHdyaXRlKSAqLwpzdGF0aWMgdm9pZCBmZGN0cmxfd3JpdGVfcmF0ZSAoZmRjdHJsX3QgKmZkY3RybCwgdWludDMyX3QgdmFsdWUpCnsKICAgIC8qIFJlc2V0IG1vZGUgKi8KICAgIGlmICghKGZkY3RybC0+ZG9yICYgRkRfRE9SX25SRVNFVCkpIHsKICAgICAgICBGTE9QUFlfRFBSSU5URigiRmxvcHB5IGNvbnRyb2xsZXIgaW4gUkVTRVQgc3RhdGUgIVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgRkxPUFBZX0RQUklOVEYoInNlbGVjdCByYXRlIHJlZ2lzdGVyIHNldCB0byAweCUwMnhcbiIsIHZhbHVlKTsKICAgIC8qIFJlc2V0OiBhdXRvY2xlYXIgKi8KICAgIGlmICh2YWx1ZSAmIEZEX0RTUl9TV1JFU0VUKSB7CiAgICAgICAgZmRjdHJsLT5kb3IgJj0gfkZEX0RPUl9uUkVTRVQ7CiAgICAgICAgZmRjdHJsX3Jlc2V0KGZkY3RybCwgMSk7CiAgICAgICAgZmRjdHJsLT5kb3IgfD0gRkRfRE9SX25SRVNFVDsKICAgIH0KICAgIGlmICh2YWx1ZSAmIEZEX0RTUl9QV1JET1dOKSB7CiAgICAgICAgZmRjdHJsX3Jlc2V0KGZkY3RybCwgMSk7CiAgICB9CiAgICBmZGN0cmwtPmRzciA9IHZhbHVlOwp9CgpzdGF0aWMgaW50IGZkY3RybF9tZWRpYV9jaGFuZ2VkKGZkcml2ZV90ICpkcnYpCnsKICAgIGludCByZXQ7CgogICAgaWYgKCFkcnYtPmJzKQogICAgICAgIHJldHVybiAwOwogICAgcmV0ID0gYmRydl9tZWRpYV9jaGFuZ2VkKGRydi0+YnMpOwogICAgaWYgKHJldCkgewogICAgICAgIGZkX3JldmFsaWRhdGUoZHJ2KTsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qIERpZ2l0YWwgaW5wdXQgcmVnaXN0ZXIgOiAweDA3IChyZWFkLW9ubHkpICovCnN0YXRpYyB1aW50MzJfdCBmZGN0cmxfcmVhZF9kaXIgKGZkY3RybF90ICpmZGN0cmwpCnsKICAgIHVpbnQzMl90IHJldHZhbCA9IDA7CgogICAgaWYgKGZkY3RybF9tZWRpYV9jaGFuZ2VkKGRydjAoZmRjdHJsKSkKICAgICB8fCBmZGN0cmxfbWVkaWFfY2hhbmdlZChkcnYxKGZkY3RybCkpCiNpZiBNQVhfRkQgPT0gNAogICAgIHx8IGZkY3RybF9tZWRpYV9jaGFuZ2VkKGRydjIoZmRjdHJsKSkKICAgICB8fCBmZGN0cmxfbWVkaWFfY2hhbmdlZChkcnYzKGZkY3RybCkpCiNlbmRpZgogICAgICAgICkKICAgICAgICByZXR2YWwgfD0gRkRfRElSX0RTS0NIRzsKICAgIGlmIChyZXR2YWwgIT0gMCkKICAgICAgICBGTE9QUFlfRFBSSU5URigiRmxvcHB5IGRpZ2l0YWwgaW5wdXQgcmVnaXN0ZXI6IDB4JTAyeFxuIiwgcmV0dmFsKTsKCiAgICByZXR1cm4gcmV0dmFsOwp9CgovKiBGSUZPIHN0YXRlIGNvbnRyb2wgKi8Kc3RhdGljIHZvaWQgZmRjdHJsX3Jlc2V0X2ZpZm8gKGZkY3RybF90ICpmZGN0cmwpCnsKICAgIGZkY3RybC0+ZGF0YV9kaXIgPSBGRF9ESVJfV1JJVEU7CiAgICBmZGN0cmwtPmRhdGFfcG9zID0gMDsKICAgIGZkY3RybC0+bXNyICY9IH4oRkRfTVNSX0NNREJVU1kgfCBGRF9NU1JfRElPKTsKfQoKLyogU2V0IEZJRk8gc3RhdHVzIGZvciB0aGUgaG9zdCB0byByZWFkICovCnN0YXRpYyB2b2lkIGZkY3RybF9zZXRfZmlmbyAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGZpZm9fbGVuLCBpbnQgZG9faXJxKQp7CiAgICBmZGN0cmwtPmRhdGFfZGlyID0gRkRfRElSX1JFQUQ7CiAgICBmZGN0cmwtPmRhdGFfbGVuID0gZmlmb19sZW47CiAgICBmZGN0cmwtPmRhdGFfcG9zID0gMDsKICAgIGZkY3RybC0+bXNyIHw9IEZEX01TUl9DTURCVVNZIHwgRkRfTVNSX1JRTSB8IEZEX01TUl9ESU87CiAgICBpZiAoZG9faXJxKQogICAgICAgIGZkY3RybF9yYWlzZV9pcnEoZmRjdHJsLCAweDAwKTsKfQoKLyogU2V0IGFuIGVycm9yOiB1bmltcGxlbWVudGVkL3Vua25vd24gY29tbWFuZCAqLwpzdGF0aWMgdm9pZCBmZGN0cmxfdW5pbXBsZW1lbnRlZCAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgRkxPUFBZX0VSUk9SKCJ1bmltcGxlbWVudGVkIGNvbW1hbmQgMHglMDJ4XG4iLCBmZGN0cmwtPmZpZm9bMF0pOwogICAgZmRjdHJsLT5maWZvWzBdID0gRkRfU1IwX0lOVkNNRDsKICAgIGZkY3RybF9zZXRfZmlmbyhmZGN0cmwsIDEsIDApOwp9CgovKiBTZWVrIHRvIG5leHQgc2VjdG9yICovCnN0YXRpYyBpbnQgZmRjdHJsX3NlZWtfdG9fbmV4dF9zZWN0IChmZGN0cmxfdCAqZmRjdHJsLCBmZHJpdmVfdCAqY3VyX2RydikKewogICAgRkxPUFBZX0RQUklOVEYoInNlZWsgdG8gbmV4dCBzZWN0b3IgKCVkICUwMnggJTAyeCA9PiAlZClcbiIsCiAgICAgICAgICAgICAgICAgICBjdXJfZHJ2LT5oZWFkLCBjdXJfZHJ2LT50cmFjaywgY3VyX2Rydi0+c2VjdCwKICAgICAgICAgICAgICAgICAgIGZkX3NlY3RvcihjdXJfZHJ2KSk7CiAgICAvKiBYWFg6IGN1cl9kcnYtPnNlY3QgPj0gY3VyX2Rydi0+bGFzdF9zZWN0IHNob3VsZCBiZSBhbgogICAgICAgZXJyb3IgaW4gZmFjdCAqLwogICAgaWYgKGN1cl9kcnYtPnNlY3QgPj0gY3VyX2Rydi0+bGFzdF9zZWN0IHx8CiAgICAgICAgY3VyX2Rydi0+c2VjdCA9PSBmZGN0cmwtPmVvdCkgewogICAgICAgIGN1cl9kcnYtPnNlY3QgPSAxOwogICAgICAgIGlmIChGRF9NVUxUSV9UUkFDSyhmZGN0cmwtPmRhdGFfc3RhdGUpKSB7CiAgICAgICAgICAgIGlmIChjdXJfZHJ2LT5oZWFkID09IDAgJiYKICAgICAgICAgICAgICAgIChjdXJfZHJ2LT5mbGFncyAmIEZESVNLX0RCTF9TSURFUykgIT0gMCkgewogICAgICAgICAgICAgICAgY3VyX2Rydi0+aGVhZCA9IDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjdXJfZHJ2LT5oZWFkID0gMDsKICAgICAgICAgICAgICAgIGN1cl9kcnYtPnRyYWNrKys7CiAgICAgICAgICAgICAgICBpZiAoKGN1cl9kcnYtPmZsYWdzICYgRkRJU0tfREJMX1NJREVTKSA9PSAwKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY3VyX2Rydi0+dHJhY2srKzsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIEZMT1BQWV9EUFJJTlRGKCJzZWVrIHRvIG5leHQgdHJhY2sgKCVkICUwMnggJTAyeCA9PiAlZClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgY3VyX2Rydi0+aGVhZCwgY3VyX2Rydi0+dHJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgY3VyX2Rydi0+c2VjdCwgZmRfc2VjdG9yKGN1cl9kcnYpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgY3VyX2Rydi0+c2VjdCsrOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCi8qIENhbGxiYWNrIGZvciB0cmFuc2ZlciBlbmQgKHN0b3Agb3IgYWJvcnQpICovCnN0YXRpYyB2b2lkIGZkY3RybF9zdG9wX3RyYW5zZmVyIChmZGN0cmxfdCAqZmRjdHJsLCB1aW50OF90IHN0YXR1czAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1czEsIHVpbnQ4X3Qgc3RhdHVzMikKewogICAgZmRyaXZlX3QgKmN1cl9kcnY7CgogICAgY3VyX2RydiA9IGdldF9jdXJfZHJ2KGZkY3RybCk7CiAgICBGTE9QUFlfRFBSSU5URigidHJhbnNmZXIgc3RhdHVzOiAlMDJ4ICUwMnggJTAyeCAoJTAyeClcbiIsCiAgICAgICAgICAgICAgICAgICBzdGF0dXMwLCBzdGF0dXMxLCBzdGF0dXMyLAogICAgICAgICAgICAgICAgICAgc3RhdHVzMCB8IChjdXJfZHJ2LT5oZWFkIDw8IDIpIHwgR0VUX0NVUl9EUlYoZmRjdHJsKSk7CiAgICBmZGN0cmwtPmZpZm9bMF0gPSBzdGF0dXMwIHwgKGN1cl9kcnYtPmhlYWQgPDwgMikgfCBHRVRfQ1VSX0RSVihmZGN0cmwpOwogICAgZmRjdHJsLT5maWZvWzFdID0gc3RhdHVzMTsKICAgIGZkY3RybC0+Zmlmb1syXSA9IHN0YXR1czI7CiAgICBmZGN0cmwtPmZpZm9bM10gPSBjdXJfZHJ2LT50cmFjazsKICAgIGZkY3RybC0+Zmlmb1s0XSA9IGN1cl9kcnYtPmhlYWQ7CiAgICBmZGN0cmwtPmZpZm9bNV0gPSBjdXJfZHJ2LT5zZWN0OwogICAgZmRjdHJsLT5maWZvWzZdID0gRkRfU0VDVE9SX1NDOwogICAgZmRjdHJsLT5kYXRhX2RpciA9IEZEX0RJUl9SRUFEOwogICAgaWYgKCEoZmRjdHJsLT5tc3IgJiBGRF9NU1JfTk9ORE1BKSkgewogICAgICAgIERNQV9yZWxlYXNlX0RSRVEoZmRjdHJsLT5kbWFfY2hhbm4pOwogICAgfQogICAgZmRjdHJsLT5tc3IgfD0gRkRfTVNSX1JRTSB8IEZEX01TUl9ESU87CiAgICBmZGN0cmwtPm1zciAmPSB+RkRfTVNSX05PTkRNQTsKICAgIGZkY3RybF9zZXRfZmlmbyhmZGN0cmwsIDcsIDEpOwp9CgovKiBQcmVwYXJlIGEgZGF0YSB0cmFuc2ZlciAoZWl0aGVyIERNQSBvciBGSUZPKSAqLwpzdGF0aWMgdm9pZCBmZGN0cmxfc3RhcnRfdHJhbnNmZXIgKGZkY3RybF90ICpmZGN0cmwsIGludCBkaXJlY3Rpb24pCnsKICAgIGZkcml2ZV90ICpjdXJfZHJ2OwogICAgdWludDhfdCBraCwga3QsIGtzOwogICAgaW50IGRpZF9zZWVrID0gMDsKCiAgICBTRVRfQ1VSX0RSVihmZGN0cmwsIGZkY3RybC0+Zmlmb1sxXSAmIEZEX0RPUl9TRUxNQVNLKTsKICAgIGN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwogICAga3QgPSBmZGN0cmwtPmZpZm9bMl07CiAgICBraCA9IGZkY3RybC0+Zmlmb1szXTsKICAgIGtzID0gZmRjdHJsLT5maWZvWzRdOwogICAgRkxPUFBZX0RQUklOVEYoIlN0YXJ0IHRyYW5zZmVyIGF0ICVkICVkICUwMnggJTAyeCAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgR0VUX0NVUl9EUlYoZmRjdHJsKSwga2gsIGt0LCBrcywKICAgICAgICAgICAgICAgICAgIF9mZF9zZWN0b3Ioa2gsIGt0LCBrcywgY3VyX2Rydi0+bGFzdF9zZWN0KSk7CiAgICBzd2l0Y2ggKGZkX3NlZWsoY3VyX2Rydiwga2gsIGt0LCBrcywgZmRjdHJsLT5jb25maWcgJiBGRF9DT05GSUdfRUlTKSkgewogICAgY2FzZSAyOgogICAgICAgIC8qIHNlY3QgdG9vIGJpZyAqLwogICAgICAgIGZkY3RybF9zdG9wX3RyYW5zZmVyKGZkY3RybCwgRkRfU1IwX0FCTlRFUk0sIDB4MDAsIDB4MDApOwogICAgICAgIGZkY3RybC0+Zmlmb1szXSA9IGt0OwogICAgICAgIGZkY3RybC0+Zmlmb1s0XSA9IGtoOwogICAgICAgIGZkY3RybC0+Zmlmb1s1XSA9IGtzOwogICAgICAgIHJldHVybjsKICAgIGNhc2UgMzoKICAgICAgICAvKiB0cmFjayB0b28gYmlnICovCiAgICAgICAgZmRjdHJsX3N0b3BfdHJhbnNmZXIoZmRjdHJsLCBGRF9TUjBfQUJOVEVSTSwgRkRfU1IxX0VDLCAweDAwKTsKICAgICAgICBmZGN0cmwtPmZpZm9bM10gPSBrdDsKICAgICAgICBmZGN0cmwtPmZpZm9bNF0gPSBraDsKICAgICAgICBmZGN0cmwtPmZpZm9bNV0gPSBrczsKICAgICAgICByZXR1cm47CiAgICBjYXNlIDQ6CiAgICAgICAgLyogTm8gc2VlayBlbmFibGVkICovCiAgICAgICAgZmRjdHJsX3N0b3BfdHJhbnNmZXIoZmRjdHJsLCBGRF9TUjBfQUJOVEVSTSwgMHgwMCwgMHgwMCk7CiAgICAgICAgZmRjdHJsLT5maWZvWzNdID0ga3Q7CiAgICAgICAgZmRjdHJsLT5maWZvWzRdID0ga2g7CiAgICAgICAgZmRjdHJsLT5maWZvWzVdID0ga3M7CiAgICAgICAgcmV0dXJuOwogICAgY2FzZSAxOgogICAgICAgIGRpZF9zZWVrID0gMTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgLyogU2V0IHRoZSBGSUZPIHN0YXRlICovCiAgICBmZGN0cmwtPmRhdGFfZGlyID0gZGlyZWN0aW9uOwogICAgZmRjdHJsLT5kYXRhX3BvcyA9IDA7CiAgICBmZGN0cmwtPm1zciB8PSBGRF9NU1JfQ01EQlVTWTsKICAgIGlmIChmZGN0cmwtPmZpZm9bMF0gJiAweDgwKQogICAgICAgIGZkY3RybC0+ZGF0YV9zdGF0ZSB8PSBGRF9TVEFURV9NVUxUSTsKICAgIGVsc2UKICAgICAgICBmZGN0cmwtPmRhdGFfc3RhdGUgJj0gfkZEX1NUQVRFX01VTFRJOwogICAgaWYgKGRpZF9zZWVrKQogICAgICAgIGZkY3RybC0+ZGF0YV9zdGF0ZSB8PSBGRF9TVEFURV9TRUVLOwogICAgZWxzZQogICAgICAgIGZkY3RybC0+ZGF0YV9zdGF0ZSAmPSB+RkRfU1RBVEVfU0VFSzsKICAgIGlmIChmZGN0cmwtPmZpZm9bNV0gPT0gMDApIHsKICAgICAgICBmZGN0cmwtPmRhdGFfbGVuID0gZmRjdHJsLT5maWZvWzhdOwogICAgfSBlbHNlIHsKICAgICAgICBpbnQgdG1wOwogICAgICAgIGZkY3RybC0+ZGF0YV9sZW4gPSAxMjggPDwgKGZkY3RybC0+Zmlmb1s1XSA+IDcgPyA3IDogZmRjdHJsLT5maWZvWzVdKTsKICAgICAgICB0bXAgPSAoZmRjdHJsLT5maWZvWzZdIC0ga3MgKyAxKTsKICAgICAgICBpZiAoZmRjdHJsLT5maWZvWzBdICYgMHg4MCkKICAgICAgICAgICAgdG1wICs9IGZkY3RybC0+Zmlmb1s2XTsKICAgICAgICBmZGN0cmwtPmRhdGFfbGVuICo9IHRtcDsKICAgIH0KICAgIGZkY3RybC0+ZW90ID0gZmRjdHJsLT5maWZvWzZdOwogICAgaWYgKGZkY3RybC0+ZG9yICYgRkRfRE9SX0RNQUVOKSB7CiAgICAgICAgaW50IGRtYV9tb2RlOwogICAgICAgIC8qIERNQSB0cmFuc2ZlciBhcmUgZW5hYmxlZC4gQ2hlY2sgaWYgRE1BIGNoYW5uZWwgaXMgd2VsbCBwcm9ncmFtbWVkICovCiAgICAgICAgZG1hX21vZGUgPSBETUFfZ2V0X2NoYW5uZWxfbW9kZShmZGN0cmwtPmRtYV9jaGFubik7CiAgICAgICAgZG1hX21vZGUgPSAoZG1hX21vZGUgPj4gMikgJiAzOwogICAgICAgIEZMT1BQWV9EUFJJTlRGKCJkbWFfbW9kZT0lZCBkaXJlY3Rpb249JWQgKCVkIC0gJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGRtYV9tb2RlLCBkaXJlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgKDEyOCA8PCBmZGN0cmwtPmZpZm9bNV0pICoKICAgICAgICAgICAgICAgICAgICAgICAoY3VyX2Rydi0+bGFzdF9zZWN0IC0ga3MgKyAxKSwgZmRjdHJsLT5kYXRhX2xlbik7CiAgICAgICAgaWYgKCgoZGlyZWN0aW9uID09IEZEX0RJUl9TQ0FORSB8fCBkaXJlY3Rpb24gPT0gRkRfRElSX1NDQU5MIHx8CiAgICAgICAgICAgICAgZGlyZWN0aW9uID09IEZEX0RJUl9TQ0FOSCkgJiYgZG1hX21vZGUgPT0gMCkgfHwKICAgICAgICAgICAgKGRpcmVjdGlvbiA9PSBGRF9ESVJfV1JJVEUgJiYgZG1hX21vZGUgPT0gMikgfHwKICAgICAgICAgICAgKGRpcmVjdGlvbiA9PSBGRF9ESVJfUkVBRCAmJiBkbWFfbW9kZSA9PSAxKSkgewogICAgICAgICAgICAvKiBObyBhY2Nlc3MgaXMgYWxsb3dlZCB1bnRpbCBETUEgdHJhbnNmZXIgaGFzIGNvbXBsZXRlZCAqLwogICAgICAgICAgICBmZGN0cmwtPm1zciAmPSB+RkRfTVNSX1JRTTsKICAgICAgICAgICAgLyogTm93LCB3ZSBqdXN0IGhhdmUgdG8gd2FpdCBmb3IgdGhlIERNQSBjb250cm9sbGVyIHRvCiAgICAgICAgICAgICAqIHJlY2FsbCB1cy4uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgRE1BX2hvbGRfRFJFUShmZGN0cmwtPmRtYV9jaGFubik7CiAgICAgICAgICAgIERNQV9zY2hlZHVsZShmZGN0cmwtPmRtYV9jaGFubik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBGTE9QUFlfRVJST1IoImRtYV9tb2RlPSVkIGRpcmVjdGlvbj0lZFxuIiwgZG1hX21vZGUsIGRpcmVjdGlvbik7CiAgICAgICAgfQogICAgfQogICAgRkxPUFBZX0RQUklOVEYoInN0YXJ0IG5vbi1ETUEgdHJhbnNmZXJcbiIpOwogICAgZmRjdHJsLT5tc3IgfD0gRkRfTVNSX05PTkRNQTsKICAgIGlmIChkaXJlY3Rpb24gIT0gRkRfRElSX1dSSVRFKQogICAgICAgIGZkY3RybC0+bXNyIHw9IEZEX01TUl9ESU87CiAgICAvKiBJTyBiYXNlZCB0cmFuc2ZlcjogY2FsY3VsYXRlIGxlbiAqLwogICAgZmRjdHJsX3JhaXNlX2lycShmZGN0cmwsIDB4MDApOwoKICAgIHJldHVybjsKfQoKLyogUHJlcGFyZSBhIHRyYW5zZmVyIG9mIGRlbGV0ZWQgZGF0YSAqLwpzdGF0aWMgdm9pZCBmZGN0cmxfc3RhcnRfdHJhbnNmZXJfZGVsIChmZGN0cmxfdCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICBGTE9QUFlfRVJST1IoImZkY3RybF9zdGFydF90cmFuc2Zlcl9kZWwoKSB1bmltcGxlbWVudGVkXG4iKTsKCiAgICAvKiBXZSBkb24ndCBoYW5kbGUgZGVsZXRlZCBkYXRhLAogICAgICogc28gd2UgZG9uJ3QgcmV0dXJuICpBTllUSElORyoKICAgICAqLwogICAgZmRjdHJsX3N0b3BfdHJhbnNmZXIoZmRjdHJsLCBGRF9TUjBfQUJOVEVSTSB8IEZEX1NSMF9TRUVLLCAweDAwLCAweDAwKTsKfQoKLyogaGFuZGxlcnMgZm9yIERNQSB0cmFuc2ZlcnMgKi8Kc3RhdGljIGludCBmZGN0cmxfdHJhbnNmZXJfaGFuZGxlciAodm9pZCAqb3BhcXVlLCBpbnQgbmNoYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkbWFfcG9zLCBpbnQgZG1hX2xlbikKewogICAgZmRjdHJsX3QgKmZkY3RybDsKICAgIGZkcml2ZV90ICpjdXJfZHJ2OwogICAgaW50IGxlbiwgc3RhcnRfcG9zLCByZWxfcG9zOwogICAgdWludDhfdCBzdGF0dXMwID0gMHgwMCwgc3RhdHVzMSA9IDB4MDAsIHN0YXR1czIgPSAweDAwOwoKICAgIGZkY3RybCA9IG9wYXF1ZTsKICAgIGlmIChmZGN0cmwtPm1zciAmIEZEX01TUl9SUU0pIHsKICAgICAgICBGTE9QUFlfRFBSSU5URigiTm90IGluIERNQSB0cmFuc2ZlciBtb2RlICFcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgY3VyX2RydiA9IGdldF9jdXJfZHJ2KGZkY3RybCk7CiAgICBpZiAoZmRjdHJsLT5kYXRhX2RpciA9PSBGRF9ESVJfU0NBTkUgfHwgZmRjdHJsLT5kYXRhX2RpciA9PSBGRF9ESVJfU0NBTkwgfHwKICAgICAgICBmZGN0cmwtPmRhdGFfZGlyID09IEZEX0RJUl9TQ0FOSCkKICAgICAgICBzdGF0dXMyID0gRkRfU1IyX1NOUzsKICAgIGlmIChkbWFfbGVuID4gZmRjdHJsLT5kYXRhX2xlbikKICAgICAgICBkbWFfbGVuID0gZmRjdHJsLT5kYXRhX2xlbjsKICAgIGlmIChjdXJfZHJ2LT5icyA9PSBOVUxMKSB7CiAgICAgICAgaWYgKGZkY3RybC0+ZGF0YV9kaXIgPT0gRkRfRElSX1dSSVRFKQogICAgICAgICAgICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIEZEX1NSMF9BQk5URVJNIHwgRkRfU1IwX1NFRUssIDB4MDAsIDB4MDApOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZmRjdHJsX3N0b3BfdHJhbnNmZXIoZmRjdHJsLCBGRF9TUjBfQUJOVEVSTSwgMHgwMCwgMHgwMCk7CiAgICAgICAgbGVuID0gMDsKICAgICAgICBnb3RvIHRyYW5zZmVyX2Vycm9yOwogICAgfQogICAgcmVsX3BvcyA9IGZkY3RybC0+ZGF0YV9wb3MgJSBGRF9TRUNUT1JfTEVOOwogICAgZm9yIChzdGFydF9wb3MgPSBmZGN0cmwtPmRhdGFfcG9zOyBmZGN0cmwtPmRhdGFfcG9zIDwgZG1hX2xlbjspIHsKICAgICAgICBsZW4gPSBkbWFfbGVuIC0gZmRjdHJsLT5kYXRhX3BvczsKICAgICAgICBpZiAobGVuICsgcmVsX3BvcyA+IEZEX1NFQ1RPUl9MRU4pCiAgICAgICAgICAgIGxlbiA9IEZEX1NFQ1RPUl9MRU4gLSByZWxfcG9zOwogICAgICAgIEZMT1BQWV9EUFJJTlRGKCJjb3B5ICVkIGJ5dGVzICglZCAlZCAlZCkgJWQgcG9zICVkICUwMnggIgogICAgICAgICAgICAgICAgICAgICAgICIoJWQtMHglMDh4IDB4JTA4eClcbiIsIGxlbiwgZG1hX2xlbiwgZmRjdHJsLT5kYXRhX3BvcywKICAgICAgICAgICAgICAgICAgICAgICBmZGN0cmwtPmRhdGFfbGVuLCBHRVRfQ1VSX0RSVihmZGN0cmwpLCBjdXJfZHJ2LT5oZWFkLAogICAgICAgICAgICAgICAgICAgICAgIGN1cl9kcnYtPnRyYWNrLCBjdXJfZHJ2LT5zZWN0LCBmZF9zZWN0b3IoY3VyX2RydiksCiAgICAgICAgICAgICAgICAgICAgICAgZmRfc2VjdG9yKGN1cl9kcnYpICogRkRfU0VDVE9SX0xFTik7CiAgICAgICAgaWYgKGZkY3RybC0+ZGF0YV9kaXIgIT0gRkRfRElSX1dSSVRFIHx8CiAgICAgICAgICAgIGxlbiA8IEZEX1NFQ1RPUl9MRU4gfHwgcmVsX3BvcyAhPSAwKSB7CiAgICAgICAgICAgIC8qIFJFQUQgJiBTQ0FOIGNvbW1hbmRzIGFuZCByZWFsaWduIHRvIGEgc2VjdG9yIGZvciBXUklURSAqLwogICAgICAgICAgICBpZiAoYmRydl9yZWFkKGN1cl9kcnYtPmJzLCBmZF9zZWN0b3IoY3VyX2RydiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmRjdHJsLT5maWZvLCAxKSA8IDApIHsKICAgICAgICAgICAgICAgIEZMT1BQWV9EUFJJTlRGKCJGbG9wcHk6IGVycm9yIGdldHRpbmcgc2VjdG9yICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfc2VjdG9yKGN1cl9kcnYpKTsKICAgICAgICAgICAgICAgIC8qIFN1cmUsIGltYWdlIHNpemUgaXMgdG9vIHNtYWxsLi4uICovCiAgICAgICAgICAgICAgICBtZW1zZXQoZmRjdHJsLT5maWZvLCAwLCBGRF9TRUNUT1JfTEVOKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKGZkY3RybC0+ZGF0YV9kaXIpIHsKICAgICAgICBjYXNlIEZEX0RJUl9SRUFEOgogICAgICAgICAgICAvKiBSRUFEIGNvbW1hbmRzICovCiAgICAgICAgICAgIERNQV93cml0ZV9tZW1vcnkgKG5jaGFuLCBmZGN0cmwtPmZpZm8gKyByZWxfcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZGN0cmwtPmRhdGFfcG9zLCBsZW4pOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZEX0RJUl9XUklURToKICAgICAgICAgICAgLyogV1JJVEUgY29tbWFuZHMgKi8KICAgICAgICAgICAgRE1BX3JlYWRfbWVtb3J5IChuY2hhbiwgZmRjdHJsLT5maWZvICsgcmVsX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZGN0cmwtPmRhdGFfcG9zLCBsZW4pOwogICAgICAgICAgICBpZiAoYmRydl93cml0ZShjdXJfZHJ2LT5icywgZmRfc2VjdG9yKGN1cl9kcnYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmZGN0cmwtPmZpZm8sIDEpIDwgMCkgewogICAgICAgICAgICAgICAgRkxPUFBZX0VSUk9SKCJ3cml0aW5nIHNlY3RvciAlZFxuIiwgZmRfc2VjdG9yKGN1cl9kcnYpKTsKICAgICAgICAgICAgICAgIGZkY3RybF9zdG9wX3RyYW5zZmVyKGZkY3RybCwgRkRfU1IwX0FCTlRFUk0gfCBGRF9TUjBfU0VFSywgMHgwMCwgMHgwMCk7CiAgICAgICAgICAgICAgICBnb3RvIHRyYW5zZmVyX2Vycm9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIC8qIFNDQU4gY29tbWFuZHMgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdWludDhfdCB0bXBidWZbRkRfU0VDVE9SX0xFTl07CiAgICAgICAgICAgICAgICBpbnQgcmV0OwogICAgICAgICAgICAgICAgRE1BX3JlYWRfbWVtb3J5IChuY2hhbiwgdG1wYnVmLCBmZGN0cmwtPmRhdGFfcG9zLCBsZW4pOwogICAgICAgICAgICAgICAgcmV0ID0gbWVtY21wKHRtcGJ1ZiwgZmRjdHJsLT5maWZvICsgcmVsX3BvcywgbGVuKTsKICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSBGRF9TUjJfU0VIOwogICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3RyYW5zZmVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKChyZXQgPCAwICYmIGZkY3RybC0+ZGF0YV9kaXIgPT0gRkRfRElSX1NDQU5MKSB8fAogICAgICAgICAgICAgICAgICAgIChyZXQgPiAwICYmIGZkY3RybC0+ZGF0YV9kaXIgPT0gRkRfRElSX1NDQU5IKSkgewogICAgICAgICAgICAgICAgICAgIHN0YXR1czIgPSAweDAwOwogICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3RyYW5zZmVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBmZGN0cmwtPmRhdGFfcG9zICs9IGxlbjsKICAgICAgICByZWxfcG9zID0gZmRjdHJsLT5kYXRhX3BvcyAlIEZEX1NFQ1RPUl9MRU47CiAgICAgICAgaWYgKHJlbF9wb3MgPT0gMCkgewogICAgICAgICAgICAvKiBTZWVrIHRvIG5leHQgc2VjdG9yICovCiAgICAgICAgICAgIGlmICghZmRjdHJsX3NlZWtfdG9fbmV4dF9zZWN0KGZkY3RybCwgY3VyX2RydikpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiBlbmRfdHJhbnNmZXI6CiAgICBsZW4gPSBmZGN0cmwtPmRhdGFfcG9zIC0gc3RhcnRfcG9zOwogICAgRkxPUFBZX0RQUklOVEYoImVuZCB0cmFuc2ZlciAlZCAlZCAlZFxuIiwKICAgICAgICAgICAgICAgICAgIGZkY3RybC0+ZGF0YV9wb3MsIGxlbiwgZmRjdHJsLT5kYXRhX2xlbik7CiAgICBpZiAoZmRjdHJsLT5kYXRhX2RpciA9PSBGRF9ESVJfU0NBTkUgfHwKICAgICAgICBmZGN0cmwtPmRhdGFfZGlyID09IEZEX0RJUl9TQ0FOTCB8fAogICAgICAgIGZkY3RybC0+ZGF0YV9kaXIgPT0gRkRfRElSX1NDQU5IKQogICAgICAgIHN0YXR1czIgPSBGRF9TUjJfU0VIOwogICAgaWYgKEZEX0RJRF9TRUVLKGZkY3RybC0+ZGF0YV9zdGF0ZSkpCiAgICAgICAgc3RhdHVzMCB8PSBGRF9TUjBfU0VFSzsKICAgIGZkY3RybC0+ZGF0YV9sZW4gLT0gbGVuOwogICAgZmRjdHJsX3N0b3BfdHJhbnNmZXIoZmRjdHJsLCBzdGF0dXMwLCBzdGF0dXMxLCBzdGF0dXMyKTsKIHRyYW5zZmVyX2Vycm9yOgoKICAgIHJldHVybiBsZW47Cn0KCi8qIERhdGEgcmVnaXN0ZXIgOiAweDA1ICovCnN0YXRpYyB1aW50MzJfdCBmZGN0cmxfcmVhZF9kYXRhIChmZGN0cmxfdCAqZmRjdHJsKQp7CiAgICBmZHJpdmVfdCAqY3VyX2RydjsKICAgIHVpbnQzMl90IHJldHZhbCA9IDA7CiAgICBpbnQgcG9zOwoKICAgIGN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwogICAgZmRjdHJsLT5kc3IgJj0gfkZEX0RTUl9QV1JET1dOOwogICAgaWYgKCEoZmRjdHJsLT5tc3IgJiBGRF9NU1JfUlFNKSB8fCAhKGZkY3RybC0+bXNyICYgRkRfTVNSX0RJTykpIHsKICAgICAgICBGTE9QUFlfRVJST1IoImNvbnRyb2xsZXIgbm90IHJlYWR5IGZvciByZWFkaW5nXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHBvcyA9IGZkY3RybC0+ZGF0YV9wb3M7CiAgICBpZiAoZmRjdHJsLT5tc3IgJiBGRF9NU1JfTk9ORE1BKSB7CiAgICAgICAgcG9zICU9IEZEX1NFQ1RPUl9MRU47CiAgICAgICAgaWYgKHBvcyA9PSAwKSB7CiAgICAgICAgICAgIGlmIChmZGN0cmwtPmRhdGFfcG9zICE9IDApCiAgICAgICAgICAgICAgICBpZiAoIWZkY3RybF9zZWVrX3RvX25leHRfc2VjdChmZGN0cmwsIGN1cl9kcnYpKSB7CiAgICAgICAgICAgICAgICAgICAgRkxPUFBZX0RQUklOVEYoImVycm9yIHNlZWtpbmcgdG8gbmV4dCBzZWN0b3IgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfc2VjdG9yKGN1cl9kcnYpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJkcnZfcmVhZChjdXJfZHJ2LT5icywgZmRfc2VjdG9yKGN1cl9kcnYpLCBmZGN0cmwtPmZpZm8sIDEpIDwgMCkgewogICAgICAgICAgICAgICAgRkxPUFBZX0RQUklOVEYoImVycm9yIGdldHRpbmcgc2VjdG9yICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRfc2VjdG9yKGN1cl9kcnYpKTsKICAgICAgICAgICAgICAgIC8qIFN1cmUsIGltYWdlIHNpemUgaXMgdG9vIHNtYWxsLi4uICovCiAgICAgICAgICAgICAgICBtZW1zZXQoZmRjdHJsLT5maWZvLCAwLCBGRF9TRUNUT1JfTEVOKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHZhbCA9IGZkY3RybC0+Zmlmb1twb3NdOwogICAgaWYgKCsrZmRjdHJsLT5kYXRhX3BvcyA9PSBmZGN0cmwtPmRhdGFfbGVuKSB7CiAgICAgICAgZmRjdHJsLT5kYXRhX3BvcyA9IDA7CiAgICAgICAgLyogU3dpdGNoIGZyb20gdHJhbnNmZXIgbW9kZSB0byBzdGF0dXMgbW9kZQogICAgICAgICAqIHRoZW4gZnJvbSBzdGF0dXMgbW9kZSB0byBjb21tYW5kIG1vZGUKICAgICAgICAgKi8KICAgICAgICBpZiAoZmRjdHJsLT5tc3IgJiBGRF9NU1JfTk9ORE1BKSB7CiAgICAgICAgICAgIGZkY3RybF9zdG9wX3RyYW5zZmVyKGZkY3RybCwgRkRfU1IwX1NFRUssIDB4MDAsIDB4MDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7CiAgICAgICAgICAgIGZkY3RybF9yZXNldF9pcnEoZmRjdHJsKTsKICAgICAgICB9CiAgICB9CiAgICBGTE9QUFlfRFBSSU5URigiZGF0YSByZWdpc3RlcjogMHglMDJ4XG4iLCByZXR2YWwpOwoKICAgIHJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9mb3JtYXRfc2VjdG9yIChmZGN0cmxfdCAqZmRjdHJsKQp7CiAgICBmZHJpdmVfdCAqY3VyX2RydjsKICAgIHVpbnQ4X3Qga2gsIGt0LCBrczsKCiAgICBTRVRfQ1VSX0RSVihmZGN0cmwsIGZkY3RybC0+Zmlmb1sxXSAmIEZEX0RPUl9TRUxNQVNLKTsKICAgIGN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwogICAga3QgPSBmZGN0cmwtPmZpZm9bNl07CiAgICBraCA9IGZkY3RybC0+Zmlmb1s3XTsKICAgIGtzID0gZmRjdHJsLT5maWZvWzhdOwogICAgRkxPUFBZX0RQUklOVEYoImZvcm1hdCBzZWN0b3IgYXQgJWQgJWQgJTAyeCAlMDJ4ICglZClcbiIsCiAgICAgICAgICAgICAgICAgICBHRVRfQ1VSX0RSVihmZGN0cmwpLCBraCwga3QsIGtzLAogICAgICAgICAgICAgICAgICAgX2ZkX3NlY3RvcihraCwga3QsIGtzLCBjdXJfZHJ2LT5sYXN0X3NlY3QpKTsKICAgIHN3aXRjaCAoZmRfc2VlayhjdXJfZHJ2LCBraCwga3QsIGtzLCBmZGN0cmwtPmNvbmZpZyAmIEZEX0NPTkZJR19FSVMpKSB7CiAgICBjYXNlIDI6CiAgICAgICAgLyogc2VjdCB0b28gYmlnICovCiAgICAgICAgZmRjdHJsX3N0b3BfdHJhbnNmZXIoZmRjdHJsLCBGRF9TUjBfQUJOVEVSTSwgMHgwMCwgMHgwMCk7CiAgICAgICAgZmRjdHJsLT5maWZvWzNdID0ga3Q7CiAgICAgICAgZmRjdHJsLT5maWZvWzRdID0ga2g7CiAgICAgICAgZmRjdHJsLT5maWZvWzVdID0ga3M7CiAgICAgICAgcmV0dXJuOwogICAgY2FzZSAzOgogICAgICAgIC8qIHRyYWNrIHRvbyBiaWcgKi8KICAgICAgICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIEZEX1NSMF9BQk5URVJNLCBGRF9TUjFfRUMsIDB4MDApOwogICAgICAgIGZkY3RybC0+Zmlmb1szXSA9IGt0OwogICAgICAgIGZkY3RybC0+Zmlmb1s0XSA9IGtoOwogICAgICAgIGZkY3RybC0+Zmlmb1s1XSA9IGtzOwogICAgICAgIHJldHVybjsKICAgIGNhc2UgNDoKICAgICAgICAvKiBObyBzZWVrIGVuYWJsZWQgKi8KICAgICAgICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIEZEX1NSMF9BQk5URVJNLCAweDAwLCAweDAwKTsKICAgICAgICBmZGN0cmwtPmZpZm9bM10gPSBrdDsKICAgICAgICBmZGN0cmwtPmZpZm9bNF0gPSBraDsKICAgICAgICBmZGN0cmwtPmZpZm9bNV0gPSBrczsKICAgICAgICByZXR1cm47CiAgICBjYXNlIDE6CiAgICAgICAgZmRjdHJsLT5kYXRhX3N0YXRlIHw9IEZEX1NUQVRFX1NFRUs7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGJyZWFrOwogICAgfQogICAgbWVtc2V0KGZkY3RybC0+ZmlmbywgMCwgRkRfU0VDVE9SX0xFTik7CiAgICBpZiAoY3VyX2Rydi0+YnMgPT0gTlVMTCB8fAogICAgICAgIGJkcnZfd3JpdGUoY3VyX2Rydi0+YnMsIGZkX3NlY3RvcihjdXJfZHJ2KSwgZmRjdHJsLT5maWZvLCAxKSA8IDApIHsKICAgICAgICBGTE9QUFlfRVJST1IoImZvcm1hdHRpbmcgc2VjdG9yICVkXG4iLCBmZF9zZWN0b3IoY3VyX2RydikpOwogICAgICAgIGZkY3RybF9zdG9wX3RyYW5zZmVyKGZkY3RybCwgRkRfU1IwX0FCTlRFUk0gfCBGRF9TUjBfU0VFSywgMHgwMCwgMHgwMCk7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChjdXJfZHJ2LT5zZWN0ID09IGN1cl9kcnYtPmxhc3Rfc2VjdCkgewogICAgICAgICAgICBmZGN0cmwtPmRhdGFfc3RhdGUgJj0gfkZEX1NUQVRFX0ZPUk1BVDsKICAgICAgICAgICAgLyogTGFzdCBzZWN0b3IgZG9uZSAqLwogICAgICAgICAgICBpZiAoRkRfRElEX1NFRUsoZmRjdHJsLT5kYXRhX3N0YXRlKSkKICAgICAgICAgICAgICAgIGZkY3RybF9zdG9wX3RyYW5zZmVyKGZkY3RybCwgRkRfU1IwX1NFRUssIDB4MDAsIDB4MDApOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIDB4MDAsIDB4MDAsIDB4MDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qIE1vcmUgdG8gZG8gKi8KICAgICAgICAgICAgZmRjdHJsLT5kYXRhX3BvcyA9IDA7CiAgICAgICAgICAgIGZkY3RybC0+ZGF0YV9sZW4gPSA0OwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9sb2NrIChmZGN0cmxfdCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICBmZGN0cmwtPmxvY2sgPSAoZmRjdHJsLT5maWZvWzBdICYgMHg4MCkgPyAxIDogMDsKICAgIGZkY3RybC0+Zmlmb1swXSA9IGZkY3RybC0+bG9jayA8PCA0OwogICAgZmRjdHJsX3NldF9maWZvKGZkY3RybCwgMSwgZmRjdHJsLT5sb2NrKTsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9kdW1wcmVnIChmZGN0cmxfdCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICBmZHJpdmVfdCAqY3VyX2RydiA9IGdldF9jdXJfZHJ2KGZkY3RybCk7CgogICAgLyogRHJpdmVzIHBvc2l0aW9uICovCiAgICBmZGN0cmwtPmZpZm9bMF0gPSBkcnYwKGZkY3RybCktPnRyYWNrOwogICAgZmRjdHJsLT5maWZvWzFdID0gZHJ2MShmZGN0cmwpLT50cmFjazsKI2lmIE1BWF9GRCA9PSA0CiAgICBmZGN0cmwtPmZpZm9bMl0gPSBkcnYyKGZkY3RybCktPnRyYWNrOwogICAgZmRjdHJsLT5maWZvWzNdID0gZHJ2MyhmZGN0cmwpLT50cmFjazsKI2Vsc2UKICAgIGZkY3RybC0+Zmlmb1syXSA9IDA7CiAgICBmZGN0cmwtPmZpZm9bM10gPSAwOwojZW5kaWYKICAgIC8qIHRpbWVycyAqLwogICAgZmRjdHJsLT5maWZvWzRdID0gZmRjdHJsLT50aW1lcjA7CiAgICBmZGN0cmwtPmZpZm9bNV0gPSAoZmRjdHJsLT50aW1lcjEgPDwgMSkgfCAoZmRjdHJsLT5kb3IgJiBGRF9ET1JfRE1BRU4gPyAxIDogMCk7CiAgICBmZGN0cmwtPmZpZm9bNl0gPSBjdXJfZHJ2LT5sYXN0X3NlY3Q7CiAgICBmZGN0cmwtPmZpZm9bN10gPSAoZmRjdHJsLT5sb2NrIDw8IDcpIHwKICAgICAgICAoY3VyX2Rydi0+cGVycGVuZGljdWxhciA8PCAyKTsKICAgIGZkY3RybC0+Zmlmb1s4XSA9IGZkY3RybC0+Y29uZmlnOwogICAgZmRjdHJsLT5maWZvWzldID0gZmRjdHJsLT5wcmVjb21wX3RyazsKICAgIGZkY3RybF9zZXRfZmlmbyhmZGN0cmwsIDEwLCAwKTsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV92ZXJzaW9uIChmZGN0cmxfdCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICAvKiBDb250cm9sbGVyJ3MgdmVyc2lvbiAqLwogICAgZmRjdHJsLT5maWZvWzBdID0gZmRjdHJsLT52ZXJzaW9uOwogICAgZmRjdHJsX3NldF9maWZvKGZkY3RybCwgMSwgMSk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfcGFydGlkIChmZGN0cmxfdCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICBmZGN0cmwtPmZpZm9bMF0gPSAweDQxOyAvKiBTdGVwcGluZyAxICovCiAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCAxLCAwKTsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9yZXN0b3JlIChmZGN0cmxfdCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICBmZHJpdmVfdCAqY3VyX2RydiA9IGdldF9jdXJfZHJ2KGZkY3RybCk7CgogICAgLyogRHJpdmVzIHBvc2l0aW9uICovCiAgICBkcnYwKGZkY3RybCktPnRyYWNrID0gZmRjdHJsLT5maWZvWzNdOwogICAgZHJ2MShmZGN0cmwpLT50cmFjayA9IGZkY3RybC0+Zmlmb1s0XTsKI2lmIE1BWF9GRCA9PSA0CiAgICBkcnYyKGZkY3RybCktPnRyYWNrID0gZmRjdHJsLT5maWZvWzVdOwogICAgZHJ2MyhmZGN0cmwpLT50cmFjayA9IGZkY3RybC0+Zmlmb1s2XTsKI2VuZGlmCiAgICAvKiB0aW1lcnMgKi8KICAgIGZkY3RybC0+dGltZXIwID0gZmRjdHJsLT5maWZvWzddOwogICAgZmRjdHJsLT50aW1lcjEgPSBmZGN0cmwtPmZpZm9bOF07CiAgICBjdXJfZHJ2LT5sYXN0X3NlY3QgPSBmZGN0cmwtPmZpZm9bOV07CiAgICBmZGN0cmwtPmxvY2sgPSBmZGN0cmwtPmZpZm9bMTBdID4+IDc7CiAgICBjdXJfZHJ2LT5wZXJwZW5kaWN1bGFyID0gKGZkY3RybC0+Zmlmb1sxMF0gPj4gMikgJiAweEY7CiAgICBmZGN0cmwtPmNvbmZpZyA9IGZkY3RybC0+Zmlmb1sxMV07CiAgICBmZGN0cmwtPnByZWNvbXBfdHJrID0gZmRjdHJsLT5maWZvWzEyXTsKICAgIGZkY3RybC0+cHdyZCA9IGZkY3RybC0+Zmlmb1sxM107CiAgICBmZGN0cmxfcmVzZXRfZmlmbyhmZGN0cmwpOwp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfaGFuZGxlX3NhdmUgKGZkY3RybF90ICpmZGN0cmwsIGludCBkaXJlY3Rpb24pCnsKICAgIGZkcml2ZV90ICpjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKCiAgICBmZGN0cmwtPmZpZm9bMF0gPSAwOwogICAgZmRjdHJsLT5maWZvWzFdID0gMDsKICAgIC8qIERyaXZlcyBwb3NpdGlvbiAqLwogICAgZmRjdHJsLT5maWZvWzJdID0gZHJ2MChmZGN0cmwpLT50cmFjazsKICAgIGZkY3RybC0+Zmlmb1szXSA9IGRydjEoZmRjdHJsKS0+dHJhY2s7CiNpZiBNQVhfRkQgPT0gNAogICAgZmRjdHJsLT5maWZvWzRdID0gZHJ2MihmZGN0cmwpLT50cmFjazsKICAgIGZkY3RybC0+Zmlmb1s1XSA9IGRydjMoZmRjdHJsKS0+dHJhY2s7CiNlbHNlCiAgICBmZGN0cmwtPmZpZm9bNF0gPSAwOwogICAgZmRjdHJsLT5maWZvWzVdID0gMDsKI2VuZGlmCiAgICAvKiB0aW1lcnMgKi8KICAgIGZkY3RybC0+Zmlmb1s2XSA9IGZkY3RybC0+dGltZXIwOwogICAgZmRjdHJsLT5maWZvWzddID0gZmRjdHJsLT50aW1lcjE7CiAgICBmZGN0cmwtPmZpZm9bOF0gPSBjdXJfZHJ2LT5sYXN0X3NlY3Q7CiAgICBmZGN0cmwtPmZpZm9bOV0gPSAoZmRjdHJsLT5sb2NrIDw8IDcpIHwKICAgICAgICAoY3VyX2Rydi0+cGVycGVuZGljdWxhciA8PCAyKTsKICAgIGZkY3RybC0+Zmlmb1sxMF0gPSBmZGN0cmwtPmNvbmZpZzsKICAgIGZkY3RybC0+Zmlmb1sxMV0gPSBmZGN0cmwtPnByZWNvbXBfdHJrOwogICAgZmRjdHJsLT5maWZvWzEyXSA9IGZkY3RybC0+cHdyZDsKICAgIGZkY3RybC0+Zmlmb1sxM10gPSAwOwogICAgZmRjdHJsLT5maWZvWzE0XSA9IDA7CiAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCAxNSwgMSk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfcmVhZGlkIChmZGN0cmxfdCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICBmZHJpdmVfdCAqY3VyX2RydiA9IGdldF9jdXJfZHJ2KGZkY3RybCk7CgogICAgLyogWFhYOiBzaG91bGQgc2V0IG1haW4gc3RhdHVzIHJlZ2lzdGVyIHRvIGJ1c3kgKi8KICAgIGN1cl9kcnYtPmhlYWQgPSAoZmRjdHJsLT5maWZvWzFdID4+IDIpICYgMTsKICAgIHFlbXVfbW9kX3RpbWVyKGZkY3RybC0+cmVzdWx0X3RpbWVyLAogICAgICAgICAgICAgICAgICAgcWVtdV9nZXRfY2xvY2sodm1fY2xvY2spICsgKHRpY2tzX3Blcl9zZWMgLyA1MCkpOwp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfaGFuZGxlX2Zvcm1hdF90cmFjayAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgZmRyaXZlX3QgKmN1cl9kcnY7CgogICAgU0VUX0NVUl9EUlYoZmRjdHJsLCBmZGN0cmwtPmZpZm9bMV0gJiBGRF9ET1JfU0VMTUFTSyk7CiAgICBjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKICAgIGZkY3RybC0+ZGF0YV9zdGF0ZSB8PSBGRF9TVEFURV9GT1JNQVQ7CiAgICBpZiAoZmRjdHJsLT5maWZvWzBdICYgMHg4MCkKICAgICAgICBmZGN0cmwtPmRhdGFfc3RhdGUgfD0gRkRfU1RBVEVfTVVMVEk7CiAgICBlbHNlCiAgICAgICAgZmRjdHJsLT5kYXRhX3N0YXRlICY9IH5GRF9TVEFURV9NVUxUSTsKICAgIGZkY3RybC0+ZGF0YV9zdGF0ZSAmPSB+RkRfU1RBVEVfU0VFSzsKICAgIGN1cl9kcnYtPmJwcyA9CiAgICAgICAgZmRjdHJsLT5maWZvWzJdID4gNyA/IDE2Mzg0IDogMTI4IDw8IGZkY3RybC0+Zmlmb1syXTsKI2lmIDAKICAgIGN1cl9kcnYtPmxhc3Rfc2VjdCA9CiAgICAgICAgY3VyX2Rydi0+ZmxhZ3MgJiBGRElTS19EQkxfU0lERVMgPyBmZGN0cmwtPmZpZm9bM10gOgogICAgICAgIGZkY3RybC0+Zmlmb1szXSAvIDI7CiNlbHNlCiAgICBjdXJfZHJ2LT5sYXN0X3NlY3QgPSBmZGN0cmwtPmZpZm9bM107CiNlbmRpZgogICAgLyogVE9ETzogaW1wbGVtZW50IGZvcm1hdCB1c2luZyBETUEgZXhwZWN0ZWQgYnkgdGhlIEJvY2hzIEJJT1MKICAgICAqIGFuZCBMaW51eCBmZGZvcm1hdCAocmVhZCAzIGJ5dGVzIHBlciBzZWN0b3IgdmlhIERNQSBhbmQgZmlsbAogICAgICogdGhlIHNlY3RvciB3aXRoIHRoZSBzcGVjaWZpZWQgZmlsbCBieXRlCiAgICAgKi8KICAgIGZkY3RybC0+ZGF0YV9zdGF0ZSAmPSB+RkRfU1RBVEVfRk9STUFUOwogICAgZmRjdHJsX3N0b3BfdHJhbnNmZXIoZmRjdHJsLCAweDAwLCAweDAwLCAweDAwKTsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9zcGVjaWZ5IChmZGN0cmxfdCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICBmZGN0cmwtPnRpbWVyMCA9IChmZGN0cmwtPmZpZm9bMV0gPj4gNCkgJiAweEY7CiAgICBmZGN0cmwtPnRpbWVyMSA9IGZkY3RybC0+Zmlmb1syXSA+PiAxOwogICAgaWYgKGZkY3RybC0+Zmlmb1syXSAmIDEpCiAgICAgICAgZmRjdHJsLT5kb3IgJj0gfkZEX0RPUl9ETUFFTjsKICAgIGVsc2UKICAgICAgICBmZGN0cmwtPmRvciB8PSBGRF9ET1JfRE1BRU47CiAgICAvKiBObyByZXN1bHQgYmFjayAqLwogICAgZmRjdHJsX3Jlc2V0X2ZpZm8oZmRjdHJsKTsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9zZW5zZV9kcml2ZV9zdGF0dXMgKGZkY3RybF90ICpmZGN0cmwsIGludCBkaXJlY3Rpb24pCnsKICAgIGZkcml2ZV90ICpjdXJfZHJ2OwoKICAgIFNFVF9DVVJfRFJWKGZkY3RybCwgZmRjdHJsLT5maWZvWzFdICYgRkRfRE9SX1NFTE1BU0spOwogICAgY3VyX2RydiA9IGdldF9jdXJfZHJ2KGZkY3RybCk7CiAgICBjdXJfZHJ2LT5oZWFkID0gKGZkY3RybC0+Zmlmb1sxXSA+PiAyKSAmIDE7CiAgICAvKiAxIEJ5dGUgc3RhdHVzIGJhY2sgKi8KICAgIGZkY3RybC0+Zmlmb1swXSA9IChjdXJfZHJ2LT5ybyA8PCA2KSB8CiAgICAgICAgKGN1cl9kcnYtPnRyYWNrID09IDAgPyAweDEwIDogMHgwMCkgfAogICAgICAgIChjdXJfZHJ2LT5oZWFkIDw8IDIpIHwKICAgICAgICBHRVRfQ1VSX0RSVihmZGN0cmwpIHwKICAgICAgICAweDI4OwogICAgZmRjdHJsX3NldF9maWZvKGZkY3RybCwgMSwgMCk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfcmVjYWxpYnJhdGUgKGZkY3RybF90ICpmZGN0cmwsIGludCBkaXJlY3Rpb24pCnsKICAgIGZkcml2ZV90ICpjdXJfZHJ2OwoKICAgIFNFVF9DVVJfRFJWKGZkY3RybCwgZmRjdHJsLT5maWZvWzFdICYgRkRfRE9SX1NFTE1BU0spOwogICAgY3VyX2RydiA9IGdldF9jdXJfZHJ2KGZkY3RybCk7CiAgICBmZF9yZWNhbGlicmF0ZShjdXJfZHJ2KTsKICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7CiAgICAvKiBSYWlzZSBJbnRlcnJ1cHQgKi8KICAgIGZkY3RybF9yYWlzZV9pcnEoZmRjdHJsLCBGRF9TUjBfU0VFSyk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfc2Vuc2VfaW50ZXJydXB0X3N0YXR1cyAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgZmRyaXZlX3QgKmN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwoKICAgIGlmKGZkY3RybC0+cmVzZXRfc2Vuc2VpID4gMCkgewogICAgICAgIGZkY3RybC0+Zmlmb1swXSA9CiAgICAgICAgICAgIEZEX1NSMF9SRFlDSEcgKyBGRF9SRVNFVF9TRU5TRUlfQ09VTlQgLSBmZGN0cmwtPnJlc2V0X3NlbnNlaTsKICAgICAgICBmZGN0cmwtPnJlc2V0X3NlbnNlaS0tOwogICAgfSBlbHNlIHsKICAgICAgICAvKiBYWFg6IHN0YXR1czAgaGFuZGxpbmcgaXMgYnJva2VuIGZvciByZWFkL3dyaXRlCiAgICAgICAgICAgY29tbWFuZHMsIHNvIHdlIGRvIHRoaXMgaGFjay4gSXQgc2hvdWxkIGJlIHN1cHByZXNzZWQKICAgICAgICAgICBBU0FQICovCiAgICAgICAgZmRjdHJsLT5maWZvWzBdID0KICAgICAgICAgICAgRkRfU1IwX1NFRUsgfCAoY3VyX2Rydi0+aGVhZCA8PCAyKSB8IEdFVF9DVVJfRFJWKGZkY3RybCk7CiAgICB9CgogICAgZmRjdHJsLT5maWZvWzFdID0gY3VyX2Rydi0+dHJhY2s7CiAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCAyLCAwKTsKICAgIGZkY3RybF9yZXNldF9pcnEoZmRjdHJsKTsKICAgIGZkY3RybC0+c3RhdHVzMCA9IEZEX1NSMF9SRFlDSEc7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfc2VlayAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgZmRyaXZlX3QgKmN1cl9kcnY7CgogICAgU0VUX0NVUl9EUlYoZmRjdHJsLCBmZGN0cmwtPmZpZm9bMV0gJiBGRF9ET1JfU0VMTUFTSyk7CiAgICBjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7CiAgICBpZiAoZmRjdHJsLT5maWZvWzJdID4gY3VyX2Rydi0+bWF4X3RyYWNrKSB7CiAgICAgICAgZmRjdHJsX3JhaXNlX2lycShmZGN0cmwsIEZEX1NSMF9BQk5URVJNIHwgRkRfU1IwX1NFRUspOwogICAgfSBlbHNlIHsKICAgICAgICBjdXJfZHJ2LT50cmFjayA9IGZkY3RybC0+Zmlmb1syXTsKICAgICAgICAvKiBSYWlzZSBJbnRlcnJ1cHQgKi8KICAgICAgICBmZGN0cmxfcmFpc2VfaXJxKGZkY3RybCwgRkRfU1IwX1NFRUspOwogICAgfQp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfaGFuZGxlX3BlcnBlbmRpY3VsYXJfbW9kZSAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgZmRyaXZlX3QgKmN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwoKICAgIGlmIChmZGN0cmwtPmZpZm9bMV0gJiAweDgwKQogICAgICAgIGN1cl9kcnYtPnBlcnBlbmRpY3VsYXIgPSBmZGN0cmwtPmZpZm9bMV0gJiAweDc7CiAgICAvKiBObyByZXN1bHQgYmFjayAqLwogICAgZmRjdHJsX3Jlc2V0X2ZpZm8oZmRjdHJsKTsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9jb25maWd1cmUgKGZkY3RybF90ICpmZGN0cmwsIGludCBkaXJlY3Rpb24pCnsKICAgIGZkY3RybC0+Y29uZmlnID0gZmRjdHJsLT5maWZvWzJdOwogICAgZmRjdHJsLT5wcmVjb21wX3RyayA9ICBmZGN0cmwtPmZpZm9bM107CiAgICAvKiBObyByZXN1bHQgYmFjayAqLwogICAgZmRjdHJsX3Jlc2V0X2ZpZm8oZmRjdHJsKTsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9wb3dlcmRvd25fbW9kZSAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgZmRjdHJsLT5wd3JkID0gZmRjdHJsLT5maWZvWzFdOwogICAgZmRjdHJsLT5maWZvWzBdID0gZmRjdHJsLT5maWZvWzFdOwogICAgZmRjdHJsX3NldF9maWZvKGZkY3RybCwgMSwgMSk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfb3B0aW9uIChmZGN0cmxfdCAqZmRjdHJsLCBpbnQgZGlyZWN0aW9uKQp7CiAgICAvKiBObyByZXN1bHQgYmFjayAqLwogICAgZmRjdHJsX3Jlc2V0X2ZpZm8oZmRjdHJsKTsKfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9kcml2ZV9zcGVjaWZpY2F0aW9uX2NvbW1hbmQgKGZkY3RybF90ICpmZGN0cmwsIGludCBkaXJlY3Rpb24pCnsKICAgIGZkcml2ZV90ICpjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKCiAgICBpZiAoZmRjdHJsLT5maWZvW2ZkY3RybC0+ZGF0YV9wb3MgLSAxXSAmIDB4ODApIHsKICAgICAgICAvKiBDb21tYW5kIHBhcmFtZXRlcnMgZG9uZSAqLwogICAgICAgIGlmIChmZGN0cmwtPmZpZm9bZmRjdHJsLT5kYXRhX3BvcyAtIDFdICYgMHg0MCkgewogICAgICAgICAgICBmZGN0cmwtPmZpZm9bMF0gPSBmZGN0cmwtPmZpZm9bMV07CiAgICAgICAgICAgIGZkY3RybC0+Zmlmb1syXSA9IDA7CiAgICAgICAgICAgIGZkY3RybC0+Zmlmb1szXSA9IDA7CiAgICAgICAgICAgIGZkY3RybF9zZXRfZmlmbyhmZGN0cmwsIDQsIDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChmZGN0cmwtPmRhdGFfbGVuID4gNykgewogICAgICAgIC8qIEVSUk9SICovCiAgICAgICAgZmRjdHJsLT5maWZvWzBdID0gMHg4MCB8CiAgICAgICAgICAgIChjdXJfZHJ2LT5oZWFkIDw8IDIpIHwgR0VUX0NVUl9EUlYoZmRjdHJsKTsKICAgICAgICBmZGN0cmxfc2V0X2ZpZm8oZmRjdHJsLCAxLCAxKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgZmRjdHJsX2hhbmRsZV9yZWxhdGl2ZV9zZWVrX291dCAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgZmRyaXZlX3QgKmN1cl9kcnY7CgogICAgU0VUX0NVUl9EUlYoZmRjdHJsLCBmZGN0cmwtPmZpZm9bMV0gJiBGRF9ET1JfU0VMTUFTSyk7CiAgICBjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKICAgIGlmIChmZGN0cmwtPmZpZm9bMl0gKyBjdXJfZHJ2LT50cmFjayA+PSBjdXJfZHJ2LT5tYXhfdHJhY2spIHsKICAgICAgICBjdXJfZHJ2LT50cmFjayA9IGN1cl9kcnYtPm1heF90cmFjayAtIDE7CiAgICB9IGVsc2UgewogICAgICAgIGN1cl9kcnYtPnRyYWNrICs9IGZkY3RybC0+Zmlmb1syXTsKICAgIH0KICAgIGZkY3RybF9yZXNldF9maWZvKGZkY3RybCk7CiAgICAvKiBSYWlzZSBJbnRlcnJ1cHQgKi8KICAgIGZkY3RybF9yYWlzZV9pcnEoZmRjdHJsLCBGRF9TUjBfU0VFSyk7Cn0KCnN0YXRpYyB2b2lkIGZkY3RybF9oYW5kbGVfcmVsYXRpdmVfc2Vla19pbiAoZmRjdHJsX3QgKmZkY3RybCwgaW50IGRpcmVjdGlvbikKewogICAgZmRyaXZlX3QgKmN1cl9kcnY7CgogICAgU0VUX0NVUl9EUlYoZmRjdHJsLCBmZGN0cmwtPmZpZm9bMV0gJiBGRF9ET1JfU0VMTUFTSyk7CiAgICBjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKICAgIGlmIChmZGN0cmwtPmZpZm9bMl0gPiBjdXJfZHJ2LT50cmFjaykgewogICAgICAgIGN1cl9kcnYtPnRyYWNrID0gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgY3VyX2Rydi0+dHJhY2sgLT0gZmRjdHJsLT5maWZvWzJdOwogICAgfQogICAgZmRjdHJsX3Jlc2V0X2ZpZm8oZmRjdHJsKTsKICAgIC8qIFJhaXNlIEludGVycnVwdCAqLwogICAgZmRjdHJsX3JhaXNlX2lycShmZGN0cmwsIEZEX1NSMF9TRUVLKTsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICB1aW50OF90IHZhbHVlOwogICAgdWludDhfdCBtYXNrOwogICAgY29uc3QgY2hhciogbmFtZTsKICAgIGludCBwYXJhbWV0ZXJzOwogICAgdm9pZCAoKmhhbmRsZXIpKGZkY3RybF90ICpmZGN0cmwsIGludCBkaXJlY3Rpb24pOwogICAgaW50IGRpcmVjdGlvbjsKfSBoYW5kbGVyc1tdID0gewogICAgeyBGRF9DTURfUkVBRCwgMHgxZiwgIlJFQUQiLCA4LCBmZGN0cmxfc3RhcnRfdHJhbnNmZXIsIEZEX0RJUl9SRUFEIH0sCiAgICB7IEZEX0NNRF9XUklURSwgMHgzZiwgIldSSVRFIiwgOCwgZmRjdHJsX3N0YXJ0X3RyYW5zZmVyLCBGRF9ESVJfV1JJVEUgfSwKICAgIHsgRkRfQ01EX1NFRUssIDB4ZmYsICJTRUVLIiwgMiwgZmRjdHJsX2hhbmRsZV9zZWVrIH0sCiAgICB7IEZEX0NNRF9TRU5TRV9JTlRFUlJVUFRfU1RBVFVTLCAweGZmLCAiU0VOU0UgSU5URVJSVVBUIFNUQVRVUyIsIDAsIGZkY3RybF9oYW5kbGVfc2Vuc2VfaW50ZXJydXB0X3N0YXR1cyB9LAogICAgeyBGRF9DTURfUkVDQUxJQlJBVEUsIDB4ZmYsICJSRUNBTElCUkFURSIsIDEsIGZkY3RybF9oYW5kbGVfcmVjYWxpYnJhdGUgfSwKICAgIHsgRkRfQ01EX0ZPUk1BVF9UUkFDSywgMHhiZiwgIkZPUk1BVCBUUkFDSyIsIDUsIGZkY3RybF9oYW5kbGVfZm9ybWF0X3RyYWNrIH0sCiAgICB7IEZEX0NNRF9SRUFEX1RSQUNLLCAweGJmLCAiUkVBRCBUUkFDSyIsIDgsIGZkY3RybF9zdGFydF90cmFuc2ZlciwgRkRfRElSX1JFQUQgfSwKICAgIHsgRkRfQ01EX1JFU1RPUkUsIDB4ZmYsICJSRVNUT1JFIiwgMTcsIGZkY3RybF9oYW5kbGVfcmVzdG9yZSB9LCAvKiBwYXJ0IG9mIFJFQUQgREVMRVRFRCBEQVRBICovCiAgICB7IEZEX0NNRF9TQVZFLCAweGZmLCAiU0FWRSIsIDAsIGZkY3RybF9oYW5kbGVfc2F2ZSB9LCAvKiBwYXJ0IG9mIFJFQUQgREVMRVRFRCBEQVRBICovCiAgICB7IEZEX0NNRF9SRUFEX0RFTEVURUQsIDB4MWYsICJSRUFEIERFTEVURUQgREFUQSIsIDgsIGZkY3RybF9zdGFydF90cmFuc2Zlcl9kZWwsIEZEX0RJUl9SRUFEIH0sCiAgICB7IEZEX0NNRF9TQ0FOX0VRVUFMLCAweDFmLCAiU0NBTiBFUVVBTCIsIDgsIGZkY3RybF9zdGFydF90cmFuc2ZlciwgRkRfRElSX1NDQU5FIH0sCiAgICB7IEZEX0NNRF9WRVJJRlksIDB4MWYsICJWRVJJRlkiLCA4LCBmZGN0cmxfdW5pbXBsZW1lbnRlZCB9LAogICAgeyBGRF9DTURfU0NBTl9MT1dfT1JfRVFVQUwsIDB4MWYsICJTQ0FOIExPVyBPUiBFUVVBTCIsIDgsIGZkY3RybF9zdGFydF90cmFuc2ZlciwgRkRfRElSX1NDQU5MIH0sCiAgICB7IEZEX0NNRF9TQ0FOX0hJR0hfT1JfRVFVQUwsIDB4MWYsICJTQ0FOIEhJR0ggT1IgRVFVQUwiLCA4LCBmZGN0cmxfc3RhcnRfdHJhbnNmZXIsIEZEX0RJUl9TQ0FOSCB9LAogICAgeyBGRF9DTURfV1JJVEVfREVMRVRFRCwgMHgzZiwgIldSSVRFIERFTEVURUQgREFUQSIsIDgsIGZkY3RybF9zdGFydF90cmFuc2Zlcl9kZWwsIEZEX0RJUl9XUklURSB9LAogICAgeyBGRF9DTURfUkVBRF9JRCwgMHhiZiwgIlJFQUQgSUQiLCAxLCBmZGN0cmxfaGFuZGxlX3JlYWRpZCB9LAogICAgeyBGRF9DTURfU1BFQ0lGWSwgMHhmZiwgIlNQRUNJRlkiLCAyLCBmZGN0cmxfaGFuZGxlX3NwZWNpZnkgfSwKICAgIHsgRkRfQ01EX1NFTlNFX0RSSVZFX1NUQVRVUywgMHhmZiwgIlNFTlNFIERSSVZFIFNUQVRVUyIsIDEsIGZkY3RybF9oYW5kbGVfc2Vuc2VfZHJpdmVfc3RhdHVzIH0sCiAgICB7IEZEX0NNRF9QRVJQRU5ESUNVTEFSX01PREUsIDB4ZmYsICJQRVJQRU5ESUNVTEFSIE1PREUiLCAxLCBmZGN0cmxfaGFuZGxlX3BlcnBlbmRpY3VsYXJfbW9kZSB9LAogICAgeyBGRF9DTURfQ09ORklHVVJFLCAweGZmLCAiQ09ORklHVVJFIiwgMywgZmRjdHJsX2hhbmRsZV9jb25maWd1cmUgfSwKICAgIHsgRkRfQ01EX1BPV0VSRE9XTl9NT0RFLCAweGZmLCAiUE9XRVJET1dOIE1PREUiLCAyLCBmZGN0cmxfaGFuZGxlX3Bvd2VyZG93bl9tb2RlIH0sCiAgICB7IEZEX0NNRF9PUFRJT04sIDB4ZmYsICJPUFRJT04iLCAxLCBmZGN0cmxfaGFuZGxlX29wdGlvbiB9LAogICAgeyBGRF9DTURfRFJJVkVfU1BFQ0lGSUNBVElPTl9DT01NQU5ELCAweGZmLCAiRFJJVkUgU1BFQ0lGSUNBVElPTiBDT01NQU5EIiwgNSwgZmRjdHJsX2hhbmRsZV9kcml2ZV9zcGVjaWZpY2F0aW9uX2NvbW1hbmQgfSwKICAgIHsgRkRfQ01EX1JFTEFUSVZFX1NFRUtfT1VULCAweGZmLCAiUkVMQVRJVkUgU0VFSyBPVVQiLCAyLCBmZGN0cmxfaGFuZGxlX3JlbGF0aXZlX3NlZWtfb3V0IH0sCiAgICB7IEZEX0NNRF9GT1JNQVRfQU5EX1dSSVRFLCAweGZmLCAiRk9STUFUIEFORCBXUklURSIsIDEwLCBmZGN0cmxfdW5pbXBsZW1lbnRlZCB9LAogICAgeyBGRF9DTURfUkVMQVRJVkVfU0VFS19JTiwgMHhmZiwgIlJFTEFUSVZFIFNFRUsgSU4iLCAyLCBmZGN0cmxfaGFuZGxlX3JlbGF0aXZlX3NlZWtfaW4gfSwKICAgIHsgRkRfQ01EX0xPQ0ssIDB4N2YsICJMT0NLIiwgMCwgZmRjdHJsX2hhbmRsZV9sb2NrIH0sCiAgICB7IEZEX0NNRF9EVU1QUkVHLCAweGZmLCAiRFVNUFJFRyIsIDAsIGZkY3RybF9oYW5kbGVfZHVtcHJlZyB9LAogICAgeyBGRF9DTURfVkVSU0lPTiwgMHhmZiwgIlZFUlNJT04iLCAwLCBmZGN0cmxfaGFuZGxlX3ZlcnNpb24gfSwKICAgIHsgRkRfQ01EX1BBUlRfSUQsIDB4ZmYsICJQQVJUIElEIiwgMCwgZmRjdHJsX2hhbmRsZV9wYXJ0aWQgfSwKICAgIHsgRkRfQ01EX1dSSVRFLCAweDFmLCAiV1JJVEUgKEJlT1MpIiwgOCwgZmRjdHJsX3N0YXJ0X3RyYW5zZmVyLCBGRF9ESVJfV1JJVEUgfSwgLyogbm90IGluIHNwZWNpZmljYXRpb24gOyBCZU9TIDQuNSBidWcgKi8KICAgIHsgMCwgMCwgInVua25vd24iLCAwLCBmZGN0cmxfdW5pbXBsZW1lbnRlZCB9LCAvKiBkZWZhdWx0IGhhbmRsZXIgKi8KfTsKLyogQXNzb2NpYXRlIGNvbW1hbmQgdG8gYW4gaW5kZXggaW4gdGhlICdoYW5kbGVycycgYXJyYXkgKi8Kc3RhdGljIHVpbnQ4X3QgY29tbWFuZF90b19oYW5kbGVyWzI1Nl07CgpzdGF0aWMgdm9pZCBmZGN0cmxfd3JpdGVfZGF0YSAoZmRjdHJsX3QgKmZkY3RybCwgdWludDMyX3QgdmFsdWUpCnsKICAgIGZkcml2ZV90ICpjdXJfZHJ2OwogICAgaW50IHBvczsKCiAgICAvKiBSZXNldCBtb2RlICovCiAgICBpZiAoIShmZGN0cmwtPmRvciAmIEZEX0RPUl9uUkVTRVQpKSB7CiAgICAgICAgRkxPUFBZX0RQUklOVEYoIkZsb3BweSBjb250cm9sbGVyIGluIFJFU0VUIHN0YXRlICFcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghKGZkY3RybC0+bXNyICYgRkRfTVNSX1JRTSkgfHwgKGZkY3RybC0+bXNyICYgRkRfTVNSX0RJTykpIHsKICAgICAgICBGTE9QUFlfRVJST1IoImNvbnRyb2xsZXIgbm90IHJlYWR5IGZvciB3cml0aW5nXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBmZGN0cmwtPmRzciAmPSB+RkRfRFNSX1BXUkRPV047CiAgICAvKiBJcyBpdCB3cml0ZSBjb21tYW5kIHRpbWUgPyAqLwogICAgaWYgKGZkY3RybC0+bXNyICYgRkRfTVNSX05PTkRNQSkgewogICAgICAgIC8qIEZJRk8gZGF0YSB3cml0ZSAqLwogICAgICAgIHBvcyA9IGZkY3RybC0+ZGF0YV9wb3MrKzsKICAgICAgICBwb3MgJT0gRkRfU0VDVE9SX0xFTjsKICAgICAgICBmZGN0cmwtPmZpZm9bcG9zXSA9IHZhbHVlOwogICAgICAgIGlmIChwb3MgPT0gRkRfU0VDVE9SX0xFTiAtIDEgfHwKICAgICAgICAgICAgZmRjdHJsLT5kYXRhX3BvcyA9PSBmZGN0cmwtPmRhdGFfbGVuKSB7CiAgICAgICAgICAgIGN1cl9kcnYgPSBnZXRfY3VyX2RydihmZGN0cmwpOwogICAgICAgICAgICBpZiAoYmRydl93cml0ZShjdXJfZHJ2LT5icywgZmRfc2VjdG9yKGN1cl9kcnYpLCBmZGN0cmwtPmZpZm8sIDEpIDwgMCkgewogICAgICAgICAgICAgICAgRkxPUFBZX0VSUk9SKCJ3cml0aW5nIHNlY3RvciAlZFxuIiwgZmRfc2VjdG9yKGN1cl9kcnYpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWZkY3RybF9zZWVrX3RvX25leHRfc2VjdChmZGN0cmwsIGN1cl9kcnYpKSB7CiAgICAgICAgICAgICAgICBGTE9QUFlfRFBSSU5URigiZXJyb3Igc2Vla2luZyB0byBuZXh0IHNlY3RvciAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX3NlY3RvcihjdXJfZHJ2KSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyogU3dpdGNoIGZyb20gdHJhbnNmZXIgbW9kZSB0byBzdGF0dXMgbW9kZQogICAgICAgICAqIHRoZW4gZnJvbSBzdGF0dXMgbW9kZSB0byBjb21tYW5kIG1vZGUKICAgICAgICAgKi8KICAgICAgICBpZiAoZmRjdHJsLT5kYXRhX3BvcyA9PSBmZGN0cmwtPmRhdGFfbGVuKQogICAgICAgICAgICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIEZEX1NSMF9TRUVLLCAweDAwLCAweDAwKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZmRjdHJsLT5kYXRhX3BvcyA9PSAwKSB7CiAgICAgICAgLyogQ29tbWFuZCAqLwogICAgICAgIHBvcyA9IGNvbW1hbmRfdG9faGFuZGxlclt2YWx1ZSAmIDB4ZmZdOwogICAgICAgIEZMT1BQWV9EUFJJTlRGKCIlcyBjb21tYW5kXG4iLCBoYW5kbGVyc1twb3NdLm5hbWUpOwogICAgICAgIGZkY3RybC0+ZGF0YV9sZW4gPSBoYW5kbGVyc1twb3NdLnBhcmFtZXRlcnMgKyAxOwogICAgfQoKICAgIEZMT1BQWV9EUFJJTlRGKCIlczogJTAyeFxuIiwgX19mdW5jX18sIHZhbHVlKTsKICAgIGZkY3RybC0+Zmlmb1tmZGN0cmwtPmRhdGFfcG9zKytdID0gdmFsdWU7CiAgICBpZiAoZmRjdHJsLT5kYXRhX3BvcyA9PSBmZGN0cmwtPmRhdGFfbGVuKSB7CiAgICAgICAgLyogV2Ugbm93IGhhdmUgYWxsIHBhcmFtZXRlcnMKICAgICAgICAgKiBhbmQgd2lsbCBiZSBhYmxlIHRvIHRyZWF0IHRoZSBjb21tYW5kCiAgICAgICAgICovCiAgICAgICAgaWYgKGZkY3RybC0+ZGF0YV9zdGF0ZSAmIEZEX1NUQVRFX0ZPUk1BVCkgewogICAgICAgICAgICBmZGN0cmxfZm9ybWF0X3NlY3RvcihmZGN0cmwpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBwb3MgPSBjb21tYW5kX3RvX2hhbmRsZXJbZmRjdHJsLT5maWZvWzBdICYgMHhmZl07CiAgICAgICAgRkxPUFBZX0RQUklOVEYoInRyZWF0ICVzIGNvbW1hbmRcbiIsIGhhbmRsZXJzW3Bvc10ubmFtZSk7CiAgICAgICAgKCpoYW5kbGVyc1twb3NdLmhhbmRsZXIpKGZkY3RybCwgaGFuZGxlcnNbcG9zXS5kaXJlY3Rpb24pOwogICAgfQp9CgpzdGF0aWMgdm9pZCBmZGN0cmxfcmVzdWx0X3RpbWVyKHZvaWQgKm9wYXF1ZSkKewogICAgZmRjdHJsX3QgKmZkY3RybCA9IG9wYXF1ZTsKICAgIGZkcml2ZV90ICpjdXJfZHJ2ID0gZ2V0X2N1cl9kcnYoZmRjdHJsKTsKCiAgICAvKiBQcmV0ZW5kIHdlIGFyZSBzcGlubmluZy4KICAgICAqIFRoaXMgaXMgbmVlZGVkIGZvciBDb2hlcmVudCwgd2hpY2ggdXNlcyBSRUFEIElEIHRvIGNoZWNrIGZvcgogICAgICogc2VjdG9yIGludGVybGVhdmluZy4KICAgICAqLwogICAgaWYgKGN1cl9kcnYtPmxhc3Rfc2VjdCAhPSAwKSB7CiAgICAgICAgY3VyX2Rydi0+c2VjdCA9IChjdXJfZHJ2LT5zZWN0ICUgY3VyX2Rydi0+bGFzdF9zZWN0KSArIDE7CiAgICB9CiAgICBmZGN0cmxfc3RvcF90cmFuc2ZlcihmZGN0cmwsIDB4MDAsIDB4MDAsIDB4MDApOwp9CgovKiBJbml0IGZ1bmN0aW9ucyAqLwpzdGF0aWMgdm9pZCBmZGN0cmxfaW5pdF9jb21tb24gKGZkY3RybF90ICpmZGN0cmwsIGludCBkbWFfY2hhbm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3BoeXNfYWRkcl90IGlvX2Jhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tEcml2ZXJTdGF0ZSAqKmZkcykKewogICAgaW50IGksIGo7CgogICAgLyogRmlsbCAnY29tbWFuZF90b19oYW5kbGVyJyBsb29rdXAgdGFibGUgKi8KICAgIGZvciAoaSA9IEFSUkFZX1NJWkUoaGFuZGxlcnMpIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZW9mKGNvbW1hbmRfdG9faGFuZGxlcik7IGorKykgewogICAgICAgICAgICBpZiAoKGogJiBoYW5kbGVyc1tpXS5tYXNrKSA9PSBoYW5kbGVyc1tpXS52YWx1ZSkKICAgICAgICAgICAgICAgIGNvbW1hbmRfdG9faGFuZGxlcltqXSA9IGk7CiAgICAgICAgfQogICAgfQoKICAgIEZMT1BQWV9EUFJJTlRGKCJpbml0IGNvbnRyb2xsZXJcbiIpOwogICAgZmRjdHJsLT5maWZvID0gcWVtdV9tZW1hbGlnbig1MTIsIEZEX1NFQ1RPUl9MRU4pOwogICAgZmRjdHJsLT5yZXN1bHRfdGltZXIgPSBxZW11X25ld190aW1lcih2bV9jbG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRjdHJsX3Jlc3VsdF90aW1lciwgZmRjdHJsKTsKCiAgICBmZGN0cmwtPnZlcnNpb24gPSAweDkwOyAvKiBJbnRlbCA4MjA3OCBjb250cm9sbGVyICovCiAgICBmZGN0cmwtPmRtYV9jaGFubiA9IGRtYV9jaGFubjsKICAgIGZkY3RybC0+aW9fYmFzZSA9IGlvX2Jhc2U7CiAgICBmZGN0cmwtPmNvbmZpZyA9IEZEX0NPTkZJR19FSVMgfCBGRF9DT05GSUdfRUZJRk87IC8qIEltcGxpY2l0IHNlZWssIHBvbGxpbmcgJiBGSUZPIGVuYWJsZWQgKi8KICAgIGlmIChmZGN0cmwtPmRtYV9jaGFubiAhPSAtMSkgewogICAgICAgIERNQV9yZWdpc3Rlcl9jaGFubmVsKGRtYV9jaGFubiwgJmZkY3RybF90cmFuc2Zlcl9oYW5kbGVyLCBmZGN0cmwpOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IE1BWF9GRDsgaSsrKSB7CiAgICAgICAgZmRfaW5pdCgmZmRjdHJsLT5kcml2ZXNbaV0sIGZkc1tpXSk7CiAgICB9CiAgICBmZGN0cmxfZXh0ZXJuYWxfcmVzZXQoZmRjdHJsKTsKICAgIHJlZ2lzdGVyX3NhdmV2bSgiZmRjIiwgaW9fYmFzZSwgMiwgZmRjX3NhdmUsIGZkY19sb2FkLCBmZGN0cmwpOwogICAgcWVtdV9yZWdpc3Rlcl9yZXNldChmZGN0cmxfZXh0ZXJuYWxfcmVzZXQsIGZkY3RybCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0ZEOyBpKyspIHsKICAgICAgICBmZF9yZXZhbGlkYXRlKCZmZGN0cmwtPmRyaXZlc1tpXSk7CiAgICB9Cn0KCmZkY3RybF90ICpmZGN0cmxfaW5pdCAocWVtdV9pcnEgaXJxLCBpbnQgZG1hX2NoYW5uLCBpbnQgbWVtX21hcHBlZCwKICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfcGh5c19hZGRyX3QgaW9fYmFzZSwKICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0RyaXZlclN0YXRlICoqZmRzKQp7CiAgICBEZXZpY2VTdGF0ZSAqZGV2OwogICAgU3lzQnVzRGV2aWNlICpzOwogICAgZmRjdHJsX3QgKmZkY3RybDsKCiAgICBkZXYgPSBxZGV2X2NyZWF0ZShOVUxMLCAiZmRjIik7CiAgICBxZGV2X3Byb3Bfc2V0X3VpbnQzMihkZXYsICJzdHJpY3RfaW8iLCAwKTsKICAgIHFkZXZfcHJvcF9zZXRfdWludDMyKGRldiwgIm1lbV9tYXBwZWQiLCBtZW1fbWFwcGVkKTsKICAgIHFkZXZfcHJvcF9zZXRfdWludDMyKGRldiwgInN1bjRtIiwgMCk7CiAgICBxZGV2X2luaXQoZGV2KTsKICAgIHMgPSBzeXNidXNfZnJvbV9xZGV2KGRldik7CiAgICBzeXNidXNfY29ubmVjdF9pcnEocywgMCwgaXJxKTsKICAgIGZkY3RybCA9IEZST01fU1lTQlVTKGZkY3RybF90LCBzKTsKICAgIGlmIChtZW1fbWFwcGVkKSB7CiAgICAgICAgc3lzYnVzX21taW9fbWFwKHMsIDAsIGlvX2Jhc2UpOwogICAgfSBlbHNlIHsKICAgICAgICByZWdpc3Rlcl9pb3BvcnRfcmVhZCgodWludDMyX3QpaW9fYmFzZSArIDB4MDEsIDUsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZkY3RybF9yZWFkX3BvcnQsIGZkY3RybCk7CiAgICAgICAgcmVnaXN0ZXJfaW9wb3J0X3JlYWQoKHVpbnQzMl90KWlvX2Jhc2UgKyAweDA3LCAxLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZGN0cmxfcmVhZF9wb3J0LCBmZGN0cmwpOwogICAgICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZSgodWludDMyX3QpaW9fYmFzZSArIDB4MDEsIDUsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZGN0cmxfd3JpdGVfcG9ydCwgZmRjdHJsKTsKICAgICAgICByZWdpc3Rlcl9pb3BvcnRfd3JpdGUoKHVpbnQzMl90KWlvX2Jhc2UgKyAweDA3LCAxLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmRjdHJsX3dyaXRlX3BvcnQsIGZkY3RybCk7CiAgICB9CgogICAgZmRjdHJsX2luaXRfY29tbW9uKGZkY3RybCwgZG1hX2NoYW5uLCBpb19iYXNlLCBmZHMpOwoKICAgIHJldHVybiBmZGN0cmw7Cn0KCmZkY3RybF90ICpzdW40bV9mZGN0cmxfaW5pdCAocWVtdV9pcnEgaXJxLCB0YXJnZXRfcGh5c19hZGRyX3QgaW9fYmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0RyaXZlclN0YXRlICoqZmRzLCBxZW11X2lycSAqZmRjX3RjKQp7CiAgICBEZXZpY2VTdGF0ZSAqZGV2OwogICAgU3lzQnVzRGV2aWNlICpzOwogICAgZmRjdHJsX3QgKmZkY3RybDsKCiAgICBkZXYgPSBxZGV2X2NyZWF0ZShOVUxMLCAiZmRjIik7CiAgICBxZGV2X3Byb3Bfc2V0X3VpbnQzMihkZXYsICJzdHJpY3RfaW8iLCAxKTsKICAgIHFkZXZfcHJvcF9zZXRfdWludDMyKGRldiwgIm1lbV9tYXBwZWQiLCAxKTsKICAgIHFkZXZfcHJvcF9zZXRfdWludDMyKGRldiwgInN1bjRtIiwgMSk7CiAgICBxZGV2X2luaXQoZGV2KTsKICAgIHMgPSBzeXNidXNfZnJvbV9xZGV2KGRldik7CiAgICBzeXNidXNfY29ubmVjdF9pcnEocywgMCwgaXJxKTsKICAgIHN5c2J1c19tbWlvX21hcChzLCAwLCBpb19iYXNlKTsKICAgICpmZGNfdGMgPSBxZGV2X2dldF9ncGlvX2luKGRldiwgMCk7CgogICAgZmRjdHJsID0gRlJPTV9TWVNCVVMoZmRjdHJsX3QsIHMpOwogICAgZmRjdHJsX2luaXRfY29tbW9uKGZkY3RybCwgLTEsIGlvX2Jhc2UsIGZkcyk7CgogICAgcmV0dXJuIGZkY3RybDsKfQoKc3RhdGljIHZvaWQgZmRjX2luaXQxKFN5c0J1c0RldmljZSAqZGV2KQp7CiAgICBmZGN0cmxfdCAqcyA9IEZST01fU1lTQlVTKGZkY3RybF90LCBkZXYpOwogICAgaW50IGlvOwoKICAgIHN5c2J1c19pbml0X2lycShkZXYsICZzLT5pcnEpOwogICAgcWRldl9pbml0X2dwaW9faW4oJmRldi0+cWRldiwgZmRjdHJsX2hhbmRsZV90YywgMSk7CiAgICBpZiAocy0+c3RyaWN0X2lvKSB7CiAgICAgICAgaW8gPSBjcHVfcmVnaXN0ZXJfaW9fbWVtb3J5KGZkY3RybF9tZW1fcmVhZF9zdHJpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkY3RybF9tZW1fd3JpdGVfc3RyaWN0LCBzKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaW8gPSBjcHVfcmVnaXN0ZXJfaW9fbWVtb3J5KGZkY3RybF9tZW1fcmVhZCwgZmRjdHJsX21lbV93cml0ZSwgcyk7CiAgICB9CiAgICBzeXNidXNfaW5pdF9tbWlvKGRldiwgMHgwOCwgaW8pOwp9CgoKc3RhdGljIFN5c0J1c0RldmljZUluZm8gZmRjX2luZm8gPSB7CiAgICAuaW5pdCA9IGZkY19pbml0MSwKICAgIC5xZGV2Lm5hbWUgID0gImZkYyIsCiAgICAucWRldi5zaXplICA9IHNpemVvZihmZGN0cmxfdCksCiAgICAucWRldi5wcm9wcyA9IChQcm9wZXJ0eVtdKSB7CiAgICAgICAgewogICAgICAgICAgICAubmFtZSA9ICJpb19iYXNlIiwKICAgICAgICAgICAgLmluZm8gPSAmcWRldl9wcm9wX3RhZGRyLAogICAgICAgICAgICAub2Zmc2V0ID0gb2Zmc2V0b2YoZmRjdHJsX3QsIGlvX2Jhc2UpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAubmFtZSA9ICJzdHJpY3RfaW8iLAogICAgICAgICAgICAuaW5mbyA9ICZxZGV2X3Byb3BfdWludDMyLAogICAgICAgICAgICAub2Zmc2V0ID0gb2Zmc2V0b2YoZmRjdHJsX3QsIHN0cmljdF9pbyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIC5uYW1lID0gIm1lbV9tYXBwZWQiLAogICAgICAgICAgICAuaW5mbyA9ICZxZGV2X3Byb3BfdWludDMyLAogICAgICAgICAgICAub2Zmc2V0ID0gb2Zmc2V0b2YoZmRjdHJsX3QsIG1lbV9tYXBwZWQpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAubmFtZSA9ICJzdW40bSIsCiAgICAgICAgICAgIC5pbmZvID0gJnFkZXZfcHJvcF91aW50MzIsCiAgICAgICAgICAgIC5vZmZzZXQgPSBvZmZzZXRvZihmZGN0cmxfdCwgc3VuNG0pLAogICAgICAgIH0sCiAgICAgICAgey8qIGVuZCBvZiBwcm9wZXJ0aWVzICovfQogICAgfQp9OwoKc3RhdGljIHZvaWQgZmRjX3JlZ2lzdGVyX2RldmljZXModm9pZCkKewogICAgc3lzYnVzX3JlZ2lzdGVyX3dpdGhwcm9wKCZmZGNfaW5mbyk7Cn0KCmRldmljZV9pbml0KGZkY19yZWdpc3Rlcl9kZXZpY2VzKQo=