LyogJElkOiBqYWRlLmMsdiAxLjkuMi40IDIwMDQvMDEvMTQgMTY6MDQ6NDgga2VpbCBFeHAgJAogKgogKiBKQURFIHN0dWZmIChkZXJpdmVkIGZyb20gb3JpZ2luYWwgaHNjeC5jKQogKgogKiBBdXRob3IgICAgICAgUm9sYW5kIEtsYWJ1bmRlCiAqIENvcHlyaWdodCAgICBieSBSb2xhbmQgS2xhYnVuZGUgICA8Ui5LbGFidW5kZUBCZXJrb20uZGU+CiAqIAogKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCiAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCiAqCiAqLwoKCiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlICJoaXNheC5oIgojaW5jbHVkZSAiaHNjeC5oIgojaW5jbHVkZSAiamFkZS5oIgojaW5jbHVkZSAiaXNkbmwxLmgiCiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KCgppbnQgX19pbml0CkphZGVWZXJzaW9uKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgY2hhciAqcykKewogICAgaW50IHZlcixpOwogICAgaW50IHRvID0gNTA7CiAgICBjcy0+QkNfV3JpdGVfUmVnKGNzLCAtMSwgMHg1MCwgMHgxOSk7CiAgICBpPTA7CiAgICB3aGlsZSAodG8pIHsKICAgIAl1ZGVsYXkoMSk7Cgl2ZXIgPSBjcy0+QkNfUmVhZF9SZWcoY3MsIC0xLCAweDYwKTsKCXRvLS07CglpZiAodmVyKQogICAgCSAgICBicmVhazsKCWlmICghdG8pIHsKCSAgICBwcmludGsoS0VSTl9JTkZPICIlcyBKQURFIHZlcnNpb24gbm90IG9idGFpbmFibGVcbiIsIHMpOwogICAgCSAgICByZXR1cm4gKDApOwogICAgICAgIH0KICAgIH0KICAgIC8qIFdhaXQgZm9yIHRoZSBKQURFICovCiAgICB1ZGVsYXkoMTApOwogICAgLyogUmVhZCB2ZXJzaW9uICovCiAgICB2ZXIgPSBjcy0+QkNfUmVhZF9SZWcoY3MsIC0xLCAweDYwKTsKICAgIHByaW50ayhLRVJOX0lORk8gIiVzIEpBREUgdmVyc2lvbjogJWRcbiIsIHMsIHZlcik7CiAgICByZXR1cm4gKDEpOwp9CgovKiBXcml0ZSB0byBpbmRpcmVjdCBhY2Nlc3NpYmxlIGphZGUgcmVnaXN0ZXIgc2V0ICovCnN0YXRpYyB2b2lkCmphZGVfd3JpdGVfaW5kaXJlY3Qoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCB1X2NoYXIgcmVnLCB1X2NoYXIgdmFsdWUpCnsKICAgIGludCB0byA9IDUwOwogICAgdV9jaGFyIHJldDsKCiAgICAvKiBXcml0ZSB0aGUgZGF0YSAqLwogICAgY3MtPkJDX1dyaXRlX1JlZyhjcywgLTEsIENPTU1fSkFERSsxLCB2YWx1ZSk7CiAgICAvKiBTYXkgSkFERSB3ZSB3YW5uYSB3cml0ZSBpbmRpcmVjdCByZWcgJ3JlZycgKi8KICAgIGNzLT5CQ19Xcml0ZV9SZWcoY3MsIC0xLCBDT01NX0pBREUsIHJlZyk7CiAgICB0byA9IDUwOwogICAgLyogV2FpdCBmb3IgUkRZIGdvZXMgaGlnaCAqLwogICAgd2hpbGUgKHRvKSB7CiAgICAJdWRlbGF5KDEpOwoJcmV0ID0gY3MtPkJDX1JlYWRfUmVnKGNzLCAtMSwgQ09NTV9KQURFKTsKCXRvLS07CglpZiAocmV0ICYgMSkKCSAgICAvKiBHb3QgYWNrbm93bGVkZ2UgKi8KCSAgICBicmVhazsKCWlmICghdG8pIHsKICAgIAkgICAgcHJpbnRrKEtFUk5fSU5GTyAiQ2FuIG5vdCBzZWUgcmVhZHkgYml0IGZyb20gSkFERSBEU1AgKHJlZz0weCVYLCB2YWx1ZT0weCVYKVxuIiwgcmVnLCB2YWx1ZSk7CgkgICAgcmV0dXJuOwoJfQogICAgfQp9CgoKCnN0YXRpYyB2b2lkCm1vZGVqYWRlKHN0cnVjdCBCQ1N0YXRlICpiY3MsIGludCBtb2RlLCBpbnQgYmMpCnsKICAgIHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9IGJjcy0+Y3M7CiAgICBpbnQgamFkZSA9IGJjcy0+aHcuaHNjeC5oc2N4OwoKICAgIGlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSFNDWCkgewoJY2hhciB0bXBbNDBdOwoJc3ByaW50Zih0bXAsICJqYWRlICVjIG1vZGUgJWQgaWNoYW4gJWQiLAoJCSdBJyArIGphZGUsIG1vZGUsIGJjKTsKCWRlYnVnbDEoY3MsIHRtcCk7CiAgICB9CiAgICBiY3MtPm1vZGUgPSBtb2RlOwogICAgYmNzLT5jaGFubmVsID0gYmM7CgkKICAgIGNzLT5CQ19Xcml0ZV9SZWcoY3MsIGphZGUsIGphZGVfSERMQ19NT0RFLCAobW9kZSA9PSBMMV9NT0RFX1RSQU5TID8gamFkZU1PREVfVE1POjB4MDApKTsKICAgIGNzLT5CQ19Xcml0ZV9SZWcoY3MsIGphZGUsIGphZGVfSERMQ19DQ1IwLCAoamFkZUNDUjBfUFV8amFkZUNDUjBfSVRGKSk7CiAgICBjcy0+QkNfV3JpdGVfUmVnKGNzLCBqYWRlLCBqYWRlX0hETENfQ0NSMSwgMHgwMCk7CgogICAgamFkZV93cml0ZV9pbmRpcmVjdChjcywgamFkZV9IRExDMVNFUlJYUEFUSCwgMHgwOCk7CiAgICBqYWRlX3dyaXRlX2luZGlyZWN0KGNzLCBqYWRlX0hETEMyU0VSUlhQQVRILCAweDA4KTsKICAgIGphZGVfd3JpdGVfaW5kaXJlY3QoY3MsIGphZGVfSERMQzFTRVJUWFBBVEgsIDB4MDApOwogICAgamFkZV93cml0ZV9pbmRpcmVjdChjcywgamFkZV9IRExDMlNFUlRYUEFUSCwgMHgwMCk7CgogICAgY3MtPkJDX1dyaXRlX1JlZyhjcywgamFkZSwgamFkZV9IRExDX1hDQ1IsIDB4MDcpOwogICAgY3MtPkJDX1dyaXRlX1JlZyhjcywgamFkZSwgamFkZV9IRExDX1JDQ1IsIDB4MDcpOwoKICAgIGlmIChiYyA9PSAwKSB7Cgljcy0+QkNfV3JpdGVfUmVnKGNzLCBqYWRlLCBqYWRlX0hETENfVFNBWCwgMHgwMCk7Cgljcy0+QkNfV3JpdGVfUmVnKGNzLCBqYWRlLCBqYWRlX0hETENfVFNBUiwgMHgwMCk7CiAgICB9IGVsc2UgewoJY3MtPkJDX1dyaXRlX1JlZyhjcywgamFkZSwgamFkZV9IRExDX1RTQVgsIDB4MDQpOwoJY3MtPkJDX1dyaXRlX1JlZyhjcywgamFkZSwgamFkZV9IRExDX1RTQVIsIDB4MDQpOwogICAgfQogICAgc3dpdGNoIChtb2RlKSB7CgljYXNlIChMMV9NT0RFX05VTEwpOgoJCWNzLT5CQ19Xcml0ZV9SZWcoY3MsIGphZGUsIGphZGVfSERMQ19NT0RFLCBqYWRlTU9ERV9UTU8pOwoJCWJyZWFrOwoJY2FzZSAoTDFfTU9ERV9UUkFOUyk6CgkJY3MtPkJDX1dyaXRlX1JlZyhjcywgamFkZSwgamFkZV9IRExDX01PREUsIChqYWRlTU9ERV9UTU98amFkZU1PREVfUkFDfGphZGVNT0RFX1hBQykpOwoJCWJyZWFrOwoJY2FzZSAoTDFfTU9ERV9IRExDKToKCQljcy0+QkNfV3JpdGVfUmVnKGNzLCBqYWRlLCBqYWRlX0hETENfTU9ERSwgKGphZGVNT0RFX1JBQ3xqYWRlTU9ERV9YQUMpKTsKCQlicmVhazsKICAgIH0KICAgIGlmIChtb2RlKSB7Cgljcy0+QkNfV3JpdGVfUmVnKGNzLCBqYWRlLCBqYWRlX0hETENfUkNNRCwgKGphZGVSQ01EX1JSRVN8amFkZVJDTURfUk1DKSk7Cgljcy0+QkNfV3JpdGVfUmVnKGNzLCBqYWRlLCBqYWRlX0hETENfWENNRCwgamFkZVhDTURfWFJFUyk7CgkvKiBVbm1hc2sgaW50cyAqLwoJY3MtPkJDX1dyaXRlX1JlZyhjcywgamFkZSwgamFkZV9IRExDX0lNUiwgMHhGOCk7CiAgICB9CiAgICBlbHNlCgkvKiBNYXNrIGludHMgKi8KCWNzLT5CQ19Xcml0ZV9SZWcoY3MsIGphZGUsIGphZGVfSERMQ19JTVIsIDB4MDApOwp9CgpzdGF0aWMgdm9pZApqYWRlX2wybDEoc3RydWN0IFBTdGFjayAqc3QsIGludCBwciwgdm9pZCAqYXJnKQp7CiAgICBzdHJ1Y3QgQkNTdGF0ZSAqYmNzID0gc3QtPmwxLmJjczsKICAgIHN0cnVjdCBza19idWZmICpza2IgPSBhcmc7CiAgICB1X2xvbmcgZmxhZ3M7CgogICAgc3dpdGNoIChwcikgewoJY2FzZSAoUEhfREFUQSB8IFJFUVVFU1QpOgoJCXNwaW5fbG9ja19pcnFzYXZlKCZiY3MtPmNzLT5sb2NrLCBmbGFncyk7CgkJaWYgKGJjcy0+dHhfc2tiKSB7CgkJCXNrYl9xdWV1ZV90YWlsKCZiY3MtPnNxdWV1ZSwgc2tiKTsKCQl9IGVsc2UgewoJCQliY3MtPnR4X3NrYiA9IHNrYjsKCQkJdGVzdF9hbmRfc2V0X2JpdChCQ19GTEdfQlVTWSwgJmJjcy0+RmxhZyk7CgkJCWJjcy0+aHcuaHNjeC5jb3VudCA9IDA7CgkJCWJjcy0+Y3MtPkJDX1NlbmRfRGF0YShiY3MpOwoJCX0KCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiY3MtPmNzLT5sb2NrLCBmbGFncyk7CgkJYnJlYWs7CgljYXNlIChQSF9QVUxMIHwgSU5ESUNBVElPTik6CgkJc3Bpbl9sb2NrX2lycXNhdmUoJmJjcy0+Y3MtPmxvY2ssIGZsYWdzKTsKCQlpZiAoYmNzLT50eF9za2IpIHsKCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiamFkZV9sMmwxOiB0aGlzIHNob3VsZG4ndCBoYXBwZW5cbiIpOwoJCX0gZWxzZSB7CgkJCXRlc3RfYW5kX3NldF9iaXQoQkNfRkxHX0JVU1ksICZiY3MtPkZsYWcpOwoJCQliY3MtPnR4X3NrYiA9IHNrYjsKCQkJYmNzLT5ody5oc2N4LmNvdW50ID0gMDsKCQkJYmNzLT5jcy0+QkNfU2VuZF9EYXRhKGJjcyk7CgkJfQoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJjcy0+Y3MtPmxvY2ssIGZsYWdzKTsKCQlicmVhazsKCWNhc2UgKFBIX1BVTEwgfCBSRVFVRVNUKToKCQlpZiAoIWJjcy0+dHhfc2tiKSB7CgkJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTDFfUFVMTF9SRVEsICZzdC0+bDEuRmxhZ3MpOwoJCSAgICBzdC0+bDEubDFsMihzdCwgUEhfUFVMTCB8IENPTkZJUk0sIE5VTEwpOwoJCX0gZWxzZQoJCSAgICB0ZXN0X2FuZF9zZXRfYml0KEZMR19MMV9QVUxMX1JFUSwgJnN0LT5sMS5GbGFncyk7CgkJYnJlYWs7CgljYXNlIChQSF9BQ1RJVkFURSB8IFJFUVVFU1QpOgoJCXNwaW5fbG9ja19pcnFzYXZlKCZiY3MtPmNzLT5sb2NrLCBmbGFncyk7CgkJdGVzdF9hbmRfc2V0X2JpdChCQ19GTEdfQUNUSVYsICZiY3MtPkZsYWcpOwoJCW1vZGVqYWRlKGJjcywgc3QtPmwxLm1vZGUsIHN0LT5sMS5iYyk7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmNzLT5jcy0+bG9jaywgZmxhZ3MpOwoJCWwxX21zZ19iKHN0LCBwciwgYXJnKTsKCQlicmVhazsKCWNhc2UgKFBIX0RFQUNUSVZBVEUgfCBSRVFVRVNUKToKCQlsMV9tc2dfYihzdCwgcHIsIGFyZyk7CgkJYnJlYWs7CgljYXNlIChQSF9ERUFDVElWQVRFIHwgQ09ORklSTSk6CgkJc3Bpbl9sb2NrX2lycXNhdmUoJmJjcy0+Y3MtPmxvY2ssIGZsYWdzKTsKCQl0ZXN0X2FuZF9jbGVhcl9iaXQoQkNfRkxHX0FDVElWLCAmYmNzLT5GbGFnKTsKCQl0ZXN0X2FuZF9jbGVhcl9iaXQoQkNfRkxHX0JVU1ksICZiY3MtPkZsYWcpOwoJCW1vZGVqYWRlKGJjcywgMCwgc3QtPmwxLmJjKTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiY3MtPmNzLT5sb2NrLCBmbGFncyk7CgkJc3QtPmwxLmwxbDIoc3QsIFBIX0RFQUNUSVZBVEUgfCBDT05GSVJNLCBOVUxMKTsKCQlicmVhazsKICAgIH0KfQoKc3RhdGljIHZvaWQKY2xvc2VfamFkZXN0YXRlKHN0cnVjdCBCQ1N0YXRlICpiY3MpCnsKICAgIG1vZGVqYWRlKGJjcywgMCwgYmNzLT5jaGFubmVsKTsKICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQkNfRkxHX0lOSVQsICZiY3MtPkZsYWcpKSB7CglpZiAoYmNzLT5ody5oc2N4LnJjdmJ1ZikgewoJCWtmcmVlKGJjcy0+aHcuaHNjeC5yY3ZidWYpOwoJCWJjcy0+aHcuaHNjeC5yY3ZidWYgPSBOVUxMOwoJfQoJaWYgKGJjcy0+YmxvZykgewoJCWtmcmVlKGJjcy0+YmxvZyk7CgkJYmNzLT5ibG9nID0gTlVMTDsKCX0KCXNrYl9xdWV1ZV9wdXJnZSgmYmNzLT5ycXVldWUpOwoJc2tiX3F1ZXVlX3B1cmdlKCZiY3MtPnNxdWV1ZSk7CglpZiAoYmNzLT50eF9za2IpIHsKCQlkZXZfa2ZyZWVfc2tiX2FueShiY3MtPnR4X3NrYik7CgkJYmNzLT50eF9za2IgPSBOVUxMOwoJCXRlc3RfYW5kX2NsZWFyX2JpdChCQ19GTEdfQlVTWSwgJmJjcy0+RmxhZyk7Cgl9CiAgICB9Cn0KCnN0YXRpYyBpbnQKb3Blbl9qYWRlc3RhdGUoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCBzdHJ1Y3QgQkNTdGF0ZSAqYmNzKQp7CglpZiAoIXRlc3RfYW5kX3NldF9iaXQoQkNfRkxHX0lOSVQsICZiY3MtPkZsYWcpKSB7CgkJaWYgKCEoYmNzLT5ody5oc2N4LnJjdmJ1ZiA9IGttYWxsb2MoSFNDWF9CVUZNQVgsIEdGUF9BVE9NSUMpKSkgewoJCQlwcmludGsoS0VSTl9XQVJOSU5HCgkJCSAgICAgICAiSGlTYXg6IE5vIG1lbW9yeSBmb3IgaHNjeC5yY3ZidWZcbiIpOwoJCQl0ZXN0X2FuZF9jbGVhcl9iaXQoQkNfRkxHX0lOSVQsICZiY3MtPkZsYWcpOwoJCQlyZXR1cm4gKDEpOwoJCX0KCQlpZiAoIShiY3MtPmJsb2cgPSBrbWFsbG9jKE1BWF9CTE9HX1NQQUNFLCBHRlBfQVRPTUlDKSkpIHsKCQkJcHJpbnRrKEtFUk5fV0FSTklORwoJCQkJIkhpU2F4OiBObyBtZW1vcnkgZm9yIGJjcy0+YmxvZ1xuIik7CgkJCXRlc3RfYW5kX2NsZWFyX2JpdChCQ19GTEdfSU5JVCwgJmJjcy0+RmxhZyk7CgkJCWtmcmVlKGJjcy0+aHcuaHNjeC5yY3ZidWYpOwoJCQliY3MtPmh3LmhzY3gucmN2YnVmID0gTlVMTDsKCQkJcmV0dXJuICgyKTsKCQl9CgkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYmNzLT5ycXVldWUpOwoJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmJjcy0+c3F1ZXVlKTsKCX0KCWJjcy0+dHhfc2tiID0gTlVMTDsKCXRlc3RfYW5kX2NsZWFyX2JpdChCQ19GTEdfQlVTWSwgJmJjcy0+RmxhZyk7CgliY3MtPmV2ZW50ID0gMDsKCWJjcy0+aHcuaHNjeC5yY3ZpZHggPSAwOwoJYmNzLT50eF9jbnQgPSAwOwoJcmV0dXJuICgwKTsKfQoKCnN0YXRpYyBpbnQKc2V0c3RhY2tfamFkZShzdHJ1Y3QgUFN0YWNrICpzdCwgc3RydWN0IEJDU3RhdGUgKmJjcykKewoJYmNzLT5jaGFubmVsID0gc3QtPmwxLmJjOwoJaWYgKG9wZW5famFkZXN0YXRlKHN0LT5sMS5oYXJkd2FyZSwgYmNzKSkKCQlyZXR1cm4gKC0xKTsKCXN0LT5sMS5iY3MgPSBiY3M7CglzdC0+bDIubDJsMSA9IGphZGVfbDJsMTsKCXNldHN0YWNrX21hbmFnZXIoc3QpOwoJYmNzLT5zdCA9IHN0OwoJc2V0c3RhY2tfbDFfQihzdCk7CglyZXR1cm4gKDApOwp9Cgp2b2lkIF9faW5pdApjbGVhcl9wZW5kaW5nX2phZGVfaW50cyhzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCnsKCWludCB2YWw7CgljaGFyIHRtcFs2NF07CgoJY3MtPkJDX1dyaXRlX1JlZyhjcywgMCwgamFkZV9IRExDX0lNUiwgMHgwMCk7Cgljcy0+QkNfV3JpdGVfUmVnKGNzLCAxLCBqYWRlX0hETENfSU1SLCAweDAwKTsKCgl2YWwgPSBjcy0+QkNfUmVhZF9SZWcoY3MsIDEsIGphZGVfSERMQ19JU1IpOwoJc3ByaW50Zih0bXAsICJqYWRlIEIgSVNUQSAleCIsIHZhbCk7CglkZWJ1Z2wxKGNzLCB0bXApOwoJdmFsID0gY3MtPkJDX1JlYWRfUmVnKGNzLCAwLCBqYWRlX0hETENfSVNSKTsKCXNwcmludGYodG1wLCAiamFkZSBBIElTVEEgJXgiLCB2YWwpOwoJZGVidWdsMShjcywgdG1wKTsKCXZhbCA9IGNzLT5CQ19SZWFkX1JlZyhjcywgMSwgamFkZV9IRExDX1NUQVIpOwoJc3ByaW50Zih0bXAsICJqYWRlIEIgU1RBUiAleCIsIHZhbCk7CglkZWJ1Z2wxKGNzLCB0bXApOwoJdmFsID0gY3MtPkJDX1JlYWRfUmVnKGNzLCAwLCBqYWRlX0hETENfU1RBUik7CglzcHJpbnRmKHRtcCwgImphZGUgQSBTVEFSICV4IiwgdmFsKTsKCWRlYnVnbDEoY3MsIHRtcCk7CgkvKiBVbm1hc2sgaW50cyAqLwoJY3MtPkJDX1dyaXRlX1JlZyhjcywgMCwgamFkZV9IRExDX0lNUiwgMHhGOCk7Cgljcy0+QkNfV3JpdGVfUmVnKGNzLCAxLCBqYWRlX0hETENfSU1SLCAweEY4KTsKfQoKdm9pZCBfX2luaXQKaW5pdGphZGUoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQp7Cgljcy0+YmNzWzBdLkJDX1NldFN0YWNrID0gc2V0c3RhY2tfamFkZTsKCWNzLT5iY3NbMV0uQkNfU2V0U3RhY2sgPSBzZXRzdGFja19qYWRlOwoJY3MtPmJjc1swXS5CQ19DbG9zZSA9IGNsb3NlX2phZGVzdGF0ZTsKCWNzLT5iY3NbMV0uQkNfQ2xvc2UgPSBjbG9zZV9qYWRlc3RhdGU7Cgljcy0+YmNzWzBdLmh3LmhzY3guaHNjeCA9IDA7Cgljcy0+YmNzWzFdLmh3LmhzY3guaHNjeCA9IDE7CgoJLyogU3RvcCBEU1AgYXVkaW8gdHgvcnggKi8KCWphZGVfd3JpdGVfaW5kaXJlY3QoY3MsIDB4MTEsIDB4MGYpOwoJamFkZV93cml0ZV9pbmRpcmVjdChjcywgMHgxNywgMHgyZik7CgoJLyogVHJhbnNwYXJlbnQgTW9kZSwgUnhUeCBpbmFjdGl2ZSwgTm8gVGVzdCwgTm8gUkZTL1RGUyAqLwoJY3MtPkJDX1dyaXRlX1JlZyhjcywgMCwgamFkZV9IRExDX01PREUsIGphZGVNT0RFX1RNTyk7Cgljcy0+QkNfV3JpdGVfUmVnKGNzLCAxLCBqYWRlX0hETENfTU9ERSwgamFkZU1PREVfVE1PKTsKCS8qIFBvd2VyIGRvd24sIDEtSWRsZSwgUnhUeCBsZWFzdCBzaWduaWZpY2FudCBiaXQgZmlyc3QgKi8KCWNzLT5CQ19Xcml0ZV9SZWcoY3MsIDAsIGphZGVfSERMQ19DQ1IwLCAweDAwKTsKCWNzLT5CQ19Xcml0ZV9SZWcoY3MsIDEsIGphZGVfSERMQ19DQ1IwLCAweDAwKTsKCS8qIE1hc2sgYWxsIGludGVycnVwdHMgKi8KCWNzLT5CQ19Xcml0ZV9SZWcoY3MsIDAsIGphZGVfSERMQ19JTVIsICAweDAwKTsKCWNzLT5CQ19Xcml0ZV9SZWcoY3MsIDEsIGphZGVfSERMQ19JTVIsICAweDAwKTsKCS8qIFNldHVwIGhvc3QgYWNjZXNzIHRvIGhkbGMgY29udHJvbGxlciAqLwoJamFkZV93cml0ZV9pbmRpcmVjdChjcywgamFkZV9IRExDQ05UUkFDQ0VTUywgKGphZGVJTkRJUkVDVF9IQUgxfGphZGVJTkRJUkVDVF9IQUgyKSk7CgkvKiBVbm1hc2sgSERMQyBpbnQgKGRvbrR0IGZvcmdldCBEU1AgaW50IGxhdGVyIG9uKSovCgljcy0+QkNfV3JpdGVfUmVnKGNzLCAtMSxqYWRlX0lOVCwgKGphZGVJTlRfSERMQzF8amFkZUlOVF9IRExDMikpOwoKCS8qIG9uY2UgYWdhaW4gVFJBTlNQQVJFTlQgKi8JCgltb2RlamFkZShjcy0+YmNzLCAwLCAwKTsKCW1vZGVqYWRlKGNzLT5iY3MgKyAxLCAwLCAwKTsKfQoK