LyoKICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBMb3RzIG9mIGNvZGUgY29waWVkIGZyb206CiAqCiAqIG04eHhfcGNtY2lhLmMgLSBMaW51eCBQQ01DSUEgc29ja2V0IGRyaXZlciBmb3IgdGhlIG1wYzh4eCBzZXJpZXMuCiAqIChDKSAxOTk5LTIwMDAgTWFnbnVzIERhbW0gPGRhbW1AYml0c21hcnQuY29tPgogKgogKiAiVGhlIEV4Q0Egc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgc29ja2V0IGNvbnRyb2xsZXJzIHNob3VsZCBwcm92aWRlCiAqIHR3byBJTyBhbmQgZml2ZSBtZW1vcnkgd2luZG93cyBwZXIgc29ja2V0LCB3aGljaCBjYW4gYmUgaW5kZXBlbmRlbnRseQogKiBjb25maWd1cmVkIGFuZCBwb3NpdGlvbmVkIGluIHRoZSBob3N0IGFkZHJlc3Mgc3BhY2UgYW5kIG1hcHBlZCB0bwogKiBhcmJpdHJhcnkgc2VnbWVudHMgb2YgY2FyZCBhZGRyZXNzIHNwYWNlLiAiIC0gRGF2aWQgQSBIaW5kcy4gMTk5OQogKgogKiBUaGlzIGNvbnRyb2xsZXIgZG9lcyBfbm90XyBtZWV0IHRoZSBFeENBIHN0YW5kYXJkLgogKgogKiBtOHh4IHBjbWNpYSBjb250cm9sbGVyIGJyaWVmIGluZm86CiAqICsgOCB3aW5kb3dzIChhdHRyaWIsIG1lbSwgaS9vKQogKiArIHVwIHRvIHR3byBzbG90cyAoU0xPVF9BIGFuZCBTTE9UX0IpCiAqICsgaW5wdXRwaW5zLCBvdXRwdXRwaW5zLCBldmVudCBhbmQgbWFzayByZWdpc3RlcnMuCiAqIC0gbm8gb2Zmc2V0IHJlZ2lzdGVyLiBzaWdoLgogKgogKiBCZWNhdXNlIG9mIHRoZSBsYWNraW5nIG9mZnNldCByZWdpc3RlciB3ZSBtdXN0IG1hcCB0aGUgd2hvbGUgY2FyZC4KICogV2UgYXNzaWduIGVhY2ggbWVtb3J5IHdpbmRvdyBQQ01DSUFfTUVNX1dJTl9TSVpFIGFkZHJlc3Mgc3BhY2UuCiAqIE1ha2Ugc3VyZSB0aGVyZSBpcyAoUENNQ0lBX01FTV9XSU5fU0laRSAqIFBDTUNJQV9NRU1fV0lOX05PCiAqICogUENNQ0lBX1NPQ0tFVFNfTk8pIGJ5dGVzIGF0IFBDTUNJQV9NRU1fV0lOX0JBU0UuCiAqIFRoZSBpL28gd2luZG93cyBhcmUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGF0IFBDTUNJQV9JT19XSU5fQkFTRS4KICogVGhleSBhcmUgbWF4aW11bSA2NEtCeXRlIGVhY2guLi4KICovCgoKI3VuZGVmIERFQlVHCQkvKiovCgovKgogKiBQQ01DSUEgc3VwcG9ydAogKi8KI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8Y29tbWFuZC5oPgojaW5jbHVkZSA8Y29uZmlnLmg+CiNpbmNsdWRlIDxwY2kuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgoKI2luY2x1ZGUgPHBjbWNpYS5oPgoKI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpKSAmJiBkZWZpbmVkKENPTkZJR19JREVfVElfQ0FSREJVUykKCmludCBwY21jaWFfb24oaW50IGlkZV9iYXNlX2J1cyk7CgpzdGF0aWMgaW50ICBwY21jaWFfb2ZmKHZvaWQpOwpzdGF0aWMgaW50ICBoYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KTsKc3RhdGljIGludCAgaGFyZHdhcmVfZW5hYmxlKGludCBzbG90KTsKc3RhdGljIGludCAgdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApOwpzdGF0aWMgdm9pZCBwcmludF9mdW5jaWQoaW50IGZ1bmMpOwpzdGF0aWMgdm9pZCBwcmludF9maXhlZCh2b2xhdGlsZSB1Y2hhciAqcCk7CnN0YXRpYyBpbnQgIGlkZW50aWZ5KHZvbGF0aWxlIHVjaGFyICpwKTsKc3RhdGljIGludCAgY2hlY2tfaWRlX2RldmljZShpbnQgc2xvdCwgaW50IGlkZV9iYXNlX2J1cyk7CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCmNvbnN0IGNoYXIgKmluZGVudCA9ICJcdCAgICI7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoKaW50IGRvX3Bpbml0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CiNpZm5kZWYgQ0ZHX0ZJUlNUX1BDTUNJQV9CVVMKIyBkZWZpbmUgQ0ZHX0ZJUlNUX1BDTUNJQV9CVVMgMAojZW5kaWYKCglpbnQgcmNvZGUgPSAwOwoKCWlmIChhcmdjICE9IDIpIHsKCQlwcmludGYgKCJVc2FnZTogcGluaXQge29uIHwgb2ZmfVxuIik7CgkJcmV0dXJuIDE7Cgl9CglpZiAoc3RyY21wKGFyZ3ZbMV0sIm9uIikgPT0gMCkgewoJCXJjb2RlID0gcGNtY2lhX29uKENGR19GSVJTVF9QQ01DSUFfQlVTKTsKCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sIm9mZiIpID09IDApIHsKCQlyY29kZSA9IHBjbWNpYV9vZmYoKTsKCX0gZWxzZSB7CgkJcHJpbnRmICgiVXNhZ2U6IHBpbml0IHtvbiB8IG9mZn1cbiIpOwoJCXJldHVybiAxOwoJfQoKCXJldHVybiByY29kZTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzdXBwb3J0ZWRbXSA9IHsKCXsgUENJX1ZFTkRPUl9JRF9USSwgMHhhYzUwIH0sIC8qIFRpIFBDSTE0MTBBICovCgl7IFBDSV9WRU5ET1JfSURfVEksIDB4YWM1NiB9LCAvKiBUaSBQQ0kxNTEwICovCgl7IH0KfTsKCnN0YXRpYyBwY2lfZGV2X3QgZGV2YnVzZm47CnN0YXRpYyB1MzIgc29ja2V0X2Jhc2U7CnN0YXRpYyB1MzIgcGNtY2lhX2Npc19wdHI7CgppbnQgcGNtY2lhX29uKGludCBpZGVfYmFzZV9idXMpCnsKCXUxNiBkZXZfaWQ7Cgl1MzIgc29ja2V0X3N0YXR1czsKCWludCBzbG90ID0gMDsKCWludCBjaXNfbGVuOwoJdTE2IGlvX2Jhc2U7Cgl1MTYgaW9fbGVuOwoKCS8qCgkgKiBGaW5kIHRoZSBDYXJkQnVzIFBDSSBkZXZpY2UocykuCgkgKi8KCWlmICgoZGV2YnVzZm4gPSBwY2lfZmluZF9kZXZpY2VzKHN1cHBvcnRlZCwgMCkpIDwgMCkgewoJCXByaW50ZigiVGkgQ2FyZEJ1czogbm90IGZvdW5kXG4iKTsKCQlyZXR1cm4gMTsKCX0KCglwY2lfcmVhZF9jb25maWdfd29yZChkZXZidXNmbiwgUENJX0RFVklDRV9JRCwgJmRldl9pZCk7CgoJaWYgKGRldl9pZCA9PSAweGFjNTYpIHsKCQlkZWJ1ZygiRW5hYmxlIFBDTUNJQSBUaSBQQ0kxNTEwXG4iKTsKCX0gZWxzZSB7CgkJZGVidWcoIkVuYWJsZSBQQ01DSUEgVGkgUENJMTQxMEFcbiIpOwoJfQoKCXBjbWNpYV9jaXNfcHRyID0gQ0ZHX1BDTUNJQV9DSVNfV0lOOwoJY2lzX2xlbiA9IENGR19QQ01DSUFfQ0lTX1dJTl9TSVpFOwoKCWlvX2Jhc2UgPSBDRkdfUENNQ0lBX0lPX1dJTjsKCWlvX2xlbiA9IENGR19QQ01DSUFfSU9fV0lOX1NJWkU7CgoJLyoKCSAqIFNldHVwIHRoZSBQQ0kgZGV2aWNlLgoJICovCglwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2YnVzZm4sIFBDSV9CQVNFX0FERFJFU1NfMCwgJnNvY2tldF9iYXNlKTsKCXNvY2tldF9iYXNlICY9IH4weGY7CgoJc29ja2V0X3N0YXR1cyA9IHJlYWRsKHNvY2tldF9iYXNlKzgpOwoJaWYgKChzb2NrZXRfc3RhdHVzICYgNikgPT0gMCkgewoJCXByaW50ZigiQ2FyZCBQcmVzZW50OiAiKTsKCgkJc3dpdGNoIChzb2NrZXRfc3RhdHVzICYgMHgzYzAwKSB7CgoJCWNhc2UgMHg0MDA6CgkJCXByaW50ZigiNVYgIik7CgkJCWJyZWFrOwoJCWNhc2UgMHg4MDA6CgkJCXByaW50ZigiMy4zViAiKTsKCQkJYnJlYWs7CgkJY2FzZSAweGMwMDoKCQkJcHJpbnRmKCIzLjMvNVYgIik7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXByaW50ZigidW5zdXBwb3J0ZWQgVmNjICIpOwoJCQlicmVhazsKCQl9CgkJc3dpdGNoIChzb2NrZXRfc3RhdHVzICYgMHgzMCkgewoJCWNhc2UgMHgxMDoKCQkJcHJpbnRmKCIxNmJpdCBQQy1DYXJkXG4iKTsKCQkJYnJlYWs7CgkJY2FzZSAweDIwOgoJCQlwcmludGYoIjMyYml0IENhcmRCdXMgQ2FyZFxuIik7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXByaW50ZigiOGJpdCBQQy1DYXJkXG4iKTsKCQkJYnJlYWs7CgkJfQoJfQoKCgl3cml0ZWIoMHg0MSwgc29ja2V0X2Jhc2UgKyAweDgwNik7IC8qIEVuYWJsZSBJL08gd2luZG93IDAgYW5kIG1lbW9yeSB3aW5kb3cgMCAqLwoJd3JpdGViKDB4MGUsIHNvY2tldF9iYXNlICsgMHg4MDcpOyAvKiBSZXNldCBJL08gd2luZG93IG9wdGlvbnMgKi8KCgkvKiBDYXJlZnVsOiB0aGUgbGludXggeWVudGEgZHJpdmVyIGRvIG5vdCBzZWVtIHRvIHJlc2V0IHRoZSBvZmZzZXQKCSAqIGluIHRoZSBpL28gd2luZG93cywgc28gbGVhdmluZyB0aGVtIG5vbi16ZXJvIGlzIGEgcHJvYmxlbSAqLwoKCXdyaXRlYihpb19iYXNlICYgMHhmZiwgc29ja2V0X2Jhc2UgKyAweDgwOCk7IC8qIEkvTyB3aW5kb3cgMCBiYXNlIGFkZHJlc3MgKi8KCXdyaXRlYihpb19iYXNlPj44LCBzb2NrZXRfYmFzZSArIDB4ODA5KTsKCXdyaXRlYigoaW9fYmFzZSArIGlvX2xlbiAtIDEpICYgMHhmZiwgc29ja2V0X2Jhc2UgKyAweDgwYSk7IC8qIEkvTyB3aW5kb3cgMCBlbmQgYWRkcmVzcyAqLwoJd3JpdGViKChpb19iYXNlICsgaW9fbGVuIC0gMSk+PjgsIHNvY2tldF9iYXNlICsgMHg4MGIpOwoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MzYpOyAgICAgIC8qIEkvTyB3aW5kb3cgMCBvZmZzZXQgYWRkcmVzcyAweDAwMCAqLwoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MzcpOwoKCgl3cml0ZWIoKHBjbWNpYV9jaXNfcHRyJjB4MDAwZmYwMDApID4+IDEyLAoJICAgICAgIHNvY2tldF9iYXNlICsgMHg4MTApOyAvKiBNZW1vcnkgd2luZG93IDAgc3RhcnQgYWRkcmVzcyBiaXRzIDE5LTEyICovCgl3cml0ZWIoKHBjbWNpYV9jaXNfcHRyJjB4MDBmMDAwMDApID4+IDIwLAoJICAgICAgIHNvY2tldF9iYXNlICsgMHg4MTEpOyAgLyogTWVtb3J5IHdpbmRvdyAwIHN0YXJ0IGFkZHJlc3MgYml0cyAyMy0yMCAqLwoJd3JpdGViKCgocGNtY2lhX2Npc19wdHIrY2lzX2xlbi0xKSAmIDB4MDAwZmYwMDApID4+IDEyLAoJCXNvY2tldF9iYXNlICsgMHg4MTIpOyAvKiBNZW1vcnkgd2luZG93IDAgZW5kIGFkZHJlc3MgYml0cyAxOS0xMiovCgl3cml0ZWIoKChwY21jaWFfY2lzX3B0citjaXNfbGVuLTEpICYgMHgwMGYwMDAwMCkgPj4gMjAsCgkJc29ja2V0X2Jhc2UgKyAweDgxMyk7IC8qIE1lbW9yeSB3aW5kb3cgMCBlbmQgYWRkcmVzcyBiaXRzIDIzLTIwKi8KCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODE0KTsgLyogTWVtb3J5IHdpbmRvdyAwIG9mZnNldCBiaXRzIDE5LTEyICovCgl3cml0ZWIoMHg0MCwgc29ja2V0X2Jhc2UgKyAweDgxNSk7IC8qIE1lbW9yeSB3aW5kb3cgMCBvZmZzZXQgYml0cyAyMy0yMCBhbmQKCQkJCQkgICAgKiBvcHRpb25zIChyZWFkL3dyaXRlLCBhdHRyaWJ1dGUgYWNjZXNzKSAqLwoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MTYpOyAvKiBFeENBIGNhcmQtZGV0ZWN0IGFuZCBnZW5lcmFsIGNvbnRyb2wgICovCgl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgxZSk7IC8qIEV4Q0EgZ2xvYmFsIGNvbnRyb2wgKGludGVycnVwdCBtb2RlcykgKi8KCgl3cml0ZWIoKHBjbWNpYV9jaXNfcHRyICYgMHhmZjAwMDAwMCkgPj4gMjQsCgkgICAgICAgc29ja2V0X2Jhc2UgKyAweDg0MCk7IC8qIE1lbW9yeSB3aW5kb3cgYWRkcmVzcyBiaXRzIDMxLTI0ICovCgoKCS8qIHR1cm4gb2ZmIHZvbHRhZ2UgKi8KCWlmICh2b2x0YWdlX3NldChzbG90LCAwLCAwKSkgewoJCXJldHVybiAxOwoJfQoKCS8qIEVuYWJsZSBleHRlcm5hbCBoYXJkd2FyZSAqLwoJaWYgKGhhcmR3YXJlX2VuYWJsZShzbG90KSkgewoJCXJldHVybiAxOwoJfQoKCWlmIChjaGVja19pZGVfZGV2aWNlKHNsb3QsIGlkZV9iYXNlX2J1cykpIHsKCQlyZXR1cm4gMTsKCX0KCglyZXR1cm4gMDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCnN0YXRpYyBpbnQgcGNtY2lhX29mZiAodm9pZCkKewoJaW50IHNsb3QgPSAwOwoKCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODA2KTsgLyogZGlzYWJsZSBhbGwgSS9PIGFuZCBtZW1vcnkgd2luZG93cyAqLwoKCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODA4KTsgLyogSS9PIHdpbmRvdyAwIGJhc2UgYWRkcmVzcyAqLwoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MDkpOwoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MGEpOyAvKiBJL08gd2luZG93IDAgZW5kIGFkZHJlc3MgKi8KCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODBiKTsKCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODM2KTsgLyogSS9PIHdpbmRvdyAwIG9mZnNldCBhZGRyZXNzICAqLwoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MzcpOwoKCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODBjKTsgLyogSS9PIHdpbmRvdyAxIGJhc2UgYWRkcmVzcyAgKi8KCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODBkKTsKCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODBlKTsgLyogSS9PIHdpbmRvdyAxIGVuZCBhZGRyZXNzICAqLwoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MGYpOwoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MzgpOyAvKiBJL08gd2luZG93IDEgb2Zmc2V0IGFkZHJlc3MgICovCgl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgzOSk7CgoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MTApOyAvKiBNZW1vcnkgd2luZG93IDAgc3RhcnQgYWRkcmVzcyAqLwoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MTEpOwoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MTIpOyAvKiBNZW1vcnkgd2luZG93IDAgZW5kIGFkZHJlc3MgICovCgl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgxMyk7Cgl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgxNCk7IC8qIE1lbW9yeSB3aW5kb3cgMCBvZmZzZXQgKi8KCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODE1KTsKCgl3cml0ZWIoMHhjMCwgc29ja2V0X2Jhc2UgKyAweDg0MCk7IC8qIE1lbW9yeSB3aW5kb3cgMCBwYWdlIGFkZHJlc3MgKi8KCgoJLyogdHVybiBvZmYgdm9sdGFnZSAqLwoJdm9sdGFnZV9zZXQoc2xvdCwgMCwgMCk7CgoJLyogZGlzYWJsZSBleHRlcm5hbCBoYXJkd2FyZSAqLwoJcHJpbnRmICgiU2h1dGRvd24gYW5kIFBvd2Vyb2ZmIFRpIFBDSTE0MTBBXG4iKTsKCWhhcmR3YXJlX2Rpc2FibGUoc2xvdCk7CgoJcmV0dXJuIDA7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoKI2RlZmluZQlNQVhfVFVQRUxfU1oJNTEyCiNkZWZpbmUgTUFYX0ZFQVRVUkVTCTQKaW50IGlkZV9kZXZpY2VzX2ZvdW5kOwpzdGF0aWMgaW50IGNoZWNrX2lkZV9kZXZpY2UoaW50IHNsb3QsIGludCBpZGVfYmFzZV9idXMpCnsKCXZvbGF0aWxlIHVjaGFyICppZGVudCA9IE5VTEw7Cgl2b2xhdGlsZSB1Y2hhciAqZmVhdHVyZV9wW01BWF9GRUFUVVJFU107Cgl2b2xhdGlsZSB1Y2hhciAqcCwgKnN0YXJ0OwoJaW50IG5fZmVhdHVyZXMgPSAwOwoJdWNoYXIgZnVuY19pZCA9IH4wOwoJdWNoYXIgY29kZSwgbGVuOwoJdXNob3J0IGNvbmZpZ19iYXNlID0gMDsKCWludCBmb3VuZCA9IDA7CglpbnQgaTsKCXUzMiBzb2NrZXRfc3RhdHVzOwoKCWRlYnVnICgiUENNQ0lBIE1FTTogJTA4WFxuIiwgcGNtY2lhX2Npc19wdHIpOwoKCXNvY2tldF9zdGF0dXMgPSByZWFkbChzb2NrZXRfYmFzZSs4KTsKCglpZiAoKHNvY2tldF9zdGF0dXMgJiA2KSAhPSAwIHx8IChzb2NrZXRfc3RhdHVzICYgMHgyMCkgIT0gMCkgewoJCXByaW50Zigibm8gY2FyZCBvciBDYXJkQnVzIGNhcmRcbiIpOwoJCXJldHVybiAxOwoJfQoKCXN0YXJ0ID0gcCA9ICh2b2xhdGlsZSB1Y2hhciAqKSBwY21jaWFfY2lzX3B0cjsKCgl3aGlsZSAoKHAgLSBzdGFydCkgPCBNQVhfVFVQRUxfU1opIHsKCgkJY29kZSA9ICpwOyBwICs9IDI7CgoJCWlmIChjb2RlID09IDB4RkYpIHsgLyogRW5kIG9mIGNoYWluICovCgkJCWJyZWFrOwoJCX0KCgkJbGVuID0gKnA7IHAgKz0gMjsKI2lmIGRlZmluZWQoREVCVUcpICYmIChERUJVRyA+IDEpCgkJewoJCQl2b2xhdGlsZSB1Y2hhciAqcSA9IHA7CgkJCXByaW50ZiAoIlxuVHVwbGUgY29kZSAlMDJ4ICBsZW5ndGggJWRcblx0RGF0YToiLAoJCQkJY29kZSwgbGVuKTsKCgkJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgewoJCQkJcHJpbnRmICgiICUwMngiLCAqcSk7CgkJCQlxKz0gMjsKCQkJfQoJCX0KI2VuZGlmCS8qIERFQlVHICovCgkJc3dpdGNoIChjb2RlKSB7CgkJY2FzZSBDSVNUUExfVkVSU18xOgoJCQlpZGVudCA9IHAgKyA0OwoJCQlicmVhazsKCQljYXNlIENJU1RQTF9GVU5DSUQ6CgkJCS8qIEZpeCBmb3IgYnJva2VuIFNhbkRpc2sgd2hpY2ggbWF5IGhhdmUgMHg4MCBiaXQgc2V0ICovCgkJCWZ1bmNfaWQgPSAqcCAmIDB4N0Y7CgkJCWJyZWFrOwoJCWNhc2UgQ0lTVFBMX0ZVTkNFOgoJCQlpZiAobl9mZWF0dXJlcyA8IE1BWF9GRUFUVVJFUykKCQkJCWZlYXR1cmVfcFtuX2ZlYXR1cmVzKytdID0gcDsKCQkJYnJlYWs7CgkJY2FzZSBDSVNUUExfQ09ORklHOgoJCQljb25maWdfYmFzZSA9ICgqKHArNikgPDwgOCkgKyAoKihwKzQpKTsKCQkJZGVidWcgKCJcbiMjIENvbmZpZ19iYXNlID0gJTA0eCAjIyNcbiIsIGNvbmZpZ19iYXNlKTsKCQlkZWZhdWx0OgoJCQlicmVhazsKCQl9CgkJcCArPSAyICogbGVuOwoJfQoKCWZvdW5kID0gaWRlbnRpZnkoaWRlbnQpOwoKCWlmIChmdW5jX2lkICE9ICgodWNoYXIpfjApKSB7CgkJcHJpbnRfZnVuY2lkIChmdW5jX2lkKTsKCgkJaWYgKGZ1bmNfaWQgPT0gQ0lTVFBMX0ZVTkNJRF9GSVhFRCkKCQkJZm91bmQgPSAxOwoJCWVsc2UKCQkJcmV0dXJuIDE7CS8qIG5vIGRpc2sgZHJpdmUgKi8KCX0KCglmb3IgKGk9MDsgaTxuX2ZlYXR1cmVzOyArK2kpIHsKCQlwcmludF9maXhlZChmZWF0dXJlX3BbaV0pOwoJfQoKCWlmICghZm91bmQpIHsKCQlwcmludGYoInVua25vd24gY2FyZCB0eXBlXG4iKTsKCQlyZXR1cm4gMTsKCX0KCgkvKiBzZWxlY3QgY29uZmlnIGluZGV4IDEgKi8KCXdyaXRlYigxLCBwY21jaWFfY2lzX3B0ciArIGNvbmZpZ19iYXNlKTsKCiNpZiAwCglwcmludGYoIkNvbmZpdXJhdGlvbiBPcHRpb24gUmVnaXN0ZXI6ICUwMnhcbiIsIHJlYWRiKHBjbWNpYV9jaXNfcHRyICsgY29uZmlnX2Jhc2UpKTsKCXByaW50ZigiQ2FyZCBDb25maXVyYXRpb24gYW5kIFN0YXR1cyBSZWdpc3RlcjogJTAyeFxuIiwgcmVhZGIocGNtY2lhX2Npc19wdHIgKyBjb25maWdfYmFzZSArIDIpKTsKCXByaW50ZigiUGluIFJlcGxhY2VtZW50IFJlZ2lzdGVyIFJlZ2lzdGVyOiAlMDJ4XG4iLCByZWFkYihwY21jaWFfY2lzX3B0ciArIGNvbmZpZ19iYXNlICsgNCkpOwoJcHJpbnRmKCJTb2NrZXQgYW5kIENvcHkgUmVnaXN0ZXI6ICUwMnhcbiIsIHJlYWRiKHBjbWNpYV9jaXNfcHRyICsgY29uZmlnX2Jhc2UgKyA2KSk7CiNlbmRpZgoJaWRlX2RldmljZXNfZm91bmQgfD0gKDEgPDwgKHNsb3QraWRlX2Jhc2VfYnVzKSk7CgoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW50IHZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQp7Cgl1MzIgc29ja2V0X2NvbnRyb2w7CglpbnQgcmVnPTA7CgoJc3dpdGNoIChzbG90KSB7CgljYXNlIDA6CgkJcmVnID0gc29ja2V0X2Jhc2UgKyAweDEwOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gMTsKCX0KCglzb2NrZXRfY29udHJvbCA9IDA7CgoKCXN3aXRjaCAodmNjKSB7CgljYXNlIDUwOgoJCXNvY2tldF9jb250cm9sIHw9IDB4MjA7CgkJYnJlYWs7CgljYXNlIDMzOgoJCXNvY2tldF9jb250cm9sIHw9IDB4MzA7CgkJYnJlYWs7CgljYXNlIDA6CglkZWZhdWx0OgoJfQoKCXN3aXRjaCAodnBwKSB7CgljYXNlIDEyMDoKCQlzb2NrZXRfY29udHJvbCB8PSAweDE7CgkJYnJlYWs7CgljYXNlIDUwOgoJCXNvY2tldF9jb250cm9sIHw9IDB4MjsKCQlicmVhazsKCWNhc2UgMzM6CgkJc29ja2V0X2NvbnRyb2wgfD0gMHgzOwoJCWJyZWFrOwoJY2FzZSAwOgoJZGVmYXVsdDoKCX0KCgl3cml0ZWwoc29ja2V0X2NvbnRyb2wsIHJlZyk7CgoJZGVidWcgKCJ2b2x0YWdlX3NldDogVGkgUENJMTQxMEEgU2xvdCAlZCwgVmNjPSVkLiVkLCBWcHA9JWQuJWRcbiIsCgkJc2xvdCwgdmNjLzEwLCB2Y2MlMTAsIHZwcC8xMCwgdnBwJTEwKTsKCgl1ZGVsYXkoNTAwKTsKCXJldHVybiAwOwp9CgoKc3RhdGljIGludCBoYXJkd2FyZV9lbmFibGUoaW50IHNsb3QpCnsKCXUzMiBzb2NrZXRfc3RhdHVzOwoJdTE2IGJyZ19jdHJsOwoJaW50IGlzXzgyMzY1c2w7CgoJc29ja2V0X3N0YXR1cyA9IHJlYWRsKHNvY2tldF9iYXNlKzgpOwoKCWlmICgoc29ja2V0X3N0YXR1cyAmIDYpID09IDApIHsKCgkJc3dpdGNoIChzb2NrZXRfc3RhdHVzICYgMHgzYzAwKSB7CgoJCWNhc2UgMHg0MDA6CgkJCXByaW50ZigiNVYgIik7CgkJCXZvbHRhZ2Vfc2V0KHNsb3QsIDUwLCAwKTsKCQkJYnJlYWs7CgkJY2FzZSAweDgwMDoKCQkJdm9sdGFnZV9zZXQoc2xvdCwgMzMsIDApOwoJCQlicmVhazsKCQljYXNlIDB4YzAwOgoJCQl2b2x0YWdlX3NldChzbG90LCAzMywgMCk7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXZvbHRhZ2Vfc2V0KHNsb3QsIDAsIDApOwoJCQlicmVhazsKCQl9Cgl9IGVsc2UgewoJCXZvbHRhZ2Vfc2V0KHNsb3QsIDAsIDApOwoJfQoKCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldmJ1c2ZuLCBQQ0lfQlJJREdFX0NPTlRST0wsICZicmdfY3RybCk7CglicmdfY3RybCAmPSB+UENJX0JSSURHRV9DVExfQlVTX1JFU0VUOwoJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldmJ1c2ZuLCBQQ0lfQlJJREdFX0NPTlRST0wsIGJyZ19jdHJsKTsKCWlzXzgyMzY1c2wgPSAoKHJlYWRiKHNvY2tldF9iYXNlKzB4ODAwKSAmIDB4MGYpID09IDIpOwoJd3JpdGViKGlzXzgyMzY1c2w/MHg5MDoweDk4LCBzb2NrZXRfYmFzZSsweDgwMik7Cgl3cml0ZWIoMHg2Nywgc29ja2V0X2Jhc2UrMHg4MDMpOwoJdWRlbGF5KDEwMDAwMCk7CiNpZiAwCglwcmludGYoIkV4Q0EgSWQgJTAyeCwgQ2FyZCBTdGF0dXMgJTAyeCwgUG93ZXIgY29uZmlnICUwMngsIEludGVycnVwdCBDb25maWcgJTAyeCwgYnJpZGdlIGNvbnRyb2wgJTA0eCAlZFxuIiwKCSAgICAgICByZWFkYihzb2NrZXRfYmFzZSsweDgwMCksIHJlYWRiKHNvY2tldF9iYXNlKzB4ODAxKSwKCSAgICAgICByZWFkYihzb2NrZXRfYmFzZSsweDgwMiksIHJlYWRiKHNvY2tldF9iYXNlKzB4ODAzKSwgYnJnX2N0cmwsIGlzXzgyMzY1c2wpOwojZW5kaWYKCglyZXR1cm4gKChyZWFkYihzb2NrZXRfYmFzZSsweDgwMSkmMHg2Yyk9PTB4NmMpPzA6MTsKfQoKCnN0YXRpYyBpbnQgaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKewoJdm9sdGFnZV9zZXQoc2xvdCwgMCwgMCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgcHJpbnRfZnVuY2lkKGludCBmdW5jKQp7CglwdXRzKGluZGVudCk7Cglzd2l0Y2ggKGZ1bmMpIHsKCWNhc2UgQ0lTVFBMX0ZVTkNJRF9NVUxUSToKCQlwdXRzKCIgTXVsdGktRnVuY3Rpb24iKTsKCQlicmVhazsKCWNhc2UgQ0lTVFBMX0ZVTkNJRF9NRU1PUlk6CgkJcHV0cygiIE1lbW9yeSIpOwoJCWJyZWFrOwoJY2FzZSBDSVNUUExfRlVOQ0lEX1NFUklBTDoKCQlwdXRzKCIgU2VyaWFsIFBvcnQiKTsKCQlicmVhazsKCWNhc2UgQ0lTVFBMX0ZVTkNJRF9QQVJBTExFTDoKCQlwdXRzKCIgUGFyYWxsZWwgUG9ydCIpOwoJCWJyZWFrOwoJY2FzZSBDSVNUUExfRlVOQ0lEX0ZJWEVEOgoJCXB1dHMoIiBGaXhlZCBEaXNrIik7CgkJYnJlYWs7CgljYXNlIENJU1RQTF9GVU5DSURfVklERU86CgkJcHV0cygiIFZpZGVvIEFkYXB0ZXIiKTsKCQlicmVhazsKCWNhc2UgQ0lTVFBMX0ZVTkNJRF9ORVRXT1JLOgoJCXB1dHMoIiBOZXR3b3JrIEFkYXB0ZXIiKTsKCQlicmVhazsKCWNhc2UgQ0lTVFBMX0ZVTkNJRF9BSU1TOgoJCXB1dHMoIiBBSU1TIENhcmQiKTsKCQlicmVhazsKCWNhc2UgQ0lTVFBMX0ZVTkNJRF9TQ1NJOgoJCXB1dHMoIiBTQ1NJIEFkYXB0ZXIiKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcHV0cygiIFVua25vd24iKTsKCQlicmVhazsKCX0KCXB1dHMoIiBDYXJkXG4iKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHZvaWQgcHJpbnRfZml4ZWQodm9sYXRpbGUgdWNoYXIgKnApCnsKCWlmIChwID09IE5VTEwpCgkJcmV0dXJuOwoKCXB1dHMoaW5kZW50KTsKCglzd2l0Y2ggKCpwKSB7CgljYXNlIENJU1RQTF9GVU5DRV9JREVfSUZBQ0U6CgkJeyAgIHVjaGFyIGlmYWNlID0gKihwKzIpOwoKCQkJcHV0cyAoKGlmYWNlID09IENJU1RQTF9JREVfSU5URVJGQUNFKSA/ICIgSURFIiA6ICIgdW5rbm93biIpOwoJCQlwdXRzICgiIGludGVyZmFjZSAiKTsKCQkJYnJlYWs7CgkJfQoJY2FzZSBDSVNUUExfRlVOQ0VfSURFX01BU1RFUjoKCWNhc2UgQ0lTVFBMX0ZVTkNFX0lERV9TTEFWRToKCQl7CgkJCXVjaGFyIGYxID0gKihwKzIpOwoJCQl1Y2hhciBmMiA9ICoocCs0KTsKCgkJCXB1dHMoKGYxICYgQ0lTVFBMX0lERV9TSUxJQ09OKSA/ICIgW3NpbGljb25dIiA6ICIgW3JvdGF0aW5nXSIpOwoKCQkJaWYgKGYxICYgQ0lTVFBMX0lERV9VTklRVUUpIHsKCQkJCXB1dHMoIiBbdW5pcXVlXSIpOwoJCQl9CgoJCQlwdXRzKChmMSAmIENJU1RQTF9JREVfRFVBTCkgPyAiIFtkdWFsXSIgOiAiIFtzaW5nbGVdIik7CgoJCQlpZiAoZjIgJiBDSVNUUExfSURFX0hBU19TTEVFUCkgewoJCQkJcHV0cygiIFtzbGVlcF0iKTsKCQkJfQoKCQkJaWYgKGYyICYgQ0lTVFBMX0lERV9IQVNfU1RBTkRCWSkgewoJCQkJcHV0cygiIFtzdGFuZGJ5XSIpOwoJCQl9CgoJCQlpZiAoZjIgJiBDSVNUUExfSURFX0hBU19JRExFKSB7CgkJCQlwdXRzKCIgW2lkbGVdIik7CgkJCX0KCgkJCWlmIChmMiAmIENJU1RQTF9JREVfTE9XX1BPV0VSKSB7CgkJCQlwdXRzKCIgW2xvdyBwb3dlcl0iKTsKCQkJfQoKCQkJaWYgKGYyICYgQ0lTVFBMX0lERV9SRUdfSU5ISUJJVCkgewoJCQkJcHV0cygiIFtyZWcgaW5oaWJpdF0iKTsKCQkJfQoKCQkJaWYgKGYyICYgQ0lTVFBMX0lERV9IQVNfSU5ERVgpIHsKCQkJCXB1dHMoIiBbaW5kZXhdIik7CgkJCX0KCgkJCWlmIChmMiAmIENJU1RQTF9JREVfSU9JUzE2KSB7CgkJCQlwdXRzKCIgW0lPaXMxNl0iKTsKCQkJfQoKCQkJYnJlYWs7CgkJfQoJfQoJcHV0YygnXG4nKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKI2RlZmluZSBNQVhfSURFTlRfQ0hBUlMJCTY0CiNkZWZpbmUJTUFYX0lERU5UX0ZJRUxEUwk0CgpzdGF0aWMgdWNoYXIgKmtub3duX2NhcmRzW10gPSB7CgkiQVJHT1NZIFBuUElERSBENSIsCglOVUxMCn07CgpzdGF0aWMgaW50IGlkZW50aWZ5KHZvbGF0aWxlIHVjaGFyICpwKQp7Cgl1Y2hhciBpZF9zdHJbTUFYX0lERU5UX0NIQVJTXTsKCXVjaGFyIGRhdGE7Cgl1Y2hhciAqdDsKCXVjaGFyICoqY2FyZDsKCWludCBpLCBkb25lOwoKCWlmIChwID09IE5VTEwpCgkJcmV0dXJuICgwKTsJLyogRG9uJ3Qga25vdyAqLwoKCXQgPSBpZF9zdHI7Cglkb25lID0wOwoKCWZvciAoaT0wOyBpPD00ICYmICFkb25lOyArK2ksIHArPTIpIHsKCQl3aGlsZSAoKGRhdGEgPSAqcCkgIT0gJ1wwJykgewoJCQlpZiAoZGF0YSA9PSAweEZGKSB7CgkJCQlkb25lID0gMTsKCQkJCWJyZWFrOwoJCQl9CgkJCSp0KysgPSBkYXRhOwoJCQlpZiAodCA9PSAmaWRfc3RyW01BWF9JREVOVF9DSEFSUy0xXSkgewoJCQkJZG9uZSA9IDE7CgkJCQlicmVhazsKCQkJfQoJCQlwICs9IDI7CgkJfQoJCWlmICghZG9uZSkKCQkJKnQrKyA9ICcgJzsKCX0KCSp0ID0gJ1wwJzsKCXdoaWxlICgtLXQgPiBpZF9zdHIpIHsKCQlpZiAoKnQgPT0gJyAnKSB7CgkJCSp0ID0gJ1wwJzsKCQl9IGVsc2UgewoJCQlicmVhazsKCQl9Cgl9CglwdXRzKGlkX3N0cik7CglwdXRjKCdcbicpOwoKCWZvciAoY2FyZD1rbm93bl9jYXJkczsgKmNhcmQ7ICsrY2FyZCkgewoJCWRlYnVnICgiIyMgQ29tcGFyZSBhZ2FpbnN0IFwiJXNcIlxuIiwgKmNhcmQpOwoJCWlmIChzdHJjbXAoKmNhcmQsIGlkX3N0cikgPT0gMCkgewkvKiBmb3VuZCEgKi8KCQkJZGVidWcgKCIjIyBDQVJEIEZPVU5EICMjXG4iKTsKCQkJcmV0dXJuIDE7CgkJfQoJfQoKCXJldHVybiAwOwkvKiBkb24ndCBrbm93ICovCn0KCiNlbmRpZiAvKiBDT05GSUdfSURFX1RJX0NBUkRCVVMgKi8K