LyoKICogQ29weXJpZ2h0IKkgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKgogKiBBdXRob3JzOgogKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgogKiAgICBLZWl0aCBQYWNrYXJkIDxrZWl0aHBAa2VpdGhwLmNvbT4KICogICAgWGlhbmcgSGFpaGFvIDxoYWloYW8ueGlhbmdAaW50ZWwuY29tPgogKgogKi8KCi8qCiAqIE1vc3Qgb2YgcmVuZGVyaW5nIGNvZGVzIGFyZSBwb3J0ZWQgZnJvbSB4Zjg2LXZpZGVvLWludGVsL3NyYy9pOTY1X3ZpZGVvLmMKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KCiNpbmNsdWRlIDx2YS92YV9iYWNrZW5kLmg+CiNpbmNsdWRlICJ2YS94MTEvdmFfZHJpY29tbW9uLmgiCgojaW5jbHVkZSAiaW50ZWxfYmF0Y2hidWZmZXIuaCIKI2luY2x1ZGUgImludGVsX2RyaXZlci5oIgoKI2luY2x1ZGUgImk5NjVfZGVmaW5lcy5oIgojaW5jbHVkZSAiaTk2NV9yZW5kZXIuaCIKI2luY2x1ZGUgImk5NjVfZHJ2X3ZpZGVvLmgiCgojZGVmaW5lIFNGX0tFUk5FTF9OVU1fR1JGICAgICAgIDE2CiNkZWZpbmUgU0ZfTUFYX1RIUkVBRFMgICAgICAgICAgMQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZl9rZXJuZWxfc3RhdGljW11bNF0gPSAKewojaW5jbHVkZSAic2hhZGVycy9yZW5kZXIvZXhhX3NmLmc0YiIKfTsKCiNkZWZpbmUgUFNfS0VSTkVMX05VTV9HUkYgICAgICAgMzIKI2RlZmluZSBQU19NQVhfVEhSRUFEUyAgICAgICAgICAzMgoKI2RlZmluZSBJOTY1X0dSRl9CTE9DS1MobnJlZykJKChucmVnICsgMTUpIC8gMTYgLSAxKQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwc19rZXJuZWxfc3RhdGljW11bNF0gPSAKewojaW5jbHVkZSAic2hhZGVycy9yZW5kZXIvZXhhX3dtX3h5Lmc0YiIKI2luY2x1ZGUgInNoYWRlcnMvcmVuZGVyL2V4YV93bV9zcmNfYWZmaW5lLmc0YiIKI2luY2x1ZGUgInNoYWRlcnMvcmVuZGVyL2V4YV93bV9zcmNfc2FtcGxlX3BsYW5hci5nNGIiCiNpbmNsdWRlICJzaGFkZXJzL3JlbmRlci9leGFfd21feXV2X3JnYi5nNGIiCiNpbmNsdWRlICJzaGFkZXJzL3JlbmRlci9leGFfd21fd3JpdGUuZzRiIgp9OwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBzX3N1YnBpY19rZXJuZWxfc3RhdGljW11bNF0gPSAKewojaW5jbHVkZSAic2hhZGVycy9yZW5kZXIvZXhhX3dtX3h5Lmc0YiIKI2luY2x1ZGUgInNoYWRlcnMvcmVuZGVyL2V4YV93bV9zcmNfYWZmaW5lLmc0YiIKI2luY2x1ZGUgInNoYWRlcnMvcmVuZGVyL2V4YV93bV9zcmNfc2FtcGxlX2FyZ2IuZzRiIgojaW5jbHVkZSAic2hhZGVycy9yZW5kZXIvZXhhX3dtX3dyaXRlLmc0YiIKfTsKCi8qIE9uIElST05MQUtFICovCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2Zfa2VybmVsX3N0YXRpY19nZW41W11bNF0gPSAKewojaW5jbHVkZSAic2hhZGVycy9yZW5kZXIvZXhhX3NmLmc0Yi5nZW41Igp9OwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwc19rZXJuZWxfc3RhdGljX2dlbjVbXVs0XSA9IAp7CiNpbmNsdWRlICJzaGFkZXJzL3JlbmRlci9leGFfd21feHkuZzRiLmdlbjUiCiNpbmNsdWRlICJzaGFkZXJzL3JlbmRlci9leGFfd21fc3JjX2FmZmluZS5nNGIuZ2VuNSIKI2luY2x1ZGUgInNoYWRlcnMvcmVuZGVyL2V4YV93bV9zcmNfc2FtcGxlX3BsYW5hci5nNGIuZ2VuNSIKI2luY2x1ZGUgInNoYWRlcnMvcmVuZGVyL2V4YV93bV95dXZfcmdiLmc0Yi5nZW41IgojaW5jbHVkZSAic2hhZGVycy9yZW5kZXIvZXhhX3dtX3dyaXRlLmc0Yi5nZW41Igp9OwpzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBzX3N1YnBpY19rZXJuZWxfc3RhdGljX2dlbjVbXVs0XSA9IAp7CiNpbmNsdWRlICJzaGFkZXJzL3JlbmRlci9leGFfd21feHkuZzRiLmdlbjUiCiNpbmNsdWRlICJzaGFkZXJzL3JlbmRlci9leGFfd21fc3JjX2FmZmluZS5nNGIuZ2VuNSIKI2luY2x1ZGUgInNoYWRlcnMvcmVuZGVyL2V4YV93bV9zcmNfc2FtcGxlX2FyZ2IuZzRiLmdlbjUiCiNpbmNsdWRlICJzaGFkZXJzL3JlbmRlci9leGFfd21fd3JpdGUuZzRiLmdlbjUiCn07CgpzdGF0aWMgdWludDMyX3QgZmxvYXRfdG9fdWludCAoZmxvYXQgZikgCnsKICAgIHVuaW9uIHsKICAgICAgICB1aW50MzJfdCBpOyAKICAgICAgICBmbG9hdCBmOwogICAgfSB4OwoKICAgIHguZiA9IGY7CiAgICByZXR1cm4geC5pOwp9CgplbnVtIAp7CiAgICBTRl9LRVJORUwgPSAwLAogICAgUFNfS0VSTkVMLAogICAgUFNfU1VCUElDX0tFUk5FTAp9OwoKc3RydWN0IHJlbmRlcl9rZXJuZWwKewogICAgY2hhciAqbmFtZTsKICAgIGNvbnN0IHVuc2lnbmVkIGludCAoKmJpbilbNF07CiAgICBpbnQgc2l6ZTsKICAgIGRyaV9ibyAqYm87Cn07CgpzdGF0aWMgc3RydWN0IHJlbmRlcl9rZXJuZWwgcmVuZGVyX2tlcm5lbHNfZ2VuNFtdID0gewogICAgewogICAgICAgICJTRiIsCiAgICAgICAgc2Zfa2VybmVsX3N0YXRpYywKICAgICAgICBzaXplb2Yoc2Zfa2VybmVsX3N0YXRpYyksCiAgICAgICAgTlVMTAogICAgfSwKICAgIHsKICAgICAgICAiUFMiLAogICAgICAgIHBzX2tlcm5lbF9zdGF0aWMsCiAgICAgICAgc2l6ZW9mKHBzX2tlcm5lbF9zdGF0aWMpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJQU19TVUJQSUMiLAogICAgICAgIHBzX3N1YnBpY19rZXJuZWxfc3RhdGljLAogICAgICAgIHNpemVvZihwc19zdWJwaWNfa2VybmVsX3N0YXRpYyksCiAgICAgICAgTlVMTAogICAgfQp9OwoKc3RhdGljIHN0cnVjdCByZW5kZXJfa2VybmVsIHJlbmRlcl9rZXJuZWxzX2dlbjVbXSA9IHsKICAgIHsKICAgICAgICAiU0YiLAogICAgICAgIHNmX2tlcm5lbF9zdGF0aWNfZ2VuNSwKICAgICAgICBzaXplb2Yoc2Zfa2VybmVsX3N0YXRpY19nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAogICAgewogICAgICAgICJQUyIsCiAgICAgICAgcHNfa2VybmVsX3N0YXRpY19nZW41LAogICAgICAgIHNpemVvZihwc19rZXJuZWxfc3RhdGljX2dlbjUpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJQU19TVUJQSUMiLAogICAgICAgIHBzX3N1YnBpY19rZXJuZWxfc3RhdGljX2dlbjUsCiAgICAgICAgc2l6ZW9mKHBzX3N1YnBpY19rZXJuZWxfc3RhdGljX2dlbjUpLAogICAgICAgIE5VTEwKICAgIH0KfTsKCnN0YXRpYyBzdHJ1Y3QgcmVuZGVyX2tlcm5lbCAqcmVuZGVyX2tlcm5lbHMgPSBOVUxMOwoKI2RlZmluZSBOVU1fUkVOREVSX0tFUk5FTCAoc2l6ZW9mKHJlbmRlcl9rZXJuZWxzX2dlbjQpL3NpemVvZihyZW5kZXJfa2VybmVsc19nZW40WzBdKSkKCiNkZWZpbmUgVVJCX1ZTX0VOVFJJRVMJICAgICAgOAojZGVmaW5lIFVSQl9WU19FTlRSWV9TSVpFICAgICAxCgojZGVmaW5lIFVSQl9HU19FTlRSSUVTCSAgICAgIDAKI2RlZmluZSBVUkJfR1NfRU5UUllfU0laRSAgICAgMAoKI2RlZmluZSBVUkJfQ0xJUF9FTlRSSUVTICAgICAgMAojZGVmaW5lIFVSQl9DTElQX0VOVFJZX1NJWkUgICAwCgojZGVmaW5lIFVSQl9TRl9FTlRSSUVTCSAgICAgIDEKI2RlZmluZSBVUkJfU0ZfRU5UUllfU0laRSAgICAgMgoKI2RlZmluZSBVUkJfQ1NfRU5UUklFUwkgICAgICAxCiNkZWZpbmUgVVJCX0NTX0VOVFJZX1NJWkUgICAgIDEKCnN0YXRpYyB2b2lkCmk5NjVfcmVuZGVyX3ZzX3VuaXQoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IGk5NjVfcmVuZGVyX3N0YXRlICpyZW5kZXJfc3RhdGUgPSAmaTk2NS0+cmVuZGVyX3N0YXRlOwogICAgc3RydWN0IGk5NjVfdnNfdW5pdF9zdGF0ZSAqdnNfc3RhdGU7CgogICAgZHJpX2JvX21hcChyZW5kZXJfc3RhdGUtPnZzLnN0YXRlLCAxKTsKICAgIGFzc2VydChyZW5kZXJfc3RhdGUtPnZzLnN0YXRlLT52aXJ0dWFsKTsKICAgIHZzX3N0YXRlID0gcmVuZGVyX3N0YXRlLT52cy5zdGF0ZS0+dmlydHVhbDsKICAgIG1lbXNldCh2c19zdGF0ZSwgMCwgc2l6ZW9mKCp2c19zdGF0ZSkpOwoKICAgIGlmIChJU19JUk9OTEFLRShpOTY1LT5pbnRlbC5kZXZpY2VfaWQpKQogICAgICAgIHZzX3N0YXRlLT50aHJlYWQ0Lm5yX3VyYl9lbnRyaWVzID0gVVJCX1ZTX0VOVFJJRVMgPj4gMjsKICAgIGVsc2UKICAgICAgICB2c19zdGF0ZS0+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+IDY7CgogICAgd21fc3RhdGUtPnRocmVhZDEuc2luZ2xlX3Byb2dyYW1fZmxvdyA9IDE7IC8qIFhYWCAqLwoKICAgIGlmIChJU19JUk9OTEFLRShpOTY1LT5pbnRlbC5kZXZpY2VfaWQpKQogICAgICAgIHdtX3N0YXRlLT50aHJlYWQxLmJpbmRpbmdfdGFibGVfZW50cnlfY291bnQgPSAwOyAvKiBoYXJkd2FyZSByZXF1aXJlbWVudCAqLwogICAgZWxzZQogICAgICAgIHdtX3N0YXRlLT50aHJlYWQxLmJpbmRpbmdfdGFibGVfZW50cnlfY291bnQgPSA3OwoKICAgIHdtX3N0YXRlLT50aHJlYWQyLnNjcmF0Y2hfc3BhY2VfYmFzZV9wb2ludGVyID0gMDsKICAgIHdtX3N0YXRlLT50aHJlYWQyLnBlcl90aHJlYWRfc2NyYXRjaF9zcGFjZSA9IDA7IC8qIDEwMjQgYnl0ZXMgKi8KCiAgICB3bV9zdGF0ZS0+dGhyZWFkMy5kaXNwYXRjaF9ncmZfc3RhcnRfcmVnID0gMzsgLyogWFhYICovCiAgICB3bV9zdGF0ZS0+dGhyZWFkMy5jb25zdF91cmJfZW50cnlfcmVhZF9sZW5ndGggPSAwOwogICAgd21fc3RhdGUtPnRocmVhZDMuY29uc3RfdXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gMDsKICAgIHdtX3N0YXRlLT50aHJlYWQzLnVyYl9lbnRyeV9yZWFkX2xlbmd0aCA9IDE7IC8qIFhYWCAqLwogICAgd21fc3RhdGUtPnRocmVhZDMudXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gMDsgLyogWFhYICovCgogICAgd21fc3RhdGUtPndtNC5zdGF0c19lbmFibGUgPSAwOwogICAgd21fc3RhdGUtPndtNC5zYW1wbGVyX3N0YXRlX3BvaW50ZXIgPSByZW5kZXJfc3RhdGUtPndtLnNhbXBsZXItPm9mZnNldCA+PiA1OyAKCiAgICBpZiAoSVNfSVJPTkxBS0UoaTk2NS0+aW50ZWwuZGV2aWNlX2lkKSkgewogICAgICAgIHdtX3N0YXRlLT53bTQuc2FtcGxlcl9jb3VudCA9IDA7ICAgICAgICAvKiBoYXJkd2FyZSByZXF1aXJlbWVudCAqLwogICAgICAgIHdtX3N0YXRlLT53bTUubWF4X3RocmVhZHMgPSAxMiAqIDYgLSAxOwogICAgfSBlbHNlIHsKICAgICAgICB3bV9zdGF0ZS0+d200LnNhbXBsZXJfY291bnQgPSAocmVuZGVyX3N0YXRlLT53bS5zYW1wbGVyX2NvdW50ICsgMykgLyA0OwogICAgICAgIHdtX3N0YXRlLT53bTUubWF4X3RocmVhZHMgPSAxMCAqIDUgLSAxOwogICAgfQoKICAgIHdtX3N0YXRlLT53bTUudGhyZWFkX2Rpc3BhdGNoX2VuYWJsZSA9IDE7CiAgICB3bV9zdGF0ZS0+d201LmVuYWJsZV8xNl9waXggPSAxOwogICAgd21fc3RhdGUtPndtNS5lbmFibGVfOF9waXggPSAwOwogICAgd21fc3RhdGUtPndtNS5lYXJseV9kZXB0aF90ZXN0ID0gMTsKCiAgICBkcmlfYm9fZW1pdF9yZWxvYyhyZW5kZXJfc3RhdGUtPndtLnN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLAogICAgICAgICAgICAgICAgICAgICAgd21fc3RhdGUtPnRocmVhZDAuZ3JmX3JlZ19jb3VudCA8PCAxLAogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGk5NjVfd21fdW5pdF9zdGF0ZSwgdGhyZWFkMCksCiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJfa2VybmVsc1tQU19TVUJQSUNfS0VSTkVMXS5ibyk7CgogICAgZHJpX2JvX2VtaXRfcmVsb2MocmVuZGVyX3N0YXRlLT53bS5zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwKICAgICAgICAgICAgICAgICAgICAgIHdtX3N0YXRlLT53bTQuc2FtcGxlcl9jb3VudCA8PCAyLAogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGk5NjVfd21fdW5pdF9zdGF0ZSwgd200KSwKICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlcik7CgogICAgZHJpX2JvX3VubWFwKHJlbmRlcl9zdGF0ZS0+d20uc3RhdGUpOwp9CgoKc3RhdGljIHZvaWQKaTk2NV9yZW5kZXJfd21fdW5pdChWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CiAgICBzdHJ1Y3QgaTk2NV93bV91bml0X3N0YXRlICp3bV9zdGF0ZTsKCiAgICBhc3NlcnQocmVuZGVyX3N0YXRlLT53bS5zYW1wbGVyKTsKCiAgICBkcmlfYm9fbWFwKHJlbmRlcl9zdGF0ZS0+d20uc3RhdGUsIDEpOwogICAgYXNzZXJ0KHJlbmRlcl9zdGF0ZS0+d20uc3RhdGUtPnZpcnR1YWwpOwogICAgd21fc3RhdGUgPSByZW5kZXJfc3RhdGUtPndtLnN0YXRlLT52aXJ0dWFsOwogICAgbWVtc2V0KHdtX3N0YXRlLCAwLCBzaXplb2YoKndtX3N0YXRlKSk7CgogICAgd21fc3RhdGUtPnRocmVhZDAuZ3JmX3JlZ19jb3VudCA9IEk5NjVfR1JGX0JMT0NLUyhQU19LRVJORUxfTlVNX0dSRik7CiAgICB3bV9zdGF0ZS0+dGhyZWFkMC5rZXJuZWxfc3RhcnRfcG9pbnRlciA9IHJlbmRlcl9rZXJuZWxzW1BTX0tFUk5FTF0uYm8tPm9mZnNldCA+PiA2OwoKICAgIHdtX3N0YXRlLT50aHJlYWQxLnNpbmdsZV9wcm9ncmFtX2Zsb3cgPSAxOyAvKiBYWFggKi8KCiAgICBpZiAoSVNfSVJPTkxBS0UoaTk2NS0+aW50ZWwuZGV2aWNlX2lkKSkKICAgICAgICB3bV9zdGF0ZS0+dGhyZWFkMS5iaW5kaW5nX3RhYmxlX2VudHJ5X2NvdW50ID0gMDsgICAgICAgIC8qIGhhcmR3YXJlIHJlcXVpcmVtZW50ICovCiAgICBlbHNlCiAgICAgICAgd21fc3RhdGUtPnRocmVhZDEuYmluZGluZ190YWJsZV9lbnRyeV9jb3VudCA9IDc7CgogICAgd21fc3RhdGUtPnRocmVhZDIuc2NyYXRjaF9zcGFjZV9iYXNlX3BvaW50ZXIgPSAwOwogICAgd21fc3RhdGUtPnRocmVhZDIucGVyX3RocmVhZF9zY3JhdGNoX3NwYWNlID0gMDsgLyogMTAyNCBieXRlcyAqLwoKICAgIHdtX3N0YXRlLT50aHJlYWQzLmRpc3BhdGNoX2dyZl9zdGFydF9yZWcgPSAyOyAvKiBYWFggKi8KICAgIHdtX3N0YXRlLT50aHJlYWQzLmNvbnN0X3VyYl9lbnRyeV9yZWFkX2xlbmd0aCA9IDE7CiAgICB3bV9zdGF0ZS0+dGhyZWFkMy5jb25zdF91cmJfZW50cnlfcmVhZF9vZmZzZXQgPSAwOwogICAgd21fc3RhdGUtPnRocmVhZDMudXJiX2VudHJ5X3JlYWRfbGVuZ3RoID0gMTsgLyogWFhYICovCiAgICB3bV9zdGF0ZS0+dGhyZWFkMy51cmJfZW50cnlfcmVhZF9vZmZzZXQgPSAwOyAvKiBYWFggKi8KCiAgICB3bV9zdGF0ZS0+d200LnN0YXRzX2VuYWJsZSA9IDA7CiAgICB3bV9zdGF0ZS0+d200LnNhbXBsZXJfc3RhdGVfcG9pbnRlciA9IHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlci0+b2Zmc2V0ID4+IDU7IAoKICAgIGlmIChJU19JUk9OTEFLRShpOTY1LT5pbnRlbC5kZXZpY2VfaWQpKSB7CiAgICAgICAgd21fc3RhdGUtPndtNC5zYW1wbGVyX2NvdW50ID0gMDsgICAgICAgIC8qIGhhcmR3YXJlIHJlcXVpcmVtZW50ICovCiAgICAgICAgd21fc3RhdGUtPndtNS5tYXhfdGhyZWFkcyA9IDEyICogNiAtIDE7CiAgICB9IGVsc2UgewogICAgICAgIHdtX3N0YXRlLT53bTQuc2FtcGxlcl9jb3VudCA9IChyZW5kZXJfc3RhdGUtPndtLnNhbXBsZXJfY291bnQgKyAzKSAvIDQ7CiAgICAgICAgd21fc3RhdGUtPndtNS5tYXhfdGhyZWFkcyA9IDEwICogNSAtIDE7CiAgICB9CgogICAgd21fc3RhdGUtPndtNS50aHJlYWRfZGlzcGF0Y2hfZW5hYmxlID0gMTsKICAgIHdtX3N0YXRlLT53bTUuZW5hYmxlXzE2X3BpeCA9IDE7CiAgICB3bV9zdGF0ZS0+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+Y2Muc3RhdGUpOwp9CgpzdGF0aWMgdm9pZAppOTY1X3JlbmRlcl9zcmNfc3VyZmFjZV9zdGF0ZShWQURyaXZlckNvbnRleHRQIGN0eCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpX2JvICpyZWdpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwgaW50IGZvcm1hdCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7ICAKICAgIHN0cnVjdCBpOTY1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyX3N0YXRlID0gJmk5NjUtPnJlbmRlcl9zdGF0ZTsKICAgIHN0cnVjdCBpOTY1X3N1cmZhY2Vfc3RhdGUgKnNzOwogICAgZHJpX2JvICpzc19ibzsKCiAgICBzc19ibyA9IGRyaV9ib19hbGxvYyhpOTY1LT5pbnRlbC5idWZtZ3IsIAogICAgICAgICAgICAgICAgICAgICAgInN1cmZhY2Ugc3RhdGUiLCAKICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaTk2NV9zdXJmYWNlX3N0YXRlKSwgMzIpOwogICAgYXNzZXJ0KHNzX2JvKTsKICAgIGRyaV9ib19tYXAoc3NfYm8sIDEpOwogICAgYXNzZXJ0KHNzX2JvLT52aXJ0dWFsKTsKICAgIHNzID0gc3NfYm8tPnZpcnR1YWw7CiAgICBtZW1zZXQoc3MsIDAsIHNpemVvZigqc3MpKTsKICAgIHNzLT5zczAuc3VyZmFjZV90eXBlID0gSTk2NV9TVVJGQUNFXzJEOwogICAgc3MtPnNzMC5zdXJmYWNlX2Zvcm1hdCA9IGZvcm1hdDsKICAgIHNzLT5zczAud3JpdGVkaXNhYmxlX2FscGhhID0gMDsKICAgIHNzLT5zczAud3JpdGVkaXNhYmxlX3JlZCA9IDA7CiAgICBzcy0+c3MwLndyaXRlZGlzYWJsZV9ncmVlbiA9IDA7CiAgICBzcy0+c3MwLndyaXRlZGlzYWJsZV9ibHVlID0gMDsKICAgIHNzLT5zczAuY29sb3JfYmxlbmQgPSAxOwogICAgc3MtPnNzMC52ZXJ0X2xpbmVfc3RyaWRlID0gMDsKICAgIHNzLT5zczAudmVydF9saW5lX3N0cmlkZV9vZnMgPSAwOwogICAgc3MtPnNzMC5taXBtYXBfbGF5b3V0X21vZGUgPSAwOwogICAgc3MtPnNzMC5yZW5kZXJfY2FjaGVfcmVhZF9tb2RlID0gMDsKCiAgICBzcy0+c3MxLmJhc2VfYWRkciA9IHJlZ2lvbi0+b2Zmc2V0ICsgb2Zmc2V0OwoKICAgIHNzLT5zczIud2lkdGggPSB3IC0gMTsKICAgIHNzLT5zczIuaGVpZ2h0ID0gaCAtIDE7CiAgICBzcy0+c3MyLm1pcF9jb3VudCA9IDA7CiAgICBzcy0+c3MyLnJlbmRlcl90YXJnZXRfcm90YXRpb24gPSAwOwoKICAgIHNzLT5zczMucGl0Y2ggPSBwaXRjaCAtIDE7CgogICAgZHJpX2JvX2VtaXRfcmVsb2Moc3NfYm8sCiAgICAgICAgICAgICAgICAgICAgICBJOTE1X0dFTV9ET01BSU5fU0FNUExFUiwgMCwKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHN0cnVjdCBpOTY1X3N1cmZhY2Vfc3RhdGUsIHNzMSksCiAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOwoKICAgIGRyaV9ib191bm1hcChzc19ibyk7CgogICAgYXNzZXJ0KGluZGV4IDwgTUFYX1JFTkRFUl9TVVJGQUNFUyk7CiAgICBhc3NlcnQocmVuZGVyX3N0YXRlLT53bS5zdXJmYWNlW2luZGV4XSA9PSBOVUxMKTsKICAgIHJlbmRlcl9zdGF0ZS0+d20uc3VyZmFjZVtpbmRleF0gPSBzc19ibzsKICAgIHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlcl9jb3VudCsrOwp9CgpzdGF0aWMgdm9pZAppOTY1X3N1YnBpY19yZW5kZXJfc3JjX3N1cmZhY2Vfc3RhdGUoVkFEcml2ZXJDb250ZXh0UCBjdHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaV9ibyAqcmVnaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgcCwgaW50IGZvcm1hdCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7ICAKICAgIHN0cnVjdCBpOTY1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyX3N0YXRlID0gJmk5NjUtPnJlbmRlcl9zdGF0ZTsKICAgIHN0cnVjdCBpOTY1X3N1cmZhY2Vfc3RhdGUgKnNzOwogICAgZHJpX2JvICpzc19ibzsKCiAgICBzc19ibyA9IGRyaV9ib19hbGxvYyhpOTY1LT5pbnRlbC5idWZtZ3IsIAogICAgICAgICAgICAgICAgICAgICAgInN1cmZhY2Ugc3RhdGUiLCAKICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaTk2NV9zdXJmYWNlX3N0YXRlKSwgMzIpOwogICAgYXNzZXJ0KHNzX2JvKTsKICAgIGRyaV9ib19tYXAoc3NfYm8sIDEpOwogICAgYXNzZXJ0KHNzX2JvLT52aXJ0dWFsKTsKICAgIHNzID0gc3NfYm8tPnZpcnR1YWw7CiAgICBtZW1zZXQoc3MsIDAsIHNpemVvZigqc3MpKTsKICAgIHNzLT5zczAuc3VyZmFjZV90eXBlID0gSTk2NV9TVVJGQUNFXzJEOwogICAgc3MtPnNzMC5zdXJmYWNlX2Zvcm1hdCA9IGZvcm1hdDsKICAgIHNzLT5zczAud3JpdGVkaXNhYmxlX2FscGhhID0gMDsKICAgIHNzLT5zczAud3JpdGVkaXNhYmxlX3JlZCA9IDA7CiAgICBzcy0+c3MwLndyaXRlZGlzYWJsZV9ncmVlbiA9IDA7CiAgICBzcy0+c3MwLndyaXRlZGlzYWJsZV9ibHVlID0gMDsKICAgIHNzLT5zczAuY29sb3JfYmxlbmQgPSAxOwogICAgc3MtPnNzMC52ZXJ0X2xpbmVfc3RyaWRlID0gMDsKICAgIHNzLT5zczAudmVydF9saW5lX3N0cmlkZV9vZnMgPSAwOwogICAgc3MtPnNzMC5taXBtYXBfbGF5b3V0X21vZGUgPSAwOwogICAgc3MtPnNzMC5yZW5kZXJfY2FjaGVfcmVhZF9tb2RlID0gMDsKCiAgICBzcy0+c3MxLmJhc2VfYWRkciA9IHJlZ2lvbi0+b2Zmc2V0ICsgb2Zmc2V0OwoKICAgIHNzLT5zczIud2lkdGggPSB3IC0gMTsKICAgIHNzLT5zczIuaGVpZ2h0ID0gaCAtIDE7CiAgICBzcy0+c3MyLm1pcF9jb3VudCA9IDA7CiAgICBzcy0+c3MyLnJlbmRlcl90YXJnZXRfcm90YXRpb24gPSAwOwoKICAgIHNzLT5zczMucGl0Y2ggPSBwIC0gMTsKCiAgICBkcmlfYm9fZW1pdF9yZWxvYyhzc19ibywKICAgICAgICAgICAgICAgICAgICAgIEk5MTVfR0VNX0RPTUFJTl9TQU1QTEVSLCAwLAogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGk5NjVfc3VyZmFjZV9zdGF0ZSwgc3MxKSwKICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7CgogICAgZHJpX2JvX3VubWFwKHNzX2JvKTsKCiAgICBhc3NlcnQoaW5kZXggPCBNQVhfUkVOREVSX1NVUkZBQ0VTKTsKICAgIGFzc2VydChyZW5kZXJfc3RhdGUtPndtLnN1cmZhY2VbaW5kZXhdID09IE5VTEwpOwogICAgcmVuZGVyX3N0YXRlLT53bS5zdXJmYWNlW2luZGV4XSA9IHNzX2JvOwogICAgcmVuZGVyX3N0YXRlLT53bS5zYW1wbGVyX2NvdW50Kys7Cn0KCnN0YXRpYyB2b2lkCmk5NjVfcmVuZGVyX3NyY19zdXJmYWNlc19zdGF0ZShWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFTdXJmYWNlSUQgc3VyZmFjZSkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7ICAKICAgIHN0cnVjdCBpOTY1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyX3N0YXRlID0gJmk5NjUtPnJlbmRlcl9zdGF0ZTsKICAgIHN0cnVjdCBvYmplY3Rfc3VyZmFjZSAqb2JqX3N1cmZhY2U7CiAgICBpbnQgdywgaDsKICAgIGludCBydywgcmg7CiAgICBkcmlfYm8gKnJlZ2lvbjsKCiAgICBvYmpfc3VyZmFjZSA9IFNVUkZBQ0Uoc3VyZmFjZSk7CiAgICBhc3NlcnQob2JqX3N1cmZhY2UpOwogICAgYXNzZXJ0KG9ial9zdXJmYWNlLT5ibyk7CiAgICB3ID0gb2JqX3N1cmZhY2UtPndpZHRoOwogICAgaCA9IG9ial9zdXJmYWNlLT5oZWlnaHQ7CiAgICBydyA9IG9ial9zdXJmYWNlLT5vcmlnX3dpZHRoOwogICAgcmggPSBvYmpfc3VyZmFjZS0+b3JpZ19oZWlnaHQ7CiAgICByZWdpb24gPSBvYmpfc3VyZmFjZS0+Ym87CgogICAgaTk2NV9yZW5kZXJfc3JjX3N1cmZhY2Vfc3RhdGUoY3R4LCAxLCByZWdpb24sIDAsIHJ3LCByaCwgdywgSTk2NV9TVVJGQUNFRk9STUFUX1I4X1VOT1JNKTsgICAgIC8qIFkgKi8KICAgIGk5NjVfcmVuZGVyX3NyY19zdXJmYWNlX3N0YXRlKGN0eCwgMiwgcmVnaW9uLCAwLCBydywgcmgsIHcsIEk5NjVfU1VSRkFDRUZPUk1BVF9SOF9VTk9STSk7CgogICAgaWYgKHJlbmRlcl9zdGF0ZS0+aW50ZXJsZWF2ZWRfdXYpIHsKICAgICAgICBpOTY1X3JlbmRlcl9zcmNfc3VyZmFjZV9zdGF0ZShjdHgsIDMsIHJlZ2lvbiwgdyAqIGgsIHJ3IC8gMiwgcmggLyAyLCB3LCBJOTY1X1NVUkZBQ0VGT1JNQVRfUjhHOF9VTk9STSk7IC8qIFVWICovCiAgICAgICAgaTk2NV9yZW5kZXJfc3JjX3N1cmZhY2Vfc3RhdGUoY3R4LCA0LCByZWdpb24sIHcgKiBoLCBydyAvIDIsIHJoIC8gMiwgdywgSTk2NV9TVVJGQUNFRk9STUFUX1I4RzhfVU5PUk0pOwogICAgfSBlbHNlIHsKICAgICAgICBpOTY1X3JlbmRlcl9zcmNfc3VyZmFjZV9zdGF0ZShjdHgsIDMsIHJlZ2lvbiwgdyAqIGgsIHJ3IC8gMiwgcmggLyAyLCB3IC8gMiwgSTk2NV9TVVJGQUNFRk9STUFUX1I4X1VOT1JNKTsgLyogVSAqLwogICAgICAgIGk5NjVfcmVuZGVyX3NyY19zdXJmYWNlX3N0YXRlKGN0eCwgNCwgcmVnaW9uLCB3ICogaCwgcncgLyAyLCByaCAvIDIsIHcgLyAyLCBJOTY1X1NVUkZBQ0VGT1JNQVRfUjhfVU5PUk0pOwogICAgICAgIGk5NjVfcmVuZGVyX3NyY19zdXJmYWNlX3N0YXRlKGN0eCwgNSwgcmVnaW9uLCB3ICogaCArIHcgKiBoIC8gNCwgcncgLyAyLCByaCAvIDIsIHcgLyAyLCBJOTY1X1NVUkZBQ0VGT1JNQVRfUjhfVU5PUk0pOyAgICAgLyogViAqLwogICAgICAgIGk5NjVfcmVuZGVyX3NyY19zdXJmYWNlX3N0YXRlKGN0eCwgNiwgcmVnaW9uLCB3ICogaCArIHcgKiBoIC8gNCwgcncgLyAyLCByaCAvIDIsIHcgLyAyLCBJOTY1X1NVUkZBQ0VGT1JNQVRfUjhfVU5PUk0pOwogICAgfQp9CgpzdGF0aWMgdm9pZAppOTY1X3N1YnBpY19yZW5kZXJfc3JjX3N1cmZhY2VzX3N0YXRlKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVN1cmZhY2VJRCBzdXJmYWNlKQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsgIAogICAgc3RydWN0IG9iamVjdF9zdXJmYWNlICpvYmpfc3VyZmFjZSA9IFNVUkZBQ0Uoc3VyZmFjZSk7CiAgICBpbnQgdywgaDsKICAgIGRyaV9ibyAqcmVnaW9uOwogICAgZHJpX2JvICpzdWJwaWNfcmVnaW9uOwogICAgc3RydWN0IG9iamVjdF9zdWJwaWMgKm9ial9zdWJwaWMgPSBTVUJQSUMob2JqX3N1cmZhY2UtPnN1YnBpYyk7CiAgICBzdHJ1Y3Qgb2JqZWN0X2ltYWdlICpvYmpfaW1hZ2UgPSBJTUFHRShvYmpfc3VicGljLT5pbWFnZSk7CiAgICBhc3NlcnQob2JqX3N1cmZhY2UpOwogICAgYXNzZXJ0KG9ial9zdXJmYWNlLT5ibyk7CiAgICB3ID0gb2JqX3N1cmZhY2UtPndpZHRoOwogICAgaCA9IG9ial9zdXJmYWNlLT5oZWlnaHQ7CiAgICByZWdpb24gPSBvYmpfc3VyZmFjZS0+Ym87CiAgICBzdWJwaWNfcmVnaW9uID0gb2JqX2ltYWdlLT5ibzsKICAgIC8qc3VicGljdHVyZSBzdXJmYWNlKi8KICAgIGk5NjVfc3VicGljX3JlbmRlcl9zcmNfc3VyZmFjZV9zdGF0ZShjdHgsIDEsIHN1YnBpY19yZWdpb24sIDAsIG9ial9zdWJwaWMtPndpZHRoLCBvYmpfc3VicGljLT5oZWlnaHQsIG9ial9zdWJwaWMtPnBpdGNoLCBvYmpfc3VicGljLT5mb3JtYXQpOyAgICAgCiAgICBpOTY1X3N1YnBpY19yZW5kZXJfc3JjX3N1cmZhY2Vfc3RhdGUoY3R4LCAyLCBzdWJwaWNfcmVnaW9uLCAwLCBvYmpfc3VicGljLT53aWR0aCwgb2JqX3N1YnBpYy0+aGVpZ2h0LCBvYmpfc3VicGljLT5waXRjaCwgb2JqX3N1YnBpYy0+Zm9ybWF0KTsgICAgIAp9CgpzdGF0aWMgdm9pZAppOTY1X3JlbmRlcl9zZXRfc3VyZmFjZV90aWxpbmcoc3RydWN0IGk5NjVfc3VyZmFjZV9zdGF0ZSAqc3MsIHVuc2lnbmVkIGludCB0aWxpbmcpCnsKICAgIHN3aXRjaCAodGlsaW5nKSB7CiAgICBjYXNlIEk5MTVfVElMSU5HX05PTkU6CiAgICAgICAgc3MtPnNzMy50aWxlZF9zdXJmYWNlID0gMDsKICAgICAgICBzcy0+c3MzLnRpbGVfd2FsayA9IDA7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIEk5MTVfVElMSU5HX1g6CiAgICAgICAgc3MtPnNzMy50aWxlZF9zdXJmYWNlID0gMTsKICAgICAgICBzcy0+c3MzLnRpbGVfd2FsayA9IEk5NjVfVElMRVdBTEtfWE1BSk9SOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJOTE1X1RJTElOR19ZOgogICAgICAgIHNzLT5zczMudGlsZWRfc3VyZmFjZSA9IDE7CiAgICAgICAgc3MtPnNzMy50aWxlX3dhbGsgPSBJOTY1X1RJTEVXQUxLX1lNQUpPUjsKICAgICAgICBicmVhazsKICAgIH0KfQoKc3RhdGljIHZvaWQKaTk2NV9yZW5kZXJfZGVzdF9zdXJmYWNlX3N0YXRlKFZBRHJpdmVyQ29udGV4dFAgY3R4LCBpbnQgaW5kZXgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOyAgCiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CiAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXN0X3JlZ2lvbiA9IHJlbmRlcl9zdGF0ZS0+ZHJhd19yZWdpb247CiAgICBzdHJ1Y3QgaTk2NV9zdXJmYWNlX3N0YXRlICpzczsKICAgIGRyaV9ibyAqc3NfYm87CgogICAgc3NfYm8gPSBkcmlfYm9fYWxsb2MoaTk2NS0+aW50ZWwuYnVmbWdyLCAKICAgICAgICAgICAgICAgICAgICAgICJzdXJmYWNlIHN0YXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGk5NjVfc3VyZmFjZV9zdGF0ZSksIDMyKTsKICAgIGFzc2VydChzc19ibyk7CiAgICBkcmlfYm9fbWFwKHNzX2JvLCAxKTsKICAgIGFzc2VydChzc19iby0+dmlydHVhbCk7CiAgICBzcyA9IHNzX2JvLT52aXJ0dWFsOwogICAgbWVtc2V0KHNzLCAwLCBzaXplb2YoKnNzKSk7CgogICAgc3MtPnNzMC5zdXJmYWNlX3R5cGUgPSBJOTY1X1NVUkZBQ0VfMkQ7CiAgICBzcy0+c3MwLmRhdGFfcmV0dXJuX2Zvcm1hdCA9IEk5NjVfU1VSRkFDRVJFVFVSTkZPUk1BVF9GTE9BVDMyOwoKICAgIGlmIChkZXN0X3JlZ2lvbi0+Y3BwID09IDIpIHsKCXNzLT5zczAuc3VyZmFjZV9mb3JtYXQgPSBJOTY1X1NVUkZBQ0VGT1JNQVRfQjVHNlI1X1VOT1JNOwoJfSBlbHNlIHsKCXNzLT5zczAuc3VyZmFjZV9mb3JtYXQgPSBJOTY1X1NVUkZBQ0VGT1JNQVRfQjhHOFI4QThfVU5PUk07CiAgICB9CgogICAgc3MtPnNzMC53cml0ZWRpc2FibGVfYWxwaGEgPSAwOwogICAgc3MtPnNzMC53cml0ZWRpc2FibGVfcmVkID0gMDsKICAgIHNzLT5zczAud3JpdGVkaXNhYmxlX2dyZWVuID0gMDsKICAgIHNzLT5zczAud3JpdGVkaXNhYmxlX2JsdWUgPSAwOwogICAgc3MtPnNzMC5jb2xvcl9ibGVuZCA9IDE7CiAgICBzcy0+c3MwLnZlcnRfbGluZV9zdHJpZGUgPSAwOwogICAgc3MtPnNzMC52ZXJ0X2xpbmVfc3RyaWRlX29mcyA9IDA7CiAgICBzcy0+c3MwLm1pcG1hcF9sYXlvdXRfbW9kZSA9IDA7CiAgICBzcy0+c3MwLnJlbmRlcl9jYWNoZV9yZWFkX21vZGUgPSAwOwoKICAgIHNzLT5zczEuYmFzZV9hZGRyID0gZGVzdF9yZWdpb24tPmJvLT5vZmZzZXQ7CgogICAgc3MtPnNzMi53aWR0aCA9IGRlc3RfcmVnaW9uLT53aWR0aCAtIDE7CiAgICBzcy0+c3MyLmhlaWdodCA9IGRlc3RfcmVnaW9uLT5oZWlnaHQgLSAxOwogICAgc3MtPnNzMi5taXBfY291bnQgPSAwOwogICAgc3MtPnNzMi5yZW5kZXJfdGFyZ2V0X3JvdGF0aW9uID0gMDsKICAgIHNzLT5zczMucGl0Y2ggPSBkZXN0X3JlZ2lvbi0+cGl0Y2ggLSAxOwogICAgaTk2NV9yZW5kZXJfc2V0X3N1cmZhY2VfdGlsaW5nKHNzLCBkZXN0X3JlZ2lvbi0+dGlsaW5nKTsKCiAgICBkcmlfYm9fZW1pdF9yZWxvYyhzc19ibywKICAgICAgICAgICAgICAgICAgICAgIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIsCiAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGk5NjVfc3VyZmFjZV9zdGF0ZSwgc3MxKSwKICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcmVnaW9uLT5ibyk7CgogICAgZHJpX2JvX3VubWFwKHNzX2JvKTsKCiAgICBhc3NlcnQoaW5kZXggPCBNQVhfUkVOREVSX1NVUkZBQ0VTKTsKICAgIGFzc2VydChyZW5kZXJfc3RhdGUtPndtLnN1cmZhY2VbaW5kZXhdID09IE5VTEwpOwogICAgcmVuZGVyX3N0YXRlLT53bS5zdXJmYWNlW2luZGV4XSA9IHNzX2JvOwp9CgpzdGF0aWMgdm9pZAppOTY1X3JlbmRlcl9iaW5kaW5nX3RhYmxlKFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsKICAgIHN0cnVjdCBpOTY1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyX3N0YXRlID0gJmk5NjUtPnJlbmRlcl9zdGF0ZTsKICAgIGludCBpOwogICAgdW5zaWduZWQgaW50ICpiaW5kaW5nX3RhYmxlOwoKICAgIGRyaV9ib19tYXAocmVuZGVyX3N0YXRlLT53bS5iaW5kaW5nX3RhYmxlLCAxKTsKICAgIGFzc2VydChyZW5kZXJfc3RhdGUtPndtLmJpbmRpbmdfdGFibGUtPnZpcnR1YWwpOwogICAgYmluZGluZ190YWJsZSA9IHJlbmRlcl9zdGF0ZS0+d20uYmluZGluZ190YWJsZS0+dmlydHVhbDsKICAgIG1lbXNldChiaW5kaW5nX3RhYmxlLCAwLCByZW5kZXJfc3RhdGUtPndtLmJpbmRpbmdfdGFibGUtPnNpemUpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUkVOREVSX1NVUkZBQ0VTOyBpKyspIHsKICAgICAgICBpZiAocmVuZGVyX3N0YXRlLT53bS5zdXJmYWNlW2ldKSB7CiAgICAgICAgICAgIGJpbmRpbmdfdGFibGVbaV0gPSByZW5kZXJfc3RhdGUtPndtLnN1cmZhY2VbaV0tPm9mZnNldDsKICAgICAgICAgICAgZHJpX2JvX2VtaXRfcmVsb2MocmVuZGVyX3N0YXRlLT53bS5iaW5kaW5nX3RhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKiBzaXplb2YoKmJpbmRpbmdfdGFibGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGUtPndtLnN1cmZhY2VbaV0pOwogICAgICAgIH0KICAgIH0KCiAgICBkcmlfYm9fdW5tYXAocmVuZGVyX3N0YXRlLT53bS5iaW5kaW5nX3RhYmxlKTsKfQoKc3RhdGljIHZvaWQgCmk5NjVfc3VicGljX3JlbmRlcl91cGxvYWRfdmVydGV4KFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVN1cmZhY2VJRCBzdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWQVJlY3RhbmdsZSAqb3V0cHV0X3JlY3QpCnsgICAgCiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAgKmk5NjUgICAgICAgICA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsKICAgIHN0cnVjdCBpOTY1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyX3N0YXRlID0gJmk5NjUtPnJlbmRlcl9zdGF0ZTsKICAgIHN0cnVjdCBvYmplY3Rfc3VyZmFjZSAgICAqb2JqX3N1cmZhY2UgID0gU1VSRkFDRShzdXJmYWNlKTsKICAgIHN0cnVjdCBvYmplY3Rfc3VicGljICAgICAqb2JqX3N1YnBpYyAgID0gU1VCUElDKG9ial9zdXJmYWNlLT5zdWJwaWMpOwoKICAgIGNvbnN0IGZsb2F0IHN4ID0gKGZsb2F0KW91dHB1dF9yZWN0LT53aWR0aCAgLyAoZmxvYXQpb2JqX3N1cmZhY2UtPm9yaWdfd2lkdGg7CiAgICBjb25zdCBmbG9hdCBzeSA9IChmbG9hdClvdXRwdXRfcmVjdC0+aGVpZ2h0IC8gKGZsb2F0KW9ial9zdXJmYWNlLT5vcmlnX2hlaWdodDsKICAgIGZsb2F0ICp2YiwgdHgxLCB0eDIsIHR5MSwgdHkyLCB4MSwgeDIsIHkxLCB5MjsKICAgIGludCBpID0gMDsKCiAgICBWQVJlY3RhbmdsZSBkc3RfcmVjdDsKICAgIGRzdF9yZWN0LnggICAgICA9IG91dHB1dF9yZWN0LT54ICsgc3ggKiAoZmxvYXQpb2JqX3N1YnBpYy0+ZHN0X3JlY3QueDsKICAgIGRzdF9yZWN0LnkgICAgICA9IG91dHB1dF9yZWN0LT55ICsgc3ggKiAoZmxvYXQpb2JqX3N1YnBpYy0+ZHN0X3JlY3QueTsKICAgIGRzdF9yZWN0LndpZHRoICA9IHN4ICogKGZsb2F0KW9ial9zdWJwaWMtPmRzdF9yZWN0LndpZHRoOwogICAgZHN0X3JlY3QuaGVpZ2h0ID0gc3kgKiAoZmxvYXQpb2JqX3N1YnBpYy0+ZHN0X3JlY3QuaGVpZ2h0OwoKICAgIGRyaV9ib19tYXAocmVuZGVyX3N0YXRlLT52Yi52ZXJ0ZXhfYnVmZmVyLCAxKTsKICAgIGFzc2VydChyZW5kZXJfc3RhdGUtPnZiLnZlcnRleF9idWZmZXItPnZpcnR1YWwpOwogICAgdmIgPSByZW5kZXJfc3RhdGUtPnZiLnZlcnRleF9idWZmZXItPnZpcnR1YWw7CgogICAgdHgxID0gKGZsb2F0KW9ial9zdWJwaWMtPnNyY19yZWN0LnggLyAoZmxvYXQpb2JqX3N1YnBpYy0+d2lkdGg7CiAgICB0eTEgPSAoZmxvYXQpb2JqX3N1YnBpYy0+c3JjX3JlY3QueSAvIChmbG9hdClvYmpfc3VicGljLT5oZWlnaHQ7CiAgICB0eDIgPSAoZmxvYXQpKG9ial9zdWJwaWMtPnNyY19yZWN0LnggKyBvYmpfc3VicGljLT5zcmNfcmVjdC53aWR0aCkgLyAoZmxvYXQpb2JqX3N1YnBpYy0+d2lkdGg7CiAgICB0eTIgPSAoZmxvYXQpKG9ial9zdWJwaWMtPnNyY19yZWN0LnkgKyBvYmpfc3VicGljLT5zcmNfcmVjdC5oZWlnaHQpIC8gKGZsb2F0KW9ial9zdWJwaWMtPmhlaWdodDsKCiAgICB4MSA9IChmbG9hdClkc3RfcmVjdC54OwogICAgeTEgPSAoZmxvYXQpZHN0X3JlY3QueTsKICAgIHgyID0gKGZsb2F0KShkc3RfcmVjdC54ICsgZHN0X3JlY3Qud2lkdGgpOwogICAgeTIgPSAoZmxvYXQpKGRzdF9yZWN0LnkgKyBkc3RfcmVjdC5oZWlnaHQpOwoKICAgIHZiW2krK10gPSB0eDI7CiAgICB2YltpKytdID0gdHkyOwogICAgdmJbaSsrXSA9IHgyOwogICAgdmJbaSsrXSA9IHkyOwoKICAgIHZiW2krK10gPSB0eDE7CiAgICB2YltpKytdID0gdHkyOwogICAgdmJbaSsrXSA9IHgxOwogICAgdmJbaSsrXSA9IHkyOwoKICAgIHZiW2krK10gPSB0eDE7CiAgICB2YltpKytdID0gdHkxOwogICAgdmJbaSsrXSA9IHgxOwogICAgdmJbaSsrXSA9IHkxOwogICAgZHJpX2JvX3VubWFwKHJlbmRlcl9zdGF0ZS0+dmIudmVydGV4X2J1ZmZlcik7Cn0KCnN0YXRpYyB2b2lkIAppOTY1X3JlbmRlcl91cGxvYWRfdmVydGV4KFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgIFZBU3VyZmFjZUlEIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgc3JjeCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBzcmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNyY3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc3JjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBkZXN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBkZXN0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZXN0dywKICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZXN0aCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CiAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXN0X3JlZ2lvbiA9IHJlbmRlcl9zdGF0ZS0+ZHJhd19yZWdpb247CiAgICBzdHJ1Y3Qgb2JqZWN0X3N1cmZhY2UgKm9ial9zdXJmYWNlOwogICAgZmxvYXQgKnZiOwoKICAgIGZsb2F0IHUxLCB2MSwgdTIsIHYyOwogICAgaW50IGksIHdpZHRoLCBoZWlnaHQ7CiAgICBpbnQgYm94X3gxID0gZGVzdF9yZWdpb24tPnggKyBkZXN0eDsKICAgIGludCBib3hfeTEgPSBkZXN0X3JlZ2lvbi0+eSArIGRlc3R5OwogICAgaW50IGJveF94MiA9IGJveF94MSArIGRlc3R3OwogICAgaW50IGJveF95MiA9IGJveF95MSArIGRlc3RoOwoKICAgIG9ial9zdXJmYWNlID0gU1VSRkFDRShzdXJmYWNlKTsKICAgIGFzc2VydChzdXJmYWNlKTsKICAgIHdpZHRoID0gb2JqX3N1cmZhY2UtPm9yaWdfd2lkdGg7CiAgICBoZWlnaHQgPSBvYmpfc3VyZmFjZS0+b3JpZ19oZWlnaHQ7CgogICAgdTEgPSAoZmxvYXQpc3JjeCAvIHdpZHRoOwogICAgdjEgPSAoZmxvYXQpc3JjeSAvIGhlaWdodDsKICAgIHUyID0gKGZsb2F0KShzcmN4ICsgc3JjdykgLyB3aWR0aDsKICAgIHYyID0gKGZsb2F0KShzcmN5ICsgc3JjaCkgLyBoZWlnaHQ7CgogICAgZHJpX2JvX21hcChyZW5kZXJfc3RhdGUtPnZiLnZlcnRleF9idWZmZXIsIDEpOwogICAgYXNzZXJ0KHJlbmRlcl9zdGF0ZS0+dmIudmVydGV4X2J1ZmZlci0+dmlydHVhbCk7CiAgICB2YiA9IHJlbmRlcl9zdGF0ZS0+dmIudmVydGV4X2J1ZmZlci0+dmlydHVhbDsKCiAgICBpID0gMDsKICAgIHZiW2krK10gPSB1MjsKICAgIHZiW2krK10gPSB2MjsKICAgIHZiW2krK10gPSAoZmxvYXQpYm94X3gyOwogICAgdmJbaSsrXSA9IChmbG9hdClib3hfeTI7CiAgICAKICAgIHZiW2krK10gPSB1MTsKICAgIHZiW2krK10gPSB2MjsKICAgIHZiW2krK10gPSAoZmxvYXQpYm94X3gxOwogICAgdmJbaSsrXSA9IChmbG9hdClib3hfeTI7CgogICAgdmJbaSsrXSA9IHUxOwogICAgdmJbaSsrXSA9IHYxOwogICAgdmJbaSsrXSA9IChmbG9hdClib3hfeDE7CiAgICB2YltpKytdID0gKGZsb2F0KWJveF95MTsKCiAgICBkcmlfYm9fdW5tYXAocmVuZGVyX3N0YXRlLT52Yi52ZXJ0ZXhfYnVmZmVyKTsKfQoKc3RhdGljIHZvaWQKaTk2NV9yZW5kZXJfdXBsb2FkX2NvbnN0YW50cyhWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CiAgICB1bnNpZ25lZCBzaG9ydCAqY29uc3RhbnRfYnVmZmVyOwoKICAgIGlmIChyZW5kZXJfc3RhdGUtPmN1cmJlLnVwbG9hZCkKICAgICAgICByZXR1cm47CgogICAgZHJpX2JvX21hcChyZW5kZXJfc3RhdGUtPmN1cmJlLmJvLCAxKTsKICAgIGFzc2VydChyZW5kZXJfc3RhdGUtPmN1cmJlLmJvLT52aXJ0dWFsKTsKICAgIGNvbnN0YW50X2J1ZmZlciA9IHJlbmRlcl9zdGF0ZS0+Y3VyYmUuYm8tPnZpcnR1YWw7CgogICAgaWYgKHJlbmRlcl9zdGF0ZS0+aW50ZXJsZWF2ZWRfdXYpCiAgICAgICAgKmNvbnN0YW50X2J1ZmZlciA9IDE7CiAgICBlbHNlCiAgICAgICAgKmNvbnN0YW50X2J1ZmZlciA9IDA7CgogICAgZHJpX2JvX3VubWFwKHJlbmRlcl9zdGF0ZS0+Y3VyYmUuYm8pOwogICAgcmVuZGVyX3N0YXRlLT5jdXJiZS51cGxvYWQgPSAxOwp9CgpzdGF0aWMgdm9pZAppOTY1X3N1cmZhY2VfcmVuZGVyX3N0YXRlX3NldHVwKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICBWQVN1cmZhY2VJRCBzdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBzcmN4LAogICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBzcmN5LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzcmN3LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzcmNoLAogICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBkZXN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgZGVzdHksCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlc3R3LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZXN0aCkKewogICAgaTk2NV9yZW5kZXJfdnNfdW5pdChjdHgpOwogICAgaTk2NV9yZW5kZXJfc2ZfdW5pdChjdHgpOwogICAgaTk2NV9yZW5kZXJfZGVzdF9zdXJmYWNlX3N0YXRlKGN0eCwgMCk7CiAgICBpOTY1X3JlbmRlcl9zcmNfc3VyZmFjZXNfc3RhdGUoY3R4LCBzdXJmYWNlKTsKICAgIGk5NjVfcmVuZGVyX3NhbXBsZXIoY3R4KTsKICAgIGk5NjVfcmVuZGVyX3dtX3VuaXQoY3R4KTsKICAgIGk5NjVfcmVuZGVyX2NjX3ZpZXdwb3J0KGN0eCk7CiAgICBpOTY1X3JlbmRlcl9jY191bml0KGN0eCk7CiAgICBpOTY1X3JlbmRlcl9iaW5kaW5nX3RhYmxlKGN0eCk7CiAgICBpOTY1X3JlbmRlcl91cGxvYWRfdmVydGV4KGN0eCwgc3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjeCwgc3JjeSwgc3Jjdywgc3JjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHgsIGRlc3R5LCBkZXN0dywgZGVzdGgpOwogICAgaTk2NV9yZW5kZXJfdXBsb2FkX2NvbnN0YW50cyhjdHgpOwp9CnN0YXRpYyB2b2lkCmk5NjVfc3VicGljX3JlbmRlcl9zdGF0ZV9zZXR1cChWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgVkFTdXJmYWNlSUQgc3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgc3JjeCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgc3JjeSwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc3JjdywKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc3JjaCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgZGVzdHgsCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGRlc3R5LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZXN0dywKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZGVzdGgpCnsKICAgIGk5NjVfcmVuZGVyX3ZzX3VuaXQoY3R4KTsKICAgIGk5NjVfcmVuZGVyX3NmX3VuaXQoY3R4KTsKICAgIGk5NjVfcmVuZGVyX2Rlc3Rfc3VyZmFjZV9zdGF0ZShjdHgsIDApOwogICAgaTk2NV9zdWJwaWNfcmVuZGVyX3NyY19zdXJmYWNlc19zdGF0ZShjdHgsIHN1cmZhY2UpOwogICAgaTk2NV9yZW5kZXJfc2FtcGxlcihjdHgpOwogICAgaTk2NV9zdWJwaWNfcmVuZGVyX3dtX3VuaXQoY3R4KTsKICAgIGk5NjVfcmVuZGVyX2NjX3ZpZXdwb3J0KGN0eCk7CiAgICBpOTY1X3N1YnBpY19yZW5kZXJfY2NfdW5pdChjdHgpOwogICAgaTk2NV9yZW5kZXJfYmluZGluZ190YWJsZShjdHgpOwoKICAgIFZBUmVjdGFuZ2xlIG91dHB1dF9yZWN0OwogICAgb3V0cHV0X3JlY3QueCAgICAgID0gZGVzdHg7CiAgICBvdXRwdXRfcmVjdC55ICAgICAgPSBkZXN0eTsKICAgIG91dHB1dF9yZWN0LndpZHRoICA9IGRlc3R3OwogICAgb3V0cHV0X3JlY3QuaGVpZ2h0ID0gZGVzdGg7CiAgICBpOTY1X3N1YnBpY19yZW5kZXJfdXBsb2FkX3ZlcnRleChjdHgsIHN1cmZhY2UsICZvdXRwdXRfcmVjdCk7Cn0KCgpzdGF0aWMgdm9pZAppOTY1X3JlbmRlcl9waXBlbGluZV9zZWxlY3QoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIEJFR0lOX0JBVENIKGN0eCwgMSk7CiAgICBPVVRfQkFUQ0goY3R4LCBDTURfUElQRUxJTkVfU0VMRUNUIHwgUElQRUxJTkVfU0VMRUNUXzNEKTsKICAgIEFEVkFOQ0VfQkFUQ0goY3R4KTsKfQoKc3RhdGljIHZvaWQKaTk2NV9yZW5kZXJfc3RhdGVfc2lwKFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBCRUdJTl9CQVRDSChjdHgsIDIpOwogICAgT1VUX0JBVENIKGN0eCwgQ01EX1NUQVRFX1NJUCB8IDApOwogICAgT1VUX0JBVENIKGN0eCwgMCk7CiAgICBBRFZBTkNFX0JBVENIKGN0eCk7Cn0KCnN0YXRpYyB2b2lkCmk5NjVfcmVuZGVyX3N0YXRlX2Jhc2VfYWRkcmVzcyhWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CgogICAgaWYgKElTX0lST05MQUtFKGk5NjUtPmludGVsLmRldmljZV9pZCkpIHsKICAgICAgICBCRUdJTl9CQVRDSChjdHgsIDgpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIENNRF9TVEFURV9CQVNFX0FERFJFU1MgfCA2KTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCAwIHwgQkFTRV9BRERSRVNTX01PRElGWSk7CiAgICAgICAgT1VUX0JBVENIKGN0eCwgMCB8IEJBU0VfQUREUkVTU19NT0RJRlkpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIDAgfCBCQVNFX0FERFJFU1NfTU9ESUZZKTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCAwIHwgQkFTRV9BRERSRVNTX01PRElGWSk7CiAgICAgICAgT1VUX0JBVENIKGN0eCwgMCB8IEJBU0VfQUREUkVTU19NT0RJRlkpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIDAgfCBCQVNFX0FERFJFU1NfTU9ESUZZKTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCAwIHwgQkFTRV9BRERSRVNTX01PRElGWSk7CiAgICAgICAgQURWQU5DRV9CQVRDSChjdHgpOwogICAgfSBlbHNlIHsKICAgICAgICBCRUdJTl9CQVRDSChjdHgsIDYpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIENNRF9TVEFURV9CQVNFX0FERFJFU1MgfCA0KTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCAwIHwgQkFTRV9BRERSRVNTX01PRElGWSk7CiAgICAgICAgT1VUX0JBVENIKGN0eCwgMCB8IEJBU0VfQUREUkVTU19NT0RJRlkpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIDAgfCBCQVNFX0FERFJFU1NfTU9ESUZZKTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCAwIHwgQkFTRV9BRERSRVNTX01PRElGWSk7CiAgICAgICAgT1VUX0JBVENIKGN0eCwgMCB8IEJBU0VfQUREUkVTU19NT0RJRlkpOwogICAgICAgIEFEVkFOQ0VfQkFUQ0goY3R4KTsKICAgIH0KfQoKc3RhdGljIHZvaWQKaTk2NV9yZW5kZXJfYmluZGluZ190YWJsZV9wb2ludGVycyhWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CgogICAgQkVHSU5fQkFUQ0goY3R4LCA2KTsKICAgIE9VVF9CQVRDSChjdHgsIENNRF9CSU5ESU5HX1RBQkxFX1BPSU5URVJTIHwgNCk7CiAgICBPVVRfQkFUQ0goY3R4LCAwKTsgLyogdnMgKi8KICAgIE9VVF9CQVRDSChjdHgsIDApOyAvKiBncyAqLwogICAgT1VUX0JBVENIKGN0eCwgMCk7IC8qIGNsaXAgKi8KICAgIE9VVF9CQVRDSChjdHgsIDApOyAvKiBzZiAqLwogICAgT1VUX1JFTE9DKGN0eCwgcmVuZGVyX3N0YXRlLT53bS5iaW5kaW5nX3RhYmxlLCBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsIDApOyAvKiB3bSAqLwogICAgQURWQU5DRV9CQVRDSChjdHgpOwp9CgpzdGF0aWMgdm9pZCAKaTk2NV9yZW5kZXJfY29uc3RhbnRfY29sb3IoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIEJFR0lOX0JBVENIKGN0eCwgNSk7CiAgICBPVVRfQkFUQ0goY3R4LCBDTURfQ09OU1RBTlRfQ09MT1IgfCAzKTsKICAgIE9VVF9CQVRDSChjdHgsIGZsb2F0X3RvX3VpbnQoMS4wKSk7CiAgICBPVVRfQkFUQ0goY3R4LCBmbG9hdF90b191aW50KDAuMCkpOwogICAgT1VUX0JBVENIKGN0eCwgZmxvYXRfdG9fdWludCgxLjApKTsKICAgIE9VVF9CQVRDSChjdHgsIGZsb2F0X3RvX3VpbnQoMS4wKSk7CiAgICBBRFZBTkNFX0JBVENIKGN0eCk7Cn0KCnN0YXRpYyB2b2lkCmk5NjVfcmVuZGVyX3BpcGVsaW5lZF9wb2ludGVycyhWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CgogICAgQkVHSU5fQkFUQ0goY3R4LCA3KTsKICAgIE9VVF9CQVRDSChjdHgsIENNRF9QSVBFTElORURfUE9JTlRFUlMgfCA1KTsKICAgIE9VVF9SRUxPQyhjdHgsIHJlbmRlcl9zdGF0ZS0+dnMuc3RhdGUsIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwgMCk7CiAgICBPVVRfQkFUQ0goY3R4LCAwKTsgIC8qIGRpc2FibGUgR1MgKi8KICAgIE9VVF9CQVRDSChjdHgsIDApOyAgLyogZGlzYWJsZSBDTElQICovCiAgICBPVVRfUkVMT0MoY3R4LCByZW5kZXJfc3RhdGUtPnNmLnN0YXRlLCBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsIDApOwogICAgT1VUX1JFTE9DKGN0eCwgcmVuZGVyX3N0YXRlLT53bS5zdGF0ZSwgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLCAwKTsKICAgIE9VVF9SRUxPQyhjdHgsIHJlbmRlcl9zdGF0ZS0+Y2Muc3RhdGUsIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwgMCk7CiAgICBBRFZBTkNFX0JBVENIKGN0eCk7Cn0KCnN0YXRpYyB2b2lkCmk5NjVfcmVuZGVyX3VyYl9sYXlvdXQoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIGludCB1cmJfdnNfc3RhcnQsIHVyYl92c19zaXplOwogICAgaW50IHVyYl9nc19zdGFydCwgdXJiX2dzX3NpemU7CiAgICBpbnQgdXJiX2NsaXBfc3RhcnQsIHVyYl9jbGlwX3NpemU7CiAgICBpbnQgdXJiX3NmX3N0YXJ0LCB1cmJfc2Zfc2l6ZTsKICAgIGludCB1cmJfY3Nfc3RhcnQsIHVyYl9jc19zaXplOwoKICAgIHVyYl92c19zdGFydCA9IDA7CiAgICB1cmJfdnNfc2l6ZSA9IFVSQl9WU19FTlRSSUVTICogVVJCX1ZTX0VOVFJZX1NJWkU7CiAgICB1cmJfZ3Nfc3RhcnQgPSB1cmJfdnNfc3RhcnQgKyB1cmJfdnNfc2l6ZTsKICAgIHVyYl9nc19zaXplID0gVVJCX0dTX0VOVFJJRVMgKiBVUkJfR1NfRU5UUllfU0laRTsKICAgIHVyYl9jbGlwX3N0YXJ0ID0gdXJiX2dzX3N0YXJ0ICsgdXJiX2dzX3NpemU7CiAgICB1cmJfY2xpcF9zaXplID0gVVJCX0NMSVBfRU5UUklFUyAqIFVSQl9DTElQX0VOVFJZX1NJWkU7CiAgICB1cmJfc2Zfc3RhcnQgPSB1cmJfY2xpcF9zdGFydCArIHVyYl9jbGlwX3NpemU7CiAgICB1cmJfc2Zfc2l6ZSA9IFVSQl9TRl9FTlRSSUVTICogVVJCX1NGX0VOVFJZX1NJWkU7CiAgICB1cmJfY3Nfc3RhcnQgPSB1cmJfc2Zfc3RhcnQgKyB1cmJfc2Zfc2l6ZTsKICAgIHVyYl9jc19zaXplID0gVVJCX0NTX0VOVFJJRVMgKiBVUkJfQ1NfRU5UUllfU0laRTsKCiAgICBCRUdJTl9CQVRDSChjdHgsIDMpOwogICAgT1VUX0JBVENIKGN0eCwgCiAgICAgICAgICAgICAgQ01EX1VSQl9GRU5DRSB8CiAgICAgICAgICAgICAgVUYwX0NTX1JFQUxMT0MgfAogICAgICAgICAgICAgIFVGMF9TRl9SRUFMTE9DIHwKICAgICAgICAgICAgICBVRjBfQ0xJUF9SRUFMTE9DIHwKICAgICAgICAgICAgICBVRjBfR1NfUkVBTExPQyB8CiAgICAgICAgICAgICAgVUYwX1ZTX1JFQUxMT0MgfAogICAgICAgICAgICAgIDEpOwogICAgT1VUX0JBVENIKGN0eCwgCiAgICAgICAgICAgICAgKCh1cmJfY2xpcF9zdGFydCArIHVyYl9jbGlwX3NpemUpIDw8IFVGMV9DTElQX0ZFTkNFX1NISUZUKSB8CiAgICAgICAgICAgICAgKCh1cmJfZ3Nfc3RhcnQgKyB1cmJfZ3Nfc2l6ZSkgPDwgVUYxX0dTX0ZFTkNFX1NISUZUKSB8CiAgICAgICAgICAgICAgKCh1cmJfdnNfc3RhcnQgKyB1cmJfdnNfc2l6ZSkgPDwgVUYxX1ZTX0ZFTkNFX1NISUZUKSk7CiAgICBPVVRfQkFUQ0goY3R4LAogICAgICAgICAgICAgICgodXJiX2NzX3N0YXJ0ICsgdXJiX2NzX3NpemUpIDw8IFVGMl9DU19GRU5DRV9TSElGVCkgfAogICAgICAgICAgICAgICgodXJiX3NmX3N0YXJ0ICsgdXJiX3NmX3NpemUpIDw8IFVGMl9TRl9GRU5DRV9TSElGVCkpOwogICAgQURWQU5DRV9CQVRDSChjdHgpOwp9CgpzdGF0aWMgdm9pZCAKaTk2NV9yZW5kZXJfY3NfdXJiX2xheW91dChWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgQkVHSU5fQkFUQ0goY3R4LCAyKTsKICAgIE9VVF9CQVRDSChjdHgsIENNRF9DU19VUkJfU1RBVEUgfCAwKTsKICAgIE9VVF9CQVRDSChjdHgsCiAgICAgICAgICAgICAgKChVUkJfQ1NfRU5UUllfU0laRSAtIDEpIDw8IDQpIHwgICAgICAgICAgLyogVVJCIEVudHJ5IEFsbG9jYXRpb24gU2l6ZSAqLwogICAgICAgICAgICAgIChVUkJfQ1NfRU5UUklFUyA8PCAwKSk7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBVUkIgRW50cmllcyAqLwogICAgQURWQU5DRV9CQVRDSChjdHgpOwp9CgpzdGF0aWMgdm9pZAppOTY1X3JlbmRlcl9jb25zdGFudF9idWZmZXIoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IGk5NjVfcmVuZGVyX3N0YXRlICpyZW5kZXJfc3RhdGUgPSAmaTk2NS0+cmVuZGVyX3N0YXRlOwoKICAgIEJFR0lOX0JBVENIKGN0eCwgMik7CiAgICBPVVRfQkFUQ0goY3R4LCBDTURfQ09OU1RBTlRfQlVGRkVSIHwgKDEgPDwgOCkgfCAoMiAtIDIpKTsKICAgIE9VVF9SRUxPQyhjdHgsIHJlbmRlcl9zdGF0ZS0+Y3VyYmUuYm8sCiAgICAgICAgICAgICAgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLAogICAgICAgICAgICAgIFVSQl9DU19FTlRSWV9TSVpFIC0gMSk7CiAgICBBRFZBTkNFX0JBVENIKGN0eCk7ICAgIAp9CgpzdGF0aWMgdm9pZAppOTY1X3JlbmRlcl9kcmF3aW5nX3JlY3RhbmdsZShWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7ICAKICAgIHN0cnVjdCBpOTY1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyX3N0YXRlID0gJmk5NjUtPnJlbmRlcl9zdGF0ZTsKICAgIHN0cnVjdCBpbnRlbF9yZWdpb24gKmRlc3RfcmVnaW9uID0gcmVuZGVyX3N0YXRlLT5kcmF3X3JlZ2lvbjsKCiAgICBCRUdJTl9CQVRDSChjdHgsIDQpOwogICAgT1VUX0JBVENIKGN0eCwgQ01EX0RSQVdJTkdfUkVDVEFOR0xFIHwgMik7CiAgICBPVVRfQkFUQ0goY3R4LCAweDAwMDAwMDAwKTsKICAgIE9VVF9CQVRDSChjdHgsIChkZXN0X3JlZ2lvbi0+d2lkdGggLSAxKSB8IChkZXN0X3JlZ2lvbi0+aGVpZ2h0IC0gMSkgPDwgMTYpOwogICAgT1VUX0JBVENIKGN0eCwgMHgwMDAwMDAwMCk7ICAgICAgICAgCiAgICBBRFZBTkNFX0JBVENIKGN0eCk7Cn0KCnN0YXRpYyB2b2lkCmk5NjVfcmVuZGVyX3ZlcnRleF9lbGVtZW50cyhWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7ICAKCiAgICBpZiAoSVNfSVJPTkxBS0UoaTk2NS0+aW50ZWwuZGV2aWNlX2lkKSkgewogICAgICAgIEJFR0lOX0JBVENIKGN0eCwgNSk7CiAgICAgICAgT1VUX0JBVENIKGN0eCwgQ01EX1ZFUlRFWF9FTEVNRU5UUyB8IDMpOwogICAgICAgIC8qIG9mZnNldCAwOiBYLFkgLT4ge1gsIFksIDEuMCwgMS4wfSAqLwogICAgICAgIE9VVF9CQVRDSChjdHgsICgwIDw8IFZFMF9WRVJURVhfQlVGRkVSX0lOREVYX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgIFZFMF9WQUxJRCB8CiAgICAgICAgICAgICAgICAgIChJOTY1X1NVUkZBQ0VGT1JNQVRfUjMyRzMyX0ZMT0FUIDw8IFZFMF9GT1JNQVRfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgKDAgPDwgVkUwX09GRlNFVF9TSElGVCkpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIChJOTY1X1ZGQ09NUE9ORU5UX1NUT1JFX1NSQyA8PCBWRTFfVkZDT01QT05FTlRfMF9TSElGVCkgfAogICAgICAgICAgICAgICAgICAoSTk2NV9WRkNPTVBPTkVOVF9TVE9SRV9TUkMgPDwgVkUxX1ZGQ09NUE9ORU5UXzFfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgKEk5NjVfVkZDT01QT05FTlRfU1RPUkVfMV9GTFQgPDwgVkUxX1ZGQ09NUE9ORU5UXzJfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgKEk5NjVfVkZDT01QT05FTlRfU1RPUkVfMV9GTFQgPDwgVkUxX1ZGQ09NUE9ORU5UXzNfU0hJRlQpKTsKICAgICAgICAvKiBvZmZzZXQgODogUzAsIFQwIC0+IHtTMCwgVDAsIDEuMCwgMS4wfSAqLwogICAgICAgIE9VVF9CQVRDSChjdHgsICgwIDw8IFZFMF9WRVJURVhfQlVGRkVSX0lOREVYX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgIFZFMF9WQUxJRCB8CiAgICAgICAgICAgICAgICAgIChJOTY1X1NVUkZBQ0VGT1JNQVRfUjMyRzMyX0ZMT0FUIDw8IFZFMF9GT1JNQVRfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgKDggPDwgVkUwX09GRlNFVF9TSElGVCkpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIChJOTY1X1ZGQ09NUE9ORU5UX1NUT1JFX1NSQyA8PCBWRTFfVkZDT01QT05FTlRfMF9TSElGVCkgfAogICAgICAgICAgICAgICAgICAoSTk2NV9WRkNPTVBPTkVOVF9TVE9SRV9TUkMgPDwgVkUxX1ZGQ09NUE9ORU5UXzFfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgKEk5NjVfVkZDT01QT05FTlRfU1RPUkVfMV9GTFQgPDwgVkUxX1ZGQ09NUE9ORU5UXzJfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgKEk5NjVfVkZDT01QT05FTlRfU1RPUkVfMV9GTFQgPDwgVkUxX1ZGQ09NUE9ORU5UXzNfU0hJRlQpKTsKICAgICAgICBBRFZBTkNFX0JBVENIKGN0eCk7CiAgICB9IGVsc2UgewogICAgICAgIEJFR0lOX0JBVENIKGN0eCwgNSk7CiAgICAgICAgT1VUX0JBVENIKGN0eCwgQ01EX1ZFUlRFWF9FTEVNRU5UUyB8IDMpOwogICAgICAgIC8qIG9mZnNldCAwOiBYLFkgLT4ge1gsIFksIDEuMCwgMS4wfSAqLwogICAgICAgIE9VVF9CQVRDSChjdHgsICgwIDw8IFZFMF9WRVJURVhfQlVGRkVSX0lOREVYX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgIFZFMF9WQUxJRCB8CiAgICAgICAgICAgICAgICAgIChJOTY1X1NVUkZBQ0VGT1JNQVRfUjMyRzMyX0ZMT0FUIDw8IFZFMF9GT1JNQVRfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgKDAgPDwgVkUwX09GRlNFVF9TSElGVCkpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIChJOTY1X1ZGQ09NUE9ORU5UX1NUT1JFX1NSQyA8PCBWRTFfVkZDT01QT05FTlRfMF9TSElGVCkgfAogICAgICAgICAgICAgICAgICAoSTk2NV9WRkNPTVBPTkVOVF9TVE9SRV9TUkMgPDwgVkUxX1ZGQ09NUE9ORU5UXzFfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgKEk5NjVfVkZDT01QT05FTlRfU1RPUkVfMV9GTFQgPDwgVkUxX1ZGQ09NUE9ORU5UXzJfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgKEk5NjVfVkZDT01QT05FTlRfU1RPUkVfMV9GTFQgPDwgVkUxX1ZGQ09NUE9ORU5UXzNfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgKDAgPDwgVkUxX0RFU1RJTkFUSU9OX0VMRU1FTlRfT0ZGU0VUX1NISUZUKSk7CiAgICAgICAgLyogb2Zmc2V0IDg6IFMwLCBUMCAtPiB7UzAsIFQwLCAxLjAsIDEuMH0gKi8KICAgICAgICBPVVRfQkFUQ0goY3R4LCAoMCA8PCBWRTBfVkVSVEVYX0JVRkZFUl9JTkRFWF9TSElGVCkgfAogICAgICAgICAgICAgICAgICBWRTBfVkFMSUQgfAogICAgICAgICAgICAgICAgICAoSTk2NV9TVVJGQUNFRk9STUFUX1IzMkczMl9GTE9BVCA8PCBWRTBfRk9STUFUX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgICg4IDw8IFZFMF9PRkZTRVRfU0hJRlQpKTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCAoSTk2NV9WRkNPTVBPTkVOVF9TVE9SRV9TUkMgPDwgVkUxX1ZGQ09NUE9ORU5UXzBfU0hJRlQpIHwKICAgICAgICAgICAgICAgICAgKEk5NjVfVkZDT01QT05FTlRfU1RPUkVfU1JDIDw8IFZFMV9WRkNPTVBPTkVOVF8xX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgIChJOTY1X1ZGQ09NUE9ORU5UX1NUT1JFXzFfRkxUIDw8IFZFMV9WRkNPTVBPTkVOVF8yX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgIChJOTY1X1ZGQ09NUE9ORU5UX1NUT1JFXzFfRkxUIDw8IFZFMV9WRkNPTVBPTkVOVF8zX1NISUZUKSB8CiAgICAgICAgICAgICAgICAgICg0IDw8IFZFMV9ERVNUSU5BVElPTl9FTEVNRU5UX09GRlNFVF9TSElGVCkpOwogICAgICAgIEFEVkFOQ0VfQkFUQ0goY3R4KTsKICAgIH0KfQoKc3RhdGljIHZvaWQKaTk2NV9yZW5kZXJfdXBsb2FkX2ltYWdlX3BhbGV0dGUoCiAgICBWQURyaXZlckNvbnRleHRQIGN0eCwKICAgIFZBSW1hZ2VJRCAgICAgICAgaW1hZ2VfaWQsCiAgICB1bnNpZ25lZCBpbnQgICAgIGFscGhhCikKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICB1bnNpZ25lZCBpbnQgaTsKCiAgICBzdHJ1Y3Qgb2JqZWN0X2ltYWdlICpvYmpfaW1hZ2UgPSBJTUFHRShpbWFnZV9pZCk7CiAgICBhc3NlcnQob2JqX2ltYWdlKTsKCiAgICBpZiAob2JqX2ltYWdlLT5pbWFnZS5udW1fcGFsZXR0ZV9lbnRyaWVzID09IDApCiAgICAgICAgcmV0dXJuOwoKICAgIEJFR0lOX0JBVENIKGN0eCwgMSArIG9ial9pbWFnZS0+aW1hZ2UubnVtX3BhbGV0dGVfZW50cmllcyk7CiAgICBPVVRfQkFUQ0goY3R4LCBDTURfU0FNUExFUl9QQUxFVFRFX0xPQUQgfCAob2JqX2ltYWdlLT5pbWFnZS5udW1fcGFsZXR0ZV9lbnRyaWVzIC0gMSkpOwogICAgLypmaWxsIHBhbGV0dGUqLwogICAgLy9pbnQzMl90IG91dFsxNl07IC8vMC0yMzpjb2xvciAyMy0zMTphbHBoYQogICAgZm9yIChpID0gMDsgaSA8IG9ial9pbWFnZS0+aW1hZ2UubnVtX3BhbGV0dGVfZW50cmllczsgaSsrKQogICAgICAgIE9VVF9CQVRDSChjdHgsIChhbHBoYSA8PCAyNCkgfCBvYmpfaW1hZ2UtPnBhbGV0dGVbaV0pOwogICAgQURWQU5DRV9CQVRDSChjdHgpOwp9CgpzdGF0aWMgdm9pZAppOTY1X3JlbmRlcl9zdGFydHVwKFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsKICAgIHN0cnVjdCBpOTY1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyX3N0YXRlID0gJmk5NjUtPnJlbmRlcl9zdGF0ZTsKCiAgICBCRUdJTl9CQVRDSChjdHgsIDExKTsKICAgIE9VVF9CQVRDSChjdHgsIENNRF9WRVJURVhfQlVGRkVSUyB8IDMpOwogICAgT1VUX0JBVENIKGN0eCwgCiAgICAgICAgICAgICAgKDAgPDwgVkIwX0JVRkZFUl9JTkRFWF9TSElGVCkgfAogICAgICAgICAgICAgIFZCMF9WRVJURVhEQVRBIHwKICAgICAgICAgICAgICAoKDQgKiA0KSA8PCBWQjBfQlVGRkVSX1BJVENIX1NISUZUKSk7CiAgICBPVVRfUkVMT0MoY3R4LCByZW5kZXJfc3RhdGUtPnZiLnZlcnRleF9idWZmZXIsIEk5MTVfR0VNX0RPTUFJTl9WRVJURVgsIDAsIDApOwoKICAgIGlmIChJU19JUk9OTEFLRShpOTY1LT5pbnRlbC5kZXZpY2VfaWQpKQogICAgICAgIE9VVF9SRUxPQyhjdHgsIHJlbmRlcl9zdGF0ZS0+dmIudmVydGV4X2J1ZmZlciwgSTkxNV9HRU1fRE9NQUlOX1ZFUlRFWCwgMCwgMTIgKiA0KTsKICAgIGVsc2UKICAgICAgICBPVVRfQkFUQ0goY3R4LCAzKTsKCiAgICBPVVRfQkFUQ0goY3R4LCAwKTsKCiAgICBPVVRfQkFUQ0goY3R4LCAKICAgICAgICAgICAgICBDTURfM0RQUklNSVRJVkUgfAogICAgICAgICAgICAgIF8zRFBSSU1JVElWRV9WRVJURVhfU0VRVUVOVElBTCB8CiAgICAgICAgICAgICAgKF8zRFBSSU1fUkVDVExJU1QgPDwgXzNEUFJJTUlUSVZFX1RPUE9MT0dZX1NISUZUKSB8CiAgICAgICAgICAgICAgKDAgPDwgOSkgfAogICAgICAgICAgICAgIDQpOwogICAgT1VUX0JBVENIKGN0eCwgMyk7IC8qIHZlcnRleCBjb3VudCBwZXIgaW5zdGFuY2UgKi8KICAgIE9VVF9CQVRDSChjdHgsIDApOyAvKiBzdGFydCB2ZXJ0ZXggb2Zmc2V0ICovCiAgICBPVVRfQkFUQ0goY3R4LCAxKTsgLyogc2luZ2xlIGluc3RhbmNlICovCiAgICBPVVRfQkFUQ0goY3R4LCAwKTsgLyogc3RhcnQgaW5zdGFuY2UgbG9jYXRpb24gKi8KICAgIE9VVF9CQVRDSChjdHgsIDApOyAvKiBpbmRleCBidWZmZXIgb2Zmc2V0LCBpZ25vcmVkICovCiAgICBBRFZBTkNFX0JBVENIKGN0eCk7Cn0KCnN0YXRpYyB2b2lkIAppOTY1X2NsZWFyX2Rlc3RfcmVnaW9uKFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsgIAogICAgc3RydWN0IGk5NjVfcmVuZGVyX3N0YXRlICpyZW5kZXJfc3RhdGUgPSAmaTk2NS0+cmVuZGVyX3N0YXRlOwogICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZGVzdF9yZWdpb24gPSByZW5kZXJfc3RhdGUtPmRyYXdfcmVnaW9uOwogICAgdW5zaWduZWQgaW50IGJsdF9jbWQsIGJyMTM7CiAgICBpbnQgcGl0Y2g7CgogICAgYmx0X2NtZCA9IFhZX0NPTE9SX0JMVF9DTUQ7CiAgICBicjEzID0gMHhmMCA8PCAxNjsKICAgIHBpdGNoID0gZGVzdF9yZWdpb24tPnBpdGNoOwoKICAgIGlmIChkZXN0X3JlZ2lvbi0+Y3BwID09IDQpIHsKICAgICAgICBicjEzIHw9IEJSMTNfODg4ODsKICAgICAgICBibHRfY21kIHw9IChYWV9DT0xPUl9CTFRfV1JJVEVfUkdCIHwgWFlfQ09MT1JfQkxUX1dSSVRFX0FMUEhBKTsKICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KGRlc3RfcmVnaW9uLT5jcHAgPT0gMik7CiAgICAgICAgYnIxMyB8PSBCUjEzXzU2NTsKICAgIH0KCiAgICBpZiAoZGVzdF9yZWdpb24tPnRpbGluZyAhPSBJOTE1X1RJTElOR19OT05FKSB7CiAgICAgICAgYmx0X2NtZCB8PSBYWV9DT0xPUl9CTFRfRFNUX1RJTEVEOwogICAgICAgIHBpdGNoIC89IDQ7CiAgICB9CgogICAgYnIxMyB8PSBwaXRjaDsKCiAgICBCRUdJTl9CQVRDSChjdHgsIDYpOwogICAgT1VUX0JBVENIKGN0eCwgYmx0X2NtZCk7CiAgICBPVVRfQkFUQ0goY3R4LCBicjEzKTsKICAgIE9VVF9CQVRDSChjdHgsIChkZXN0X3JlZ2lvbi0+eSA8PCAxNikgfCAoZGVzdF9yZWdpb24tPngpKTsKICAgIE9VVF9CQVRDSChjdHgsICgoZGVzdF9yZWdpb24tPnkgKyBkZXN0X3JlZ2lvbi0+aGVpZ2h0KSA8PCAxNikgfAogICAgICAgICAgICAgIChkZXN0X3JlZ2lvbi0+eCArIGRlc3RfcmVnaW9uLT53aWR0aCkpOwogICAgT1VUX1JFTE9DKGN0eCwgZGVzdF9yZWdpb24tPmJvLCAKICAgICAgICAgICAgICBJOTE1X0dFTV9ET01BSU5fUkVOREVSLCBJOTE1X0dFTV9ET01BSU5fUkVOREVSLAogICAgICAgICAgICAgIDApOwogICAgT1VUX0JBVENIKGN0eCwgMHgwKTsKICAgIEFEVkFOQ0VfQkFUQ0goY3R4KTsKfQoKc3RhdGljIHZvaWQKaTk2NV9zdXJmYWNlX3JlbmRlcl9waXBlbGluZV9zZXR1cChWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgaW50ZWxfYmF0Y2hidWZmZXJfc3RhcnRfYXRvbWljKGN0eCwgMHgxMDAwKTsKICAgIGludGVsX2JhdGNoYnVmZmVyX2VtaXRfbWlfZmx1c2goY3R4KTsKICAgIGk5NjVfY2xlYXJfZGVzdF9yZWdpb24oY3R4KTsKICAgIGk5NjVfcmVuZGVyX3BpcGVsaW5lX3NlbGVjdChjdHgpOwogICAgaTk2NV9yZW5kZXJfc3RhdGVfc2lwKGN0eCk7CiAgICBpOTY1X3JlbmRlcl9zdGF0ZV9iYXNlX2FkZHJlc3MoY3R4KTsKICAgIGk5NjVfcmVuZGVyX2JpbmRpbmdfdGFibGVfcG9pbnRlcnMoY3R4KTsKICAgIGk5NjVfcmVuZGVyX2NvbnN0YW50X2NvbG9yKGN0eCk7CiAgICBpOTY1X3JlbmRlcl9waXBlbGluZWRfcG9pbnRlcnMoY3R4KTsKICAgIGk5NjVfcmVuZGVyX3VyYl9sYXlvdXQoY3R4KTsKICAgIGk5NjVfcmVuZGVyX2NzX3VyYl9sYXlvdXQoY3R4KTsKICAgIGk5NjVfcmVuZGVyX2NvbnN0YW50X2J1ZmZlcihjdHgpOwogICAgaTk2NV9yZW5kZXJfZHJhd2luZ19yZWN0YW5nbGUoY3R4KTsKICAgIGk5NjVfcmVuZGVyX3ZlcnRleF9lbGVtZW50cyhjdHgpOwogICAgaTk2NV9yZW5kZXJfc3RhcnR1cChjdHgpOwogICAgaW50ZWxfYmF0Y2hidWZmZXJfZW5kX2F0b21pYyhjdHgpOwp9CgpzdGF0aWMgdm9pZAppOTY1X3N1YnBpY19yZW5kZXJfcGlwZWxpbmVfc2V0dXAoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIGludGVsX2JhdGNoYnVmZmVyX3N0YXJ0X2F0b21pYyhjdHgsIDB4MTAwMCk7CiAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9lbWl0X21pX2ZsdXNoKGN0eCk7CiAgICBpOTY1X3JlbmRlcl9waXBlbGluZV9zZWxlY3QoY3R4KTsKICAgIGk5NjVfcmVuZGVyX3N0YXRlX3NpcChjdHgpOwogICAgaTk2NV9yZW5kZXJfc3RhdGVfYmFzZV9hZGRyZXNzKGN0eCk7CiAgICBpOTY1X3JlbmRlcl9iaW5kaW5nX3RhYmxlX3BvaW50ZXJzKGN0eCk7CiAgICBpOTY1X3JlbmRlcl9jb25zdGFudF9jb2xvcihjdHgpOwogICAgaTk2NV9yZW5kZXJfcGlwZWxpbmVkX3BvaW50ZXJzKGN0eCk7CiAgICBpOTY1X3JlbmRlcl91cmJfbGF5b3V0KGN0eCk7CiAgICBpOTY1X3JlbmRlcl9jc191cmJfbGF5b3V0KGN0eCk7CiAgICBpOTY1X3JlbmRlcl9kcmF3aW5nX3JlY3RhbmdsZShjdHgpOwogICAgaTk2NV9yZW5kZXJfdmVydGV4X2VsZW1lbnRzKGN0eCk7CiAgICBpOTY1X3JlbmRlcl9zdGFydHVwKGN0eCk7CiAgICBpbnRlbF9iYXRjaGJ1ZmZlcl9lbmRfYXRvbWljKGN0eCk7Cn0KCgpzdGF0aWMgdm9pZCAKaTk2NV9yZW5kZXJfaW5pdGlhbGl6ZShWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CiAgICBpbnQgaTsKICAgIGRyaV9ibyAqYm87CgogICAgLyogVkVSVEVYIEJVRkZFUiAqLwogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+dmIudmVydGV4X2J1ZmZlcik7CiAgICBibyA9IGRyaV9ib19hbGxvYyhpOTY1LT5pbnRlbC5idWZtZ3IsCiAgICAgICAgICAgICAgICAgICAgICAidmVydGV4IGJ1ZmZlciIsCiAgICAgICAgICAgICAgICAgICAgICA0MDk2LAogICAgICAgICAgICAgICAgICAgICAgNDA5Nik7CiAgICBhc3NlcnQoYm8pOwogICAgcmVuZGVyX3N0YXRlLT52Yi52ZXJ0ZXhfYnVmZmVyID0gYm87CgogICAgLyogVlMgKi8KICAgIGRyaV9ib191bnJlZmVyZW5jZShyZW5kZXJfc3RhdGUtPnZzLnN0YXRlKTsKICAgIGJvID0gZHJpX2JvX2FsbG9jKGk5NjUtPmludGVsLmJ1Zm1nciwKICAgICAgICAgICAgICAgICAgICAgICJ2cyBzdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGk5NjVfdnNfdW5pdF9zdGF0ZSksCiAgICAgICAgICAgICAgICAgICAgICA2NCk7CiAgICBhc3NlcnQoYm8pOwogICAgcmVuZGVyX3N0YXRlLT52cy5zdGF0ZSA9IGJvOwoKICAgIC8qIEdTICovCiAgICAvKiBDTElQICovCiAgICAvKiBTRiAqLwogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+c2Yuc3RhdGUpOwogICAgYm8gPSBkcmlfYm9fYWxsb2MoaTk2NS0+aW50ZWwuYnVmbWdyLAogICAgICAgICAgICAgICAgICAgICAgInNmIHN0YXRlIiwKICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaTk2NV9zZl91bml0X3N0YXRlKSwKICAgICAgICAgICAgICAgICAgICAgIDY0KTsKICAgIGFzc2VydChibyk7CiAgICByZW5kZXJfc3RhdGUtPnNmLnN0YXRlID0gYm87CgogICAgLyogV00gKi8KICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUkVOREVSX1NVUkZBQ0VTOyBpKyspIHsKICAgICAgICBkcmlfYm9fdW5yZWZlcmVuY2UocmVuZGVyX3N0YXRlLT53bS5zdXJmYWNlW2ldKTsKICAgICAgICByZW5kZXJfc3RhdGUtPndtLnN1cmZhY2VbaV0gPSBOVUxMOwogICAgfQoKICAgIGRyaV9ib191bnJlZmVyZW5jZShyZW5kZXJfc3RhdGUtPndtLmJpbmRpbmdfdGFibGUpOwogICAgYm8gPSBkcmlfYm9fYWxsb2MoaTk2NS0+aW50ZWwuYnVmbWdyLAogICAgICAgICAgICAgICAgICAgICAgImJpbmRpbmcgdGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgTUFYX1JFTkRFUl9TVVJGQUNFUyAqIHNpemVvZih1bnNpZ25lZCBpbnQpLAogICAgICAgICAgICAgICAgICAgICAgNjQpOwogICAgYXNzZXJ0KGJvKTsKICAgIHJlbmRlcl9zdGF0ZS0+d20uYmluZGluZ190YWJsZSA9IGJvOwoKICAgIGRyaV9ib191bnJlZmVyZW5jZShyZW5kZXJfc3RhdGUtPndtLnNhbXBsZXIpOwogICAgYm8gPSBkcmlfYm9fYWxsb2MoaTk2NS0+aW50ZWwuYnVmbWdyLAogICAgICAgICAgICAgICAgICAgICAgInNhbXBsZXIgc3RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgTUFYX1NBTVBMRVJTICogc2l6ZW9mKHN0cnVjdCBpOTY1X3NhbXBsZXJfc3RhdGUpLAogICAgICAgICAgICAgICAgICAgICAgNjQpOwogICAgYXNzZXJ0KGJvKTsKICAgIHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlciA9IGJvOwogICAgcmVuZGVyX3N0YXRlLT53bS5zYW1wbGVyX2NvdW50ID0gMDsKCiAgICBkcmlfYm9fdW5yZWZlcmVuY2UocmVuZGVyX3N0YXRlLT53bS5zdGF0ZSk7CiAgICBibyA9IGRyaV9ib19hbGxvYyhpOTY1LT5pbnRlbC5idWZtZ3IsCiAgICAgICAgICAgICAgICAgICAgICAid20gc3RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpOTY1X3dtX3VuaXRfc3RhdGUpLAogICAgICAgICAgICAgICAgICAgICAgNjQpOwogICAgYXNzZXJ0KGJvKTsKICAgIHJlbmRlcl9zdGF0ZS0+d20uc3RhdGUgPSBibzsKCiAgICAvKiBDT0xPUiBDQUxDVUxBVE9SICovCiAgICBkcmlfYm9fdW5yZWZlcmVuY2UocmVuZGVyX3N0YXRlLT5jYy5zdGF0ZSk7CiAgICBibyA9IGRyaV9ib19hbGxvYyhpOTY1LT5pbnRlbC5idWZtZ3IsCiAgICAgICAgICAgICAgICAgICAgICAiY29sb3IgY2FsYyBzdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGk5NjVfY2NfdW5pdF9zdGF0ZSksCiAgICAgICAgICAgICAgICAgICAgICA2NCk7CiAgICBhc3NlcnQoYm8pOwogICAgcmVuZGVyX3N0YXRlLT5jYy5zdGF0ZSA9IGJvOwoKICAgIGRyaV9ib191bnJlZmVyZW5jZShyZW5kZXJfc3RhdGUtPmNjLnZpZXdwb3J0KTsKICAgIGJvID0gZHJpX2JvX2FsbG9jKGk5NjUtPmludGVsLmJ1Zm1nciwKICAgICAgICAgICAgICAgICAgICAgICJjYyB2aWV3cG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGk5NjVfY2Nfdmlld3BvcnQpLAogICAgICAgICAgICAgICAgICAgICAgNjQpOwogICAgYXNzZXJ0KGJvKTsKICAgIHJlbmRlcl9zdGF0ZS0+Y2Mudmlld3BvcnQgPSBibzsKfQoKdm9pZAppOTY1X3JlbmRlcl9wdXRfc3VyZmFjZShWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgVkFTdXJmYWNlSUQgc3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgc3JjeCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgc3JjeSwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc3JjdywKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc3JjaCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgZGVzdHgsCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGRlc3R5LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZXN0dywKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZGVzdGgpCnsKICAgIGk5NjVfcmVuZGVyX2luaXRpYWxpemUoY3R4KTsKICAgIGk5NjVfc3VyZmFjZV9yZW5kZXJfc3RhdGVfc2V0dXAoY3R4LCBzdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjeCwgc3JjeSwgc3Jjdywgc3JjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3R4LCBkZXN0eSwgZGVzdHcsIGRlc3RoKTsKICAgIGk5NjVfc3VyZmFjZV9yZW5kZXJfcGlwZWxpbmVfc2V0dXAoY3R4KTsKICAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGN0eCk7Cn0KCnZvaWQKaTk2NV9yZW5kZXJfcHV0X3N1YnBpYyhWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgVkFTdXJmYWNlSUQgc3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgc3JjeCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgc3JjeSwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc3JjdywKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc3JjaCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgZGVzdHgsCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGRlc3R5LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZXN0dywKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZGVzdGgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IG9iamVjdF9zdXJmYWNlICpvYmpfc3VyZmFjZSA9IFNVUkZBQ0Uoc3VyZmFjZSk7CiAgICBzdHJ1Y3Qgb2JqZWN0X3N1YnBpYyAqb2JqX3N1YnBpYyA9IFNVQlBJQyhvYmpfc3VyZmFjZS0+c3VicGljKTsKICAgIGFzc2VydChvYmpfc3VicGljKTsKCiAgICBpOTY1X3JlbmRlcl9pbml0aWFsaXplKGN0eCk7CiAgICBpOTY1X3N1YnBpY19yZW5kZXJfc3RhdGVfc2V0dXAoY3R4LCBzdXJmYWNlLAoJICAgIHNyY3gsIHNyY3ksIHNyY3csIHNyY2gsCgkgICAgZGVzdHgsIGRlc3R5LCBkZXN0dywgZGVzdGgpOwogICAgaTk2NV9zdWJwaWNfcmVuZGVyX3BpcGVsaW5lX3NldHVwKGN0eCk7CiAgICBpOTY1X3JlbmRlcl91cGxvYWRfaW1hZ2VfcGFsZXR0ZShjdHgsIG9ial9zdWJwaWMtPmltYWdlLCAweGZmKTsKICAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGN0eCk7Cn0KCgpCb29sIAppOTY1X3JlbmRlcl9pbml0KFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsKICAgIHN0cnVjdCBpOTY1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyX3N0YXRlID0gJmk5NjUtPnJlbmRlcl9zdGF0ZTsKICAgIGludCBpOwoKICAgIC8qIGtlcm5lbCAqLwogICAgYXNzZXJ0KE5VTV9SRU5ERVJfS0VSTkVMID09IChzaXplb2YocmVuZGVyX2tlcm5lbHNfZ2VuNSkgLyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJlbmRlcl9rZXJuZWxzX2dlbjVbMF0pKSk7CgogICAgaWYgKElTX0lST05MQUtFKGk5NjUtPmludGVsLmRldmljZV9pZCkpCiAgICAgICAgcmVuZGVyX2tlcm5lbHMgPSByZW5kZXJfa2VybmVsc19nZW41OwogICAgZWxzZQogICAgICAgIHJlbmRlcl9rZXJuZWxzID0gcmVuZGVyX2tlcm5lbHNfZ2VuNDsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JFTkRFUl9LRVJORUw7IGkrKykgewogICAgICAgIHN0cnVjdCByZW5kZXJfa2VybmVsICprZXJuZWwgPSAmcmVuZGVyX2tlcm5lbHNbaV07CiAgICAgICAga2VybmVsLT5ibyA9IGRyaV9ib19hbGxvYyhpOTY1LT5pbnRlbC5idWZtZ3IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsLT5uYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbC0+c2l6ZSwgMHgxMDAwKTsKICAgICAgICBhc3NlcnQoa2VybmVsLT5ibyk7CiAgICAgICAgZHJpX2JvX3N1YmRhdGEoa2VybmVsLT5ibywgMCwga2VybmVsLT5zaXplLCBrZXJuZWwtPmJpbik7CiAgICB9CgogICAgLyogY29uc3RhbnQgYnVmZmVyICovCiAgICByZW5kZXJfc3RhdGUtPmN1cmJlLmJvID0gZHJpX2JvX2FsbG9jKGk5NjUtPmludGVsLmJ1Zm1nciwKICAgICAgICAgICAgICAgICAgICAgICJjb25zdGFudCBidWZmZXIiLAogICAgICAgICAgICAgICAgICAgICAgNDA5NiwgNjQpOwogICAgYXNzZXJ0KHJlbmRlcl9zdGF0ZS0+Y3VyYmUuYm8pOwogICAgcmVuZGVyX3N0YXRlLT5jdXJiZS51cGxvYWQgPSAwOwoKICAgIHJldHVybiBUcnVlOwp9CgpCb29sIAppOTY1X3JlbmRlcl90ZXJtaW5hdGUoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIGludCBpOwogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CgogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+Y3VyYmUuYm8pOwogICAgcmVuZGVyX3N0YXRlLT5jdXJiZS5ibyA9IE5VTEw7CgogICAgZm9yIChpID0gMDsgaSA8IE5VTV9SRU5ERVJfS0VSTkVMOyBpKyspIHsKICAgICAgICBzdHJ1Y3QgcmVuZGVyX2tlcm5lbCAqa2VybmVsID0gJnJlbmRlcl9rZXJuZWxzW2ldOwogICAgICAgIAogICAgICAgIGRyaV9ib191bnJlZmVyZW5jZShrZXJuZWwtPmJvKTsKICAgICAgICBrZXJuZWwtPmJvID0gTlVMTDsKICAgIH0KCiAgICBkcmlfYm9fdW5yZWZlcmVuY2UocmVuZGVyX3N0YXRlLT52Yi52ZXJ0ZXhfYnVmZmVyKTsKICAgIHJlbmRlcl9zdGF0ZS0+dmIudmVydGV4X2J1ZmZlciA9IE5VTEw7CiAgICBkcmlfYm9fdW5yZWZlcmVuY2UocmVuZGVyX3N0YXRlLT52cy5zdGF0ZSk7CiAgICByZW5kZXJfc3RhdGUtPnZzLnN0YXRlID0gTlVMTDsKICAgIGRyaV9ib191bnJlZmVyZW5jZShyZW5kZXJfc3RhdGUtPnNmLnN0YXRlKTsKICAgIHJlbmRlcl9zdGF0ZS0+c2Yuc3RhdGUgPSBOVUxMOwogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+d20uYmluZGluZ190YWJsZSk7CiAgICByZW5kZXJfc3RhdGUtPndtLmJpbmRpbmdfdGFibGUgPSBOVUxMOwogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+d20uc2FtcGxlcik7CiAgICByZW5kZXJfc3RhdGUtPndtLnNhbXBsZXIgPSBOVUxMOwogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+d20uc3RhdGUpOwogICAgcmVuZGVyX3N0YXRlLT53bS5zdGF0ZSA9IE5VTEw7CgogICAgZm9yIChpID0gMDsgaSA8IE1BWF9SRU5ERVJfU1VSRkFDRVM7IGkrKykgewogICAgICAgIGRyaV9ib191bnJlZmVyZW5jZShyZW5kZXJfc3RhdGUtPndtLnN1cmZhY2VbaV0pOwogICAgICAgIHJlbmRlcl9zdGF0ZS0+d20uc3VyZmFjZVtpXSA9IE5VTEw7CiAgICB9CgogICAgZHJpX2JvX3VucmVmZXJlbmNlKHJlbmRlcl9zdGF0ZS0+Y2Mudmlld3BvcnQpOwogICAgcmVuZGVyX3N0YXRlLT5jYy52aWV3cG9ydCA9IE5VTEw7CiAgICBkcmlfYm9fdW5yZWZlcmVuY2UocmVuZGVyX3N0YXRlLT5jYy5zdGF0ZSk7CiAgICByZW5kZXJfc3RhdGUtPmNjLnN0YXRlID0gTlVMTDsKCiAgICBpZiAocmVuZGVyX3N0YXRlLT5kcmF3X3JlZ2lvbikgewogICAgICAgIGRyaV9ib191bnJlZmVyZW5jZShyZW5kZXJfc3RhdGUtPmRyYXdfcmVnaW9uLT5ibyk7CiAgICAgICAgZnJlZShyZW5kZXJfc3RhdGUtPmRyYXdfcmVnaW9uKTsKICAgICAgICByZW5kZXJfc3RhdGUtPmRyYXdfcmVnaW9uID0gTlVMTDsKICAgIH0KCiAgICByZXR1cm4gVHJ1ZTsKfQoK