LyoKICogQ29weXJpZ2h0IKkgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKgogKiBBdXRob3JzOgogKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgogKiAgICBLZWl0aCBQYWNrYXJkIDxrZWl0aHBAa2VpdGhwLmNvbT4KICogICAgWGlhbmcgSGFpaGFvIDxoYWloYW8ueGlhbmdAaW50ZWwuY29tPgogKgogKi8KCi8qCiAqIE1vc3Qgb2YgcmVuZGVyaW5nIGNvZGVzIGFyZSBwb3J0ZWQgZnJvbSB4Zjg2LXZpZGVvLWludGVsL3NyYy9pOTY1X3ZpZGVvLmMKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgojaW5jbHVkZSAidmFfYmFja2VuZC5oIgojaW5jbHVkZSAidmFfZHJpY29tbW9uLmgiCgojaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKI2luY2x1ZGUgImludGVsX2RyaXZlci5oIgoKI2luY2x1ZGUgImk5NjVfZGVmaW5lcy5oIgojaW5jbHVkZSAiaTk2NV9yZW5kZXIuaCIKI2luY2x1ZGUgImk5NjVfZHJ2X3ZpZGVvLmgiCgojZGVmaW5lIFNGX0tFUk5FTF9OVU1fR1JGICAgICAgIDE2CiNkZWZpbmUgU0ZfTUFYX1RIUkVBRFMgICAgICAgICAgMQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZl9rZXJuZWxfc3RhdGljW11bNF0gPSAKewojaW5jbHVkZSAic2hhZGVycy9yZW5kZXIvZXhhX3NmLmc0YiIKfTsKCiNkZWZpbmUgUFNfS0VSTkVMX05VTV9HUkYgICAgICAgMzIKI2RlZmluZSBQU19NQVhfVEhSRUFEUyAgICAgICAgICAzMgoKI2RlZmluZSBJOTY1X0dSRl9CTE9DS1MobnJlZykJKChucmVnICsgMTUpIC8gMTYgLSAxKQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwc19rZXJuZWxfc3RhdGljW11bNF0gPSAKewojaW5jbHVkZSAic2hhZGVycy9yZW5kZXIvZXhhX3dtX3h5Lmc0YiIKI2luY2x1ZGUgInNoYWRlcnMvcmVuZGVyL2V4YV93bV9zcmNfYWZmaW5lLmc0YiIKI2luY2x1ZGUgInNoYWRlcnMvcmVuZGVyL2V4YV93bV9zcmNfc2FtcGxlX3BsYW5hci5nNGIiCiNpbmNsdWRlICJzaGFkZXJzL3JlbmRlci9leGFfd21feXV2X3JnYi5nNGIiCiNpbmNsdWRlICJzaGFkZXJzL3JlbmRlci9leGFfd21fd3JpdGUuZzRiIgp9OwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBzX3N1YnBpY19rZXJuZWxfc3RhdGljW11bNF0gPSAKewojaW5jbHVkZSAic2hhZGVycy9yZW5kZXIvZXhhX3dtX3h5Lmc0YiIKI2luY2x1ZGUgInNoYWRlcnMvcmVuZGVyL2V4YV93bV9zcmNfYWZmaW5lLmc0YiIKI2luY2x1ZGUgInNoYWRlcnMvcmVuZGVyL2V4YV93bV9zcmNfc2FtcGxlX2FyZ2IuZzRiIgojaW5jbHVkZSAic2hhZGVycy9yZW5kZXIvZXhhX3dtX3dyaXRlLmc0YiIKfTsKCi8qIE9uIElHRE5HICovCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2Zfa2VybmVsX3N0YXRpY19nZW41W11bNF0gPSAKewojaW5jbHVkZSAic2hhZGVycy9yZW5kZXIvZXhhX3NmLmc0Yi5nZW41Igp9OwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwc19rZXJuZWxfc3RhdGljX2dlbjVbXVs0XSA9IAp7CiNpbmNsdWRlICJzaGFkZXJzL3JlbmRlci9leGFfd21feHkuZzRiLmdlbjUiCiNpbmNsdWRlICJzaGFkZXJzL3JlbmRlci9leGFfd21fc3JjX2FmZmluZS5nNGIuZ2VuNSIKI2luY2x1ZGUgInNoYWRlcnMvcmVuZGVyL2V4YV93bV9zcmNfc2FtcGxlX3BsYW5hci5nNGIuZ2VuNSIKI2luY2x1ZGUgInNoYWRlcnMvcmVuZGVyL2V4YV93bV95dXZfcmdiLmc0Yi5nZW41IgojaW5jbHVkZSAic2hhZGVycy9yZW5kZXIvZXhhX3dtX3dyaXRlLmc0Yi5nZW41Igp9OwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBzX3N1YnBpY19rZXJuZWxfc3RhdGljX2dlbjVbXVs0XSA9IAp7CiNpbmNsdWRlICJzaGFkZXJzL3JlbmRlci9leGFfd21feHkuZzRiLmdlbjUiCiNpbmNsdWRlICJzaGFkZXJzL3JlbmRlci9leGFfd21fc3JjX2FmZmluZS5nNGIuZ2VuNSIKI2luY2x1ZGUgInNoYWRlcnMvcmVuZGVyL2V4YV93bV9zcmNfc2FtcGxlX2FyZ2IuZzRiLmdlbjUiCiNpbmNsdWRlICJzaGFkZXJzL3JlbmRlci9leGFfd21fd3JpdGUuZzRiLmdlbjUiCn07CgpzdGF0aWMgdWludDMyX3QgZmxvYXRfdG9fdWludCAoZmxvYXQgZikgCnsKICAgIHVuaW9uIHsKICAgICAgICB1aW50MzJfdCBpOyAKICAgICAgICBmbG9hdCBmOwogICAgfSB4OwoKICAgIHguZiA9IGY7CiAgICByZXR1cm4geC5pOwp9CgplbnVtIAp7CiAgICBTRl9LRVJORUwgPSAwLAogICAgUFNfS0VSTkVMLAogICAgUFNfU1VCUElDX0tFUk5FTAp9OwoKc3RydWN0IHJlbmRlcl9rZXJuZWwKewogICAgY2hhciAqbmFtZTsKICAgIGNvbnN0IHVuc2lnbmVkIGludCAoKmJpbilbNF07CiAgICBpbnQgc2l6ZTsKICAgIGRyaV9ibyAqYm87Cn07CgpzdGF0aWMgc3RydWN0IHJlbmRlcl9rZXJuZWwgcmVuZGVyX2tlcm5lbHNfZ2VuNFtdID0gewogICAgewogICAgICAgICJTRiIsCiAgICAgICAgc2Zfa2VybmVsX3N0YXRpYywKICAgICAgICBzaXplb2Yoc2Zfa2VybmVsX3N0YXRpYyksCiAgICAgICAgTlVMTAogICAgfSwKICAgIHsKICAgICAgICAiUFMiLAogICAgICAgIHBzX2tlcm5lbF9zdGF0aWMsCiAgICAgICAgc2l6ZW9mKHBzX2tlcm5lbF9zdGF0aWMpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJQU19TVUJQSUMiLAogICAgICAgIHBzX3N1YnBpY19rZXJuZWxfc3RhdGljLAogICAgICAgIHNpemVvZihwc19zdWJwaWNfa2VybmVsX3N0YXRpYyksCiAgICAgICAgTlVMTAogICAgfQp9OwoKc3RhdGljIHN0cnVjdCByZW5kZXJfa2VybmVsIHJlbmRlcl9rZXJuZWxzX2dlbjVbXSA9IHsKICAgIHsKICAgICAgICAiU0YiLAogICAgICAgIHNmX2tlcm5lbF9zdGF0aWNfZ2VuNSwKICAgICAgICBzaXplb2Yoc2Zfa2VybmVsX3N0YXRpY19nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAogICAgewogICAgICAgICJQUyIsCiAgICAgICAgcHNfa2VybmVsX3N0YXRpY19nZW41LAogICAgICAgIHNpemVvZihwc19rZXJuZWxfc3RhdGljX2dlbjUpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJQU19TVUJQSUMiLAogICAgICAgIHBzX3N1YnBpY19rZXJuZWxfc3RhdGljX2dlbjUsCiAgICAgICAgc2l6ZW9mKHBzX3N1YnBpY19rZXJuZWxfc3RhdGljX2dlbjUpLAogICAgICAgIE5VTEwKICAgIH0KfTsKCnN0YXRpYyBzdHJ1Y3QgcmVuZGVyX2tlcm5lbCAqcmVuZGVyX2tlcm5lbHMgPSBOVUxMOwoKI2RlZmluZSBOVU1fUkVOREVSX0tFUk5FTCAoc2l6ZW9mKHJlbmRlcl9rZXJuZWxzX2dlbjQpL3NpemVvZihyZW5kZXJfa2VybmVsc19nZW40WzBdKSkKCiNkZWZpbmUgVVJCX1ZTX0VOVFJJRVMJICAgICAgOAojZGVmaW5lIFVSQl9WU19FTlRSWV9TSVpFICAgICAxCgojZGVmaW5lIFVSQl9HU19FTlRSSUVTCSAgICAgIDAKI2RlZmluZSBVUkJfR1NfRU5UUllfU0laRSAgICAgMAoKI2RlZmluZSBVUkJfQ0xJUF9FTlRSSUVTICAgICAgMAojZGVmaW5lIFVSQl9DTElQX0VOVFJZX1NJWkUgICAwCgojZGVmaW5lIFVSQl9TRl9FTlRSSUVTCSAgICAgIDEKI2RlZmluZSBVUkJfU0ZfRU5UUllfU0laRSAgICAgMgoKI2RlZmluZSBVUkJfQ1NfRU5UUklFUwkgICAgICAwCiNkZWZpbmUgVVJCX0NTX0VOVFJZX1NJWkUgICAgIDAKCnN0YXRpYyB2b2lkCmk5NjVfcmVuZGVyX3ZzX3VuaXQoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IGk5NjVfcmVuZGVyX3N0YXRlICpyZW5kZXJfc3RhdGUgPSAmaTk2NS0+cmVuZGVyX3N0YXRlOwogICAgc3RydWN0IGk5NjVfdnNfdW5pdF9zdGF0ZSAqdnNfc3RhdGU7CgogICAgZHJpX2JvX21hcChyZW5kZXJfc3RhdGUtPnZzLnN0YXRlLCAxKTsKICAgIGFzc2VydChyZW5kZXJfc3RhdGUtPnZzLnN0YXRlLT52aXJ0dWFsKTsKICAgIHZzX3N0YXRlID0gcmVuZGVyX3N0YXRlLT52cy5zdGF0ZS0+dmlydHVhbDsKICAgIG1lbXNldCh2c19zdGF0ZSwgMCwgc2l6ZW9mKCp2c19zdGF0ZSkpOwoKICAgIGlmIChJU19JR0RORyhpOTY1LT5pbnRlbC5kZXZpY2VfaWQpKQogICAgICAgIHZzX3N0YXRlLT50aHJlYWQ0Lm5yX3VyYl9lbnRyaWVzID0gVVJCX1ZTX0VOVFJJRVMgPj4gMjsKICAgIGVsc2UKICAgICAgICB2c19zdGF0ZS0+dGhyZWFkNC5ucl91cmJfZW50cmllcyA9IFVSQl9WU19FTlRSSUVTOwoKICAgIHZzX3N0YXRlLT50aHJlYWQ0LnVyYl9lbnRyeV9hbGxvY2F0aW9uX3NpemUgPSBVUkJfVlNfRU5UUllfU0laRSAtIDE7CiAgICB2c19zdGF0ZS0+dnM2LnZzX2VuYWJsZSA9IDA7CiAgICB2c19zdGF0ZS0+dnM2LnZlcnRfY2FjaGVfZGlzYWJsZSA9IDE7CiAgICAKICAgIGRyaV9ib191bm1hcChyZW5kZXJfc3RhdGUtPnZzLnN0YXRlKTsKfQoKc3RhdGljIHZvaWQKaTk2NV9yZW5kZXJfc2ZfdW5pdChWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CiAgICBzdHJ1Y3QgaTk2NV9zZl91bml0X3N0YXRlICpzZl9zdGF0ZTsKCiAgICBkcmlfYm9fbWFwKHJlbmRlcl9zdGF0ZS0+c2Yuc3RhdGUsIDEpOwogICAgYXNzZXJ0KHJlbmRlcl9zdGF0ZS0+c2Yuc3RhdGUtPnZpcnR1YWwpOwogICAgc2Zfc3RhdGUgPSByZW5kZXJfc3RhdGUtPnNmLnN0YXRlLT52aXJ0dWFsOwogICAgbWVtc2V0KHNmX3N0YXRlLCAwLCBzaXplb2YoKnNmX3N0YXRlKSk7CgogICAgc2Zfc3RhdGUtPnRocmVhZDAuZ3JmX3JlZ19jb3VudCA9IEk5NjVfR1JGX0JMT0NLUyhTRl9LRVJORUxfTlVNX0dSRik7CiAgICBzZl9zdGF0ZS0+dGhyZWFkMC5rZXJuZWxfc3RhcnRfcG9pbnRlciA9IHJlbmRlcl9rZXJuZWxzW1NGX0tFUk5FTF0uYm8tPm9mZnNldCA+PiA2OwoKICAgIHNmX3N0YXRlLT5zZjEuc2luZ2xlX3Byb2dyYW1fZmxvdyA9IDE7IC8qIFhYWCAqLwogICAgc2Zfc3RhdGUtPnNmMS5iaW5kaW5nX3RhYmxlX2VudHJ5X2NvdW50ID0gMDsKICAgIHNmX3N0YXRlLT5zZjEudGhyZWFkX3ByaW9yaXR5ID0gMDsKICAgIHNmX3N0YXRlLT5zZjEuZmxvYXRpbmdfcG9pbnRfbW9kZSA9IDA7IC8qIE1lc2EgZG9lcyB0aGlzICovCiAgICBzZl9zdGF0ZS0+c2YxLmlsbGVnYWxfb3BfZXhjZXB0aW9uX2VuYWJsZSA9IDE7CiAgICBzZl9zdGF0ZS0+c2YxLm1hc2tfc3RhY2tfZXhjZXB0aW9uX2VuYWJsZSA9IDE7CiAgICBzZl9zdGF0ZS0+c2YxLnN3X2V4Y2VwdGlvbl9lbmFibGUgPSAxOwoKICAgIC8qIHNjcmF0Y2ggc3BhY2UgaXMgbm90IHVzZWQgaW4gb3VyIGtlcm5lbCAqLwogICAgc2Zfc3RhdGUtPnRocmVhZDIucGVyX3RocmVhZF9zY3JhdGNoX3NwYWNlID0gMDsKICAgIHNmX3N0YXRlLT50aHJlYWQyLnNjcmF0Y2hfc3BhY2VfYmFzZV9wb2ludGVyID0gMDsKCiAgICBzZl9zdGF0ZS0+dGhyZWFkMy5jb25zdF91cmJfZW50cnlfcmVhZF9sZW5ndGggPSAwOyAvKiBubyBjb25zdCBVUkJzICovCiAgICBzZl9zdGF0ZS0+dGhyZWFkMy5jb25zdF91cmJfZW50cnlfcmVhZF9vZmZzZXQgPSAwOyAvKiBubyBjb25zdCBVUkJzICovCiAgICBzZl9zdGF0ZS0+dGhyZWFkMy51cmJfZW50cnlfcmVhZF9sZW5ndGggPSAxOyAvKiAxIFVSQiBwZXIgdmVydGV4ICovCiAgICBzZl9zdGF0ZS0+dGhyZWFkMy51cmJfZW50cnlfcmVhZF9vZmZzZXQgPSAwOwogICAgc2Zfc3RhdGUtPnRocmVhZDMuZGlzcGF0Y2hfZ3JmX3N0YXJ0X3JlZyA9IDM7CgogICAgc2Zfc3RhdGUtPnRocmVhZDQubWF4X3RocmVhZHMgPSBTRl9NQVhfVEhSRUFEUyAtIDE7CiAgICBzZl9zdGF0ZS0+dGhyZWFkNC51cmJfZW50cnlfYWxsb2NhdGlvbl9zaXplID0gVVJCX1NGX0VOVFJZX1NJWkUgLSAxOwogICAgc2Zfc3RhdGUtPnRocmVhZDQubnJfdXJiX2VudHJpZXMgPSBVUkJfU0ZfRU5UUklFUzsKICAgIHNmX3N0YXRlLT50aHJlYWQ0LnN0YXRzX2VuYWJsZSA9IDE7CgogICAgc2Zfc3RhdGUtPnNmNS52aWV3cG9ydF90cmFuc2Zvcm0gPSAwOyAvKiBza2lwIHZpZXdwb3J0ICovCgogICAgc2Zfc3RhdGUtPnNmNi5jdWxsX21vZGUgPSBJOTY1X0NVTExNT0RFX05PTkU7CiAgICBzZl9zdGF0ZS0+c2Y2LnNjaXNzb3IgPSAwOwoKICAgIHNmX3N0YXRlLT5zZjcudHJpZmFuX3B2ID0gMjsKCiAgICBzZl9zdGF0ZS0+c2Y2LmRlc3Rfb3JnX3ZiaWFzID0gMHg4OwogICAgc2Zfc3RhdGUtPnNmNi5kZXN0X29yZ19oYmlhcyA9IDB4ODsKCiAgICBkcmlfYm9fZW1pdF9yZWxvYyhyZW5kZXJfc3RhdGUtPnNmLnN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLAogICAgICAgICAgICAgICAgICAgICAgc2Zfc3RhdGUtPnRocmVhZDAuZ3JmX3JlZ19jb3VudCA8PCAxLAogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGk5NjVfc2ZfdW5pdF9zdGF0ZSwgdGhyZWFkMCksCiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJfa2VybmVsc1tTRl9LRVJORUxdLmJvKTsKCiAgICBkcmlfYm9fdW5tYXAocmVuZGVyX3N0YXRlLT5zZi5zdGF0ZSk7Cn0KCnN0YXRpYyB2b2lkIAppOTY1X3JlbmRlcl9zYW1wbGVyKFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsKICAgIHN0cnVjdCBpOTY1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyX3N0YXRlID0gJmk5NjUtPnJlbmRlcl9zdGF0ZTsKICAgIHN0cnVjdCBpOTY1X3NhbXBsZXJfc3RhdGUgKnNhbXBsZXJfc3RhdGU7CiAgICBpbnQgaTsKICAgIAogICAgYXNzZXJ0KHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlcl9jb3VudCA+IDApOwogICAgYXNzZXJ0KHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlcl9jb3VudCA8PSBNQVhfU0FNUExFUlMpOwoKICAgIGRyaV9ib19tYXAocmVuZGVyX3N0YXRlLT53bS5zYW1wbGVyLCAxKTsKICAgIGFzc2VydChyZW5kZXJfc3RhdGUtPndtLnNhbXBsZXItPnZpcnR1YWwpOwogICAgc2FtcGxlcl9zdGF0ZSA9IHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlci0+dmlydHVhbDsKICAgIGZvciAoaSA9IDA7IGkgPCByZW5kZXJfc3RhdGUtPndtLnNhbXBsZXJfY291bnQ7IGkrKykgewogICAgICAgIG1lbXNldChzYW1wbGVyX3N0YXRlLCAwLCBzaXplb2YoKnNhbXBsZXJfc3RhdGUpKTsKICAgICAgICBzYW1wbGVyX3N0YXRlLT5zczAubWluX2ZpbHRlciA9IEk5NjVfTUFQRklMVEVSX0xJTkVBUjsKICAgICAgICBzYW1wbGVyX3N0YXRlLT5zczAubWFnX2ZpbHRlciA9IEk5NjVfTUFQRklMVEVSX0xJTkVBUjsKICAgICAgICBzYW1wbGVyX3N0YXRlLT5zczEucl93cmFwX21vZGUgPSBJOTY1X1RFWENPT1JETU9ERV9DTEFNUDsKICAgICAgICBzYW1wbGVyX3N0YXRlLT5zczEuc193cmFwX21vZGUgPSBJOTY1X1RFWENPT1JETU9ERV9DTEFNUDsKICAgICAgICBzYW1wbGVyX3N0YXRlLT5zczEudF93cmFwX21vZGUgPSBJOTY1X1RFWENPT1JETU9ERV9DTEFNUDsKICAgICAgICBzYW1wbGVyX3N0YXRlKys7CiAgICB9CgogICAgZHJpX2JvX3VubWFwKHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlcik7Cn0Kc3RhdGljIHZvaWQKaTk2NV9zdWJwaWNfcmVuZGVyX3dtX3VuaXQoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IGk5NjVfcmVuZGVyX3N0YXRlICpyZW5kZXJfc3RhdGUgPSAmaTk2NS0+cmVuZGVyX3N0YXRlOwogICAgc3RydWN0IGk5NjVfd21fdW5pdF9zdGF0ZSAqd21fc3RhdGU7CgogICAgYXNzZXJ0KHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlcik7CgogICAgZHJpX2JvX21hcChyZW5kZXJfc3RhdGUtPndtLnN0YXRlLCAxKTsKICAgIGFzc2VydChyZW5kZXJfc3RhdGUtPndtLnN0YXRlLT52aXJ0dWFsKTsKICAgIHdtX3N0YXRlID0gcmVuZGVyX3N0YXRlLT53bS5zdGF0ZS0+dmlydHVhbDsKICAgIG1lbXNldCh3bV9zdGF0ZSwgMCwgc2l6ZW9mKCp3bV9zdGF0ZSkpOwoKICAgIHdtX3N0YXRlLT50aHJlYWQwLmdyZl9yZWdfY291bnQgPSBJOTY1X0dSRl9CTE9DS1MoUFNfS0VSTkVMX05VTV9HUkYpOwogICAgd21fc3RhdGUtPnRocmVhZDAua2VybmVsX3N0YXJ0X3BvaW50ZXIgPSByZW5kZXJfa2VybmVsc1tQU19TVUJQSUNfS0VSTkVMXS5iby0+b2Zmc2V0ID4+IDY7CgogICAgd21fc3RhdGUtPnRocmVhZDEuc2luZ2xlX3Byb2dyYW1fZmxvdyA9IDE7IC8qIFhYWCAqLwoKICAgIGlmIChJU19JR0RORyhpOTY1LT5pbnRlbC5kZXZpY2VfaWQpKQogICAgICAgIHdtX3N0YXRlLT50aHJlYWQxLmJpbmRpbmdfdGFibGVfZW50cnlfY291bnQgPSAwOyAvKiBoYXJkd2FyZSByZXF1aXJlbWVudCAqLwogICAgZWxzZQogICAgICAgIHdtX3N0YXRlLT50aHJlYWQxLmJpbmRpbmdfdGFibGVfZW50cnlfY291bnQgPSA3OwoKICAgIHdtX3N0YXRlLT50aHJlYWQyLnNjcmF0Y2hfc3BhY2VfYmFzZV9wb2ludGVyID0gMDsKICAgIHdtX3N0YXRlLT50aHJlYWQyLnBlcl90aHJlYWRfc2NyYXRjaF9zcGFjZSA9IDA7IC8qIDEwMjQgYnl0ZXMgKi8KCiAgICB3bV9zdGF0ZS0+dGhyZWFkMy5kaXNwYXRjaF9ncmZfc3RhcnRfcmVnID0gMzsgLyogWFhYICovCiAgICB3bV9zdGF0ZS0+dGhyZWFkMy5jb25zdF91cmJfZW50cnlfcmVhZF9sZW5ndGggPSAwOwogICAgd21fc3RhdGUtPnRocmVhZDMuY29uc3RfdXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gMDsKICAgIHdtX3N0YXRlLT50aHJlYWQzLnVyYl9lbnRyeV9yZWFkX2xlbmd0aCA9IDE7IC8qIFhYWCAqLwogICAgd21fc3RhdGUtPnRocmVhZDMudXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gMDsgLyogWFhYICovCgogICAgd21fc3RhdGUtPndtNC5zdGF0c19lbmFibGUgPSAwOwogICAgd21fc3RhdGUtPndtNC5zYW1wbGVyX3N0YXRlX3BvaW50ZXIgPSByZW5kZXJfc3RhdGUtPndtLnNhbXBsZXItPm9mZnNldCA+PiA1OyAKCiAgICBpZiAoSVNfSUdETkcoaTk2NS0+aW50ZWwuZGV2aWNlX2lkKSkKICAgICAgICB3bV9zdGF0ZS0+d200LnNhbXBsZXJfY291bnQgPSAwOyAgICAgICAgLyogaGFyZHdhcmUgcmVxdWlyZW1lbnQgKi8KICAgIGVsc2UKICAgICAgICB3bV9zdGF0ZS0+d200LnNhbXBsZXJfY291bnQgPSAocmVuZGVyX3N0YXRlLT53bS5zYW1wbGVyX2NvdW50ICsgMykgLyA0OwoKICAgIHdtX3N0YXRlLT53bTUubWF4X3RocmVhZHMgPSBQU19NQVhfVEhSRUFEUyAtIDE7CiAgICB3bV9zdGF0ZS0+d201LnRocmVhZF9kaXNwYXRjaF9lbmFibGUgPSAxOwogICAgd21fc3RhdGUtPndtNS5lbmFibGVfMTZfcGl4ID0gMTsKICAgIHdtX3N0YXRlLT53bTUuZW5hYmxlXzhfcGl4ID0gMDsKICAgIHdtX3N0YXRlLT53bTUuZWFybHlfZGVwdGhfdGVzdCA9IDE7CgogICAgZHJpX2JvX2VtaXRfcmVsb2MocmVuZGVyX3N0YXRlLT53bS5zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwKICAgICAgICAgICAgICAgICAgICAgIHdtX3N0YXRlLT50aHJlYWQwLmdyZl9yZWdfY291bnQgPDwgMSwKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHN0cnVjdCBpOTY1X3dtX3VuaXRfc3RhdGUsIHRocmVhZDApLAogICAgICAgICAgICAgICAgICAgICAgcmVuZGVyX2tlcm5lbHNbUFNfU1VCUElDX0tFUk5FTF0uYm8pOwoKICAgIGRyaV9ib19lbWl0X3JlbG9jKHJlbmRlcl9zdGF0ZS0+d20uc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsCiAgICAgICAgICAgICAgICAgICAgICB3bV9zdGF0ZS0+d200LnNhbXBsZXJfY291bnQgPDwgMiwKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHN0cnVjdCBpOTY1X3dtX3VuaXRfc3RhdGUsIHdtNCksCiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGUtPndtLnNhbXBsZXIpOwoKICAgIGRyaV9ib191bm1hcChyZW5kZXJfc3RhdGUtPndtLnN0YXRlKTsKfQoKCnN0YXRpYyB2b2lkCmk5NjVfcmVuZGVyX3dtX3VuaXQoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IGk5NjVfcmVuZGVyX3N0YXRlICpyZW5kZXJfc3RhdGUgPSAmaTk2NS0+cmVuZGVyX3N0YXRlOwogICAgc3RydWN0IGk5NjVfd21fdW5pdF9zdGF0ZSAqd21fc3RhdGU7CgogICAgYXNzZXJ0KHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlcik7CgogICAgZHJpX2JvX21hcChyZW5kZXJfc3RhdGUtPndtLnN0YXRlLCAxKTsKICAgIGFzc2VydChyZW5kZXJfc3RhdGUtPndtLnN0YXRlLT52aXJ0dWFsKTsKICAgIHdtX3N0YXRlID0gcmVuZGVyX3N0YXRlLT53bS5zdGF0ZS0+dmlydHVhbDsKICAgIG1lbXNldCh3bV9zdGF0ZSwgMCwgc2l6ZW9mKCp3bV9zdGF0ZSkpOwoKICAgIHdtX3N0YXRlLT50aHJlYWQwLmdyZl9yZWdfY291bnQgPSBJOTY1X0dSRl9CTE9DS1MoUFNfS0VSTkVMX05VTV9HUkYpOwogICAgd21fc3RhdGUtPnRocmVhZDAua2VybmVsX3N0YXJ0X3BvaW50ZXIgPSByZW5kZXJfa2VybmVsc1tQU19LRVJORUxdLmJvLT5vZmZzZXQgPj4gNjsKCiAgICB3bV9zdGF0ZS0+dGhyZWFkMS5zaW5nbGVfcHJvZ3JhbV9mbG93ID0gMTsgLyogWFhYICovCgogICAgaWYgKElTX0lHRE5HKGk5NjUtPmludGVsLmRldmljZV9pZCkpCiAgICAgICAgd21fc3RhdGUtPnRocmVhZDEuYmluZGluZ190YWJsZV9lbnRyeV9jb3VudCA9IDA7ICAgICAgICAvKiBoYXJkd2FyZSByZXF1aXJlbWVudCAqLwogICAgZWxzZQogICAgICAgIHdtX3N0YXRlLT50aHJlYWQxLmJpbmRpbmdfdGFibGVfZW50cnlfY291bnQgPSA3OwoKICAgIHdtX3N0YXRlLT50aHJlYWQyLnNjcmF0Y2hfc3BhY2VfYmFzZV9wb2ludGVyID0gMDsKICAgIHdtX3N0YXRlLT50aHJlYWQyLnBlcl90aHJlYWRfc2NyYXRjaF9zcGFjZSA9IDA7IC8qIDEwMjQgYnl0ZXMgKi8KCiAgICB3bV9zdGF0ZS0+dGhyZWFkMy5kaXNwYXRjaF9ncmZfc3RhcnRfcmVnID0gMzsgLyogWFhYICovCiAgICB3bV9zdGF0ZS0+dGhyZWFkMy5jb25zdF91cmJfZW50cnlfcmVhZF9sZW5ndGggPSAwOwogICAgd21fc3RhdGUtPnRocmVhZDMuY29uc3RfdXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gMDsKICAgIHdtX3N0YXRlLT50aHJlYWQzLnVyYl9lbnRyeV9yZWFkX2xlbmd0aCA9IDE7IC8qIFhYWCAqLwogICAgd21fc3RhdGUtPnRocmVhZDMudXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gMDsgLyogWFhYICovCgogICAgd21fc3RhdGUtPndtNC5zdGF0c19lbmFibGUgPSAwOwogICAgd21fc3RhdGUtPndtNC5zYW1wbGVyX3N0YXRlX3BvaW50ZXIgPSByZW5kZXJfc3RhdGUtPndtLnNhbXBsZXItPm9mZnNldCA+PiA1OyAKCiAgICBpZiAoSVNfSUdETkcoaTk2NS0+aW50ZWwuZGV2aWNlX2lkKSkKICAgICAgICB3bV9zdGF0ZS0+d200LnNhbXBsZXJfY291bnQgPSAwOyAgICAgICAgLyogaGFyZHdhcmUgcmVxdWlyZW1lbnQgKi8KICAgIGVsc2UgCiAgICAgICAgd21fc3RhdGUtPndtNC5zYW1wbGVyX2NvdW50ID0gKHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlcl9jb3VudCArIDMpIC8gNDsKCiAgICB3bV9zdGF0ZS0+d201Lm1heF90aHJlYWRzID0gUFNfTUFYX1RIUkVBRFMgLSAxOwogICAgd21fc3RhdGUtPndtNS50aHJlYWRfZGlzcGF0Y2hfZW5hYmxlID0gMTsKICAgIHdtX3N0YXRlLT53bTUuZW5hYmxlXzE2X3BpeCA9IDE7CiAgICB3bV9zdGF0ZS0+d201LmVuYWJsZV84X3BpeCA9IDA7CiAgICB3bV9zdGF0ZS0+d201LmVhcmx5X2RlcHRoX3Rlc3QgPSAxOwoKICAgIGRyaV9ib19lbWl0X3JlbG9jKHJlbmRlcl9zdGF0ZS0+d20uc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsCiAgICAgICAgICAgICAgICAgICAgICB3bV9zdGF0ZS0+dGhyZWFkMC5ncmZfcmVnX2NvdW50IDw8IDEsCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihzdHJ1Y3QgaTk2NV93bV91bml0X3N0YXRlLCB0aHJlYWQwKSwKICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl9rZXJuZWxzW1BTX0tFUk5FTF0uYm8pOwoKICAgIGRyaV9ib19lbWl0X3JlbG9jKHJlbmRlcl9zdGF0ZS0+d20uc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsCiAgICAgICAgICAgICAgICAgICAgICB3bV9zdGF0ZS0+d200LnNhbXBsZXJfY291bnQgPDwgMiwKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHN0cnVjdCBpOTY1X3dtX3VuaXRfc3RhdGUsIHdtNCksCiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGUtPndtLnNhbXBsZXIpOwoKICAgIGRyaV9ib191bm1hcChyZW5kZXJfc3RhdGUtPndtLnN0YXRlKTsKfQoKc3RhdGljIHZvaWQgCmk5NjVfcmVuZGVyX2NjX3ZpZXdwb3J0KFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsKICAgIHN0cnVjdCBpOTY1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyX3N0YXRlID0gJmk5NjUtPnJlbmRlcl9zdGF0ZTsKICAgIHN0cnVjdCBpOTY1X2NjX3ZpZXdwb3J0ICpjY192aWV3cG9ydDsKCiAgICBkcmlfYm9fbWFwKHJlbmRlcl9zdGF0ZS0+Y2Mudmlld3BvcnQsIDEpOwogICAgYXNzZXJ0KHJlbmRlcl9zdGF0ZS0+Y2Mudmlld3BvcnQtPnZpcnR1YWwpOwogICAgY2Nfdmlld3BvcnQgPSByZW5kZXJfc3RhdGUtPmNjLnZpZXdwb3J0LT52aXJ0dWFsOwogICAgbWVtc2V0KGNjX3ZpZXdwb3J0LCAwLCBzaXplb2YoKmNjX3ZpZXdwb3J0KSk7CiAgICAKICAgIGNjX3ZpZXdwb3J0LT5taW5fZGVwdGggPSAtMS5lMzU7CiAgICBjY192aWV3cG9ydC0+bWF4X2RlcHRoID0gMS5lMzU7CgogICAgZHJpX2JvX3VubWFwKHJlbmRlcl9zdGF0ZS0+Y2Mudmlld3BvcnQpOwp9CgpzdGF0aWMgdm9pZCAKaTk2NV9zdWJwaWNfcmVuZGVyX2NjX3VuaXQoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IGk5NjVfcmVuZGVyX3N0YXRlICpyZW5kZXJfc3RhdGUgPSAmaTk2NS0+cmVuZGVyX3N0YXRlOwogICAgc3RydWN0IGk5NjVfY2NfdW5pdF9zdGF0ZSAqY2Nfc3RhdGU7CgogICAgYXNzZXJ0KHJlbmRlcl9zdGF0ZS0+Y2Mudmlld3BvcnQpOwoKICAgIGRyaV9ib19tYXAocmVuZGVyX3N0YXRlLT5jYy5zdGF0ZSwgMSk7CiAgICBhc3NlcnQocmVuZGVyX3N0YXRlLT5jYy5zdGF0ZS0+dmlydHVhbCk7CiAgICBjY19zdGF0ZSA9IHJlbmRlcl9zdGF0ZS0+Y2Muc3RhdGUtPnZpcnR1YWw7CiAgICBtZW1zZXQoY2Nfc3RhdGUsIDAsIHNpemVvZigqY2Nfc3RhdGUpKTsKCiAgICBjY19zdGF0ZS0+Y2MwLnN0ZW5jaWxfZW5hYmxlID0gMDsgICAvKiBkaXNhYmxlIHN0ZW5jaWwgKi8KICAgIGNjX3N0YXRlLT5jYzIuZGVwdGhfdGVzdCA9IDA7ICAgICAgIC8qIGRpc2FibGUgZGVwdGggdGVzdCAqLwogICAgY2Nfc3RhdGUtPmNjMi5sb2dpY29wX2VuYWJsZSA9IDA7ICAgLyogZGlzYWJsZSBsb2dpYyBvcCAqLwogICAgY2Nfc3RhdGUtPmNjMy5pYV9ibGVuZF9lbmFibGUgPSAwIDsgIC8qIGJsZW5kIGFscGhhIGp1c3QgbGlrZSBjb2xvcnMgKi8KICAgIGNjX3N0YXRlLT5jYzMuYmxlbmRfZW5hYmxlID0gMTsgICAgIC8qIGVuYWJsZSBjb2xvciBibGVuZCAqLwogICAgY2Nfc3RhdGUtPmNjMy5hbHBoYV90ZXN0ID0gMDsgICAgICAgLyogZGlzYWJsZSBhbHBoYSB0ZXN0ICovCiAgICBjY19zdGF0ZS0+Y2MzLmFscGhhX3Rlc3RfZm9ybWF0ID0gMDsvLzA6QUxQSEFURVNUX1VOT1JNODsgICAgICAgLypzdG9yZSBhbHBoYSB2YWx1ZSB3aXRoIFVOT1JNOCAqLwogICAgY2Nfc3RhdGUtPmNjMy5hbHBoYV90ZXN0X2Z1bmMgPSA1Oy8vQ09NUEFSRUZVTkNUSU9OX0xFU1M7ICAgICAgIC8qcGFzcyBpZiBsZXNzIHRoYW4gdGhlIHJlZmVyZW5jZSAqLwogICAgY2Nfc3RhdGUtPmNjNC5jY192aWV3cG9ydF9zdGF0ZV9vZmZzZXQgPSByZW5kZXJfc3RhdGUtPmNjLnZpZXdwb3J0LT5vZmZzZXQgPj4gNTsKCiAgICBjY19zdGF0ZS0+Y2M1LmRpdGhlcl9lbmFibGUgPSAwOyAgICAvKiBkaXNhYmxlIGRpdGhlciAqLwogICAgY2Nfc3RhdGUtPmNjNS5sb2dpY29wX2Z1bmMgPSAweGM7ICAgLyogV0hJVEUgKi8KICAgIGNjX3N0YXRlLT5jYzUuc3RhdGlzdGljc19lbmFibGUgPSAxOwogICAgY2Nfc3RhdGUtPmNjNS5pYV9ibGVuZF9mdW5jdGlvbiA9IEk5NjVfQkxFTkRGVU5DVElPTl9BREQ7CiAgICBjY19zdGF0ZS0+Y2M1LmlhX3NyY19ibGVuZF9mYWN0b3IgPSBJOTY1X0JMRU5ERkFDVE9SX0RTVF9BTFBIQTsKICAgIGNjX3N0YXRlLT5jYzUuaWFfZGVzdF9ibGVuZF9mYWN0b3IgPSBJOTY1X0JMRU5ERkFDVE9SX0RTVF9BTFBIQTsKCiAgICBjY19zdGF0ZS0+Y2M2LmNsYW1wX3Bvc3RfYWxwaGFfYmxlbmQgPSAwOyAKICAgIGNjX3N0YXRlLT5jYzYuY2xhbXBfcHJlX2FscGhhX2JsZW5kICA9MDsgCiAgICAKICAgIC8qZmluYWwgY29sb3IgPSBzcmNfY29sb3Iqc3JjX2JsZW5kX2ZhY3RvciArLy0gZHN0X2NvbG9yKmRlc3RfY29sb3JfYmxlbmRfZmFjdG9yKi8KICAgIGNjX3N0YXRlLT5jYzYuYmxlbmRfZnVuY3Rpb24gPSBJOTY1X0JMRU5ERlVOQ1RJT05fQUREOwogICAgY2Nfc3RhdGUtPmNjNi5zcmNfYmxlbmRfZmFjdG9yID0gSTk2NV9CTEVOREZBQ1RPUl9TUkNfQUxQSEE7CiAgICBjY19zdGF0ZS0+Y2M2LmRlc3RfYmxlbmRfZmFjdG9yID0gSTk2NV9CTEVOREZBQ1RPUl9JTlZfU1JDX0FMUEhBOwogICAKICAgIC8qYWxwaGEgdGVzdCByZWZlcmVuY2UqLwogICAgY2Nfc3RhdGUtPmNjNy5hbHBoYV9yZWYuZiA9MC4wIDsKCgogICAgZHJpX2JvX2VtaXRfcmVsb2MocmVuZGVyX3N0YXRlLT5jYy5zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwKICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihzdHJ1Y3QgaTk2NV9jY191bml0X3N0YXRlLCBjYzQpLAogICAgICAgICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlLT5jYy52aWV3cG9ydCk7CgogICAgZHJpX2JvX3VubWFwKHJlbmRlcl9zdGF0ZS0+Y2Muc3RhdGUpOwp9CgoKc3RhdGljIHZvaWQgCmk5NjVfcmVuZGVyX2NjX3VuaXQoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IGk5NjVfcmVuZGVyX3N0YXRlICpyZW5kZXJfc3RhdGUgPSAmaTk2NS0+cmVuZGVyX3N0YXRlOwogICAgc3RydWN0IGk5NjVfY2NfdW5pdF9zdGF0ZSAqY2Nfc3RhdGU7CgogICAgYXNzZXJ0KHJlbmRlcl9zdGF0ZS0+Y2Mudmlld3BvcnQpOwoKICAgIGRyaV9ib19tYXAocmVuZGVyX3N0YXRlLT5jYy5zdGF0ZSwgMSk7CiAgICBhc3NlcnQocmVuZGVyX3N0YXRlLT5jYy5zdGF0ZS0+dmlydHVhbCk7CiAgICBjY19zdGF0ZSA9IHJlbmRlcl9zdGF0ZS0+Y2Muc3RhdGUtPnZpcnR1YWw7CiAgICBtZW1zZXQoY2Nfc3RhdGUsIDAsIHNpemVvZigqY2Nfc3RhdGUpKTsKCiAgICBjY19zdGF0ZS0+Y2MwLnN0ZW5jaWxfZW5hYmxlID0gMDsgICAvKiBkaXNhYmxlIHN0ZW5jaWwgKi8KICAgIGNjX3N0YXRlLT5jYzIuZGVwdGhfdGVzdCA9IDA7ICAgICAgIC8qIGRpc2FibGUgZGVwdGggdGVzdCAqLwogICAgY2Nfc3RhdGUtPmNjMi5sb2dpY29wX2VuYWJsZSA9IDE7ICAgLyogZW5hYmxlIGxvZ2ljIG9wICovCiAgICBjY19zdGF0ZS0+Y2MzLmlhX2JsZW5kX2VuYWJsZSA9IDA7ICAvKiBibGVuZCBhbHBoYSBqdXN0IGxpa2UgY29sb3JzICovCiAgICBjY19zdGF0ZS0+Y2MzLmJsZW5kX2VuYWJsZSA9IDA7ICAgICAvKiBkaXNhYmxlIGNvbG9yIGJsZW5kICovCiAgICBjY19zdGF0ZS0+Y2MzLmFscGhhX3Rlc3QgPSAwOyAgICAgICAvKiBkaXNhYmxlIGFscGhhIHRlc3QgKi8KICAgIGNjX3N0YXRlLT5jYzQuY2Nfdmlld3BvcnRfc3RhdGVfb2Zmc2V0ID0gcmVuZGVyX3N0YXRlLT5jYy52aWV3cG9ydC0+b2Zmc2V0ID4+IDU7CgogICAgY2Nfc3RhdGUtPmNjNS5kaXRoZXJfZW5hYmxlID0gMDsgICAgLyogZGlzYWJsZSBkaXRoZXIgKi8KICAgIGNjX3N0YXRlLT5jYzUubG9naWNvcF9mdW5jID0gMHhjOyAgIC8qIFdISVRFICovCiAgICBjY19zdGF0ZS0+Y2M1LnN0YXRpc3RpY3NfZW5hYmxlID0gMTsKICAgIGNjX3N0YXRlLT5jYzUuaWFfYmxlbmRfZnVuY3Rpb24gPSBJOTY1X0JMRU5ERlVOQ1RJT05fQUREOwogICAgY2Nfc3RhdGUtPmNjNS5pYV9zcmNfYmxlbmRfZmFjdG9yID0gSTk2NV9CTEVOREZBQ1RPUl9PTkU7CiAgICBjY19zdGF0ZS0+Y2M1LmlhX2Rlc3RfYmxlbmRfZmFjdG9yID0gSTk2NV9CTEVOREZBQ1RPUl9PTkU7CgogICAgZHJpX2JvX2VtaXRfcmVsb2MocmVuZGVyX3N0YXRlLT5jYy5zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwKICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihzdHJ1Y3QgaTk2NV9jY191bml0X3N0YXRlLCBjYzQpLAogICAgICAgICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlLT5jYy52aWV3cG9ydCk7CgogICAgZHJpX2JvX3VubWFwKHJlbmRlcl9zdGF0ZS0+Y2Muc3RhdGUpOwp9CgpzdGF0aWMgdm9pZAppOTY1X3JlbmRlcl9zcmNfc3VyZmFjZV9zdGF0ZShWQURyaXZlckNvbnRleHRQIGN0eCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpX2JvICpyZWdpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOyAgCiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CiAgICBzdHJ1Y3QgaTk2NV9zdXJmYWNlX3N0YXRlICpzczsKICAgIGRyaV9ibyAqc3NfYm87CgogICAgc3NfYm8gPSBkcmlfYm9fYWxsb2MoaTk2NS0+aW50ZWwuYnVmbWdyLCAKICAgICAgICAgICAgICAgICAgICAgICJzdXJmYWNlIHN0YXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGk5NjVfc3VyZmFjZV9zdGF0ZSksIDMyKTsKICAgIGFzc2VydChzc19ibyk7CiAgICBkcmlfYm9fbWFwKHNzX2JvLCAxKTsKICAgIGFzc2VydChzc19iby0+dmlydHVhbCk7CiAgICBzcyA9IHNzX2JvLT52aXJ0dWFsOwogICAgbWVtc2V0KHNzLCAwLCBzaXplb2YoKnNzKSk7CiAgICBzcy0+c3MwLnN1cmZhY2VfdHlwZSA9IEk5NjVfU1VSRkFDRV8yRDsKICAgIHNzLT5zczAuc3VyZmFjZV9mb3JtYXQgPSBJOTY1X1NVUkZBQ0VGT1JNQVRfUjhfVU5PUk07CiAgICBzcy0+c3MwLndyaXRlZGlzYWJsZV9hbHBoYSA9IDA7CiAgICBzcy0+c3MwLndyaXRlZGlzYWJsZV9yZWQgPSAwOwogICAgc3MtPnNzMC53cml0ZWRpc2FibGVfZ3JlZW4gPSAwOwogICAgc3MtPnNzMC53cml0ZWRpc2FibGVfYmx1ZSA9IDA7CiAgICBzcy0+c3MwLmNvbG9yX2JsZW5kID0gMTsKICAgIHNzLT5zczAudmVydF9saW5lX3N0cmlkZSA9IDA7CiAgICBzcy0+c3MwLnZlcnRfbGluZV9zdHJpZGVfb2ZzID0gMDsKICAgIHNzLT5zczAubWlwbWFwX2xheW91dF9tb2RlID0gMDsKICAgIHNzLT5zczAucmVuZGVyX2NhY2hlX3JlYWRfbW9kZSA9IDA7CgogICAgc3MtPnNzMS5iYXNlX2FkZHIgPSByZWdpb24tPm9mZnNldCArIG9mZnNldDsKCiAgICBzcy0+c3MyLndpZHRoID0gdyAtIDE7CiAgICBzcy0+c3MyLmhlaWdodCA9IGggLSAxOwogICAgc3MtPnNzMi5taXBfY291bnQgPSAwOwogICAgc3MtPnNzMi5yZW5kZXJfdGFyZ2V0X3JvdGF0aW9uID0gMDsKCiAgICBzcy0+c3MzLnBpdGNoID0gdyAtIDE7CgogICAgZHJpX2JvX2VtaXRfcmVsb2Moc3NfYm8sCiAgICAgICAgICAgICAgICAgICAgICBJOTE1X0dFTV9ET01BSU5fU0FNUExFUiwgMCwKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHN0cnVjdCBpOTY1X3N1cmZhY2Vfc3RhdGUsIHNzMSksCiAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOwoKICAgIGRyaV9ib191bm1hcChzc19ibyk7CgogICAgYXNzZXJ0KGluZGV4IDwgTUFYX1JFTkRFUl9TVVJGQUNFUyk7CiAgICBhc3NlcnQocmVuZGVyX3N0YXRlLT53bS5zdXJmYWNlW2luZGV4XSA9PSBOVUxMKTsKICAgIHJlbmRlcl9zdGF0ZS0+d20uc3VyZmFjZVtpbmRleF0gPSBzc19ibzsKICAgIHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlcl9jb3VudCsrOwp9CgpzdGF0aWMgdm9pZAppOTY1X3N1YnBpY19yZW5kZXJfc3JjX3N1cmZhY2Vfc3RhdGUoVkFEcml2ZXJDb250ZXh0UCBjdHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaV9ibyAqcmVnaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgZm9ybWF0KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsgIAogICAgc3RydWN0IGk5NjVfcmVuZGVyX3N0YXRlICpyZW5kZXJfc3RhdGUgPSAmaTk2NS0+cmVuZGVyX3N0YXRlOwogICAgc3RydWN0IGk5NjVfc3VyZmFjZV9zdGF0ZSAqc3M7CiAgICBkcmlfYm8gKnNzX2JvOwoKICAgIHNzX2JvID0gZHJpX2JvX2FsbG9jKGk5NjUtPmludGVsLmJ1Zm1nciwgCiAgICAgICAgICAgICAgICAgICAgICAic3VyZmFjZSBzdGF0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpOTY1X3N1cmZhY2Vfc3RhdGUpLCAzMik7CiAgICBhc3NlcnQoc3NfYm8pOwogICAgZHJpX2JvX21hcChzc19ibywgMSk7CiAgICBhc3NlcnQoc3NfYm8tPnZpcnR1YWwpOwogICAgc3MgPSBzc19iby0+dmlydHVhbDsKICAgIG1lbXNldChzcywgMCwgc2l6ZW9mKCpzcykpOwogICAgc3MtPnNzMC5zdXJmYWNlX3R5cGUgPSBJOTY1X1NVUkZBQ0VfMkQ7CiAgICBzcy0+c3MwLnN1cmZhY2VfZm9ybWF0ID0gZm9ybWF0OwogICAgc3MtPnNzMC53cml0ZWRpc2FibGVfYWxwaGEgPSAwOwogICAgc3MtPnNzMC53cml0ZWRpc2FibGVfcmVkID0gMDsKICAgIHNzLT5zczAud3JpdGVkaXNhYmxlX2dyZWVuID0gMDsKICAgIHNzLT5zczAud3JpdGVkaXNhYmxlX2JsdWUgPSAwOwogICAgc3MtPnNzMC5jb2xvcl9ibGVuZCA9IDE7CiAgICBzcy0+c3MwLnZlcnRfbGluZV9zdHJpZGUgPSAwOwogICAgc3MtPnNzMC52ZXJ0X2xpbmVfc3RyaWRlX29mcyA9IDA7CiAgICBzcy0+c3MwLm1pcG1hcF9sYXlvdXRfbW9kZSA9IDA7CiAgICBzcy0+c3MwLnJlbmRlcl9jYWNoZV9yZWFkX21vZGUgPSAwOwoKICAgIHNzLT5zczEuYmFzZV9hZGRyID0gcmVnaW9uLT5vZmZzZXQgKyBvZmZzZXQ7CgogICAgc3MtPnNzMi53aWR0aCA9IHcgLSAxOwogICAgc3MtPnNzMi5oZWlnaHQgPSBoIC0gMTsKICAgIHNzLT5zczIubWlwX2NvdW50ID0gMDsKICAgIHNzLT5zczIucmVuZGVyX3RhcmdldF9yb3RhdGlvbiA9IDA7CgogICAgc3MtPnNzMy5waXRjaCA9IHcgLSAxOwoKICAgIGRyaV9ib19lbWl0X3JlbG9jKHNzX2JvLAogICAgICAgICAgICAgICAgICAgICAgSTkxNV9HRU1fRE9NQUlOX1NBTVBMRVIsIDAsCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihzdHJ1Y3QgaTk2NV9zdXJmYWNlX3N0YXRlLCBzczEpLAogICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKCiAgICBkcmlfYm9fdW5tYXAoc3NfYm8pOwoKICAgIGFzc2VydChpbmRleCA8IE1BWF9SRU5ERVJfU1VSRkFDRVMpOwogICAgYXNzZXJ0KHJlbmRlcl9zdGF0ZS0+d20uc3VyZmFjZVtpbmRleF0gPT0gTlVMTCk7CiAgICByZW5kZXJfc3RhdGUtPndtLnN1cmZhY2VbaW5kZXhdID0gc3NfYm87CiAgICByZW5kZXJfc3RhdGUtPndtLnNhbXBsZXJfY291bnQrKzsKfQoKc3RhdGljIHZvaWQKaTk2NV9yZW5kZXJfc3JjX3N1cmZhY2VzX3N0YXRlKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVN1cmZhY2VJRCBzdXJmYWNlKQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsgIAogICAgc3RydWN0IG9iamVjdF9zdXJmYWNlICpvYmpfc3VyZmFjZTsKICAgIGludCB3LCBoOwogICAgZHJpX2JvICpyZWdpb247CgogICAgb2JqX3N1cmZhY2UgPSBTVVJGQUNFKHN1cmZhY2UpOwogICAgYXNzZXJ0KG9ial9zdXJmYWNlKTsKICAgIGFzc2VydChvYmpfc3VyZmFjZS0+Ym8pOwogICAgdyA9IG9ial9zdXJmYWNlLT53aWR0aDsKICAgIGggPSBvYmpfc3VyZmFjZS0+aGVpZ2h0OwogICAgcmVnaW9uID0gb2JqX3N1cmZhY2UtPmJvOwoKICAgIGk5NjVfcmVuZGVyX3NyY19zdXJmYWNlX3N0YXRlKGN0eCwgMSwgcmVnaW9uLCAwLCB3LCBoKTsgICAgIC8qIFkgKi8KICAgIGk5NjVfcmVuZGVyX3NyY19zdXJmYWNlX3N0YXRlKGN0eCwgMiwgcmVnaW9uLCAwLCB3LCBoKTsKICAgIGk5NjVfcmVuZGVyX3NyY19zdXJmYWNlX3N0YXRlKGN0eCwgMywgcmVnaW9uLCB3ICogaCArIHcgKiBoIC8gNCwgdyAvIDIsIGggLyAyKTsgICAgIC8qIFYgKi8KICAgIGk5NjVfcmVuZGVyX3NyY19zdXJmYWNlX3N0YXRlKGN0eCwgNCwgcmVnaW9uLCB3ICogaCArIHcgKiBoIC8gNCwgdyAvIDIsIGggLyAyKTsKICAgIGk5NjVfcmVuZGVyX3NyY19zdXJmYWNlX3N0YXRlKGN0eCwgNSwgcmVnaW9uLCB3ICogaCwgdyAvIDIsIGggLyAyKTsgLyogVSAqLwogICAgaTk2NV9yZW5kZXJfc3JjX3N1cmZhY2Vfc3RhdGUoY3R4LCA2LCByZWdpb24sIHcgKiBoLCB3IC8gMiwgaCAvIDIpOwp9CgpzdGF0aWMgdm9pZAppOTY1X3N1YnBpY19yZW5kZXJfc3JjX3N1cmZhY2VzX3N0YXRlKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVN1cmZhY2VJRCBzdXJmYWNlKQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsgIAogICAgc3RydWN0IG9iamVjdF9zdXJmYWNlICpvYmpfc3VyZmFjZSA9IFNVUkZBQ0Uoc3VyZmFjZSk7CiAgICBpbnQgdywgaDsKICAgIGRyaV9ibyAqcmVnaW9uOwogICAgZHJpX2JvICpzdWJwaWNfcmVnaW9uOwogICAgc3RydWN0IG9iamVjdF9zdWJwaWMgKm9ial9zdWJwaWMgPSBTVUJQSUMob2JqX3N1cmZhY2UtPnN1YnBpYyk7CiAgICBzdHJ1Y3Qgb2JqZWN0X2ltYWdlICpvYmpfaW1hZ2UgPSBJTUFHRShvYmpfc3VicGljLT5pbWFnZSk7CiAgICBhc3NlcnQob2JqX3N1cmZhY2UpOwogICAgYXNzZXJ0KG9ial9zdXJmYWNlLT5ibyk7CiAgICB3ID0gb2JqX3N1cmZhY2UtPndpZHRoOwogICAgaCA9IG9ial9zdXJmYWNlLT5oZWlnaHQ7CiAgICByZWdpb24gPSBvYmpfc3VyZmFjZS0+Ym87CiAgICBzdWJwaWNfcmVnaW9uID0gb2JqX2ltYWdlLT5ibzsKICAgIC8qc3VicGljdHVyZSBzdXJmYWNlKi8KICAgIGk5NjVfc3VicGljX3JlbmRlcl9zcmNfc3VyZmFjZV9zdGF0ZShjdHgsIDEsIHN1YnBpY19yZWdpb24sIDAsIG9ial9zdWJwaWMtPndpZHRoLCBvYmpfc3VicGljLT5oZWlnaHQsIG9ial9zdWJwaWMtPmZvcm1hdCk7ICAgICAKICAgIGk5NjVfc3VicGljX3JlbmRlcl9zcmNfc3VyZmFjZV9zdGF0ZShjdHgsIDIsIHN1YnBpY19yZWdpb24sIDAsIG9ial9zdWJwaWMtPndpZHRoLCBvYmpfc3VicGljLT5oZWlnaHQsIG9ial9zdWJwaWMtPmZvcm1hdCk7ICAgICAKfQoKc3RhdGljIHZvaWQKaTk2NV9yZW5kZXJfc2V0X3N1cmZhY2VfdGlsaW5nKHN0cnVjdCBpOTY1X3N1cmZhY2Vfc3RhdGUgKnNzLCB1bnNpZ25lZCBpbnQgdGlsaW5nKQp7CiAgICBzd2l0Y2ggKHRpbGluZykgewogICAgY2FzZSBJOTE1X1RJTElOR19OT05FOgogICAgICAgIHNzLT5zczMudGlsZWRfc3VyZmFjZSA9IDA7CiAgICAgICAgc3MtPnNzMy50aWxlX3dhbGsgPSAwOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJOTE1X1RJTElOR19YOgogICAgICAgIHNzLT5zczMudGlsZWRfc3VyZmFjZSA9IDE7CiAgICAgICAgc3MtPnNzMy50aWxlX3dhbGsgPSBJOTY1X1RJTEVXQUxLX1hNQUpPUjsKICAgICAgICBicmVhazsKICAgIGNhc2UgSTkxNV9USUxJTkdfWToKICAgICAgICBzcy0+c3MzLnRpbGVkX3N1cmZhY2UgPSAxOwogICAgICAgIHNzLT5zczMudGlsZV93YWxrID0gSTk2NV9USUxFV0FMS19ZTUFKT1I7CiAgICAgICAgYnJlYWs7CiAgICB9Cn0KCnN0YXRpYyB2b2lkCmk5NjVfcmVuZGVyX2Rlc3Rfc3VyZmFjZV9zdGF0ZShWQURyaXZlckNvbnRleHRQIGN0eCwgaW50IGluZGV4KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsgIAogICAgc3RydWN0IGk5NjVfcmVuZGVyX3N0YXRlICpyZW5kZXJfc3RhdGUgPSAmaTk2NS0+cmVuZGVyX3N0YXRlOwogICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZGVzdF9yZWdpb24gPSByZW5kZXJfc3RhdGUtPmRyYXdfcmVnaW9uOwogICAgc3RydWN0IGk5NjVfc3VyZmFjZV9zdGF0ZSAqc3M7CiAgICBkcmlfYm8gKnNzX2JvOwoKICAgIHNzX2JvID0gZHJpX2JvX2FsbG9jKGk5NjUtPmludGVsLmJ1Zm1nciwgCiAgICAgICAgICAgICAgICAgICAgICAic3VyZmFjZSBzdGF0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpOTY1X3N1cmZhY2Vfc3RhdGUpLCAzMik7CiAgICBhc3NlcnQoc3NfYm8pOwogICAgZHJpX2JvX21hcChzc19ibywgMSk7CiAgICBhc3NlcnQoc3NfYm8tPnZpcnR1YWwpOwogICAgc3MgPSBzc19iby0+dmlydHVhbDsKICAgIG1lbXNldChzcywgMCwgc2l6ZW9mKCpzcykpOwoKICAgIHNzLT5zczAuc3VyZmFjZV90eXBlID0gSTk2NV9TVVJGQUNFXzJEOwogICAgc3MtPnNzMC5kYXRhX3JldHVybl9mb3JtYXQgPSBJOTY1X1NVUkZBQ0VSRVRVUk5GT1JNQVRfRkxPQVQzMjsKCiAgICBpZiAoZGVzdF9yZWdpb24tPmNwcCA9PSAyKSB7Cglzcy0+c3MwLnN1cmZhY2VfZm9ybWF0ID0gSTk2NV9TVVJGQUNFRk9STUFUX0I1RzZSNV9VTk9STTsKCX0gZWxzZSB7Cglzcy0+c3MwLnN1cmZhY2VfZm9ybWF0ID0gSTk2NV9TVVJGQUNFRk9STUFUX0I4RzhSOEE4X1VOT1JNOwogICAgfQoKICAgIHNzLT5zczAud3JpdGVkaXNhYmxlX2FscGhhID0gMDsKICAgIHNzLT5zczAud3JpdGVkaXNhYmxlX3JlZCA9IDA7CiAgICBzcy0+c3MwLndyaXRlZGlzYWJsZV9ncmVlbiA9IDA7CiAgICBzcy0+c3MwLndyaXRlZGlzYWJsZV9ibHVlID0gMDsKICAgIHNzLT5zczAuY29sb3JfYmxlbmQgPSAxOwogICAgc3MtPnNzMC52ZXJ0X2xpbmVfc3RyaWRlID0gMDsKICAgIHNzLT5zczAudmVydF9saW5lX3N0cmlkZV9vZnMgPSAwOwogICAgc3MtPnNzMC5taXBtYXBfbGF5b3V0X21vZGUgPSAwOwogICAgc3MtPnNzMC5yZW5kZXJfY2FjaGVfcmVhZF9tb2RlID0gMDsKCiAgICBzcy0+c3MxLmJhc2VfYWRkciA9IGRlc3RfcmVnaW9uLT5iby0+b2Zmc2V0OwoKICAgIHNzLT5zczIud2lkdGggPSBkZXN0X3JlZ2lvbi0+d2lkdGggLSAxOwogICAgc3MtPnNzMi5oZWlnaHQgPSBkZXN0X3JlZ2lvbi0+aGVpZ2h0IC0gMTsKICAgIHNzLT5zczIubWlwX2NvdW50ID0gMDsKICAgIHNzLT5zczIucmVuZGVyX3RhcmdldF9yb3RhdGlvbiA9IDA7CiAgICBzcy0+c3MzLnBpdGNoID0gZGVzdF9yZWdpb24tPnBpdGNoIC0gMTsKICAgIGk5NjVfcmVuZGVyX3NldF9zdXJmYWNlX3RpbGluZyhzcywgZGVzdF9yZWdpb24tPnRpbGluZyk7CgogICAgZHJpX2JvX2VtaXRfcmVsb2Moc3NfYm8sCiAgICAgICAgICAgICAgICAgICAgICBJOTE1X0dFTV9ET01BSU5fUkVOREVSLCBJOTE1X0dFTV9ET01BSU5fUkVOREVSLAogICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHN0cnVjdCBpOTY1X3N1cmZhY2Vfc3RhdGUsIHNzMSksCiAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JlZ2lvbi0+Ym8pOwoKICAgIGRyaV9ib191bm1hcChzc19ibyk7CgogICAgYXNzZXJ0KGluZGV4IDwgTUFYX1JFTkRFUl9TVVJGQUNFUyk7CiAgICBhc3NlcnQocmVuZGVyX3N0YXRlLT53bS5zdXJmYWNlW2luZGV4XSA9PSBOVUxMKTsKICAgIHJlbmRlcl9zdGF0ZS0+d20uc3VyZmFjZVtpbmRleF0gPSBzc19ibzsKfQoKc3RhdGljIHZvaWQKaTk2NV9yZW5kZXJfYmluZGluZ190YWJsZShWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CiAgICBpbnQgaTsKICAgIHVuc2lnbmVkIGludCAqYmluZGluZ190YWJsZTsKCiAgICBkcmlfYm9fbWFwKHJlbmRlcl9zdGF0ZS0+d20uYmluZGluZ190YWJsZSwgMSk7CiAgICBhc3NlcnQocmVuZGVyX3N0YXRlLT53bS5iaW5kaW5nX3RhYmxlLT52aXJ0dWFsKTsKICAgIGJpbmRpbmdfdGFibGUgPSByZW5kZXJfc3RhdGUtPndtLmJpbmRpbmdfdGFibGUtPnZpcnR1YWw7CiAgICBtZW1zZXQoYmluZGluZ190YWJsZSwgMCwgcmVuZGVyX3N0YXRlLT53bS5iaW5kaW5nX3RhYmxlLT5zaXplKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1JFTkRFUl9TVVJGQUNFUzsgaSsrKSB7CiAgICAgICAgaWYgKHJlbmRlcl9zdGF0ZS0+d20uc3VyZmFjZVtpXSkgewogICAgICAgICAgICBiaW5kaW5nX3RhYmxlW2ldID0gcmVuZGVyX3N0YXRlLT53bS5zdXJmYWNlW2ldLT5vZmZzZXQ7CiAgICAgICAgICAgIGRyaV9ib19lbWl0X3JlbG9jKHJlbmRlcl9zdGF0ZS0+d20uYmluZGluZ190YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICogc2l6ZW9mKCpiaW5kaW5nX3RhYmxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlLT53bS5zdXJmYWNlW2ldKTsKICAgICAgICB9CiAgICB9CgogICAgZHJpX2JvX3VubWFwKHJlbmRlcl9zdGF0ZS0+d20uYmluZGluZ190YWJsZSk7Cn0KCnN0YXRpYyB2b2lkIAppOTY1X3N1YnBpY19yZW5kZXJfdXBsb2FkX3ZlcnRleChWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFTdXJmYWNlSUQgc3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVkFSZWN0YW5nbGUgKm91dHB1dF9yZWN0KQp7ICAgIAogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgICppOTY1ICAgICAgICAgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CiAgICBzdHJ1Y3Qgb2JqZWN0X3N1cmZhY2UgICAgKm9ial9zdXJmYWNlICA9IFNVUkZBQ0Uoc3VyZmFjZSk7CiAgICBzdHJ1Y3Qgb2JqZWN0X3N1YnBpYyAgICAgKm9ial9zdWJwaWMgICA9IFNVQlBJQyhvYmpfc3VyZmFjZS0+c3VicGljKTsKCiAgICBjb25zdCBmbG9hdCBwc3ggPSAoZmxvYXQpb2JqX3N1cmZhY2UtPndpZHRoICAvIChmbG9hdClvYmpfc3VicGljLT53aWR0aDsKICAgIGNvbnN0IGZsb2F0IHBzeSA9IChmbG9hdClvYmpfc3VyZmFjZS0+aGVpZ2h0IC8gKGZsb2F0KW9ial9zdWJwaWMtPmhlaWdodDsKICAgIGNvbnN0IGZsb2F0IHNzeCA9IChmbG9hdClvdXRwdXRfcmVjdC0+d2lkdGggIC8gKGZsb2F0KW9ial9zdXJmYWNlLT53aWR0aDsKICAgIGNvbnN0IGZsb2F0IHNzeSA9IChmbG9hdClvdXRwdXRfcmVjdC0+aGVpZ2h0IC8gKGZsb2F0KW9ial9zdXJmYWNlLT5oZWlnaHQ7CiAgICBjb25zdCBmbG9hdCBzeCAgPSBwc3ggKiBzc3g7CiAgICBjb25zdCBmbG9hdCBzeSAgPSBwc3kgKiBzc3k7CiAgICBmbG9hdCAqdmIsIHR4MSwgdHgyLCB0eTEsIHR5MiwgeDEsIHgyLCB5MSwgeTI7CiAgICBpbnQgaSA9IDA7CgogICAgVkFSZWN0YW5nbGUgZHN0X3JlY3Q7CiAgICBkc3RfcmVjdC54ICAgICAgPSBvdXRwdXRfcmVjdC0+eCArIHN4ICogKGZsb2F0KW9ial9zdWJwaWMtPmRzdF9yZWN0Lng7CiAgICBkc3RfcmVjdC55ICAgICAgPSBvdXRwdXRfcmVjdC0+eSArIHN4ICogKGZsb2F0KW9ial9zdWJwaWMtPmRzdF9yZWN0Lnk7CiAgICBkc3RfcmVjdC53aWR0aCAgPSBzeCAqIChmbG9hdClvYmpfc3VicGljLT5kc3RfcmVjdC53aWR0aDsKICAgIGRzdF9yZWN0LmhlaWdodCA9IHN5ICogKGZsb2F0KW9ial9zdWJwaWMtPmRzdF9yZWN0LmhlaWdodDsKCiAgICBkcmlfYm9fbWFwKHJlbmRlcl9zdGF0ZS0+dmIudmVydGV4X2J1ZmZlciwgMSk7CiAgICBhc3NlcnQocmVuZGVyX3N0YXRlLT52Yi52ZXJ0ZXhfYnVmZmVyLT52aXJ0dWFsKTsKICAgIHZiID0gcmVuZGVyX3N0YXRlLT52Yi52ZXJ0ZXhfYnVmZmVyLT52aXJ0dWFsOwoKICAgIHR4MSA9IChmbG9hdClvYmpfc3VicGljLT5zcmNfcmVjdC54IC8gKGZsb2F0KW9ial9zdWJwaWMtPndpZHRoOwogICAgdHkxID0gKGZsb2F0KW9ial9zdWJwaWMtPnNyY19yZWN0LnkgLyAoZmxvYXQpb2JqX3N1YnBpYy0+aGVpZ2h0OwogICAgdHgyID0gKGZsb2F0KShvYmpfc3VicGljLT5zcmNfcmVjdC54ICsgb2JqX3N1YnBpYy0+c3JjX3JlY3Qud2lkdGgpIC8gKGZsb2F0KW9ial9zdWJwaWMtPndpZHRoOwogICAgdHkyID0gKGZsb2F0KShvYmpfc3VicGljLT5zcmNfcmVjdC55ICsgb2JqX3N1YnBpYy0+c3JjX3JlY3QuaGVpZ2h0KSAvIChmbG9hdClvYmpfc3VicGljLT5oZWlnaHQ7CgogICAgeDEgPSAoZmxvYXQpZHN0X3JlY3QueDsKICAgIHkxID0gKGZsb2F0KWRzdF9yZWN0Lnk7CiAgICB4MiA9IChmbG9hdCkoZHN0X3JlY3QueCArIGRzdF9yZWN0LndpZHRoKTsKICAgIHkyID0gKGZsb2F0KShkc3RfcmVjdC55ICsgZHN0X3JlY3QuaGVpZ2h0KTsKCiAgICB2YltpKytdID0gdHgyOwogICAgdmJbaSsrXSA9IHR5MjsKICAgIHZiW2krK10gPSB4MjsKICAgIHZiW2krK10gPSB5MjsKCiAgICB2YltpKytdID0gdHgxOwogICAgdmJbaSsrXSA9IHR5MjsKICAgIHZiW2krK10gPSB4MTsKICAgIHZiW2krK10gPSB5MjsKCiAgICB2YltpKytdID0gdHgxOwogICAgdmJbaSsrXSA9IHR5MTsKICAgIHZiW2krK10gPSB4MTsKICAgIHZiW2krK10gPSB5MTsKICAgIGRyaV9ib191bm1hcChyZW5kZXJfc3RhdGUtPnZiLnZlcnRleF9idWZmZXIpOwp9CgpzdGF0aWMgdm9pZCAKaTk2NV9yZW5kZXJfdXBsb2FkX3ZlcnRleChWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICBWQVN1cmZhY2VJRCBzdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHNyY3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgc3JjeSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzcmN3LAogICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNyY2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgZGVzdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgZGVzdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZGVzdHcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZGVzdGgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IGk5NjVfcmVuZGVyX3N0YXRlICpyZW5kZXJfc3RhdGUgPSAmaTk2NS0+cmVuZGVyX3N0YXRlOwogICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZGVzdF9yZWdpb24gPSByZW5kZXJfc3RhdGUtPmRyYXdfcmVnaW9uOwogICAgc3RydWN0IG9iamVjdF9zdXJmYWNlICpvYmpfc3VyZmFjZTsKICAgIGZsb2F0ICp2YjsKCiAgICBmbG9hdCB1MSwgdjEsIHUyLCB2MjsKICAgIGludCBpLCB3aWR0aCwgaGVpZ2h0OwogICAgaW50IGJveF94MSA9IGRlc3RfcmVnaW9uLT54ICsgZGVzdHg7CiAgICBpbnQgYm94X3kxID0gZGVzdF9yZWdpb24tPnkgKyBkZXN0eTsKICAgIGludCBib3hfeDIgPSBib3hfeDEgKyBkZXN0dzsKICAgIGludCBib3hfeTIgPSBib3hfeTEgKyBkZXN0aDsKCiAgICBvYmpfc3VyZmFjZSA9IFNVUkZBQ0Uoc3VyZmFjZSk7CiAgICBhc3NlcnQoc3VyZmFjZSk7CiAgICB3aWR0aCA9IG9ial9zdXJmYWNlLT53aWR0aDsKICAgIGhlaWdodCA9IG9ial9zdXJmYWNlLT5oZWlnaHQ7CgogICAgdTEgPSAoZmxvYXQpc3JjeCAvIHdpZHRoOwogICAgdjEgPSAoZmxvYXQpc3JjeSAvIGhlaWdodDsKICAgIHUyID0gKGZsb2F0KShzcmN4ICsgc3JjdykgLyB3aWR0aDsKICAgIHYyID0gKGZsb2F0KShzcmN5ICsgc3JjaCkgLyBoZWlnaHQ7CgogICAgZHJpX2JvX21hcChyZW5kZXJfc3RhdGUtPnZiLnZlcnRleF9idWZmZXIsIDEpOwogICAgYXNzZXJ0KHJlbmRlcl9zdGF0ZS0+dmIudmVydGV4X2J1ZmZlci0+dmlydHVhbCk7CiAgICB2YiA9IHJlbmRlcl9zdGF0ZS0+dmIudmVydGV4X2J1ZmZlci0+dmlydHVhbDsKCiAgICBpID0gMDsKICAgIHZiW2krK10gPSB1MjsKICAgIHZiW2krK10gPSB2MjsKICAgIHZiW2krK10gPSAoZmxvYXQpYm94X3gyOwogICAgdmJbaSsrXSA9IChmbG9hdClib3hfeTI7CiAgICAKICAgIHZiW2krK10gPSB1MTsKICAgIHZiW2krK10gPSB2MjsKICAgIHZiW2krK10gPSAoZmxvYXQpYm94X3gxOwogICAgdmJbaSsrXSA9IChmbG9hdClib3hfeTI7CgogICAgdmJbaSsrXSA9IHUxOwogICAgdmJbaSsrXSA9IHYxOwogICAgdmJbaSsrXSA9IChmbG9hdClib3hfeDE7CiAgICB2YltpKytdID0gKGZsb2F0KWJveF95MTsKCiAgICBkcmlfYm9fdW5tYXAocmVuZGVyX3N0YXRlLT52Yi52ZXJ0ZXhfYnVmZmVyKTsKfQoKc3RhdGljIHZvaWQKaTk2NV9zdXJmYWNlX3JlbmRlcl9zdGF0ZV9zZXR1cChWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgVkFTdXJmYWNlSUQgc3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgc3JjeCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgc3JjeSwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc3JjdywKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc3JjaCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgZGVzdHgsCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGRlc3R5LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZXN0dywKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZGVzdGgpCnsKICAgIGk5NjVfcmVuZGVyX3ZzX3VuaXQoY3R4KTsKICAgIGk5NjVfcmVuZGVyX3NmX3VuaXQoY3R4KTsKICAgIGk5NjVfcmVuZGVyX2Rlc3Rfc3VyZmFjZV9zdGF0ZShjdHgsIDApOwogICAgaTk2NV9yZW5kZXJfc3JjX3N1cmZhY2VzX3N0YXRlKGN0eCwgc3VyZmFjZSk7CiAgICBpOTY1X3JlbmRlcl9zYW1wbGVyKGN0eCk7CiAgICBpOTY1X3JlbmRlcl93bV91bml0KGN0eCk7CiAgICBpOTY1X3JlbmRlcl9jY192aWV3cG9ydChjdHgpOwogICAgaTk2NV9yZW5kZXJfY2NfdW5pdChjdHgpOwogICAgaTk2NV9yZW5kZXJfYmluZGluZ190YWJsZShjdHgpOwogICAgaTk2NV9yZW5kZXJfdXBsb2FkX3ZlcnRleChjdHgsIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3gsIHNyY3ksIHNyY3csIHNyY2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3R4LCBkZXN0eSwgZGVzdHcsIGRlc3RoKTsKfQpzdGF0aWMgdm9pZAppOTY1X3N1YnBpY19yZW5kZXJfc3RhdGVfc2V0dXAoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgIFZBU3VyZmFjZUlEIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHNyY3gsCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHNyY3ksCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNyY3csCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNyY2gsCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGRlc3R4LAogICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBkZXN0eSwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZGVzdHcsCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlc3RoKQp7CiAgICBpOTY1X3JlbmRlcl92c191bml0KGN0eCk7CiAgICBpOTY1X3JlbmRlcl9zZl91bml0KGN0eCk7CiAgICBpOTY1X3JlbmRlcl9kZXN0X3N1cmZhY2Vfc3RhdGUoY3R4LCAwKTsKICAgIGk5NjVfc3VicGljX3JlbmRlcl9zcmNfc3VyZmFjZXNfc3RhdGUoY3R4LCBzdXJmYWNlKTsKICAgIGk5NjVfcmVuZGVyX3NhbXBsZXIoY3R4KTsKICAgIGk5NjVfc3VicGljX3JlbmRlcl93bV91bml0KGN0eCk7CiAgICBpOTY1X3JlbmRlcl9jY192aWV3cG9ydChjdHgpOwogICAgaTk2NV9zdWJwaWNfcmVuZGVyX2NjX3VuaXQoY3R4KTsKICAgIGk5NjVfcmVuZGVyX2JpbmRpbmdfdGFibGUoY3R4KTsKCiAgICBWQVJlY3RhbmdsZSBvdXRwdXRfcmVjdDsKICAgIG91dHB1dF9yZWN0LnggICAgICA9IGRlc3R4OwogICAgb3V0cHV0X3JlY3QueSAgICAgID0gZGVzdHk7CiAgICBvdXRwdXRfcmVjdC53aWR0aCAgPSBkZXN0dzsKICAgIG91dHB1dF9yZWN0LmhlaWdodCA9IGRlc3RoOwogICAgaTk2NV9zdWJwaWNfcmVuZGVyX3VwbG9hZF92ZXJ0ZXgoY3R4LCBzdXJmYWNlLCAmb3V0cHV0X3JlY3QpOwp9CgoKc3RhdGljIHZvaWQKaTk2NV9yZW5kZXJfcGlwZWxpbmVfc2VsZWN0KFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBCRUdJTl9CQVRDSChjdHgsIDEpOwogICAgT1VUX0JBVENIKGN0eCwgQ01EX1BJUEVMSU5FX1NFTEVDVCB8IFBJUEVMSU5FX1NFTEVDVF8zRCk7CiAgICBBRFZBTkNFX0JBVENIKGN0eCk7Cn0KCnN0YXRpYyB2b2lkCmk5NjVfcmVuZGVyX3N0YXRlX3NpcChWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgQkVHSU5fQkFUQ0goY3R4LCAyKTsKICAgIE9VVF9CQVRDSChjdHgsIENNRF9TVEFURV9TSVAgfCAwKTsKICAgIE9VVF9CQVRDSChjdHgsIDApOwogICAgQURWQU5DRV9CQVRDSChjdHgpOwp9CgpzdGF0aWMgdm9pZAppOTY1X3JlbmRlcl9zdGF0ZV9iYXNlX2FkZHJlc3MoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwoKICAgIGlmIChJU19JR0RORyhpOTY1LT5pbnRlbC5kZXZpY2VfaWQpKSB7CiAgICAgICAgQkVHSU5fQkFUQ0goY3R4LCA4KTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCBDTURfU1RBVEVfQkFTRV9BRERSRVNTIHwgNik7CiAgICAgICAgT1VUX0JBVENIKGN0eCwgMCB8IEJBU0VfQUREUkVTU19NT0RJRlkpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIDAgfCBCQVNFX0FERFJFU1NfTU9ESUZZKTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCAwIHwgQkFTRV9BRERSRVNTX01PRElGWSk7CiAgICAgICAgT1VUX0JBVENIKGN0eCwgMCB8IEJBU0VfQUREUkVTU19NT0RJRlkpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIDAgfCBCQVNFX0FERFJFU1NfTU9ESUZZKTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCAwIHwgQkFTRV9BRERSRVNTX01PRElGWSk7CiAgICAgICAgT1VUX0JBVENIKGN0eCwgMCB8IEJBU0VfQUREUkVTU19NT0RJRlkpOwogICAgICAgIEFEVkFOQ0VfQkFUQ0goY3R4KTsKICAgIH0gZWxzZSB7CiAgICAgICAgQkVHSU5fQkFUQ0goY3R4LCA2KTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCBDTURfU1RBVEVfQkFTRV9BRERSRVNTIHwgNCk7CiAgICAgICAgT1VUX0JBVENIKGN0eCwgMCB8IEJBU0VfQUREUkVTU19NT0RJRlkpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIDAgfCBCQVNFX0FERFJFU1NfTU9ESUZZKTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCAwIHwgQkFTRV9BRERSRVNTX01PRElGWSk7CiAgICAgICAgT1VUX0JBVENIKGN0eCwgMCB8IEJBU0VfQUREUkVTU19NT0RJRlkpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIDAgfCBCQVNFX0FERFJFU1NfTU9ESUZZKTsKICAgICAgICBBRFZBTkNFX0JBVENIKGN0eCk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkCmk5NjVfcmVuZGVyX2JpbmRpbmdfdGFibGVfcG9pbnRlcnMoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IGk5NjVfcmVuZGVyX3N0YXRlICpyZW5kZXJfc3RhdGUgPSAmaTk2NS0+cmVuZGVyX3N0YXRlOwoKICAgIEJFR0lOX0JBVENIKGN0eCwgNik7CiAgICBPVVRfQkFUQ0goY3R4LCBDTURfQklORElOR19UQUJMRV9QT0lOVEVSUyB8IDQpOwogICAgT1VUX0JBVENIKGN0eCwgMCk7IC8qIHZzICovCiAgICBPVVRfQkFUQ0goY3R4LCAwKTsgLyogZ3MgKi8KICAgIE9VVF9CQVRDSChjdHgsIDApOyAvKiBjbGlwICovCiAgICBPVVRfQkFUQ0goY3R4LCAwKTsgLyogc2YgKi8KICAgIE9VVF9SRUxPQyhjdHgsIHJlbmRlcl9zdGF0ZS0+d20uYmluZGluZ190YWJsZSwgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLCAwKTsgLyogd20gKi8KICAgIEFEVkFOQ0VfQkFUQ0goY3R4KTsKfQoKc3RhdGljIHZvaWQgCmk5NjVfcmVuZGVyX2NvbnN0YW50X2NvbG9yKFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBCRUdJTl9CQVRDSChjdHgsIDUpOwogICAgT1VUX0JBVENIKGN0eCwgQ01EX0NPTlNUQU5UX0NPTE9SIHwgMyk7CiAgICBPVVRfQkFUQ0goY3R4LCBmbG9hdF90b191aW50KDEuMCkpOwogICAgT1VUX0JBVENIKGN0eCwgZmxvYXRfdG9fdWludCgwLjApKTsKICAgIE9VVF9CQVRDSChjdHgsIGZsb2F0X3RvX3VpbnQoMS4wKSk7CiAgICBPVVRfQkFUQ0goY3R4LCBmbG9hdF90b191aW50KDEuMCkpOwogICAgQURWQU5DRV9CQVRDSChjdHgpOwp9CgpzdGF0aWMgdm9pZAppOTY1X3JlbmRlcl9waXBlbGluZWRfcG9pbnRlcnMoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IGk5NjVfcmVuZGVyX3N0YXRlICpyZW5kZXJfc3RhdGUgPSAmaTk2NS0+cmVuZGVyX3N0YXRlOwoKICAgIEJFR0lOX0JBVENIKGN0eCwgNyk7CiAgICBPVVRfQkFUQ0goY3R4LCBDTURfUElQRUxJTkVEX1BPSU5URVJTIHwgNSk7CiAgICBPVVRfUkVMT0MoY3R4LCByZW5kZXJfc3RhdGUtPnZzLnN0YXRlLCBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsIDApOwogICAgT1VUX0JBVENIKGN0eCwgMCk7ICAvKiBkaXNhYmxlIEdTICovCiAgICBPVVRfQkFUQ0goY3R4LCAwKTsgIC8qIGRpc2FibGUgQ0xJUCAqLwogICAgT1VUX1JFTE9DKGN0eCwgcmVuZGVyX3N0YXRlLT5zZi5zdGF0ZSwgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLCAwKTsKICAgIE9VVF9SRUxPQyhjdHgsIHJlbmRlcl9zdGF0ZS0+d20uc3RhdGUsIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwgMCk7CiAgICBPVVRfUkVMT0MoY3R4LCByZW5kZXJfc3RhdGUtPmNjLnN0YXRlLCBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsIDApOwogICAgQURWQU5DRV9CQVRDSChjdHgpOwp9CgpzdGF0aWMgdm9pZAppOTY1X3JlbmRlcl91cmJfbGF5b3V0KFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBpbnQgdXJiX3ZzX3N0YXJ0LCB1cmJfdnNfc2l6ZTsKICAgIGludCB1cmJfZ3Nfc3RhcnQsIHVyYl9nc19zaXplOwogICAgaW50IHVyYl9jbGlwX3N0YXJ0LCB1cmJfY2xpcF9zaXplOwogICAgaW50IHVyYl9zZl9zdGFydCwgdXJiX3NmX3NpemU7CiAgICBpbnQgdXJiX2NzX3N0YXJ0LCB1cmJfY3Nfc2l6ZTsKCiAgICB1cmJfdnNfc3RhcnQgPSAwOwogICAgdXJiX3ZzX3NpemUgPSBVUkJfVlNfRU5UUklFUyAqIFVSQl9WU19FTlRSWV9TSVpFOwogICAgdXJiX2dzX3N0YXJ0ID0gdXJiX3ZzX3N0YXJ0ICsgdXJiX3ZzX3NpemU7CiAgICB1cmJfZ3Nfc2l6ZSA9IFVSQl9HU19FTlRSSUVTICogVVJCX0dTX0VOVFJZX1NJWkU7CiAgICB1cmJfY2xpcF9zdGFydCA9IHVyYl9nc19zdGFydCArIHVyYl9nc19zaXplOwogICAgdXJiX2NsaXBfc2l6ZSA9IFVSQl9DTElQX0VOVFJJRVMgKiBVUkJfQ0xJUF9FTlRSWV9TSVpFOwogICAgdXJiX3NmX3N0YXJ0ID0gdXJiX2NsaXBfc3RhcnQgKyB1cmJfY2xpcF9zaXplOwogICAgdXJiX3NmX3NpemUgPSBVUkJfU0ZfRU5UUklFUyAqIFVSQl9TRl9FTlRSWV9TSVpFOwogICAgdXJiX2NzX3N0YXJ0ID0gdXJiX3NmX3N0YXJ0ICsgdXJiX3NmX3NpemU7CiAgICB1cmJfY3Nfc2l6ZSA9IFVSQl9DU19FTlRSSUVTICogVVJCX0NTX0VOVFJZX1NJWkU7CgogICAgQkVHSU5fQkFUQ0goY3R4LCAzKTsKICAgIE9VVF9CQVRDSChjdHgsIAogICAgICAgICAgICAgIENNRF9VUkJfRkVOQ0UgfAogICAgICAgICAgICAgIFVGMF9DU19SRUFMTE9DIHwKICAgICAgICAgICAgICBVRjBfU0ZfUkVBTExPQyB8CiAgICAgICAgICAgICAgVUYwX0NMSVBfUkVBTExPQyB8CiAgICAgICAgICAgICAgVUYwX0dTX1JFQUxMT0MgfAogICAgICAgICAgICAgIFVGMF9WU19SRUFMTE9DIHwKICAgICAgICAgICAgICAxKTsKICAgIE9VVF9CQVRDSChjdHgsIAogICAgICAgICAgICAgICgodXJiX2NsaXBfc3RhcnQgKyB1cmJfY2xpcF9zaXplKSA8PCBVRjFfQ0xJUF9GRU5DRV9TSElGVCkgfAogICAgICAgICAgICAgICgodXJiX2dzX3N0YXJ0ICsgdXJiX2dzX3NpemUpIDw8IFVGMV9HU19GRU5DRV9TSElGVCkgfAogICAgICAgICAgICAgICgodXJiX3ZzX3N0YXJ0ICsgdXJiX3ZzX3NpemUpIDw8IFVGMV9WU19GRU5DRV9TSElGVCkpOwogICAgT1VUX0JBVENIKGN0eCwKICAgICAgICAgICAgICAoKHVyYl9jc19zdGFydCArIHVyYl9jc19zaXplKSA8PCBVRjJfQ1NfRkVOQ0VfU0hJRlQpIHwKICAgICAgICAgICAgICAoKHVyYl9zZl9zdGFydCArIHVyYl9zZl9zaXplKSA8PCBVRjJfU0ZfRkVOQ0VfU0hJRlQpKTsKICAgIEFEVkFOQ0VfQkFUQ0goY3R4KTsKfQoKc3RhdGljIHZvaWQgCmk5NjVfcmVuZGVyX2NzX3VyYl9sYXlvdXQoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIEJFR0lOX0JBVENIKGN0eCwgMik7CiAgICBPVVRfQkFUQ0goY3R4LCBDTURfQ1NfVVJCX1NUQVRFIHwgMCk7CiAgICBPVVRfQkFUQ0goY3R4LAogICAgICAgICAgICAgICgoVVJCX0NTX0VOVFJZX1NJWkUgLSAxKSA8PCA0KSB8ICAgICAgICAgIC8qIFVSQiBFbnRyeSBBbGxvY2F0aW9uIFNpemUgKi8KICAgICAgICAgICAgICAoVVJCX0NTX0VOVFJJRVMgPDwgMCkpOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgVVJCIEVudHJpZXMgKi8KICAgIEFEVkFOQ0VfQkFUQ0goY3R4KTsKfQoKc3RhdGljIHZvaWQKaTk2NV9yZW5kZXJfZHJhd2luZ19yZWN0YW5nbGUoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOyAgCiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CiAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXN0X3JlZ2lvbiA9IHJlbmRlcl9zdGF0ZS0+ZHJhd19yZWdpb247CgogICAgQkVHSU5fQkFUQ0goY3R4LCA0KTsKICAgIE9VVF9CQVRDSChjdHgsIENNRF9EUkFXSU5HX1JFQ1RBTkdMRSB8IDIpOwogICAgT1VUX0JBVENIKGN0eCwgMHgwMDAwMDAwMCk7CiAgICBPVVRfQkFUQ0goY3R4LCAoZGVzdF9yZWdpb24tPndpZHRoIC0gMSkgfCAoZGVzdF9yZWdpb24tPmhlaWdodCAtIDEpIDw8IDE2KTsKICAgIE9VVF9CQVRDSChjdHgsIDB4MDAwMDAwMDApOyAgICAgICAgIAogICAgQURWQU5DRV9CQVRDSChjdHgpOwp9CgpzdGF0aWMgdm9pZAppOTY1X3JlbmRlcl92ZXJ0ZXhfZWxlbWVudHMoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOyAgCgogICAgaWYgKElTX0lHRE5HKGk5NjUtPmludGVsLmRldmljZV9pZCkpIHsKICAgICAgICBCRUdJTl9CQVRDSChjdHgsIDUpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIENNRF9WRVJURVhfRUxFTUVOVFMgfCAzKTsKICAgICAgICAvKiBvZmZzZXQgMDogWCxZIC0+IHtYLCBZLCAxLjAsIDEuMH0gKi8KICAgICAgICBPVVRfQkFUQ0goY3R4LCAoMCA8PCBWRTBfVkVSVEVYX0JVRkZFUl9JTkRFWF9TSElGVCkgfAogICAgICAgICAgICAgICAgICBWRTBfVkFMSUQgfAogICAgICAgICAgICAgICAgICAoSTk2NV9TVVJGQUNFRk9STUFUX1IzMkczMl9GTE9BVCA8PCBWRTBfRk9STUFUX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgICgwIDw8IFZFMF9PRkZTRVRfU0hJRlQpKTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCAoSTk2NV9WRkNPTVBPTkVOVF9TVE9SRV9TUkMgPDwgVkUxX1ZGQ09NUE9ORU5UXzBfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgKEk5NjVfVkZDT01QT05FTlRfU1RPUkVfU1JDIDw8IFZFMV9WRkNPTVBPTkVOVF8xX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgIChJOTY1X1ZGQ09NUE9ORU5UX1NUT1JFXzFfRkxUIDw8IFZFMV9WRkNPTVBPTkVOVF8yX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgIChJOTY1X1ZGQ09NUE9ORU5UX1NUT1JFXzFfRkxUIDw8IFZFMV9WRkNPTVBPTkVOVF8zX1NISUZUKSk7CiAgICAgICAgLyogb2Zmc2V0IDg6IFMwLCBUMCAtPiB7UzAsIFQwLCAxLjAsIDEuMH0gKi8KICAgICAgICBPVVRfQkFUQ0goY3R4LCAoMCA8PCBWRTBfVkVSVEVYX0JVRkZFUl9JTkRFWF9TSElGVCkgfAogICAgICAgICAgICAgICAgICBWRTBfVkFMSUQgfAogICAgICAgICAgICAgICAgICAoSTk2NV9TVVJGQUNFRk9STUFUX1IzMkczMl9GTE9BVCA8PCBWRTBfRk9STUFUX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgICg4IDw8IFZFMF9PRkZTRVRfU0hJRlQpKTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCAoSTk2NV9WRkNPTVBPTkVOVF9TVE9SRV9TUkMgPDwgVkUxX1ZGQ09NUE9ORU5UXzBfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgKEk5NjVfVkZDT01QT05FTlRfU1RPUkVfU1JDIDw8IFZFMV9WRkNPTVBPTkVOVF8xX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgIChJOTY1X1ZGQ09NUE9ORU5UX1NUT1JFXzFfRkxUIDw8IFZFMV9WRkNPTVBPTkVOVF8yX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgIChJOTY1X1ZGQ09NUE9ORU5UX1NUT1JFXzFfRkxUIDw8IFZFMV9WRkNPTVBPTkVOVF8zX1NISUZUKSk7CiAgICAgICAgQURWQU5DRV9CQVRDSChjdHgpOwogICAgfSBlbHNlIHsKICAgICAgICBCRUdJTl9CQVRDSChjdHgsIDUpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIENNRF9WRVJURVhfRUxFTUVOVFMgfCAzKTsKICAgICAgICAvKiBvZmZzZXQgMDogWCxZIC0+IHtYLCBZLCAxLjAsIDEuMH0gKi8KICAgICAgICBPVVRfQkFUQ0goY3R4LCAoMCA8PCBWRTBfVkVSVEVYX0JVRkZFUl9JTkRFWF9TSElGVCkgfAogICAgICAgICAgICAgICAgICBWRTBfVkFMSUQgfAogICAgICAgICAgICAgICAgICAoSTk2NV9TVVJGQUNFRk9STUFUX1IzMkczMl9GTE9BVCA8PCBWRTBfRk9STUFUX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgICgwIDw8IFZFMF9PRkZTRVRfU0hJRlQpKTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCAoSTk2NV9WRkNPTVBPTkVOVF9TVE9SRV9TUkMgPDwgVkUxX1ZGQ09NUE9ORU5UXzBfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgKEk5NjVfVkZDT01QT05FTlRfU1RPUkVfU1JDIDw8IFZFMV9WRkNPTVBPTkVOVF8xX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgIChJOTY1X1ZGQ09NUE9ORU5UX1NUT1JFXzFfRkxUIDw8IFZFMV9WRkNPTVBPTkVOVF8yX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgIChJOTY1X1ZGQ09NUE9ORU5UX1NUT1JFXzFfRkxUIDw8IFZFMV9WRkNPTVBPTkVOVF8zX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgICgwIDw8IFZFMV9ERVNUSU5BVElPTl9FTEVNRU5UX09GRlNFVF9TSElGVCkpOwogICAgICAgIC8qIG9mZnNldCA4OiBTMCwgVDAgLT4ge1MwLCBUMCwgMS4wLCAxLjB9ICovCiAgICAgICAgT1VUX0JBVENIKGN0eCwgKDAgPDwgVkUwX1ZFUlRFWF9CVUZGRVJfSU5ERVhfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgVkUwX1ZBTElEIHwKICAgICAgICAgICAgICAgICAgKEk5NjVfU1VSRkFDRUZPUk1BVF9SMzJHMzJfRkxPQVQgPDwgVkUwX0ZPUk1BVF9TSElGVCkgfAogICAgICAgICAgICAgICAgICAoOCA8PCBWRTBfT0ZGU0VUX1NISUZUKSk7CiAgICAgICAgT1VUX0JBVENIKGN0eCwgKEk5NjVfVkZDT01QT05FTlRfU1RPUkVfU1JDIDw8IFZFMV9WRkNPTVBPTkVOVF8wX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgIChJOTY1X1ZGQ09NUE9ORU5UX1NUT1JFX1NSQyA8PCBWRTFfVkZDT01QT05FTlRfMV9TSElGVCkgfAogICAgICAgICAgICAgICAgICAoSTk2NV9WRkNPTVBPTkVOVF9TVE9SRV8xX0ZMVCA8PCBWRTFfVkZDT01QT05FTlRfMl9TSElGVCkgfAogICAgICAgICAgICAgICAgICAoSTk2NV9WRkNPTVBPTkVOVF9TVE9SRV8xX0ZMVCA8PCBWRTFfVkZDT01QT05FTlRfM19TSElGVCkgfAogICAgICAgICAgICAgICAgICAoNCA8PCBWRTFfREVTVElOQVRJT05fRUxFTUVOVF9PRkZTRVRfU0hJRlQpKTsKICAgICAgICBBRFZBTkNFX0JBVENIKGN0eCk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkCmk5NjVfcmVuZGVyX3VwbG9hZF9pbWFnZV9wYWxldHRlKAogICAgVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICBWQUltYWdlSUQgICAgICAgIGltYWdlX2lkLAogICAgdW5zaWduZWQgaW50ICAgICBhbHBoYQopCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgdW5zaWduZWQgaW50IGk7CgogICAgc3RydWN0IG9iamVjdF9pbWFnZSAqb2JqX2ltYWdlID0gSU1BR0UoaW1hZ2VfaWQpOwogICAgYXNzZXJ0KG9ial9pbWFnZSk7CgogICAgaWYgKG9ial9pbWFnZS0+aW1hZ2UubnVtX3BhbGV0dGVfZW50cmllcyA9PSAwKQogICAgICAgIHJldHVybjsKCiAgICBCRUdJTl9CQVRDSChjdHgsIDEgKyBvYmpfaW1hZ2UtPmltYWdlLm51bV9wYWxldHRlX2VudHJpZXMpOwogICAgT1VUX0JBVENIKGN0eCwgQ01EX1NBTVBMRVJfUEFMRVRURV9MT0FEIHwgKG9ial9pbWFnZS0+aW1hZ2UubnVtX3BhbGV0dGVfZW50cmllcyAtIDEpKTsKICAgIC8qZmlsbCBwYWxldHRlKi8KICAgIC8vaW50MzJfdCBvdXRbMTZdOyAvLzAtMjM6Y29sb3IgMjMtMzE6YWxwaGEKICAgIGZvciAoaSA9IDA7IGkgPCBvYmpfaW1hZ2UtPmltYWdlLm51bV9wYWxldHRlX2VudHJpZXM7IGkrKykKICAgICAgICBPVVRfQkFUQ0goY3R4LCAoYWxwaGEgPDwgMjQpIHwgb2JqX2ltYWdlLT5wYWxldHRlW2ldKTsKICAgIEFEVkFOQ0VfQkFUQ0goY3R4KTsKfQoKc3RhdGljIHZvaWQKaTk2NV9yZW5kZXJfc3RhcnR1cChWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CgogICAgQkVHSU5fQkFUQ0goY3R4LCAxMSk7CiAgICBPVVRfQkFUQ0goY3R4LCBDTURfVkVSVEVYX0JVRkZFUlMgfCAzKTsKICAgIE9VVF9CQVRDSChjdHgsIAogICAgICAgICAgICAgICgwIDw8IFZCMF9CVUZGRVJfSU5ERVhfU0hJRlQpIHwKICAgICAgICAgICAgICBWQjBfVkVSVEVYREFUQSB8CiAgICAgICAgICAgICAgKCg0ICogNCkgPDwgVkIwX0JVRkZFUl9QSVRDSF9TSElGVCkpOwogICAgT1VUX1JFTE9DKGN0eCwgcmVuZGVyX3N0YXRlLT52Yi52ZXJ0ZXhfYnVmZmVyLCBJOTE1X0dFTV9ET01BSU5fVkVSVEVYLCAwLCAwKTsKCiAgICBpZiAoSVNfSUdETkcoaTk2NS0+aW50ZWwuZGV2aWNlX2lkKSkKICAgICAgICBPVVRfUkVMT0MoY3R4LCByZW5kZXJfc3RhdGUtPnZiLnZlcnRleF9idWZmZXIsIEk5MTVfR0VNX0RPTUFJTl9WRVJURVgsIDAsIDEyICogNCk7CiAgICBlbHNlCiAgICAgICAgT1VUX0JBVENIKGN0eCwgMyk7CgogICAgT1VUX0JBVENIKGN0eCwgMCk7CgogICAgT1VUX0JBVENIKGN0eCwgCiAgICAgICAgICAgICAgQ01EXzNEUFJJTUlUSVZFIHwKICAgICAgICAgICAgICBfM0RQUklNSVRJVkVfVkVSVEVYX1NFUVVFTlRJQUwgfAogICAgICAgICAgICAgIChfM0RQUklNX1JFQ1RMSVNUIDw8IF8zRFBSSU1JVElWRV9UT1BPTE9HWV9TSElGVCkgfAogICAgICAgICAgICAgICgwIDw8IDkpIHwKICAgICAgICAgICAgICA0KTsKICAgIE9VVF9CQVRDSChjdHgsIDMpOyAvKiB2ZXJ0ZXggY291bnQgcGVyIGluc3RhbmNlICovCiAgICBPVVRfQkFUQ0goY3R4LCAwKTsgLyogc3RhcnQgdmVydGV4IG9mZnNldCAqLwogICAgT1VUX0JBVENIKGN0eCwgMSk7IC8qIHNpbmdsZSBpbnN0YW5jZSAqLwogICAgT1VUX0JBVENIKGN0eCwgMCk7IC8qIHN0YXJ0IGluc3RhbmNlIGxvY2F0aW9uICovCiAgICBPVVRfQkFUQ0goY3R4LCAwKTsgLyogaW5kZXggYnVmZmVyIG9mZnNldCwgaWdub3JlZCAqLwogICAgQURWQU5DRV9CQVRDSChjdHgpOwp9CgpzdGF0aWMgdm9pZCAKaTk2NV9jbGVhcl9kZXN0X3JlZ2lvbihWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7ICAKICAgIHN0cnVjdCBpOTY1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyX3N0YXRlID0gJmk5NjUtPnJlbmRlcl9zdGF0ZTsKICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmRlc3RfcmVnaW9uID0gcmVuZGVyX3N0YXRlLT5kcmF3X3JlZ2lvbjsKICAgIHVuc2lnbmVkIGludCBibHRfY21kLCBicjEzOwogICAgaW50IHBpdGNoOwoKICAgIGJsdF9jbWQgPSBYWV9DT0xPUl9CTFRfQ01EOwogICAgYnIxMyA9IDB4ZjAgPDwgMTY7CiAgICBwaXRjaCA9IGRlc3RfcmVnaW9uLT5waXRjaDsKCiAgICBpZiAoZGVzdF9yZWdpb24tPmNwcCA9PSA0KSB7CiAgICAgICAgYnIxMyB8PSBCUjEzXzg4ODg7CiAgICAgICAgYmx0X2NtZCB8PSAoWFlfQ09MT1JfQkxUX1dSSVRFX1JHQiB8IFhZX0NPTE9SX0JMVF9XUklURV9BTFBIQSk7CiAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChkZXN0X3JlZ2lvbi0+Y3BwID09IDIpOwogICAgICAgIGJyMTMgfD0gQlIxM181NjU7CiAgICB9CgogICAgaWYgKGRlc3RfcmVnaW9uLT50aWxpbmcgIT0gSTkxNV9USUxJTkdfTk9ORSkgewogICAgICAgIGJsdF9jbWQgfD0gWFlfQ09MT1JfQkxUX0RTVF9USUxFRDsKICAgICAgICBwaXRjaCAvPSA0OwogICAgfQoKICAgIGJyMTMgfD0gcGl0Y2g7CgogICAgQkVHSU5fQkFUQ0goY3R4LCA2KTsKICAgIE9VVF9CQVRDSChjdHgsIGJsdF9jbWQpOwogICAgT1VUX0JBVENIKGN0eCwgYnIxMyk7CiAgICBPVVRfQkFUQ0goY3R4LCAoZGVzdF9yZWdpb24tPnkgPDwgMTYpIHwgKGRlc3RfcmVnaW9uLT54KSk7CiAgICBPVVRfQkFUQ0goY3R4LCAoKGRlc3RfcmVnaW9uLT55ICsgZGVzdF9yZWdpb24tPmhlaWdodCkgPDwgMTYpIHwKICAgICAgICAgICAgICAoZGVzdF9yZWdpb24tPnggKyBkZXN0X3JlZ2lvbi0+d2lkdGgpKTsKICAgIE9VVF9SRUxPQyhjdHgsIGRlc3RfcmVnaW9uLT5ibywgCiAgICAgICAgICAgICAgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUiwgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUiwKICAgICAgICAgICAgICAwKTsKICAgIE9VVF9CQVRDSChjdHgsIDB4MCk7CiAgICBBRFZBTkNFX0JBVENIKGN0eCk7Cn0KCnN0YXRpYyB2b2lkCmk5NjVfc3VyZmFjZV9yZW5kZXJfcGlwZWxpbmVfc2V0dXAoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIGludGVsX2JhdGNoYnVmZmVyX3N0YXJ0X2F0b21pYyhjdHgsIDB4MTAwMCk7CiAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9lbWl0X21pX2ZsdXNoKGN0eCk7CiAgICBpOTY1X2NsZWFyX2Rlc3RfcmVnaW9uKGN0eCk7CiAgICBpOTY1X3JlbmRlcl9waXBlbGluZV9zZWxlY3QoY3R4KTsKICAgIGk5NjVfcmVuZGVyX3N0YXRlX3NpcChjdHgpOwogICAgaTk2NV9yZW5kZXJfc3RhdGVfYmFzZV9hZGRyZXNzKGN0eCk7CiAgICBpOTY1X3JlbmRlcl9iaW5kaW5nX3RhYmxlX3BvaW50ZXJzKGN0eCk7CiAgICBpOTY1X3JlbmRlcl9jb25zdGFudF9jb2xvcihjdHgpOwogICAgaTk2NV9yZW5kZXJfcGlwZWxpbmVkX3BvaW50ZXJzKGN0eCk7CiAgICBpOTY1X3JlbmRlcl91cmJfbGF5b3V0KGN0eCk7CiAgICBpOTY1X3JlbmRlcl9jc191cmJfbGF5b3V0KGN0eCk7CiAgICBpOTY1X3JlbmRlcl9kcmF3aW5nX3JlY3RhbmdsZShjdHgpOwogICAgaTk2NV9yZW5kZXJfdmVydGV4X2VsZW1lbnRzKGN0eCk7CiAgICBpOTY1X3JlbmRlcl9zdGFydHVwKGN0eCk7CiAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9lbmRfYXRvbWljKGN0eCk7Cn0KCnN0YXRpYyB2b2lkCmk5NjVfc3VicGljX3JlbmRlcl9waXBlbGluZV9zZXR1cChWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgaW50ZWxfYmF0Y2hidWZmZXJfc3RhcnRfYXRvbWljKGN0eCwgMHgxMDAwKTsKICAgIGludGVsX2JhdGNoYnVmZmVyX2VtaXRfbWlfZmx1c2goY3R4KTsKICAgIGk5NjVfcmVuZGVyX3BpcGVsaW5lX3NlbGVjdChjdHgpOwogICAgaTk2NV9yZW5kZXJfc3RhdGVfc2lwKGN0eCk7CiAgICBpOTY1X3JlbmRlcl9zdGF0ZV9iYXNlX2FkZHJlc3MoY3R4KTsKICAgIGk5NjVfcmVuZGVyX2JpbmRpbmdfdGFibGVfcG9pbnRlcnMoY3R4KTsKICAgIGk5NjVfcmVuZGVyX2NvbnN0YW50X2NvbG9yKGN0eCk7CiAgICBpOTY1X3JlbmRlcl9waXBlbGluZWRfcG9pbnRlcnMoY3R4KTsKICAgIGk5NjVfcmVuZGVyX3VyYl9sYXlvdXQoY3R4KTsKICAgIGk5NjVfcmVuZGVyX2NzX3VyYl9sYXlvdXQoY3R4KTsKICAgIGk5NjVfcmVuZGVyX2RyYXdpbmdfcmVjdGFuZ2xlKGN0eCk7CiAgICBpOTY1X3JlbmRlcl92ZXJ0ZXhfZWxlbWVudHMoY3R4KTsKICAgIGk5NjVfcmVuZGVyX3N0YXJ0dXAoY3R4KTsKICAgIGludGVsX2JhdGNoYnVmZmVyX2VuZF9hdG9taWMoY3R4KTsKfQoKCnN0YXRpYyB2b2lkIAppOTY1X3JlbmRlcl9pbml0aWFsaXplKFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsKICAgIHN0cnVjdCBpOTY1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyX3N0YXRlID0gJmk5NjUtPnJlbmRlcl9zdGF0ZTsKICAgIGludCBpOwogICAgZHJpX2JvICpibzsKCiAgICAvKiBWRVJURVggQlVGRkVSICovCiAgICBkcmlfYm9fdW5yZWZlcmVuY2UocmVuZGVyX3N0YXRlLT52Yi52ZXJ0ZXhfYnVmZmVyKTsKICAgIGJvID0gZHJpX2JvX2FsbG9jKGk5NjUtPmludGVsLmJ1Zm1nciwKICAgICAgICAgICAgICAgICAgICAgICJ2ZXJ0ZXggYnVmZmVyIiwKICAgICAgICAgICAgICAgICAgICAgIDQwOTYsCiAgICAgICAgICAgICAgICAgICAgICA0MDk2KTsKICAgIGFzc2VydChibyk7CiAgICByZW5kZXJfc3RhdGUtPnZiLnZlcnRleF9idWZmZXIgPSBibzsKCiAgICAvKiBWUyAqLwogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+dnMuc3RhdGUpOwogICAgYm8gPSBkcmlfYm9fYWxsb2MoaTk2NS0+aW50ZWwuYnVmbWdyLAogICAgICAgICAgICAgICAgICAgICAgInZzIHN0YXRlIiwKICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaTk2NV92c191bml0X3N0YXRlKSwKICAgICAgICAgICAgICAgICAgICAgIDY0KTsKICAgIGFzc2VydChibyk7CiAgICByZW5kZXJfc3RhdGUtPnZzLnN0YXRlID0gYm87CgogICAgLyogR1MgKi8KICAgIC8qIENMSVAgKi8KICAgIC8qIFNGICovCiAgICBkcmlfYm9fdW5yZWZlcmVuY2UocmVuZGVyX3N0YXRlLT5zZi5zdGF0ZSk7CiAgICBibyA9IGRyaV9ib19hbGxvYyhpOTY1LT5pbnRlbC5idWZtZ3IsCiAgICAgICAgICAgICAgICAgICAgICAic2Ygc3RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpOTY1X3NmX3VuaXRfc3RhdGUpLAogICAgICAgICAgICAgICAgICAgICAgNjQpOwogICAgYXNzZXJ0KGJvKTsKICAgIHJlbmRlcl9zdGF0ZS0+c2Yuc3RhdGUgPSBibzsKCiAgICAvKiBXTSAqLwogICAgZm9yIChpID0gMDsgaSA8IE1BWF9SRU5ERVJfU1VSRkFDRVM7IGkrKykgewogICAgICAgIGRyaV9ib191bnJlZmVyZW5jZShyZW5kZXJfc3RhdGUtPndtLnN1cmZhY2VbaV0pOwogICAgICAgIHJlbmRlcl9zdGF0ZS0+d20uc3VyZmFjZVtpXSA9IE5VTEw7CiAgICB9CgogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+d20uYmluZGluZ190YWJsZSk7CiAgICBibyA9IGRyaV9ib19hbGxvYyhpOTY1LT5pbnRlbC5idWZtZ3IsCiAgICAgICAgICAgICAgICAgICAgICAiYmluZGluZyB0YWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICBNQVhfUkVOREVSX1NVUkZBQ0VTICogc2l6ZW9mKHVuc2lnbmVkIGludCksCiAgICAgICAgICAgICAgICAgICAgICA2NCk7CiAgICBhc3NlcnQoYm8pOwogICAgcmVuZGVyX3N0YXRlLT53bS5iaW5kaW5nX3RhYmxlID0gYm87CgogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlcik7CiAgICBibyA9IGRyaV9ib19hbGxvYyhpOTY1LT5pbnRlbC5idWZtZ3IsCiAgICAgICAgICAgICAgICAgICAgICAic2FtcGxlciBzdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICBNQVhfU0FNUExFUlMgKiBzaXplb2Yoc3RydWN0IGk5NjVfc2FtcGxlcl9zdGF0ZSksCiAgICAgICAgICAgICAgICAgICAgICA2NCk7CiAgICBhc3NlcnQoYm8pOwogICAgcmVuZGVyX3N0YXRlLT53bS5zYW1wbGVyID0gYm87CiAgICByZW5kZXJfc3RhdGUtPndtLnNhbXBsZXJfY291bnQgPSAwOwoKICAgIGRyaV9ib191bnJlZmVyZW5jZShyZW5kZXJfc3RhdGUtPndtLnN0YXRlKTsKICAgIGJvID0gZHJpX2JvX2FsbG9jKGk5NjUtPmludGVsLmJ1Zm1nciwKICAgICAgICAgICAgICAgICAgICAgICJ3bSBzdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGk5NjVfd21fdW5pdF9zdGF0ZSksCiAgICAgICAgICAgICAgICAgICAgICA2NCk7CiAgICBhc3NlcnQoYm8pOwogICAgcmVuZGVyX3N0YXRlLT53bS5zdGF0ZSA9IGJvOwoKICAgIC8qIENPTE9SIENBTENVTEFUT1IgKi8KICAgIGRyaV9ib191bnJlZmVyZW5jZShyZW5kZXJfc3RhdGUtPmNjLnN0YXRlKTsKICAgIGJvID0gZHJpX2JvX2FsbG9jKGk5NjUtPmludGVsLmJ1Zm1nciwKICAgICAgICAgICAgICAgICAgICAgICJjb2xvciBjYWxjIHN0YXRlIiwKICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaTk2NV9jY191bml0X3N0YXRlKSwKICAgICAgICAgICAgICAgICAgICAgIDY0KTsKICAgIGFzc2VydChibyk7CiAgICByZW5kZXJfc3RhdGUtPmNjLnN0YXRlID0gYm87CgogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+Y2Mudmlld3BvcnQpOwogICAgYm8gPSBkcmlfYm9fYWxsb2MoaTk2NS0+aW50ZWwuYnVmbWdyLAogICAgICAgICAgICAgICAgICAgICAgImNjIHZpZXdwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaTk2NV9jY192aWV3cG9ydCksCiAgICAgICAgICAgICAgICAgICAgICA2NCk7CiAgICBhc3NlcnQoYm8pOwogICAgcmVuZGVyX3N0YXRlLT5jYy52aWV3cG9ydCA9IGJvOwp9Cgp2b2lkCmk5NjVfcmVuZGVyX3B1dF9zdXJmYWNlKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICBWQVN1cmZhY2VJRCBzdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBzcmN4LAogICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBzcmN5LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzcmN3LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzcmNoLAogICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBkZXN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgZGVzdHksCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlc3R3LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZXN0aCkKewogICAgaTk2NV9yZW5kZXJfaW5pdGlhbGl6ZShjdHgpOwogICAgaTk2NV9zdXJmYWNlX3JlbmRlcl9zdGF0ZV9zZXR1cChjdHgsIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmN4LCBzcmN5LCBzcmN3LCBzcmNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHgsIGRlc3R5LCBkZXN0dywgZGVzdGgpOwogICAgaTk2NV9zdXJmYWNlX3JlbmRlcl9waXBlbGluZV9zZXR1cChjdHgpOwogICAgaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2goY3R4KTsKfQoKdm9pZAppOTY1X3JlbmRlcl9wdXRfc3VicGljKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICBWQVN1cmZhY2VJRCBzdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBzcmN4LAogICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBzcmN5LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzcmN3LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzcmNoLAogICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBkZXN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgZGVzdHksCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlc3R3LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZXN0aCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3Qgb2JqZWN0X3N1cmZhY2UgKm9ial9zdXJmYWNlID0gU1VSRkFDRShzdXJmYWNlKTsKICAgIHN0cnVjdCBvYmplY3Rfc3VicGljICpvYmpfc3VicGljID0gU1VCUElDKG9ial9zdXJmYWNlLT5zdWJwaWMpOwogICAgYXNzZXJ0KG9ial9zdWJwaWMpOwoKICAgIGk5NjVfcmVuZGVyX2luaXRpYWxpemUoY3R4KTsKICAgIGk5NjVfc3VicGljX3JlbmRlcl9zdGF0ZV9zZXR1cChjdHgsIHN1cmZhY2UsCgkgICAgc3JjeCwgc3JjeSwgc3Jjdywgc3JjaCwKCSAgICBkZXN0eCwgZGVzdHksIGRlc3R3LCBkZXN0aCk7CiAgICBpOTY1X3N1YnBpY19yZW5kZXJfcGlwZWxpbmVfc2V0dXAoY3R4KTsKICAgIGk5NjVfcmVuZGVyX3VwbG9hZF9pbWFnZV9wYWxldHRlKGN0eCwgb2JqX3N1YnBpYy0+aW1hZ2UsIDB4ZmYpOwogICAgaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2goY3R4KTsKfQoKCkJvb2wgCmk5NjVfcmVuZGVyX2luaXQoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgaW50IGk7CgogICAgLyoga2VybmVsICovCiAgICBhc3NlcnQoTlVNX1JFTkRFUl9LRVJORUwgPT0gKHNpemVvZihyZW5kZXJfa2VybmVsc19nZW41KSAvIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocmVuZGVyX2tlcm5lbHNfZ2VuNVswXSkpKTsKCiAgICBpZiAoSVNfSUdETkcoaTk2NS0+aW50ZWwuZGV2aWNlX2lkKSkKICAgICAgICByZW5kZXJfa2VybmVscyA9IHJlbmRlcl9rZXJuZWxzX2dlbjU7CiAgICBlbHNlCiAgICAgICAgcmVuZGVyX2tlcm5lbHMgPSByZW5kZXJfa2VybmVsc19nZW40OwoKICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUkVOREVSX0tFUk5FTDsgaSsrKSB7CiAgICAgICAgc3RydWN0IHJlbmRlcl9rZXJuZWwgKmtlcm5lbCA9ICZyZW5kZXJfa2VybmVsc1tpXTsKICAgICAgICBrZXJuZWwtPmJvID0gZHJpX2JvX2FsbG9jKGk5NjUtPmludGVsLmJ1Zm1nciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWwtPm5hbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsLT5zaXplLCA2NCk7CiAgICAgICAgYXNzZXJ0KGtlcm5lbC0+Ym8pOwogICAgICAgIGRyaV9ib19zdWJkYXRhKGtlcm5lbC0+Ym8sIDAsIGtlcm5lbC0+c2l6ZSwga2VybmVsLT5iaW4pOwogICAgfQoKICAgIHJldHVybiBUcnVlOwp9CgpCb29sIAppOTY1X3JlbmRlcl90ZXJtaW5hdGUoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIGludCBpOwogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CgogICAgZm9yIChpID0gMDsgaSA8IE5VTV9SRU5ERVJfS0VSTkVMOyBpKyspIHsKICAgICAgICBzdHJ1Y3QgcmVuZGVyX2tlcm5lbCAqa2VybmVsID0gJnJlbmRlcl9rZXJuZWxzW2ldOwogICAgICAgIAogICAgICAgIGRyaV9ib191bnJlZmVyZW5jZShrZXJuZWwtPmJvKTsKICAgICAgICBrZXJuZWwtPmJvID0gTlVMTDsKICAgIH0KCiAgICBkcmlfYm9fdW5yZWZlcmVuY2UocmVuZGVyX3N0YXRlLT52Yi52ZXJ0ZXhfYnVmZmVyKTsKICAgIHJlbmRlcl9zdGF0ZS0+dmIudmVydGV4X2J1ZmZlciA9IE5VTEw7CiAgICBkcmlfYm9fdW5yZWZlcmVuY2UocmVuZGVyX3N0YXRlLT52cy5zdGF0ZSk7CiAgICByZW5kZXJfc3RhdGUtPnZzLnN0YXRlID0gTlVMTDsKICAgIGRyaV9ib191bnJlZmVyZW5jZShyZW5kZXJfc3RhdGUtPnNmLnN0YXRlKTsKICAgIHJlbmRlcl9zdGF0ZS0+c2Yuc3RhdGUgPSBOVUxMOwogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+d20uYmluZGluZ190YWJsZSk7CiAgICByZW5kZXJfc3RhdGUtPndtLmJpbmRpbmdfdGFibGUgPSBOVUxMOwogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlcik7CiAgICByZW5kZXJfc3RhdGUtPndtLnNhbXBsZXIgPSBOVUxMOwogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+d20uc3RhdGUpOwogICAgcmVuZGVyX3N0YXRlLT53bS5zdGF0ZSA9IE5VTEw7CgogICAgZm9yIChpID0gMDsgaSA8IE1BWF9SRU5ERVJfU1VSRkFDRVM7IGkrKykgewogICAgICAgIGRyaV9ib191bnJlZmVyZW5jZShyZW5kZXJfc3RhdGUtPndtLnN1cmZhY2VbaV0pOwogICAgICAgIHJlbmRlcl9zdGF0ZS0+d20uc3VyZmFjZVtpXSA9IE5VTEw7CiAgICB9CgogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+Y2Mudmlld3BvcnQpOwogICAgcmVuZGVyX3N0YXRlLT5jYy52aWV3cG9ydCA9IE5VTEw7CiAgICBkcmlfYm9fdW5yZWZlcmVuY2UocmVuZGVyX3N0YXRlLT5jYy5zdGF0ZSk7CiAgICByZW5kZXJfc3RhdGUtPmNjLnN0YXRlID0gTlVMTDsKCiAgICBpZiAocmVuZGVyX3N0YXRlLT5kcmF3X3JlZ2lvbikgewogICAgICAgIGRyaV9ib191bnJlZmVyZW5jZShyZW5kZXJfc3RhdGUtPmRyYXdfcmVnaW9uLT5ibyk7CiAgICAgICAgZnJlZShyZW5kZXJfc3RhdGUtPmRyYXdfcmVnaW9uKTsKICAgICAgICByZW5kZXJfc3RhdGUtPmRyYXdfcmVnaW9uID0gTlVMTDsKICAgIH0KCiAgICByZXR1cm4gVHJ1ZTsKfQoK