I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiNpbmNsdWRlICJzb2Z0YXBfYXBpLmgiCiNpbmNsdWRlICJ6dGVfdnNpbV9hcGkuaCIKCiNkZWZpbmUgVlNJTV9NQVhfTVNHX0xFTgkxMDI0CiNkZWZpbmUgdnNpbV9kZWJ1Z19wcmludGYgcHJpbnRmIAp1aW50OF90IGJXaXRoVnNpbUFwcCA9IDE7IC8vICAwILK7tPjTptPDICAgIDEgtPjTptPDCgplbnVtewoJTVNHX0NNRF9WU0lNX0dFVF9TV0lUQ0ggPSAxLC8vQVTU2sTE0ru0/beiCglNU0dfQ01EX1ZTSU1fU0VUX1NXSVRDSCwKCU1TR19DTURfVlNJTV9HRVRfU1RBTkRCWSwvL7/Nu6fJ6NbDtP27+rLgLL/JxNyyu8rHtbHHsLWxx7C0/bv6suAsscjI51RBVQoJTVNHX0NNRF9WU0lNX1NFVF9TVEFOREJZLAoJTVNHX0NNRF9WU0lNX0dFVF9UQVVJTkcsLy/V/dTa1/ZUQVUs08PT2rz4yKjB97PMx9C72Mq1zOW/qMXQts8KCU1TR19DTURfVlNJTV9TRVRfVEFVSU5HLAoJTVNHX0NNRF9WU0lNX0dFVF9BVVRISU5HLC8v1f3U2tf2vPjIqCy0y8qxvfvWuVRBVQoJTVNHX0NNRF9WU0lNX1NFVF9BVVRISU5HLAoJTVNHX0NNRF9WU0lNX0dFVF9DQVJEX1NUQVQsLy+78cihtbHHsLXXsuPKtbzKtP27+rLgCglNU0dfQ01EX1ZTSU1fQVBEVSwKCU1TR19DTURfVlNJTV9HRVRfRkxPV19TVEFUSVNUSUMsLy+78cihtbHHsMH3wb/Ns7zGCglNU0dfQ01EX1ZTSU1fUkVTRVRfRkxPV19TVEFUSVNUSUMsLy/W2NbDtbHHsMH3wb/Ns7zGCglNU0dfQ01EX1ZTSU1fR0VUX1NDQU5JTkcsLy/V/XNjYW4stMvKsb371rlUQVUKCU1TR19DTURfVlNJTV9TRVRfU0NBTklORywKCU1TR19DTURfVlNJTV9NQVgsCn07Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICB1bnNpZ25lZCBzaG9ydCB1c01zZ0NtZDsgICAgICAgICAgICAgICAvKiDP+8+iwODQzSAqLyAgCiAgICB1bnNpZ25lZCBzaG9ydCB1c0RhdGFMZW47ICAgICAgICAgICAgICAgIC8qIM/7z6KzpLbIo6yw/MCozbeyvyAqLyAgCiAgICB1bnNpZ25lZCBjaGFyIGF1Y0RhdGFCdWZbVlNJTV9NQVhfTVNHX0xFTl07ICAvKiDP+8+i1f3OxCAqLyAgCn0gVlNJTV9NU0dfQlVGOwoKcHRocmVhZF9tdXRleF90IHZzaW1fYXRfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwpwdGhyZWFkX3QgcmVhZF90aHJlYWRfdGlkOwpwdGhyZWFkX3QgbXNnX3RocmVhZF90aWQ7CmludCBnX3JlYWRfdGhyZWFkX3N0YXRlID0gLTE7CmludCBnX21zZ190aHJlYWRfc3RhdGUgPSAtMTsKVlNJTV9DT01NQU5EIGdfdnNpbV9hcGR1X3Byb2Nlc3NfY2I7ClNvZnRTaW1fQ09NTUFORCBnX3NvZnRzaW1fYXBkdV9wcm9jZXNzX2NiOwp6dGVfbWRtX2V2ZW50X2luZF9jYWxsYmFjayBnX3ZzaW1fZXZlbnRfaW5kX2NiOwp1bnNpZ25lZCBjaGFyIGdfdnNpbV9zbG90WzJdOwppbnQgZ19zaW1fc3RhdHVzWzJdID0gey0xLC0xfTsKCmludDMyX3QgenRlX21kbV9ldmVudF9pbmRfY2IoRV9NT0RFTV9FVkVOVF9JRCBldmVudF9pZCwgdm9pZCAqaW5kX2RhdGEsIHVpbnQzMl90ICBpbmRfZGF0YV9sZW4pCnsKCXByaW50ZigiIyN2c2ltIyMgWyVzXSBldmVudF9pZD0lZCBsZW49JWQgXG4iLCBfX0ZVTkNUSU9OX18sIGV2ZW50X2lkLCBpbmRfZGF0YV9sZW4pOwoJcmV0dXJuIDA7Cn0KaW50IHp0ZV92c2ltX2luZF9jYih1aW50OF90ICphcGR1X3JlcSwgdWludDE2X3QgYXBkdV9yZXFfbGVuLHVpbnQ4X3QgKmFwZHVfcnNwLCB1aW50MTZfdCAqYXBkdV9yc3BfbGVuLCB1aW50OF90IHNsb3QpCnsKCWNoYXIgYWRkcls2NF0gPSB7MH07CgljaGFyIGNtZFsxMjhdID0gezB9OwoJCglzY19jZmdfZ2V0KCJ2c2ltX2RlYnVnX2lwIixhZGRyLHNpemVvZihhZGRyKSk7CglpZihzdHJsZW4oYWRkcikpewoJCXNucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksICJwaW5nICVzIC13IDUiLCBhZGRyKTsKCQlzeXN0ZW0oY21kKTsKCX1lbHNlCgkJc3lzdGVtKCJwaW5nIDE5Mi4xNjguMzAuMTEwIC13IDUiKTsKCXJldHVybiAwOwp9CgoKc3RhdGljIGludCB2c2ltX3NlbmRfYXQoY2hhciAqcmVxX2F0LCBjaGFyICppbmZvX2ZtdCwgdm9pZCAqKnB2YWwpCnsKCWludCByZXQ7CglwdGhyZWFkX211dGV4X2xvY2soJnZzaW1fYXRfbXV0ZXgpOwoJcmV0ID0gZ2V0X21vZGVtX2luZm8ocmVxX2F0LGluZm9fZm10LHB2YWwpOwoJcHRocmVhZF9tdXRleF91bmxvY2soJnZzaW1fYXRfbXV0ZXgpOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCB2c2ltX2NhcmRfc3dpdGNoX3JlcSh1bnNpZ25lZCBjaGFyIHNpbSkKewoJaW50IHJldCA9IDA7CglpZihzaW0pCgkJcmV0ID0gdnNpbV9zZW5kX2F0KCJBVCtaQ0FSRFNXSVRDSFJFUT0wLDFcclxuIiwgTlVMTCwgTlVMTCk7CgllbHNlCgkJcmV0ID0gdnNpbV9zZW5kX2F0KCJBVCtaQ0FSRFNXSVRDSFJFUT0xLDBcclxuIiwgTlVMTCwgTlVMTCk7CglpZihyZXQgIT0gMCl7CgkJcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHNpbT0lZCByZXQ9JWQgZXJyXG4iLCBfX0ZVTkNUSU9OX18sIHNpbSwgcmV0KTsKCX0KCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHNpbT0lZCByZXQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgc2ltLCByZXQpOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCB2c2ltX3NldCh1bnNpZ25lZCBzaG9ydCBtc2csIHVuc2lnbmVkIGNoYXIgcGFyYW0pCnsKCVZTSU1fTVNHX0JVRiBtc2dfaW4gPSB7MH07CglWU0lNX01TR19CVUYgbXNnX291dCA9IHswfTsKCWludCByZXQgPSAwOwoJCgltc2dfaW4udXNNc2dDbWQgPSBtc2c7Cgltc2dfaW4uYXVjRGF0YUJ1ZlswXSA9IHBhcmFtOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gbXNnPSVkIHBhcmFtPSVkIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18sIG1zZywgcGFyYW0pOwoJaWYobXNnID09IE1TR19DTURfVlNJTV9TRVRfU1dJVENIKQoJCXB0aHJlYWRfbXV0ZXhfbG9jaygmdnNpbV9hdF9tdXRleCk7CglyZXQgPSBzeXNjYWxsKF9fTlJfdnNpbV9wcm9jLCh1bnNpZ25lZCBjaGFyICopJm1zZ19pbiwgKHVuc2lnbmVkIGNoYXIgKikmbXNnX291dCk7CglpZihtc2cgPT0gTVNHX0NNRF9WU0lNX1NFVF9TV0lUQ0gpCgkJcHRocmVhZF9tdXRleF91bmxvY2soJnZzaW1fYXRfbXV0ZXgpOwoJaWYocmV0ID09IDApewoJCXByaW50ZigiIyN2c2ltIyMgWyVzXSBtc2c9JWQgcGFyYW09JWQgZXJyXG4iLCBfX0ZVTkNUSU9OX18sIG1zZywgcGFyYW0pOwoJfQoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHVuc2lnbmVkIGNoYXIgdnNpbV9nZXQodW5zaWduZWQgc2hvcnQgbXNnKQp7CglWU0lNX01TR19CVUYgbXNnX2luID0gezB9OwoJVlNJTV9NU0dfQlVGIG1zZ19vdXQgPSB7MH07CglpbnQgcmV0ID0gMDsKCQoJbXNnX2luLnVzTXNnQ21kID0gbXNnOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gbXNnPSVkIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18sIG1zZyk7CglyZXQgPSBzeXNjYWxsKF9fTlJfdnNpbV9wcm9jLCh1bnNpZ25lZCBjaGFyICopJm1zZ19pbiwgKHVuc2lnbmVkIGNoYXIgKikmbXNnX291dCk7CglpZihyZXQgPT0gMCl7CgkJcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIG1zZz0lZCBlcnJcbiIsIF9fRlVOQ1RJT05fXywgbXNnKTsKCX0KCXJldHVybiBtc2dfb3V0LmF1Y0RhdGFCdWZbMF07Cn0KCnN0YXRpYyBpbnQgdnNpbV9nZXRfY2FyZHN0YXRfZnJvbXBzKHZvaWQpCnsKCVZTSU1fTVNHX0JVRiBtc2dfaW4gPSB7MH07CglWU0lNX01TR19CVUYgbXNnX291dCA9IHswfTsKCWludCByZXQgPSAwOwoJCgltc2dfaW4udXNNc2dDbWQgPSBNU0dfQ01EX1ZTSU1fR0VUX0NBUkRfU1RBVDsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJcmV0ID0gc3lzY2FsbChfX05SX3ZzaW1fcHJvYywodW5zaWduZWQgY2hhciAqKSZtc2dfaW4sICh1bnNpZ25lZCBjaGFyICopJm1zZ19vdXQpOwoJaWYocmV0ID09IDAgfHwgbXNnX291dC5hdWNEYXRhQnVmWzBdID09IG1zZ19vdXQuYXVjRGF0YUJ1ZlsxXSB8fCBtc2dfb3V0LmF1Y0RhdGFCdWZbMl0pewoJCXByaW50ZigiIyN2c2ltIyMgWyVzXSBlcnIgcmV0PSVkIHNpbTE9JWQgc2ltMj0lZCBidXN5PSVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCwgbXNnX291dC5hdWNEYXRhQnVmWzBdLCBtc2dfb3V0LmF1Y0RhdGFCdWZbMV0sIG1zZ19vdXQuYXVjRGF0YUJ1ZlsyXSk7CgkJcmV0dXJuIC0xOwoJfQoJaWYobXNnX291dC5hdWNEYXRhQnVmWzBdKQoJCXJldHVybiAwOwoJaWYobXNnX291dC5hdWNEYXRhQnVmWzFdKQoJCXJldHVybiAxOwoJcmV0dXJuIC0xOwp9CgpzdGF0aWMgdm9pZCByZWFkX3RocmVhZF9lbnRyeSh2b2lkICphcmcpCnsKCXByY3RsKFBSX1NFVF9OQU1FLCAidnNpbV9yZWFkIiwgMCwgMCwgMCk7Cgl3aGlsZShnX3ZzaW1fZXZlbnRfaW5kX2NiKQoJewoJCVZTSU1fTVNHX0JVRiBtc2dfaW4gPSB7MH07CgkJVlNJTV9NU0dfQlVGIG1zZ19vdXQgPSB7MH07CgkJaW50IHJldCA9IDA7CgkJaW50IGlzX2F1dGggPSAwOwoJCWludCBpc19zbG90MSA9IDA7CgkJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0ID0gc3lzY2FsbChfX05SX3ZzaW1fcmVhZCwodW5zaWduZWQgY2hhciAqKSZtc2dfb3V0KTsKCQlpZihyZXQgPT0gMCl7CgkJCXByaW50ZigiIyN2c2ltIyMgcmVhZCBmYWlsXG4iKTsKCQl9CgkJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIHJlYWQgbXNnPSVkXG4iLCBtc2dfb3V0LnVzTXNnQ21kKTsKCQlpZihtc2dfb3V0LnVzTXNnQ21kICE9IE1TR19DTURfVlNJTV9BUERVIHx8IHJldCA9PSAwKXsKCQkJcHJpbnRmKCIjI3ZzaW0jIyByZWFkIG1zZz0lZCByZXQ9JWQgZXJyXG4iLCBtc2dfb3V0LnVzTXNnQ21kLCByZXQpOwoJCX0KCQlpc19hdXRoID0gbXNnX291dC5hdWNEYXRhQnVmWzFdOwoJCWlzX3Nsb3QxID0gbXNnX291dC5hdWNEYXRhQnVmWzBdOwoJCS8vx9DKtczlv6gKCQlpZihpc19hdXRoICYmIGdfdnNpbV9zbG90W21zZ19vdXQuYXVjRGF0YUJ1ZlswXV0gJiYgaXNfc2xvdDEpewoJCQlwcmludGYoIiMjdnNpbSMjIHZzaW1fYXBkdV9hdXRoIHN0YW5kYnk9JWRcbiIsIHZzaW1fZ2V0KE1TR19DTURfVlNJTV9HRVRfU1RBTkRCWSkpOwoJCQl2c2ltX3NldChNU0dfQ01EX1ZTSU1fU0VUX0FVVEhJTkcsMSk7CgkJCXVzbGVlcCgyMDAwMCk7Ly+xo7uktOvKqSzR07PZMjC6wcPr1NnPwreix9C/qKOssaPWpLz4yKjH68fztcRybGMgYWNru9i4tLj4zfiy4AoJCQl2c2ltX2NhcmRfc3dpdGNoX3JlcSgwKTsvL7TLyrHKtczlv6i/ycTctObU2s34wufBtL3To6zPyMfQzfjU2cfQyv2+3QoJCQl2c2ltX3NldChNU0dfQ01EX1ZTSU1fU0VUX1NUQU5EQlksMCk7CgkJfQoJCW1zZ19pbi51c0RhdGFMZW4gPSBzaXplb2YobXNnX2luLmF1Y0RhdGFCdWYpOwoJCWlmKGdfdnNpbV9hcGR1X3Byb2Nlc3NfY2IgJiYgbXNnX291dC5hdWNEYXRhQnVmWzBdIDwgMiAmJiBnX3ZzaW1fc2xvdFttc2dfb3V0LmF1Y0RhdGFCdWZbMF1dID09IDEpewoJCQlyZXQgPSBnX3ZzaW1fYXBkdV9wcm9jZXNzX2NiKCZtc2dfb3V0LmF1Y0RhdGFCdWZbMl0sIG1zZ19vdXQudXNEYXRhTGVuLCBtc2dfaW4uYXVjRGF0YUJ1ZiwgCgkJCSZtc2dfaW4udXNEYXRhTGVuLCBtc2dfb3V0LmF1Y0RhdGFCdWZbMF0pOwoJCX0KCQlpZihnX3NvZnRzaW1fYXBkdV9wcm9jZXNzX2NiICYmIG1zZ19vdXQuYXVjRGF0YUJ1ZlswXSA8IDIgJiYgZ192c2ltX3Nsb3RbbXNnX291dC5hdWNEYXRhQnVmWzBdXSA9PSAyKXsKCQkJcmV0ID0gZ19zb2Z0c2ltX2FwZHVfcHJvY2Vzc19jYigmbXNnX291dC5hdWNEYXRhQnVmWzJdLCBtc2dfb3V0LnVzRGF0YUxlbiwgbXNnX2luLmF1Y0RhdGFCdWYsIAoJCQkmbXNnX2luLnVzRGF0YUxlbiwgbXNnX291dC5hdWNEYXRhQnVmWzBdKTsKCQl9CgkJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIGdfdnNpbV9hcGR1X3Byb2Nlc3NfY2IgcmV0PTB4JXggbGVuPSVkXG4iLCByZXQsIG1zZ19pbi51c0RhdGFMZW4pOwoJCS8vx9DQ6cTiv6gKCQlpZihpc19hdXRoICYmIGdfdnNpbV9zbG90W21zZ19vdXQuYXVjRGF0YUJ1ZlswXV0gJiYgaXNfc2xvdDEpewoJCQl2c2ltX3NldChNU0dfQ01EX1ZTSU1fU0VUX1NUQU5EQlksMSk7Ly+0y8qx1Ma/qNOmuMPOtL2ozfjC58G0vdOjrM/Ix9DK/b7d1NnH0M34CgkJCXZzaW1fY2FyZF9zd2l0Y2hfcmVxKDEpOwoJCQl2c2ltX3NldChNU0dfQ01EX1ZTSU1fU0VUX0FVVEhJTkcsMCk7CgkJfQoJCS8vbXNnX2luLnVzRGF0YUxlbiA9IHJldDu3tbvYsrvKx7OktsjKx9e0zKzX1goJCW1zZ19pbi51c01zZ0NtZCA9IE1TR19DTURfVlNJTV9BUERVOwoJCXJldCA9IHN5c2NhbGwoX19OUl92c2ltX3dyaXRlLCh1bnNpZ25lZCBjaGFyICopJm1zZ19pbik7CgkJaWYocmV0ID09IDApewoJCQlwcmludGYoIiMjdnNpbSMjIHdyaXRlIGZhaWxcbiIpOwoJCX0KCX0KCXByaW50ZigiIyN2c2ltIyMgcmVhZF90aHJlYWQgcXVpdFxuIik7CglnX3JlYWRfdGhyZWFkX3N0YXRlID0gLTE7CglwdGhyZWFkX2V4aXQoMCk7Cn0KCnN0YXRpYyB2b2lkIG1zZ190aHJlYWRfZW50cnkodm9pZCAqYXJnKQp7CglpbnQgaU1zZ0hhbmRsZSA9IG1zZ2dldChNT0RVTEVfSURfVlNJTSwgSVBDX0NSRUFUfDA2MDApOwoJTE9ORyBtc2dTaXplID0gc2l6ZW9mKE1TR19CVUYpLXNpemVvZihMT05HKTsKCXVuc2lnbmVkIGNoYXIgU3dpdGNoU3RhdDsKCQoJcHJjdGwoUFJfU0VUX05BTUUsICJ2c2ltX21zZyIsIDAsIDAsIDApOwoJd2hpbGUoZ192c2ltX2V2ZW50X2luZF9jYikKCXsKCQlNU0dfQlVGIHN0TXNnID0gezB9OwoJCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJCWlmIChtc2dyY3YoaU1zZ0hhbmRsZSwgJnN0TXNnLCBtc2dTaXplLCAwLCAwKSA+PSAwKQoJCXsKCQkJc3dpdGNoIChzdE1zZy51c01zZ0NtZCkKCQkJewoJCQljYXNlIE1TR19DTURfWkNBUkRTV0lUQ0hJTkRfSU5EOgoJCQkJLy9jYWxsYmFjayB0b2RvCgkJCQlTd2l0Y2hTdGF0ID0gc3RNc2cuYXVjRGF0YUJ1ZlsxXTsKCQkJCWlmKHZzaW1fZ2V0KE1TR19DTURfVlNJTV9HRVRfQVVUSElORykgfHwgdnNpbV9nZXQoTVNHX0NNRF9WU0lNX0dFVF9TQ0FOSU5HKSl7CgkJCQkJcHJpbnRmKCIjI3ZzaW0jIyBaQ0FSRFNXSVRDSElORCBBVVRISU5HIGFib3J0XG4iKTsKCQkJCQlpZihTd2l0Y2hTdGF0KQoJCQkJCQl2c2ltX3NldChNU0dfQ01EX1ZTSU1fU0VUX1RBVUlORywwKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJCWlmKFN3aXRjaFN0YXQgPT0gMCl7CgkJCQkJdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1NFVF9UQVVJTkcsMSk7CgkJCQkJdnNpbV9jYXJkX3N3aXRjaF9yZXEoc3RNc2cuYXVjRGF0YUJ1ZlswXSk7CgkJCQl9ZWxzZXsKCQkJCQlpZih2c2ltX2dldChNU0dfQ01EX1ZTSU1fR0VUX1NUQU5EQlkpID09IHN0TXNnLmF1Y0RhdGFCdWZbMF0pCgkJCQkJCXZzaW1fY2FyZF9zd2l0Y2hfcmVxKHN0TXNnLmF1Y0RhdGFCdWZbMF0pOwoJCQkJCXZzaW1fc2V0KE1TR19DTURfVlNJTV9TRVRfVEFVSU5HLDApOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgTVNHX0NNRF9DUkVHX0lORDoKCQkJCXsKCQkJCQl1aW50OF90IG5TaW1JRCA9IHZzaW1fZ2V0KE1TR19DTURfVlNJTV9HRVRfU1RBTkRCWSk7CgkJCQkJaWYoblNpbUlEID09IHZzaW1fZ2V0X2NhcmRzdGF0X2Zyb21wcygpKQoJCQkJCQlnX3ZzaW1fZXZlbnRfaW5kX2NiKEVfTldfQVRUQUNIX0NPTU1QTEVURV9FVkVOVCwgblNpbUlELCAxKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlIE1TR19DTURfWlNDSVNDQU5fSU5EOgoJCQkJewoJCQkJCXVpbnQ4X3QgblNpbUlEID0gdnNpbV9nZXQoTVNHX0NNRF9WU0lNX0dFVF9TQ0FOSU5HKTsKCQkJCQlSZWdJbmZvX3QgcmVnX2luZm8gPSB7MH07CgkJCQkJbHRlX2NlbGxpbmZvX3QgY2VsbF9pbmZvID0gezB9OwoJCQkJCWx0ZV9TY2VsbF90IGNlbGxbMjBdID0gezB9OwoJCQkJCWx0ZV9TY2VsbF90IGNlbGxfb3JkZXJbMjBdID0gezB9OwoJCQkJCWludCByZWdfcmV0ID0gMDsKCQkJCQlpbnQgaSA9IDA7CgkJCQkJaW50IGogPSAwOwoJCQkJCW1lbWNweShjZWxsLCBzdE1zZy5hdWNEYXRhQnVmLCBzaXplb2YobHRlX1NjZWxsX3QpKjIwKTsKCQkJCQlpZihuU2ltSUQgIT0gMCl7CgkJCQkJCW5TaW1JRC0tOwoJCQkJCQlyZWdfcmV0ID0genRlX0dldFJlZ0luZm9ieVNpbWlkKCZyZWdfaW5mbywgblNpbUlEKTsKCQkJCQkJdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1NFVF9TQ0FOSU5HLDApOwoJCQkJCQlmb3IoaSA9IDA7IGkgPCAyMDsgaSsrKXsKCQkJCQkJCWZvcihqID0gMDsgaiA8IDIwOyBqKyspewoJCQkJCQkJCWlmKChjZWxsX29yZGVyW2pdLmJhc2VfU2NlbGxfaW5mby5tY2MgPT0gMCAmJiBjZWxsX29yZGVyW2pdLmJhc2VfU2NlbGxfaW5mby5tbmMgPT0gMCkKCQkJCQkJCQl8fChjZWxsX29yZGVyW2pdLmJhc2VfU2NlbGxfaW5mby5tY2MgPT0gY2VsbFtpXS5iYXNlX1NjZWxsX2luZm8ubWNjIAoJCQkJCQkJCQkmJiBjZWxsX29yZGVyW2pdLmJhc2VfU2NlbGxfaW5mby5tbmMgPT0gY2VsbFtpXS5iYXNlX1NjZWxsX2luZm8ubW5jIAoJCQkJCQkJCQkmJiBjZWxsX29yZGVyW2pdLm5ldE1vZGUgPT0gY2VsbFtpXS5uZXRNb2RlKSl7CgkJCQkJCQkJCWlmKGNlbGxbaV0ucnNycCA+IGNlbGxfb3JkZXJbal0ucnNycCkKCQkJCQkJCQkJCW1lbWNweSgmY2VsbF9vcmRlcltqXSwgJmNlbGxbaV0sIHNpemVvZihsdGVfU2NlbGxfdCkpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWlmKHJlZ19yZXQgPT0gMCAmJiBjZWxsW2ldLmJhc2VfU2NlbGxfaW5mby5jZWxsX2lkID09IHJlZ19pbmZvLmx0ZV9zY2VsbF9pbmZvLmNlbGxfaWQpewoJCQkJCQkJCW1lbWNweSgmY2VsbF9pbmZvLmx0ZVNjZWxsLCAmY2VsbFtpXSwgc2l6ZW9mKGx0ZV9TY2VsbF90KSk7CgkJCQkJCQkJY2VsbF9pbmZvLmx0ZVNjZWxsLnJvYW1pbmdGbGFnID0gcmVnX2luZm8ubHRlX3NjZWxsX2luZm8ucm9hbWluZ0ZsYWc7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZm9yKGkgPSAwOyBpIDwgMjA7IGkrKyl7CgkJCQkJCQlmb3IoaiA9IDA7IGogPCA2OyBqKyspewoJCQkJCQkJCWlmKGNlbGxfaW5mby5sdGVOY2VsbFtqXS5iYXNlX05jZWxsX2luZm8ubWNjID09IDAgJiYgY2VsbF9pbmZvLmx0ZU5jZWxsW2pdLmJhc2VfTmNlbGxfaW5mby5tbmMgPT0gMCAKCQkJCQkJCQkJJiYgKGNlbGxfb3JkZXJbaV0uYmFzZV9TY2VsbF9pbmZvLm1jYyAhPSAwIHx8IGNlbGxfb3JkZXJbaV0uYmFzZV9TY2VsbF9pbmZvLm1uYyAhPSAwKSl7CgkJCQkJCQkJCW1lbWNweSgmY2VsbF9pbmZvLmx0ZU5jZWxsW2pdLmJhc2VfTmNlbGxfaW5mbywgJmNlbGxfb3JkZXJbaV0uYmFzZV9TY2VsbF9pbmZvLCBzaXplb2YoYmFzZV9jZWxsX2luZm9fdCkpOwoJCQkJCQkJCQljZWxsX2luZm8ubHRlTmNlbGxbal0ucnNycCA9IGNlbGxfb3JkZXJbaV0ucnNycDsKCQkJCQkJCQkJY2VsbF9pbmZvLmx0ZU5jZWxsW2pdLnJzcnEgPSBjZWxsX29yZGVyW2ldLnJzcnE7CgkJCQkJCQkJCWNlbGxfaW5mby5sdGVOY2VsbFtqXS5uZXRNb2RlID0gY2VsbF9vcmRlcltpXS5uZXRNb2RlOwoJCQkJCQkJCQljZWxsX2luZm8ubHRlTmNlbGxOdW0rKzsKCQkJCQkJCQl9CgkJCQkJCQkJaWYoY2VsbF9pbmZvLmx0ZU5jZWxsTnVtID09IDYpewoJCQkJCQkJCQlpZihjZWxsX29yZGVyW2ldLnJzcnAgPiBjZWxsX2luZm8ubHRlTmNlbGxbal0ucnNycCl7CgkJCQkJCQkJCQltZW1jcHkoJmNlbGxfaW5mby5sdGVOY2VsbFtqXS5iYXNlX05jZWxsX2luZm8sICZjZWxsX29yZGVyW2ldLmJhc2VfU2NlbGxfaW5mbywgc2l6ZW9mKGJhc2VfY2VsbF9pbmZvX3QpKTsKCQkJCQkJCQkJCWNlbGxfaW5mby5sdGVOY2VsbFtqXS5yc3JwID0gY2VsbF9vcmRlcltpXS5yc3JwOwoJCQkJCQkJCQkJY2VsbF9pbmZvLmx0ZU5jZWxsW2pdLnJzcnEgPSBjZWxsX29yZGVyW2ldLnJzcnE7CgkJCQkJCQkJCQljZWxsX2luZm8ubHRlTmNlbGxbal0ubmV0TW9kZSA9IGNlbGxfb3JkZXJbaV0ubmV0TW9kZTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlnX3ZzaW1fZXZlbnRfaW5kX2NiKEVfR0VUX0NFTExJTkZPX0JZX1NJTUlEX0VWRU5ULCAmY2VsbF9pbmZvLCBzaXplb2YoY2VsbF9pbmZvKSk7CgkJCQkJfQoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgTVNHX0NNRF9WU0lNREVCVUdfSU5EOgoJCQkJaWYoc3RNc2cuYXVjRGF0YUJ1ZlswXSA9PSAxKXsKCQkJCQljaGFyIGltZWlbXT0iODYyNzY5MDI1NDM1OTU2IjsKCQkJCQlmaWJvX3NldF9JTUVJX2J5X3NpbWlkKGltZWksc2l6ZW9mKGltZWkpLDEpOwoJCQkJCWZpYm9fbWRtX2V2ZW50X3JlZ2lzdCh6dGVfbWRtX2V2ZW50X2luZF9jYik7CgkJCQkJdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1NFVF9TVEFOREJZLDEpOy8vtMvKsdTGv6jOtL2ozfjC58G0vdOjrM/Ix9DK/b7d1NnH0M34CgkJCQkJdnNpbV9jYXJkX3N3aXRjaF9yZXEoMSk7CgkJCQkJdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1NFVF9TV0lUQ0gsMSk7CgkJCQkJdnNpbV9zZW5kX2F0KCJBVCtDRlVOPTFcclxuIiwgTlVMTCwgTlVMTCk7CgkJCQkJZ192c2ltX3Nsb3RbMV0gPSAxOwoJCQkJfQoJCQkJaWYoc3RNc2cuYXVjRGF0YUJ1ZlswXSA9PSAyKXsKCQkJCQlmaWJvX3ZzaW1fY2xvc2UoenRlX3ZzaW1faW5kX2NiLDEpOwoJCQkJfQoJCQkJaWYoc3RNc2cuYXVjRGF0YUJ1ZlswXSA9PSAxMCl7CgkJCQkJenRlX1NldEdUREFUQVNJTSgwKTsKCQkJCX0KCQkJCWlmKHN0TXNnLmF1Y0RhdGFCdWZbMF0gPT0gMTEpewoJCQkJCXp0ZV9TZXRHVERBVEFTSU0oMSk7CgkJCQl9CgkJCQlpZihzdE1zZy5hdWNEYXRhQnVmWzBdID09IDIwKXsKCQkJCQl6dGVfU2V0R1REVUFMU0lNKDApOwoJCQkJfQoJCQkJaWYoc3RNc2cuYXVjRGF0YUJ1ZlswXSA9PSAyMSl7CgkJCQkJenRlX1NldEdURFVBTFNJTSgxKTsKCQkJCX0KCQkJCWlmKHN0TXNnLmF1Y0RhdGFCdWZbMF0gPT0gMzApewoJCQkJCWJXaXRoVnNpbUFwcCA9IDA7CgkJCQkgICAgZmlib19Tb2Z0U2ltX2luaXQoenRlX3ZzaW1faW5kX2NiLDApOwoJCQkJfQoJCQkJaWYoc3RNc2cuYXVjRGF0YUJ1ZlswXSA9PSA0MCl7CgkJCQkJZmlib19Tb2Z0U2ltX2Nsb3NlKHp0ZV92c2ltX2luZF9jYiwwKTsKCQkJCX0KCQkJCWlmKHN0TXNnLmF1Y0RhdGFCdWZbMF0gPT0gMzEpewoJCQkJCWJXaXRoVnNpbUFwcCA9IDA7CgkJCQkJZmlib19Tb2Z0U2ltX2luaXQoenRlX3ZzaW1faW5kX2NiLDEpOwoJCQkJfQoJCQkJaWYoc3RNc2cuYXVjRGF0YUJ1ZlswXSA9PSA0MSl7CgkJCQkJZmlib19Tb2Z0U2ltX2Nsb3NlKHp0ZV92c2ltX2luZF9jYiwxKTsKCQkJCX0KCQkJCWlmKHN0TXNnLmF1Y0RhdGFCdWZbMF0gPT0gNTApewoJCQkJCWZpYm9fZ2V0X0NlbGxJbmZvX2J5X3NpbWlkKDApOwoJCQkJfQoJCQkJaWYoc3RNc2cuYXVjRGF0YUJ1ZlswXSA9PSA1MSl7CgkJCQkJZmlib19nZXRfQ2VsbEluZm9fYnlfc2ltaWQoMSk7CgkJCQl9CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXByaW50ZigiIyN2c2ltIyMgcmN2X21zZyBlcnIgbXNnaWQgMHgleFxuIixzdE1zZy51c01zZ0NtZCk7CgkJCQlicmVhazsKCQkJfQoJCX0KCQl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgcmN2X21zZyBtc2dpZCAweCV4IHBhcmFtPSVkIGVuZFxuIixzdE1zZy51c01zZ0NtZCwgc3RNc2cuYXVjRGF0YUJ1ZlswXSk7Cgl9CglwcmludGYoIiMjdnNpbSMjIG1zZ190aHJlYWQgcXVpdFxuIik7CglnX21zZ190aHJlYWRfc3RhdGUgPSAtMTsKCXB0aHJlYWRfZXhpdCgwKTsKfQoKaW50MzJfdCB6dGVfYXRWc2ltSW5pdChWU0lNX0NPTU1BTkQgdnNpbV9hcGR1X3Byb2Nlc3NfZm4sIHVpbnQ4X3QgblNpbUlEKQp7CgljaGFyIHN0YXRbNF0gPSB7MH07CgkKCXNjX2NmZ19nZXQoInZzaW1fc3RhdCIsc3RhdCxzaXplb2Yoc3RhdCkpOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglpZih2c2ltX2FwZHVfcHJvY2Vzc19mbiA9PSBOVUxMIHx8IG5TaW1JRCAhPSAxIHx8IGdfdnNpbV9hcGR1X3Byb2Nlc3NfY2IgfHwgYXRvaShzdGF0KSl7CgkJcHJpbnRmKCIjI3ZzaW0jIyBpbml0IHBhcmFtIGVyciBmbj0weCV4IG9sZD0weCV4IHNpbT0lZCBzdGF0PSVkXG4iLCAKCQkJdnNpbV9hcGR1X3Byb2Nlc3NfZm4sIGdfdnNpbV9hcGR1X3Byb2Nlc3NfY2IsIG5TaW1JRCwgYXRvaShzdGF0KSk7CgkJcmV0dXJuIC0xOwoJfQoJZ192c2ltX2FwZHVfcHJvY2Vzc19jYiA9IHZzaW1fYXBkdV9wcm9jZXNzX2ZuOwoJaWYoZ19yZWFkX3RocmVhZF9zdGF0ZSAhPSAwKQoJCWdfcmVhZF90aHJlYWRfc3RhdGUgPSBwdGhyZWFkX2NyZWF0ZSgmcmVhZF90aHJlYWRfdGlkLCBOVUxMLCAodm9pZCAqKXJlYWRfdGhyZWFkX2VudHJ5LCBOVUxMKTsKCWlmKGdfbXNnX3RocmVhZF9zdGF0ZSAhPSAwKQoJCWdfbXNnX3RocmVhZF9zdGF0ZSA9IHB0aHJlYWRfY3JlYXRlKCZtc2dfdGhyZWFkX3RpZCwgTlVMTCwgKHZvaWQgKiltc2dfdGhyZWFkX2VudHJ5LCBOVUxMKTsKCWlmKGdfcmVhZF90aHJlYWRfc3RhdGUgIT0gMCB8fCBnX21zZ190aHJlYWRfc3RhdGUgIT0gMCl7CgkJcHJpbnRmKCIjI3ZzaW0jIyBpbml0IGZhaWwgcmVhZD0lZCBtc2c9JWRcbiIsIGdfcmVhZF90aHJlYWRfc3RhdGUsIGdfbXNnX3RocmVhZF9zdGF0ZSk7CgkJcmV0dXJuIC0xOwoJfQoJZ192c2ltX3Nsb3RbMV0gPSAxOwoJZ19zaW1fc3RhdHVzWzFdID0gLTE7CglzY19jZmdfc2V0KCJ2c2ltX3N0YXQiLCIxIik7Cgl2c2ltX3NldChNU0dfQ01EX1ZTSU1fU0VUX1NUQU5EQlksMSk7Ly+0y8qx1Ma/qM60vajN+MLnwbS906Osz8jH0Mr9vt3U2cfQzfgKCXZzaW1fY2FyZF9zd2l0Y2hfcmVxKDEpOwoJdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1NFVF9TV0lUQ0gsMSk7Cgl2c2ltX3NlbmRfYXQoIkFUK1pDQVJEU1dJVENIPTEsMVxyXG4iLCBOVUxMLCBOVUxMKTsKCXZzaW1fc2VuZF9hdCgiQVQrQ0ZVTj0xXHJcbiIsIE5VTEwsIE5VTEwpOwoJcmV0dXJuIDA7Cn0KCmludDMyX3QgenRlX2F0U29mdFNpbUluaXQoU29mdFNpbV9DT01NQU5EIHNvZnRzc2ltX2FwZHVfcHJvY2Vzc19mbiwgIHVpbnQ4X3QgblNpbUlEKQp7CgljaGFyIHN0YXRbNF0gPSB7MH07CgkKCXNjX2NmZ19nZXQoInNvZnRzaW1fc3RhdCIsc3RhdCxzaXplb2Yoc3RhdCkpOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglpZihzb2Z0c3NpbV9hcGR1X3Byb2Nlc3NfZm4gPT0gTlVMTCB8fCAoblNpbUlEICE9IDEgJiYgblNpbUlEICE9IDApIHx8IGdfc29mdHNpbV9hcGR1X3Byb2Nlc3NfY2IgfHwgYXRvaShzdGF0KSl7CgkJcHJpbnRmKCIjI3ZzaW0jIyBzb2Z0IGluaXQgcGFyYW0gZXJyIGZuPTB4JXggb2xkPTB4JXggc2ltPSVkXG4iLCAKCQkJc29mdHNzaW1fYXBkdV9wcm9jZXNzX2ZuLCBnX3NvZnRzaW1fYXBkdV9wcm9jZXNzX2NiLCBuU2ltSUQsIGF0b2koc3RhdCkpOwoJCXJldHVybiAtMTsKCX0KCWdfdnNpbV9zbG90W25TaW1JRF0gPSAyOwoJZ19zaW1fc3RhdHVzW25TaW1JRF0gPSAtMTsKCXNjX2NmZ19zZXQoInNvZnRzaW1fc3RhdCIsIjEiKTsKCWdfc29mdHNpbV9hcGR1X3Byb2Nlc3NfY2IgPSBzb2Z0c3NpbV9hcGR1X3Byb2Nlc3NfZm47CglpZihuU2ltSUQpewoJCXZzaW1fc2V0KE1TR19DTURfVlNJTV9TRVRfU1RBTkRCWSwxKTsvL7TLyrHUxr+ozrS9qM34wufBtL3To6zPyMfQyv2+3dTZx9DN+AoJCXZzaW1fY2FyZF9zd2l0Y2hfcmVxKDEpOwoJCXZzaW1fc2V0KE1TR19DTURfVlNJTV9TRVRfU1dJVENILDEpOwoJCWlmKGJXaXRoVnNpbUFwcCA9PSAxKQoJCXsKCQkJdnNpbV9zZW5kX2F0KCJBVCtaQ0FSRFNXSVRDSD0yLDFcclxuIiwgTlVMTCwgTlVMTCk7CgkJfQoJCWVsc2UKCQl7CgkJCXZzaW1fc2VuZF9hdCgiQVQrWkNBUkRTV0lUQ0g9MywxXHJcbiIsIE5VTEwsIE5VTEwpOwoJCX0KCQl2c2ltX3NlbmRfYXQoIkFUK0NGVU49MVxyXG4iLCBOVUxMLCBOVUxMKTsKCX1lbHNlewoJCXVpbnQ4X3Qgc2ltID0gMDsKCQl1aW50OF90IHJldCA9IDA7CgkJenRlX0dldEdURFVBTFNJTSgmc2ltKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKG5TaW1JRCk7CgkJcmV0ID0gdnNpbV9nZXRfY2FyZHN0YXRfZnJvbXBzKCk7CgkJaWYocmV0ID49IDAgJiYgblNpbUlEICE9IHJldCkKCQkJdnNpbV9jYXJkX3N3aXRjaF9yZXEoblNpbUlEKTsKCQlpZihiV2l0aFZzaW1BcHAgPT0gMSkKCQl7CgkJCXZzaW1fc2VuZF9hdCgiQVQrWkNBUkRTV0lUQ0g9MiwwXHJcbiIsIE5VTEwsIE5VTEwpOwoJCX0KCQllbHNlCgkJewoJCQl2c2ltX3NlbmRfYXQoIkFUK1pDQVJEU1dJVENIPTMsMFxyXG4iLCBOVUxMLCBOVUxMKTsKCQl9CgkJdnNpbV9zZW5kX2F0KCJBVCtDRlVOPTBcclxuIiwgTlVMTCwgTlVMTCk7Ci8vCQl2c2ltX3NlbmRfYXQoIkFUK0NGVU49NVxyXG4iLCBOVUxMLCBOVUxMKTsJCQoJCXZzaW1fc2VuZF9hdCgiQVQrQ0ZVTj0xXHJcbiIsIE5VTEwsIE5VTEwpOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oc2ltKTsKCQlpZihyZXQgPj0gMCAmJiBuU2ltSUQgIT0gcmV0KQoJCQl2c2ltX2NhcmRfc3dpdGNoX3JlcShyZXQpOwoJfQoJcmV0dXJuIDA7Cn0KCmludDMyX3QgenRlX2F0U29mdFNpbUNsb3NlKFZTSU1fQ09NTUFORCB2c2ltX2FwZHVfcHJvY2Vzc19mbiwgdWludDhfdCBuU2ltSUQpCnsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJaWYoblNpbUlEICE9IDEgJiYgblNpbUlEICE9IDApewoJCXByaW50ZigiIyN2c2ltIyMgc29mdCBjbG9zZSBwYXJhbSBlcnIgc2ltPSVkXG4iLCBuU2ltSUQpOwoJCXJldHVybiAtMTsKCX0KCWdfdnNpbV9zbG90W25TaW1JRF0gPSAwOwoJZ19zaW1fc3RhdHVzW25TaW1JRF0gPSAtMTsKCWlmKG5TaW1JRCl7CgkJdnNpbV9jYXJkX3N3aXRjaF9yZXEoMSk7CgkJenRlX1NldEdUREFUQVNJTSgxKTsKCQl2c2ltX3NlbmRfYXQoIkFUK0NGVU49MFxyXG4iLCBOVUxMLCBOVUxMKTsKCQl2c2ltX2NhcmRfc3dpdGNoX3JlcSgwKTsKCQl6dGVfU2V0R1REVUFMU0lNKDApOwoJCXZzaW1fc2V0KE1TR19DTURfVlNJTV9SRVNFVF9GTE9XX1NUQVRJU1RJQywxKTsKCX1lbHNlewoJCXVpbnQ4X3Qgc2ltID0gMDsKCQl1aW50OF90IHJldCA9IDA7CgkJenRlX0dldEdURFVBTFNJTSgmc2ltKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKG5TaW1JRCk7CgkJcmV0ID0gdnNpbV9nZXRfY2FyZHN0YXRfZnJvbXBzKCk7CgkJaWYocmV0ID49IDAgJiYgblNpbUlEICE9IHJldCkKCQkJdnNpbV9jYXJkX3N3aXRjaF9yZXEoblNpbUlEKTsKCS8vCXZzaW1fc2VuZF9hdCgiQVQrQ0ZVTj01XHJcbiIsIE5VTEwsIE5VTEwpOwoJCXZzaW1fc2VuZF9hdCgiQVQrWkNBUkRTV0lUQ0g9MCwwXHJcbiIsIE5VTEwsIE5VTEwpOwoJCXZzaW1fc2VuZF9hdCgiQVQrQ0ZVTj0wXHJcbiIsIE5VTEwsIE5VTEwpOwoJCXZzaW1fc2VuZF9hdCgiQVQrQ0ZVTj0xXHJcbiIsIE5VTEwsIE5VTEwpOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oc2ltKTsKCQlpZihyZXQgPj0gMCAmJiBuU2ltSUQgIT0gcmV0KQoJCQl2c2ltX2NhcmRfc3dpdGNoX3JlcShyZXQpOwoJfQoJZ192c2ltX2FwZHVfcHJvY2Vzc19jYiA9IE5VTEw7CglzY19jZmdfc2V0KCJzb2Z0c2ltX3N0YXQiLCIwIik7CglyZXR1cm4gMDsKfQoKaW50MzJfdCB6dGVfYXRWc2ltQ2xvc2UoU29mdFNpbV9DT01NQU5EIHNvZnRzc2ltX2FwZHVfcHJvY2Vzc19mbiwgdWludDhfdCBuU2ltSUQpCnsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJaWYoblNpbUlEICE9IDEgJiYgblNpbUlEICE9IDApewoJCXByaW50ZigiIyN2c2ltIyMgY2xvc2UgcGFyYW0gZXJyIHNpbT0lZFxuIiwgblNpbUlEKTsKCQlyZXR1cm4gLTE7Cgl9CglnX3ZzaW1fc2xvdFsxXSA9IDA7CglnX3NpbV9zdGF0dXNbMV0gPSAtMTsKCXZzaW1fY2FyZF9zd2l0Y2hfcmVxKDEpOwoJenRlX1NldEdUREFUQVNJTSgxKTsKCXZzaW1fc2VuZF9hdCgiQVQrQ0ZVTj0wXHJcbiIsIE5VTEwsIE5VTEwpOwoJdnNpbV9jYXJkX3N3aXRjaF9yZXEoMCk7Cgl6dGVfU2V0R1REVUFMU0lNKDApOwoJdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1JFU0VUX0ZMT1dfU1RBVElTVElDLDEpOwoJZ192c2ltX2FwZHVfcHJvY2Vzc19jYiA9IE5VTEw7CglzY19jZmdfc2V0KCJ2c2ltX3N0YXQiLCIwIik7CglyZXR1cm4gMDsKfQoKCmludDMyX3QgenRlX1NldEdUREFUQVNJTSh1aW50OF90IG5TaW1JRCkKewoJaW50IHJldCA9IDA7Cgl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgWyVzXSBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKCWlmKHZzaW1fZ2V0KE1TR19DTURfVlNJTV9HRVRfQVVUSElORykgfHwgdnNpbV9nZXQoTVNHX0NNRF9WU0lNX0dFVF9TQ0FOSU5HKSl7CgkJcHJpbnRmKCIjI3ZzaW0jIyBbJXNdLT4lZCBmYWlsIEFVVEhJTkdcbiIsIF9fRlVOQ1RJT05fXywgblNpbUlEKTsKCQlyZXR1cm4gLTE7Cgl9Cgl2c2ltX3NldChNU0dfQ01EX1ZTSU1fU0VUX1NUQU5EQlksblNpbUlEKTsKCXJldCA9IHZzaW1fZ2V0X2NhcmRzdGF0X2Zyb21wcygpOwoJaWYocmV0ID49IDApewoJCWlmKG5TaW1JRCAhPSByZXQpewoJCQkvL8jnufvJ6NbDus21scewtdey47T9u/qy4LK70rvWwrLFx9AsZm9yVEFVSU5HCgkJCXZzaW1fY2FyZF9zd2l0Y2hfcmVxKG5TaW1JRCk7CgkJfQoJfWVsc2UKCQl2c2ltX2NhcmRfc3dpdGNoX3JlcShuU2ltSUQpOwoJdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1NFVF9TV0lUQ0gsIG5TaW1JRCk7CglwcmludGYoIiMjdnNpbSMjIFslc10gY2FyZHN0YXQ9JWQgc2ltPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCwgblNpbUlEKTsKCXJldHVybiAwOwp9CgppbnQzMl90IHp0ZV9HZXRHVERBVEFTSU0odWludDhfdCAqblNpbUlEKQp7Cgl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgWyVzXSBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKCSpuU2ltSUQgPSB2c2ltX2dldChNU0dfQ01EX1ZTSU1fR0VUX1NUQU5EQlkpOwoJcmV0dXJuIDA7Cn0KCmludDMyX3QgenRlX1NldEdURFVBTFNJTSh1aW50OF90IG5TaW1JRCkKewoJaW50IHJldCA9IDA7Cgl1bnNpZ25lZCBjaGFyIHN0YW5kYnkgPSB2c2ltX2dldChNU0dfQ01EX1ZTSU1fR0VUX1NUQU5EQlkpOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglyZXQgPSB2c2ltX3NldChNU0dfQ01EX1ZTSU1fU0VUX1NXSVRDSCxuU2ltSUQpOwoJaWYocmV0ID09IDApewoJCXByaW50ZigiIyN2c2ltIyMgWyVzXSBlcnIgc2ltPSVkXG4iLCBfX0ZVTkNUSU9OX18sIG5TaW1JRCk7CgkJcmV0dXJuIC0xOwoJfQoJLy9BVNLRvq3H0LrDo6zPwsPmysfF0LbPyse38dKqx9C/qAoJaWYodnNpbV9nZXQoTVNHX0NNRF9WU0lNX0dFVF9UQVVJTkcpKXsvL1RBVbXEuf2zzNbQLLK7x9C/qAoJCXByaW50ZigiIyN2c2ltIyMgWyVzXSBUQVVJTkdcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIDA7Cgl9CglyZXQgPSB2c2ltX2dldF9jYXJkc3RhdF9mcm9tcHMoKTsKCWlmKHJldCA+PSAwICYmIHN0YW5kYnkgIT0gcmV0ICYmIHN0YW5kYnkgPT0gblNpbUlEKXsKCQkvL7Wxx9C7u0FUtcTEv7HqtP27+rLgus3Jz7Lj1q7HsMnotqi1xLT9u/qy4M/gzawsx9K6zbXXsuPKtbzKtcS0/bv6suCyu82sLNPWsrvKx1RBVbXEuf2zzNbQLL7NtKW3osfQv6gKCQl2c2ltX2NhcmRfc3dpdGNoX3JlcShuU2ltSUQpOwoJfQoJcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIGNhcmRzdGF0PSVkIHN0YW5kYnk9JWQgc2ltPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCwgc3RhbmRieSwgblNpbUlEKTsKCXJldHVybiAwOwp9CgppbnQzMl90IHp0ZV9HZXRHVERVQUxTSU0odWludDhfdCAqblNpbUlEKQp7Cgl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgWyVzXSBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKCSpuU2ltSUQgPSB2c2ltX2dldChNU0dfQ01EX1ZTSU1fR0VUX1NXSVRDSCk7CglyZXR1cm4gMDsKfQoKaW50MzJfdCB6dGVfbWRtX2V2ZW50X3JlZ2lzdCh6dGVfbWRtX2V2ZW50X2luZF9jYWxsYmFjayBpbmRfY2IpCnsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJZ192c2ltX2V2ZW50X2luZF9jYiA9IGluZF9jYjsKCXJldHVybiAwOwp9Cgp2b2lkIHp0ZV92c2ltX2RlYnVnKHZvaWQpCnsKCWdfdnNpbV9ldmVudF9pbmRfY2IgPSB6dGVfbWRtX2V2ZW50X2luZF9jYjsKCWdfdnNpbV9hcGR1X3Byb2Nlc3NfY2IgPSB6dGVfdnNpbV9pbmRfY2I7CglpZihnX3JlYWRfdGhyZWFkX3N0YXRlICE9IDApCgkJZ19yZWFkX3RocmVhZF9zdGF0ZSA9IHB0aHJlYWRfY3JlYXRlKCZyZWFkX3RocmVhZF90aWQsIE5VTEwsICh2b2lkICopcmVhZF90aHJlYWRfZW50cnksIE5VTEwpOwoJaWYoZ19tc2dfdGhyZWFkX3N0YXRlICE9IDApCgkJZ19tc2dfdGhyZWFkX3N0YXRlID0gcHRocmVhZF9jcmVhdGUoJm1zZ190aHJlYWRfdGlkLCBOVUxMLCAodm9pZCAqKW1zZ190aHJlYWRfZW50cnksIE5VTEwpOwoJaWYoZ19yZWFkX3RocmVhZF9zdGF0ZSAhPSAwIHx8IGdfbXNnX3RocmVhZF9zdGF0ZSAhPSAwKXsKCQlwcmludGYoIiMjdnNpbSMjIGRlYnVnIGZhaWwgcmVhZD0lZCBtc2c9JWRcbiIsIGdfcmVhZF90aHJlYWRfc3RhdGUsIGdfbXNnX3RocmVhZF9zdGF0ZSk7Cgl9Cn0KCmludDMyX3QgenRlX2F0VnNpbVJlc2V0KHZvaWQpCnsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJcmV0dXJuIHJlc3RhcnRfcmVxdWVzdChNT0RVTEVfSURfVlNJTSk7Cn0KCmludDMyX3QgenRlX1NldENmdW5Nb2RlKHVpbnQ4X3QgbW9kZSkKewoJY2hhciBhdF9jbWRbNjRdID0gezB9OwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglzbnByaW50ZihhdF9jbWQsc2l6ZW9mKGF0X2NtZCksIkFUK0NGVU49JWRcclxuIiwgbW9kZSk7CglyZXR1cm4gdnNpbV9zZW5kX2F0KGF0X2NtZCwgTlVMTCwgTlVMTCk7Cn0KCmludDMyX3QgenRlX0dldENmdW5Nb2RlKHVpbnQ4X3QgKm1vZGUpCnsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJaWYobW9kZSkKCQlyZXR1cm4gdnNpbV9zZW5kX2F0KCJBVCtDRlVOP1xyXG4iLCAiJTFkIiwgKHZvaWQqKikmbW9kZSk7CglyZXR1cm4gLTE7Cn0KCmludDMyX3QgenRlX1NldElNRUlieVNpbUlkKHVpbnQ4X3QgKmltZWksIHVpbnQ4X3QgaW1laV9sZW4sIHVpbnQ4X3QgblNpbUlEKQp7CglpbnQgcmV0ID0gLTE7Cgl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgWyVzXSBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKCWlmKGltZWkpewoJCWNoYXIgYXRfY21kWzY0XSA9IHswfTsKCQl1aW50OF90IHNpbSA9IDA7CgkJenRlX0dldEdURFVBTFNJTSgmc2ltKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKG5TaW1JRCk7CgkJc25wcmludGYoYXRfY21kLHNpemVvZihhdF9jbWQpLCJBVCtDR1NOPSVzXHJcbiIsaW1laSk7CgkJcmV0ID0gdnNpbV9zZW5kX2F0KGF0X2NtZCwgTlVMTCwgTlVMTCk7CgkJaWYoc2ltICE9IG5TaW1JRCkKCQkJenRlX1NldEdURFVBTFNJTShzaW0pOwoJfQoJcmV0dXJuIHJldDsKfQoKaW50MzJfdCB6dGVfR2V0SU1FSWJ5U2ltSWQodWludDhfdCAqaW1laSwgdWludDhfdCBpbWVpX2xlbiwgdWludDhfdCBuU2ltSUQpCnsKCWludCByZXQgPSAtMTsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJaWYoaW1laSl7CgkJdWludDhfdCBzaW0gPSAwOwoJCXp0ZV9HZXRHVERVQUxTSU0oJnNpbSk7CgkJaWYoc2ltICE9IG5TaW1JRCkKCQkJenRlX1NldEdURFVBTFNJTShuU2ltSUQpOwoJCXJldCA9IHZzaW1fc2VuZF9hdCgiQVQrQ0dTTlxyXG4iLCAiJXMiLCAodm9pZCoqKSZpbWVpKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKHNpbSk7Cgl9CglyZXR1cm4gcmV0Owp9CgoKaW50MzJfdCB6dGVfR2V0Q0NJRGJ5U2ltSWQodWludDhfdCAqY2NpZCwgdWludDhfdCBjY2lkX2xlbiwgdWludDhfdCBuU2ltSUQpCnsKCWludCByZXQgPSAtMTsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJaWYoY2NpZCl7CgkJdWludDhfdCBzaW0gPSAwOwoJCXp0ZV9HZXRHVERVQUxTSU0oJnNpbSk7CgkJaWYoc2ltICE9IG5TaW1JRCkKCQkJenRlX1NldEdURFVBTFNJTShuU2ltSUQpOwoJCXJldCA9IHZzaW1fc2VuZF9hdCgiQVQrWklDQ0lEP1xyXG4iLCAiJXMiLCAodm9pZCoqKSZjY2lkKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKHNpbSk7Cgl9CglyZXR1cm4gcmV0Owp9CgppbnQzMl90IHp0ZV9HZXRNQ0NNTkNieVNpbUlkKGNoYXIgKm1jYywgY2hhciAqbW5jLCB1aW50OF90IG5TaW1JRCkKewoJaW50IHJldCA9IC0xOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglpZihtY2MgJiYgbW5jKXsKI2lmIDAKCQlpbnQgc3cxPTA7CgkJaW50IHN3Mj0tMTsKCQljaGFyIHJlc3BvbnNlWzUxM10gPSB7MH07Ly+zpLbIt7bOpzAtMjU219a92qOsN0YyMDVGNzCx7cq+NLj219a92rOktsgKCQl2b2lkICpwW10gPSB7JnN3MSwmc3cyLHJlc3BvbnNlfTsKCQl1aW50OF90IHNpbSA9IDA7CgkJenRlX0dldEdURFVBTFNJTSgmc2ltKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKG5TaW1JRCk7CgkJdnNpbV9zZW5kX2F0KCJBVCtDUlNNPTE3NiwyODU4OSwwLDAsNFxyXG4iLCAiJWQsJWQsJXMiLCAodm9pZCoqKXApOwoJCWlmKHN3MSA9PSAxNDQgJiYgc3cyID09IDApewoJCQljaGFyIGltc2lbNjRdID0gezB9OwoJCQljaGFyIHN0clBsbW5MYXN0WzEwXSA9IHswfTsKCQkJdm9pZCAqcDFbXSA9IHtpbXNpfTsKCQkKCQkJdnNpbV9zZW5kX2F0KCJBVCtDSU1JXHJcbiIsICIlcyIsICh2b2lkKiopcDEpOwoJCQlzdHJuY3B5KHN0clBsbW5MYXN0LCAmcmVzcG9uc2Vbc3RybGVuKHJlc3BvbnNlKS0yXSwgMik7CgkJCW1lbXNldChtY2MsIDAsIDQpOwoJCQltZW1zZXQobW5jLCAwLCA0KTsKCQkJbWVtY3B5KG1jYywgaW1zaSwgMyk7CgkJCWlmKDAgPT0gc3RyY21wKCIwMyIsIHN0clBsbW5MYXN0KSkKCQkJCW1lbWNweShtbmMsIGltc2krMywgMyk7CgkJCWVsc2UKCQkJCW1lbWNweShtbmMsIGltc2krMywgMik7CgkJfQoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oc2ltKTsKCQlyZXR1cm4gIShzdzEgPT0gMTQ0ICYmIHN3MiA9PSAwKTsKI2Vsc2UKCQlpbnQgaTEsaTIsaTMsaTQsaTU7CgkJY2hhciBwbG1uWzhdID0gezB9OwoJCXZvaWQgKnBbXSA9IHsmaTEsJmkyLCZpMywmaTQsJmk1LHBsbW59OwoJCXVpbnQ4X3Qgc2ltID0gMDsKCQl6dGVfR2V0R1REVUFMU0lNKCZzaW0pOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oblNpbUlEKTsKCQlyZXQgPSB2c2ltX3NlbmRfYXQoIkFUK1pFTVNDSVE9MVxyXG4iLCAiJWQsJWQsJWQsJWQsJWQsJXMiLCAodm9pZCoqKXApOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oc2ltKTsKCQltZW1zZXQobWNjLCAwLCA0KTsKCQltZW1zZXQobW5jLCAwLCA0KTsKCQltZW1jcHkobWNjLCBwbG1uLCAzKTsKCQltZW1jcHkobW5jLCBwbG1uKzMsIDMpOwojZW5kaWYKCX0KCXJldHVybiByZXQ7Cn0KCmludDMyX3QgenRlX1N3aXRjaFNpbUhhbmRsZSh1aW50OF90IG1vZGUpCnsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJcmV0dXJuIDA7Cn0KCmludDMyX3QgenRlX0dldENTUWJ5U2ltSWQoaW50MzJfdCAqcnNzaSwgaW50MzJfdCAqYmVyLCB1aW50OF90IG5TaW1JRCkKewoJaW50IHJldCA9IC0xOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglpZihyc3NpICYmIGJlcil7CgkJdm9pZCAqcFtdID0ge3Jzc2ksYmVyfTsKCQl1aW50OF90IHNpbSA9IDA7CgkJenRlX0dldEdURFVBTFNJTSgmc2ltKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKG5TaW1JRCk7CgkJcmV0ID0gdnNpbV9zZW5kX2F0KCJBVCtDU1FcclxuIiwgIiVkLCVkIiwgKHZvaWQqKilwKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKHNpbSk7Cgl9CglyZXR1cm4gcmV0Owp9CgppbnQzMl90IHp0ZV9HZXRSZWdJbmZvYnlTaW1pZChSZWdJbmZvX3QgKnJlZ19pbmZvLCB1aW50OF90IG5TaW1JRCkKewoJaW50IHJldCA9IC0xOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglpZihyZWdfaW5mbyl7CgkJaW50IGksYWN0LHJhYyxzcnZfZG9tYWluOwoJCXZvaWQgKnBbXSA9IHsmaSwmYWN0LCZyZWdfaW5mby0+bHRlX3NjZWxsX2luZm8uY2VsbF9pZCwmcmFjLCZyZWdfaW5mby0+bHRlX3NjZWxsX2luZm8udGFjfTsKCQl2b2lkICpwMVtdID0geyZyZWdfaW5mby0+blN0YXR1cywmc3J2X2RvbWFpbiwmcmVnX2luZm8tPmx0ZV9zY2VsbF9pbmZvLnJvYW1pbmdGbGFnfTsKCQl1aW50OF90IHNpbSA9IDA7CgkJenRlX0dldEdURFVBTFNJTSgmc2ltKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKG5TaW1JRCk7CgkJcmVnX2luZm8tPm5TdGF0dXMgPSAwOwoJCXZzaW1fc2VuZF9hdCgiQVReU1lTSU5GT1xyXG4iLCAiJWQsJWQsJWQiLCAodm9pZCoqKXAxKTsKCQlyZXQgPSB2c2ltX3NlbmRfYXQoIkFUK1pFTVNDSVE9MVxyXG4iLCAiJWQsJWQsJWQsJWQsJWQiLCAodm9pZCoqKXApOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oc2ltKTsKCQlpZihyZXQgfHwgcmVnX2luZm8tPm5TdGF0dXMgIT0gRV9OV19TVEFUVVNfU1JWX0FWQUlMQUJMRSkKCQkJcmV0dXJuIC0xOwoJCWlmKGFjdCA9PSAxNil7CgkJCXJlZ19pbmZvLT5jdXJyX3JhdCA9IEVfTldfUkFESU9fSUZfTFRFOwoJCX0gZWxzZSB7CgkJCWlmKGFjdCA9PSAxKQoJCQkJcmVnX2luZm8tPmN1cnJfcmF0ID0gRV9OV19SQURJT19JRl9URFNDRE1BOwoJCQllbHNlIGlmKGFjdCA9PSAyKQoJCQkJcmVnX2luZm8tPmN1cnJfcmF0ID0gRV9OV19SQURJT19JRl9XQ0RNQTsKCQkJZWxzZSBpZihhY3QgPT0gNCkKCQkJCXJlZ19pbmZvLT5jdXJyX3JhdCA9IEVfTldfUkFESU9fSUZfR1NNOwoJCQllbHNlCgkJCQlwcmludGYoIiMjdnNpbSMjIFslc10gYWN0PSVkID8/P1xuIiwgX19GVU5DVElPTl9fLCBhY3QpOwoJCX0KCX0KCXJldHVybiByZXQ7Cn0KCmludDMyX3QgenRlX0dldENlbGxJbmZvYnlTaW1JZCh1aW50OF90IG5TaW1JRCkKewoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7Cgl2c2ltX3NldChNU0dfQ01EX1ZTSU1fU0VUX1NDQU5JTkcsIDErblNpbUlEKTsKCWlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1ZTSU0sIE1PRFVMRV9JRF9BVF9DVEwsIE1TR19DTURfWlNDSVNDQU5fUkVRLCAwLCBOVUxMLCAwKTsKCXJldHVybiAwOwp9CgppbnQzMl90IHp0ZV9HZXROZXRJbmZvYnlTaW1JZChOZXRJbmZvX3QgKnBOZXRJbmZvLCB1aW50OF90IG5TaW1JRCkKewoJVlNJTV9NU0dfQlVGIG1zZ19pbiA9IHswfTsKCVZTSU1fTVNHX0JVRiBtc2dfb3V0ID0gezB9OwoJaW50IHJldCA9IC0xOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglpZihwTmV0SW5mbyAmJiBuU2ltSUQgPCAyKXsKCQltc2dfaW4udXNNc2dDbWQgPSBNU0dfQ01EX1ZTSU1fR0VUX0ZMT1dfU1RBVElTVElDOwoJCW1zZ19pbi5hdWNEYXRhQnVmWzBdID0gblNpbUlEOwoJCXJldCA9IHN5c2NhbGwoX19OUl92c2ltX3Byb2MsKHVuc2lnbmVkIGNoYXIgKikmbXNnX2luLCAodW5zaWduZWQgY2hhciAqKSZtc2dfb3V0KTsKCQlpZihyZXQgPT0gMCl7CgkJCXByaW50ZigiIyN2c2ltIyMgWyVzXSB2c2ltX3Byb2MgZXJyXG4iLCBfX0ZVTkNUSU9OX18pOwoJCX0KCQlpZihzaXplb2YoTmV0SW5mb190KSA+IG1zZ19vdXQudXNEYXRhTGVuKQoJCQltZW1jcHkocE5ldEluZm8sIG1zZ19vdXQuYXVjRGF0YUJ1ZiwgbXNnX291dC51c0RhdGFMZW4pOwoJCWVsc2UKCQkJbWVtY3B5KHBOZXRJbmZvLCBtc2dfb3V0LmF1Y0RhdGFCdWYsIHNpemVvZihOZXRJbmZvX3QpKTsKCX0KCXJldHVybiByZXQ7Cn0KCmludDMyX3QgenRlX1NldEFQTmJ5U2ltSUQoRGF0YV9jYWxsX2NvbmZpZ19pbmZvX3QgKmRhdGFfY2FsbCwgdWludDhfdCBuU2ltSUQpCnsKCXJldHVybiAwOwp9CgppbnQzMl90IHp0ZV9TdGFydERhdGFDYWxsYnlTaW1JZChEYXRhX2NhbGxfY29uZmlnX2luZm9fdCAqZGF0YV9jYWxsLCB1aW50OF90IG5TaW1JRCkKewoJaW50IHJldCA9IC0xOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglpZihkYXRhX2NhbGwpewoJCXVpbnQ4X3Qgc2ltID0gMDsKCQljaGFyIGF0X2NtZFsxMjhdID0gezB9OwoJCXZvaWQgKnBbXSA9IHsmZGF0YV9jYWxsLT5wcm9maWxlX2lkfTsKCQljaGFyIHJlc2VydmVjaWRbMzBdID0gezB9OwoJCXVuc2lnbmVkIGNoYXIgY2lkX3Jlc2VydmVkID0gMDsKCQl1bnNpZ25lZCBjaGFyIGNpZF9yZXNlcnZlZF92c2ltID0gMDsKCQkKCQl6dGVfR2V0R1REQVRBU0lNKCZzaW0pOwoJCWlmKHNpbSAhPSBuU2ltSUQpewoJCQlwcmludGYoIiMjdnNpbSMjIFslc10gblNpbUlEPSVkIHN0YW5kYnk9JWQgZXJyXG4iLCBfX0ZVTkNUSU9OX18sIG5TaW1JRCwgc2ltKTsKCQkJcmV0dXJuIHJldDsKCQl9CgkJaWYoblNpbUlEKXsKCQkJc2NfY2ZnX2dldCgiY2lkX3Jlc2VydmVkIixyZXNlcnZlY2lkLHNpemVvZihyZXNlcnZlY2lkKSk7CgkJCWlmKHN0cmxlbihyZXNlcnZlY2lkKSkKCQkJCWNpZF9yZXNlcnZlZCA9IGF0b2kocmVzZXJ2ZWNpZCk7CgkJCWNpZF9yZXNlcnZlZF92c2ltID0gY2lkX3Jlc2VydmVkfDE1OwoJCQlzbnByaW50ZihhdF9jbWQsc2l6ZW9mKGF0X2NtZCksIkFUK0NJRFJFU0VSVkVEPSVkXHJcbiIsIGNpZF9yZXNlcnZlZF92c2ltKTsKCQkJdnNpbV9zZW5kX2F0KGF0X2NtZCwgTlVMTCwgTlVMTCk7CgkJfQoJCWlmKGRhdGFfY2FsbC0+aXBfZmFtaWx5ID09IEVfREFUQV9JUF9GQU1JTFlfSVBWNCkKCQkJc25wcmludGYoYXRfY21kLHNpemVvZihhdF9jbWQpLCJBVCtaUERQQUNUPTAsXCJJUFwiLFwiJXNcIiwsLCwlZCxcIiVzXCIsXCIlc1wiXHJcbiIsIGRhdGFfY2FsbC0+YXBuX25hbWUsIGRhdGFfY2FsbC0+YXV0aF9wcmVmLCBkYXRhX2NhbGwtPnVzZXJfbmFtZSwgZGF0YV9jYWxsLT5wYXNzd29yZCk7CgkJZWxzZSBpZihkYXRhX2NhbGwtPmlwX2ZhbWlseSA9PSBFX0RBVEFfSVBfRkFNSUxZX0lQVjYpCgkJCXNucHJpbnRmKGF0X2NtZCxzaXplb2YoYXRfY21kKSwiQVQrWlBEUEFDVD0wLFwiSVBWNlwiLFwiJXNcIiwsLCwlZCxcIiVzXCIsXCIlc1wiXHJcbiIsIGRhdGFfY2FsbC0+YXBuX25hbWUsIGRhdGFfY2FsbC0+YXV0aF9wcmVmLCBkYXRhX2NhbGwtPnVzZXJfbmFtZSwgZGF0YV9jYWxsLT5wYXNzd29yZCk7CgkJZWxzZSBpZihkYXRhX2NhbGwtPmlwX2ZhbWlseSA9PSBFX0RBVEFfSVBfRkFNSUxZX0lQVjRWNikKCQkJc25wcmludGYoYXRfY21kLHNpemVvZihhdF9jbWQpLCJBVCtaUERQQUNUPTAsXCJJUFY0VjZcIixcIiVzXCIsLCwsJWQsXCIlc1wiLFwiJXNcIlxyXG4iLCBkYXRhX2NhbGwtPmFwbl9uYW1lLCBkYXRhX2NhbGwtPmF1dGhfcHJlZiwgZGF0YV9jYWxsLT51c2VyX25hbWUsIGRhdGFfY2FsbC0+cGFzc3dvcmQpOwoJCWVsc2UgewoJCQlwcmludGYoIiMjdnNpbSMjIFslc10gaXBfZmFtaWx5PSVkID8/P1xuIiwgX19GVU5DVElPTl9fLCBkYXRhX2NhbGwtPmlwX2ZhbWlseSk7CgkJCXNucHJpbnRmKGF0X2NtZCxzaXplb2YoYXRfY21kKSwiQVQrWlBEUEFDVD0wLFwiSVBcIixcIiVzXCIsLCwsJWQsXCIlc1wiLFwiJXNcIlxyXG4iLCBkYXRhX2NhbGwtPmFwbl9uYW1lLCBkYXRhX2NhbGwtPmF1dGhfcHJlZiwgZGF0YV9jYWxsLT51c2VyX25hbWUsIGRhdGFfY2FsbC0+cGFzc3dvcmQpOwoJCX0KCQl6dGVfR2V0R1REVUFMU0lNKCZzaW0pOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oblNpbUlEKTsKCQlyZXQgPSB2c2ltX3NlbmRfYXQoYXRfY21kLCAiJWQiLCAodm9pZCoqKXApOwoJCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHJldD0lZCBjaWQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgcmV0LCBkYXRhX2NhbGwtPnByb2ZpbGVfaWQpOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oc2ltKTsKCQlpZihuU2ltSUQpewoJCQlzbnByaW50ZihhdF9jbWQsc2l6ZW9mKGF0X2NtZCksIkFUK0NJRFJFU0VSVkVEPSVkXHJcbiIsIGNpZF9yZXNlcnZlZCk7CgkJCXZzaW1fc2VuZF9hdChhdF9jbWQsIE5VTEwsIE5VTEwpOwoJCX0KCX0KCXJldHVybiByZXQ7Cn0KCmludDMyX3QgenRlX1N0b3BEYXRhQ2FsbGJ5U2ltSWQodWludDhfdCBwcm9maWxlX2lkLCB1aW50OF90IG5TaW1JRCkKewoJaW50IHJldCA9IC0xOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglpZihwcm9maWxlX2lkID4gMCAmJiBwcm9maWxlX2lkIDwgOSl7CgkJdWludDhfdCBzaW0gPSAwOwoJCWNoYXIgYXRfY21kWzY0XSA9IHswfTsKCQkKCQlzbnByaW50ZihhdF9jbWQsc2l6ZW9mKGF0X2NtZCksIkFUK1pQRFBERUFDVD0lZFxyXG4iLCBwcm9maWxlX2lkKTsKCQl6dGVfR2V0R1REVUFMU0lNKCZzaW0pOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oblNpbUlEKTsKCQlyZXQgPSB2c2ltX3NlbmRfYXQoYXRfY21kLCBOVUxMLCBOVUxMKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKHNpbSk7Cgl9CglyZXR1cm4gcmV0Owp9CgppbnQzMl90IHp0ZV9HZXREYXRhQWRkcmJ5U2ltSUQodWludDhfdCBwcm9maWxlX2lkLCBEYXRhX2NhbGxfYWRkcl9pbmZvX2xpc3RfdCAqYWRkcl9saXN0LCB1aW50OF90IG5TaW1JRCkKewoJaW50IHJldCA9IC0xOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglpZihwcm9maWxlX2lkID4gMCAmJiBwcm9maWxlX2lkIDwgOSAmJiBhZGRyX2xpc3QpewoJCXVpbnQ4X3Qgc2ltID0gMDsKCQljaGFyIGF0X2NtZFs2NF0gPSB7MH07CgkJaW50IGNpZCA9IDA7CgkJdm9pZCAqcFtdID0geyZjaWQsIGFkZHJfbGlzdH07CgkJCgkJc25wcmludGYoYXRfY21kLHNpemVvZihhdF9jbWQpLCJBVCtDR1BBRERSPSVkXHJcbiIsIHByb2ZpbGVfaWQpOwoJCXp0ZV9HZXRHVERVQUxTSU0oJnNpbSk7CgkJaWYoc2ltICE9IG5TaW1JRCkKCQkJenRlX1NldEdURFVBTFNJTShuU2ltSUQpOwoJCXJldCA9IHZzaW1fc2VuZF9hdChhdF9jbWQsICIlZCwlMTdzIiwgKHZvaWQqKilwKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKHNpbSk7Cgl9CglyZXR1cm4gcmV0Owp9CgppbnQzMl90IHp0ZV9HZXRTaW1TdGF0dXNieVNpbUlkKEVfU0lNX1NUQVRVUyAqc2ltX3N0YXR1cywgdWludDhfdCBuU2ltSUQpCnsKCWludCByZXQgPSAtMTsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJaWYoc2ltX3N0YXR1cyl7CgkJdWludDhfdCBzaW0gPSAwOwoJCWNoYXIgYXRfcGFyYXNbNjRdID0gezB9OwoJCXZvaWQgKnBbXSA9IHthdF9wYXJhc307CgoJCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHNpbWlkPSVkIHNpbV9zdGF0PSVkXG4iLCBfX0ZVTkNUSU9OX18sIG5TaW1JRCwgZ19zaW1fc3RhdHVzW25TaW1JRF0pOwoJCWlmKGdfdnNpbV9zbG90W25TaW1JRF0gJiYgZ19zaW1fc3RhdHVzW25TaW1JRF0gPT0gRV9TSU1fU1RBVF9SRUFEWSl7CgkJCSpzaW1fc3RhdHVzID0gRV9TSU1fU1RBVF9SRUFEWTsKCQkJcmV0dXJuIDA7CgkJfQoJCXp0ZV9HZXRHVERVQUxTSU0oJnNpbSk7CgkJaWYoc2ltICE9IG5TaW1JRCkKCQkJenRlX1NldEdURFVBTFNJTShuU2ltSUQpOwoJCXJldCA9IHZzaW1fc2VuZF9hdCgiQVQrQ1BJTj9cclxuIiwgIiVzIiwgKHZvaWQqKilwKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKHNpbSk7CgkJaWYocmV0ID09IDApewoJCQlpZiAoc3RybmNtcCgiUkVBRFkiLCBhdF9wYXJhcywgc3RybGVuKCJSRUFEWSIpKSA9PSAwKQoJCQl7CgkJCQkqc2ltX3N0YXR1cyA9IEVfU0lNX1NUQVRfUkVBRFk7CgkJCX0KCQkJLyrI57n7tbHHsMPcwuvK5Mjrx+vH886qUElOu/JQSU4yo6zU8srkyOsrQ1BJTj08cGluPr340NDQo9HpKi8KCQkJZWxzZSBpZihzdHJuY21wKCJTSU0gUElOIixhdF9wYXJhcywgc3RybGVuKCJTSU0gUElOIikpID09IDApCgkJCXsKCQkJCSpzaW1fc3RhdHVzID0gRV9TSU1fU1RBVF9QSU47CgkJCX0KCQkJLyrI57n7tbHHsMPcwuvK5Mjrx+vH886qUFVLu/JQVUsyo6zU8srkyOsrQ1BJTj08cGluPiw8bmV3cGluPr340NC94sv4Ki8KCQkJZWxzZSBpZihzdHJuY21wKCJTSU0gUFVLIixhdF9wYXJhcywgc3RybGVuKCJTSU0gUFVLIikpID09IDApCgkJCXsKCQkJCSpzaW1fc3RhdHVzID0gRV9TSU1fU1RBVF9QVUs7CgkJCX0KCQl9IGVsc2UgaWYocmV0ID09IDEwKXsKCQkJKnNpbV9zdGF0dXMgPSBFX1NJTV9TVEFUX05PVF9JTlNFUlRFRDsKCQl9IGVsc2UgaWYocmV0ID09IDE0KXsKCQkJKnNpbV9zdGF0dXMgPSBFX1NJTV9TVEFUX0JVU1k7CgkJfSBlbHNlIHsKCQkJKnNpbV9zdGF0dXMgPSBFX1NJTV9TVEFUX1VOS05PV047CgkJfQoJCWlmKGdfdnNpbV9zbG90W25TaW1JRF0pewoJCQlnX3NpbV9zdGF0dXNbblNpbUlEXSA9ICpzaW1fc3RhdHVzOwoJCX0KCQlyZXR1cm4gMDsKCX0KCXJldHVybiAtMTsKfQoKaW50MzJfdCB6dGVfU2VuZEFUYnlTaW1JZChjaGFyICpyZXFfYXQsIGNoYXIgKmluZm9fZm10LCB2b2lkICoqcHZhbCwgdWludDhfdCBuU2ltSUQpCnsKCWludCByZXQgPSAtMTsKCXVpbnQ4X3Qgc2ltID0gMDsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJenRlX0dldEdURFVBTFNJTSgmc2ltKTsKCWlmKHNpbSAhPSBuU2ltSUQpCgkJenRlX1NldEdURFVBTFNJTShuU2ltSUQpOwoJcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIG5TaW1JRD0lZCBzdz0lZCBhdD0lc1xuIiwgX19GVU5DVElPTl9fLCBuU2ltSUQsIHNpbSwgcmVxX2F0KTsKCXJldCA9IHZzaW1fc2VuZF9hdChyZXFfYXQsIGluZm9fZm10LCBwdmFsKTsKCWlmKHNpbSAhPSBuU2ltSUQpCgkJenRlX1NldEdURFVBTFNJTShzaW0pOwoJcmV0dXJuIHJldDsKfQoKCg==