LyoKICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwogKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCiAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwovKiAgTW9kdWxlIE5hbWUgOiB3d3JhcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdyYXBwZXIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKLyogUGxlYXNlIGluY2x1ZGUgeW91ciBoZWFkZXIgZmlsZXMgaGVyZSAqLwojaW5jbHVkZSAib2FsX2R0LmgiCiNpbmNsdWRlICJ1c2JkcnYuaCIKCiNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgoKZXh0ZXJuIHZvaWQgemZpUmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKZXh0ZXJuIHZvaWQgemZDb3JlUmVjdih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbyk7CmV4dGVybiB2b2lkIHpmSWRsQ2hrUnNwKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwLCB1MTZfdCByc3BMZW4pOwpleHRlcm4gdm9pZCB6ZklkbFJzcCh6ZGV2X3QqIGRldiwgdTMyX3QgKnJzcCwgdTE2X3QgcnNwTGVuKTsKCgoKLy9leHRlcm4gc3RydWN0IHpzV2RzU3RydWN0IHdkc1taTV9XRFNfUE9SVF9OVU1CRVJdOwpleHRlcm4gc3RydWN0IHpzVmFwU3RydWN0IHZhcFtaTV9WQVBfUE9SVF9OVU1CRVJdOwoKdTMyX3QgemZMbnhVc2JTdWJtaXRUeERhdGEoemRldl90KiBkZXYpOwp1MzJfdCB6ZkxueFVzYkluKHpkZXZfdCogZGV2LCB1cmJfdCAqdXJiLCB6YnVmX3QgKmJ1Zik7CnUzMl90IHpmTG54U3VibWl0UmVnSW5VcmIoemRldl90ICpkZXYpOwp1MzJfdCB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIodXJiX3QgKnVyYiwgc3RydWN0IHVzYl9kZXZpY2UgKnVzYiwgdTE2X3QgZXBudW0sIHUxNl90IGRpcmVjdGlvbiwKICAgICAgICB2b2lkICp0cmFuc2Zlcl9idWZmZXIsIGludCBidWZmZXJfbGVuZ3RoLCB1c2JfY29tcGxldGVfdCBjb21wbGV0ZSwgdm9pZCAqY29udGV4dCk7CnUzMl90IHpmTG54VXNiU3VibWl0SW50VXJiKHVyYl90ICp1cmIsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IsIHUxNl90IGVwbnVtLCB1MTZfdCBkaXJlY3Rpb24sCiAgICAgICAgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCwgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQsCiAgICAgICAgdTMyX3QgaW50ZXJ2YWwpOwoKdTE2X3QgemZMbnhHZXRGcmVlVHhVcmIoemRldl90ICpkZXYpCnsKICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKICAgIHUxNl90IGlkeDsKICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKCiAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CgogICAgLy9pZHggPSAoKG1hY3AtPlR4VXJiVGFpbCArIDEpICYgKFpNX01BWF9UWF9VUkJfTlVNIC0gMSkpOwoKICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5UeFVyYkhlYWQpCiAgICBpZiAobWFjcC0+VHhVcmJDbnQgIT0gMCkKICAgIHsKICAgICAgICBpZHggPSBtYWNwLT5UeFVyYlRhaWw7CiAgICAgICAgbWFjcC0+VHhVcmJUYWlsID0gKChtYWNwLT5UeFVyYlRhaWwgKyAxKSAmIChaTV9NQVhfVFhfVVJCX05VTSAtIDEpKTsKICAgICAgICBtYWNwLT5UeFVyYkNudC0tOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJtYWNwLT5UeFVyYkNudDogJWRcbiIsIG1hY3AtPlR4VXJiQ250KTsKICAgICAgICBpZHggPSAweGZmZmY7CiAgICB9CgogICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CiAgICByZXR1cm4gaWR4Owp9Cgp2b2lkIHpmTG54UHV0VHhVcmIoemRldl90ICpkZXYpCnsKICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKICAgIHUxNl90IGlkeDsKICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKCiAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CgogICAgaWR4ID0gKChtYWNwLT5UeFVyYkhlYWQgKyAxKSAmIChaTV9NQVhfVFhfVVJCX05VTSAtIDEpKTsKCiAgICAvL2lmIChpZHggIT0gbWFjcC0+VHhVcmJUYWlsKQogICAgaWYgKG1hY3AtPlR4VXJiQ250IDwgWk1fTUFYX1RYX1VSQl9OVU0pCiAgICB7CiAgICAgICAgbWFjcC0+VHhVcmJIZWFkID0gaWR4OwogICAgICAgIG1hY3AtPlR4VXJiQ250Kys7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcHJpbnRrKCJVc2JUeFVyYlEgaW5jb25zaXN0ZW50OiBUeFVyYkhlYWQ6ICVkLCBUeFVyYlRhaWw6ICVkXG4iLAogICAgICAgICAgICAgICAgbWFjcC0+VHhVcmJIZWFkLCBtYWNwLT5UeFVyYlRhaWwpOwogICAgfQoKICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwp9Cgp1MTZfdCB6ZkxueENoZWNrVHhCdWZmZXJDbnQoemRldl90ICpkZXYpCnsKICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKICAgIHUxNl90IFR4QnVmQ250OwogICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOwoKICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKCiAgICBUeEJ1ZkNudCA9IG1hY3AtPlR4QnVmQ250OwoKICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwogICAgcmV0dXJuIFR4QnVmQ250Owp9CgpVc2JUeFFfdCAqemZMbnhHZXRVc2JUeEJ1ZmZlcih6ZGV2X3QgKmRldikKewogICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogICAgdTE2X3QgaWR4OwogICAgVXNiVHhRX3QgKlR4UTsKICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKCiAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CgogICAgaWR4ID0gKChtYWNwLT5UeEJ1ZkhlYWQrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CgogICAgLy9pZiAoaWR4ICE9IG1hY3AtPlR4QnVmVGFpbCkKICAgIGlmIChtYWNwLT5UeEJ1ZkNudCA+IDApCiAgICB7CiAgICAgICAgLy9wcmludGsoIkNXWSAtIHpmd0dldFVzYlR4QnVmZmVyICxtYWNwLT5UeEJ1ZkNudCA9ICVkXG4iLCBtYWNwLT5UeEJ1ZkNudCk7CiAgICAgICAgVHhRID0gKFVzYlR4UV90ICopJihtYWNwLT5Vc2JUeEJ1ZlFbbWFjcC0+VHhCdWZIZWFkXSk7CiAgICAgICAgbWFjcC0+VHhCdWZIZWFkID0gKChtYWNwLT5UeEJ1ZkhlYWQrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CiAgICAgICAgbWFjcC0+VHhCdWZDbnQtLTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAobWFjcC0+VHhCdWZIZWFkICE9IG1hY3AtPlR4QnVmVGFpbCkKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiemZ3R2V0VXNiVHhCdWYgVXNiVHhCdWZRIGluY29uc2lzdGVudDogVHhCdWZIZWFkOiAlZCwgVHhCdWZUYWlsOiAlZFxuIiwKICAgICAgICAgICAgICAgICAgICBtYWNwLT5UeEJ1ZkhlYWQsIG1hY3AtPlR4QnVmVGFpbCk7CiAgICAgICAgfQoKICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKICAgIHJldHVybiBUeFE7Cn0KCnUxNl90IHpmTG54UHV0VXNiVHhCdWZmZXIoemRldl90ICpkZXYsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLAogICAgICAgIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sIHU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sCiAgICAgICAgemJ1Zl90ICpidWYsIHUxNl90IG9mZnNldCkKewogICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogICAgdTE2X3QgaWR4OwogICAgVXNiVHhRX3QgKlR4UTsKICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKCiAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CgogICAgaWR4ID0gKChtYWNwLT5UeEJ1ZlRhaWwrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CgogICAgLyogRm9yIFR4IGRlYnVnICovCiAgICAvL3ptX2Fzc2VydChtYWNwLT5UeEJ1ZkNudCA+PSAwKTsgLy8gZGVsZXRlZCBiZWNhdXNlIG9mIGFsd2F5cyB0cnVlCgogICAgLy9pZiAoaWR4ICE9IG1hY3AtPlR4QnVmSGVhZCkKICAgIGlmIChtYWNwLT5UeEJ1ZkNudCA8IFpNX01BWF9UWF9CVUZfTlVNKQogICAgewogICAgICAgIC8vcHJpbnRrKCJDV1kgLSB6ZndQdXRVc2JUeEJ1ZmZlciAsbWFjcC0+VHhCdWZDbnQgPSAlZFxuIiwgbWFjcC0+VHhCdWZDbnQpOwogICAgICAgIFR4USA9IChVc2JUeFFfdCAqKSYobWFjcC0+VXNiVHhCdWZRW21hY3AtPlR4QnVmVGFpbF0pOwogICAgICAgIG1lbWNweShUeFEtPmhkciwgaGRyLCBoZHJsZW4pOwogICAgICAgIFR4US0+aGRybGVuID0gaGRybGVuOwogICAgICAgIG1lbWNweShUeFEtPnNuYXAsIHNuYXAsIHNuYXBMZW4pOwogICAgICAgIFR4US0+c25hcExlbiA9IHNuYXBMZW47CiAgICAgICAgbWVtY3B5KFR4US0+dGFpbCwgdGFpbCwgdGFpbExlbik7CiAgICAgICAgVHhRLT50YWlsTGVuID0gdGFpbExlbjsKICAgICAgICBUeFEtPmJ1ZiA9IGJ1ZjsKICAgICAgICBUeFEtPm9mZnNldCA9IG9mZnNldDsKCiAgICAgICAgbWFjcC0+VHhCdWZUYWlsID0gKChtYWNwLT5UeEJ1ZlRhaWwrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CiAgICAgICAgbWFjcC0+VHhCdWZDbnQrKzsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBwcmludGsoS0VSTl9FUlIgInpmTG54UHV0VXNiVHhCdWZmZXIgVXNiVHhCdWZRIGluY29uc2lzdGVudDogVHhCdWZIZWFkOiAlZCwgVHhCdWZUYWlsOiAlZCwgVHhCdWZDbnQ6ICVkXG4iLAogICAgICAgICAgICBtYWNwLT5UeEJ1ZkhlYWQsIG1hY3AtPlR4QnVmVGFpbCwgbWFjcC0+VHhCdWZDbnQpOwogICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwogICAgICAgIHJldHVybiAweGZmZmY7CiAgICB9CgogICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CiAgICByZXR1cm4gMDsKfQoKemJ1Zl90ICp6ZkxueEdldFVzYlJ4QnVmZmVyKHpkZXZfdCAqZGV2KQp7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAgICAvL3UxNl90IGlkeDsKICAgIHpidWZfdCAqYnVmOwogICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOwoKICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKCiAgICAvL2lkeCA9ICgobWFjcC0+UnhCdWZIZWFkKzEpICYgKFpNX01BWF9SWF9VUkJfTlVNIC0gMSkpOwoKICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5SeEJ1ZlRhaWwpCiAgICBpZiAobWFjcC0+UnhCdWZDbnQgIT0gMCkKICAgIHsKICAgICAgICBidWYgPSBtYWNwLT5Vc2JSeEJ1ZlFbbWFjcC0+UnhCdWZIZWFkXTsKICAgICAgICBtYWNwLT5SeEJ1ZkhlYWQgPSAoKG1hY3AtPlJ4QnVmSGVhZCsxKSAmIChaTV9NQVhfUlhfVVJCX05VTSAtIDEpKTsKICAgICAgICBtYWNwLT5SeEJ1ZkNudC0tOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHByaW50aygiUnhCdWZRIGluY29uc2lzdGVudDogUnhCdWZIZWFkOiAlZCwgUnhCdWZUYWlsOiAlZFxuIiwKICAgICAgICAgICAgICAgIG1hY3AtPlJ4QnVmSGVhZCwgbWFjcC0+UnhCdWZUYWlsKTsKICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKICAgIHJldHVybiBidWY7Cn0KCnUzMl90IHpmTG54UHV0VXNiUnhCdWZmZXIoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQp7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAgICB1MTZfdCBpZHg7CiAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CgogICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwoKICAgIGlkeCA9ICgobWFjcC0+UnhCdWZUYWlsKzEpICYgKFpNX01BWF9SWF9VUkJfTlVNIC0gMSkpOwoKICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5SeEJ1ZkhlYWQpCiAgICBpZiAobWFjcC0+UnhCdWZDbnQgIT0gWk1fTUFYX1JYX1VSQl9OVU0pCiAgICB7CiAgICAgICAgbWFjcC0+VXNiUnhCdWZRW21hY3AtPlJ4QnVmVGFpbF0gPSBidWY7CiAgICAgICAgbWFjcC0+UnhCdWZUYWlsID0gaWR4OwogICAgICAgIG1hY3AtPlJ4QnVmQ250Kys7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcHJpbnRrKCJSeEJ1ZlEgaW5jb25zaXN0ZW50OiBSeEJ1ZkhlYWQ6ICVkLCBSeEJ1ZlRhaWw6ICVkXG4iLAogICAgICAgICAgICAgICAgbWFjcC0+UnhCdWZIZWFkLCBtYWNwLT5SeEJ1ZlRhaWwpOwogICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwogICAgICAgIHJldHVybiAweGZmZmY7CiAgICB9CgogICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CiAgICByZXR1cm4gMDsKfQoKdm9pZCB6ZkxueFVzYkRhdGFPdXRfY2FsbGJhY2sodXJiX3QgKnVyYikKewogICAgemRldl90KiBkZXYgPSB1cmItPmNvbnRleHQ7CiAgICAvL1VzYlR4UV90ICpUeERhdGE7CgogICAgLyogR2l2ZSB0aGUgdXJiIGJhY2sgKi8KICAgIHpmTG54UHV0VHhVcmIoZGV2KTsKCiAgICAvKiBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFueSBwZW5kaW5nIGJ1ZmZlciBuZWVkZWQgKi8KICAgIC8qIHRvIGJlIHNlbnQgKi8KICAgIGlmICh6ZkxueENoZWNrVHhCdWZmZXJDbnQoZGV2KSAhPSAwKQogICAgewogICAgICAgIC8vVHhEYXRhID0gemZ3R2V0VXNiVHhCdWZmZXIoZGV2KTsKCiAgICAgICAgLy9pZiAoVHhEYXRhID09IE5VTEwpCiAgICAgICAgLy97CiAgICAgICAgLy8gICAgcHJpbnRrKCJHZXQgYSBOVUxMIGJ1ZmZlciBmcm9tIHpmd0dldFVzYlR4QnVmZmVyXG4iKTsKICAgICAgICAvLyAgICByZXR1cm47CiAgICAgICAgLy99CiAgICAgICAgLy9lbHNlCiAgICAgICAgLy97CiAgICAgICAgICAgIHpmTG54VXNiU3VibWl0VHhEYXRhKGRldik7CiAgICAgICAgLy99CiAgICB9Cn0KCnZvaWQgemZMbnhVc2JEYXRhSW5fY2FsbGJhY2sodXJiX3QgKnVyYikKewogICAgemRldl90KiBkZXYgPSB1cmItPmNvbnRleHQ7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAgICB6YnVmX3QgKmJ1ZjsKICAgIHpidWZfdCAqbmV3X2J1ZjsKICAgIGludCBzdGF0dXM7CgojaWYgWk1fVVNCX1NUUkVBTV9NT0RFID09IDEKICAgIHN0YXRpYyBpbnQgcmVtYWluX2xlbiA9IDAsIGNoZWNrX3BhZCA9IDAsIGNoZWNrX2xlbiA9IDA7CiAgICBpbnQgaW5kZXggPSAwOwogICAgaW50IGNoa19pZHg7CiAgICB1MTZfdCBwa3RfbGVuOwogICAgdTE2X3QgcGt0X3RhZzsKICAgIHUxNl90IGlpOwogICAgemJ1Zl90ICpyeEJ1ZlBvb2xbOF07CiAgICB1MTZfdCByeEJ1ZlBvb2xJbmRleCA9IDA7CiNlbmRpZgoKICAgIC8qIENoZWNrIHN0YXR1cyBmb3IgVVJCICovCiAgICBpZiAodXJiLT5zdGF0dXMgIT0gMCl7CiAgICAgICAgcHJpbnRrKCJ6ZkxueFVzYkRhdGFJbl9jYWxsYmFjaygpIDogc3RhdHVzPTB4JXhcbiIsIHVyYi0+c3RhdHVzKTsKICAgICAgICBpZiAoKHVyYi0+c3RhdHVzICE9IC1FTk9FTlQpICYmICh1cmItPnN0YXR1cyAhPSAtRUNPTk5SRVNFVCkKICAgICAgICAgICAgJiYgKHVyYi0+c3RhdHVzICE9IC1FU0hVVERPV04pKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh1cmItPnN0YXR1cyA9PSAtRVBJUEUpewogICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6IC1FUElQRSIpOwogICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IC0xOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1cmItPnN0YXR1cyA9PSAtRVBST1RPKXsKICAgICAgICAgICAgICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAibm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAtRVBST1RPIik7CiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAidXJiLT5zdGF0dXM6IDB4JTA4eFxuIiwgdXJiLT5zdGF0dXMpOwoKICAgICAgICAvKiBEZXF1ZXVlIHNrYiBidWZmZXIgKi8KICAgICAgICBidWYgPSB6ZkxueEdldFVzYlJ4QnVmZmVyKGRldik7CiAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKICAgICAgICAjaWYgMAogICAgICAgIC8qIEVucXVldWUgc2tiIGJ1ZmZlciAqLwogICAgICAgIHpmTG54UHV0VXNiUnhCdWZmZXIoZGV2LCBidWYpOwoKICAgICAgICAvKiBTdWJtaXQgYSBSeCB1cmIgKi8KICAgICAgICB6ZkxueFVzYkluKGRldiwgdXJiLCBidWYpOwogICAgICAgICNlbmRpZgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDApCiAgICB7CiAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJHZXQgYW4gVVJCIHdob3NlIGxlbmd0aCBpcyB6ZXJvIik7CiAgICAgICAgc3RhdHVzID0gLTE7CiAgICB9CgogICAgLyogRGVxdWV1ZSBza2IgYnVmZmVyICovCiAgICBidWYgPSB6ZkxueEdldFVzYlJ4QnVmZmVyKGRldik7CgogICAgLy96ZndCdWZTZXRTaXplKGRldiwgYnVmLCB1cmItPmFjdHVhbF9sZW5ndGgpOwojaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCiAgICBidWYtPnRhaWwgPSAwOwogICAgYnVmLT5sZW4gPSAwOwojZWxzZQogICAgYnVmLT50YWlsID0gYnVmLT5kYXRhOwogICAgYnVmLT5sZW4gPSAwOwojZW5kaWYKCiAgICBCVUdfT04oKGJ1Zi0+dGFpbCArIHVyYi0+YWN0dWFsX2xlbmd0aCkgPiBidWYtPmVuZCk7CgogICAgc2tiX3B1dChidWYsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CgojaWYgWk1fVVNCX1NUUkVBTV9NT0RFID09IDEKICAgIGlmIChyZW1haW5fbGVuICE9IDApCiAgICB7CiAgICAgICAgemJ1Zl90ICpyZW1haW5fYnVmID0gbWFjcC0+cmVhbWluX2J1ZjsKCiAgICAgICAgaW5kZXggPSByZW1haW5fbGVuOwogICAgICAgIHJlbWFpbl9sZW4gLT0gY2hlY2tfcGFkOwoKICAgICAgICAvKiAgQ29weSBkYXRhICovCiAgICAgICAgbWVtY3B5KCYocmVtYWluX2J1Zi0+ZGF0YVtjaGVja19sZW5dKSwgYnVmLT5kYXRhLCByZW1haW5fbGVuKTsKICAgICAgICBjaGVja19sZW4gKz0gcmVtYWluX2xlbjsKICAgICAgICByZW1haW5fbGVuID0gMDsKCiAgICAgICAgcnhCdWZQb29sW3J4QnVmUG9vbEluZGV4KytdID0gcmVtYWluX2J1ZjsKICAgIH0KCiAgICB3aGlsZShpbmRleCA8IHVyYi0+YWN0dWFsX2xlbmd0aCkKICAgIHsKICAgICAgICBwa3RfbGVuID0gYnVmLT5kYXRhW2luZGV4XSArIChidWYtPmRhdGFbaW5kZXgrMV0gPDwgOCk7CiAgICAgICAgcGt0X3RhZyA9IGJ1Zi0+ZGF0YVtpbmRleCsyXSArIChidWYtPmRhdGFbaW5kZXgrM10gPDwgOCk7CgogICAgICAgIGlmIChwa3RfdGFnID09IDB4NGUwMCkKICAgICAgICB7CiAgICAgICAgICAgIGludCBwYWRfbGVuOwoKICAgICAgICAgICAgLy9wcmludGsoIkdldCBhIHBhY2tldCwgaW5kZXg6ICVkLCBwa3RfbGVuOiAweCUwNHhcbiIsIGluZGV4LCBwa3RfbGVuKTsKICAgICAgICAgICAgI2lmIDAKICAgICAgICAgICAgLyogRHVtcCBkYXRhICovCiAgICAgICAgICAgIGZvciAoaWkgPSBpbmRleDsgaWkgPCBwa3RfbGVuKzQ7KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmludGsoIiUwMnggIiwgKGJ1Zi0+ZGF0YVtpaV0gJiAweGZmKSk7CgogICAgICAgICAgICAgICAgaWYgKCgrK2lpICUgMTYpID09IDApCiAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJcbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwcmludGsoIlxuIik7CiAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgcGFkX2xlbiA9IDQgLSAocGt0X2xlbiAmIDB4Myk7CgogICAgICAgICAgICBpZihwYWRfbGVuID09IDQpCiAgICAgICAgICAgICAgICBwYWRfbGVuID0gMDsKCiAgICAgICAgICAgIGNoa19pZHggPSBpbmRleDsKICAgICAgICAgICAgaW5kZXggPSBpbmRleCArIDQgKyBwa3RfbGVuICsgcGFkX2xlbjsKCiAgICAgICAgICAgIGlmIChpbmRleCA+IFpNX01BWF9SWF9CVUZGRVJfU0laRSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVtYWluX2xlbiA9IGluZGV4IC0gWk1fTUFYX1JYX0JVRkZFUl9TSVpFOyAvLyAtIHBhZF9sZW47CiAgICAgICAgICAgICAgICBjaGVja19sZW4gPSBaTV9NQVhfUlhfQlVGRkVSX1NJWkUgLSBjaGtfaWR4IC0gNDsKICAgICAgICAgICAgICAgIGNoZWNrX3BhZCA9IHBhZF9sZW47CgogICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgYSBza2IgYnVmZmVyICovCiAgICAgICAgICAgICAgICAvL25ld19idWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CiAgICAgICAgICAgICAgICBuZXdfYnVmID0gZGV2X2FsbG9jX3NrYihaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOwoKICAgICAgICAgICAgICAgIC8qIFNldCBza2IgYnVmZmVyIGxlbmd0aCAqLwogICAgICAgICAgICAjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCiAgICAgICAgICAgICAgICBuZXdfYnVmLT50YWlsID0gMDsKICAgICAgICAgICAgICAgIG5ld19idWYtPmxlbiA9IDA7CiAgICAgICAgICAgICNlbHNlCiAgICAgICAgICAgICAgICBuZXdfYnVmLT50YWlsID0gbmV3X2J1Zi0+ZGF0YTsKICAgICAgICAgICAgICAgIG5ld19idWYtPmxlbiA9IDA7CiAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgICAgIHNrYl9wdXQobmV3X2J1ZiwgcGt0X2xlbik7CgogICAgICAgICAgICAgICAgLyogQ29weSB0aGUgYnVmZmVyICovCiAgICAgICAgICAgICAgICBtZW1jcHkobmV3X2J1Zi0+ZGF0YSwgJihidWYtPmRhdGFbY2hrX2lkeCs0XSksIGNoZWNrX2xlbik7CgogICAgICAgICAgICAgICAgLyogUmVjb3JkIHRoZSBidWZmZXIgcG9pbnRlciAqLwogICAgICAgICAgICAgICAgbWFjcC0+cmVhbWluX2J1ZiA9IG5ld19idWY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgI2lmZGVmIFpNX0RPTlRfQ09QWV9SWF9CVUZGRVIKICAgICAgICAgICAgICAgIGlmIChyeEJ1ZlBvb2xJbmRleCA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5ld19idWYgPSBza2JfY2xvbmUoYnVmLCBHRlBfQVRPTUlDKTsKCiAgICAgICAgICAgICAgICAgICAgbmV3X2J1Zi0+ZGF0YSA9ICYoYnVmLT5kYXRhW2Noa19pZHgrNF0pOwogICAgICAgICAgICAgICAgICAgIG5ld19idWYtPmxlbiA9IHBrdF9sZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhIHNrYiBidWZmZXIgKi8KICAgICAgICAgICAgICAgIG5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CgogICAgICAgICAgICAgICAgLyogU2V0IHNrYiBidWZmZXIgbGVuZ3RoICovCiAgICAgICAgICAgICNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKICAgICAgICAgICAgICAgIG5ld19idWYtPnRhaWwgPSAwOwogICAgICAgICAgICAgICAgbmV3X2J1Zi0+bGVuID0gMDsKICAgICAgICAgICAgI2Vsc2UKICAgICAgICAgICAgICAgIG5ld19idWYtPnRhaWwgPSBuZXdfYnVmLT5kYXRhOwogICAgICAgICAgICAgICAgbmV3X2J1Zi0+bGVuID0gMDsKICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICAgICAgc2tiX3B1dChuZXdfYnVmLCBwa3RfbGVuKTsKCiAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBidWZmZXIgKi8KICAgICAgICAgICAgICAgIG1lbWNweShuZXdfYnVmLT5kYXRhLCAmKGJ1Zi0+ZGF0YVtjaGtfaWR4KzRdKSwgcGt0X2xlbik7CgogICAgICAgICNpZmRlZiBaTV9ET05UX0NPUFlfUlhfQlVGRkVSCiAgICAgICAgICAgICAgICB9CiAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAgICByeEJ1ZlBvb2xbcnhCdWZQb29sSW5kZXgrK10gPSBuZXdfYnVmOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCB0YWcsIHBrdF9sZW46IDB4JTA0eCwgdGFnOiAweCUwNHhcbiIsIHBrdF9sZW4sIHBrdF90YWcpOwoKICAgICAgICAgICAgLyogRnJlZSBidWZmZXIgKi8KICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKCiAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLwogICAgICAgICAgICBuZXdfYnVmID0gZGV2X2FsbG9jX3NrYihaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOwoKICAgICAgICAgICAgLyogRW5xdWV1ZSBza2IgYnVmZmVyICovCiAgICAgICAgICAgIHpmTG54UHV0VXNiUnhCdWZmZXIoZGV2LCBuZXdfYnVmKTsKCiAgICAgICAgICAgIC8qIFN1Ym1pdCBhIFJ4IHVyYiAqLwogICAgICAgICAgICB6ZkxueFVzYkluKGRldiwgdXJiLCBuZXdfYnVmKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgLyogRnJlZSBidWZmZXIgKi8KICAgIGRldl9rZnJlZV9za2JfYW55KGJ1Zik7CiNlbmRpZgoKICAgIC8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLwogICAgbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKCiAgICAvKiBFbnF1ZXVlIHNrYiBidWZmZXIgKi8KICAgIHpmTG54UHV0VXNiUnhCdWZmZXIoZGV2LCBuZXdfYnVmKTsKCiAgICAvKiBTdWJtaXQgYSBSeCB1cmIgKi8KICAgIHpmTG54VXNiSW4oZGV2LCB1cmIsIG5ld19idWYpOwoKI2lmIFpNX1VTQl9TVFJFQU1fTU9ERSA9PSAxCiAgICBmb3IoaWkgPSAwOyBpaSA8IHJ4QnVmUG9vbEluZGV4OyBpaSsrKQogICAgewogICAgICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWN2KGRldiwgcnhCdWZQb29sW2lpXSk7CiAgICB9CiNlbHNlCiAgICAvKiBwYXNzIGRhdGEgdG8gdXBwZXIgbGF5ZXIgKi8KICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWN2KGRldiwgYnVmKTsKI2VuZGlmCn0KCnZvaWQgemZMbnhVc2JSZWdPdXRfY2FsbGJhY2sodXJiX3QgKnVyYikKewogICAgLy9kZXZfdCogZGV2ID0gdXJiLT5jb250ZXh0OwoKICAgIC8vcHJpbnRrKEtFUk5fRVJSICJ6ZndVc2JSZWdPdXRfY2FsbGJhY2tcbiIpOwp9Cgp2b2lkIHpmTG54VXNiUmVnSW5fY2FsbGJhY2sodXJiX3QgKnVyYikKewogICAgemRldl90KiBkZXYgPSB1cmItPmNvbnRleHQ7CiAgICB1MzJfdCByc3BbNjQvNF07CiAgICBpbnQgc3RhdHVzOwogICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwoKICAgIC8qIENoZWNrIHN0YXR1cyBmb3IgVVJCICovCiAgICBpZiAodXJiLT5zdGF0dXMgIT0gMCl7CiAgICAgICAgcHJpbnRrKCJ6ZkxueFVzYlJlZ0luX2NhbGxiYWNrKCkgOiBzdGF0dXM9MHgleFxuIiwgdXJiLT5zdGF0dXMpOwogICAgICAgIGlmICgodXJiLT5zdGF0dXMgIT0gLUVOT0VOVCkgJiYgKHVyYi0+c3RhdHVzICE9IC1FQ09OTlJFU0VUKQogICAgICAgICAgICAmJiAodXJiLT5zdGF0dXMgIT0gLUVTSFVURE9XTikpCiAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHVyYi0+c3RhdHVzID09IC1FUElQRSl7CiAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogLUVQSVBFIik7CiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLTE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHVyYi0+c3RhdHVzID09IC1FUFJPVE8pewogICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6IC1FUFJPVE8iKTsKICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJ1cmItPnN0YXR1czogMHglMDh4XG4iLCB1cmItPnN0YXR1cyk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICh1cmItPmFjdHVhbF9sZW5ndGggPT0gMCkKICAgIHsKICAgICAgICBwcmludGsoS0VSTl9FUlIgIkdldCBhbiBVUkIgd2hvc2UgbGVuZ3RoIGlzIHplcm8iKTsKICAgICAgICBzdGF0dXMgPSAtMTsKICAgIH0KCiAgICAvKiBDb3B5IGRhdGEgaW50byByZXNwb25lIGJ1ZmZlciAqLwogICAgbWVtY3B5KHJzcCwgbWFjcC0+cmVnVXNiUmVhZEJ1ZiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKCiAgICAvKiBOb3RpZnkgdG8gdXBwZXIgbGF5ZXIgKi8KICAgIC8vemZJZGxDaGtSc3AoZGV2LCByc3AsICh1MTZfdCl1cmItPmFjdHVhbF9sZW5ndGgpOwogICAgLy96ZmlVc2JSZWdJbihkZXYsIHJzcCwgKHUxNl90KXVyYi0+YWN0dWFsX2xlbmd0aCk7CiAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiUmVnSW4oZGV2LCByc3AsICh1MTZfdCl1cmItPmFjdHVhbF9sZW5ndGgpOwoKICAgIC8qIElzc3VlIGFub3RoZXIgVVNCIElOIFVSQiAqLwogICAgemZMbnhTdWJtaXRSZWdJblVyYihkZXYpOwp9Cgp1MzJfdCB6ZkxueFN1Ym1pdFJlZ0luVXJiKHpkZXZfdCAqZGV2KQp7CiAgICB1MzJfdCByZXQ7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CgogICAgLyogU3VibWl0IGEgcnggdXJiICovCiAgICAvL3JldCA9IHpmTG54VXNiU3VibWl0QnVsa1VyYihtYWNwLT5SZWdJblVyYiwgbWFjcC0+dWRldiwKICAgIC8vICAgICAgICBVU0JfUkVHX0lOX1BJUEUsIFVTQl9ESVJfSU4sIG1hY3AtPnJlZ1VzYlJlYWRCdWYsCiAgICAvLyAgICAgICAgWk1fVVNCX1JFR19NQVhfQlVGX1NJWkUsIHpmTG54VXNiUmVnSW5fY2FsbGJhY2ssIGRldik7CiAgICAvL0NXWWFuZygtKQogICAgLy9pZiAocmV0ICE9IDApCiAgICAvLyAgICBwcmludGsoInpmd1VzYlN1Ym1pdEJ1bGtVcmIgZmFpbCwgc3RhdHVzOiAweCUwOHhcbiIsIChpbnQpcmV0KTsKCiAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdEludFVyYihtYWNwLT5SZWdJblVyYiwgbWFjcC0+dWRldiwKICAgICAgICAgICAgVVNCX1JFR19JTl9QSVBFLCBVU0JfRElSX0lOLCBtYWNwLT5yZWdVc2JSZWFkQnVmLAogICAgICAgICAgICBaTV9VU0JfUkVHX01BWF9CVUZfU0laRSwgemZMbnhVc2JSZWdJbl9jYWxsYmFjaywgZGV2LCAxKTsKCiAgICByZXR1cm4gcmV0Owp9Cgp1MzJfdCB6ZkxueFVzYlN1Ym1pdFR4RGF0YSh6ZGV2X3QqIGRldikKewogICAgdTMyX3QgaTsKICAgIHUzMl90IHJldDsKICAgIHUxNl90IGZyZWVUeFVyYjsKICAgIHU4X3QgKnB1VHhCdWYgPSBOVUxMOwogICAgVXNiVHhRX3QgKlR4RGF0YTsKICAgIGludCBsZW4gPSAwOwogICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwojaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKICAgIHU4X3QgICAgICAgICAgICAgICBpaTsKICAgIHUxNl90ICAgICAgICAgICAgICBvZmZzZXQgPSAwOwogICAgdTE2X3QgICAgICAgICAgICAgIHVzYlR4QWdnQ250OwogICAgdTE2X3QgICAgICAgICAgICAgICpwVXNiVHhIZHI7CiAgICBVc2JUeFFfdCAgICAgICAgICAgKlR4UVBvb2xbWk1fTUFYX1RYX0FHR1JFR0FURV9OVU1dOwojZW5kaWYKCiAgICAvKiBGaXJzdCBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgZnJlZSBVUkIgKi8KICAgIGZyZWVUeFVyYiA9IHpmTG54R2V0RnJlZVR4VXJiKGRldik7CgogICAgLyogSWYgdGhlcmUgaXMgbm8gYW55IGZyZWUgVHggVXJiICovCiAgICBpZiAoZnJlZVR4VXJiID09IDB4ZmZmZikKICAgIHsKICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZ2V0IGZyZWUgVHggVXJiXG4iKTsKICAgICAgICAvL3ByaW50aygiQ1dZIC0gQ2FuJ3QgZ2V0IGZyZWUgVHggVXJiXG4iKTsKICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgfQoKI2lmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERSA9PSAxCiAgICB1c2JUeEFnZ0NudCA9IHpmTG54Q2hlY2tUeEJ1ZmZlckNudChkZXYpOwoKICAgIGlmICh1c2JUeEFnZ0NudCA+PSBaTV9NQVhfVFhfQUdHUkVHQVRFX05VTSkKICAgIHsKICAgICAgIHVzYlR4QWdnQ250ID0gWk1fTUFYX1RYX0FHR1JFR0FURV9OVU07CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICB1c2JUeEFnZ0NudCA9IDE7CiAgICB9CgogICAgLy9wcmludGsoInVzYlR4QWdnQ250OiAlZFxuIiwgdXNiVHhBZ2dDbnQpOwojZW5kaWYKCiNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQogICAgZm9yKGlpID0gMDsgaWkgPCB1c2JUeEFnZ0NudDsgaWkrKykKICAgIHsKI2VuZGlmCiAgICAvKiBEZXF1ZXVlIHRoZSBwYWNrZXQgZnJvbSBVc2JUeEJ1ZlEgKi8KICAgIFR4RGF0YSA9IHpmTG54R2V0VXNiVHhCdWZmZXIoZGV2KTsKICAgIGlmIChUeERhdGEgPT0gTlVMTCkKICAgIHsKICAgICAgICAvKiBHaXZlIHRoZSB1cmIgYmFjayAqLwogICAgICAgIHpmTG54UHV0VHhVcmIoZGV2KTsKICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgfQoKICAgIC8qIFBvaW50IHRvIHRoZSBmcmVlVHhVcmIgYnVmZmVyICovCiAgICBwdVR4QnVmID0gbWFjcC0+dHhVc2JCdWZbZnJlZVR4VXJiXTsKCiNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQogICAgcHVUeEJ1ZiArPSBvZmZzZXQ7CiAgICBwVXNiVHhIZHIgPSAodTE2X3QgKilwdVR4QnVmOwoKICAgIC8qIEFkZCB0aGUgcGFja2V0IGxlbmd0aCBhbmQgdGFnIGluZm9ybWF0aW9uICovCiAgICAqcFVzYlR4SGRyKysgPSBUeERhdGEtPmhkcmxlbiArIFR4RGF0YS0+c25hcExlbiArCiAgICAgICAgICAgICAoVHhEYXRhLT5idWYtPmxlbiAtIFR4RGF0YS0+b2Zmc2V0KSArICBUeERhdGEtPnRhaWxMZW47CgogICAgKnBVc2JUeEhkcisrID0gMHg2OTdlOwoKICAgIHB1VHhCdWYgKz0gNDsKI2VuZGlmIC8vICNpZmRlZiBaTV9VU0JfVFhfU1RSRUFNX01PREUKCiAgICAvKiBDb3B5IFdMQU4gaGVhZGVyIGFuZCBwYWNrZXQgYnVmZmVyIGludG8gVVNCIGJ1ZmZlciAqLwogICAgZm9yKGkgPSAwOyBpIDwgVHhEYXRhLT5oZHJsZW47IGkrKykKICAgIHsKICAgICAgICAqcHVUeEJ1ZisrID0gVHhEYXRhLT5oZHJbaV07CiAgICB9CgogICAgLyogQ29weSBTTkFQIGhlYWRlciAqLwogICAgZm9yKGkgPSAwOyBpIDwgVHhEYXRhLT5zbmFwTGVuOyBpKyspCiAgICB7CiAgICAgICAgKnB1VHhCdWYrKyA9IFR4RGF0YS0+c25hcFtpXTsKICAgIH0KCiAgICAvKiBDb3B5IHBhY2tldCBidWZmZXIgKi8KICAgIGZvcihpID0gMDsgaSA8IFR4RGF0YS0+YnVmLT5sZW4gLSBUeERhdGEtPm9mZnNldDsgaSsrKQogICAgewogICAgCS8vKnB1VHhCdWYrKyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBUeERhdGEtPmJ1ZiwgaSk7CiAgICAJKnB1VHhCdWYrKyA9ICoodThfdCopKCh1OF90KilUeERhdGEtPmJ1Zi0+ZGF0YStpK1R4RGF0YS0+b2Zmc2V0KTsKICAgIH0KCiAgICAvKiBDb3B5IHRhaWwgKi8KICAgIGZvcihpID0gMDsgaSA8IFR4RGF0YS0+dGFpbExlbjsgaSsrKQogICAgewogICAgICAgICpwdVR4QnVmKysgPSBUeERhdGEtPnRhaWxbaV07CiAgICB9CgogICAgbGVuID0gVHhEYXRhLT5oZHJsZW4rVHhEYXRhLT5zbmFwTGVuK1R4RGF0YS0+YnVmLT5sZW4rVHhEYXRhLT50YWlsTGVuLVR4RGF0YS0+b2Zmc2V0OwoKICAgICNpZiAwCiAgICBpZiAoVHhEYXRhLT5oZHJsZW4gIT0gMCkKICAgIHsKICAgICAgICBwdVR4QnVmID0gbWFjcC0+dHhVc2JCdWZbZnJlZVR4VXJiXTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBwcmludGsoIiUwMnggIiwgcHVUeEJ1ZltpXSk7CiAgICAgICAgICAgIGlmIChpICUgMTYgPT0gMTUpCiAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7CiAgICAgICAgfQogICAgICAgIHByaW50aygiXG4iKTsKICAgIH0KICAgICNlbmRpZgogICAgI2lmIDAKICAgIC8qIEZvciBkZWJ1ZyBwdXJwb3NlICovCiAgICBpZihUeERhdGEtPmhkcls5XSAmIDB4NDApCiAgICB7CiAgICAgICAgaW50IGk7CiAgICAgICAgdTE2X3QgY3RybExlbiA9IFR4RGF0YS0+aGRyWzBdICsgKFR4RGF0YS0+aGRyWzFdIDw8IDgpOwoKICAgICAgICBpZiAoY3RybExlbiAhPSBsZW4gKyA0KQogICAgICAgIHsKICAgICAgICAvKiBEdW1wIGNvbnRyb2wgc2V0dGluZyAqLwogICAgICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiMHglMDJ4ICIsIFR4RGF0YS0+aGRyW2ldKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOwoKICAgICAgICBwcmludGsoS0VSTl9FUlIgImN0ckxlbjogJWQsIGhkckxlbjogJWQsIHNuYXBMZW46ICVkXG4iLCBjdHJsTGVuLCBUeERhdGEtPmhkcmxlbiwgVHhEYXRhLT5zbmFwTGVuKTsKICAgICAgICBwcmludGsoS0VSTl9FUlIgImJ1ZkxlbjogJWQsIHRhaWxMZW46ICVkLCBsZW46ICVkXG4iLCBUeERhdGEtPmJ1Zi0+bGVuLCBUeERhdGEtPnRhaWxMZW4sIGxlbik7CiAgICAgICAgfQogICAgfQogICAgI2VuZGlmCgojaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKICAgIC8vIEFkZCB0aGUgTGVuZ3RoIGFuZCBUYWcKICAgIGxlbiArPSA0OwoKICAgIC8vcHJpbnRrKCIlZCBwYWNrZXQsIGxlbmd0aDogJWRcbiIsIGlpKzEsIGxlbik7CgogICAgaWYgKGlpIDwgKFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNLTEpKQogICAgewogICAgICAgIC8qIFBhZCB0aGUgYnVmZmVyIHRvIGZpcm13YXJlIGRlc2NyaXB0b3IgYm91bmRhcnkgKi8KICAgICAgICBvZmZzZXQgKz0gKCgobGVuLTEpIC8gNCkgKyAxKSAqIDQ7CiAgICB9CgogICAgaWYgKGlpID09IChaTV9NQVhfVFhfQUdHUkVHQVRFX05VTS0xKSkKICAgIHsKICAgICAgICBsZW4gKz0gb2Zmc2V0OwogICAgfQoKICAgIFR4UVBvb2xbaWldID0gVHhEYXRhOwoKICAgIC8vRGJnUHJpbnQoIiVkIHBhY2tldCwgb2Zmc2V0OiAlZFxuIiwgaWkrMSwgcFVzYlR4VHJhbnNmZXItPm9mZnNldCk7CgogICAgLyogZnJlZSBwYWNrZXQgKi8KICAgIC8vemZCdWZGcmVlKGRldiwgdHhEYXRhLT5idWYpOwogICAgfQojZW5kaWYKICAgIC8vcHJpbnRrKCJDV1kgLSBjYWxsIHpmd1VzYlN1Ym1pdEJ1bGtVcmIoKSwgbGVuID0gMHglZFxuIiwgbGVuKTsKICAgIC8qIFN1Ym1pdCBhIHR4IHVyYiAqLwogICAgcmV0ID0gemZMbnhVc2JTdWJtaXRCdWxrVXJiKG1hY3AtPldsYW5UeERhdGFVcmJbZnJlZVR4VXJiXSwgbWFjcC0+dWRldiwKICAgICAgICAgICAgVVNCX1dMQU5fVFhfUElQRSwgVVNCX0RJUl9PVVQsIG1hY3AtPnR4VXNiQnVmW2ZyZWVUeFVyYl0sCiAgICAgICAgICAgIGxlbiwgemZMbnhVc2JEYXRhT3V0X2NhbGxiYWNrLCBkZXYpOwogICAgLy9DV1lhbmcoLSkKICAgIC8vaWYgKHJldCAhPSAwKQogICAgLy8gICAgcHJpbnRrKCJ6ZndVc2JTdWJtaXRCdWxrVXJiIGZhaWwsIHN0YXR1czogMHglMDh4XG4iLCAoaW50KXJldCk7CgogICAgLyogZnJlZSBwYWNrZXQgKi8KICAgIC8vZGV2X2tmcmVlX3NrYl9hbnkoVHhEYXRhLT5idWYpOwojaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKICAgIGZvcihpaSA9IDA7IGlpIDwgdXNiVHhBZ2dDbnQ7IGlpKyspCiAgICAgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYk91dENvbXBsZXRlKGRldiwgVHhRUG9vbFtpaV0tPmJ1ZiwgMSwgVHhRUG9vbFtpaV0tPmhkcik7CiNlbHNlCiAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiT3V0Q29tcGxldGUoZGV2LCBUeERhdGEtPmJ1ZiwgMSwgVHhEYXRhLT5oZHIpOwojZW5kaWYKCiAgICByZXR1cm4gcmV0Owp9CgoKCnUzMl90IHpmTG54VXNiSW4oemRldl90KiBkZXYsIHVyYl90ICp1cmIsIHpidWZfdCAqYnVmKQp7CiAgICB1MzJfdCByZXQ7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CgogICAgLyogU3VibWl0IGEgcnggdXJiICovCiAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIodXJiLCBtYWNwLT51ZGV2LCBVU0JfV0xBTl9SWF9QSVBFLAogICAgICAgICAgICBVU0JfRElSX0lOLCBidWYtPmRhdGEsIFpNX01BWF9SWF9CVUZGRVJfU0laRSwKICAgICAgICAgICAgemZMbnhVc2JEYXRhSW5fY2FsbGJhY2ssIGRldik7CiAgICAvL0NXWWFuZygtKQogICAgLy9pZiAocmV0ICE9IDApCiAgICAvLyAgICBwcmludGsoInpmd1VzYlN1Ym1pdEJ1bGtVcmIgZmFpbCwgc3RhdHVzOiAweCUwOHhcbiIsIChpbnQpcmV0KTsKCiAgICByZXR1cm4gcmV0Owp9Cgp1MzJfdCB6ZkxueFVzYldyaXRlUmVnKHpkZXZfdCogZGV2LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4pCnsKICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKICAgIHUzMl90IHJldDsKCiNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgogICAgaW50IGlpID0gMDsKCiAgICBmb3IoaWk9MDsgaWk8KGNtZExlbj4+Mik7IGlpKyspCgljbWRbaWldID0gY3B1X3RvX2xlMzIoY21kW2lpXSk7CiNlbmRpZgoKICAgIG1lbWNweShtYWNwLT5yZWdVc2JXcml0ZUJ1ZiwgY21kLCBjbWRMZW4pOwoKICAgIC8qIElzc3VlIGFuIFVTQiBPdXQgdHJhbnNmZXIgKi8KICAgIC8qIFN1Ym1pdCBhIHR4IHVyYiAqLwogICAgcmV0ID0gemZMbnhVc2JTdWJtaXRJbnRVcmIobWFjcC0+UmVnT3V0VXJiLCBtYWNwLT51ZGV2LAogICAgICAgICAgICBVU0JfUkVHX09VVF9QSVBFLCBVU0JfRElSX09VVCwgbWFjcC0+cmVnVXNiV3JpdGVCdWYsCiAgICAgICAgICAgIGNtZExlbiwgemZMbnhVc2JSZWdPdXRfY2FsbGJhY2ssIGRldiwgMSk7CgogICAgcmV0dXJuIHJldDsKfQoKCnUzMl90IHpmTG54VXNiT3V0KHpkZXZfdCogZGV2LCB1OF90ICpoZHIsIHUxNl90IGhkcmxlbiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwKICAgICAgICB1OF90ICp0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KQp7CiAgICB1MzJfdCByZXQ7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CgogICAgLyogQ2hlY2sgbGVuZ3RoIG9mIHRhaWwgYnVmZmVyICovCiAgICAvL3ptX2Fzc2VydCgodGFpbExlbiA8PSAxNikpOwoKICAgIC8qIEVucXVldWUgdGhlIHBhY2tldCBpbnRvIFVzYlR4QnVmUSAqLwogICAgaWYgKHpmTG54UHV0VXNiVHhCdWZmZXIoZGV2LCBoZHIsIGhkcmxlbiwgc25hcCwgc25hcExlbiwgdGFpbCwgdGFpbExlbiwgYnVmLCBvZmZzZXQpID09IDB4ZmZmZikKICAgIHsKICAgICAgICAvKiBmcmVlIHBhY2tldCAqLwogICAgICAgIC8vcHJpbnRrKCJDV1kgLSB6ZndQdXRVc2JUeEJ1ZmZlciBFcnJvciwgZnJlZSBwYWNrZXRcbiIpOwogICAgICAgIC8vZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKICAgICAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiT3V0Q29tcGxldGUoZGV2LCBidWYsIDAsIGhkcik7CiAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgIH0KCiAgICAvL3JldHVybiAwOwogICAgLy9wcmludGsoIkNXWSAtIGNhbGwgemZ3VXNiU3VibWl0VHhEYXRhKClcbiIpOwogICAgcmV0ID0gemZMbnhVc2JTdWJtaXRUeERhdGEoZGV2KTsKICAgIHJldHVybiByZXQ7Cn0KCnZvaWQgemZMbnhJbml0VXNiVHhRKHpkZXZfdCogZGV2KQp7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CgogICAgcHJpbnRrKEtFUk5fRVJSICJ6ZndJbml0VXNiVHhRXG4iKTsKCiAgICAvKiBaZXJvIG1lbW9yeSBmb3IgVXNiVHhCdWZRICovCiAgICBtZW1zZXQobWFjcC0+VXNiVHhCdWZRLCAwLCBzaXplb2YoVXNiVHhRX3QpICogWk1fTUFYX1RYX1VSQl9OVU0pOwoKICAgIG1hY3AtPlR4QnVmSGVhZCA9IDA7CiAgICBtYWNwLT5UeEJ1ZlRhaWwgPSAwOwogICAgbWFjcC0+VHhVcmJIZWFkID0gMDsKICAgIG1hY3AtPlR4VXJiVGFpbCA9IDA7CiAgICBtYWNwLT5UeFVyYkNudCA9IFpNX01BWF9UWF9VUkJfTlVNOwp9Cgp2b2lkIHpmTG54SW5pdFVzYlJ4USh6ZGV2X3QqIGRldikKewogICAgdTE2X3QgaTsKICAgIHpidWZfdCAqYnVmOwogICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwoKICAgIC8qIFplcm8gbWVtb3J5IGZvciBVc2JSeEJ1ZlEgKi8KICAgIG1lbXNldChtYWNwLT5Vc2JSeEJ1ZlEsIDAsIHNpemVvZih6YnVmX3QgKikgKiBaTV9NQVhfUlhfVVJCX05VTSk7CgogICAgbWFjcC0+UnhCdWZIZWFkID0gMDsKCiAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1JYX1VSQl9OVU07IGkrKykKICAgIHsKICAgICAgICAvL2J1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKICAgICAgICBidWYgPSBkZXZfYWxsb2Nfc2tiKFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CiAgICAgICAgbWFjcC0+VXNiUnhCdWZRW2ldID0gYnVmOwogICAgfQoKICAgIC8vbWFjcC0+UnhCdWZUYWlsID0gWk1fTUFYX1JYX1VSQl9OVU0gLSAxOwogICAgbWFjcC0+UnhCdWZUYWlsID0gMDsKCiAgICAvKiBTdWJtaXQgYWxsIFJ4IHVyYnMgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBaTV9NQVhfUlhfVVJCX05VTTsgaSsrKQogICAgewogICAgICAgIHpmTG54UHV0VXNiUnhCdWZmZXIoZGV2LCBtYWNwLT5Vc2JSeEJ1ZlFbaV0pOwogICAgICAgIHpmTG54VXNiSW4oZGV2LCBtYWNwLT5XbGFuUnhEYXRhVXJiW2ldLCBtYWNwLT5Vc2JSeEJ1ZlFbaV0pOwogICAgfQp9CgoKCnUzMl90IHpmTG54VXNiU3VibWl0QnVsa1VyYih1cmJfdCAqdXJiLCBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiLCB1MTZfdCBlcG51bSwgdTE2X3QgZGlyZWN0aW9uLAogICAgICAgIHZvaWQgKnRyYW5zZmVyX2J1ZmZlciwgaW50IGJ1ZmZlcl9sZW5ndGgsIHVzYl9jb21wbGV0ZV90IGNvbXBsZXRlLCB2b2lkICpjb250ZXh0KQp7CiAgICB1MzJfdCByZXQ7CgogICAgaWYoZGlyZWN0aW9uID09IFVTQl9ESVJfT1VUKQogICAgewogICAgICAgIHVzYl9maWxsX2J1bGtfdXJiKHVyYiwgdXNiLCB1c2Jfc25kYnVsa3BpcGUodXNiLCBlcG51bSksCiAgICAgICAgICAgICAgICB0cmFuc2Zlcl9idWZmZXIsIGJ1ZmZlcl9sZW5ndGgsIGNvbXBsZXRlLCBjb250ZXh0KTsKCiAgICAgICAgdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfWkVST19QQUNLRVQ7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdXNiX2ZpbGxfYnVsa191cmIodXJiLCB1c2IsIHVzYl9yY3ZidWxrcGlwZSh1c2IsIGVwbnVtKSwKICAgICAgICAgICAgICAgIHRyYW5zZmVyX2J1ZmZlciwgYnVmZmVyX2xlbmd0aCwgY29tcGxldGUsIGNvbnRleHQpOwogICAgfQoKICAgIGlmIChlcG51bSA9PSA0KQogICAgewogICAgICAgIGlmICh1cmItPmhjcHJpdikKICAgICAgICB7CiAgICAgICAgICAgIC8vcHJpbnRrKCJDV1kgLSB1cmItPmhjcHJpdiBzZXQgYnkgdW5rbm93biByZWFzb24sIHJlc2V0IGl0XG4iKTsKICAgICAgICAgICAgLy91cmItPmhjcHJpdiA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAgICBpZiAoKGVwbnVtID09IDQpICYgKHJldCAhPSAwKSkKICAgIHsKICAgICAgICAvL3ByaW50aygiQ1dZIC0gcmV0ID0gJXhcbiIsIHJldCk7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9Cgp1MzJfdCB6ZkxueFVzYlN1Ym1pdEludFVyYih1cmJfdCAqdXJiLCBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiLCB1MTZfdCBlcG51bSwgdTE2X3QgZGlyZWN0aW9uLAogICAgICAgIHZvaWQgKnRyYW5zZmVyX2J1ZmZlciwgaW50IGJ1ZmZlcl9sZW5ndGgsIHVzYl9jb21wbGV0ZV90IGNvbXBsZXRlLCB2b2lkICpjb250ZXh0LAogICAgICAgIHUzMl90IGludGVydmFsKQp7CiAgICB1MzJfdCByZXQ7CgogICAgaWYoZGlyZWN0aW9uID09IFVTQl9ESVJfT1VUKQogICAgewogICAgICAgIHVzYl9maWxsX2ludF91cmIodXJiLCB1c2IsIHVzYl9zbmRidWxrcGlwZSh1c2IsIGVwbnVtKSwKICAgICAgICAgICAgICAgIHRyYW5zZmVyX2J1ZmZlciwgYnVmZmVyX2xlbmd0aCwgY29tcGxldGUsIGNvbnRleHQsIGludGVydmFsKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB1c2JfZmlsbF9pbnRfdXJiKHVyYiwgdXNiLCB1c2JfcmN2YnVsa3BpcGUodXNiLCBlcG51bSksCiAgICAgICAgICAgICAgICB0cmFuc2Zlcl9idWZmZXIsIGJ1ZmZlcl9sZW5ndGgsIGNvbXBsZXRlLCBjb250ZXh0LCBpbnRlcnZhbCk7CiAgICB9CgogICAgcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKCiAgICByZXR1cm4gcmV0Owp9CgojaWZkZWYgWk1fRU5BQkxFX0NFTkMKaW50IHpmTG54Q2VuY1NlbmRNc2coc3RydWN0IHNvY2sgKm5ldGxpbmtfc2ssIHVfaW50OF90ICptc2csIGludCBsZW4pCnsKI2RlZmluZSBDT01NVFlQRV9HUk9VUCAgIDgKI2RlZmluZSBXQUlfS19NU0cgICAgICAgIDB4MTEKCglpbnQgcmV0ID0gLTE7CglpbnQgc2l6ZTsKCXVuc2lnbmVkIGNoYXIgKm9sZF90YWlsOwoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCXN0cnVjdCBubG1zZ2hkciAqbmxoOwoJY2hhciAqcG9zID0gTlVMTDsKCglzaXplID0gTkxNU0dfU1BBQ0UobGVuKTsKCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKCglpZihza2IgPT0gTlVMTCkKCXsKCQlwcmludGsoImRldl9hbGxvY19za2IgZmFpbHVyZSBcbiIpOwoJCWdvdG8gb3V0OwoJfQoJb2xkX3RhaWwgPSBza2ItPnRhaWw7CgoJLyrM7tC0yv2+3bGoz+C52NDFz6IqLwoJbmxoID0gTkxNU0dfUFVUKHNrYiwgMCwgMCwgV0FJX0tfTVNHLCBzaXplLXNpemVvZigqbmxoKSk7Cglwb3MgPSBOTE1TR19EQVRBKG5saCk7CgoJLyq0q8rktb3Tw7unv9W85LXEyv2+3SovCgltZW1jcHkocG9zLCBtc2csICBsZW4pOwoJLyq8xsvjvq25/dfWvdq21MbkuvO1xMr9vt3KtbzKs6S2yCovCglubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIG9sZF90YWlsOwoJTkVUTElOS19DQihza2IpLmRzdF9ncm91cCA9IENPTU1UWVBFX0dST1VQOwoJbmV0bGlua19icm9hZGNhc3QobmV0bGlua19zaywgc2tiLCAwLCBDT01NVFlQRV9HUk9VUCwgR0ZQX0FUT01JQyk7CglyZXQgPSAwOwpvdXQ6CglyZXR1cm4gcmV0OwpubG1zZ19mYWlsdXJlOiAvKk5MTVNHX1BVVCDKp7Dco6zU8rO3z/rM173T19a7urTmKi8KCWtmcmVlX3NrYihza2IpOwoJZ290byBvdXQ7CgojdW5kZWYgQ09NTVRZUEVfR1JPVVAKI3VuZGVmIFdBSV9LX01TRwp9CiNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCgovKiBTaW1wbHkgcmV0dXJuIDB4ZmZmZiBpZiBWQVAgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCAqLwp1MTZfdCB6ZkxueEdldFZhcElkKHpkZXZfdCogZGV2KQp7CiAgICB1MTZfdCBpOwoKICAgIGZvciAoaT0wOyBpPFpNX1ZBUF9QT1JUX05VTUJFUjsgaSsrKQogICAgewogICAgICAgIGlmICh2YXBbaV0uZGV2ID09IGRldikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAweGZmZmY7Cn0KCnUzMl90IHpmd1JlYWRSZWcoemRldl90KiBkZXYsIHUzMl90IG9mZnNldCkKewogICAgcmV0dXJuIDA7Cn0KCiNpZm5kZWYgSU5JVF9XT1JLCiNkZWZpbmUgd29ya19zdHJ1Y3QgdHFfc3RydWN0CgojZGVmaW5lIHNjaGVkdWxlX3dvcmsoYSkgIHNjaGVkdWxlX3Rhc2soYSkKCiNkZWZpbmUgZmx1c2hfc2NoZWR1bGVkX3dvcmsgIGZsdXNoX3NjaGVkdWxlZF90YXNrcwojZGVmaW5lIElOSVRfV09SSyhfd3EsIF9yb3V0aW5lLCBfZGF0YSkgIElOSVRfVFFVRVVFKF93cSwgX3JvdXRpbmUsIF9kYXRhKQojZGVmaW5lIFBSRVBBUkVfV09SSyhfd3EsIF9yb3V0aW5lLCBfZGF0YSkgIFBSRVBBUkVfVFFVRVVFKF93cSwgX3JvdXRpbmUsIF9kYXRhKQojZW5kaWYKCiNkZWZpbmUgS0VWRU5UX1dBVENIRE9HICAgICAgICAweDAwMDAwMDAxCgp1MzJfdCBzbXBfa2V2ZW50X0xvY2sgPSAwOwoKdm9pZCBrZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQp7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPQogICAgICAgICAgICAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYmRydl9wcml2YXRlLCBrZXZlbnQpOwogICAgemRldl90ICpkZXYgPSBtYWNwLT5kZXZpY2U7CgogICAgaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikmc21wX2tldmVudF9Mb2NrKSkKICAgIHsKICAgICAgICAvL3NjaGVkdWxlX3dvcmsoJm1hY3AtPmtldmVudCk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGRvd24oJm1hY3AtPmlvY3RsX3NlbSk7CgogICAgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChLRVZFTlRfV0FUQ0hET0csICZtYWNwLT5rZXZlbnRfZmxhZ3MpKQogICAgewogICAgZXh0ZXJuIHUxNl90IHpmSHBTdGFydFJlY3YoemRldl90ICpkZXYpOwogICAgICAgIC8vemZpSHdXYXRjaERvZ1JlaW5pdChkZXYpOwogICAgICAgIHByaW50aygoIlxuICoqKioqKioqKioqKiBIdyB3YXRjaERvZyBvY2N1ciEhICoqKioqKioqKioqKioqIFxuIikpOwogICAgICAgIHpmaVdsYW5TdXNwZW5kKGRldik7CiAgICAgICAgemZpV2xhblJlc3VtZShkZXYsMCk7CiAgICAgICAgemZIcFN0YXJ0UmVjdihkZXYpOwogICAgfQoKICAgIGNsZWFyX2JpdCgwLCAodm9pZCAqKSZzbXBfa2V2ZW50X0xvY2spOwogICAgdXAoJm1hY3AtPmlvY3RsX3NlbSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICB6ZkxueENyZWF0ZVRocmVhZCAgICAgICAgICAgICovCi8qICAgICAgQ3JlYXRlIGEgVGhyZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgYWx3YXlzIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgWXVhbi1HdSBXZWkgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMyAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnU4X3QgemZMbnhDcmVhdGVUaHJlYWQoemRldl90ICpkZXYpCnsKICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKCiAgICAvKiBDcmVhdGUgTXV0ZXggYW5kIGtldmVudGQgKi8KICAgIElOSVRfV09SSygmbWFjcC0+a2V2ZW50LCBrZXZlbnQpOwogICAgaW5pdF9NVVRFWCgmbWFjcC0+aW9jdGxfc2VtKTsKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgIHpmTG54U2lnbmFsVGhyZWFkICAgICAgICAgICAgKi8KLyogICAgICBTaWduYWwgVGhyZWFkIHdpdGggRmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBmbGFnIDogc2lnbmFsIHRocmVhZCBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBZdWFuLUd1IFdlaSAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4zICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB6ZkxueFNpZ25hbFRocmVhZCh6ZGV2X3QgKmRldiwgaW50IGZsYWcpCnsKICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKCiAgICBpZiAobWFjcCA9PSBOVUxMKQogICAgewogICAgICAgIHByaW50aygibWFjcCBpcyBOVUxMXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKDAgJiYgbWFjcC0+a2V2ZW50X3JlYWR5ICE9IDEpCiAgICB7CiAgICAgICAgcHJpbnRrKCJLZXZlbnQgbm90IHJlYWR5XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgc2V0X2JpdChmbGFnLCAmbWFjcC0+a2V2ZW50X2ZsYWdzKTsKCiAgICBpZiAoIXNjaGVkdWxlX3dvcmsoJm1hY3AtPmtldmVudCkpCiAgICB7CiAgICAgICAgLy9GYWlscyBpcyBOb3JtYWwKICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAic2NoZWR1bGVfdGFzayBmYWlsZWQsIGZsYWcgPSAleFxuIiwgZmxhZyk7CiAgICB9Cn0KCi8qIE5vdGlmeSB3cmFwcGVyIHRvZG8gcmVkb3dubG9hZCBmaXJtd2FyZSBhbmQgcmVpbml0IHByb2NlZHVyZSB3aGVuICovCi8qIGhhcmR3YXJlIHdhdGNoZG9nIG9jY3VyIDogemZpSHdXYXRjaERvZ1JlaW5pdCgpICovCnZvaWQgemZMbnhXYXRjaERvZ05vdGlmeSh6ZGV2X3QqIGRldikKewogICAgemZMbnhTaWduYWxUaHJlYWQoZGV2LCBLRVZFTlRfV0FUQ0hET0cpOwp9CgovKiBRdWVyeSBEdXJhbnRpb24gb2YgQWN0aXZlIFNjYW4gKi8Kdm9pZCB6ZndHZXRBY3RpdmVTY2FuRHVyKHpkZXZfdCogZGV2LCB1OF90KiBEdXIpCnsKICAgICpEdXIgPSAzMDsgLy8gZGVmYXVsdCAzMCBtcwp9Cgp2b2lkIHpmd0dldFNob3daZXJvTGVuZ3RoU1NJRCh6ZGV2X3QqIGRldiwgdThfdCogRHVyKQp7CiAgICAqRHVyID0gMDsKfQoK