ZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlyZ2VmYi5jIGIvZHJpdmVycy92aWRlby92aXJnZWZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3ODc0NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlyZ2VmYi5jCkBAIC0wLDAgKzEsMjUxMyBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvdmlkZW8vdmlyZ2VmYi5jIC0tIEN5YmVyVmlzaW9uNjQvM0QgZnJhbWUgYnVmZmVyIGRldmljZQorICoKKyAqICAgIENvcHlyaWdodCAoQykgMTk5NyBBbmRy6SBIZXluYXR6CisgKgorICoKKyAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgQ3liZXJWaXNpb24gZnJhbWUgYnVmZmVyIGRldmljZSAoY3liZXJmYi5jKToKKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgTWFydGluIEFwZWwKKyAqICAgICAgICAgICAgICAgICAgICAgICBHZWVydCBVeXR0ZXJob2V2ZW4KKyAqCisgKiBab3JybyBJSSBhZGRpdGlvbnMgOgorICoKKyAqICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAwIENocmlzdGlhbiBULiBTdGVpZ2llcworICoKKyAqIEluaXRpYWxpemF0aW9uIGFkZGl0aW9ucyA6CisgKgorICogICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgS2VuIFR5bGVyCisgKgorICogUGFydHMgb2YgdGhlIEluaXRpYWxpemF0aW9uIGNvZGUgYXJlIGJhc2VkIG9uIEN5YmVyZmIuYyBieSBBbGxhbiBCYWlyLAorICogYW5kIG9uIHRoZSBOZXRCU0QgQ3liZXJWaXNpb242NCBmcmFtZSBidWZmZXIgZHJpdmVyIGJ5IE1pY2hhZWwgVGVza2Ugd2hvIGdhdmUKKyAqIHBlcm1pc3Npb24gZm9yIGl0cyB1c2UuCisgKgorICogTWFueSB0aGFua3MgdG8gRnJhbmsgTWFyaWFrIGZvciBoaXMgYXNzaXN0YW5jZSB3aXRoIFpPUlJPIDIgYWNjZXNzIGFuZCBvdGhlcgorICogbXlzdGVyaWVzLgorICoKKyAqCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyN1bmRlZiBWSVJHRUZCREVCVUcKKyN1bmRlZiBWSVJHRUZCRFVNUAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8dmlkZW8vZmJjb24uaD4KKyNpbmNsdWRlIDx2aWRlby9mYmNvbi1jZmI4Lmg+CisjaW5jbHVkZSA8dmlkZW8vZmJjb24tY2ZiMTYuaD4KKyNpbmNsdWRlIDx2aWRlby9mYmNvbi1jZmIzMi5oPgorCisjaW5jbHVkZSAidmlyZ2VmYi5oIgorCisjaWZkZWYgVklSR0VGQkRFQlVHCisjZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIFZJUkdFRkJEVU1QCitzdGF0aWMgdm9pZCBjdjY0X2R1bXAodm9pZCk7CisjZGVmaW5lIERVTVAgY3Y2NF9kdW1wKCkKKyNlbHNlCisjZGVmaW5lIERVTVAKKyNlbmRpZgorCisvKgorICoJTWFjcm9zIGZvciByZWdpc3RlciBhY2Nlc3MgYW5kIHpvcnJvIGNvbnRyb2wKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbWJfaW5saW5lKHZvaWQpIHsgbWIoKTsgfQkvKiBmb3IgdXNlIGluIGNvbW1hIGV4cHJlc3Npb25zICovCisKKy8qIFNldCB6b3JybyAyIG1hcCAqLworCisjZGVmaW5lIFNlbGVjdElPIFwKKwltYigpOyBcCisJaWYgKG9uX3pvcnJvMikgeyBcCisJCSgqKHZvbGF0aWxlIHUxNiAqKSgodTggKikodmNvZGVfc3dpdGNoX2Jhc2UgKyAweDA0KSkgPSAweDAxKTsgXAorCQltYigpOyBcCisJfQorCisjZGVmaW5lCVNlbGVjdE1NSU8gXAorCW1iKCk7IFwKKwlpZiAob25fem9ycm8yKSB7IFwKKwkJKCoodm9sYXRpbGUgdTE2ICopKCh1OCAqKSh2Y29kZV9zd2l0Y2hfYmFzZSArIDB4MDQpKSA9IDB4MDIpOyBcCisJCW1iKCk7IFwKKwl9CisKKyNkZWZpbmUJU2VsZWN0Q0ZHIFwKKwltYigpOyBcCisJaWYgKG9uX3pvcnJvMikgeyBcCisJCSgqKHZvbGF0aWxlIHUxNiAqKSgodTggKikodmNvZGVfc3dpdGNoX2Jhc2UgKyAweDA0KSkgPSAweDAzKTsgXAorCQltYigpOyBcCisJfQorCisvKiBTZXQgcGFzcyB0aHJvdWdoLCAwID0gYW1pZ2EsICE9MCA9IGN2NjQvM2QgKi8KKworI2RlZmluZSBTZXRWU3dpdGNoKHgpIFwKKwltYigpOyBcCisJKCoodm9sYXRpbGUgdTE2ICopKCh1OCAqKSh2Y29kZV9zd2l0Y2hfYmFzZSkpID0gXAorCSh1MTYpKHggPyAwIDogMSkpOyBcCisJbWIoKTsKKworLyogWm9ycm8yIGVuZGlhbiAnYXBlcnR1cmUnICovCisKKyNkZWZpbmUgRU5ESUFOX0JZVEUJMgorI2RlZmluZSBFTkRJQU5fV09SRAkxCisjZGVmaW5lIEVORElBTl9MT05HCTAKKworI2RlZmluZSBTZWxlY3RfWm9ycm8yX0ZyYW1lQnVmZmVyKHgpIFwKKwlkbyB7IFwKKwkJaWYgKG9uX3pvcnJvMikgeyBcCisJCQltYigpOyBcCisJCQkoKih2b2xhdGlsZSB1MTYgKikoKHU4ICopKHZjb2RlX3N3aXRjaF9iYXNlICsgMHgwOCkpID0gXAorCQkJKHggKiAweDQwKSk7IFwKKwkJCW1iKCk7IFwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworLyogU2V0UG9ydFZhbCAtIG9ubHkgdXNlZCBmb3IgaW50ZXJydXB0IGVuYWJsZSAobm90IHlldCBpbXBsZW1lbnRlZCkgKi8KKworI2lmIDAKKyNkZWZpbmUgU2V0UG9ydFZhbCh4KSBcCisJbWIoKTsgXAorCSgqKHZvbGF0aWxlIHUxNiAqKSgodTggKikodmNvZGVfc3dpdGNoX2Jhc2UgKyAweDBjKSkgPSBcCisJKHUxNil4KTsgXAorCW1iKCk7CisjZW5kaWYKKworLyogSU8gYWNjZXNzICovCisKKyNkZWZpbmUgYnl0ZV9hY2Nlc3NfaW8oeCkJKCgoeCkgJiAweDNmZmMpIHwgKCgoeCkgJiAzKV4zKSB8ICgoKHgpICYgMykgPDwxNCkpCisjZGVmaW5lIGJ5dGVfYWNjZXNzX21taW8oeCkJKCgoeCkgJiAweGZmZmMpIHwgKCgoeCkgJiAzKV4zKSkKKworLyogV3JpdGUgOCBiaXQgVkdBIHJlZ2lzdGVyIC0gdXNlZCBvbmNlIGZvciBjaGlwIHdha2V1cCAqLworCisjZGVmaW5lIHdiX3ZnYWlvKHJlZywgZGF0KSBcCisJU2VsZWN0SU87IFwKKwkoKih2b2xhdGlsZSB1OCAqKSh2Z2Fpb19yZWdzICsgKCh1MzIpYnl0ZV9hY2Nlc3NfaW8ocmVnKSAmIDB4ZmZmZikpID0gXAorCShkYXQgJiAweGZmKSk7IFwKKwlTZWxlY3RNTUlPOworCisvKiBSZWFkIDggYml0IFZHQSByZWdpc3RlciAtIG9ubHkgdXNlZCBpbiBkdW1wIChTZWxlY3RJTyBub3QgbmVlZGVkIG9uIHJlYWQgPykgKi8KKworI2lmZGVmIFZJUkdFRkJEVU1QCisjZGVmaW5lIHJiX3ZnYWlvKHJlZykgXAorCSh7IFwKKwl1OCBfX3p6eXp4OyBcCisJU2VsZWN0SU87IFwKKwlfX3p6eXp4ID0gKCoodm9sYXRpbGUgdTggKikoKHZnYWlvX3JlZ3MpKyh1MzIpYnl0ZV9hY2Nlc3NfaW8ocmVnKSkpOyBcCisJU2VsZWN0TU1JTzsgXAorCV9fenp5eng7IFwKKwl9KQorI2VuZGlmCisKKy8qIE1NSU8gYWNjZXNzICovCisKKy8qIFJlYWQgOCBiaXQgTU1JTyByZWdpc3RlciAqLworCisjZGVmaW5lIHJiX21taW8ocmVnKSBcCisJKG1iX2lubGluZSgpLCBcCisJKCoodm9sYXRpbGUgdTggKikobW1pb19yZWdzICsgMHg4MDAwICsgKHUzMilieXRlX2FjY2Vzc19tbWlvKHJlZykpKSkKKworLyogV3JpdGUgOCBiaXQgTU1JTyByZWdpc3RlciAqLworCisjZGVmaW5lIHdiX21taW8ocmVnLGRhdCkgXAorCW1iKCk7IFwKKwkoKih2b2xhdGlsZSB1OCAqKShtbWlvX3JlZ3MgKyAweDgwMDAgKyAoYnl0ZV9hY2Nlc3NfbW1pbygocmVnKSAmIDB4ZmZmZikpKSA9IFwKKwkoZGF0ICYgMHhmZikpOyBcCisJbWIoKTsKKworLyogUmVhZCAzMiBiaXQgTU1JTyByZWdpc3RlciAqLworCisjZGVmaW5lIHJsX21taW8ocmVnKSBcCisJKG1iX2lubGluZSgpLCBcCisJKCooKHZvbGF0aWxlIHUzMiAqKSgodTggKikoKG1taW9fcmVncyArIChvbl96b3JybzIgPyAweDIwMDAwIDogMCkpICsgKHJlZykpKSkpKQorCisvKiBXcml0ZSAzMiBiaXQgTU1JTyByZWdpc3RlciAqLworCisjZGVmaW5lIHdsX21taW8ocmVnLGRhdCkgXAorCW1iKCk7IFwKKwkoKCoodm9sYXRpbGUgdTMyICopKCh1OCAqKSgobW1pb19yZWdzICsgKG9uX3pvcnJvMiA/IDB4MjAwMDAgOiAwKSkgKyAocmVnKSkpKSA9IFwKKwkodTMyKShkYXQpKTsgXAorCW1iKCk7CisKKy8qIFdyaXRlIHRvIHZpcmdlIGdyYXBoaWNzIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgd2dmeChyZWcsIGRhdCkJZG8geyB3Yl9tbWlvKEdDVF9BRERSRVNTLCAocmVnKSk7IHdiX21taW8oR0NUX0FERFJFU1NfVywgKGRhdCkpOyB9IHdoaWxlICgwKQorCisvKiBXcml0ZSB0byB2aXJnZSBzZXF1ZW5jZXIgcmVnaXN0ZXIgKi8KKworI2RlZmluZSB3c2VxKHJlZywgZGF0KQlkbyB7IHdiX21taW8oU0VRX0FERFJFU1MsIChyZWcpKTsgd2JfbW1pbyhTRVFfQUREUkVTU19XLCAoZGF0KSk7IH0gd2hpbGUgKDApCisKKy8qIFdyaXRlIHRvIHZpcmdlIENSVCBjb250cm9sbGVyIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgd2NydChyZWcsIGRhdCkJZG8geyB3Yl9tbWlvKENSVF9BRERSRVNTLCAocmVnKSk7IHdiX21taW8oQ1JUX0FERFJFU1NfVywgKGRhdCkpOyB9IHdoaWxlICgwKQorCisvKiBXcml0ZSB0byB2aXJnZSBhdHRyaWJ1dGUgcmVnaXN0ZXIgKi8KKworI2RlZmluZSB3YXRyKHJlZywgZGF0KSBcCisJZG8geyBcCisJCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgd2F0cl90bXA7IFwKKwkJd2F0cl90bXAgPSByYl9tbWlvKEFDVF9BRERSRVNTX1JFU0VUKTsgXAorCQl3Yl9tbWlvKEFDVF9BRERSRVNTX1csIChyZWcpKTsgXAorCQl3Yl9tbWlvKEFDVF9BRERSRVNTX1csIChkYXQpKTsgXAorCQl1ZGVsYXkoMTApOyBcCisJfSB3aGlsZSAoMCkKKworLyogZW5kIG9mIG1hY3JvcyAqLworCitzdHJ1Y3QgdmlyZ2VmYl9wYXIgeworICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsKKyAgIF9fdTMyIHR5cGU7CisgICBfX3UzMiB0eXBlX2F1eDsKKyAgIF9fdTMyIHZpc3VhbDsKKyAgIF9fdTMyIGxpbmVfbGVuZ3RoOworfTsKKworc3RhdGljIHN0cnVjdCB2aXJnZWZiX3BhciBjdXJyZW50X3BhcjsKKworc3RhdGljIGludCBjdXJyZW50X3Bhcl92YWxpZCA9IDA7CisKK3N0YXRpYyBzdHJ1Y3QgZGlzcGxheSBkaXNwOworc3RhdGljIHN0cnVjdCBmYl9pbmZvIGZiX2luZm87CisKK3N0YXRpYyB1bmlvbiB7CisjaWZkZWYgRkJDT05fSEFTX0NGQjE2CisgICAgdTE2IGNmYjE2WzE2XTsKKyNlbmRpZgorI2lmZGVmIEZCQ09OX0hBU19DRkIzMgorICAgIHUzMiBjZmIzMlsxNl07CisjZW5kaWYKK30gZmJjb25fY21hcDsKKworLyoKKyAqICAgIFN3aXRjaCBmb3IgQ2hpcHNldCBJbmRlcGVuZGVuY3kKKyAqLworCitzdGF0aWMgc3RydWN0IGZiX2h3c3dpdGNoIHsKKworICAgLyogSW5pdGlhbGlzYXRpb24gKi8KKworICAgaW50ICgqaW5pdCkodm9pZCk7CisKKyAgIC8qIERpc3BsYXkgQ29udHJvbCAqLworCisgICBpbnQgKCplbmNvZGVfZml4KShzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCwgc3RydWN0IHZpcmdlZmJfcGFyICpwYXIpOworICAgaW50ICgqZGVjb2RlX3Zhcikoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCB2aXJnZWZiX3BhciAqcGFyKTsKKyAgIGludCAoKmVuY29kZV92YXIpKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgdmlyZ2VmYl9wYXIgKnBhcik7CisgICBpbnQgKCpnZXRjb2xyZWcpKHVfaW50IHJlZ25vLCB1X2ludCAqcmVkLCB1X2ludCAqZ3JlZW4sIHVfaW50ICpibHVlLAorICAgICAgICAgICAgICAgICAgICB1X2ludCAqdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CisgICB2b2lkICgqYmxhbmspKGludCBibGFuayk7Cit9ICpmYmh3OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBibGl0X21heWJlX2J1c3kgPSAwOworCisvKgorICogICAgRnJhbWUgQnVmZmVyIE5hbWUKKyAqLworCitzdGF0aWMgY2hhciB2aXJnZWZiX25hbWVbMTZdID0gIkN5YmVyVmlzaW9uLzNEIjsKKworLyoKKyAqICAgIEN5YmVyVmlzaW9uNjQvM2QgR3JhcGhpY3MgQm9hcmQKKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciB2aXJnZWZiX2NvbG91cl90YWJsZSBbMjU2XVszXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHZfcmFtOworc3RhdGljIHVuc2lnbmVkIGxvbmcgdl9yYW1fc2l6ZTsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICptbWlvX3JlZ3M7CitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqdmdhaW9fcmVnczsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdl9yYW1fcGh5czsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1taW9fcmVnc19waHlzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgdmNvZGVfc3dpdGNoX2Jhc2U7CitzdGF0aWMgdW5zaWduZWQgY2hhciBvbl96b3JybzI7CisKKy8qCisgKiBPZmZzZXRzIGZyb20gc3RhcnQgb2YgdmlkZW8gcmFtIHRvIGFwcHJvcHJpYXRlIFpJSUkgYXBlcnR1cmUKKyAqLworCisjaWZkZWYgRkJDT05fSEFTX0NGQjgKKyNkZWZpbmUgQ1lCTUVNX09GRlNFVF84ICAweDgwMDAwMAkvKiBCR1JYICovCisjZW5kaWYKKyNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKKyNkZWZpbmUgQ1lCTUVNX09GRlNFVF8xNiAweDQwMDAwMAkvKiBHQlhSICovCisjZW5kaWYKKyNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKKyNkZWZpbmUgQ1lCTUVNX09GRlNFVF8zMiAweDAwMDAwMAkvKiBYUkdCICovCisjZW5kaWYKKworLyoKKyAqICAgIE1FTUNMT0NLIHdhcyAzMk1IeiwgNjRNSHogd29ya3MsIDcyTUh6IGRvZXNuJ3QgKG9uIG15IGJvYXJkKQorICovCisKKyNkZWZpbmUgTUVNQ0xPQ0sgNTAwMDAwMDAKKworLyoKKyAqICAgIFByZWRlZmluZWQgVmlkZW8gTW9kZXMKKyAqLworCitzdGF0aWMgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7Cit9IHZpcmdlZmJfcHJlZGVmaW5lZFtdIF9faW5pdGRhdGEgPSB7CisjaWZkZWYgRkJDT05fSEFTX0NGQjgKKyAgICB7CisJIjY0MHg0ODAtOCIsIHsJCS8qIEN5YmVydmlzaW9uIDggYnBwICovCisJICAgIDY0MCwgNDgwLCA2NDAsIDQ4MCwgMCwgMCwgOCwgMCwKKwkgICAgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAzMTI1MCwgMTYwLCAxMzYsIDgyLCA2MSwgODgsIDIsCisJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKwkgICAgfQorICAgIH0sIHsKKwkiNzY4eDU3Ni04IiwgewkJLyogQ3liZXJ2aXNpb24gOCBicHAgKi8KKwkgICAgNzY4LCA1NzYsIDc2OCwgNTc2LCAwLCAwLCA4LCAwLAorCSAgICB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgMCwgMH0sCisJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDI5NDExLCAxNDQsIDExMiwgMzIsIDE1LCA2NCwgMiwKKwkgICAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCSAgICB9CisgICAgfSwgeworCSI4MDB4NjAwLTgiLCB7CQkvKiBDeWJlcnZpc2lvbiA4IGJwcCAqLworCSAgICA4MDAsIDYwMCwgODAwLCA2MDAsIDAsIDAsIDgsIDAsCisJICAgIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCAwLCAwfSwKKwkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMjg1NzEsIDE2OCwgMTA0LCAyMiwgMSwgNDgsIDIsCisJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKwkgICAgfQorICAgIH0sIHsKKyAgI2lmIDAgCisJIjEwMjR4NzY4LTgiLCB7CQkvKiBDeWJlcnZpc2lvbiA4IGJwcCAqLworCSAgICAxMDI0LCA3NjgsIDEwMjQsIDc2OCwgMCwgMCwgOCwgMCwKKwkgICAgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAyMDgzMywgMjcyLCAxNjgsIDM5LCAyLCA3MiwgMSwKKwkgICAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCSAgICB9CisgICNlbHNlCisJIjEwMjR4NzY4LTgiLCB7CisJICAgIDEwMjQsIDc2OCwgMTAyNCwgNzY4LCAwLCAwLCA4LCAwLAorCSAgICB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgMCwgMH0sCisgICAjaWYgMAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxMjUwMCwgMTg0LCA0MCwgNDAsIDIsIDk2LCAxLAorCSAgICBGQl9TWU5DX0NPTVBfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJICAgIH0KKyAgICAjZWxzZQorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxMjY5OSwgMTc2LCAxNiwgMjgsIDEsIDk2LCAzLAorCSAgICBGQl9TWU5DX0NPTVBfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJICAgIH0KKyAgICAjZW5kaWYKKyAgI2VuZGlmCisgICAgfSwgeworCSIxMTUyeDg4Ni04IiwgewkJLyogQ3liZXJ2aXNpb24gOCBicHAgKi8KKwkgICAgMTE1MiwgODg2LCAxMTUyLCA4ODYsIDAsIDAsIDgsIDAsCisJICAgIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCAwLCAwfSwKKwkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMTkyMzAsIDI4MCwgMTY4LCA0NSwgMSwgNjQsIDEwLAorCSAgICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJICAgIH0KKyAgICB9LCB7CisJIjEyODB4MTAyNC04IiwgeyAJLyogQ3liZXJ2aXNpb24gOCBicHAgKi8KKwkgICAgMTI4MCwgMTAyNCwgMTI4MCwgMTAyNCwgMCwgMCwgOCwgMCwKKwkgICAgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDAsIDB9LAorICAjaWYgMAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxNzg1NywgMjMyLCAyMzIsIDcxLCAxNSwgMTc2LCAxMiwKKwkgICAgfQorICAjZWxzZQorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCA3NDE0LCAyMzIsIDY0LCAzOCwgMSwgMTEyLCAzLAorCSAgICBGQl9TWU5DX0NPTVBfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJICAgIH0KKyAgI2VuZGlmCisgICAgfSwgeworCSIxNjAweDEyMDAtOCIsIHsgCS8qIEN5YmVydmlzaW9uIDggYnBwICovCisJICAgIDE2MDAsIDEyMDAsIDE2MDAsIDEyMDAsIDAsIDAsIDgsIDAsCisJICAgIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCAwLCAwfSwKKyAgI2lmIDAKKwkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMTM2OTgsIDMzNiwgMjI0LCA3NywgMTUsIDE3NiwgMTIsCisJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKwkgICAgfQorICAjZWxzZQorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCA2NDExLCAyNTYsIDMyLCA1MiwgMTAsIDE2MCwgOCwKKwkgICAgRkJfU1lOQ19DT01QX0hJR0hfQUNUfEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCSAgICB9CisgICNlbmRpZgorICAgIH0sCisjZW5kaWYKKworI2lmZGVmIEZCQ09OX0hBU19DRkIxNgorICAgIHsKKwkiNjQweDQ4MC0xNiIsIHsJCS8qIEN5YmVydmlzaW9uIDE2IGJwcCAqLworCSAgICA2NDAsIDQ4MCwgNjQwLCA0ODAsIDAsIDAsIDE2LCAwLAorCSAgICB7MTEsIDUsIDB9LCB7NSwgNiwgMH0sIHswLCA1LCAwfSwgezAsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAzMTI1MCwgMTUyLCAxNDQsIDgyLCA2MSwgODgsIDIsCisJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKwkgICAgfQorICAgIH0sIHsKKwkiNzY4eDU3Ni0xNiIsIHsJCS8qIEN5YmVydmlzaW9uIDE2IGJwcCAqLworCSAgICA3NjgsIDU3NiwgNzY4LCA1NzYsIDAsIDAsIDE2LCAwLAorCSAgICB7MTEsIDUsIDB9LCB7NSwgNiwgMH0sIHswLCA1LCAwfSwgezAsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAyOTQxMSwgMTQ0LCAxMTIsIDMyLCAxNSwgNjQsIDIsCisJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKwkgICAgfQorICAgIH0sIHsKKwkiODAweDYwMC0xNiIsIHsJCS8qIEN5YmVydmlzaW9uIDE2IGJwcCAqLworCSAgICA4MDAsIDYwMCwgODAwLCA2MDAsIDAsIDAsIDE2LCAwLAorCSAgICB7MTEsIDUsIDB9LCB7NSwgNiwgMH0sIHswLCA1LCAwfSwgezAsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAyODU3MSwgMTY4LCAxMDQsIDIyLCAxLCA0OCwgMiwKKwkgICAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCSAgICB9CisgICAgfSwgeworI2lmIDAKKwkiMTAyNHg3NjgtMTYiLCB7IAkvKiBDeWJlcnZpc2lvbiAxNiBicHAgKi8KKwkgICAgMTAyNCwgNzY4LCAxMDI0LCA3NjgsIDAsIDAsIDE2LCAwLAorCSAgICB7MTEsIDUsIDB9LCB7NSwgNiwgMH0sIHswLCA1LCAwfSwgezAsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAyMDgzMywgMjcyLCAxNjgsIDM5LCAyLCA3MiwgMSwKKwkgICAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCSAgICB9CisjZWxzZQorICAgICAgICAgIjEwMjR4NzY4LTE2IiwgeworICAgICAgICAgICAgIDEwMjQsIDc2OCwgMTAyNCwgNzY4LCAwLCAwLCAxNiwgMCwKKyAgICAgICAgICAgICB7MTEsIDUsIDB9LCB7NSwgNiwgMH0sIHswLCA1LCAwfSwgezAsIDAsIDB9LAorICAgICAgICAgICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDEyNTAwLCAxODQsIDQwLCA0MCwgMiwgOTYsIDEsCisgICAgICAgICAgICAgRkJfU1lOQ19DT01QX0hJR0hfQUNUfEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgICAgICAgfQorI2VuZGlmCisgICAgfSwgeworCSIxMTUyeDg4Ni0xNiIsIHsgCS8qIEN5YmVydmlzaW9uIDE2IGJwcCAqLworCSAgICAxMTUyLCA4ODYsIDExNTIsIDg4NiwgMCwgMCwgMTYsIDAsCisJICAgIHsxMSwgNSwgMH0sIHs1LCA2LCAwfSwgezAsIDUsIDB9LCB7MCwgMCwgMH0sCisJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDE5MjMwLCAyODAsIDE2OCwgNDUsIDEsIDY0LCAxMCwKKwkgICAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCSAgICB9CisgICAgfSwgeworCSIxMjgweDEwMjQtMTYiLCB7IAkvKiBDeWJlcnZpc2lvbiAxNiBicHAgKi8KKwkgICAgMTI4MCwgMTAyNCwgMTI4MCwgMTAyNCwgMCwgMCwgMTYsIDAsCisJICAgIHsxMSwgNSwgMH0sIHs1LCA2LCAwfSwgezAsIDUsIDB9LCB7MCwgMCwgMH0sCisJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDE3ODU3LCAyMzIsIDIzMiwgNzEsIDE1LCAxNzYsIDEyLAorCSAgICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJICAgIH0KKyAgICB9LCB7CisJIjE2MDB4MTIwMC0xNiIsIHsgCS8qIEN5YmVydmlzaW9uIDE2IGJwcCAqLworCSAgICAxNjAwLCAxMjAwLCAxNjAwLCAxMjAwLCAwLCAwLCAxNiwgMCwKKwkgICAgezExLCA1LCAwfSwgezUsIDYsIDB9LCB7MCwgNSwgMH0sIHswLCAwLCAwfSwKKwkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMTM2OTgsIDMzNiwgMjI0LCA3NywgMTUsIDE3NiwgMTIsCisJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKwkgICAgfQorICAgIH0sCisjZW5kaWYKKworI2lmZGVmIEZCQ09OX0hBU19DRkIzMgorICAgIHsKKwkiNjQweDQ4MC0zMiIsIHsJCS8qIEN5YmVydmlzaW9uIDMyIGJwcCAqLworCSAgICA2NDAsIDQ4MCwgNjQwLCA0ODAsIDAsIDAsIDMyLCAwLAorCSAgICB7MTYsIDgsIDB9LCB7OCwgOCwgMH0sIHswLCA4LCAwfSwgezI0LCAwLCAwfSwKKwkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMzEyNTAsIDE2MCwgMTM2LCA4MiwgNjEsIDg4LCAyLAorCSAgICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJICAgIH0KKyAgICAgfSwgeworCSI3Njh4NTc2LTMyIiwgewkJLyogQ3liZXJ2aXNpb24gMzIgYnBwICovCisJICAgIDc2OCwgNTc2LCA3NjgsIDU3NiwgMCwgMCwgMzIsIDAsCisJICAgIHsxNiwgOCwgMH0sIHs4LCA4LCAwfSwgezAsIDgsIDB9LCB7MjQsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAyOTQxMSwgMTQ0LCAxMTIsIDMyLCAxNSwgNjQsIDIsCisJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKwkgICAgfQorICAgICB9LCB7CisJIjgwMHg2MDAtMzIiLCB7CQkvKiBDeWJlcnZpc2lvbiAzMiBicHAgKi8KKwkgICAgODAwLCA2MDAsIDgwMCwgNjAwLCAwLCAwLCAzMiwgMCwKKwkgICAgezE2LCA4LCAwfSwgezgsIDgsIDB9LCB7MCwgOCwgMH0sIHsyNCwgMCwgMH0sCisgIAkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMjg1NzEsIDE2OCwgMTA0LCAyMiwgMSwgNDgsIDIsCisJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKwkgICAgfQorICAgICB9LCB7CisJIjEwMjR4NzY4LTMyIiwgewkvKiBDeWJlcnZpc2lvbiAzMiBicHAgKi8KKwkgICAgMTAyNCwgNzY4LCAxMDI0LCA3NjgsIDAsIDAsIDMyLCAwLAorCSAgICB7MTYsIDgsIDB9LCB7OCwgOCwgMH0sIHswLCA4LCAwfSwgezI0LCAwLCAwfSwKKwkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMjA4MzMsIDI3MiwgMTY4LCAzOSwgMiwgNzIsIDEsCisJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKwkgICAgfQorICAgIH0sIHsKKwkiMTE1Mng4ODYtMzIiLCB7CS8qIEN5YmVydmlzaW9uIDMyIGJwcCAqLworCSAgICAxMTUyLCA4ODYsIDExNTIsIDg4NiwgMCwgMCwgMzIsIDAsCisJICAgIHsxNiwgOCwgMH0sIHs4LCA4LCAwfSwgezAsIDgsIDB9LCB7MjQsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxOTIzMCwgMjgwLCAxNjgsIDQ1LCAxLCA2NCwgMTAsCisJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKwkgICAgfQorICAgIH0sIHsKKwkiMTI4MHgxMDI0LTMyIiwgewkvKiBDeWJlcnZpc2lvbiAzMiBicHAgKi8KKwkgICAgMTI4MCwgMTAyNCwgMTI4MCwgMTAyNCwgMCwgMCwgMzIsIDAsCisJICAgIHsxNiwgOCwgMH0sIHs4LCA4LCAwfSwgezAsIDgsIDB9LCB7MjQsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxNzg1NywgMjMyLCAyMzIsIDcxLCAxNSwgMTc2LCAxMiwKKwkgICAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCSAgICB9CisgICAgfSwgeworCSIxNjAweDEyMDAtMzIiLCB7CS8qIEN5YmVydmlzaW9uIDMyIGJwcCAqLworCSAgICAxNjAwLCAxMjAwLCAxNjAwLCAxMjAwLCAwLCAwLCAzMiwgMCwKKwkgICAgezE2LCA4LCAwfSwgezgsIDgsIDB9LCB7MCwgOCwgMH0sIHsyNCwgMCwgMH0sCisJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDEzNjk4LCAzMzYsIDIyNCwgNzcsIDE1LCAxNzYsIDEyLAorCSAgICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJICAgIH0KKyAgICB9LAorI2VuZGlmCisKKy8qIGludGVybGFjZWQgbW9kZXMgKi8KKworI2lmZGVmIEZCQ09OX0hBU19DRkI4CisgICAgeworCSIxMDI0eDc2OC04aSIsIHsJLyogQ3liZXJ2aXNpb24gOCBicHAgKi8KKwkgICAgMTAyNCwgNzY4LCAxMDI0LCA3NjgsIDAsIDAsIDgsIDAsCisJICAgIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCAwLCAwfSwKKwkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMjA4MzMsIDI3MiwgMTY4LCAzOSwgMiwgNzIsIDEsCisJICAgIDAsIEZCX1ZNT0RFX0lOVEVSTEFDRUQKKwkgICAgfQorICAgIH0sIHsKKwkiMTI4MHgxMDI0LThpIiwgewkvKiBDeWJlcnZpc2lvbiA4IGJwcCAqLworCSAgICAxMjgwLCAxMDI0LCAxMjgwLCAxMDI0LCAwLCAwLCA4LCAwLAorCSAgICB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgMCwgMH0sCisJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDE3ODU3LCAyMzIsIDIzMiwgNzEsIDE1LCAxNzYsIDEyLAorCSAgICAwLCBGQl9WTU9ERV9JTlRFUkxBQ0VECisJICAgIH0KKyAgICB9LCB7CisJIjE2MDB4MTIwMC04aSIsIHsJLyogQ3liZXJ2aXNpb24gOCBicHAgKi8KKwkgICAgMTYwMCwgMTIwMCwgMTYwMCwgMTIwMCwgMCwgMCwgOCwgMCwKKwkgICAgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxMzY5OCwgMzM2LCAyMjQsIDc3LCAxNSwgMTc2LCAxMiwKKwkgICAgMCwgRkJfVk1PREVfSU5URVJMQUNFRAorCSAgICB9CisgICAgfSwKKyNlbmRpZgorCisjaWZkZWYgRkJDT05fSEFTX0NGQjE2CisgICAgeworCSIxMDI0eDc2OC0xNmkiLCB7CS8qIEN5YmVydmlzaW9uIDE2IGJwcCAqLworCSAgICAxMDI0LCA3NjgsIDEwMjQsIDc2OCwgMCwgMCwgMTYsIDAsCisJICAgIHsxMSwgNSwgMH0sIHs1LCA2LCAwfSwgezAsIDUsIDB9LCB7MCwgMCwgMH0sCisJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDIwODMzLCAyNzIsIDE2OCwgMzksIDIsIDcyLCAxLAorCSAgICAwLCBGQl9WTU9ERV9JTlRFUkxBQ0VECisJICAgIH0KKyAgICB9LCB7CisJIjEyODB4MTAyNC0xNmkiLCB7CS8qIEN5YmVydmlzaW9uIDE2IGJwcCAqLworCSAgICAxMjgwLCAxMDI0LCAxMjgwLCAxMDI0LCAwLCAwLCAxNiwgMCwKKwkgICAgezExLCA1LCAwfSwgezUsIDYsIDB9LCB7MCwgNSwgMH0sIHswLCAwLCAwfSwKKwkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMTc4NTcsIDIzMiwgMjMyLCA3MSwgMTUsIDE3NiwgMTIsCisJICAgIDAsIEZCX1ZNT0RFX0lOVEVSTEFDRUQKKwkgICAgfQorICAgIH0sIHsKKwkiMTYwMHgxMjAwLTE2aSIsIHsJLyogQ3liZXJ2aXNpb24gMTYgYnBwICovCisJICAgIDE2MDAsIDEyMDAsIDE2MDAsIDEyMDAsIDAsIDAsIDE2LCAwLAorCSAgICB7MTEsIDUsIDB9LCB7NSwgNiwgMH0sIHswLCA1LCAwfSwgezAsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxMzY5OCwgMzM2LCAyMjQsIDc3LCAxNSwgMTc2LCAxMiwKKwkgICAgMCwgRkJfVk1PREVfSU5URVJMQUNFRAorCSAgICB9CisgICAgfSwKKyNlbmRpZgorCisjaWZkZWYgRkJDT05fSEFTX0NGQjMyCisgICAgeworCSIxMDI0eDc2OC0zMmkiLCB7CS8qIEN5YmVydmlzaW9uIDMyIGJwcCAqLworCSAgICAxMDI0LCA3NjgsIDEwMjQsIDc2OCwgMCwgMCwgMzIsIDAsCisJICAgIHsxNiwgOCwgMH0sIHs4LCA4LCAwfSwgezAsIDgsIDB9LCB7MjQsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAyMjIyMiwgMjE2LCAxNDQsIDM5LCAyLCA3MiwgMSwKKwkgICAgMCwgRkJfVk1PREVfSU5URVJMQUNFRAorCSAgICB9CisgICAgfSwgeworCSIxMjgweDEwMjQtMzJpIiwgewkvKiBDeWJlcnZpc2lvbiAzMiBicHAgKi8KKwkgICAgMTI4MCwgMTAyNCwgMTI4MCwgMTAyNCwgMCwgMCwgMzIsIDAsCisJICAgIHsxNiwgOCwgMH0sIHs4LCA4LCAwfSwgezAsIDgsIDB9LCB7MjMsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxNzg1NywgMjMyLCAyMzIsIDcxLCAxNSwgMTc2LCAxMiwKKwkgICAgMCwgRkJfVk1PREVfSU5URVJMQUNFRAorCSAgICB9CisgICAgfSwgeworCSIxNjAweDEyMDAtMzJpIiwgewkvKiBDeWJlcnZpc2lvbiAzMiBicHAgKi8KKwkgICAgMTYwMCwgMTIwMCwgMTYwMCwgMTIwMCwgMCwgMCwgMzIsIDAsCisJICAgIHsxNiwgOCwgMH0sIHs4LCA4LCAwfSwgezAsIDgsIDB9LCB7MjQsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxMzY5OCwgMzM2LCAyMjQsIDc3LCAxNSwgMTc2LCAxMiwKKwkgICAgMCwgRkJfVk1PREVfSU5URVJMQUNFRAorCSAgICB9CisgICAgfSwKKyNlbmRpZgorCisvKiBkb3VibGVzY2FuIG1vZGVzICovCisKKyNpZmRlZiBGQkNPTl9IQVNfQ0ZCOAorICAgIHsKKwkiMzIweDI0MC04ZCIsIHsJCS8qIEN5YmVydmlzaW9uIDggYnBwICovCisJICAgIDMyMCwgMjQwLCAzMjAsIDI0MCwgMCwgMCwgOCwgMCwKKwkgICAgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCA1OTI1OSwgODAsIDgwLCA0NSwgMjYsIDMyLCAxLAorCSAgICAwLCBGQl9WTU9ERV9ET1VCTEUKKwkgICAgfQorICAgIH0sCisjZW5kaWYKKworI2lmZGVmIEZCQ09OX0hBU19DRkIxNgorICAgIHsKKwkiMzIweDI0MC0xNmQiLCB7CS8qIEN5YmVydmlzaW9uIDE2IGJwcCAqLworCSAgICAzMjAsIDI0MCwgMzIwLCAyNDAsIDAsIDAsIDE2LCAwLAorCSAgICB7MTEsIDUsIDB9LCB7NSwgNiwgMH0sIHswLCA1LCAwfSwgezAsIDAsIDB9LAorCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCA1OTI1OSwgODAsIDgwLCA0NSwgMjYsIDMyLCAxLAorCSAgICAwLCBGQl9WTU9ERV9ET1VCTEUKKwkgICAgfQorICAgIH0sCisjZW5kaWYKKworI2lmZGVmIEZCQ09OX0hBU19DRkIzMgorICAgIHsKKwkiMzIweDI0MC0zMmQiLCB7CS8qIEN5YmVydmlzaW9uIDMyIGJwcCAqLworCSAgICAzMjAsIDI0MCwgMzIwLCAyNDAsIDAsIDAsIDMyLCAwLAorCSAgICB7MTYsIDgsIDB9LCB7OCwgOCwgMH0sIHswLCA4LCAwfSwgezI0LCAwLCAwfSwKKwkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgNTkyNTksIDgwLCA4MCwgNDUsIDI2LCAzMiwgMSwKKwkgICAgMCwgRkJfVk1PREVfRE9VQkxFCisJICAgIH0KKyAgICB9LAorI2VuZGlmCit9OworCisjZGVmaW5lIGFycmF5c2l6ZSh4KQkoc2l6ZW9mKHgpL3NpemVvZigqKHgpKSkKKyNkZWZpbmUgTlVNX1RPVEFMX01PREVTCWFycmF5c2l6ZSh2aXJnZWZiX3ByZWRlZmluZWQpCisKKy8qCisgKiAgICBEZWZhdWx0IHRvIDgwMHg2MDAgZm9yIHZpZGVvPXZpcmdlODosIHZpcmdlMTY6IG9yIHZpcmdlMzI6CisgKi8KKworI2lmZGVmIEZCQ09OX0hBU19DRkI4CisjZGVmaW5lIFZJUkdFOF9ERUZNT0RFCSgyKQorI2VuZGlmCisKKyNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKKyNkZWZpbmUgVklSR0UxNl9ERUZNT0RFCSg5KQorI2VuZGlmCisKKyNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKKyNkZWZpbmUgVklSR0UzMl9ERUZNT0RFCSgxNikKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZpcmdlZmJfZGVmYXVsdDsKK3N0YXRpYyBpbnQgdmlyZ2VmYl9pbnZlcnNlID0gMDsKKworLyoKKyAqICAgIEludGVyZmFjZSB1c2VkIGJ5IHRoZSB3b3JsZAorICovCisKK2ludCB2aXJnZWZiX3NldHVwKGNoYXIqKTsKK3N0YXRpYyBpbnQgdmlyZ2VmYl9nZXRfZml4KHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4LCBpbnQgY29uLAorCQkJICAgc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIGludCB2aXJnZWZiX2dldF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCBjb24sCisJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IHZpcmdlZmJfc2V0X3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50IGNvbiwKKwkJCSAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgdmlyZ2VmYl9nZXRfY21hcChzdHJ1Y3QgZmJfY21hcCAqY21hcCwgaW50IGtzcGMsIGludCBjb24sCisJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IHZpcmdlZmJfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLCB1X2ludCBibHVlLAorCQkJICAgICB1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgdmlyZ2VmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKKworLyoKKyAqICAgIEludGVyZmFjZSB0byB0aGUgbG93IGxldmVsIGNvbnNvbGUgZHJpdmVyCisgKi8KKworaW50IHZpcmdlZmJfaW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQgdmlyZ2VmYl9zd2l0Y2goaW50IGNvbiwgc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIGludCB2aXJnZWZiX3VwZGF0ZXZhcihpbnQgY29uLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CisKKy8qCisgKiAgICBUZXh0IGNvbnNvbGUgYWNjZWxlcmF0aW9uCisgKi8KKworI2lmZGVmIEZCQ09OX0hBU19DRkI4CitzdGF0aWMgc3RydWN0IGRpc3BsYXlfc3dpdGNoIGZiY29uX3ZpcmdlODsKKyNlbmRpZgorCisjaWZkZWYgRkJDT05fSEFTX0NGQjE2CitzdGF0aWMgc3RydWN0IGRpc3BsYXlfc3dpdGNoIGZiY29uX3ZpcmdlMTY7CisjZW5kaWYKKworI2lmZGVmIEZCQ09OX0hBU19DRkIzMgorc3RhdGljIHN0cnVjdCBkaXNwbGF5X3N3aXRjaCBmYmNvbl92aXJnZTMyOworI2VuZGlmCisKKy8qCisgKiAgIEhhcmR3YXJlIFNwZWNpZmljIFJvdXRpbmVzCisgKi8KKworc3RhdGljIGludCB2aXJnZV9pbml0KHZvaWQpOworc3RhdGljIGludCB2aXJnZWZiX2VuY29kZV9maXgoc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgsCisJCQkJc3RydWN0IHZpcmdlZmJfcGFyICpwYXIpOworc3RhdGljIGludCB2aXJnZWZiX2RlY29kZV92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkJc3RydWN0IHZpcmdlZmJfcGFyICpwYXIpOworc3RhdGljIGludCB2aXJnZWZiX2VuY29kZV92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkJc3RydWN0IHZpcmdlZmJfcGFyICpwYXIpOworc3RhdGljIGludCB2aXJnZWZiX2dldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgKnJlZCwgdV9pbnQgKmdyZWVuLCB1X2ludCAqYmx1ZSwKKwkJCQl1X2ludCAqdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZCB2aXJnZWZiX2dmeF9vbl9vZmYoaW50IGJsYW5rKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB2aXJnZWZiX3dhaXRfZm9yX2lkbGUodm9pZCk7CitzdGF0aWMgdm9pZCB2aXJnZWZiX0JpdEJMVCh1X3Nob3J0IGN1cngsIHVfc2hvcnQgY3VyeSwgdV9zaG9ydCBkZXN0eCwgdV9zaG9ydCBkZXN0eSwKKwkJdV9zaG9ydCB3aWR0aCwgdV9zaG9ydCBoZWlnaHQsIHVfc2hvcnQgc3RyaWRlLCB1X3Nob3J0IGRlcHRoKTsKK3N0YXRpYyB2b2lkIHZpcmdlZmJfUmVjdEZpbGwodV9zaG9ydCB4LCB1X3Nob3J0IHksIHVfc2hvcnQgd2lkdGgsIHVfc2hvcnQgaGVpZ2h0LAorCQl1X3Nob3J0IGNvbG9yLCB1X3Nob3J0IHN0cmlkZSwgdV9zaG9ydCBkZXB0aCk7CisKKy8qCisgKiAgICBJbnRlcm5hbCByb3V0aW5lcworICovCisKK3N0YXRpYyB2b2lkIHZpcmdlZmJfZ2V0X3BhcihzdHJ1Y3QgdmlyZ2VmYl9wYXIgKnBhcik7CitzdGF0aWMgdm9pZCB2aXJnZWZiX3NldF9wYXIoc3RydWN0IHZpcmdlZmJfcGFyICpwYXIpOworc3RhdGljIGludCB2aXJnZWZiX2RvX2ZiX3NldF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCBpc2FjdGl2ZSk7CitzdGF0aWMgdm9pZCB2aXJnZWZiX3NldF9kaXNwKGludCBjb24sIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgdmlyZ2VmYl9nZXRfdmlkZW9fbW9kZShjb25zdCBjaGFyICpuYW1lKTsKK3N0YXRpYyB2b2lkIHZpcmdlZmJfc2V0X3ZpZGVvKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKTsKKworLyoKKyAqICAgIEFkZGl0aW9ucyBmb3IgSW5pdGlhbGl6YXRpb24KKyAqLworCitzdGF0aWMgdm9pZCB2aXJnZWZiX2xvYWRfdmlkZW9fbW9kZShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZpZGVvX21vZGUpOworc3RhdGljIGludCBjdjNkX2hhc180bWIodm9pZCk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdmlyZ2VmYl9jb21wdXRlX2Nsb2NrKHVuc2lnbmVkIGxvbmcgZnJlcSk7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmF0dHIoc2hvcnQpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJzZXEoc2hvcnQpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJjcnQoc2hvcnQpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJnZngoc2hvcnQpOworc3RhdGljIGlubGluZSB2b2lkIGdmeF9vbl9vZmYoaW50IHRvZ2dsZSk7CitzdGF0aWMgdm9pZCB2aXJnZWZiX3BjaV9pbml0KHZvaWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBIYXJkd2FyZSBzcGVjaWZpYyByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKglGdW5jdGlvbnMgZm9yIHJlZ2lzdGVyIGFjY2VzcworICovCisKKy8qIFJlYWQgYXR0cmlidXRlIGNvbnRyb2xsZXIgcmVnaXN0ZXIgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJhdHRyKHNob3J0IGlkeCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHJhdHRyX3RtcDsKKworCXJhdHRyX3RtcCA9IHJiX21taW8oQUNUX0FERFJFU1NfUkVTRVQpOworCXdiX21taW8oQUNUX0FERFJFU1NfVywgaWR4KTsKKwlyZXR1cm4gKHJiX21taW8oQUNUX0FERFJFU1NfUikpOworfQorCisvKiBSZWFkIHNlcXVlbmNlciByZWdpc3RlciAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcnNlcShzaG9ydCBpZHgpCit7CisJd2JfbW1pbyhTRVFfQUREUkVTUywgaWR4KTsKKwlyZXR1cm4gKHJiX21taW8oU0VRX0FERFJFU1NfUikpOworfQorCisvKiBSZWFkIENSVCBjb250cm9sbGVyIHJlZ2lzdGVyICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByY3J0KHNob3J0IGlkeCkKK3sKKwl3Yl9tbWlvKENSVF9BRERSRVNTLCBpZHgpOworCXJldHVybiAocmJfbW1pbyhDUlRfQUREUkVTU19SKSk7Cit9CisKKy8qIFJlYWQgZ3JhcGhpY3MgY29udHJvbGxlciByZWdpc3RlciAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmdmeChzaG9ydCBpZHgpCit7CisJd2JfbW1pbyhHQ1RfQUREUkVTUywgaWR4KTsKKwlyZXR1cm4gKHJiX21taW8oR0NUX0FERFJFU1NfUikpOworfQorCisKKy8qCisgKglJbml0aWFsaXphdGlvbgorICovCisKKy8qIFBDSSBpbml0ICovCisKK3ZvaWQgdmlyZ2VmYl9wY2lfaW5pdCh2b2lkKSB7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisKKwlTZWxlY3RDRkc7CisKKwlpZiAob25fem9ycm8yKSB7CisJCSooKHNob3J0ICopKHZnYWlvX3JlZ3MgKyAweDAwMDAwMDEwKSkgPSAwOworCQkqKChsb25nICAqKSh2Z2Fpb19yZWdzICsgMHgwMDAwMDAwNCkpID0gMHgwMjAwMDAwMzsKKwl9IGVsc2UgeworCQkqKChzaG9ydCAqKSh2Z2Fpb19yZWdzICsgMHgwMDBlMDAxMCkpID0gMDsKKwkJKigobG9uZyAgKikodmdhaW9fcmVncyArIDB4MDAwZTAwMDQpKSA9IDB4MDIwMDAwMDM7CisJfQorCisJLyogU2VsZWN0SU8gaXMgaW4gd2JfdmdhaW8gbWFjcm8gKi8KKwl3Yl92Z2FpbyhTUkVHX1ZJREVPX1NVQlNfRU5BQkxFLCAweDAxKTsKKwkvKiBTZWxlY3RNTUlPIGlzIGluIHdiX3ZnYWlvIG1hY3JvICovCisKKwlEUFJJTlRLKCJFWElUXG4iKTsKKworCXJldHVybjsKK30KKworLyogCisgKiBJbml0YWxpemUgYWxsIG1vZGUgaW5kZXBlbmRlbnQgcmVncywgZmluZCBtZW0gc2l6ZSBhbmQgY2xlYXIgbWVtCisqLworCitzdGF0aWMgaW50IHZpcmdlX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKworCXZpcmdlZmJfcGNpX2luaXQoKTsKKworCXdiX21taW8oR1JFR19NSVNDX09VVFBVVF9XLCAweDA3KTsJLyogY29sb3VyLCByYW0gZW5hYmxlLCBjbGsgc2VsICovCisKKwl3c2VxKFNFUV9JRF9VTkxPQ0tfRVhULCAweDA2KTsJCS8qIHVubG9jayBleHRlbnNpb25zICovCisJdG1wID0gcmJfbW1pbyhHUkVHX01JU0NfT1VUUFVUX1IpOworCXdjcnQoQ1JUX0lEX1JFR0lTVEVSX0xPQ0tfMSwgMHg0OCk7CS8qIHVubG9jayBDUjJEIHRvIENSM0YgKi8KKworCXdjcnQoQ1JUX0lEX0JBQ0tXQURfQ09NUF8xLCAweDAwKTsJLyogaXJxIGRpc2FibGUgKi8KKworCXdjcnQoQ1JUX0lEX1JFR0lTVEVSX0xPQ0tfMiwgMHhhNSk7CS8qIHVubG9jayBDUjQwIHRvIENSRkYgYW5kIG1vcmUgKi8KKwl3Y3J0KENSVF9JRF9SRUdJU1RFUl9MT0NLLDB4MDApOwkvKiB1bmxvY2sgaCBhbmQgdiB0aW1pbmcgKi8KKwl3Y3J0KENSVF9JRF9TWVNURU1fQ09ORklHLCAweDAxKTsJLyogdW5sb2NrIGVuaGFuY2VkIHByb2dyYW1taW5nIHJlZ2lzdGVycyAqLworCisJd2JfbW1pbyhHUkVHX0ZFQVRVUkVfQ09OVFJPTF9XLCAweDAwKTsKKworCXdjcnQoQ1JUX0lEX0VYVF9NSVNDX0NOVEwsIDB4MDApOwkvKiBiMiA9IDAgdG8gYWxsb3cgVkRBQyBtbWlvIGFjY2VzcyAqLworI2lmIDAKKwkvKiB3cml0ZSBzdHJhcCBvcHRpb25zIC4uLiA/ICovCisJd2NydChDUlRfSURfQ09ORklHXzEsIDB4MDgpOworCXdjcnQoQ1JUX0lEX0NPTkZJR18yLCAweGZmKTsJCS8qIDB4MHgyIGJpdCBuZWVkcyB0byBiZSBzZXQgPz8gKi8KKwl3Y3J0KENSVF9JRF9DT05GSUdfMywgMHgwZik7CisJd2NydChDUlRfSURfQ09ORklHXzQsIDB4MWEpOworI2VuZGlmCisJd2NydChDUlRfSURfRVhUX01JU0NfQ05UTF8xLCAweDgyKTsJIC8qIFBDSSBERSBhbmQgc29mdHdhcmUgcmVzZXQgUzNEIGVuZ2luZSAqLworCS8qIEVYVF9NSVNDX0NOVExfMSwgQ1I2NiBiaXQgMCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgYml0IDAgTVJfQURWQU5DRURfRlVOQ1RJT05fQ09OVFJPTCAtIGNoZWNrICovCisJd2xfbW1pbyhNUl9BRFZBTkNFRF9GVU5DVElPTl9DT05UUk9MLCAweDAwMDAwMDExKTsgLyogZW5oYW5jZWQgbW9kZSwgbGluZWFyIGFkZHJlc3NpbmcgKi8KKworLyogY3J0YyByZWdpc3RlcnMgKi8KKworCXdjcnQoQ1JUX0lEX1BSRVNFVF9ST1dfU0NBTiwgMHgwMCk7CisKKwkvKiBEaXNhYmxlIGgvdyBjdXJzb3IgKi8KKworCXdjcnQoQ1JUX0lEX0NVUlNPUl9TVEFSVCwgMHgwMCk7CisJd2NydChDUlRfSURfQ1VSU09SX0VORCwgMHgwMCk7CisJd2NydChDUlRfSURfU1RBUlRfQUREUl9ISUdILCAweDAwKTsKKwl3Y3J0KENSVF9JRF9TVEFSVF9BRERSX0xPVywgMHgwMCk7CisJd2NydChDUlRfSURfQ1VSU09SX0xPQ19ISUdILCAweDAwKTsKKwl3Y3J0KENSVF9JRF9DVVJTT1JfTE9DX0xPVywgMHgwMCk7CisJd2NydChDUlRfSURfRVhUX01PREUsIDB4MDApOworCXdjcnQoQ1JUX0lEX0hXR0NfTU9ERSwgMHgwMCk7CisJd2NydChDUlRfSURfSFdHQ19PUklHSU5fWF9ISSwgMHgwMCk7CisJd2NydChDUlRfSURfSFdHQ19PUklHSU5fWF9MTywgMHgwMCk7CisJd2NydChDUlRfSURfSFdHQ19PUklHSU5fWV9ISSwgMHgwMCk7CisJd2NydChDUlRfSURfSFdHQ19PUklHSU5fWV9MTywgMHgwMCk7CisJaSA9IHJjcnQoQ1JUX0lEX0hXR0NfTU9ERSk7CisJd2NydChDUlRfSURfSFdHQ19GR19TVEFDSywgMHgwMCk7CisJd2NydChDUlRfSURfSFdHQ19GR19TVEFDSywgMHgwMCk7CisJd2NydChDUlRfSURfSFdHQ19GR19TVEFDSywgMHgwMCk7CisJd2NydChDUlRfSURfSFdHQ19CR19TVEFDSywgMHgwMCk7CisJd2NydChDUlRfSURfSFdHQ19CR19TVEFDSywgMHgwMCk7CisJd2NydChDUlRfSURfSFdHQ19CR19TVEFDSywgMHgwMCk7CisJd2NydChDUlRfSURfSFdHQ19TVEFSVF9BRF9ISSwgMHgwMCk7CisJd2NydChDUlRfSURfSFdHQ19TVEFSVF9BRF9MTywgMHgwMCk7CisJd2NydChDUlRfSURfSFdHQ19EU1RBUlRfWCwgMHgwMCk7CisJd2NydChDUlRfSURfSFdHQ19EU1RBUlRfWSwgMHgwMCk7CisKKwl3Y3J0KENSVF9JRF9VTkRFUkxJTkVfTE9DLCAweDAwKTsKKworCXdjcnQoQ1JUX0lEX01PREVfQ09OVFJPTCwgMHhlMyk7CisJd2NydChDUlRfSURfQkFDS1dBRF9DT01QXzIsIDB4MjIpOwkvKiBibGFuayBiZHIgYml0IDUgYmxhbmtpbmcgb25seSBvbiA4IGJpdCAqLworCisJd2NydChDUlRfSURfRVhfU1lOQ18xLCAweDAwKTsKKworCS8qIG1lbW9yeSAqLworCisJd2NydChDUlRfSURfRVhUX1NZU19DTlRMXzMsIDB4MDApOworCXdjcnQoQ1JUX0lEX01FTU9SWV9DT05GLCAweDA4KTsJCS8qIGNvbmZpZyBlbmhhbmNlZCBtYXAgKi8KKwl3Y3J0KENSVF9JRF9FWFRfTUVNX0NOVExfMSwgMHgwOCk7CS8qIE1NSU8gU2VsZWN0ICgweDBjIHdvcmtzIGFzIHdlbGwpKi8KKwl3Y3J0KENSVF9JRF9FWFRfTUVNX0NOVExfMiwgMHgwMik7CS8qIHdoeSAwMiBiaWcgZW5kaWFuIDAwIHdvcmtzID8gKi8KKwl3Y3J0KENSVF9JRF9FWFRfTUVNX0NOVExfNCwgMHg5Zik7CS8qIGNvbmZpZyBiaWcgZW5kaWFuIC0gMHgwMCA/ICAqLworCXdjcnQoQ1JUX0lEX0xBV19QT1NfSEksIDB4MDApOworCXdjcnQoQ1JUX0lEX0xBV19QT1NfTE8sIDB4MDApOworCXdjcnQoQ1JUX0lEX0VYVF9NSVNDX0NOVExfMSwgMHg4MSk7CisJd2NydChDUlRfSURfTUlTQ18xLCAweDkwKTsJCS8qIG11c3QgZm9sbG93IENSVF9JRF9FWFRfTUlTQ19DTlRMXzEgKi8KKwl3Y3J0KENSVF9JRF9MQVdfQ05UTCwgMHgxMyk7CQkvKiBmb3JjZSA0IE1lZyBmb3IgdGVzdCAqLworCWlmIChjdjNkX2hhc180bWIoKSkgeworCQl2X3JhbV9zaXplID0gMHgwMDQwMDAwMDsKKwkJd2NydChDUlRfSURfTEFXX0NOVEwsIDB4MTMpOwkvKiA0IE1CICovCisJfSBlbHNlIHsKKwkJdl9yYW1fc2l6ZSA9IDB4MDAyMDAwMDA7CisJCXdjcnQoQ1JUX0lEX0xBV19DTlRMLCAweDEyKTsgCS8qIDIgTUIgKi8KKwl9CisKKwlpZiAob25fem9ycm8yKQorCQl2X3JhbV9zaXplIC09IDB4NjAwMDA7CQkvKiB3ZSBuZWVkIHNvbWUgc3BhY2UgZm9yIHRoZSByZWdpc3RlcnMgKi8KKworCXdjcnQoQ1JUX0lEX0VYVF9TWVNfQ05UTF80LCAweDAwKTsKKwl3Y3J0KENSVF9JRF9FWFRfREFDX0NOVEwsIDB4MDApOwkvKiAweDEwIGZvciBYMTEgY3Vyc29yIG1vZGUgKi8KKworLyogc2VxdWVuY2VyIHJlZ2lzdGVycyAqLworCisJd3NlcShTRVFfSURfQ0xPQ0tJTkdfTU9ERSwgMHgwMSk7CS8qIDggZG90IGNsb2NrICovCisJd3NlcShTRVFfSURfTUFQX01BU0ssIDB4ZmYpOworCXdzZXEoU0VRX0lEX0NIQVJfTUFQX1NFTEVDVCwgMHgwMCk7CisJd3NlcShTRVFfSURfTUVNT1JZX01PREUsIDB4MDIpOworCXdzZXEoU0VRX0lEX1JBTURBQ19DTlRMLCAweDAwKTsKKwl3c2VxKFNFUV9JRF9TSUdOQUxfU0VMRUNULCAweDAwKTsKKwl3c2VxKFNFUV9JRF9FWFRfU0VRX1JFRzksIDB4MDApOwkvKiBNTUlPIGFuZCBQSU8gcmVnIGFjY2VzcyBlbmFibGVkICovCisJd3NlcShTRVFfSURfRVhUX01JU0NfU0VRLCAweDAwKTsKKwl3c2VxKFNFUV9JRF9DTEtTWU5fQ05UTF8xLCAweDAwKTsKKwl3c2VxKFNFUV9JRF9FWFRfU0VRLCAweDAwKTsKKworLyogZ3JhcGhpYyByZWdpc3RlcnMgKi8KKworCXdnZngoR0NUX0lEX1NFVF9SRVNFVCwgMHgwMCk7CisJd2dmeChHQ1RfSURfRU5BQkxFX1NFVF9SRVNFVCwgMHgwMCk7CisJd2dmeChHQ1RfSURfQ09MT1JfQ09NUEFSRSwgMHgwMCk7CisJd2dmeChHQ1RfSURfREFUQV9ST1RBVEUsIDB4MDApOworCXdnZngoR0NUX0lEX1JFQURfTUFQX1NFTEVDVCwgMHgwMCk7CisJd2dmeChHQ1RfSURfR1JBUEhJQ1NfTU9ERSwgMHg0MCk7CisJd2dmeChHQ1RfSURfTUlTQywgMHgwMSk7CisJd2dmeChHQ1RfSURfQ09MT1JfWENBUkUsIDB4MGYpOworCXdnZngoR0NUX0lEX0JJVE1BU0ssIDB4ZmYpOworCisvKiBhdHRyaWJ1dGUgIHJlZ2lzdGVycyAqLworCisJZm9yKGkgPSAwOyBpIDw9IDE1OyBpKyspCisJCXdhdHIoQUNUX0lEX1BBTEVUVEUwICsgaSwgaSk7CisJd2F0cihBQ1RfSURfQVRUUl9NT0RFX0NOVEwsIDB4NDEpOworCXdhdHIoQUNUX0lEX09WRVJTQ0FOX0NPTE9SLCAweGZmKTsKKwl3YXRyKEFDVF9JRF9DT0xPUl9QTEFORV9FTkEsIDB4MGYpOworCXdhdHIoQUNUX0lEX0hPUl9QRUxfUEFOTklORywgMHgwMCk7CisJd2F0cihBQ1RfSURfQ09MT1JfU0VMRUNULCAweDAwKTsKKworCXdiX21taW8oVkRBQ19NQVNLLCAweGZmKTsKKworLyogaW5pdCBsb2NhbCBjbWFwIGFzIGdyZXlzY2FsZSBsZXZlbHMgKi8KKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQl2aXJnZWZiX2NvbG91cl90YWJsZSBbaV1bMF0gPSBpOworCQl2aXJnZWZiX2NvbG91cl90YWJsZSBbaV1bMV0gPSBpOworCQl2aXJnZWZiX2NvbG91cl90YWJsZSBbaV1bMl0gPSBpOworCX0KKworLyogY2xlYXIgZnJhbWVidWZmZXIgbWVtb3J5ICovCisKKwltZW1zZXQoKGNoYXIqKXZfcmFtLCAweDAwLCB2X3JhbV9zaXplKTsKKworCURQUklOVEsoIkVYSVRcbiIpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaWxsIGluIHRoZSBgZml4JyBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlCisgKiAgICB2YWx1ZXMgaW4gdGhlIGBwYXInIHN0cnVjdHVyZS4KKyAqLworCitzdGF0aWMgaW50IHZpcmdlZmJfZW5jb2RlX2ZpeChzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCwKKwkJCSAgICBzdHJ1Y3QgdmlyZ2VmYl9wYXIgKnBhcikKK3sKKwlEUFJJTlRLKCJFTlRFUiBzZXQgdmlkZW8gcGh5cyBhZGRyXG4iKTsKKworCW1lbXNldChmaXgsIDAsIHNpemVvZihzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8pKTsKKwlzdHJjcHkoZml4LT5pZCwgdmlyZ2VmYl9uYW1lKTsKKwlpZiAob25fem9ycm8yKQorCQlmaXgtPnNtZW1fc3RhcnQgPSB2X3JhbV9waHlzOworCXN3aXRjaCAocGFyLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKyNpZmRlZiBGQkNPTl9IQVNfQ0ZCOAorCQljYXNlIDg6CisJCQlpZiAob25fem9ycm8yKQorCQkJCVNlbGVjdF9ab3JybzJfRnJhbWVCdWZmZXIoRU5ESUFOX0JZVEUpOworCQkJZWxzZQorCQkJCWZpeC0+c21lbV9zdGFydCA9ICh2X3JhbV9waHlzICsgQ1lCTUVNX09GRlNFVF84KTsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgRkJDT05fSEFTX0NGQjE2CisJCWNhc2UgMTY6CisJCQlpZiAob25fem9ycm8yKQorCQkJCVNlbGVjdF9ab3JybzJfRnJhbWVCdWZmZXIoRU5ESUFOX1dPUkQpOworCQkJZWxzZQorCQkJCWZpeC0+c21lbV9zdGFydCA9ICh2X3JhbV9waHlzICsgQ1lCTUVNX09GRlNFVF8xNik7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIEZCQ09OX0hBU19DRkIzMgorCQljYXNlIDMyOgorCQkJaWYgKG9uX3pvcnJvMikKKwkJCQlTZWxlY3RfWm9ycm8yX0ZyYW1lQnVmZmVyKEVORElBTl9MT05HKTsKKwkJCWVsc2UKKwkJCQlmaXgtPnNtZW1fc3RhcnQgPSAodl9yYW1fcGh5cyArIENZQk1FTV9PRkZTRVRfMzIpOworCQkJYnJlYWs7CisjZW5kaWYKKwl9CisKKwlmaXgtPnNtZW1fbGVuID0gdl9yYW1fc2l6ZTsKKwlmaXgtPm1taW9fc3RhcnQgPSBtbWlvX3JlZ3NfcGh5czsKKwlmaXgtPm1taW9fbGVuID0gMHgxMDAwMDsgLyogVE9ETzogdmVyaWZ5IHRoaXMgZm9yIHRoZSBDVjY0LzNEICovCisKKwlmaXgtPnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CisJZml4LT50eXBlX2F1eCA9IDA7CisJaWYgKHBhci0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDgpCisJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOworCWVsc2UKKwkJZml4LT52aXN1YWwgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOworCisJZml4LT54cGFuc3RlcCA9IDA7CisJZml4LT55cGFuc3RlcCA9IDA7CisJZml4LT55d3JhcHN0ZXAgPSAwOworCWZpeC0+bGluZV9sZW5ndGggPSBwYXItPnZhci54cmVzX3ZpcnR1YWwqcGFyLT52YXIuYml0c19wZXJfcGl4ZWwvODsKKwlmaXgtPmFjY2VsID0gRkJfQUNDRUxfUzNfVklSR0U7CisJRFBSSU5USygiRVhJVCB2X3JhbV9waHlzID0gMHglOC44bHhcbiIsICh1bnNpZ25lZCBsb25nKWZpeC0+c21lbV9zdGFydCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCUZpbGwgdGhlIGBwYXInIHN0cnVjdHVyZSBiYXNlZCBvbiB0aGUgdmFsdWVzIGluIGB2YXInLgorICoJVE9ETzogVmVyaWZ5IGFuZCBhZGp1c3QgdmFsdWVzLCByZXR1cm4gLUVJTlZBTCBpZiBiYWQuCisgKi8KKworc3RhdGljIGludCB2aXJnZWZiX2RlY29kZV92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICAgc3RydWN0IHZpcmdlZmJfcGFyICpwYXIpCit7CisJRFBSSU5USygiRU5URVJcbiIpOworCXBhci0+dmFyLnhyZXMgPSB2YXItPnhyZXM7CisJcGFyLT52YXIueXJlcyA9IHZhci0+eXJlczsKKwlwYXItPnZhci54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXNfdmlydHVhbDsKKwlwYXItPnZhci55cmVzX3ZpcnR1YWwgPSB2YXItPnlyZXNfdmlydHVhbDsKKwkvKiByb3VuZHVwIGFuZCB2YWxpZGF0ZSAqLworCXBhci0+dmFyLnhyZXMgPSAocGFyLT52YXIueHJlcys3KSAmIH43OworCXBhci0+dmFyLnhyZXNfdmlydHVhbCA9IChwYXItPnZhci54cmVzX3ZpcnR1YWwrNykgJiB+NzsKKwlpZiAocGFyLT52YXIueHJlc192aXJ0dWFsIDwgcGFyLT52YXIueHJlcykKKwkJcGFyLT52YXIueHJlc192aXJ0dWFsID0gcGFyLT52YXIueHJlczsKKwlpZiAocGFyLT52YXIueXJlc192aXJ0dWFsIDwgcGFyLT52YXIueXJlcykKKwkJcGFyLT52YXIueXJlc192aXJ0dWFsID0gcGFyLT52YXIueXJlczsKKwlwYXItPnZhci54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OworCXBhci0+dmFyLnlvZmZzZXQgPSB2YXItPnlvZmZzZXQ7CisJcGFyLT52YXIuYml0c19wZXJfcGl4ZWwgPSB2YXItPmJpdHNfcGVyX3BpeGVsOworCWlmIChwYXItPnZhci5iaXRzX3Blcl9waXhlbCA8PSA4KQorCQlwYXItPnZhci5iaXRzX3Blcl9waXhlbCA9IDg7CisJZWxzZSBpZiAocGFyLT52YXIuYml0c19wZXJfcGl4ZWwgPD0gMTYpCisJCXBhci0+dmFyLmJpdHNfcGVyX3BpeGVsID0gMTY7CisJZWxzZQorCQlwYXItPnZhci5iaXRzX3Blcl9waXhlbCA9IDMyOworI2lmbmRlZiBGQkNPTl9IQVNfQ0ZCMzIKKwlpZiAocGFyLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gMzIpCisJCXBhci0+dmFyLmJpdHNfcGVyX3BpeGVsID0gMTY7CisjZW5kaWYKKyNpZm5kZWYgRkJDT05fSEFTX0NGQjE2CisJaWYgKHBhci0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDE2KQorCQlwYXItPnZhci5iaXRzX3Blcl9waXhlbCA9IDg7CisjZW5kaWYKKwlwYXItPnZhci5ncmF5c2NhbGUgPSB2YXItPmdyYXlzY2FsZTsKKwlwYXItPnZhci5yZWQgPSB2YXItPnJlZDsKKwlwYXItPnZhci5ncmVlbiA9IHZhci0+Z3JlZW47CisJcGFyLT52YXIuYmx1ZSA9IHZhci0+Ymx1ZTsKKwlwYXItPnZhci50cmFuc3AgPSB2YXItPnRyYW5zcDsKKwlwYXItPnZhci5ub25zdGQgPSB2YXItPm5vbnN0ZDsKKwlwYXItPnZhci5hY3RpdmF0ZSA9IHZhci0+YWN0aXZhdGU7CisJcGFyLT52YXIuaGVpZ2h0ID0gdmFyLT5oZWlnaHQ7CisJcGFyLT52YXIud2lkdGggPSB2YXItPndpZHRoOworCWlmICh2YXItPmFjY2VsX2ZsYWdzICYgRkJfQUNDRUxGX1RFWFQpIHsKKwkJcGFyLT52YXIuYWNjZWxfZmxhZ3MgPSBGQl9BQ0NFTEZfVEVYVDsKKwl9IGVsc2UgeworCQlwYXItPnZhci5hY2NlbF9mbGFncyA9IDA7CisJfQorCXBhci0+dmFyLnBpeGNsb2NrID0gdmFyLT5waXhjbG9jazsKKwlwYXItPnZhci5sZWZ0X21hcmdpbiA9IHZhci0+bGVmdF9tYXJnaW47CisJcGFyLT52YXIucmlnaHRfbWFyZ2luID0gdmFyLT5yaWdodF9tYXJnaW47CisJcGFyLT52YXIudXBwZXJfbWFyZ2luID0gdmFyLT51cHBlcl9tYXJnaW47CisJcGFyLT52YXIubG93ZXJfbWFyZ2luID0gdmFyLT5sb3dlcl9tYXJnaW47CisJcGFyLT52YXIuaHN5bmNfbGVuID0gdmFyLT5oc3luY19sZW47CisJcGFyLT52YXIudnN5bmNfbGVuID0gdmFyLT52c3luY19sZW47CisJcGFyLT52YXIuc3luYyA9IHZhci0+c3luYzsKKwlwYXItPnZhci52bW9kZSA9IHZhci0+dm1vZGU7CisJRFBSSU5USygiRVhJVFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglGaWxsIHRoZSBgdmFyJyBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlIHZhbHVlcyBpbiBgcGFyJyBhbmQgbWF5YmUKKyAqCW90aGVyIHZhbHVlcyByZWFkIG91dCBvZiB0aGUgaGFyZHdhcmUuCisgKi8KKworc3RhdGljIGludCB2aXJnZWZiX2VuY29kZV92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkJc3RydWN0IHZpcmdlZmJfcGFyICpwYXIpCit7CisJRFBSSU5USygiRU5URVJcbiIpOworCW1lbXNldCh2YXIsIDAsIHNpemVvZihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8pKTsJLyogbmVlZCB0aGlzID8gKi8KKwl2YXItPnhyZXMgPSBwYXItPnZhci54cmVzOworCXZhci0+eXJlcyA9IHBhci0+dmFyLnlyZXM7CisJdmFyLT54cmVzX3ZpcnR1YWwgPSBwYXItPnZhci54cmVzX3ZpcnR1YWw7CisJdmFyLT55cmVzX3ZpcnR1YWwgPSBwYXItPnZhci55cmVzX3ZpcnR1YWw7CisJdmFyLT54b2Zmc2V0ID0gcGFyLT52YXIueG9mZnNldDsKKwl2YXItPnlvZmZzZXQgPSBwYXItPnZhci55b2Zmc2V0OworCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBwYXItPnZhci5iaXRzX3Blcl9waXhlbDsKKwl2YXItPmdyYXlzY2FsZSA9IHBhci0+dmFyLmdyYXlzY2FsZTsKKwl2YXItPnJlZCA9IHBhci0+dmFyLnJlZDsKKwl2YXItPmdyZWVuID0gcGFyLT52YXIuZ3JlZW47CisJdmFyLT5ibHVlID0gcGFyLT52YXIuYmx1ZTsKKwl2YXItPnRyYW5zcCA9IHBhci0+dmFyLnRyYW5zcDsKKwl2YXItPm5vbnN0ZCA9IHBhci0+dmFyLm5vbnN0ZDsKKwl2YXItPmFjdGl2YXRlID0gcGFyLT52YXIuYWN0aXZhdGU7CisJdmFyLT5oZWlnaHQgPSBwYXItPnZhci5oZWlnaHQ7CisJdmFyLT53aWR0aCA9IHBhci0+dmFyLndpZHRoOworCXZhci0+YWNjZWxfZmxhZ3MgPSBwYXItPnZhci5hY2NlbF9mbGFnczsKKwl2YXItPnBpeGNsb2NrID0gcGFyLT52YXIucGl4Y2xvY2s7CisJdmFyLT5sZWZ0X21hcmdpbiA9IHBhci0+dmFyLmxlZnRfbWFyZ2luOworCXZhci0+cmlnaHRfbWFyZ2luID0gcGFyLT52YXIucmlnaHRfbWFyZ2luOworCXZhci0+dXBwZXJfbWFyZ2luID0gcGFyLT52YXIudXBwZXJfbWFyZ2luOworCXZhci0+bG93ZXJfbWFyZ2luID0gcGFyLT52YXIubG93ZXJfbWFyZ2luOworCXZhci0+aHN5bmNfbGVuID0gcGFyLT52YXIuaHN5bmNfbGVuOworCXZhci0+dnN5bmNfbGVuID0gcGFyLT52YXIudnN5bmNfbGVuOworCXZhci0+c3luYyA9IHBhci0+dmFyLnN5bmM7CisJdmFyLT52bW9kZSA9IHBhci0+dmFyLnZtb2RlOworCURQUklOVEsoIkVYSVRcbiIpOworCXJldHVybiAwOworfQorCisvKgorICogICAgU2V0IGEgc2luZ2xlIGNvbG9yIHJlZ2lzdGVyLiBUaGUgdmFsdWVzIHN1cHBsaWVkIGFyZSBhbHJlYWR5CisgKiAgICByb3VuZGVkIGRvd24gdG8gdGhlIGhhcmR3YXJlJ3MgY2FwYWJpbGl0aWVzIChhY2NvcmRpbmcgdG8gdGhlCisgKiAgICBlbnRyaWVzIGluIHRoZSB2YXIgc3RydWN0dXJlKS4gUmV0dXJuICE9IDAgZm9yIGludmFsaWQgcmVnbm8uCisgKi8KKworc3RhdGljIGludCB2aXJnZWZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKKwkJCSAgICAgdV9pbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisJaWYgKCgoY3VycmVudF9wYXIudmFyLmJpdHNfcGVyX3BpeGVsPT04KSAmJiAocmVnbm8+MjU1KSkgfHwKKwkJKChjdXJyZW50X3Bhci52YXIuYml0c19wZXJfcGl4ZWwhPTgpICYmIChyZWdubz4xNSkpKSB7CisJCQlEUFJJTlRLKCJFWElUXG4iKTsKKwkJCXJldHVybiAxOworCX0KKwlpZiAoKChjdXJyZW50X3Bhci52YXIuYml0c19wZXJfcGl4ZWw9PTgpICYmIChyZWdubzwyNTYpKSB8fAorCQkJKChjdXJyZW50X3Bhci52YXIuYml0c19wZXJfcGl4ZWwhPTgpICYmIChyZWdubzwxNikpKSB7CisJCXZpcmdlZmJfY29sb3VyX3RhYmxlIFtyZWdub11bMF0gPSByZWQgPj4gMTA7CisJCXZpcmdlZmJfY29sb3VyX3RhYmxlIFtyZWdub11bMV0gPSBncmVlbiA+PiAxMDsKKwkJdmlyZ2VmYl9jb2xvdXJfdGFibGUgW3JlZ25vXVsyXSA9IGJsdWUgPj4gMTA7CisJfQorCisJc3dpdGNoIChjdXJyZW50X3Bhci52YXIuYml0c19wZXJfcGl4ZWwpIHsKKyNpZmRlZiBGQkNPTl9IQVNfQ0ZCOAorCQljYXNlIDg6CisJCQl3Yl9tbWlvKFZEQUNfQUREUkVTU19XLCAodW5zaWduZWQgY2hhcilyZWdubyk7CisJCQl3Yl9tbWlvKFZEQUNfREFUQSwgKCh1bnNpZ25lZCBjaGFyKShyZWQgPj4gMTApKSk7CisJCQl3Yl9tbWlvKFZEQUNfREFUQSwgKCh1bnNpZ25lZCBjaGFyKShncmVlbiA+PiAxMCkpKTsKKwkJCXdiX21taW8oVkRBQ19EQVRBLCAoKHVuc2lnbmVkIGNoYXIpKGJsdWUgPj4gMTApKSk7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIEZCQ09OX0hBU19DRkIxNgorCQljYXNlIDE2OgorCQkJZmJjb25fY21hcC5jZmIxNltyZWdub10gPQorCQkJCSgocmVkICAmIDB4ZjgwMCkgfAorCQkJCSgoZ3JlZW4gJiAweGZjMDApID4+IDUpIHwKKwkJCQkoKGJsdWUgICYgMHhmODAwKSA+PiAxMSkpOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKKwkJY2FzZSAzMjoKKwkJCWZiY29uX2NtYXAuY2ZiMzJbcmVnbm9dID0KKwkJCQkvKiB0cmFuc3AgPSAwJ3Mgb3IgMSdzICA/ICovCisJCQkJKCgocmVkICAmIDB4ZmYwMCkgPDwgOCkgfAorCQkJCSgoZ3JlZW4gJiAweGZmMDApID4+IDApIHwKKwkJCQkoKGJsdWUgICYgMHhmZjAwKSA+PiA4KSk7CisJCQlicmVhazsKKyNlbmRpZgorCX0KKwlEUFJJTlRLKCJFWElUXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogICAgUmVhZCBhIHNpbmdsZSBjb2xvciByZWdpc3RlciBhbmQgc3BsaXQgaXQgaW50bworICogICAgY29sb3JzL3RyYW5zcGFyZW50LiBSZXR1cm4gIT0gMCBmb3IgaW52YWxpZCByZWduby4KKyAqLworCitzdGF0aWMgaW50IHZpcmdlZmJfZ2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCAqcmVkLCB1X2ludCAqZ3JlZW4sIHVfaW50ICpibHVlLAorCQkJICAgdV9pbnQgKnRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaW50IHQ7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisJaWYgKHJlZ25vID4gMjU1KSB7CisJCURQUklOVEsoIkVYSVRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCgoY3VycmVudF9wYXIudmFyLmJpdHNfcGVyX3BpeGVsPT04KSAmJiAocmVnbm88MjU2KSkgfHwKKwkJCSgoY3VycmVudF9wYXIudmFyLmJpdHNfcGVyX3BpeGVsIT04KSAmJiAocmVnbm88MTYpKSkgeworCisJCXQgPSB2aXJnZWZiX2NvbG91cl90YWJsZSBbcmVnbm9dWzBdOworCQkqcmVkID0gKHQ8PDEwKSB8ICh0PDw0KSB8ICh0Pj4yKTsKKwkJdCA9IHZpcmdlZmJfY29sb3VyX3RhYmxlIFtyZWdub11bMV07CisJCSpncmVlbiA9ICh0PDwxMCkgfCAodDw8NCkgfCAodD4+Mik7CisJCXQgPSB2aXJnZWZiX2NvbG91cl90YWJsZSBbcmVnbm9dWzJdOworCQkqYmx1ZSA9ICh0PDwxMCkgfCAodDw8NCkgfCAodD4+Mik7CisJfQorCSp0cmFuc3AgPSAwOworCURQUklOVEsoIkVYSVRcbiIpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiAgICAoVW4pQmxhbmsgdGhlIHNjcmVlbgorICovCisKK3N0YXRpYyB2b2lkIHZpcmdlZmJfZ2Z4X29uX29mZihpbnQgYmxhbmspCit7CisJRFBSSU5USygiRU5URVJcbiIpOworCWdmeF9vbl9vZmYoYmxhbmspOworCURQUklOVEsoIkVYSVRcbiIpOworfQorCisvKgorICogQ1YzRCBsb3ctbGV2ZWwgc3VwcG9ydAorICovCisKKworc3RhdGljIGlubGluZSB2b2lkIHdhaXRfM2RfZmlmb19zbG90cyhpbnQgbikJLyogV2FpdFF1ZXVlICovCit7CisJZG8geworCQltYigpOworCX0gd2hpbGUgKCgocmxfbW1pbyhNUl9TVUJTWVNURU1fU1RBVFVTX1IpID4+IDgpICYgMHgxZikgPCAobiArIDIpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZpcmdlZmJfd2FpdF9mb3JfaWRsZSh2b2lkKQkvKiBXYWl0SWRsZSAqLworeworCXdoaWxlKCEocmxfbW1pbyhNUl9TVUJTWVNURU1fU1RBVFVTX1IpICYgMHgyMDAwKSkgOworCWJsaXRfbWF5YmVfYnVzeSA9IDA7Cit9CisKKyAvKgorICAqIEJpdEJMVCAtIFRocm91Z2ggdGhlIFBsYW5lCisgICovCisKK3N0YXRpYyB2b2lkIHZpcmdlZmJfQml0QkxUKHVfc2hvcnQgY3VyeCwgdV9zaG9ydCBjdXJ5LCB1X3Nob3J0IGRlc3R4LCB1X3Nob3J0IGRlc3R5LAorCQkJdV9zaG9ydCB3aWR0aCwgdV9zaG9ydCBoZWlnaHQsIHVfc2hvcnQgc3RyaWRlLCB1X3Nob3J0IGRlcHRoKQoreworCXVuc2lnbmVkIGludCBibGl0Y21kID0gUzNWX0JJVEJMVCB8IFMzVl9EUkFXIHwgUzNWX0JMVF9DT1BZOworCisJc3dpdGNoIChkZXB0aCkgeworI2lmZGVmIEZCQ09OX0hBU19DRkI4CisJCWNhc2UgOCA6CisJCQlibGl0Y21kIHw9IFMzVl9EU1RfOEJQUDsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgRkJDT05fSEFTX0NGQjE2CisJCWNhc2UgMTYgOgorCQkJYmxpdGNtZCB8PSBTM1ZfRFNUXzE2QlBQOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKKwkJY2FzZSAzMiA6CisJCQkvKiAzMiBiaXQgdXNlcyAyIGJ5IDE2IGJpdCB2YWx1ZXMsIHNlZSBmYmNvbl92aXJnZTMyX2Jtb3ZlICovCisJCQlibGl0Y21kIHw9IFMzVl9EU1RfMTZCUFA7CisJCQlicmVhazsKKyNlbmRpZgorCX0KKworCS8qIFNldCBkcmF3aW5nIGRpcmVjdGlvbiAqLworCS8qIC1ZLCBYIG1haiwgLVggKGRlZmF1bHQpICovCisJaWYgKGN1cnggPiBkZXN0eCkgeworCQlibGl0Y21kIHw9ICgxIDw8IDI1KTsgIC8qIERyYXdpbmcgZGlyZWN0aW9uICtYICovCisJfSBlbHNlIHsKKwkJY3VyeCAgKz0gKHdpZHRoIC0gMSk7CisJCWRlc3R4ICs9ICh3aWR0aCAtIDEpOworCX0KKworCWlmIChjdXJ5ID4gZGVzdHkpIHsKKwkJYmxpdGNtZCB8PSAoMSA8PCAyNik7ICAvKiBEcmF3aW5nIGRpcmVjdGlvbiArWSAqLworCX0gZWxzZSB7CisJCWN1cnkgICs9IChoZWlnaHQgLSAxKTsKKwkJZGVzdHkgKz0gKGhlaWdodCAtIDEpOworCX0KKworCXdhaXRfM2RfZmlmb19zbG90cyg4KTsJCS8qIHdhaXQgb24gZmlmbyBzbG90cyBmb3IgOCB3cml0ZXMgKi8KKworCWlmIChibGl0X21heWJlX2J1c3kpCisJCXZpcmdlZmJfd2FpdF9mb3JfaWRsZSgpOworCWJsaXRfbWF5YmVfYnVzeSA9IDE7CisKKwl3bF9tbWlvKEJMVF9QQVRURVJOX0NPTE9SLCAxKTsJLyogcGF0dGVybiBmYiBjb2xvciAqLworCXdsX21taW8oQkxUX01PTk9fUEFUVEVSTl8wLCB+MCk7CisJd2xfbW1pbyhCTFRfTU9OT19QQVRURVJOXzEsIH4wKTsKKwl3bF9tbWlvKEJMVF9TSVpFX1hfWSwgKCh3aWR0aCA8PCAxNikgfCBoZWlnaHQpKTsKKwl3bF9tbWlvKEJMVF9TUkNfWF9ZLCAoKGN1cnggPDwgMTYpICB8IGN1cnkpKTsKKwl3bF9tbWlvKEJMVF9ERVNUX1hfWSwgKChkZXN0eCA8PCAxNikgfCBkZXN0eSkpOworCXdsX21taW8oQkxUX1NSQ19ERVNUX1NUUklERSwgKCgoc3RyaWRlIDw8IDE2KSB8IHN0cmlkZSkgLyogJiAweDBmZjgwZmY4ICovKSk7IC8qIHdoeSBpcyB0aGlzIG5lZWRlZCBub3cgPyAqLworCXdsX21taW8oQkxUX0NPTU1BTkRfU0VULCBibGl0Y21kKTsKK30KKworLyoKKyAqIFJlY3RhbmdsZSBGaWxsIFNvbGlkCisgKi8KKworc3RhdGljIHZvaWQgdmlyZ2VmYl9SZWN0RmlsbCh1X3Nob3J0IHgsIHVfc2hvcnQgeSwgdV9zaG9ydCB3aWR0aCwgdV9zaG9ydCBoZWlnaHQsCisJCQl1X3Nob3J0IGNvbG9yLCAgdV9zaG9ydCBzdHJpZGUsIHVfc2hvcnQgZGVwdGgpCit7CisJdW5zaWduZWQgaW50IGJsaXRjbWQgPSBTM1ZfUkVDVEZJTEwgfCBTM1ZfRFJBVyB8CisJCVMzVl9CTFRfQ0xFQVIgfCBTM1ZfTU9OT19QQVQgfCAoMSA8PCAyNikgfCAoMSA8PCAyNSk7CisKKwlzd2l0Y2ggKGRlcHRoKSB7CisjaWZkZWYgRkJDT05fSEFTX0NGQjgKKwkJY2FzZSA4IDoKKwkJCWJsaXRjbWQgfD0gUzNWX0RTVF84QlBQOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKKwkJY2FzZSAxNiA6CisJCQlibGl0Y21kIHw9IFMzVl9EU1RfMTZCUFA7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIEZCQ09OX0hBU19DRkIzMgorCQljYXNlIDMyIDoKKwkJCS8qIDMyIGJpdCB1c2VzIDIgdGltZXMgMTYgYml0IHZhbHVlcywgc2VlIGZiY29uX3ZpcmdlMzJfY2xlYXIgKi8KKwkJCWJsaXRjbWQgfD0gUzNWX0RTVF8xNkJQUDsKKwkJCWJyZWFrOworI2VuZGlmCisJfQorCisJd2FpdF8zZF9maWZvX3Nsb3RzKDUpOwkJLyogd2FpdCBvbiBmaWZvIHNsb3RzIGZvciA1IHdyaXRlcyAqLworCisJaWYgKGJsaXRfbWF5YmVfYnVzeSkKKwkJdmlyZ2VmYl93YWl0X2Zvcl9pZGxlKCk7CisJYmxpdF9tYXliZV9idXN5ID0gMTsKKworCXdsX21taW8oQkxUX1BBVFRFUk5fQ09MT1IsIChjb2xvciAmIDB4ZmYpKTsKKwl3bF9tbWlvKEJMVF9TSVpFX1hfWSwgKCh3aWR0aCA8PCAxNikgfCBoZWlnaHQpKTsKKwl3bF9tbWlvKEJMVF9ERVNUX1hfWSwgKCh4IDw8IDE2KSB8IHkpKTsKKwl3bF9tbWlvKEJMVF9TUkNfREVTVF9TVFJJREUsICgoKHN0cmlkZSA8PCAxNikgfCBzdHJpZGUpIC8qICYgMHgwZmY4MGZmOCAqLykpOworCXdsX21taW8oQkxUX0NPTU1BTkRfU0VULCBibGl0Y21kKTsKK30KKworLyoKKyAqIE1vdmUgY3Vyc29yIHRvIHgsIHkKKyAqLworCisjaWYgMAorc3RhdGljIHZvaWQgdmlyZ2VmYl9tb3ZlX2N1cnNvcih1X3Nob3J0IHgsIHVfc2hvcnQgeSkKK3sKKwlEUFJJTlRLKCJZdWNrIC4uLi4gTW92ZUN1cnNvciBvbiBhIDNEXG4iKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnRlcmZhY2VzIHRvIGhhcmR3YXJlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGZiX2h3c3dpdGNoIHZpcmdlZmJfaHdfc3dpdGNoID0geworCS5pbml0CQk9IHZpcmdlX2luaXQsCisJLmVuY29kZV9maXgJPSB2aXJnZWZiX2VuY29kZV9maXgsCisJLmRlY29kZV92YXIJPSB2aXJnZWZiX2RlY29kZV92YXIsCisJLmVuY29kZV92YXIJPSB2aXJnZWZiX2VuY29kZV92YXIsCisJLmdldGNvbHJlZwk9IHZpcmdlZmJfZ2V0Y29scmVnLAorCS5ibGFuawkJPSB2aXJnZWZiX2dmeF9vbl9vZmYKK307CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2VuZXJpYyByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKgorICogICAgRmlsbCB0aGUgaGFyZHdhcmUncyBgcGFyJyBzdHJ1Y3R1cmUuCisgKi8KKworc3RhdGljIHZvaWQgdmlyZ2VmYl9nZXRfcGFyKHN0cnVjdCB2aXJnZWZiX3BhciAqcGFyKQoreworCURQUklOVEsoIkVOVEVSXG4iKTsKKwlpZiAoY3VycmVudF9wYXJfdmFsaWQpIHsKKwkJKnBhciA9IGN1cnJlbnRfcGFyOworCX0gZWxzZSB7CisJCWZiaHctPmRlY29kZV92YXIoJnZpcmdlZmJfZGVmYXVsdCwgcGFyKTsKKwl9CisJRFBSSU5USygiRVhJVFxuIik7Cit9CisKKworc3RhdGljIHZvaWQgdmlyZ2VmYl9zZXRfcGFyKHN0cnVjdCB2aXJnZWZiX3BhciAqcGFyKQoreworCURQUklOVEsoIkVOVEVSXG4iKTsKKwljdXJyZW50X3BhciA9ICpwYXI7CisJY3VycmVudF9wYXJfdmFsaWQgPSAxOworCURQUklOVEsoIkVYSVRcbiIpOworfQorCisKK3N0YXRpYyB2b2lkIHZpcmdlZmJfc2V0X3ZpZGVvKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQoreworLyogU2V0IGNsaXBwaW5nIHJlY3RhbmdsZSB0byBjdXJyZW50IHNjcmVlbiBzaXplICovCisKKwl1bnNpZ25lZCBpbnQgY2xpcDsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKwl3YWl0XzNkX2ZpZm9fc2xvdHMoNCk7CisJY2xpcCA9ICgoMCA8PCAxNikgfCAodmFyLT54cmVzIC0gMSkpOworCXdsX21taW8oQkxUX0NMSVBfTEVGVF9SSUdIVCwgY2xpcCk7CisJY2xpcCA9ICgoMCA8PCAxNikgfCAodmFyLT55cmVzIC0gMSkpOworCXdsX21taW8oQkxUX0NMSVBfVE9QX0JPVFRPTSwgY2xpcCk7CisJd2xfbW1pbyhCTFRfU1JDX0JBU0UsIDApOwkJLyogc2VlbXMgd2UgbmVlZCB0byBjbGVhciB0aGVzZSB0d28gKi8KKwl3bF9tbWlvKEJMVF9ERVNUX0JBU0UsIDApOworCisvKiBMb2FkIHRoZSB2aWRlbyBtb2RlIGRlZmluZWQgYnkgdGhlICd2YXInIGRhdGEgKi8KKworCXZpcmdlZmJfbG9hZF92aWRlb19tb2RlKHZhcik7CisJRFBSSU5USygiRVhJVFxuIik7Cit9CisKKy8qCitNZXJnZSB0aGVzZSB0d28gZnVuY3Rpb25zLCBHZWVydCdzIHN1Z2dlc3Rpb24uCitzdGF0aWMgaW50IHZpcmdlZmJfc2V0X3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50IGNvbiwgc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIGludCB2aXJnZWZiX2RvX2ZiX3NldF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCBpc2FjdGl2ZSk7CisqLworCitzdGF0aWMgaW50IHZpcmdlZmJfZG9fZmJfc2V0X3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50IGlzYWN0aXZlKQoreworCWludCBlcnIsIGFjdGl2YXRlOworCXN0cnVjdCB2aXJnZWZiX3BhciBwYXI7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisJaWYgKChlcnIgPSBmYmh3LT5kZWNvZGVfdmFyKHZhciwgJnBhcikpKSB7CisJCURQUklOVEsoIkVYSVRcbiIpOworCQlyZXR1cm4gKGVycik7CisJfQorCisJYWN0aXZhdGUgPSB2YXItPmFjdGl2YXRlOworCWlmICgodmFyLT5hY3RpdmF0ZSAmIEZCX0FDVElWQVRFX01BU0spID09IEZCX0FDVElWQVRFX05PVyAmJiBpc2FjdGl2ZSkKKwkJdmlyZ2VmYl9zZXRfcGFyKCZwYXIpOworCWZiaHctPmVuY29kZV92YXIodmFyLCAmcGFyKTsKKwl2YXItPmFjdGl2YXRlID0gYWN0aXZhdGU7CisgICAgICAgIGlmICgodmFyLT5hY3RpdmF0ZSAmIEZCX0FDVElWQVRFX01BU0spID09IEZCX0FDVElWQVRFX05PVyAmJiBpc2FjdGl2ZSkKKwkJdmlyZ2VmYl9zZXRfdmlkZW8odmFyKTsKKwlEUFJJTlRLKCJFWElUXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogICAgR2V0IHRoZSBGaXhlZCBQYXJ0IG9mIHRoZSBEaXNwbGF5CisgKi8KKworc3RhdGljIGludCB2aXJnZWZiX2dldF9maXgoc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgsIGludCBjb24sCisJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgdmlyZ2VmYl9wYXIgcGFyOworCWludCBlcnJvciA9IDA7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisJaWYgKGNvbiA9PSAtMSkKKwkJdmlyZ2VmYl9nZXRfcGFyKCZwYXIpOworCWVsc2UKKwkJZXJyb3IgPSBmYmh3LT5kZWNvZGVfdmFyKCZmYl9kaXNwbGF5W2Nvbl0udmFyLCAmcGFyKTsKKworCWlmICghZXJyb3IpCisJCWVycm9yID0gZmJody0+ZW5jb2RlX2ZpeChmaXgsICZwYXIpOworCURQUklOVEsoIkVYSVRcbiIpOworCXJldHVybihlcnJvcik7Cit9CisKKworLyoKKyAqICAgIEdldCB0aGUgVXNlciBEZWZpbmVkIFBhcnQgb2YgdGhlIERpc3BsYXkKKyAqLworCitzdGF0aWMgaW50IHZpcmdlZmJfZ2V0X3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50IGNvbiwKKwkJCSAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCB2aXJnZWZiX3BhciBwYXI7CisJaW50IGVycm9yID0gMDsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKwlpZiAoY29uID09IC0xKSB7CisJCXZpcmdlZmJfZ2V0X3BhcigmcGFyKTsKKwkJZXJyb3IgPSBmYmh3LT5lbmNvZGVfdmFyKHZhciwgJnBhcik7CisJCWRpc3AudmFyID0gKnZhcjsgICAvKiArK0FuZHJlOiBkb24ndCBrbm93IGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHBsYWNlICovCisJfSBlbHNlIHsKKwkJKnZhciA9IGZiX2Rpc3BsYXlbY29uXS52YXI7CisJfQorCURQUklOVEsoIkVYSVRcbiIpOworCXJldHVybihlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkIHZpcmdlZmJfc2V0X2Rpc3AoaW50IGNvbiwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGZpeDsKKwlzdHJ1Y3QgZGlzcGxheSAqZGlzcGxheTsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKwlpZiAoY29uID49IDApCisJCWRpc3BsYXkgPSAmZmJfZGlzcGxheVtjb25dOworCWVsc2UKKwkJZGlzcGxheSA9ICZkaXNwOwkvKiB1c2VkIGR1cmluZyBpbml0aWFsaXphdGlvbiAqLworCisJdmlyZ2VmYl9nZXRfZml4KCZmaXgsIGNvbiwgaW5mbyk7CisJaWYgKGNvbiA9PSAtMSkKKwkJY29uID0gMDsKKwlpZihvbl96b3JybzIpIHsKKwkJaW5mby0+c2NyZWVuX2Jhc2UgPSAoY2hhciopdl9yYW07CisJfSBlbHNlIHsKKwkgICAgICAgIHN3aXRjaCAoZGlzcGxheS0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisjaWZkZWYgRkJDT05fSEFTX0NGQjgKKwkJCWNhc2UgODoKKwkJCQlpbmZvLT5zY3JlZW5fYmFzZSA9IChjaGFyKikodl9yYW0gKyBDWUJNRU1fT0ZGU0VUXzgpOworCQkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgRkJDT05fSEFTX0NGQjE2CisJCQljYXNlIDE2OgorCQkJCWluZm8tPnNjcmVlbl9iYXNlID0gKGNoYXIqKSh2X3JhbSArIENZQk1FTV9PRkZTRVRfMTYpOworCQkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgRkJDT05fSEFTX0NGQjMyCisJCQljYXNlIDMyOgorCQkJCWluZm8tPnNjcmVlbl9iYXNlID0gKGNoYXIqKSh2X3JhbSArIENZQk1FTV9PRkZTRVRfMzIpOworCQkJCWJyZWFrOworI2VuZGlmCisJCX0KKwl9CisJZGlzcGxheS0+dmlzdWFsID0gZml4LnZpc3VhbDsKKwlkaXNwbGF5LT50eXBlID0gZml4LnR5cGU7CisJZGlzcGxheS0+dHlwZV9hdXggPSBmaXgudHlwZV9hdXg7CisJZGlzcGxheS0+eXBhbnN0ZXAgPSBmaXgueXBhbnN0ZXA7CisJZGlzcGxheS0+eXdyYXBzdGVwID0gZml4Lnl3cmFwc3RlcDsKKwlkaXNwbGF5LT5jYW5fc29mdF9ibGFuayA9IDE7CisJZGlzcGxheS0+aW52ZXJzZSA9IHZpcmdlZmJfaW52ZXJzZTsKKwlkaXNwbGF5LT5saW5lX2xlbmd0aCA9IGRpc3BsYXktPnZhci54cmVzX3ZpcnR1YWwqCisJCQkgICAgICAgZGlzcGxheS0+dmFyLmJpdHNfcGVyX3BpeGVsLzg7CisKKwlzd2l0Y2ggKGRpc3BsYXktPnZhci5iaXRzX3Blcl9waXhlbCkgeworI2lmZGVmIEZCQ09OX0hBU19DRkI4CisJCWNhc2UgODoKKwkJCWlmIChkaXNwbGF5LT52YXIuYWNjZWxfZmxhZ3MgJiBGQl9BQ0NFTEZfVEVYVCkgeworCQkgICAJCWRpc3BsYXktPmRpc3BzdyA9ICZmYmNvbl92aXJnZTg7Cisjd2FybmluZyBGSVhNRTogV2Ugc2hvdWxkIHJlaW5pdCB0aGUgZ3JhcGhpY3MgZW5naW5lIGhlcmUKKwkJCX0gZWxzZQorCQkJCWRpc3BsYXktPmRpc3BzdyA9ICZmYmNvbl9jZmI4OworCQkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKKwkJY2FzZSAxNjoKKwkJCWlmIChkaXNwbGF5LT52YXIuYWNjZWxfZmxhZ3MgJiBGQl9BQ0NFTEZfVEVYVCkgeworCQkJCWRpc3BsYXktPmRpc3BzdyA9ICZmYmNvbl92aXJnZTE2OworCQkJfSBlbHNlCisJCQkJZGlzcGxheS0+ZGlzcHN3ID0gJmZiY29uX2NmYjE2OworCQkJZGlzcGxheS0+ZGlzcHN3X2RhdGEgPSAmZmJjb25fY21hcC5jZmIxNjsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgRkJDT05fSEFTX0NGQjMyCisJCWNhc2UgMzI6CisJCQlpZiAoZGlzcGxheS0+dmFyLmFjY2VsX2ZsYWdzICYgRkJfQUNDRUxGX1RFWFQpIHsKKwkJCQlkaXNwbGF5LT5kaXNwc3cgPSAmZmJjb25fdmlyZ2UzMjsKKwkJCX0gZWxzZQorCQkJCWRpc3BsYXktPmRpc3BzdyA9ICZmYmNvbl9jZmIzMjsKKwkJCWRpc3BsYXktPmRpc3Bzd19kYXRhID0gJmZiY29uX2NtYXAuY2ZiMzI7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJZGlzcGxheS0+ZGlzcHN3ID0gJmZiY29uX2R1bW15OworCQkJYnJlYWs7CisJfQorCURQUklOVEsoIkVYSVQgdl9yYW0gdmlydCA9IDB4JTguOGx4XG4iLCh1bnNpZ25lZCBsb25nKWRpc3BsYXktPnNjcmVlbl9iYXNlKTsKK30KKworCisvKgorICogICAgU2V0IHRoZSBVc2VyIERlZmluZWQgUGFydCBvZiB0aGUgRGlzcGxheQorICovCisKK3N0YXRpYyBpbnQgdmlyZ2VmYl9zZXRfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgY29uLAorCQkJICAgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaW50IGVyciwgb2xkeHJlcywgb2xkeXJlcywgb2xkdnhyZXMsIG9sZHZ5cmVzLCBvbGRicHAsIG9sZGFjY2VsOworCisJRFBSSU5USygiRU5URVJcbiIpOworCisJaWYgKChlcnIgPSB2aXJnZWZiX2RvX2ZiX3NldF92YXIodmFyLCBjb24gPT0gaW5mby0+Y3VycmNvbikpKSB7CisJCURQUklOVEsoIkVYSVRcbiIpOworCQlyZXR1cm4oZXJyKTsKKwl9CisJaWYgKCh2YXItPmFjdGl2YXRlICYgRkJfQUNUSVZBVEVfTUFTSykgPT0gRkJfQUNUSVZBVEVfTk9XKSB7CisJCW9sZHhyZXMgPSBmYl9kaXNwbGF5W2Nvbl0udmFyLnhyZXM7CisJCW9sZHlyZXMgPSBmYl9kaXNwbGF5W2Nvbl0udmFyLnlyZXM7CisJCW9sZHZ4cmVzID0gZmJfZGlzcGxheVtjb25dLnZhci54cmVzX3ZpcnR1YWw7CisJCW9sZHZ5cmVzID0gZmJfZGlzcGxheVtjb25dLnZhci55cmVzX3ZpcnR1YWw7CisJCW9sZGJwcCA9IGZiX2Rpc3BsYXlbY29uXS52YXIuYml0c19wZXJfcGl4ZWw7CisJCW9sZGFjY2VsID0gZmJfZGlzcGxheVtjb25dLnZhci5hY2NlbF9mbGFnczsKKwkJZmJfZGlzcGxheVtjb25dLnZhciA9ICp2YXI7CisJCWlmIChvbGR4cmVzICE9IHZhci0+eHJlcyB8fCBvbGR5cmVzICE9IHZhci0+eXJlcyB8fAorCQkgICAgb2xkdnhyZXMgIT0gdmFyLT54cmVzX3ZpcnR1YWwgfHwKKwkJICAgIG9sZHZ5cmVzICE9IHZhci0+eXJlc192aXJ0dWFsIHx8CisJCSAgICBvbGRicHAgIT0gdmFyLT5iaXRzX3Blcl9waXhlbCB8fAorCQkgICAgb2xkYWNjZWwgIT0gdmFyLT5hY2NlbF9mbGFncykgeworCQkJdmlyZ2VmYl9zZXRfZGlzcChjb24sIGluZm8pOworCQkJaWYgKGZiX2luZm8uY2hhbmdldmFyKQorCQkJCSgqZmJfaW5mby5jaGFuZ2V2YXIpKGNvbik7CisJCQlmYl9hbGxvY19jbWFwKCZmYl9kaXNwbGF5W2Nvbl0uY21hcCwgMCwgMCk7CisJCQlkb19pbnN0YWxsX2NtYXAoY29uLCBpbmZvKTsKKwkJfQorCX0KKwl2YXItPmFjdGl2YXRlID0gMDsKKwlEUFJJTlRLKCJFWElUXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogICAgR2V0IHRoZSBDb2xvcm1hcAorICovCisKK3N0YXRpYyBpbnQgdmlyZ2VmYl9nZXRfY21hcChzdHJ1Y3QgZmJfY21hcCAqY21hcCwgaW50IGtzcGMsIGludCBjb24sCisJCQkgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJRFBSSU5USygiRU5URVJcbiIpOworCWlmIChjb24gPT0gaW5mby0+Y3VycmNvbikgeyAvKiBjdXJyZW50IGNvbnNvbGU/ICovCisJCURQUklOVEsoIkVYSVQgLSBjb25zb2xlIGlzIGN1cnJlbnQgY29uc29sZSwgZmJfZ2V0X2NtYXBcbiIpOworCQlyZXR1cm4oZmJfZ2V0X2NtYXAoY21hcCwga3NwYywgZmJody0+Z2V0Y29scmVnLCBpbmZvKSk7CisJfSBlbHNlIGlmIChmYl9kaXNwbGF5W2Nvbl0uY21hcC5sZW4pIHsgLyogbm9uIGRlZmF1bHQgY29sb3JtYXA/ICovCisJCURQUklOVEsoIlVzZSBjb25zb2xlIGNtYXBcbiIpOworCQlmYl9jb3B5X2NtYXAoJmZiX2Rpc3BsYXlbY29uXS5jbWFwLCBjbWFwLCBrc3BjID8gMCA6IDIpOworCX0gZWxzZSB7CisJCURQUklOVEsoIlVzZSBkZWZhdWx0IGNtYXBcbiIpOworCQlmYl9jb3B5X2NtYXAoZmJfZGVmYXVsdF9jbWFwKGZiX2Rpc3BsYXlbY29uXS52YXIuYml0c19wZXJfcGl4ZWw9PTggPyAyNTYgOiAxNiksCisJCQkgICAgIGNtYXAsIGtzcGMgPyAwIDogMik7CisJfQorCURQUklOVEsoIkVYSVRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZiX29wcyB2aXJnZWZiX29wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkuZmJfZ2V0X2ZpeCA9CXZpcmdlZmJfZ2V0X2ZpeCwKKwkuZmJfZ2V0X3ZhciA9CXZpcmdlZmJfZ2V0X3ZhciwKKwkuZmJfc2V0X3ZhciA9CXZpcmdlZmJfc2V0X3ZhciwKKwkuZmJfZ2V0X2NtYXAgPQl2aXJnZWZiX2dldF9jbWFwLAorCS5mYl9zZXRfY21hcCA9CWdlbl9zZXRfY21hcCwKKwkuZmJfc2V0Y29scmVnID0JdmlyZ2VmYl9zZXRjb2xyZWcsCisJLmZiX2JsYW5rID0JdmlyZ2VmYl9ibGFuaywKK307CisKK2ludCBfX2luaXQgdmlyZ2VmYl9zZXR1cChjaGFyICpvcHRpb25zKQoreworCWNoYXIgKnRoaXNfb3B0OworCWZiX2luZm8uZm9udG5hbWVbMF0gPSAnXDAnOworCisJRFBSSU5USygiRU5URVJcbiIpOworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpIHsKKwkJRFBSSU5USygiRVhJVFxuIik7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqdGhpc19vcHQpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJjbXAodGhpc19vcHQsICJpbnZlcnNlIikpIHsKKwkJCXZpcmdlZmJfaW52ZXJzZSA9IDE7CisJCQlmYl9pbnZlcnRfY21hcHMoKTsKKwkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgImZvbnQ6IiwgNSkpCisJCQlzdHJjcHkoZmJfaW5mby5mb250bmFtZSwgdGhpc19vcHQrNSk7CisjaWZkZWYgRkJDT05fSEFTX0NGQjgKKwkJZWxzZSBpZiAoIXN0cmNtcCAodGhpc19vcHQsICJ2aXJnZTgiKSl7CisJCQl2aXJnZWZiX2RlZmF1bHQgPSB2aXJnZWZiX3ByZWRlZmluZWRbVklSR0U4X0RFRk1PREVdLnZhcjsKKwkJfQorI2VuZGlmCisjaWZkZWYgRkJDT05fSEFTX0NGQjE2CisJCWVsc2UgaWYgKCFzdHJjbXAgKHRoaXNfb3B0LCAidmlyZ2UxNiIpKXsKKwkJCXZpcmdlZmJfZGVmYXVsdCA9IHZpcmdlZmJfcHJlZGVmaW5lZFtWSVJHRTE2X0RFRk1PREVdLnZhcjsKKwkJfQorI2VuZGlmCisjaWZkZWYgRkJDT05fSEFTX0NGQjMyCisJCWVsc2UgaWYgKCFzdHJjbXAgKHRoaXNfb3B0LCAidmlyZ2UzMiIpKXsKKwkJCXZpcmdlZmJfZGVmYXVsdCA9IHZpcmdlZmJfcHJlZGVmaW5lZFtWSVJHRTMyX0RFRk1PREVdLnZhcjsKKwkJfQorI2VuZGlmCisJCWVsc2UKKwkJCXZpcmdlZmJfZ2V0X3ZpZGVvX21vZGUodGhpc19vcHQpOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIm1vZGUgOiB4cmVzPSVkLCB5cmVzPSVkLCBicHA9JWRcbiIsIHZpcmdlZmJfZGVmYXVsdC54cmVzLAorCQkJdmlyZ2VmYl9kZWZhdWx0LnlyZXMsIHZpcmdlZmJfZGVmYXVsdC5iaXRzX3Blcl9waXhlbCk7CisJRFBSSU5USygiRVhJVFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICAgIEdldCBhIFZpZGVvIE1vZGUKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCB2aXJnZWZiX2dldF92aWRlb19tb2RlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisJZm9yIChpID0gMDsgaSA8IE5VTV9UT1RBTF9NT0RFUzsgaSsrKSB7CisJCWlmICghc3RyY21wKG5hbWUsIHZpcmdlZmJfcHJlZGVmaW5lZFtpXS5uYW1lKSkgeworCQkJdmlyZ2VmYl9kZWZhdWx0ID0gdmlyZ2VmYl9wcmVkZWZpbmVkW2ldLnZhcjsKKwkJCURQUklOVEsoIkVYSVRcbiIpOworCQkJcmV0dXJuKGkpOworCQl9CisJfQorCS8qICsrQW5kcmU6IHNldCB2aXJnZWZiIGRlZmF1bHQgbW9kZSAqLworCisvKiBwcmVmZXIgMTYgYml0IGRlcHRoLCA4IGlmIG5vIDE2LCBpZiBubyA4IG9yIDE2IHVzZSAzMiAqLworCisjaWZkZWYgRkJDT05fSEFTX0NGQjMyCisJdmlyZ2VmYl9kZWZhdWx0ID0gdmlyZ2VmYl9wcmVkZWZpbmVkW1ZJUkdFMzJfREVGTU9ERV0udmFyOworI2VuZGlmCisjaWZkZWYgRkJDT05fSEFTX0NGQjgKKwl2aXJnZWZiX2RlZmF1bHQgPSB2aXJnZWZiX3ByZWRlZmluZWRbVklSR0U4X0RFRk1PREVdLnZhcjsKKyNlbmRpZgorI2lmZGVmIEZCQ09OX0hBU19DRkIxNgorCXZpcmdlZmJfZGVmYXVsdCA9IHZpcmdlZmJfcHJlZGVmaW5lZFtWSVJHRTE2X0RFRk1PREVdLnZhcjsKKyNlbmRpZgorCURQUklOVEsoIkVYSVRcbiIpOworCXJldHVybiAwOworfQorCisvKgorICogICAgSW5pdGlhbGl6YXRpb24KKyAqLworCitpbnQgX19pbml0IHZpcmdlZmJfaW5pdCh2b2lkKQoreworCXN0cnVjdCB2aXJnZWZiX3BhciBwYXI7CisJdW5zaWduZWQgbG9uZyBib2FyZF9hZGRyLCBib2FyZF9zaXplOworCXN0cnVjdCB6b3Jyb19kZXYgKnogPSBOVUxMOworCisJRFBSSU5USygiRU5URVJcbiIpOworCisJeiA9IHpvcnJvX2ZpbmRfZGV2aWNlKFpPUlJPX1BST0RfUEhBU0U1X0NZQkVSVklTSU9ONjRfM0QsIE5VTEwpOworCWlmICgheikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlib2FyZF9hZGRyID0gei0+cmVzb3VyY2Uuc3RhcnQ7CisJaWYgKGJvYXJkX2FkZHIgPCAweDAxMDAwMDAwKSB7CisKKwkJLyogYm9hcmQgcnVubmluZyBpbiBaMiBzcGFjZS4gVGhpcyBpbmNsdWRlcyB0aGUgdmlkZW8gbWVtb3J5CisJCSAgICBhcyB3ZWxsIGFzIHRoZSBTMyByZWdpc3RlciBzZXQgKi8KKworCQlvbl96b3JybzIgPSAxOworCQlib2FyZF9zaXplID0gMHgwMDQwMDAwMDsKKworCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihib2FyZF9hZGRyLCBib2FyZF9zaXplLCAiUzMgVmlSR0UiKSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXZfcmFtX3BoeXMgPSBib2FyZF9hZGRyOworCQl2X3JhbSA9IFpUV09fVkFERFIodl9yYW1fcGh5cyk7CisJCW1taW9fcmVnc19waHlzID0gKHVuc2lnbmVkIGxvbmcpKGJvYXJkX2FkZHIgKyAweDAwM2MwMDAwKTsKKwkJdmdhaW9fcmVncyA9ICh1bnNpZ25lZCBjaGFyICopIFpUV09fVkFERFIoYm9hcmRfYWRkciArIDB4MDAzYzAwMDApOworCQltbWlvX3JlZ3MgPSAodW5zaWduZWQgY2hhciAqKVpUV09fVkFERFIobW1pb19yZWdzX3BoeXMpOworCQl2Y29kZV9zd2l0Y2hfYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBaVFdPX1ZBRERSKGJvYXJkX2FkZHIgKyAweDAwM2EwMDAwKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1YzRCBkZXRlY3RlZCBydW5uaW5nIGluIFoyIG1vZGUuXG4iKTsKKworCX0gZWxzZSB7CisKKwkJLyogYm9hcmQgcnVubmluZyBpbiBaMyBzcGFjZS4gU2VwYXJhdGUgdmlkZW8gbWVtb3J5ICgzIGFwZXJ0dXJlcykKKwkJICAgYW5kIFMzIHJlZ2lzdGVyIHNldCAqLworCisJCW9uX3pvcnJvMiA9IDA7CisJCWJvYXJkX3NpemUgPSAweDAxMDAwMDAwOworCisJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGJvYXJkX2FkZHIsIGJvYXJkX3NpemUsICJTMyBWaVJHRSIpKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJdl9yYW1fcGh5cyAgPSBib2FyZF9hZGRyICsgMHgwNDAwMDAwMDsKKwkJdl9yYW0gPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKHZfcmFtX3BoeXMsIDB4MDEwMDAwMDApOworCQltbWlvX3JlZ3NfcGh5cyA9IGJvYXJkX2FkZHIgKyAweDA1MDAwMDAwOworCQl2Z2Fpb19yZWdzID0gKHVuc2lnbmVkIGNoYXIgKilpb3JlbWFwKGJvYXJkX2FkZHIgKzB4MGMwMDAwMDAsIDB4MDAxMDAwMDApOyAvKiBpbmNsdWRlcyBQQ0kgcmVncyAqLworCQltbWlvX3JlZ3MgPSBpb3JlbWFwKG1taW9fcmVnc19waHlzLCAweDAwMDEwMDAwKTsKKwkJdmNvZGVfc3dpdGNoX2Jhc2UgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKGJvYXJkX2FkZHIgKyAweDA4MDAwMDAwLCAweDEwMDApOworCQlwcmludGsoS0VSTl9JTkZPICJDVjNEIGRldGVjdGVkIHJ1bm5pbmcgaW4gWjMgbW9kZVxuIik7CisJfQorCisjaWYgZGVmaW5lZCAoVklSR0VGQkRFQlVHKQorCURQUklOVEsoImJvYXJkX2FkZHIgICAgIDogMHglOC44bHhcbiIsYm9hcmRfYWRkcik7CisJRFBSSU5USygiYm9hcmRfc2l6ZSAgICAgOiAweCU4LjhseFxuIixib2FyZF9zaXplKTsKKwlEUFJJTlRLKCJtbWlvX3JlZ3NfcGh5ICA6IDB4JTguOGx4XG4iLG1taW9fcmVnc19waHlzKTsKKwlEUFJJTlRLKCJ2X3JhbV9waHlzICAgICA6IDB4JTguOGx4XG4iLHZfcmFtX3BoeXMpOworCURQUklOVEsoInZnYWlvX3JlZ3MgICAgIDogMHglOC44bHhcbiIsKHVuc2lnbmVkIGxvbmcpdmdhaW9fcmVncyk7CisJRFBSSU5USygibW1pb19yZWdzICAgICAgOiAweCU4LjhseFxuIiwodW5zaWduZWQgbG9uZyltbWlvX3JlZ3MpOworCURQUklOVEsoInZfcmFtICAgICAgICAgIDogMHglOC44bHhcbiIsdl9yYW0pOworCURQUklOVEsoInZjb2RlIHN3IGJhc2UgIDogMHglOC44bHhcbiIsdmNvZGVfc3dpdGNoX2Jhc2UpOworI2VuZGlmCisJZmJodyA9ICZ2aXJnZWZiX2h3X3N3aXRjaDsKKwlzdHJjcHkoZmJfaW5mby5tb2RlbmFtZSwgdmlyZ2VmYl9uYW1lKTsKKwlmYl9pbmZvLmNoYW5nZXZhciA9IE5VTEw7CisJZmJfaW5mby5mYm9wcyA9ICZ2aXJnZWZiX29wczsKKwlmYl9pbmZvLmRpc3AgPSAmZGlzcDsKKwlmYl9pbmZvLmN1cnJjb24gPSAtMTsKKwlmYl9pbmZvLnN3aXRjaF9jb24gPSAmdmlyZ2VmYl9zd2l0Y2g7CisJZmJfaW5mby51cGRhdGV2YXIgPSAmdmlyZ2VmYl91cGRhdGV2YXI7CisJZmJfaW5mby5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7CisJZmJody0+aW5pdCgpOworCWZiaHctPmRlY29kZV92YXIoJnZpcmdlZmJfZGVmYXVsdCwgJnBhcik7CisJZmJody0+ZW5jb2RlX3ZhcigmdmlyZ2VmYl9kZWZhdWx0LCAmcGFyKTsKKwl2aXJnZWZiX2RvX2ZiX3NldF92YXIoJnZpcmdlZmJfZGVmYXVsdCwgMSk7CisJdmlyZ2VmYl9nZXRfdmFyKCZmYl9kaXNwbGF5WzBdLnZhciwgLTEsICZmYl9pbmZvKTsKKwl2aXJnZWZiX3NldF9kaXNwKC0xLCAmZmJfaW5mbyk7CisJZG9faW5zdGFsbF9jbWFwKDAsICZmYl9pbmZvKTsKKworCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmZmJfaW5mbykgPCAwKSB7CisJCSN3YXJuaW5nIHJlbGVhc2UgcmVzb3VyY2VzCisJCXByaW50ayhLRVJOX0VSUiAidmlyZ2VmYi5jOiByZWdpc3Rlcl9mcmFtZWJ1ZmZlciBmYWlsZWRcbiIpOworCQlEUFJJTlRLKCJFWElUXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZSwgdXNpbmcgJWxkSyBvZiB2aWRlbyBtZW1vcnlcbiIsCisJICAgICAgIGZiX2luZm8ubm9kZSwgZmJfaW5mby5tb2RlbmFtZSwgdl9yYW1fc2l6ZT4+MTApOworCisJLyogVE9ETzogVGhpcyBkcml2ZXIgY2Fubm90IGJlIHVubG9hZGVkIHlldCAqLworCisJRFBSSU5USygiRVhJVFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB2aXJnZWZiX3N3aXRjaChpbnQgY29uLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisJLyogRG8gd2UgaGF2ZSB0byBzYXZlIHRoZSBjb2xvcm1hcD8gKi8KKwlpZiAoZmJfZGlzcGxheVtpbmZvLT5jdXJyY29uXS5jbWFwLmxlbikKKwkJZmJfZ2V0X2NtYXAoJmZiX2Rpc3BsYXlbaW5mby0+Y3VycmNvbl0uY21hcCwgMSwKKwkJCSAgICBmYmh3LT5nZXRjb2xyZWcsIGluZm8pOworCXZpcmdlZmJfZG9fZmJfc2V0X3ZhcigmZmJfZGlzcGxheVtjb25dLnZhciwgMSk7CisJaW5mby0+Y3VycmNvbiA9IGNvbjsKKwkvKiBJbnN0YWxsIG5ldyBjb2xvcm1hcCAqLworCWRvX2luc3RhbGxfY21hcChjb24sIGluZm8pOworCURQUklOVEsoIkVYSVRcbiIpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiAgICBVcGRhdGUgdGhlIGB2YXInIHN0cnVjdHVyZSAoY2FsbGVkIGJ5IGZiY29uLmMpCisgKgorICogICAgVGhpcyBjYWxsIGxvb2tzIG9ubHkgYXQgeW9mZnNldCBhbmQgdGhlIEZCX1ZNT0RFX1lXUkFQIGZsYWcgaW4gYHZhcicuCisgKiAgICBTaW5jZSBpdCdzIGNhbGxlZCBieSBhIGtlcm5lbCBkcml2ZXIsIG5vIHJhbmdlIGNoZWNraW5nIGlzIGRvbmUuCisgKi8KKworc3RhdGljIGludCB2aXJnZWZiX3VwZGF0ZXZhcihpbnQgY29uLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisJcmV0dXJuIDA7CisJRFBSSU5USygiRVhJVFxuIik7Cit9CisKKy8qCisgKiAgICBCbGFuayB0aGUgZGlzcGxheS4KKyAqLworCitzdGF0aWMgaW50IHZpcmdlZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisJZmJody0+YmxhbmsoYmxhbmspOworCURQUklOVEsoIkVYSVRcbiIpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiAgICBUZXh0IGNvbnNvbGUgYWNjZWxlcmF0aW9uCisgKi8KKworI2lmZGVmIEZCQ09OX0hBU19DRkI4CitzdGF0aWMgdm9pZCBmYmNvbl92aXJnZThfYm1vdmUoc3RydWN0IGRpc3BsYXkgKnAsIGludCBzeSwgaW50IHN4LCBpbnQgZHksCisJCQkgICAgICAgaW50IGR4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCit7CisgICAgICAgIHN4ICo9IDg7IGR4ICo9IDg7IHdpZHRoICo9IDg7CisgICAgICAgIHZpcmdlZmJfQml0QkxUKCh1X3Nob3J0KXN4LCAodV9zaG9ydCkoc3kqZm9udGhlaWdodChwKSksICh1X3Nob3J0KWR4LAorICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCkoZHkqZm9udGhlaWdodChwKSksICh1X3Nob3J0KXdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCkoaGVpZ2h0KmZvbnRoZWlnaHQocCkpLCAodV9zaG9ydClwLT5uZXh0X2xpbmUsIDgpOworfQorCitzdGF0aWMgdm9pZCBmYmNvbl92aXJnZThfY2xlYXIoc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgc3ksCisJCQkgICAgICAgaW50IHN4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYmc7CisKKyAgICAgICAgc3ggKj0gODsgd2lkdGggKj0gODsKKyAgICAgICAgYmcgPSBhdHRyX2JnY29sX2VjKHAsY29ucCk7CisgICAgICAgIHZpcmdlZmJfUmVjdEZpbGwoKHVfc2hvcnQpc3gsICh1X3Nob3J0KShzeSpmb250aGVpZ2h0KHApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCl3aWR0aCwgKHVfc2hvcnQpKGhlaWdodCpmb250aGVpZ2h0KHApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCliZywgKHVfc2hvcnQpcC0+bmV4dF9saW5lLCA4KTsKK30KKworc3RhdGljIHZvaWQgZmJjb25fdmlyZ2U4X3B1dGMoc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgYywgaW50IHl5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHh4KQoreworCWlmIChibGl0X21heWJlX2J1c3kpCisJCXZpcmdlZmJfd2FpdF9mb3JfaWRsZSgpOworCWZiY29uX2NmYjhfcHV0Yyhjb25wLCBwLCBjLCB5eSwgeHgpOworfQorCitzdGF0aWMgdm9pZCBmYmNvbl92aXJnZThfcHV0Y3Moc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCBkaXNwbGF5ICpwLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpzLCBpbnQgY291bnQsIGludCB5eSwgaW50IHh4KQoreworCWlmIChibGl0X21heWJlX2J1c3kpCisJCXZpcmdlZmJfd2FpdF9mb3JfaWRsZSgpOworCWZiY29uX2NmYjhfcHV0Y3MoY29ucCwgcCwgcywgY291bnQsIHl5LCB4eCk7Cit9CisKK3N0YXRpYyB2b2lkIGZiY29uX3ZpcmdlOF9yZXZjKHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgeHgsIGludCB5eSkKK3sKKwlpZiAoYmxpdF9tYXliZV9idXN5KQorCQl2aXJnZWZiX3dhaXRfZm9yX2lkbGUoKTsKKwlmYmNvbl9jZmI4X3JldmMocCwgeHgsIHl5KTsKK30KKworc3RhdGljIHZvaWQgZmJjb25fdmlyZ2U4X2NsZWFyX21hcmdpbnMoc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCBkaXNwbGF5ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdHRvbV9vbmx5KQoreworCWlmIChibGl0X21heWJlX2J1c3kpCisJCXZpcmdlZmJfd2FpdF9mb3JfaWRsZSgpOworCWZiY29uX2NmYjhfY2xlYXJfbWFyZ2lucyhjb25wLCBwLCBib3R0b21fb25seSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGlzcGxheV9zd2l0Y2ggZmJjb25fdmlyZ2U4ID0geworCS5zZXR1cAkJPSBmYmNvbl9jZmI4X3NldHVwLAorCS5ibW92ZQkJPSBmYmNvbl92aXJnZThfYm1vdmUsCisJLmNsZWFyCQk9IGZiY29uX3ZpcmdlOF9jbGVhciwKKwkucHV0YwkJPSBmYmNvbl92aXJnZThfcHV0YywKKwkucHV0Y3MJCT0gZmJjb25fdmlyZ2U4X3B1dGNzLAorCS5yZXZjCQk9IGZiY29uX3ZpcmdlOF9yZXZjLAorCS5jbGVhcl9tYXJnaW5zCT0gZmJjb25fdmlyZ2U4X2NsZWFyX21hcmdpbnMsCisJLmZvbnR3aWR0aG1hc2sJPSBGT05UV0lEVEgoNCl8Rk9OVFdJRFRIKDgpfEZPTlRXSURUSCgxMil8Rk9OVFdJRFRIKDE2KQorfTsKKyNlbmRpZgorCisjaWZkZWYgRkJDT05fSEFTX0NGQjE2CitzdGF0aWMgdm9pZCBmYmNvbl92aXJnZTE2X2Jtb3ZlKHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgc3ksIGludCBzeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQoreworICAgICAgICBzeCAqPSA4OyBkeCAqPSA4OyB3aWR0aCAqPSA4OworICAgICAgICB2aXJnZWZiX0JpdEJMVCgodV9zaG9ydClzeCwgKHVfc2hvcnQpKHN5KmZvbnRoZWlnaHQocCkpLCAodV9zaG9ydClkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgKHVfc2hvcnQpKGR5KmZvbnRoZWlnaHQocCkpLCAodV9zaG9ydCl3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgKHVfc2hvcnQpKGhlaWdodCpmb250aGVpZ2h0KHApKSwgKHVfc2hvcnQpcC0+bmV4dF9saW5lLCAxNik7Cit9CisKK3N0YXRpYyB2b2lkIGZiY29uX3ZpcmdlMTZfY2xlYXIoc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYmc7CisKKyAgICAgICAgc3ggKj0gODsgd2lkdGggKj0gODsKKyAgICAgICAgYmcgPSBhdHRyX2JnY29sX2VjKHAsY29ucCk7CisgICAgICAgIHZpcmdlZmJfUmVjdEZpbGwoKHVfc2hvcnQpc3gsICh1X3Nob3J0KShzeSpmb250aGVpZ2h0KHApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCl3aWR0aCwgKHVfc2hvcnQpKGhlaWdodCpmb250aGVpZ2h0KHApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCliZywgKHVfc2hvcnQpcC0+bmV4dF9saW5lLCAxNik7Cit9CisKK3N0YXRpYyB2b2lkIGZiY29uX3ZpcmdlMTZfcHV0YyhzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgc3RydWN0IGRpc3BsYXkgKnAsIGludCBjLCBpbnQgeXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHgpCit7CisJaWYgKGJsaXRfbWF5YmVfYnVzeSkKKwkJdmlyZ2VmYl93YWl0X2Zvcl9pZGxlKCk7CisJZmJjb25fY2ZiMTZfcHV0Yyhjb25wLCBwLCBjLCB5eSwgeHgpOworfQorCitzdGF0aWMgdm9pZCBmYmNvbl92aXJnZTE2X3B1dGNzKHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAqcywgaW50IGNvdW50LCBpbnQgeXksIGludCB4eCkKK3sKKwlpZiAoYmxpdF9tYXliZV9idXN5KQorCQl2aXJnZWZiX3dhaXRfZm9yX2lkbGUoKTsKKwlmYmNvbl9jZmIxNl9wdXRjcyhjb25wLCBwLCBzLCBjb3VudCwgeXksIHh4KTsKK30KKworc3RhdGljIHZvaWQgZmJjb25fdmlyZ2UxNl9yZXZjKHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgeHgsIGludCB5eSkKK3sKKwlpZiAoYmxpdF9tYXliZV9idXN5KQorCQl2aXJnZWZiX3dhaXRfZm9yX2lkbGUoKTsKKwlmYmNvbl9jZmIxNl9yZXZjKHAsIHh4LCB5eSk7Cit9CisKK3N0YXRpYyB2b2lkIGZiY29uX3ZpcmdlMTZfY2xlYXJfbWFyZ2lucyhzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgc3RydWN0IGRpc3BsYXkgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm90dG9tX29ubHkpCit7CisJaWYgKGJsaXRfbWF5YmVfYnVzeSkKKwkJdmlyZ2VmYl93YWl0X2Zvcl9pZGxlKCk7CisJZmJjb25fY2ZiMTZfY2xlYXJfbWFyZ2lucyhjb25wLCBwLCBib3R0b21fb25seSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGlzcGxheV9zd2l0Y2ggZmJjb25fdmlyZ2UxNiA9IHsKKwkuc2V0dXAJCT0gZmJjb25fY2ZiMTZfc2V0dXAsCisJLmJtb3ZlCQk9IGZiY29uX3ZpcmdlMTZfYm1vdmUsCisJLmNsZWFyCQk9IGZiY29uX3ZpcmdlMTZfY2xlYXIsCisJLnB1dGMJCT0gZmJjb25fdmlyZ2UxNl9wdXRjLAorCS5wdXRjcwkJPSBmYmNvbl92aXJnZTE2X3B1dGNzLAorCS5yZXZjCQk9IGZiY29uX3ZpcmdlMTZfcmV2YywKKwkuY2xlYXJfbWFyZ2lucwk9IGZiY29uX3ZpcmdlMTZfY2xlYXJfbWFyZ2lucywKKwkuZm9udHdpZHRobWFzawk9IEZPTlRXSURUSCg0KXxGT05UV0lEVEgoOCl8Rk9OVFdJRFRIKDEyKXxGT05UV0lEVEgoMTYpCit9OworI2VuZGlmCisKKyNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKK3N0YXRpYyB2b2lkIGZiY29uX3ZpcmdlMzJfYm1vdmUoc3RydWN0IGRpc3BsYXkgKnAsIGludCBzeSwgaW50IHN4LCBpbnQgZHksCisJCQkgICAgICAgaW50IGR4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCit7CisgICAgICAgIHN4ICo9IDE2OyBkeCAqPSAxNjsgd2lkdGggKj0gMTY7CS8qIGRvdWJsZWQgdGhlc2UgdmFsdWVzIHRvIGRvIDMyIGJpdCBibGl0ICovCisgICAgICAgIHZpcmdlZmJfQml0QkxUKCh1X3Nob3J0KXN4LCAodV9zaG9ydCkoc3kqZm9udGhlaWdodChwKSksICh1X3Nob3J0KWR4LAorICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCkoZHkqZm9udGhlaWdodChwKSksICh1X3Nob3J0KXdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCkoaGVpZ2h0KmZvbnRoZWlnaHQocCkpLCAodV9zaG9ydClwLT5uZXh0X2xpbmUsIDE2KTsKK30KKworc3RhdGljIHZvaWQgZmJjb25fdmlyZ2UzMl9jbGVhcihzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgc3RydWN0IGRpc3BsYXkgKnAsIGludCBzeSwKKwkJCSAgICAgICBpbnQgc3gsIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKyAgICAgICAgdW5zaWduZWQgY2hhciBiZzsKKworICAgICAgICBzeCAqPSAxNjsgd2lkdGggKj0gMTY7CQkJLyogZG91YmxlZCB0aGVzZSB2YWx1ZXMgdG8gZG8gMzIgYml0IGJsaXQgKi8KKyAgICAgICAgYmcgPSBhdHRyX2JnY29sX2VjKHAsY29ucCk7CisgICAgICAgIHZpcmdlZmJfUmVjdEZpbGwoKHVfc2hvcnQpc3gsICh1X3Nob3J0KShzeSpmb250aGVpZ2h0KHApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCl3aWR0aCwgKHVfc2hvcnQpKGhlaWdodCpmb250aGVpZ2h0KHApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCliZywgKHVfc2hvcnQpcC0+bmV4dF9saW5lLCAxNik7Cit9CisKK3N0YXRpYyB2b2lkIGZiY29uX3ZpcmdlMzJfcHV0YyhzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgc3RydWN0IGRpc3BsYXkgKnAsIGludCBjLCBpbnQgeXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHgpCit7CisJaWYgKGJsaXRfbWF5YmVfYnVzeSkKKwkJdmlyZ2VmYl93YWl0X2Zvcl9pZGxlKCk7CisJZmJjb25fY2ZiMzJfcHV0Yyhjb25wLCBwLCBjLCB5eSwgeHgpOworfQorCitzdGF0aWMgdm9pZCBmYmNvbl92aXJnZTMyX3B1dGNzKHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAqcywgaW50IGNvdW50LCBpbnQgeXksIGludCB4eCkKK3sKKwlpZiAoYmxpdF9tYXliZV9idXN5KQorCQl2aXJnZWZiX3dhaXRfZm9yX2lkbGUoKTsKKwlmYmNvbl9jZmIzMl9wdXRjcyhjb25wLCBwLCBzLCBjb3VudCwgeXksIHh4KTsKK30KKworc3RhdGljIHZvaWQgZmJjb25fdmlyZ2UzMl9yZXZjKHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgeHgsIGludCB5eSkKK3sKKwlpZiAoYmxpdF9tYXliZV9idXN5KQorCQl2aXJnZWZiX3dhaXRfZm9yX2lkbGUoKTsKKwlmYmNvbl9jZmIzMl9yZXZjKHAsIHh4LCB5eSk7Cit9CisKK3N0YXRpYyB2b2lkIGZiY29uX3ZpcmdlMzJfY2xlYXJfbWFyZ2lucyhzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgc3RydWN0IGRpc3BsYXkgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm90dG9tX29ubHkpCit7CisJaWYgKGJsaXRfbWF5YmVfYnVzeSkKKwkJdmlyZ2VmYl93YWl0X2Zvcl9pZGxlKCk7CisJZmJjb25fY2ZiMzJfY2xlYXJfbWFyZ2lucyhjb25wLCBwLCBib3R0b21fb25seSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGlzcGxheV9zd2l0Y2ggZmJjb25fdmlyZ2UzMiA9IHsKKwkuc2V0dXAJCT0gZmJjb25fY2ZiMzJfc2V0dXAsCisJLmJtb3ZlCQk9IGZiY29uX3ZpcmdlMzJfYm1vdmUsCisJLmNsZWFyCQk9IGZiY29uX3ZpcmdlMzJfY2xlYXIsCisJLnB1dGMJCT0gZmJjb25fdmlyZ2UzMl9wdXRjLAorCS5wdXRjcwkJPSBmYmNvbl92aXJnZTMyX3B1dGNzLAorCS5yZXZjCQk9IGZiY29uX3ZpcmdlMzJfcmV2YywKKwkuY2xlYXJfbWFyZ2lucwk9IGZiY29uX3ZpcmdlMzJfY2xlYXJfbWFyZ2lucywKKwkuZm9udHdpZHRobWFzawk9IEZPTlRXSURUSCg0KXxGT05UV0lEVEgoOCl8Rk9OVFdJRFRIKDEyKXxGT05UV0lEVEgoMTYpCit9OworI2VuZGlmCisKKyNpZmRlZiBNT0RVTEUKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHZpcmdlZmJfaW5pdCgpOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworCitzdGF0aWMgaW50IGN2M2RfaGFzXzRtYih2b2lkKQoreworCS8qIGN5YmVyZmIgdmVyc2lvbiBkaWRuJ3Qgd29yaywgbmVpdGhlciBkb2VzIHRoaXMgKG5vdCByZWxpYWJseSkKKwlmb3JjZWQgdG8gcmV0dXJuIDRNQiAqLworI2lmIDAKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp0MCwgKnQyOworI2VuZGlmCisJRFBSSU5USygiRU5URVJcbiIpOworI2lmIDAKKwkvKiB3cml0ZSBwYXR0ZXJucyBpbiBtZW1vcnkgYW5kIHRlc3QgaWYgdGhleSBjYW4gYmUgcmVhZCAqLworCXQwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKil2X3JhbTsKKwl0MiA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKHZfcmFtICsgMHgwMDIwMDAwMCk7CisJKnQwID0gMHg4NzY1NDMyMTsKKwkqdDIgPSAweDEyMzQ1Njc4OworCisJaWYgKCp0MCAhPSAweDg3NjU0MzIxKSB7CisJCS8qIHJlYWQgb2YgZmlyc3QgbG9jYXRpb24gZmFpbGVkICovCisJCURQUklOVEsoIkVYSVQgLSAwTUIgIVxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICgqdDIgPT0gMHg4NzY1NDMyMSkgeworCQkvKiBzaG91bGQgcmVhZCAweDEyMzQ1Njc4IGlmIDRNQiAqLworCQlEUFJJTlRLKCJFWElUIC0gMk1CKGEpIFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICgqdDIgIT0gMHgxMjM0NTY3OCkgeworCQkvKiB1cHBlciAyTUIgcmVhZCBiYWNrIG1hdGNoIGZhaWxlZCAqLworCQlEUFJJTlRLKCJFWElUIC0gMk1CKGIpXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogbWF5IGhhdmUgNE1CICovCisKKwkqdDIgPSAweEFBQUFBQUFBOworCisJaWYoKnQyICE9IDB4QUFBQUFBQUEpIHsKKwkJLyogdXBwZXIgMk1CIHJlYWQgYmFjayBtYXRjaCBmYWlsZWQgKi8KKwkJRFBSSU5USygiRVhJVCAtIDJNQihjKVxuIik7CisJCXJldHVybiAwOworCX0KKworCSp0MiA9IDB4NTU1NTU1NTU7CisKKwlpZigqdDIgIT0gMHg1NTU1NTU1NSkgeworCQkvKiB1cHBlciAyTUIgcmVhZCBiYWNrIG1hdGNoIGZhaWxlZCAqLworCQlEUFJJTlRLKCJFWElUIC0gMk1CKGQpXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisjZW5kaWYKKwlEUFJJTlRLKCJFWElUIC0gNE1CXG4iKTsKKwlyZXR1cm4gMTsKK30KKworCisvKgorICogQ29tcHV0ZXMgTSwgTiwgYW5kIFIgcGxsIHBhcmFtcyBmb3IgZnJlcSBhcmcuCisgKiBSZXR1cm5zIDE2IGJpdHMgLSBoaSAwTU1NTU1NIGxvIDBSUk5OTk5OCisgKi8KKworI2RlZmluZSBSRUZDTE9DSyAxNDMxODAwMAorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdmlyZ2VmYl9jb21wdXRlX2Nsb2NrKHVuc2lnbmVkIGxvbmcgZnJlcSkKK3sKKworCXVuc2lnbmVkIGNoYXIgbSwgbiwgciwgcnB3cjsKKwl1bnNpZ25lZCBsb25nIGRpZmYsIGZ0cnksIHNhdmUgPSB+MFVMOworCXVuc2lnbmVkIHNob3J0IG1ucjsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKworCWZvciAociA9IDAsIHJwd3IgPSAxIDsgciA8IDQgOyByKyssIHJwd3IgKj0gMikgeworCQlpZiAoKDEzNTAwMDAwMCA8PSAocnB3ciAqIGZyZXEpKSAmJiAoKHJwd3IgKiBmcmVxKSA8PSAyNzAwMDAwMDApKSB7CisJCQlmb3IgKG4gPSAxIDsgbiA8IDMyIDsgbisrKSB7CisJCQkJbSA9ICgoZnJlcSAqIChuICsgMikgKiBycHdyKS9SRUZDTE9DSykgLSAyOworCQkJCWlmIChtID09IDAgfHwgbSA+MTI3KQorCQkJCQlicmVhazsKKwkJCQlmdHJ5ID0gKChSRUZDTE9DSyAvIChuICsgMikpICogKG0gKyAyKSkgLyBycHdyOworCQkJCWlmIChmdHJ5ID4gZnJlcSkKKwkJCQkJZGlmZiA9IGZ0cnkgLSBmcmVxOworCQkJCWVsc2UKKwkJCQkJZGlmZiA9IGZyZXEgLSBmdHJ5OworCQkJCWlmIChkaWZmIDwgc2F2ZSkgeworCQkJCQlzYXZlID0gZGlmZjsKKwkJCQkJbW5yID0gIChtIDw8IDgpIHwgKHI8PDUpIHwgKG4gJiAweDdmKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKHNhdmUgPT0gfjBVTCkKKwkJcHJpbnRrKCJDYW4ndCBjb21wdXRlIGNsb2NrIFBMTCB2YWx1ZXMgZm9yICVsZCBIeiBjbG9ja1xuIiwgZnJlcSk7CisJRFBSSU5USygiRVhJVFxuIik7CisJcmV0dXJuKG1ucik7Cit9CisKK3N0YXRpYyB2b2lkIHZpcmdlZmJfbG9hZF92aWRlb19tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmlkZW9fbW9kZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGxhY2UsIGRibHNjYW4sIHRtcDsKKwl1bnNpZ25lZCBzaG9ydCBtbnI7CisJdW5zaWduZWQgc2hvcnQgSFQsIEhERSwgSEJTLCBIQlcsIEhTUywgSFNXOworCXVuc2lnbmVkIHNob3J0IFZULCBWREUsIFZCUywgVkJXLCBWU1MsIFZTVzsKKwl1bnNpZ25lZCBzaG9ydCBTQ087CisJaW50IGNyMTE7CisJaW50IGNyNjc7CisJaW50IGhtdWw7CisJaW50IHhyZXMsIHhyZXNfdmlydHVhbCwgaGZyb250LCBoc3luYywgaGJhY2s7CisJaW50IHlyZXMsIHZmcm9udCwgdnN5bmMsIHZiYWNrOworCWludCBicHA7CisJaW50IGk7CisJbG9uZyBmcmVxOworCisJRFBSSU5USygiRU5URVIgOiAlZHglZC0lZFxuIix2aWRlb19tb2RlLT54cmVzLCB2aWRlb19tb2RlLT55cmVzLAorCQkJCXZpZGVvX21vZGUtPmJpdHNfcGVyX3BpeGVsKTsKKworCWJwcCA9IHZpZGVvX21vZGUtPmJpdHNfcGVyX3BpeGVsOworCXhyZXMgPSB2aWRlb19tb2RlLT54cmVzOworCXhyZXNfdmlydHVhbCA9IHZpZGVvX21vZGUtPnhyZXNfdmlydHVhbDsKKwloZnJvbnQgPSB2aWRlb19tb2RlLT5yaWdodF9tYXJnaW47CisJaHN5bmMgPSB2aWRlb19tb2RlLT5oc3luY19sZW47CisJaGJhY2sgPSB2aWRlb19tb2RlLT5sZWZ0X21hcmdpbjsKKworCWxhY2UgPSAwOworCWRibHNjYW4gPSAwOworCisJaWYgKHZpZGVvX21vZGUtPnZtb2RlICYgRkJfVk1PREVfRE9VQkxFKSB7CisJCXlyZXMgPSB2aWRlb19tb2RlLT55cmVzICogMjsKKwkJdmZyb250ID0gdmlkZW9fbW9kZS0+bG93ZXJfbWFyZ2luICogMjsKKwkJdnN5bmMgPSB2aWRlb19tb2RlLT52c3luY19sZW4gKiAyOworCQl2YmFjayA9IHZpZGVvX21vZGUtPnVwcGVyX21hcmdpbiAqIDI7CisJCWRibHNjYW4gPSAxOworCX0gZWxzZSBpZiAodmlkZW9fbW9kZS0+dm1vZGUgJiBGQl9WTU9ERV9JTlRFUkxBQ0VEKSB7CisJCXlyZXMgPSAodmlkZW9fbW9kZS0+eXJlcyArIDEpIC8gMjsKKwkJdmZyb250ID0gKHZpZGVvX21vZGUtPmxvd2VyX21hcmdpbiArIDEpIC8gMjsKKwkJdnN5bmMgPSAodmlkZW9fbW9kZS0+dnN5bmNfbGVuICsgMSkgLyAyOworCQl2YmFjayA9ICh2aWRlb19tb2RlLT51cHBlcl9tYXJnaW4gKyAxKSAvIDI7CisJCWxhY2UgPSAxOworCX0gZWxzZSB7CisJCXlyZXMgPSB2aWRlb19tb2RlLT55cmVzOworCQl2ZnJvbnQgPSB2aWRlb19tb2RlLT5sb3dlcl9tYXJnaW47CisJCXZzeW5jID0gdmlkZW9fbW9kZS0+dnN5bmNfbGVuOworCQl2YmFjayA9IHZpZGVvX21vZGUtPnVwcGVyX21hcmdpbjsKKwl9CisKKwlzd2l0Y2ggKGJwcCkgeworCQljYXNlIDg6CisJCQl2aWRlb19tb2RlLT5yZWQub2Zmc2V0ID0gMDsKKwkJCXZpZGVvX21vZGUtPmdyZWVuLm9mZnNldCA9IDA7CisJCQl2aWRlb19tb2RlLT5ibHVlLm9mZnNldCA9IDA7CisJCQl2aWRlb19tb2RlLT50cmFuc3Aub2Zmc2V0ID0gMDsKKwkJCXZpZGVvX21vZGUtPnJlZC5sZW5ndGggPSA4OworCQkJdmlkZW9fbW9kZS0+Z3JlZW4ubGVuZ3RoID0gODsKKwkJCXZpZGVvX21vZGUtPmJsdWUubGVuZ3RoID0gODsKKwkJCXZpZGVvX21vZGUtPnRyYW5zcC5sZW5ndGggPSAwOworCQkJaG11bCA9IDE7CisJCQljcjY3ID0gMHgwMDsKKwkJCVNDTyA9IHhyZXNfdmlydHVhbCAvIDg7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCXZpZGVvX21vZGUtPnJlZC5vZmZzZXQgPSAxMTsKKwkJCXZpZGVvX21vZGUtPmdyZWVuLm9mZnNldCA9IDU7CisJCQl2aWRlb19tb2RlLT5ibHVlLm9mZnNldCA9IDA7CisJCQl2aWRlb19tb2RlLT50cmFuc3Aub2Zmc2V0ID0gMDsKKwkJCXZpZGVvX21vZGUtPnJlZC5sZW5ndGggPSA1OworCQkJdmlkZW9fbW9kZS0+Z3JlZW4ubGVuZ3RoID0gNjsKKwkJCXZpZGVvX21vZGUtPmJsdWUubGVuZ3RoID0gNTsKKwkJCXZpZGVvX21vZGUtPnRyYW5zcC5sZW5ndGggPSAwOworCQkJaG11bCA9IDI7CisJCQljcjY3ID0gMHg1MDsKKwkJCVNDTyA9IHhyZXNfdmlydHVhbCAvIDQ7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCXZpZGVvX21vZGUtPnJlZC5vZmZzZXQgPSAxNjsKKwkJCXZpZGVvX21vZGUtPmdyZWVuLm9mZnNldCA9IDg7CisJCQl2aWRlb19tb2RlLT5ibHVlLm9mZnNldCA9IDA7CisJCQl2aWRlb19tb2RlLT50cmFuc3Aub2Zmc2V0ID0gMjQ7CisJCQl2aWRlb19tb2RlLT5yZWQubGVuZ3RoID0gODsKKwkJCXZpZGVvX21vZGUtPmdyZWVuLmxlbmd0aCA9IDg7CisJCQl2aWRlb19tb2RlLT5ibHVlLmxlbmd0aCA9IDg7CisJCQl2aWRlb19tb2RlLT50cmFuc3AubGVuZ3RoID0gODsKKwkJCWhtdWwgPSAxOworCQkJY3I2NyA9IDB4ZDA7CisJCQlTQ08gPSB4cmVzX3ZpcnR1YWwgLyAyOworCQkJYnJlYWs7CisJfQorCisJSFQgID0gKCgoeHJlcyArIGhmcm9udCArIGhzeW5jICsgaGJhY2spIC8gOCkgKiBobXVsKSAtIDU7CisJSERFID0gKCh4cmVzIC8gOCkgKiBobXVsKSAtIDE7CisJSEJTID0gKHhyZXMgLyA4KSAqIGhtdWw7CisJSFNTID0gKCh4cmVzICsgaGZyb250KSAvIDgpICogaG11bDsKKwlIU1cgPSAoaHN5bmMgLyA4KSAqIGhtdWw7CisJSEJXID0gKCgoaGZyb250ICsgaHN5bmMgKyBoYmFjaykgLyA4KSAqIGhtdWwpIC0gMjsKKworCVZUICA9IHlyZXMgKyB2ZnJvbnQgKyB2c3luYyArIHZiYWNrIC0gMjsKKwlWREUgPSB5cmVzIC0gMTsKKwlWQlMgPSB5cmVzIC0gMTsKKwlWU1MgPSB5cmVzICsgdmZyb250OworCVZTVyA9IHZzeW5jOworCVZCVyA9IHZmcm9udCArIHZzeW5jICsgdmJhY2sgLSAyOworCisjaWZkZWYgVklSR0VGQkRFQlVHCisJRFBSSU5USygiSERFICAgICAgIDogMHglNC40eCwgJTQuNGRcbiIsIEhERSwgSERFKTsKKwlEUFJJTlRLKCJIQlMgICAgICAgOiAweCU0LjR4LCAlNC40ZFxuIiwgSEJTLCBIQlMpOworCURQUklOVEsoIkhTUyAgICAgICA6IDB4JTQuNHgsICU0LjRkXG4iLCBIU1MsIEhTUyk7CisJRFBSSU5USygiSFNXICAgICAgIDogMHglNC40eCwgJTQuNGRcbiIsIEhTVywgSFNXKTsKKwlEUFJJTlRLKCJIQlcgICAgICAgOiAweCU0LjR4LCAlNC40ZFxuIiwgSEJXLCBIQlcpOworCURQUklOVEsoIkhTUyArIEhTVyA6IDB4JTQuNHgsICU0LjRkXG4iLCBIU1MrSFNXLCBIU1MrSFNXKTsKKwlEUFJJTlRLKCJIQlMgKyBIQlcgOiAweCU0LjR4LCAlNC40ZFxuIiwgSEJTK0hCVywgSEJTK0hCVyk7CisJRFBSSU5USygiSFQgICAgICAgIDogMHglNC40eCwgJTQuNGRcbiIsIEhULCBIVCk7CisJRFBSSU5USygiVkRFICAgICAgIDogMHglNC40eCwgJTQuNGRcbiIsIFZERSwgVkRFKTsKKwlEUFJJTlRLKCJWQlMgICAgICAgOiAweCU0LjR4LCAlNC40ZFxuIiwgVkJTLCBWQlMpOworCURQUklOVEsoIlZTUyAgICAgICA6IDB4JTQuNHgsICU0LjRkXG4iLCBWU1MsIFZTUyk7CisJRFBSSU5USygiVlNXICAgICAgIDogMHglNC40eCwgJTQuNGRcbiIsIFZTVywgVlNXKTsKKwlEUFJJTlRLKCJWQlcgICAgICAgOiAweCU0LjR4LCAlNC40ZFxuIiwgVkJXLCBWQlcpOworCURQUklOVEsoIlZUICAgICAgICA6IDB4JTQuNHgsICU0LjRkXG4iLCBWVCwgVlQpOworI2VuZGlmCisKKy8qIHR1cm4gZ2Z4IG9mZiwgZG9uJ3QgbWVzcyB1cCB0aGUgZGlzcGxheSAqLworCisgCWdmeF9vbl9vZmYoMSk7CisKKy8qIEggYW5kIFYgc3luYyBwb2xhcml0eSAqLworCisJdG1wID0gcmJfbW1pbyhHUkVHX01JU0NfT1VUUFVUX1IpICYgMHgyZjsJCS8qIGNvbG91ciwgcmFtIGVuYWJsZSwgY2xrIHNyMTIvczEzIHNlbCAqLworCWlmICghKHZpZGVvX21vZGUtPnN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCkpCisJCXRtcCB8PSAweDQwOwkJCQkJLyogbmVnIEggc3luYyBwb2xhcml0eSAqLworCWlmICghKHZpZGVvX21vZGUtPnN5bmMgJiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpKQorCQl0bXAgfD0gMHg4MDsJCQkJCS8qIG5lZyBWIHN5bmMgcG9sYXJpdHkgKi8KKwl0bXAgfD0gMHgwYzsJCQkJCQkvKiBjbGsgZnJvbSBzcjEyL3NyMTMgKi8KKwl3Yl9tbWlvKEdSRUdfTUlTQ19PVVRQVVRfVywgdG1wKTsKKworLyogY2xvY2tzICovCisKKwl3c2VxKFNFUV9JRF9CVVNfUkVRX0NOVEwsIDB4YzApOwkJCS8qIDIgY2xrIG1lbSB3ciBhbmQgL1JBUzEgKi8KKwl3c2VxKFNFUV9JRF9DTEtTWU5fQ05UTF8yLCAweDgwKTsJCQkvKiBiNyBpcyAyIG1lbSBjbGsgd3IgKi8KKwltbnIgPSB2aXJnZWZiX2NvbXB1dGVfY2xvY2soTUVNQ0xPQ0spOworCURQUklOVEsoIm1lbSBjbG9jayAlZCwgbSAlZCwgbiAlZCwgciAlZC5cbiIsIE1FTUNMT0NLLCAoKG1ucj4+OCkmMHg3ZiksIChtbnImMHgxZiksICgobW5yID4+IDUpJjB4MDMpKTsKKwl3c2VxKFNFUV9JRF9NQ0xLX0xPLCAobW5yICYgMHg3ZikpOworCXdzZXEoU0VRX0lEX01DTEtfSEksICgobW5yICYgMHg3ZjAwKSA+PiA4KSk7CisJZnJlcSA9ICgxMDAwMDAwMDAwIC8gdmlkZW9fbW9kZS0+cGl4Y2xvY2spICogMTAwMDsJLyogcGl4Y2xvY2sgaXMgaW4gcHMgLi4uIGNvbnZlcnQgdG8gSHogKi8KKwltbnIgPSB2aXJnZWZiX2NvbXB1dGVfY2xvY2soZnJlcSk7CisJRFBSSU5USygiZG90IGNsb2NrICVsZCwgbSAlZCwgbiAlZCwgciAlZC5cbiIsIGZyZXEsICgobW5yPj44KSYweDdmKSwgKG1uciYweDFmKSwgKChtbnI+PjUpJjB4MDMpKTsKKwl3c2VxKFNFUV9JRF9EQ0xLX0xPLCAobW5yICYgMHg3ZikpOworCXdzZXEoU0VRX0lEX0RDTEtfSEksICgobW5yICYgMHg3ZjAwKSA+PiA4KSk7CisJd3NlcShTRVFfSURfQ0xLU1lOX0NOVExfMiwgMHhhMCk7CisJd3NlcShTRVFfSURfQ0xLU1lOX0NOVExfMiwgMHg4MCk7CisJdWRlbGF5KDEwMCk7CisKKy8qIGxvYWQgZGlzcGxheSBwYXJhbWV0ZXJzIGludG8gYm9hcmQgKi8KKworCS8qIG5vdCBzdXJlIGFib3V0IHN5bmMgYW5kIGJsYW5raW5nIGV4dGVuc2lvbnMgYml0cyBpbiBjcjVkIGFuZCBjcjUgKi8KKworCXdjcnQoQ1JUX0lEX0VYVF9IT1JfT1ZGLAkJCS8qIDB4NWQgKi8KKwkJKChIVCAmIDB4MTAwKSA/ICAgICAgICAgMHgwMSA6IDB4MDApIHwKKwkJKChIREUgJiAweDEwMCkgPyAgICAgICAgMHgwMiA6IDB4MDApIHwKKwkJKChIQlMgJiAweDEwMCkgPyAgICAgICAgMHgwNCA6IDB4MDApIHwKKwkvKgkoKChIQlMgKyBIQlcpICYgMHg0MCkgPyAweDA4IDogMHgwMCkgfAkqLworCQkoKEhTUyAmIDB4MTAwKSA/ICAgICAgICAweDEwIDogMHgwMCkgfAorCS8qCSgoKEhTUyArIEhTVykgJiAweDIwKSA/IDB4MjAgOiAweDAwKSB8CSovCisJCSgoSFNXID49IDB4MjApID8gICAgICAgIDB4MjAgOiAweDAwKSB8CisJCSgoKEhULTUpICYgMHgxMDApID8gICAgIDB4NDAgOiAweDAwKSk7CisKKwl3Y3J0KENSVF9JRF9FWFRfVkVSX09WRiwJCQkvKiAweDVlICovCisJCSgoVlQgJiAweDQwMCkgPyAweDAxIDogMHgwMCkgfAorCQkoKFZERSAmIDB4NDAwKSA/IDB4MDIgOiAweDAwKSB8CisJCSgoVkJTICYgMHg0MDApID8gMHgwNCA6IDB4MDApIHwKKwkJKChWU1MgJiAweDQwMCkgPyAweDEwIDogMHgwMCkgfAorCQkweDQwKTsJCQkJCS8qIGxpbmUgY29tcGFyZSAqLworCisJd2NydChDUlRfSURfU1RBUlRfVkVSX1JFVFIsIFZTUyk7CisJY3IxMSA9IHJjcnQoQ1JUX0lEX0VORF9WRVJfUkVUUikgfCAweDIwOwkvKiB2ZXJ0IGludGVycnVwdCBmbGFnICovCisJd2NydChDUlRfSURfRU5EX1ZFUl9SRVRSLCAoKGNyMTEgJiAweDIwKSB8ICgoVlNTICsgVlNXKSAmIDB4MGYpKSk7CS8qIGtlZXBzIHZlcnQgaXJxIGVuYWJsZSBzdGF0ZSwgYWxzbyBoYXMgdW5sb2NrIGJpdCBjcjAgdG8gNyAqLworCXdjcnQoQ1JUX0lEX1ZFUl9ESVNQX0VOQV9FTkQsIFZERSk7CisJd2NydChDUlRfSURfU1RBUlRfVkVSX0JMQU5LLCBWQlMpOworCXdjcnQoQ1JUX0lEX0VORF9WRVJfQkxBTkssIFZCUyArIFZCVyk7CQkvKiBtaWdodCBiZSArLy0gMSBvdXQgKi8KKwl3Y3J0KENSVF9JRF9IT1JfVE9UQUwsIEhUKTsKKwl3Y3J0KENSVF9JRF9ESVNQTEFZX0ZJRk8sIEhUIC0gNSk7CisJd2NydChDUlRfSURfQkFDS1dBRF9DT01QXzMsIDB4MTApOwkJLyogZW5hYmxlIGRpc3BsYXkgZmlmbyAqLworCXdjcnQoQ1JUX0lEX0hPUl9ESVNQX0VOQV9FTkQsIEhERSk7CisJd2NydChDUlRfSURfU1RBUlRfSE9SX0JMQU5LICwgSEJTKTsKKwl3Y3J0KENSVF9JRF9FTkRfSE9SX0JMQU5LLCAoSEJTICsgSEJXKSAmIDB4MWYpOworCXdjcnQoQ1JUX0lEX1NUQVJUX0hPUl9SRVRSLCBIU1MpOworCXdjcnQoQ1JUX0lEX0VORF9IT1JfUkVUUiwJCQkvKiBjcjUgKi8KKwkJKChIU1MgKyBIU1cpICYgMHgxZikgfAorCQkoKChIQlMgKyBIQlcpICYgMHgyMCkgPyAweDgwIDogMHgwMCkpOworCXdjcnQoQ1JUX0lEX1ZFUl9UT1RBTCwgVlQpOworCXdjcnQoQ1JUX0lEX09WRVJGTE9XLAorCQkoKFZUICYgMHgxMDApID8gMHgwMSA6IDB4MDApIHwKKwkJKChWREUgJiAweDEwMCkgPyAweDAyIDogMHgwMCkgfAorCQkoKFZTUyAmIDB4MTAwKSA/IDB4MDQgOiAweDAwKSB8CisJCSgoVkJTICYgMHgxMDApID8gMHgwOCA6IDB4MDApIHwKKwkJMHgxMCB8CisJCSgoVlQgJiAweDIwMCkgPyAweDIwIDogMHgwMCkgfAorCQkoKFZERSAmIDB4MjAwKSA/IDB4NDAgOiAweDAwKSB8CisJCSgoVlNTICYgMHgyMDApID8gMHg4MCA6IDB4MDApKTsKKwl3Y3J0KENSVF9JRF9NQVhfU0NBTl9MSU5FLAorCQkoZGJsc2NhbiA/IDB4ODAgOiAweDAwKSB8CisJCTB4NDAgfAorCQkoKFZCUyAmIDB4MjAwKSA/IDB4MjAgOiAweDAwKSk7CisJd2NydChDUlRfSURfTElORV9DT01QQVJFLCAweGZmKTsKKwl3Y3J0KENSVF9JRF9MQUNFX1JFVFJfU1RBUlQsIEhUIC8gMik7CQkvKiAoSFQtNSkvMiA/ICovCisJd2NydChDUlRfSURfTEFDRV9DT05UUk9MLCAobGFjZSA/IDB4MjAgOiAweDAwKSk7CisKKwl3Y3J0KENSVF9JRF9TQ1JFRU5fT0ZGU0VULCBTQ08pOworCXdjcnQoQ1JUX0lEX0VYVF9TWVNfQ05UTF8yLCAoU0NPID4+IDQpICYgMHgzMCApOworCisJLyogd2FpdCBmb3IgdmVydCBzeW5jIGJlZm9yZSBjcjY3IHVwZGF0ZSAqLworCisJZm9yIChpPTA7IGkgPCAxMDAwMDsgaSsrKSB7CisJCXVkZWxheSgxMCk7CisJCW1iKCk7CisJCWlmIChyYl9tbWlvKEdSRUdfSU5QVVRfU1RBVFVTMV9SKSAmIDB4MDgpCisJCQlicmVhazsKKwl9CisKKwl3bF9tbWlvKDB4ODIwMCwgMHgwMDAwYzAwMCk7CS8qIGZpZm8gY29udHJvbCAgKDB4MDAxMTA0MDAgPykgKi8KKwl3Y3J0KENSVF9JRF9FWFRfTUlTQ19DTlRMXzIsIGNyNjcpOworCisvKiBlbmFibGUgdmlkZW8gKi8KKworCXRtcCA9IHJiX21taW8oQUNUX0FERFJFU1NfUkVTRVQpOworCXdiX21taW8oQUNUX0FERFJFU1NfVywgKChicHAgPT0gOCkgPyAweDIwIDogMHgwMCkpOwkvKiBzZXQgYjUsIEVOQiBQTFQgaW4gYXR0ciBpZHggcmVnKSAqLworCXRtcCA9IHJiX21taW8oQUNUX0FERFJFU1NfUkVTRVQpOworCisvKiB0dXJuIGdmeCBvbiBhZ2FpbiAqLworCisJZ2Z4X29uX29mZigwKTsKKworLyogcGFzcy10aHJvdWdoICovCisKKwlTZXRWU3dpdGNoKDEpOwkJLyogY3YzZCAqLworCisJRFVNUDsKKwlEUFJJTlRLKCJFWElUXG4iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdmeF9vbl9vZmYoaW50IHRvZ2dsZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKworCURQUklOVEsoIkVOVEVSIGdmeCAlc1xuIiwgKHRvZ2dsZSA/ICJvZmYiIDogIm9uIikpOworCisJdG9nZ2xlID0gKHRvZ2dsZSAmIDB4MDEpIDw8IDU7CisJdG1wID0gcnNlcShTRVFfSURfQ0xPQ0tJTkdfTU9ERSkgJiAofigweDAxIDw8IDUpKTsKKwl3c2VxKFNFUV9JRF9DTE9DS0lOR19NT0RFLCB0bXAgfCB0b2dnbGUpOworCisJRFBSSU5USygiRVhJVFxuIik7Cit9CisKKyNpZiBkZWZpbmVkIChWSVJHRUZCRFVNUCkKKworLyoKKyAqIER1bXAgYm9hcmQgcmVnaXN0ZXJzCisgKi8KKworc3RhdGljIHZvaWQgY3Y2NF9kdW1wKHZvaWQpCit7CisJaW50IGk7CisJdTggYywgYjsKKyAgICAgICAgdTE2IHc7CisJdTMyIGw7CisKKwkvKiBjcnQsIHNlcSwgZ2Z4IGFuZCBhdHIgcmVncyAqLworCisJU2VsZWN0TU1JTzsKKworCXByaW50aygiXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDw9IDB4NmY7IGkrKykgeworCQl3Yl9tbWlvKENSVF9BRERSRVNTLCBpKTsKKwkJcHJpbnRrKCJjcnQgaWR4IDogMHglMi4yeCA6IDB4JTIuMnhcbiIsIGksIHJiX21taW8oQ1JUX0FERFJFU1NfUikpOworCX0KKwlmb3IgKGkgPSAwOyBpIDw9IDB4MWM7IGkrKykgeworCQl3Yl9tbWlvKFNFUV9BRERSRVNTLCBpKTsKKwkJcHJpbnRrKCJzZXEgaWR4IDogMHglMi4yeCA6IDB4JTIuMnhcbiIsIGksIHJiX21taW8oU0VRX0FERFJFU1NfUikpOworCX0KKwlmb3IgKGkgPSAwOyBpIDw9IDg7IGkrKykgeworCQl3Yl9tbWlvKEdDVF9BRERSRVNTLCBpKTsKKwkJcHJpbnRrKCJnZnggaWR4IDogMHglMi4yeCA6IDB4JTIuMnhcbiIsIGksIHJiX21taW8oR0NUX0FERFJFU1NfUikpOworCX0KKwlmb3IgKGkgPSAwOyBpIDw9IDB4MTQ7IGkrKykgeworCQljID0gcmJfbW1pbyhBQ1RfQUREUkVTU19SRVNFVCk7CisJCXdiX21taW8oQUNUX0FERFJFU1NfVywgaSk7CisJCXByaW50aygiYXRyIGlkeCA6IDB4JTIuMnggOiAweCUyLjJ4XG4iLCBpLCByYl9tbWlvKEFDVF9BRERSRVNTX1IpKTsKKwl9CisKKwkvKiByZS1lbmFibGUgdmlkZW8gYWNjZXNzIHRvIHBhbGV0dGUgKi8KKworCWMgPSByYl9tbWlvKEFDVF9BRERSRVNTX1JFU0VUKTsKKwl1ZGVsYXkoMTApOworCXdiX21taW8oQUNUX0FERFJFU1NfVywgMHgyMCk7CisJYyA9IHJiX21taW8oQUNUX0FERFJFU1NfUkVTRVQpOworCXVkZWxheSgxMCk7CisKKwkvKiBnZW5lcmFsIHJlZ3MgKi8KKworCXByaW50aygiMHgzY2ModyAweDNjMikgOiAweCUyLjJ4XG4iLCByYl9tbWlvKDB4M2NjKSk7CS8qIEdSRUdfTUlTQ19PVVRQVVQgUkVBRCAqLworCXByaW50aygiMHgzYzIoLS0tLS0tLSkgOiAweCUyLjJ4XG4iLCByYl9tbWlvKDB4M2MyKSk7CS8qIEdSRUdfSU5QVVRfU1RBVFVTIDAgUkVBRCAqLworCXByaW50aygiMHgzYzModyAweDNjMykgOiAweCUyLjJ4XG4iLCByYl92Z2FpbygweDNjMykpOwkvKiBHUkVHX1ZJREVPX1NVQlNfRU5BQkxFICovCisJcHJpbnRrKCIweDNjYSh3IDB4M2RhKSA6IDB4JTIuMnhcbiIsIHJiX3ZnYWlvKDB4M2NhKSk7CS8qIEdSRUdfRkVBVFVSRV9DT05UUk9MIHJlYWQgKi8KKwlwcmludGsoIjB4M2RhKC0tLS0tLS0pIDogMHglMi4yeFxuIiwgcmJfbW1pbygweDNkYSkpOwkvKiBHUkVHX0lOUFVUX1NUQVRVUyAxIFJFQUQgKi8KKworCS8qIGVuZ2luZSByZWdzICovCisKKwlmb3IgKGkgPSAweDgxODA7IGkgPD0gMHg4MjAwOyBpID0gaSArIDQpCisJCXByaW50aygiMHglOC44eCA6IDB4JTguOHhcbiIsIGksIHJsX21taW8oaSkpOworCisJaSA9IDB4ODUwNDsKKwlwcmludGsoIjB4JTguOHggOiAweCU4Ljh4XG4iLCBpLCBybF9tbWlvKGkpKTsKKwlpID0gMHg4NTBjOworCXByaW50aygiMHglOC44eCA6IDB4JTguOHhcbiIsIGksIHJsX21taW8oaSkpOworCWZvciAoaSA9IDB4YTRkNDsgaSA8PSAweGE1MGM7IGkgPSBpICsgNCkKKwkJcHJpbnRrKCIweCU4Ljh4IDogMHglOC44eFxuIiwgaSwgcmxfbW1pbyhpKSk7CisKKwkvKiBQQ0kgcmVncyAqLworCisJU2VsZWN0Q0ZHOworCisJZm9yIChjID0gMDsgYyA8IDB4MDg7IGMgPSBjICsgMikgeworCQl3ID0gKCooKHUxNiAqKSgodTMyKSh2Z2Fpb19yZWdzICsgYyArIChvbl96b3JybzIgPyAwIDogMHgwMDBlMDAwMCkpIF4gMikpKTsKKwkJcHJpbnRrKCJwY2kgMHglMi4yeCA6IDB4JTQuNHhcbiIsIGMsIHcpOworCX0KKwljID0gODsKKwlsID0gKCooKHUzMiAqKSgodTMyKSh2Z2Fpb19yZWdzICsgYyArIChvbl96b3JybzIgPyAwIDogMHgwMDBlMDAwMCkpKSkpOworCXByaW50aygicGNpIDB4JTIuMnggOiAweCU4Ljh4XG4iLCBjLCBsKTsKKwljID0gMHgwZDsKKwliID0gKCooKHU4ICopKCh1MzIpKHZnYWlvX3JlZ3MgKyBjICsgKG9uX3pvcnJvMiA/IDAgOiAweDAwMGUwMDAwKSkgXiAzKSkpOworCXByaW50aygicGNpIDB4JTIuMnggOiAweCUyLjJ4XG4iLCBjLCBiKTsKKwljID0gMHgxMDsKKwlsID0gKCooKHUzMiAqKSgodTMyKSh2Z2Fpb19yZWdzICsgYyArIChvbl96b3JybzIgPyAwIDogMHgwMDBlMDAwMCkpKSkpOworCXByaW50aygicGNpIDB4JTIuMnggOiAweCU4Ljh4XG4iLCBjLCBsKTsKKwljID0gMHgzMDsKKwlsID0gKCooKHUzMiAqKSgodTMyKSh2Z2Fpb19yZWdzICsgYyArIChvbl96b3JybzIgPyAwIDogMHgwMDBlMDAwMCkpKSkpOworCXByaW50aygicGNpIDB4JTIuMnggOiAweCU4Ljh4XG4iLCBjLCBsKTsKKwljID0gMHgzYzsKKwliID0gKCooKHU4ICopKCh1MzIpKHZnYWlvX3JlZ3MgKyBjICsgKG9uX3pvcnJvMiA/IDAgOiAweDAwMGUwMDAwKSkgXiAzKSkpOworCXByaW50aygicGNpIDB4JTIuMnggOiAweCUyLjJ4XG4iLCBjLCBiKTsKKwljID0gMHgzZDsKKwliID0gKCooKHU4ICopKCh1MzIpKHZnYWlvX3JlZ3MgKyBjICsgKG9uX3pvcnJvMiA/IDAgOiAweDAwMGUwMDAwKSkgXiAzKSkpOworCXByaW50aygicGNpIDB4JTIuMnggOiAweCUyLjJ4XG4iLCBjLCBiKTsKKwljID0gMHgzZTsKKwl3ID0gKCooKHUxNiAqKSgodTMyKSh2Z2Fpb19yZWdzICsgYyArIChvbl96b3JybzIgPyAwIDogMHgwMDBlMDAwMCkpIF4gMikpKTsKKwlwcmludGsoInBjaSAweCUyLjJ4IDogMHglNC40eFxuIiwgYywgdyk7CisJU2VsZWN0TU1JTzsKK30KKyNlbmRpZgo=