I2luY2x1ZGUgPGNvbW1vbi5oPgovLyNpbmNsdWRlIDx1LWJvb3Qvc2hhMjU2Lmg+Ci8vI2luY2x1ZGUgIDxhc20vYXJjaC9yZWdpc3Rlci5oPgoKLy8jaW5jbHVkZSA8YXNtL2NwdV9pZC5oPgoKCi8vI2RlZmluZSBVU0VfRk9SX1VCT09UXzIwMTgKI2RlZmluZSBVU0VfRk9SX1VCT09UXzIwMTUKI2RlZmluZSBHRVRfQ0hJUF9JRAoKI2lmZGVmICBVU0VfRk9SX1VCT09UXzIwMTgKI2RlZmluZSAgRElTQUJMRV9FTlYKI2RlZmluZSBVU0VfRk9SX1VCT09UXzIwMTgKI2luY2x1ZGUgPGFtbG9naWMvY3B1X2lkLmg+CiNlbmRpZgojaWZkZWYgIFVTRV9GT1JfVUJPT1RfMjAxNQovLyNkZWZpbmUgIERJU0FCTEVfRU5WCi8vI2RlZmluZSBVU0VfRk9SX1VCT09UXzIwMTgKI2luY2x1ZGUgPGFzbS9jcHVfaWQuaD4KI2VuZGlmCgp1aW50MzJfdCAgZG9fcmVhZF9jMl9kZHJfYmRscl9zdGVwcyh2b2lkKTsKCnN0cnVjdCBkZHJfYmFzZV9hZGRyZXNzX3RhYmxlewoJY2hhcgkJCSBzb2NfZmFtaWx5X25hbWVbMTZdOwoJdW5zaWduZWQJaW50CQljaGlwX2lkOwoJdW5zaWduZWQJaW50CQlwcmVnX3N0aWNreV9yZWcwOwoJdW5zaWduZWQJaW50CQlkZHJfcGh5X2Jhc2VfYWRkcmVzczsKCXVuc2lnbmVkCWludAkJZGRyX3BjdGxfdGltaW5nX2Jhc2VfYWRkcmVzczsKCXVuc2lnbmVkCWludAkJZGRyX3BjdGxfdGltaW5nX2VuZF9hZGRyZXNzOwoJdW5zaWduZWQJaW50CQlkZHJfZG1jX3N0aWNreTA7Cgl1bnNpZ25lZAlpbnQJCXN5c193YXRjaGRvZ19iYXNlX2FkZHJlc3M7Cgl1bnNpZ25lZAlpbnQJCXN5c193YXRjaGRvZ19lbmFibGVfdmFsdWU7Cgl1bnNpZ25lZAlpbnQJCWRkcl9wbGxfYmFzZV9hZGRyZXNzOwoJdW5zaWduZWQJaW50CQllZV90aW1lcl9iYXNlX2FkZHJlc3M7Cgl1bnNpZ25lZAlpbnQJCWVlX3B3bV9iYXNlX2FkZHJlc3M7Cgl1bnNpZ25lZAlpbnQJCWRkcl9kbWNfYXBkX2FkZHJlc3M7Cgl1bnNpZ25lZAlpbnQJCWRkcl9kbWNfYXNyX2FkZHJlc3M7Cgl1bnNpZ25lZAlpbnQJCWRkcl9ib290X3JlYXNvbl9hZGRyZXNzOwoJdW5zaWduZWQJaW50CQlkZHJfZG1jX2xwZGQ0X3JldHJhaW5pbmdfYWRkcmVzczsKCn07CnR5cGVkZWYgc3RydWN0ICBkZHJfYmFzZV9hZGRyZXNzX3RhYmxlIGRkcl9iYXNlX2FkZHJlc3NfdGFibGVfdDsKCiNkZWZpbmUgTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIJCTB4MUYKI2RlZmluZSBNRVNPTl9DUFVfTUFKT1JfSURfR1hUVkJCCTB4MjAKI2RlZmluZSBNRVNPTl9DUFVfTUFKT1JfSURfR1hMQkIJMHgyMQojZGVmaW5lIE1FU09OX0NQVV9NQUpPUl9JRF9HWE0JCTB4MjIKI2RlZmluZSBNRVNPTl9DUFVfTUFKT1JfSURfVFhMCQkweDIzCiNkZWZpbmUgTUVTT05fQ1BVX01BSk9SX0lEX1RYTFgJCTB4MjQKI2RlZmluZSBNRVNPTl9DUFVfTUFKT1JfSURfQVhHCQkweDI1CiNkZWZpbmUgTUVTT05fQ1BVX01BSk9SX0lEX0dYTFgJCTB4MjYKI2RlZmluZSBNRVNPTl9DUFVfTUFKT1JfSURfVFhIRAkJMHgyNwojZGVmaW5lIE1FU09OX0NQVV9NQUpPUl9JRF9HMTJBCQkweDI4CiNkZWZpbmUgTUVTT05fQ1BVX01BSk9SX0lEX0cxMkIJCTB4MjkKCiNkZWZpbmUgTUVTT05fQ1BVX01BSk9SX0lEX1NNMQkJMHgyQgoKI2RlZmluZSBNRVNPTl9DUFVfTUFKT1JfSURfQTEJCTB4MkMKCiNkZWZpbmUgTUVTT05fQ1BVX01BSk9SX0lEX1RMMQkJMHgyRQojZGVmaW5lIE1FU09OX0NQVV9NQUpPUl9JRF9UTTIJCTB4MkYKI2RlZmluZSBNRVNPTl9DUFVfTUFKT1JfSURfQzEJCTB4MzAKI2RlZmluZSBNRVNPTl9DUFVfTUFKT1JfSURfU0MyCQkweDMyCiNkZWZpbmUgTUVTT05fQ1BVX01BSk9SX0lEX0MyCQkweDMzCgojZGVmaW5lIE1FU09OX0NQVV9WRVJTSU9OX0xWTF9NQUpPUgkwCiNkZWZpbmUgTUVTT05fQ1BVX1ZFUlNJT05fTFZMX01JTk9SCTEKI2RlZmluZSBNRVNPTl9DUFVfVkVSU0lPTl9MVkxfUEFDSwkyCiNkZWZpbmUgTUVTT05fQ1BVX1ZFUlNJT05fTFZMX01JU0MJMwojZGVmaW5lIE1FU09OX0NQVV9WRVJTSU9OX0xWTF9NQVgJTUVTT05fQ1BVX1ZFUlNJT05fTFZMX01JU0MKCiNkZWZpbmUgQ0hJUF9JRF9NQVNLICAweGZmCi8vI2RlZmluZSBDSElQX0lEX0cxMkEgIDEKLy8jZGVmaW5lIENISVBfSURfQTEgIDIKY2hhciBnbG9iYWxfY2hpcF9pZFsxMl09ezB9OwoKI2RlZmluZSBNRVNPTl9DUFVfQ0hJUF9JRF9TSVpFICAgIDEyICAgLy80ICAvLzEyYnl0ZQppbnQgZGRyX2dldF9jaGlwX2lkKHZvaWQpCnsKCWludCBzb2NfZmFtaWx5X2lkPTA7Cglzb2NfZmFtaWx5X2lkID1nZXRfY3B1X2lkKCkuZmFtaWx5X2lkIDsKCXByaW50ZigiXG5zb2NfZmFtaWx5X2lkPT0weCUwOHgiLHNvY19mYW1pbHlfaWQpOwoKCXVuc2lnbmVkIGNoYXIgY2hpcGlkWzE2XTsKCS8vdW5zaWduZWQgY2hhciBjaGlwaWRfaW52WzEyXTsKCSNpZmRlZiBHRVRfQ0hJUF9JRAoJZ2V0X2NoaXBfaWQoY2hpcGlkLCAxNik7CgkjZW5kaWYKCWludCBjb3VudD0wOwoJZm9yIChjb3VudD0wO2NvdW50PDE2O2NvdW50KysgKQoJewoJCWlmIChjb3VudD4zKQoJCXsKCQkJZ2xvYmFsX2NoaXBfaWRbMTYtMS1jb3VudF09Y2hpcGlkW2NvdW50XTsKCQl9CgkJLy9wcmludGYoIlxuY2hpcGlkWyVkXT09JTA4eCIsY291bnQsY2hpcGlkW2NvdW50XSk7Cgl9CgkvL2ZvcihpbnQgY291bnQ9MDtjb3VudDwxMjtjb3VudCsrICkKCS8vewoJLy9wcmludGYoIlxuY2hpcGlkX2ludlslZF09PSUwOHgiLGNvdW50LGNoaXBpZF9pbnZbY291bnRdKTsKCS8vfQoJcmV0dXJuIHNvY19mYW1pbHlfaWQ7CgkvL3JldHVybiBDSElQX0lEX0ExOwoJLy9yZXR1cm4gQ0hJUF9JRF9HMTJBOwoJLy9yZXR1cm4gQ0hJUF9JRF9NQVNLOwp9CgpjaGFyIENNRF9WRVJbXSA9ICJWZXJfMTQiOwpkZHJfYmFzZV9hZGRyZXNzX3RhYmxlX3QgIF9fZGRyX2Jhc2VfYWRkcmVzc190YWJsZVtdID0gewoJLy9nMTJhCgl7Cgkuc29jX2ZhbWlseV9uYW1lPSJHMTJBIiwKCS5jaGlwX2lkPU1FU09OX0NQVV9NQUpPUl9JRF9HMTJBLAoJLnByZWdfc3RpY2t5X3JlZzA9KDB4ZmY2MzQ0MDAgKyAoMHgwNzAgPDwgMikpLC8vUFJFR19TVElDS1lfRzEyQV9SRUcwCgkuZGRyX3BoeV9iYXNlX2FkZHJlc3M9MHhmZTAwMDAwMCwKCS5kZHJfcGN0bF90aW1pbmdfYmFzZV9hZGRyZXNzPSgoMHgwMDAwICA8PCAyKSArIDB4ZmY2Mzg0MDApLAoJLmRkcl9wY3RsX3RpbWluZ19lbmRfYWRkcmVzcz0oKDB4MDBiYiAgPDwgMikgKyAweGZmNjM4NDAwKSwKCS5kZHJfZG1jX3N0aWNreTA9MHhmZjYzODgwMCwKCS5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzPSgoMHgzYzM0ICA8PCAyKSArIDB4ZmZkMDAwMDApLAoJLmRkcl9wbGxfYmFzZV9hZGRyZXNzPSgoMHgwMDAwICA8PCAyKSArIDB4ZmY2MzhjMDApLAoJLmVlX3RpbWVyX2Jhc2VfYWRkcmVzcz0oKDB4M2M2MiAgPDwgMikgKyAweGZmZDAwMDAwKSwKCS5lZV9wd21fYmFzZV9hZGRyZXNzPSgweGZmODA3MDAwICsgKDB4MDAxIDw8IDIpKSwKCS5kZHJfZG1jX2FwZF9hZGRyZXNzPSgoMHgwMDhjICA8PCAyKSArIDB4ZmY2Mzg0MDApLAoJLmRkcl9kbWNfYXNyX2FkZHJlc3M9KCgweDAwOGQgIDw8IDIpICsgMHhmZjYzODQwMCksCgkuZGRyX2Jvb3RfcmVhc29uX2FkZHJlc3M9KDB4ZmY4MDAwMDAgKyAoMHgwOGYgPDwgMikpLC8vQU9fU0VDX1NEX0NGRzE1CgkuZGRyX2RtY19scGRkNF9yZXRyYWluaW5nX2FkZHJlc3M9KCgweDAwOTcgIDw8IDIpICsgMHhmZjYzODQwMCksCgl9LAoJLy9nMTJiCgl7Cgkuc29jX2ZhbWlseV9uYW1lPSJHMTJCIiwKCS5jaGlwX2lkPU1FU09OX0NQVV9NQUpPUl9JRF9HMTJCLAoJLnByZWdfc3RpY2t5X3JlZzA9KDB4ZmY2MzQ0MDAgKyAoMHgwNzAgPDwgMikpLC8vUFJFR19TVElDS1lfRzEyQV9SRUcwCgkuZGRyX3BoeV9iYXNlX2FkZHJlc3M9MHhmZTAwMDAwMCwKCS5kZHJfcGN0bF90aW1pbmdfYmFzZV9hZGRyZXNzPSgoMHgwMDAwICA8PCAyKSArIDB4ZmY2Mzg0MDApLAoJLmRkcl9wY3RsX3RpbWluZ19lbmRfYWRkcmVzcz0oKDB4MDBiYiAgPDwgMikgKyAweGZmNjM4NDAwKSwKCS5kZHJfZG1jX3N0aWNreTA9MHhmZjYzODgwMCwKCS5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzPSgoMHgzYzM0ICA8PCAyKSArIDB4ZmZkMDAwMDApLAoJLmRkcl9wbGxfYmFzZV9hZGRyZXNzPSgoMHgwMDAwICA8PCAyKSArIDB4ZmY2MzhjMDApLAoJLmVlX3RpbWVyX2Jhc2VfYWRkcmVzcz0oKDB4M2M2MiAgPDwgMikgKyAweGZmZDAwMDAwKSwKCS5lZV9wd21fYmFzZV9hZGRyZXNzPSgweGZmODA3MDAwICsgKDB4MDAxIDw8IDIpKSwKCS5kZHJfZG1jX2FwZF9hZGRyZXNzPSgoMHgwMDhjICA8PCAyKSArIDB4ZmY2Mzg0MDApLAoJLmRkcl9kbWNfYXNyX2FkZHJlc3M9KCgweDAwOGQgIDw8IDIpICsgMHhmZjYzODQwMCksCgkuZGRyX2Jvb3RfcmVhc29uX2FkZHJlc3M9KDB4ZmY4MDAwMDAgKyAoMHgwOGYgPDwgMikpLC8vQU9fU0VDX1NEX0NGRzE1CgkuZGRyX2RtY19scGRkNF9yZXRyYWluaW5nX2FkZHJlc3M9KCgweDAwOTcgIDw8IDIpICsgMHhmZjYzODQwMCksCgl9LAoJLy90bDEKCXsKCS5zb2NfZmFtaWx5X25hbWU9IlRMMSIsCgkuY2hpcF9pZD1NRVNPTl9DUFVfTUFKT1JfSURfVEwxLAoJLnByZWdfc3RpY2t5X3JlZzA9KDB4ZmY2MzQ0MDAgKyAoMHgwNzAgPDwgMikpLC8vUFJFR19TVElDS1lfRzEyQV9SRUcwCgkuZGRyX3BoeV9iYXNlX2FkZHJlc3M9MHhmZTAwMDAwMCwKCS5kZHJfcGN0bF90aW1pbmdfYmFzZV9hZGRyZXNzPSgoMHgwMDAwICA8PCAyKSArIDB4ZmY2Mzg0MDApLAoJLmRkcl9wY3RsX3RpbWluZ19lbmRfYWRkcmVzcz0oKDB4MDBiYiAgPDwgMikgKyAweGZmNjM4NDAwKSwKCS5kZHJfZG1jX3N0aWNreTA9MHhmZjYzODgwMCwKCS5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzPSgoMHgzYzM0ICA8PCAyKSArIDB4ZmZkMDAwMDApLAoJLmRkcl9wbGxfYmFzZV9hZGRyZXNzPSgoMHgwMDAwICA8PCAyKSArIDB4ZmY2MzhjMDApLAoJLmVlX3RpbWVyX2Jhc2VfYWRkcmVzcz0oKDB4M2M2MiAgPDwgMikgKyAweGZmZDAwMDAwKSwKCS5lZV9wd21fYmFzZV9hZGRyZXNzPSgweGZmODA3MDAwICsgKDB4MDAxIDw8IDIpKSwKCS5kZHJfZG1jX2FwZF9hZGRyZXNzPSgoMHgwMDhjICA8PCAyKSArIDB4ZmY2Mzg0MDApLAoJLmRkcl9kbWNfYXNyX2FkZHJlc3M9KCgweDAwOGQgIDw8IDIpICsgMHhmZjYzODQwMCksCgkuZGRyX2Jvb3RfcmVhc29uX2FkZHJlc3M9KDB4ZmY4MDAwMDAgKyAoMHgwOGYgPDwgMikpLC8vQU9fU0VDX1NEX0NGRzE1CgkuZGRyX2RtY19scGRkNF9yZXRyYWluaW5nX2FkZHJlc3M9KCgweDAwOTcgIDw8IDIpICsgMHhmZjYzODQwMCksCgl9LAoJLy9zbTEKCXsKCS5zb2NfZmFtaWx5X25hbWU9IlNNMSIsCgkuY2hpcF9pZD1NRVNPTl9DUFVfTUFKT1JfSURfU00xLAoJLnByZWdfc3RpY2t5X3JlZzA9KDB4ZmY2MzQ0MDAgKyAoMHgwNzAgPDwgMikpLC8vUFJFR19TVElDS1lfRzEyQV9SRUcwCgkuZGRyX3BoeV9iYXNlX2FkZHJlc3M9MHhmZTAwMDAwMCwKCS5kZHJfcGN0bF90aW1pbmdfYmFzZV9hZGRyZXNzPSgoMHgwMDAwICA8PCAyKSArIDB4ZmY2Mzg0MDApLAoJLmRkcl9wY3RsX3RpbWluZ19lbmRfYWRkcmVzcz0oKDB4MDBiYiAgPDwgMikgKyAweGZmNjM4NDAwKSwKCS5kZHJfZG1jX3N0aWNreTA9MHhmZjYzODgwMCwKCS5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzPSgoMHgzYzM0ICA8PCAyKSArIDB4ZmZkMDAwMDApLAoJLmRkcl9wbGxfYmFzZV9hZGRyZXNzPSgoMHgwMDAwICA8PCAyKSArIDB4ZmY2MzhjMDApLAoJLmVlX3RpbWVyX2Jhc2VfYWRkcmVzcz0oKDB4M2M2MiAgPDwgMikgKyAweGZmZDAwMDAwKSwKCS5lZV9wd21fYmFzZV9hZGRyZXNzPSgweGZmODA3MDAwICsgKDB4MDAxIDw8IDIpKSwKCS5kZHJfZG1jX2FwZF9hZGRyZXNzPSgoMHgwMDhjICA8PCAyKSArIDB4ZmY2Mzg0MDApLAoJLmRkcl9kbWNfYXNyX2FkZHJlc3M9KCgweDAwOGQgIDw8IDIpICsgMHhmZjYzODQwMCksCgkuZGRyX2Jvb3RfcmVhc29uX2FkZHJlc3M9KDB4ZmY4MDAwMDAgKyAoMHgwOGYgPDwgMikpLC8vQU9fU0VDX1NEX0NGRzE1CgkuZGRyX2RtY19scGRkNF9yZXRyYWluaW5nX2FkZHJlc3M9KCgweDAwOTcgIDw8IDIpICsgMHhmZjYzODQwMCksCgl9LAoJLy90bTIKCXsKCS5zb2NfZmFtaWx5X25hbWU9IlRNMiIsCgkuY2hpcF9pZD1NRVNPTl9DUFVfTUFKT1JfSURfVE0yLAoJLnByZWdfc3RpY2t5X3JlZzA9KDB4ZmY2MzQ0MDAgKyAoMHgwNzAgPDwgMikpLC8vUFJFR19TVElDS1lfRzEyQV9SRUcwCgkuZGRyX3BoeV9iYXNlX2FkZHJlc3M9MHhmZTAwMDAwMCwKCS5kZHJfcGN0bF90aW1pbmdfYmFzZV9hZGRyZXNzPSgoMHgwMDAwICA8PCAyKSArIDB4ZmY2Mzg0MDApLAoJLmRkcl9wY3RsX3RpbWluZ19lbmRfYWRkcmVzcz0oKDB4MDBiYiAgPDwgMikgKyAweGZmNjM4NDAwKSwKCS5kZHJfZG1jX3N0aWNreTA9MHhmZjYzODgwMCwKCS5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzPSgoMHgzYzM0ICA8PCAyKSArIDB4ZmZkMDAwMDApLAoJLmRkcl9wbGxfYmFzZV9hZGRyZXNzPSgoMHgwMDAwICA8PCAyKSArIDB4ZmY2MzhjMDApLAoJLmVlX3RpbWVyX2Jhc2VfYWRkcmVzcz0oKDB4M2M2MiAgPDwgMikgKyAweGZmZDAwMDAwKSwKCS5lZV9wd21fYmFzZV9hZGRyZXNzPSgweGZmODA3MDAwICsgKDB4MDAxIDw8IDIpKSwKCS5kZHJfZG1jX2FwZF9hZGRyZXNzPSgoMHgwMDhjICA8PCAyKSArIDB4ZmY2Mzg0MDApLAoJLmRkcl9kbWNfYXNyX2FkZHJlc3M9KCgweDAwOGQgIDw8IDIpICsgMHhmZjYzODQwMCksCgkuZGRyX2Jvb3RfcmVhc29uX2FkZHJlc3M9KDB4ZmY4MDAwMDAgKyAoMHgwOGYgPDwgMikpLC8vQU9fU0VDX1NEX0NGRzE1CgkuZGRyX2RtY19scGRkNF9yZXRyYWluaW5nX2FkZHJlc3M9KCgweDAwOTcgIDw8IDIpICsgMHhmZjYzODQwMCksCgl9LAoJLy9hMQoJewoJLnNvY19mYW1pbHlfbmFtZT0iQTEiLAoJLmNoaXBfaWQ9TUVTT05fQ1BVX01BSk9SX0lEX0ExLAoJLnByZWdfc3RpY2t5X3JlZzA9MHhmZmZmZjQwMCwvL3VzZSBzcmFtICBBMSwoKDB4MDBiMCAgPDwgMikgKyAweGZlMDA1ODAwKSwvL1NZU0NUUkxfU1RJQ0tZX1JFRzAKCS5kZHJfcGh5X2Jhc2VfYWRkcmVzcz0weGZjMDAwMDAwLAoJLmRkcl9wY3RsX3RpbWluZ19iYXNlX2FkZHJlc3M9KCgweDAwMDAgIDw8IDIpICsgMHhmZDAyMDQwMCksCgkuZGRyX3BjdGxfdGltaW5nX2VuZF9hZGRyZXNzPSgoMHgwMGJiICA8PCAyKSArIDB4ZmQwMjA0MDApLAoJLmRkcl9kbWNfc3RpY2t5MD0weGZkMDIwODAwLAoJLmRkcl9kbWNfYXBkX2FkZHJlc3M9KCgweDAwOGMgIDw8IDIpICsgMHhmZDAyMDQwMCksCgkuZGRyX2RtY19hc3JfYWRkcmVzcz0oKDB4MDA4ZCAgPDwgMikgKyAweGZkMDIwNDAwKSwKCS5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzPTAsLy8oKDB4MDA0MCAgPDwgMikgKyAweGZlMDAwMDAwKSwKCS5zeXNfd2F0Y2hkb2dfZW5hYmxlX3ZhbHVlPTB4MDNjNDAxZmYsCgkuZGRyX2Jvb3RfcmVhc29uX2FkZHJlc3M9KCgweDAwZTEgIDw8IDIpICsgMHhmZTAwNTgwMCksLy9TWVNDVFJMX1NFQ19TVElDS1lfUkVHMQoJfSwKCS8vYzEKCXsKCS5zb2NfZmFtaWx5X25hbWU9IkMxIiwKCS5jaGlwX2lkPU1FU09OX0NQVV9NQUpPUl9JRF9DMSwKCS5wcmVnX3N0aWNreV9yZWcwPTB4ZmZmZmY0MDAsLy91c2Ugc3JhbSAgQTEsKCgweDAwYjAgIDw8IDIpICsgMHhmZTAwNTgwMCksLy9TWVNDVFJMX1NUSUNLWV9SRUcwCgkuZGRyX3BoeV9iYXNlX2FkZHJlc3M9MHhmZDAwMDAwMCwKCS5kZHJfcGN0bF90aW1pbmdfYmFzZV9hZGRyZXNzPSgoMHgwMDAwICA8PCAyKSArIDB4ZmUwMjQ0MDApLAoJLmRkcl9wY3RsX3RpbWluZ19lbmRfYWRkcmVzcz0oKDB4MDBiYiAgPDwgMikgKyAweGZlMDI0NDAwKSwKCS5kZHJfZG1jX3N0aWNreTA9KCgweDAwMDAgIDw8IDIpICsgMHhmZTAyNDgwMCksCgkuZGRyX3BsbF9iYXNlX2FkZHJlc3M9KCgweDAwMDAgIDw8IDIpICsgMHhmZTAyNGMwMCksCgkuZGRyX2RtY19hcGRfYWRkcmVzcz0oKDB4MDA4YyAgPDwgMikgKyAweGZlMDI0NDAwKSwKCS5kZHJfZG1jX2Fzcl9hZGRyZXNzPSgoMHgwMDhkICA8PCAyKSArIDB4ZmUwMjQ0MDApLAoJLnN5c193YXRjaGRvZ19iYXNlX2FkZHJlc3M9MCwvLygoMHgwMDQwICA8PCAyKSArIDB4ZmUwMDAwMDApLAoJLnN5c193YXRjaGRvZ19lbmFibGVfdmFsdWU9MHgwM2M0MDFmZiwKCS5kZHJfYm9vdF9yZWFzb25fYWRkcmVzcz0oKDB4MDBlMSAgPDwgMikgKyAweGZlMDA1ODAwKSwvL1NZU0NUUkxfU0VDX1NUSUNLWV9SRUcxCgl9LAoJLy9jMgoJewoJLnNvY19mYW1pbHlfbmFtZT0iQzIiLAoJLmNoaXBfaWQ9TUVTT05fQ1BVX01BSk9SX0lEX0MyLAoJLnByZWdfc3RpY2t5X3JlZzA9KCgweDAwMDAgIDw8IDIpICsgMHhmZTAyNDgwMCksLy91c2Ugc3JhbSAgQTEsKCgweDAwYjAgIDw8IDIpICsgMHhmZTAwNTgwMCksLy9TWVNDVFJMX1NUSUNLWV9SRUcwCgkuZGRyX3BoeV9iYXNlX2FkZHJlc3M9MHhmZDAwMDAwMCwKCS5kZHJfcGN0bF90aW1pbmdfYmFzZV9hZGRyZXNzPSgoMHgwMDAwICA8PCAyKSArIDB4ZmUwMjQ0MDApLAoJLmRkcl9wY3RsX3RpbWluZ19lbmRfYWRkcmVzcz0oKDB4MDBiYiAgPDwgMikgKyAweGZlMDI0NDAwKSwKCS5kZHJfZG1jX3N0aWNreTA9KCgweDAwMDAgIDw8IDIpICsgMHhmZTAyNDgwMCksCgkuZGRyX3BsbF9iYXNlX2FkZHJlc3M9KCgweDAwMDAgIDw8IDIpICsgMHhmZTAyNGMwMCksCgkuZGRyX2RtY19hcGRfYWRkcmVzcz0oKDB4MDA4YyAgPDwgMikgKyAweGZlMDI0NDAwKSwKCS5kZHJfZG1jX2Fzcl9hZGRyZXNzPSgoMHgwMDhkICA8PCAyKSArIDB4ZmUwMjQ0MDApLAoJLnN5c193YXRjaGRvZ19iYXNlX2FkZHJlc3M9MCwvLygoMHgwMDQwICA8PCAyKSArIDB4ZmUwMDAwMDApLAoJLnN5c193YXRjaGRvZ19lbmFibGVfdmFsdWU9MHgwM2M0MDFmZiwKCS5kZHJfYm9vdF9yZWFzb25fYWRkcmVzcz0oKDB4MDBlMSAgPDwgMikgKyAweGZlMDA1ODAwKSwvL1NZU0NUUkxfU0VDX1NUSUNLWV9SRUcxCgkuZGRyX2RtY19scGRkNF9yZXRyYWluaW5nX2FkZHJlc3M9KCgweDAwOTcgIDw8IDIpICsgMHhmZTAyNDQwMCksCgl9LAoJLy9zYzIKCXsKCS5zb2NfZmFtaWx5X25hbWU9IlNDMiIsCgkuY2hpcF9pZD1NRVNPTl9DUFVfTUFKT1JfSURfU0MyLAoJLnByZWdfc3RpY2t5X3JlZzA9KCgweDAwMDAgPDwgMikgKyAweGZlMDM2ODAwKSwvLwoJLmRkcl9waHlfYmFzZV9hZGRyZXNzPTB4ZmMwMDAwMDAsCgkuZGRyX3BjdGxfdGltaW5nX2Jhc2VfYWRkcmVzcz0oKDB4MDAwMCAgPDwgMikgKyAweGZlMDM2NDAwKSwKCS5kZHJfcGN0bF90aW1pbmdfZW5kX2FkZHJlc3M9KCgweDAwYmIgIDw8IDIpICsgMHhmZTAzNjQwMCksCgkuZGRyX2RtY19zdGlja3kwPTB4ZmUwMzY4MDAsCgkuc3lzX3dhdGNoZG9nX2Jhc2VfYWRkcmVzcz0oKDB4M2MzNCAgPDwgMikgKyAweGZmZDAwMDAwKSwvL3NjMiBjYW4gbm90IGZpbmQKCS5kZHJfcGxsX2Jhc2VfYWRkcmVzcz0oKDB4MDAwMCAgPDwgMikgKyAweGZlMDM2YzAwKSwKCS5lZV90aW1lcl9iYXNlX2FkZHJlc3M9KCgweDNjNjIgIDw8IDIpICsgMHhmZmQwMDAwMCksLy9zYzIgY2FuIG5vdCBmaW5kCgkuZWVfcHdtX2Jhc2VfYWRkcmVzcz0oKDB4MDAwMSAgPDwgMikgKyAweGZlMDVlMDAwKSwvL1BXTUdIX1BXTV9CCgkuZGRyX2RtY19hcGRfYWRkcmVzcz0oKDB4MDA4YyAgPDwgMikgKyAweGZlMDM2NDAwKSwKCS5kZHJfZG1jX2Fzcl9hZGRyZXNzPSgoMHgwMDhkICA8PCAyKSArIDB4ZmUwMzY0MDApLAoJLmRkcl9ib290X3JlYXNvbl9hZGRyZXNzPTB4ZmUwMzY4MDAsLy9zYzIgY2FuIG5vdCBmaW5kLFNZU0NUUkxfU1RJQ0tZX1JFRzAKCX0sCgkvLyBmb3JjZSBpZCB1c2UgaWQgbWFzawoJewoJLnNvY19mYW1pbHlfbmFtZT0iVUtOT1dOIiwKCS5jaGlwX2lkPUNISVBfSURfTUFTSywvL01FU09OX0NQVV9NQUpPUl9JRF9HMTJBLAoJLnByZWdfc3RpY2t5X3JlZzA9KDB4ZmY2MzQ0MDAgKyAoMHgwNzAgPDwgMikpLC8vUFJFR19TVElDS1lfRzEyQV9SRUcwCgkuZGRyX3BoeV9iYXNlX2FkZHJlc3M9MHhmZTAwMDAwMCwKCS5kZHJfcGN0bF90aW1pbmdfYmFzZV9hZGRyZXNzPSgoMHgwMDAwICA8PCAyKSArIDB4ZmY2Mzg0MDApLAoJLmRkcl9wY3RsX3RpbWluZ19lbmRfYWRkcmVzcz0oKDB4MDBiYiAgPDwgMikgKyAweGZmNjM4NDAwKSwKCS5kZHJfZG1jX3N0aWNreTA9MHhmZjYzODgwMCwKCS5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzPSgoMHgzYzM0ICA8PCAyKSArIDB4ZmZkMDAwMDApLAoJLmRkcl9wbGxfYmFzZV9hZGRyZXNzPSgoMHgwMDAwICA8PCAyKSArIDB4ZmY2MzhjMDApLAoJLmVlX3RpbWVyX2Jhc2VfYWRkcmVzcz0oKDB4M2M2MiAgPDwgMikgKyAweGZmZDAwMDAwKSwKCS5lZV9wd21fYmFzZV9hZGRyZXNzPSgweGZmODA3MDAwICsgKDB4MDAxIDw8IDIpKSwKCS5kZHJfZG1jX2FwZF9hZGRyZXNzPSgoMHgwMDhjICA8PCAyKSArIDB4ZmY2Mzg0MDApLAoJLmRkcl9kbWNfYXNyX2FkZHJlc3M9KCgweDAwOGQgIDw8IDIpICsgMHhmZjYzODQwMCksCgkuZGRyX2Jvb3RfcmVhc29uX2FkZHJlc3M9KDB4ZmY4MDAwMDAgKyAoMHgwOGYgPDwgMikpLC8vQU9fU0VDX1NEX0NGRzE1CgkuZGRyX2RtY19scGRkNF9yZXRyYWluaW5nX2FkZHJlc3M9KCgweDAwOTcgIDw8IDIpICsgMHhmZjYzODQwMCksCgl9LAp9OwoKZGRyX2Jhc2VfYWRkcmVzc190YWJsZV90ICogcF9kZHJfYmFzZT17MH07CgoKCiNpZmRlZiBDT05GSUdfRU5WX0lTX05PV0hFUkUKCmludCBzZXRlbnYoY29uc3QgY2hhciAqdmFybmFtZSwgY29uc3QgY2hhciAqdmFydmFsdWUpCnsKCXJldHVybiAxOwp9CgpjaGFyICpnZXRlbnYoY29uc3QgY2hhciAqbmFtZSkKewoJcmV0dXJuIE5VTEw7Cn0KCiNlbmRpZiAvL0NPTkZJR19FTlZfSVNfTk9XSEVSRQoKI2RlZmluZSBEV0NfQUNfUElOTVVYX1RPVEFMCQkJCQkJMjgKI2RlZmluZSBEV0NfREZJX1BJTk1VWF9UT1RBTAkJCQkJMjYKCi8vI2RlZmluZSBERFJfVVNFX0RFRklORV9URU1QTEFURV9DT05GSUcgICAxCiNkZWZpbmUgRERSX1NUSUNLWV9NQUdJQ19OVU1CRVIJCQkJCTB4MjAxODAwMDAKI2RlZmluZSBERFJfQ0hJUF9JRAkJCQkJCQkJMHgzMAojZGVmaW5lIEREUl9TVElDS1lfU09VUkNFX0RNQ19TVElDS1kJCQkweDEKI2RlZmluZSBERFJfU1RJQ0tZX1NPVVJDRV9TUkFNCQkJCQkweDIKCiNkZWZpbmUgRERSX1NUSUNLWV9PVkVSUklERV9DT05GSUdfTUVTU0FHRV9DTUQJMHgxIC8vb3ZlcnJpZGUgY29uZmlnCiNkZWZpbmUgRERSX1NUSUNLWV9TUEVDSUFMX0ZVTkNUSU9OX0NNRAkJCTB4MiAvL3NwZWNpYWwgdGVzdCBzdWNoIGFzIHNoaWZ0IHNvbWUgYmRsciBvciBwYXJhbWV0ZXIgb3IgaW50ZXJsZWF2ZSB0ZXN0CgojZGVmaW5lIEREUl9JTklUX0NPTkZJR19TVElDS1lfTUVTU0FHRV9TUkFNX0FERFJFU1MJMHgwMDA0MDAwMAojZGVmaW5lIEREUl9JTklUX0NPTkZJR19HTE9CQUxfTUVTU0FHRV9TUkFNX0FERFJFU1MJMHgwMDA1MDAwMAojZGVmaW5lIENPTkZJR19ERFJfVFlQRV9ERFIzCQkJCTAKI2RlZmluZSBDT05GSUdfRERSX1RZUEVfRERSNAkJCQkxCiNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSNAkJCQkyCiNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSMwkJCQkzCiNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSMgkJCQk0Ci8vI2RlZmluZSBDT05GSUdfRERSX1RZUEVfTFBERFI0WAkJCQk1CiNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0FVVE8JCQkJMHhmCiNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0FVVE9fTElNSVQJCQlDT05GSUdfRERSX1RZUEVfRERSNAoKI2RlZmluZSBDT05GSUdfRERSMF8xNkJJVF9DSDAJCQkJMHgxCiNkZWZpbmUgQ09ORklHX0REUjBfMTZCSVRfUkFOSzAxX0NIMAkJMHg0CiNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfUkFOSzBfQ0gwCQkJMHgyCiNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfUkFOSzAxX0NIMDEJCTB4MwojZGVmaW5lIENPTkZJR19ERFIwXzMyQklUXzE2QklUX1JBTkswX0NIMAkweDUKI2RlZmluZSBDT05GSUdfRERSMF8zMkJJVF8xNkJJVF9SQU5LMDFfQ0gwCTB4NgojZGVmaW5lIENPTkZJR19ERFIwXzMyQklUX1JBTkswMV9DSDAJCTB4NwojZGVmaW5lIENPTkZJR19ERFIwXzMyQklUX1JBTkswX0NIMDEJCTB4OAojZGVmaW5lCUREUl9QUklOVF9ESVNBQkxFCQkJCQkwCiNkZWZpbmUJRERSX1BSSU5UX0VOQUJMRQkJCQkJMQoKdHlwZWRlZiBzdHJ1Y3QgYm9hcmRfY29tbW9uX3NldHRpbmcKewp1bnNpZ25lZAlpbnQJdGltbWluZ19tYWdpYzsKdW5zaWduZWQJc2hvcnQJdGltbWluZ19tYXhfdmFsaWRfY29uZmlnczsKdW5zaWduZWQJc2hvcnQJdGltbWluZ19zdHJ1Y3RfdmVyc2lvbjsKdW5zaWduZWQJc2hvcnQJdGltbWluZ19zdHJ1Y3Rfb3JnX3NpemU7CnVuc2lnbmVkCXNob3J0CXRpbW1pbmdfc3RydWN0X3JlYWxfc2l6ZTsKdW5zaWduZWQJY2hhcglmYXN0X2Jvb3RbNF07Ly8gMCAgIGZhc3Rib290IGVuYWJsZSAgMSB3aW5kb3cgdGVzdCBtYXJnaW4gIDIgYXV0byBvZmZzZXQgYWZ0ZXIgd2luZG93IHRlc3QgMyBhdXRvIHdpbmRvdyB0ZXN0IGVuYWJsZQp1bnNpZ25lZAlpbnQJZGRyX2Z1bmM7CnVuc2lnbmVkCWNoYXIJYm9hcmRfaWQ7CnVuc2lnbmVkCWNoYXIJRHJhbVR5cGU7CnVuc2lnbmVkCWNoYXIJZHJhbV9yYW5rX2NvbmZpZzsKdW5zaWduZWQJY2hhcglEaXNhYmxlZERieXRlOwp1bnNpZ25lZAlpbnQJZHJhbV9jczBfYmFzZV9hZGQ7CnVuc2lnbmVkCWludAlkcmFtX2NzMV9iYXNlX2FkZDsKdW5zaWduZWQJc2hvcnQJZHJhbV9jczBfc2l6ZV9NQjsKdW5zaWduZWQJc2hvcnQJZHJhbV9jczFfc2l6ZV9NQjsKdW5zaWduZWQJY2hhcglkcmFtX3g0eDh4MTZfbW9kZTsKdW5zaWduZWQJY2hhcglJczJUdGltaW5nOwp1bnNpZ25lZAljaGFyCWxvZ19sZXZlbDsKdW5zaWduZWQJY2hhcglkZHJfcmRiaV93cl9lbmFibGU7CnVuc2lnbmVkCWludAlwbGxfc3NjX21vZGU7CnVuc2lnbmVkCXNob3J0CW9yZ190ZHFzMmRxOwp1bnNpZ25lZAljaGFyCXJlc2VydmUxX3Rlc3RfZnVuY3Rpb25bMl07CnVuc2lnbmVkCWludAlkZHJfZG1jX3JlbWFwWzVdOwp1bnNpZ25lZAljaGFyCWFjX3Bpbm11eFszNV07CnVuc2lnbmVkCWNoYXIJZGRyX2Rxc19zd2FwOwp1bnNpZ25lZAljaGFyCWRkcl9kcV9yZW1hcFszNl07CnVuc2lnbmVkCWludAlkZHJfdmRkZWVfc2V0dGluZ1s0XTsvL2FkZCxkZWZhdWx0LXZhbHVlLGRlZmF1bHQtdm9sdGFnZSxzdGVwCn1fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgYm9hcmRfY29tbW9uX3NldHRpbmdfdDsKdHlwZWRlZiBzdHJ1Y3QgYm9hcmRfU0lfc2V0dGluZ19wcwp7CnVuc2lnbmVkCXNob3J0CURSQU1GcmVxOwp1bnNpZ25lZAljaGFyCVBsbEJ5cGFzc0VuOwp1bnNpZ25lZAljaGFyCXRyYWluaW5nX1NlcXVlbmNlQ3RybDsKdW5zaWduZWQJc2hvcnQJZGRyX29kdF9jb25maWc7CnVuc2lnbmVkCWNoYXIJY2xrX2Rydl9vaG07CnVuc2lnbmVkCWNoYXIJY3NfZHJ2X29obTsKdW5zaWduZWQJY2hhcglhY19kcnZfb2htOwp1bnNpZ25lZAljaGFyCXNvY19kYXRhX2Rydl9vaG1fcDsKdW5zaWduZWQJY2hhcglzb2NfZGF0YV9kcnZfb2htX247CnVuc2lnbmVkCWNoYXIJc29jX2RhdGFfb2R0X29obV9wOwp1bnNpZ25lZAljaGFyCXNvY19kYXRhX29kdF9vaG1fbjsKdW5zaWduZWQJY2hhcglkcmFtX2RhdGFfZHJ2X29obTsKdW5zaWduZWQJY2hhcglkcmFtX2RhdGFfb2R0X29obTsKdW5zaWduZWQJY2hhcglkcmFtX2RhdGFfd3Jfb2R0X29obTsKdW5zaWduZWQJY2hhcglkcmFtX2FjX29kdF9vaG07CnVuc2lnbmVkCWNoYXIJZHJhbV9kYXRhX2Rydl9wdWxsX3VwX2NhbGlicmF0aW9uX29obTsKdW5zaWduZWQJY2hhcglscGRkcjRfZHJhbV92b3V0X3ZvbHRhZ2VfcmFuZ2Vfc2V0dGluZzsKdW5zaWduZWQJY2hhcglyZXNlcnZlMjsKdW5zaWduZWQJc2hvcnQJdnJlZl9hY19wZXJtaWw7IC8vcGh5CnVuc2lnbmVkCXNob3J0CXZyZWZfc29jX2RhdGFfcGVybWlsOyAvL3NvYwp1bnNpZ25lZAlzaG9ydAl2cmVmX2RyYW1fZGF0YV9wZXJtaWw7CnVuc2lnbmVkCXNob3J0CW1heF9jb3JlX3RpbW1taW5nX2ZyZXF1ZW5jeTsKdW5zaWduZWQJc2hvcnQJdHJhaW5pbmdfcGhhc2VfcGFyYW1ldGVyWzJdOwp1bnNpZ25lZAlzaG9ydAlhY190cmFjZV9kZWxheV9vcmdbMzZdOwp9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGJvYXJkX1NJX3NldHRpbmdfcHNfdDsKdHlwZWRlZiBzdHJ1Y3QgYm9hcmRfcGhhc2Vfc2V0dGluZ19wcwp7CnVuc2lnbmVkCXNob3J0CWFjX3RyYWNlX2RlbGF5WzM2XTsKdW5zaWduZWQJc2hvcnQJd3JpdGVfZHFzX2RlbGF5WzhdOwp1bnNpZ25lZAlzaG9ydAl3cml0ZV9kcV9iaXRfZGVsYXlbNzJdOwp1bnNpZ25lZAlzaG9ydAlyZWFkX2Rxc19nYXRlX2RlbGF5WzhdOwp1bnNpZ25lZAljaGFyCXJlYWRfZHFzX2RlbGF5WzhdOwp1bnNpZ25lZAljaGFyCXJlYWRfZHFfYml0X2RlbGF5WzcyXTsKdW5zaWduZWQJY2hhcglzb2NfYml0X3ZyZWZbNDRdOwp1bnNpZ25lZAljaGFyCWRyYW1fYml0X3ZyZWZbMzZdOwp1bnNpZ25lZAlzaG9ydAlyZXNlcnZlX3RyYWluaW5nX3BhcmFtZXRlcls4XTsKfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBib2FyZF9waGFzZV9zZXR0aW5nX3BzX3Q7CnR5cGVkZWYgc3RydWN0IGRkcl9zZXRfYzIKewpib2FyZF9jb21tb25fc2V0dGluZ190CWNmZ19ib2FyZF9jb21tb25fc2V0dGluZwk7CmJvYXJkX1NJX3NldHRpbmdfcHNfdAljZmdfYm9hcmRfU0lfc2V0dGluZ19wc1syXQk7CmJvYXJkX3BoYXNlX3NldHRpbmdfcHNfdAljZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzWzJdCTsKfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBkZHJfc2V0X3RfYzI7CgpzdGF0aWMgdWludDMyX3QgZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodWludDMyX3QgYmFzZV9hZGRyLHVpbnQzMl90IHNpemUsdWludDMyX3Qgb2Zmc2V0X2luZGV4KQp7Cgl1aW50MzJfdCByZWFkX3ZhbHVlPTA7Cgl1aW50MzJfdCBhZGRyX3Q9MDsKCXVpbnQzMl90IG9mZnNldD0wOwoJaWYgKHNpemUgPT0gOCkgewoJCW9mZnNldD0oKG9mZnNldF9pbmRleCU0KTw8Myk7CgkJYWRkcl90PShiYXNlX2FkZHIrKChvZmZzZXRfaW5kZXg+PjIpIDw8IDIpKTsKCQlyZWFkX3ZhbHVlPSAoKih2b2xhdGlsZSB1aW50MzJfdCAqKSgoIHVuc2lnbmVkIGxvbmcgKShhZGRyX3QpKSk7CgkJcmVhZF92YWx1ZT0ocmVhZF92YWx1ZT4+b2Zmc2V0KSYweGZmOwoKCX0KCWlmIChzaXplID09IDE2KSB7CgkJb2Zmc2V0PSgob2Zmc2V0X2luZGV4JTIpPDw0KTsKCQlhZGRyX3Q9KGJhc2VfYWRkcisoKG9mZnNldF9pbmRleD4+MSkgPDwgMikpOwoJCXJlYWRfdmFsdWU9ICgqKHZvbGF0aWxlIHVpbnQzMl90ICopKCggdW5zaWduZWQgbG9uZyApKGFkZHJfdCkpKTsKCQlyZWFkX3ZhbHVlPShyZWFkX3ZhbHVlPj5vZmZzZXQpJjB4ZmZmZjsKCX0KCXJldHVybiByZWFkX3ZhbHVlOwoKfQpzdGF0aWMgdWludDMyX3QgZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcodWludDMyX3QgYmFzZV9hZGRyLHVpbnQzMl90IHNpemUsdWludDMyX3Qgb2Zmc2V0X2luZGV4LHVpbnQzMl90IHZhbHVlKQp7Cgl1aW50MzJfdCByZWFkX3ZhbHVlPTA7Cgl1aW50MzJfdCB3cml0ZV92YWx1ZT0wOwoJdWludDMyX3QgYWRkcl90PTA7Cgl1aW50MzJfdCBvZmZzZXQ9MDsKCWlmIChzaXplID09IDgpIHsKCQlvZmZzZXQ9KChvZmZzZXRfaW5kZXglNCk8PDMpOwoJCWFkZHJfdD0oYmFzZV9hZGRyKygob2Zmc2V0X2luZGV4Pj4yKSA8PCAyKSk7CgkJcmVhZF92YWx1ZT0gKCoodm9sYXRpbGUgdWludDMyX3QgKikoKCB1bnNpZ25lZCBsb25nICkoYWRkcl90KSkpOwoJCXdyaXRlX3ZhbHVlPSh2YWx1ZTw8b2Zmc2V0KXwocmVhZF92YWx1ZSYofigweGZmPDxvZmZzZXQpKSk7Cgl9CglpZiAoc2l6ZSA9PSAxNikgewoJCW9mZnNldD0oKG9mZnNldF9pbmRleCUyKTw8NCk7CgkJYWRkcl90PShiYXNlX2FkZHIrKChvZmZzZXRfaW5kZXg+PjEpIDw8IDIpKTsKCQlyZWFkX3ZhbHVlPSAoKih2b2xhdGlsZSB1aW50MzJfdCAqKSgoIHVuc2lnbmVkIGxvbmcgKShhZGRyX3QpKSk7CgkJd3JpdGVfdmFsdWU9KHZhbHVlPDxvZmZzZXQpfChyZWFkX3ZhbHVlJih+KDB4ZmZmZjw8b2Zmc2V0KSkpOwoJfQoJKih2b2xhdGlsZSB1aW50MzJfdCAqKSgoIHVuc2lnbmVkIGxvbmcgKShhZGRyX3QpKT13cml0ZV92YWx1ZTsKCXJldHVybiB3cml0ZV92YWx1ZTsKfQoKdWludDMyX3QgZGRyX21pbih1aW50MzJfdCBhLHVpbnQzMl90IGIpCnsKCXVpbnQzMl90IG1pbj1hOwoJaWYgKGE8YikKCQltaW49IGE7CgllbHNlCgkJbWluPWI7CglyZXR1cm4gbWluOwp9Cgp1aW50MzJfdCBkZHJfbWF4KHVpbnQzMl90IGEsdWludDMyX3QgYikKewoJdWludDMyX3QgbWF4PWE7CglpZiAoYTxiKQoJCW1heD0gYjsKCWVsc2UKCQltYXg9YTsKCXJldHVybiBtYXg7Cn0KCnR5cGVkZWYgc3RydWN0IHRyYWluaW5nX2RlbGF5X3NldF9wc3sKCXVuc2lnbmVkCWNoYXIJYWNfdHJhY2VfZGVsYXlbMTBdOwoJdW5zaWduZWQJY2hhcglhY190cmFjZV9kZWxheV9yZXZbMl07Cgl1bnNpZ25lZAljaGFyCXJlYWRfZHFzX2RlbGF5WzE2XTsKCXVuc2lnbmVkCWNoYXIJcmVhZF9kcV9iaXRfZGVsYXlbNzJdOwoJdW5zaWduZWQJc2hvcnQJd3JpdGVfZHFzX2RlbGF5WzE2XTsKLy8JKi8KCXVuc2lnbmVkCXNob3J0CXdyaXRlX2RxX2JpdF9kZWxheVs3Ml07Cgl1bnNpZ25lZAlzaG9ydAlyZWFkX2Rxc19nYXRlX2RlbGF5WzE2XTsKCXVuc2lnbmVkCWNoYXIJc29jX2JpdF92cmVmWzM2XTsKCXVuc2lnbmVkCWNoYXIJZHJhbV9iaXRfdnJlZlszMl07CgkvLy8qCgl1bnNpZ25lZAljaGFyCXJldmVyMTsvL3JlYWRfZHFzICByZWFkX2RxLHdyaXRlX2Rxcywgd3JpdGVfZHEKCXVuc2lnbmVkCWNoYXIJZGZpX21ybDsKCXVuc2lnbmVkCWNoYXIJZGZpX2h3dG1ybDsKCXVuc2lnbmVkCWNoYXIJQVJkUHRySW5pdFZhbDsKCXVuc2lnbmVkCXNob3J0CWNzcl92cmVmaW5nbG9iYWw7Cgl1bnNpZ25lZAlzaG9ydAljc3JfZHFzcmN2Y250cmxbNF07Cgl1bnNpZ25lZAlzaG9ydAljc3JfcHB0ZHFzY250aW52dHJudGcwWzRdOwoJdW5zaWduZWQJc2hvcnQJY3NyX3BwdGRxc2NudGludnRybnRnMVs0XTsKCXVuc2lnbmVkCXNob3J0CWNzcl9zZXEwYmdwcls5XTsKCXVuc2lnbmVkCXNob3J0CWNzcl9kbGxnYWluY3RsOwoJdW5zaWduZWQJc2hvcnQJY3NyX2RsbGxvY2twYXJhOwovLwl1bnNpZ25lZAlzaG9ydAlyZXZlcjI7Cn1fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdHJhaW5pbmdfZGVsYXlfc2V0X3BzX3Q7CnR5cGVkZWYgc3RydWN0IGRkcl9waHlfY29tbW9uX2V4dHJhX3NldHsKCXVuc2lnbmVkCXNob3J0CWNzcl9wbGxjdHJsMzsKCXVuc2lnbmVkCXNob3J0CWNzcl9wcHRjdGxzdGF0aWNbNF07Cgl1bnNpZ25lZAlzaG9ydAljc3JfdHJhaW5pbmdpbmNkZWNkdHNtZW5bNF07Cgl1bnNpZ25lZAlzaG9ydAljc3JfdHNtYnl0ZTBbNF07Cgl1bnNpZ25lZAlzaG9ydAljc3JfaHd0Y2Ftb2RlOwoJdW5zaWduZWQJc2hvcnQJY3NyX2h3dGxwY3NlbmE7Cgl1bnNpZ25lZAlzaG9ydAljc3JfaHd0bHBjc2VuYjsKCXVuc2lnbmVkCXNob3J0CWNzcl9hY3NtY3RybDEzOwoJdW5zaWduZWQJc2hvcnQJY3NyX2Fjc21jdHJsMjM7Cgl1bnNpZ25lZAljaGFyCWNzcl9zb2NfdnJlZl9kYWMxX2RmZVszNl07Cn1fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3Q7Cgp0eXBlZGVmIHN0cnVjdCByZXRyYWluaW5nX3NldHsKCXVuc2lnbmVkIHNob3J0ICAgIGNzcl9wbGxjdHJsMzsKCXVuc2lnbmVkIHNob3J0ICAgIGNzcl9wcHRjdGxzdGF0aWNbNF07Cgl1bnNpZ25lZCBzaG9ydCAgICBjc3JfdHJhaW5pbmdpbmNkZWNkdHNtZW5bNF07Cgl1bnNpZ25lZCBzaG9ydCAgICAgIGNzcl90c21ieXRlMFs0XTsKCXVuc2lnbmVkIHNob3J0ICAgIGNzcl92cmVmaW5nbG9iYWw7CgkvL3Vuc2lnbmVkIHNob3J0ICAgIGNzcl9kZmltcmxbNF07Cgl1bnNpZ25lZCBzaG9ydCAgICBjc3JfZHFzcmN2Y250cmxbNF07Cgl1bnNpZ25lZCBzaG9ydCAgICAgY3NyX3BwdGRxc2NudGludnRybnRnMFs0XTsKCXVuc2lnbmVkIHNob3J0ICAgICBjc3JfcHB0ZHFzY250aW52dHJudGcxWzRdOwoJdW5zaWduZWQgc2hvcnQgICAgIGNzcl9zZXEwYmdwcls5XTsKCS8vdW5zaWduZWQgc2hvcnQgICAgIGNzcl9zZXEwYmdwcjI7CgkvL3Vuc2lnbmVkIHNob3J0ICAgICBjc3Jfc2VxMGJncHIzOwoJLy91bnNpZ25lZCBzaG9ydCAgICAgY3NyX3NlcTBiZ3ByNDsKCS8vdW5zaWduZWQgc2hvcnQgICAgIGNzcl9zZXEwYmdwcjU7CgkvL3Vuc2lnbmVkIHNob3J0ICAgICBjc3Jfc2VxMGJncHI2OwoJLy91bnNpZ25lZCBzaG9ydCAgICAgY3NyX3NlcTBiZ3ByNzsKCS8vdW5zaWduZWQgc2hvcnQgICAgIGNzcl9zZXEwYmdwcjg7Cgl1bnNpZ25lZCBzaG9ydCAgICAgY3NyX2RsbGdhaW5jdGw7Cgl1bnNpZ25lZCBzaG9ydCAgICAgY3NyX2RsbGxvY2twYXJhOwoJLy91bnNpZ25lZCBzaG9ydCAgICAgY3NyX2h3dG1ybDsKCXVuc2lnbmVkIHNob3J0ICAgICBjc3JfaHd0Y2Ftb2RlOwoJdW5zaWduZWQgc2hvcnQgICAgIGNzcl9od3RscGNzZW5hOwoJdW5zaWduZWQgc2hvcnQgICAgIGNzcl9od3RscGNzZW5iOwoJdW5zaWduZWQgc2hvcnQgICAgIGNzcl9hY3NtY3RybDEzOwoJdW5zaWduZWQgc2hvcnQgICAgIGNzcl9hY3NtY3RybDIzOwoJdW5zaWduZWQgY2hhciAgICAgY3NyX3NvY192cmVmX2RhYzFfZGZlWzM2XTsKCS8vdW5zaWduZWQgc2hvcnQgICAgIHJldl80MTsKfSByZXRyYWluaW5nX3NldF90Owp0eXBlZGVmIHN0cnVjdCBkZHJfc2V0ewoJdW5zaWduZWQJaW50CQltYWdpYzsKCXVuc2lnbmVkCWNoYXIJZmFzdF9ib290WzRdOy8vIDAgICBmYXN0Ym9vdCBlbmFibGUgIDEgd2luZG93IHRlc3QgbWFyZ2luICAyIGF1dG8gb2Zmc2V0IGFmdGVyIHdpbmRvdyB0ZXN0IDMgYXV0byB3aW5kb3cgdGVzdAovLwl1bnNpZ25lZAlpbnQJCXJzdl9pbnQwOwoJdW5zaWduZWQJaW50CQlkZHJfZnVuYzsKCXVuc2lnbmVkCWNoYXIJYm9hcmRfaWQ7CgkvL2JvYXJkIGlkIHJlc2VydmUsLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCWNoYXIJdmVyc2lvbjsKCS8vIGZpcm13YXJlIHJlc2VydmUgdmVyc2lvbiwsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJY2hhcglEcmFtVHlwZTsKCS8vc3VwcG9ydCBEcmFtVHlwZSBzaG91bGQgY29uZmlybSB3aXRoIGFtbG9naWMKCS8vI2RlZmluZSBDT05GSUdfRERSX1RZUEVfRERSMwkJCQkwCgkvLyNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0REUjQJCQkJMQoJLy8jZGVmaW5lIENPTkZJR19ERFJfVFlQRV9MUEREUjQJCQkJMgoJLy8jZGVmaW5lIENPTkZJR19ERFJfVFlQRV9MUEREUjMJCQkJMwoJLy8jZGVmaW5lIENPTkZJR19ERFJfVFlQRV9MUEREUjIJCQkJNAoJdW5zaWduZWQJY2hhcglEaXNhYmxlZERieXRlOwoJLy91c2UgZm9yIGRyYW0gYnVzIDE2Yml0IG9yIDMyYml0LGlmIHVzZSAxNmJpdCBtb2RlICxzaG91bGQgZGlzYWJsZSBiaXQgMiwzCgkvL2JpdCAwIC0tLXVzZSBieXRlIDAgLDEgZGlzYWJsZSBieXRlIDAsCgkvL2JpdCAxIC0tLXVzZSBieXRlIDEgLDEgZGlzYWJsZSBieXRlIDEsCgkvL2JpdCAyIC0tLXVzZSBieXRlIDIgLDEgZGlzYWJsZSBieXRlIDIsCgkvL2JpdCAzIC0tLXVzZSBieXRlIDMgLDEgZGlzYWJsZSBieXRlIDMsCgl1bnNpZ25lZAljaGFyCUlzMlR0aW1pbmc7CgkvL2RkcjMvZGRyMyB1c2UgMnQgdGltaW5nLG5vdyBvbmx5IHN1cHBvcnQgMnQgdGltbWluZwoJdW5zaWduZWQJY2hhcglIZHRDdHJsOwoJLy90cmFpbmluZyBpbmZvcm1hdGlvbiBjb250cm9sLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCWNoYXIJZHJhbV9yYW5rX2NvbmZpZzsKCS8vc3VwcG9ydCBEcmFtIGNvbm5lY3Rpb24gdHlwZSBzaG91bGQgY29uZmlybSB3aXRoIGFtbG9naWMKCS8vI2RlZmluZSBDT05GSUdfRERSMF8xNkJJVF9DSDAJCQkJMHgxICAvL2RyYW0gdG90YWwgYnVzIHdpZHRoIDE2Yml0IG9ubHkgdXNlIGNzMAoJLy8jZGVmaW5lIENPTkZJR19ERFIwXzE2QklUX1JBTkswMV9DSDAJCTB4NCAgLy9kcmFtIHRvdGFsIGJ1cyB3aWR0aCAxNmJpdCAgdXNlIGNzMCBjczEKCS8vI2RlZmluZSBDT05GSUdfRERSMF8zMkJJVF9SQU5LMF9DSDAJCQkweDIgIC8vZHJhbSB0b3RhbCBidXMgd2lkdGggMzJiaXQgIHVzZSBjczAKCS8vI2RlZmluZSBDT05GSUdfRERSMF8zMkJJVF9SQU5LMDFfQ0gwMQkJMHgzICAgIC8vb25seSBmb3IgbHBkZHI0LGRyYW0gdG90YWwgYnVzIHdpZHRoIDMyYml0ICB1c2UgY2hhbmVsIGEgY3MwIGNzMSBjaGFuZWwgYiBjczAgY3MxCgkvLyNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfMTZCSVRfUkFOSzBfQ0gwCQkweDUgICAgLy9kcmFtIHRvdGFsIGJ1cyB3aWR0aCAzMmJpdCBvbmx5IHVzZSBjczAsYnV0IGhpZ2ggYWRkcmVzcyB1c2UgMTZiaXQgbW9kZQoJLy8jZGVmaW5lIENPTkZJR19ERFIwXzMyQklUXzE2QklUX1JBTkswMV9DSDAJMHg2ICAgLy9kcmFtIHRvdGFsIGJ1cyB3aWR0aCAzMmJpdCAgdXNlIGNzMCBjczEsYnV0IGNzMSB1c2UgMTZiaXQgbW9kZSAsY3VycmVudCBwaHkgbm90IHN1cHBvcnQgcmVzZXJ2ZQoJLy8jZGVmaW5lIENPTkZJR19ERFIwXzMyQklUX1JBTkswMV9DSDAJCTB4NyAgICAgICAvL2RyYW0gdG90YWwgYnVzIHdpZHRoIDMyYml0ICB1c2UgY3MwIGNzMQoJLy8jZGVmaW5lIENPTkZJR19ERFIwXzMyQklUX1JBTkswX0NIMDEJCTB4OCAgICAgLy9vbmx5IGZvciBscGRkcjQsZHJhbSB0b3RhbCBidXMgd2lkdGggMzJiaXQgIHVzZSBjaGFuZWwgYSBjczAgIGNoYW5lbCBiIGNzMAoKCS8qIHJzdl9jaGFyMC4gdXBkYXRlIGZvciBkaWFnbm9zZSB0eXBlIGRlZmluZSAqLwoJdW5zaWduZWQJY2hhcglkaWFnbm9zZTsKCgl1bnNpZ25lZAlzaG9ydAlzb2NfZGF0YV9kcnZfb2htX3BzMTsKCXVuc2lnbmVkCXNob3J0CWRyYW1fZGF0YV9kcnZfb2htX3BzMTsKCXVuc2lnbmVkCXNob3J0CXNvY19kYXRhX29kdF9vaG1fcHMxOwoJdW5zaWduZWQJc2hvcnQJZHJhbV9kYXRhX29kdF9vaG1fcHMxOwoJdW5zaWduZWQJc2hvcnQJZHJhbV9kYXRhX3dyX29kdF9vaG1fcHMxOwoJI2lmIDAKCS8qIGltZW0vZG1lbSBkZWZpbmUgKi8KCXVuc2lnbmVkCWludAkJaW1lbV9sb2FkX2FkZHI7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCWludAkJZG1lbV9sb2FkX2FkZHI7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCXNob3J0CWltZW1fbG9hZF9zaXplOwoJI2VuZGlmCgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCXNob3J0CWRtZW1fbG9hZF9zaXplOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAlpbnQJCWRkcl9iYXNlX2FkZHI7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCWludAkJZGRyX3N0YXJ0X29mZnNldDsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoKCXVuc2lnbmVkCXNob3J0CWRyYW1fY3MwX3NpemVfTUI7CgkvL2NvbmZpZyBjczAgZHJhbSBzaXplICxsaWtlIDFHIERSQU0gLHNldHRpbmcgMTAyNAoJdW5zaWduZWQJc2hvcnQJZHJhbV9jczFfc2l6ZV9NQjsKCS8vY29uZmlnIGNzMSBkcmFtIHNpemUsbGlrZSA1MTJNIERSQU0gLHNldHRpbmcgNTEyCgkvKiBhbGlnbjggKi8KCgl1bnNpZ25lZAlzaG9ydAl0cmFpbmluZ19TZXF1ZW5jZUN0cmxbMl07CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCWNoYXIJcGh5X29kdF9jb25maWdfcmFua1syXTsKCS8vdW5zaWduZWQJY2hhcgkgcmV2ZXIxOwoJLy91bnNpZ25lZAljaGFyCSByZXZlcjI7Cgl1bnNpZ25lZAlzaG9ydAlyYW5rMV9jYV92cmVmX3Blcm1pbDsKCS8vdHJhaW5pbmcgb2R0IGNvbmZpZyAsb25seSB1c2UgZm9yIHRyYWluaW5nCgkvLyBbMF1PZHQgcGF0dGVybiBmb3IgYWNjZXNzZXMgdGFyZ2V0aW5nIHJhbmsgMC4gWzM6MF0gaXMgdXNlZCBmb3Igd3JpdGUgT0RUIFs3OjRdIGlzIHVzZWQgZm9yIHJlYWQgT0RUCgkvLyBbMV1PZHQgcGF0dGVybiBmb3IgYWNjZXNzZXMgdGFyZ2V0aW5nIHJhbmsgMS4gWzM6MF0gaXMgdXNlZCBmb3Igd3JpdGUgT0RUIFs3OjRdIGlzIHVzZWQgZm9yIHJlYWQgT0RUCgl1bnNpZ25lZAlpbnQJCWRmaV9vZHRfY29uZmlnOwoJLy9ub3JtYWwgZ28gc3RhdHVzIG9kIGNvbmZpZyx1c2UgZm9yIG5vcm1hbCBzdGF0dXMKCS8vYml0IDEyLiAgcmFuazEgT0RUIGRlZmF1bHQuIGRlZmF1bHQgdnVsdWUgZm9yIE9EVFsxXSBwaW5zIGlmIHRoZXJlcyBubyByZWFkL3dyaXRlIGFjdGl2aXR5LgoJLy9iaXQgMTEuICByYW5rMSBPRFQgd3JpdGUgc2VsLiAgZW5hYmxlIE9EVFsxXSBpZiB0aGVyZSdzIHdyaXRlIG9jY3VyIGluIHJhbmsxLgoJLy9iaXQgMTAuICByYW5rMSBPRFQgd3JpdGUgbnNlbC4gZW5hYmxlIE9EVFsxXSBpZiB0aGVyZXMncyB3cml0ZSBvY2N1ciBpbiByYW5rMC4KCS8vYml0IDkuICAgcmFuazEgb2R0IHJlYWQgc2VsLiAgIGVuYWJsZSBPRFRbMV0gaWYgdGhlcmUncyByZWFkIG9jY3VyIGluIHJhbmsxLgoJLy9iaXQgOC4gICByYW5rMSBvZHQgcmVhZCBuc2VsLiAgZW5hYmxlIE9EVFsxXSBpZiB0aGVyZSdzIHJlYWQgb2NjdXJlIGluIHJhbmswLgoJLy9iaXQgNC4gICByYW5rMCBPRFQgZGVmYXVsdC4gICAgZGVmYXVsdCB2dWx1ZSBmb3IgT0RUWzBdIHBpbnMgaWYgdGhlcmVzIG5vIHJlYWQvd3JpdGUgYWN0aXZpdHkuCgkvL2JpdCAzLiAgIHJhbmswIE9EVCB3cml0ZSBzZWwuICBlbmFibGUgT0RUWzBdIGlmIHRoZXJlJ3Mgd3JpdGUgb2NjdXIgaW4gcmFuazAuCgkvL2JpdCAyLiAgIHJhbmswIE9EVCB3cml0ZSBuc2VsLiBlbmFibGUgT0RUWzBdIGlmIHRoZXJlcydzIHdyaXRlIG9jY3VyIGluIHJhbmsxLgoJLy9iaXQgMS4gICByYW5rMCBvZHQgcmVhZCBzZWwuICAgZW5hYmxlIE9EVFswXSBpZiB0aGVyZSdzIHJlYWQgb2NjdXIgaW4gcmFuazAuCgkvL2JpdCAwLiAgIHJhbmswIG9kdCByZWFkIG5zZWwuICBlbmFibGUgT0RUWzBdIGlmIHRoZXJlJ3MgcmVhZCBvY2N1cmUgaW4gcmFuazEuCgl1bnNpZ25lZAlzaG9ydAlEUkFNRnJlcVs0XTsKCS8vY29uZmlnIGRyYW0gZnJlcXVlbmN5LHVzZSBEUkFNRnJlcVswXSxvaHRlciByZXNlcnZlCgl1bnNpZ25lZAljaGFyCVBsbEJ5cGFzc0VuOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAljaGFyCWRkcl9yZGJpX3dyX2VuYWJsZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJY2hhcglkZHJfcmZjX3R5cGU7CgkvL2NvbmZpZyBkcmFtIHJmYyB0eXBlLGFjY29yZGluZyBkcmFtIHR5cGUsYWxzbyBjYW4gdXNlIHNhbWUgZHJhbSB0eXBlIG1heCBjb25maWcKCS8vI2RlZmluZSBERFJfUkZDX1RZUEVfRERSM181MTJNYngxCQkJCTAKCS8vI2RlZmluZSBERFJfUkZDX1RZUEVfRERSM181MTJNYngyCQkJCTEKCS8vI2RlZmluZSBERFJfUkZDX1RZUEVfRERSM181MTJNYng0CQkJCTIKCS8vI2RlZmluZSBERFJfUkZDX1RZUEVfRERSM181MTJNYng4CQkJCTMKCS8vI2RlZmluZSBERFJfUkZDX1RZUEVfRERSM181MTJNYngxNgkJCQk0CgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjRfMkdieDEJCQkJCTUKCS8vI2RlZmluZSBERFJfUkZDX1RZUEVfRERSNF8yR2J4MgkJCQkJNgoJLy8jZGVmaW5lIEREUl9SRkNfVFlQRV9ERFI0XzJHYng0CQkJCQk3CgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjRfMkdieDgJCQkJCTgKCS8vI2RlZmluZSBERFJfUkZDX1RZUEVfTFBERFI0XzJHYngxCQkJCTkKCS8vI2RlZmluZSBERFJfUkZDX1RZUEVfTFBERFI0XzNHYngxCQkJCTEwCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0xQRERSNF80R2J4MQkJCQkxMQoJdW5zaWduZWQJY2hhcgllbmFibGVfbHBkZHI0eF9tb2RlOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5CgkvKiBhbGlnbjggKi8KCgl1bnNpZ25lZAlpbnQJCXBsbF9zc2NfbW9kZTsKCS8vCgkvKiBwbGwgc3NjIGNvbmZpZzoKCSAqCgkgKiAgIHBsbF9zc2NfbW9kZSA9ICgxPDwyMCkgfCAoMTw8OCkgfCAoW3N0cmVuZ3RoXSA8PCA0KSB8IFttb2RlXSwKCSAqICAgICAgcHBtID0gc3RyZW5ndGggKiA1MDAKCSAqICAgICAgbW9kZTogMD1jZW50ZXIsIDE9dXAsIDI9ZG93bgoJICoKCSAqICAgZWc6CgkgKiAgICAgMS4gY29uZmlnIDEwMDBwcG0gY2VudGVyIHNzLiB0aGVuIG1vZGU9MCwgc3RyZW5ndGg9MgoJICogICAgICAgIC5wbGxfc3NjX21vZGUgPSAoMTw8MjApIHwgKDE8PDgpIHwgKDIgPDwgNCkgfCAwLAoJICogICAgIDIuIGNvbmZpZyAzMDAwcHBtIGRvd24gc3MuIHRoZW4gbW9kZT0yLCBzdHJlbmd0aD02CgkgKiAgICAgICAgLnBsbF9zc2NfbW9kZSA9ICgxPDwyMCkgfCAoMTw8OCkgfCAoNiA8PCA0KSB8IDIsCgkgKi8KCXVuc2lnbmVkCXNob3J0CWNsa19kcnZfb2htOwoJLy9jb25maWcgc29jIGNsayBwaW4gc2lnbmFsIGRyaXZlciBzdGVuZ3RoICxzZWxlY3QgMjAsMzAsNDAsNjBvaG0KCXVuc2lnbmVkCXNob3J0CWNzX2Rydl9vaG07CgkvL2NvbmZpZyBzb2MgY3MwIGNzMSBwaW4gc2lnbmFsIGRyaXZlciBzdGVuZ3RoICxzZWxlY3QgMjAsMzAsNDAsNjBvaG0KCXVuc2lnbmVkCXNob3J0CWFjX2Rydl9vaG07CgkvL2NvbmZpZyBzb2MgIG5vcm1hbCBhZGRyZXNzIGNvbW1hbmQgcGluIGRyaXZlciBzdGVuZ3RoICxzZWxlY3QgMjAsMzAsNDAsNjBvaG0KCXVuc2lnbmVkCXNob3J0CXNvY19kYXRhX2Rydl9vaG1fcDsKCS8vY29uZmlnIHNvYyBkYXRhIHBpbiBwdWxsIHVwIGRyaXZlciBzdGVuZ3RoLHNlbGVjdCAwLDI4LDMwLDMyLDM0LDM3LDQwLDQzLDQ4LDUzLDYwLDY4LDgwLDk2LDEyMG9obQoJdW5zaWduZWQJc2hvcnQJc29jX2RhdGFfZHJ2X29obV9uOwoJLy9jb25maWcgc29jIGRhdGEgcGluIHB1bGwgZG93biBkcml2ZXIgc3Rlbmd0aCxzZWxlY3QgMCwyOCwzMCwzMiwzNCwzNyw0MCw0Myw0OCw1Myw2MCw2OCw4MCw5NiwxMjBvaG0KCXVuc2lnbmVkCXNob3J0CXNvY19kYXRhX29kdF9vaG1fcDsKCS8vY29uZmlnIHNvYyBkYXRhIHBpbiBvZHQgcHVsbCB1cCBzdGVuZ3RoLHNlbGVjdCAwLDI4LDMwLDMyLDM0LDM3LDQwLDQzLDQ4LDUzLDYwLDY4LDgwLDk2LDEyMG9obQoJdW5zaWduZWQJc2hvcnQJc29jX2RhdGFfb2R0X29obV9uOwoJLy9jb25maWcgc29jIGRhdGEgcGluIG9kdCBwdWxsIGRvd24gc3Rlbmd0aCxzZWxlY3QgMCwyOCwzMCwzMiwzNCwzNyw0MCw0Myw0OCw1Myw2MCw2OCw4MCw5NiwxMjBvaG0KCXVuc2lnbmVkCXNob3J0CWRyYW1fZGF0YV9kcnZfb2htOwoJLy9jb25maWcgZHJhbSBkYXRhIHBpbiBwdWxsIHVwIHB1bGwgZG93biBkcml2ZXIgc3Rlbmd0aCxkZHIzIHNlbGVjdCAzNCw0MG9obSxkZHI0IHNlbGVjdCAzNCw0OG9obSxscGRkcjQgc2VsZWN0IDQwLDQ4LDYwLDgwLDEyMCwyNDBvaG0KCXVuc2lnbmVkCXNob3J0CWRyYW1fZGF0YV9vZHRfb2htOwoJLy9jb25maWcgZHJhbSBkYXRhIHBpbiBvZHQgcHVsbCB1cCBkb3duIHN0ZW5ndGgsZGRyMyBzZWxlY3QgNDAsNjAsMTIwb2htLGRkcjQgc2VsZWN0IDM0LDQwLDQ4LDYwLDEyMCwyNDBvaG0sbHBkZHI0IHNlbGVjdCA0MCw0OCw2MCw4MCwxMjAsMjQwb2htCgl1bnNpZ25lZAlzaG9ydAlkcmFtX2FjX29kdF9vaG07CgkvL2NvbmZpZyBkcmFtIGFjIHBpbiBvZHQgcHVsbCB1cCBkb3duIHN0ZW5ndGgsdXNlIGZvciBscGRkcjQsIHNlbGVjdCA0MCw0OCw2MCw4MCwxMjAsMjQwb2htCgl1bnNpZ25lZAlzaG9ydAlzb2NfY2xrX3NsZXdfcmF0ZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJc2hvcnQJc29jX2NzX3NsZXdfcmF0ZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJc2hvcnQJc29jX2FjX3NsZXdfcmF0ZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJc2hvcnQJc29jX2RhdGFfc2xld19yYXRlOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAlzaG9ydAl2cmVmX291dHB1dF9wZXJtaWw7IC8vcGh5CgkvL3NldHRpbmcgc2FtZSB3aXRoIHZyZWZfZHJhbV9wZXJtaWwKCXVuc2lnbmVkCXNob3J0CXZyZWZfcmVjZWl2ZXJfcGVybWlsOyAvL3NvYwoJLy9zb2MgaW5pdCBTT0MgcmVjZWl2ZXIgdnJlZiAsY29uZmlnIGxpa2UgNTAwIG1lYW5zIDAuNVZERFEsdGFrZSBjYXJlICxwbGVhc2UgZm9sbG93IFNJCgl1bnNpZ25lZAlzaG9ydAl2cmVmX2RyYW1fcGVybWlsOwoJLy9zb2MgaW5pdCBEUkFNIHJlY2VpdmVyIHZyZWYgLGNvbmZpZyBsaWtlIDUwMCBtZWFucyAwLjVWRERRLHRha2UgY2FyZSAscGxlYXNlIGZvbGxvdyBTSQoJdW5zaWduZWQJc2hvcnQJbWF4X2NvcmVfdGltbW1pbmdfZnJlcXVlbmN5OwoJLy91c2UgZm9yIGxpbWl0ZWQgZGRyIHNwZWVkIGNvcmUgdGltbW1pbmcgcGFyYW1ldGVyLGZvciBzb21lIG9sZCBkcmFtIG1heWJlIGhhdmUgbm8gb3ZlciBzcGVlZCByZWdpc3RlcgoJLyogYWxpZ244ICovCgoJdW5zaWduZWQJY2hhcglhY190cmFjZV9kZWxheVsxMF07Cgl1bnNpZ25lZAljaGFyCWxwZGRyNF9kcmFtX3ZvdXRfdm9sdGFnZV8xXzNfMl81X3NldHRpbmc7Cgl1bnNpZ25lZAljaGFyCWxwZGRyNF94OF9tb2RlOwoJdW5zaWduZWQJY2hhcglzbHRfdGVzdF9mdW5jdGlvblsyXTsgIC8vWzBdIHNsdCB0ZXN0IGZ1bmN0aW9uIGVuYWJsZSxiaXQgMCBlbmFibGUgNCBmcmVxdWVuY3kgc2NhbixiaXQgMSBlbmFibGUgZm9yY2UgZGVsYXkgbGluZSBvZmZzZXQgLGJpdCA3IGVuYWJsZSBza2lwIHRyYWluaW5nIGZ1bmN0aW9uCgkvL1sxXSxzbHQgdGVzdCBwYXJhbWV0ZXIgLHVzZSBmb3IgZm9yY2UgZGVsYXkgbGluZSBvZmZzZXQKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJc2hvcnQJdGRxczJkcTsKCXVuc2lnbmVkCWNoYXIJZHJhbV9kYXRhX3dyX29kdF9vaG07Cgl1bnNpZ25lZAljaGFyCWJpdFRpbWVDb250cm9sXzJkOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5CgkvKiBhbGlnbjggKi8KCXVuc2lnbmVkCWNoYXIgICAgY2hhcl9yZXYxOwoJdW5zaWduZWQJY2hhciAgICBjaGFyX3JldjI7Cgl1bnNpZ25lZAlpbnQJCWRkcl9kbWNfcmVtYXBbNV07Cgl1bnNpZ25lZAlpbnQJCWRyYW1fcnR0X25vbV93cl9wYXJrWzJdOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5CgkvKiBhbGlnbjggKi8KCXVuc2lnbmVkIGNoYXIJCWRkcl9scGRkcjM0X2NhX3JlbWFwWzRdOwoJLy8vL3VzZSBmb3IgbHBkZHIzIC9scGRkcjQgY2EgdHJhaW5pbmcgZGF0YSBieXRlIGxhbmUgcmVtYXAKCXVuc2lnbmVkCWNoYXIJZGRyX2xwZGRyMzRfZHFfcmVtYXBbMzJdOwoJLy8vL3VzZSBmb3IgbHBkZHIzIC9scGRkcjQgY2EgcGlubXV4IHJlbWFwCgl1bnNpZ25lZAljaGFyCWFjX3Bpbm11eFtEV0NfQUNfUElOTVVYX1RPVEFMXTsKCS8vdXNlIGZvciBscGRkcjMgL2xwZGRyNCBjYSBwaW5tdXggcmVtYXAKCXVuc2lnbmVkCWNoYXIJZGZpX3Bpbm11eFtEV0NfREZJX1BJTk1VWF9UT1RBTF07Cgl1bnNpZ25lZAljaGFyICAgIGNoYXJfcmV2MzsKCXVuc2lnbmVkCWNoYXIgICAgY2hhcl9yZXY0OwoJZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QgY2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90OwoJdHJhaW5pbmdfZGVsYXlfc2V0X3BzX3QJY2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1syXTsKCgkvL292ZXJyaWRlIHJlYWQgYml0IGRlbGF5Cn1kZHJfc2V0X3Q7CgpkZHJfc2V0X3QgcF9kZHJfc2V0X3Q7CgojaWZuZGVmIF9TSEEyNTZfSAojZGVmaW5lIF9TSEEyNTZfSAoKI2RlZmluZSBTSEEyNTZfU1VNX0xFTgkzMgojZGVmaW5lIFNIQTI1Nl9ERVJfTEVOCTE5CgovL2V4dGVybiBjb25zdCB1aW50OF90IHNoYTI1Nl9kZXJfcHJlZml4W107Ci8qIFJlc2V0IHdhdGNoZG9nIGVhY2ggdGltZSB3ZSBwcm9jZXNzIHRoaXMgbWFueSBieXRlcyAqLwojZGVmaW5lIENIVU5LU1pfU0hBMjU2CSg2NCAqIDEwMjQpCgp0eXBlZGVmIHN0cnVjdCB7Cgl1aW50MzJfdCB0b3RhbFsyXTsKCXVpbnQzMl90IHN0YXRlWzhdOwoJdWludDhfdCBidWZmZXJbNjRdOwp9IHNoYTI1Nl9jb250ZXh0OwoKY29uc3QgdWludDhfdCBzaGEyNTZfZGVyX3ByZWZpeF9kZHJbU0hBMjU2X0RFUl9MRU5dID0gewoJMHgzMCwgMHgzMSwgMHgzMCwgMHgwZCwgMHgwNiwgMHgwOSwgMHg2MCwgMHg4NiwKCTB4NDgsIDB4MDEsIDB4NjUsIDB4MDMsIDB4MDQsIDB4MDIsIDB4MDEsIDB4MDUsCgkweDAwLCAweDA0LCAweDIwCn07CgovKgoqIDMyLWJpdCBpbnRlZ2VyIG1hbmlwdWxhdGlvbiBtYWNyb3MgKGJpZyBlbmRpYW4pCiovCiNpZm5kZWYgR0VUX1VJTlQzMl9CRQojZGVmaW5lIEdFVF9VSU5UMzJfQkUobixiLGkpIHsJCQkJXAoJKG4pID0gKCAodW5zaWduZWQgbG9uZykgKGIpWyhpKSAgICBdIDw8IDI0ICkJXAoJICAgIHwgKCAodW5zaWduZWQgbG9uZykgKGIpWyhpKSArIDFdIDw8IDE2ICkJXAoJICAgIHwgKCAodW5zaWduZWQgbG9uZykgKGIpWyhpKSArIDJdIDw8ICA4ICkJXAoJICAgIHwgKCAodW5zaWduZWQgbG9uZykgKGIpWyhpKSArIDNdICAgICAgICk7CVwKfQojZW5kaWYKI2lmbmRlZiBQVVRfVUlOVDMyX0JFCiNkZWZpbmUgUFVUX1VJTlQzMl9CRShuLGIsaSkgewkJCQlcCgkoYilbKGkpICAgIF0gPSAodW5zaWduZWQgY2hhcikgKCAobikgPj4gMjQgKTsJXAoJKGIpWyhpKSArIDFdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pID4+IDE2ICk7CVwKCShiKVsoaSkgKyAyXSA9ICh1bnNpZ25lZCBjaGFyKSAoIChuKSA+PiAgOCApOwlcCgkoYilbKGkpICsgM10gPSAodW5zaWduZWQgY2hhcikgKCAobikgICAgICAgKTsJXAp9CiNlbmRpZgoKdm9pZCBzaGEyNTZfc3RhcnRzX2ludGVybmFsKHNoYTI1Nl9jb250ZXh0ICogY3R4KQp7CgljdHgtPnRvdGFsWzBdID0gMDsKCWN0eC0+dG90YWxbMV0gPSAwOwoKCWN0eC0+c3RhdGVbMF0gPSAweDZBMDlFNjY3OwoJY3R4LT5zdGF0ZVsxXSA9IDB4QkI2N0FFODU7CgljdHgtPnN0YXRlWzJdID0gMHgzQzZFRjM3MjsKCWN0eC0+c3RhdGVbM10gPSAweEE1NEZGNTNBOwoJY3R4LT5zdGF0ZVs0XSA9IDB4NTEwRTUyN0Y7CgljdHgtPnN0YXRlWzVdID0gMHg5QjA1Njg4QzsKCWN0eC0+c3RhdGVbNl0gPSAweDFGODNEOUFCOwoJY3R4LT5zdGF0ZVs3XSA9IDB4NUJFMENEMTk7Cn0KCnN0YXRpYyB2b2lkIHNoYTI1Nl9wcm9jZXNzX2ludGVybmFsKHNoYTI1Nl9jb250ZXh0ICpjdHgsIGNvbnN0IHVpbnQ4X3QgZGF0YVs2NF0pCnsKCXVpbnQzMl90IHRlbXAxLCB0ZW1wMjsKCXVpbnQzMl90IFdbNjRdOwoJdWludDMyX3QgQSwgQiwgQywgRCwgRSwgRiwgRywgSDsKCglHRVRfVUlOVDMyX0JFKFdbMF0sIGRhdGEsIDApOwoJR0VUX1VJTlQzMl9CRShXWzFdLCBkYXRhLCA0KTsKCUdFVF9VSU5UMzJfQkUoV1syXSwgZGF0YSwgOCk7CglHRVRfVUlOVDMyX0JFKFdbM10sIGRhdGEsIDEyKTsKCUdFVF9VSU5UMzJfQkUoV1s0XSwgZGF0YSwgMTYpOwoJR0VUX1VJTlQzMl9CRShXWzVdLCBkYXRhLCAyMCk7CglHRVRfVUlOVDMyX0JFKFdbNl0sIGRhdGEsIDI0KTsKCUdFVF9VSU5UMzJfQkUoV1s3XSwgZGF0YSwgMjgpOwoJR0VUX1VJTlQzMl9CRShXWzhdLCBkYXRhLCAzMik7CglHRVRfVUlOVDMyX0JFKFdbOV0sIGRhdGEsIDM2KTsKCUdFVF9VSU5UMzJfQkUoV1sxMF0sIGRhdGEsIDQwKTsKCUdFVF9VSU5UMzJfQkUoV1sxMV0sIGRhdGEsIDQ0KTsKCUdFVF9VSU5UMzJfQkUoV1sxMl0sIGRhdGEsIDQ4KTsKCUdFVF9VSU5UMzJfQkUoV1sxM10sIGRhdGEsIDUyKTsKCUdFVF9VSU5UMzJfQkUoV1sxNF0sIGRhdGEsIDU2KTsKCUdFVF9VSU5UMzJfQkUoV1sxNV0sIGRhdGEsIDYwKTsKCiNkZWZpbmUgU0hSKHgsbikgKCh4ICYgMHhGRkZGRkZGRikgPj4gbikKI2RlZmluZSBST1RSKHgsbikgKFNIUih4LG4pIHwgKHggPDwgKDMyIC0gbikpKQoKI2RlZmluZSBTMCh4KSAoUk9UUih4LCA3KSBeIFJPVFIoeCwxOCkgXiBTSFIoeCwgMykpCiNkZWZpbmUgUzEoeCkgKFJPVFIoeCwxNykgXiBST1RSKHgsMTkpIF4gU0hSKHgsMTApKQoKI2RlZmluZSBTMih4KSAoUk9UUih4LCAyKSBeIFJPVFIoeCwxMykgXiBST1RSKHgsMjIpKQojZGVmaW5lIFMzKHgpIChST1RSKHgsIDYpIF4gUk9UUih4LDExKSBeIFJPVFIoeCwyNSkpCgojZGVmaW5lIEYwKHgseSx6KSAoKHggJiB5KSB8ICh6ICYgKHggfCB5KSkpCiNkZWZpbmUgRjEoeCx5LHopICh6IF4gKHggJiAoeSBeIHopKSkKCiNkZWZpbmUgUih0KQkJCQkJXAooCQkJCQkJXAoJV1t0XSA9IFMxKFdbdCAtIDJdKSArIFdbdCAtIDddICsJXAoJCVMwKFdbdCAtIDE1XSkgKyBXW3QgLSAxNl0JXAopCgojZGVmaW5lIFAoYSxiLGMsZCxlLGYsZyxoLHgsSykgewkJXAoJdGVtcDEgPSBoICsgUzMoZSkgKyBGMShlLGYsZykgKyBLICsgeDsJXAoJdGVtcDIgPSBTMihhKSArIEYwKGEsYixjKTsJCVwKCWQgKz0gdGVtcDE7IGggPSB0ZW1wMSArIHRlbXAyOwkJXAp9CgoJQSA9IGN0eC0+c3RhdGVbMF07CglCID0gY3R4LT5zdGF0ZVsxXTsKCUMgPSBjdHgtPnN0YXRlWzJdOwoJRCA9IGN0eC0+c3RhdGVbM107CglFID0gY3R4LT5zdGF0ZVs0XTsKCUYgPSBjdHgtPnN0YXRlWzVdOwoJRyA9IGN0eC0+c3RhdGVbNl07CglIID0gY3R4LT5zdGF0ZVs3XTsKCglQKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFdbMF0sIDB4NDI4QTJGOTgpOwoJUChILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBXWzFdLCAweDcxMzc0NDkxKTsKCVAoRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgV1syXSwgMHhCNUMwRkJDRik7CglQKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFdbM10sIDB4RTlCNURCQTUpOwoJUChFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBXWzRdLCAweDM5NTZDMjVCKTsKCVAoRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgV1s1XSwgMHg1OUYxMTFGMSk7CglQKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFdbNl0sIDB4OTIzRjgyQTQpOwoJUChCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBXWzddLCAweEFCMUM1RUQ1KTsKCVAoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgV1s4XSwgMHhEODA3QUE5OCk7CglQKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFdbOV0sIDB4MTI4MzVCMDEpOwoJUChHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBXWzEwXSwgMHgyNDMxODVCRSk7CglQKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFdbMTFdLCAweDU1MEM3REMzKTsKCVAoRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgV1sxMl0sIDB4NzJCRTVENzQpOwoJUChELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBXWzEzXSwgMHg4MERFQjFGRSk7CglQKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFdbMTRdLCAweDlCREMwNkE3KTsKCVAoQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgV1sxNV0sIDB4QzE5QkYxNzQpOwoJUChBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDE2KSwgMHhFNDlCNjlDMSk7CglQKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoMTcpLCAweEVGQkU0Nzg2KTsKCVAoRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUigxOCksIDB4MEZDMTlEQzYpOwoJUChGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDE5KSwgMHgyNDBDQTFDQyk7CglQKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoMjApLCAweDJERTkyQzZGKTsKCVAoRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUigyMSksIDB4NEE3NDg0QUEpOwoJUChDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDIyKSwgMHg1Q0IwQTlEQyk7CglQKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoMjMpLCAweDc2Rjk4OERBKTsKCVAoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUigyNCksIDB4OTgzRTUxNTIpOwoJUChILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDI1KSwgMHhBODMxQzY2RCk7CglQKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoMjYpLCAweEIwMDMyN0M4KTsKCVAoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUigyNyksIDB4QkY1OTdGQzcpOwoJUChFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDI4KSwgMHhDNkUwMEJGMyk7CglQKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoMjkpLCAweEQ1QTc5MTQ3KTsKCVAoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUigzMCksIDB4MDZDQTYzNTEpOwoJUChCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDMxKSwgMHgxNDI5Mjk2Nyk7CglQKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoMzIpLCAweDI3QjcwQTg1KTsKCVAoSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUigzMyksIDB4MkUxQjIxMzgpOwoJUChHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDM0KSwgMHg0RDJDNkRGQyk7CglQKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoMzUpLCAweDUzMzgwRDEzKTsKCVAoRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUigzNiksIDB4NjUwQTczNTQpOwoJUChELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDM3KSwgMHg3NjZBMEFCQik7CglQKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoMzgpLCAweDgxQzJDOTJFKTsKCVAoQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUigzOSksIDB4OTI3MjJDODUpOwoJUChBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDQwKSwgMHhBMkJGRThBMSk7CglQKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoNDEpLCAweEE4MUE2NjRCKTsKCVAoRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUig0MiksIDB4QzI0QjhCNzApOwoJUChGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDQzKSwgMHhDNzZDNTFBMyk7CglQKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoNDQpLCAweEQxOTJFODE5KTsKCVAoRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUig0NSksIDB4RDY5OTA2MjQpOwoJUChDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDQ2KSwgMHhGNDBFMzU4NSk7CglQKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoNDcpLCAweDEwNkFBMDcwKTsKCVAoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUig0OCksIDB4MTlBNEMxMTYpOwoJUChILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDQ5KSwgMHgxRTM3NkMwOCk7CglQKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoNTApLCAweDI3NDg3NzRDKTsKCVAoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUig1MSksIDB4MzRCMEJDQjUpOwoJUChFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDUyKSwgMHgzOTFDMENCMyk7CglQKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoNTMpLCAweDRFRDhBQTRBKTsKCVAoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUig1NCksIDB4NUI5Q0NBNEYpOwoJUChCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDU1KSwgMHg2ODJFNkZGMyk7CglQKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoNTYpLCAweDc0OEY4MkVFKTsKCVAoSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUig1NyksIDB4NzhBNTYzNkYpOwoJUChHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDU4KSwgMHg4NEM4NzgxNCk7CglQKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoNTkpLCAweDhDQzcwMjA4KTsKCVAoRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUig2MCksIDB4OTBCRUZGRkEpOwoJUChELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDYxKSwgMHhBNDUwNkNFQik7CglQKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoNjIpLCAweEJFRjlBM0Y3KTsKCVAoQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUig2MyksIDB4QzY3MTc4RjIpOwoKCWN0eC0+c3RhdGVbMF0gKz0gQTsKCWN0eC0+c3RhdGVbMV0gKz0gQjsKCWN0eC0+c3RhdGVbMl0gKz0gQzsKCWN0eC0+c3RhdGVbM10gKz0gRDsKCWN0eC0+c3RhdGVbNF0gKz0gRTsKCWN0eC0+c3RhdGVbNV0gKz0gRjsKCWN0eC0+c3RhdGVbNl0gKz0gRzsKCWN0eC0+c3RhdGVbN10gKz0gSDsKfQoKdm9pZCBzaGEyNTZfdXBkYXRlX2ludGVybmFsKHNoYTI1Nl9jb250ZXh0ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1aW50MzJfdCBsZW5ndGgpCnsKCXVpbnQzMl90IGxlZnQsIGZpbGw7CgoJaWYgKCFsZW5ndGgpCgkJcmV0dXJuOwoKCWxlZnQgPSBjdHgtPnRvdGFsWzBdICYgMHgzRjsKCWZpbGwgPSA2NCAtIGxlZnQ7CgoJY3R4LT50b3RhbFswXSArPSBsZW5ndGg7CgljdHgtPnRvdGFsWzBdICY9IDB4RkZGRkZGRkY7CgoJaWYgKGN0eC0+dG90YWxbMF0gPCBsZW5ndGgpCgkJY3R4LT50b3RhbFsxXSsrOwoKCWlmIChsZWZ0ICYmIGxlbmd0aCA+PSBmaWxsKSB7CgkJbWVtY3B5KCh2b2lkICopIChjdHgtPmJ1ZmZlciArIGxlZnQpLCAodm9pZCAqKSBpbnB1dCwgZmlsbCk7CgkJc2hhMjU2X3Byb2Nlc3NfaW50ZXJuYWwoY3R4LCBjdHgtPmJ1ZmZlcik7CgkJbGVuZ3RoIC09IGZpbGw7CgkJaW5wdXQgKz0gZmlsbDsKCQlsZWZ0ID0gMDsKCX0KCgl3aGlsZSAobGVuZ3RoID49IDY0KSB7CgkJc2hhMjU2X3Byb2Nlc3NfaW50ZXJuYWwoY3R4LCBpbnB1dCk7CgkJbGVuZ3RoIC09IDY0OwoJCWlucHV0ICs9IDY0OwoJfQoKCWlmIChsZW5ndGgpCgkJbWVtY3B5KCh2b2lkICopIChjdHgtPmJ1ZmZlciArIGxlZnQpLCAodm9pZCAqKSBpbnB1dCwgbGVuZ3RoKTsKfQoKc3RhdGljIHVpbnQ4X3Qgc2hhMjU2X3BhZGRpbmdbNjRdID0gewoJMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKCSAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCgkgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAoJICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAp9OwoKdm9pZCBzaGEyNTZfZmluaXNoX2ludGVybmFsKHNoYTI1Nl9jb250ZXh0ICogY3R4LCB1aW50OF90IGRpZ2VzdFszMl0pCnsKCXVpbnQzMl90IGxhc3QsIHBhZG47Cgl1aW50MzJfdCBoaWdoLCBsb3c7Cgl1aW50OF90IG1zZ2xlbls4XTsKCgloaWdoID0gKChjdHgtPnRvdGFsWzBdID4+IDI5KQoJCXwgKGN0eC0+dG90YWxbMV0gPDwgMykpOwoJbG93ID0gKGN0eC0+dG90YWxbMF0gPDwgMyk7CgoJUFVUX1VJTlQzMl9CRShoaWdoLCBtc2dsZW4sIDApOwoJUFVUX1VJTlQzMl9CRShsb3csIG1zZ2xlbiwgNCk7CgoJbGFzdCA9IGN0eC0+dG90YWxbMF0gJiAweDNGOwoJcGFkbiA9IChsYXN0IDwgNTYpID8gKDU2IC0gbGFzdCkgOiAoMTIwIC0gbGFzdCk7CgoJc2hhMjU2X3VwZGF0ZV9pbnRlcm5hbChjdHgsIHNoYTI1Nl9wYWRkaW5nLCBwYWRuKTsKCXNoYTI1Nl91cGRhdGVfaW50ZXJuYWwoY3R4LCBtc2dsZW4sIDgpOwoKCVBVVF9VSU5UMzJfQkUoY3R4LT5zdGF0ZVswXSwgZGlnZXN0LCAwKTsKCVBVVF9VSU5UMzJfQkUoY3R4LT5zdGF0ZVsxXSwgZGlnZXN0LCA0KTsKCVBVVF9VSU5UMzJfQkUoY3R4LT5zdGF0ZVsyXSwgZGlnZXN0LCA4KTsKCVBVVF9VSU5UMzJfQkUoY3R4LT5zdGF0ZVszXSwgZGlnZXN0LCAxMik7CglQVVRfVUlOVDMyX0JFKGN0eC0+c3RhdGVbNF0sIGRpZ2VzdCwgMTYpOwoJUFVUX1VJTlQzMl9CRShjdHgtPnN0YXRlWzVdLCBkaWdlc3QsIDIwKTsKCVBVVF9VSU5UMzJfQkUoY3R4LT5zdGF0ZVs2XSwgZGlnZXN0LCAyNCk7CglQVVRfVUlOVDMyX0JFKGN0eC0+c3RhdGVbN10sIGRpZ2VzdCwgMjgpOwp9CgovKgoqIE91dHB1dCA9IFNIQS0yNTYoIGlucHV0IGJ1ZmZlciApLiBUcmlnZ2VyIHRoZSB3YXRjaGRvZyBldmVyeSAnY2h1bmtfc3onCiogYnl0ZXMgb2YgaW5wdXQgcHJvY2Vzc2VkLgoqLwp2b2lkIHNoYTI1Nl9jc3VtX3dkX2ludGVybmFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LCB1bnNpZ25lZCBpbnQgaWxlbiwKCQl1bnNpZ25lZCBjaGFyICpvdXRwdXQsIHVuc2lnbmVkIGludCBjaHVua19zeikKewojaWYgMAoJaW50IGNvdW50PTA7Cglmb3IgKCBjb3VudD0wO2NvdW50PGlsZW47Y291bnQrKykKCXsKCQlwcmludGYoIlxuaW5wdXQgJTA4eCxwKyUwOHgsJTA4eCIsKHVuc2lnbmVkIGludCkodW5zaWduZWQgbG9uZykoaW5wdXQrY291bnQpLGNvdW50LCooaW5wdXQrY291bnQpKTsKCX0KI2VuZGlmCglzaGEyNTZfY29udGV4dCBjdHg7CglzaGEyNTZfc3RhcnRzX2ludGVybmFsKCZjdHgpOwoJc2hhMjU2X3VwZGF0ZV9pbnRlcm5hbCgmY3R4LCBpbnB1dCwgaWxlbik7CglzaGEyNTZfZmluaXNoX2ludGVybmFsKCZjdHgsIG91dHB1dCk7CiNpZiAwCglmb3IgKCBjb3VudD0wO2NvdW50PDMyO2NvdW50KyspCgl7CgkJcHJpbnRmKCJcbm91dHB1dCAlMDh4LHArJTA4eCwlMDh4IiwodW5zaWduZWQgaW50KSh1bnNpZ25lZCBsb25nKShvdXRwdXQrY291bnQpLGNvdW50LCoob3V0cHV0K2NvdW50KSk7Cgl9CiNlbmRpZgp9CgojZW5kaWYKCnR5cGVkZWYgc3RydWN0IGRkcl9zaGFfcyB7Cgl1bnNpZ25lZCBjaGFyIHNoYTJbU0hBMjU2X1NVTV9MRU5dOwoJZGRyX3NldF90IGRkcnM7Cgl1bnNpZ25lZCBjaGFyIHNoYV9jaGlwX2lkW01FU09OX0NQVV9DSElQX0lEX1NJWkVdOwp9IGRkcl9zaGFfdDsKCmRkcl9zaGFfdCBkZHJfc2hhID0ge3swfX07CmRkcl9zZXRfdCAqZGRyX3NldF90X3BfYXJyYXJ5ID0gJmRkcl9zaGEuZGRyczsKCnR5cGVkZWYgc3RydWN0IGRkcl9zaGFfc19jMiB7Cgl1bnNpZ25lZCBjaGFyIHNoYTJbU0hBMjU2X1NVTV9MRU5dOwoJZGRyX3NldF90X2MyIGRkcnM7Cgl1bnNpZ25lZCBjaGFyIHNoYV9jaGlwX2lkW01FU09OX0NQVV9DSElQX0lEX1NJWkVdOwp9IGRkcl9zaGFfdF9jMjsKCmRkcl9zaGFfdF9jMiBkZHJfc2hhX2MyID0ge3swfX07CmRkcl9zZXRfdF9jMiAqZGRyX3NldF90X3BfYXJyYXJ5X2MyID0gJmRkcl9zaGFfYzIuZGRyczsKZGRyX3NldF90X2MyICpkZHJfc2V0X3RfcD1OVUxMOwoKaW50IGNoZWNrX2Jhc2VfYWRkcmVzcyh2b2lkKQp7CglkZHJfc2V0X3RfcD0oZGRyX3NldF90X2MyICopKGRkcl9zZXRfdF9wX2FycmFyeV9jMik7Cgl1bnNpZ25lZAlpbnQgdGFibGVfbWF4PShzaXplb2YoX19kZHJfYmFzZV9hZGRyZXNzX3RhYmxlKSkvKHNpemVvZihkZHJfYmFzZV9hZGRyZXNzX3RhYmxlX3QpKTsKCXVuc2lnbmVkCWludCB0YWJsZV9pbmRleD0wOwoJY2hhciBjaGlwX2lkPTA7CgljaGlwX2lkPWRkcl9nZXRfY2hpcF9pZCgpOwoJcF9kZHJfYmFzZT0oZGRyX2Jhc2VfYWRkcmVzc190YWJsZV90ICopKCZfX2Rkcl9iYXNlX2FkZHJlc3NfdGFibGUpOwoKCXByaW50ZigiXG50YWJsZV9tYXg9JTA4eCxwX2Rkcl9iYXNlX2FkZD0lMDh4LGNoaXBfaWQ9JTA4eCIsdGFibGVfbWF4LCh1bnNpZ25lZAlpbnQpKCB1bnNpZ25lZCBsb25nIClwX2Rkcl9iYXNlLGNoaXBfaWQpOwoJaWYgKGNoaXBfaWQgPT0gMCkKCXsKCQljaGlwX2lkPUNISVBfSURfTUFTSzsKCX0KCWlmIChjaGlwX2lkKQoJewoJCWZvciAodGFibGVfaW5kZXg9MDt0YWJsZV9pbmRleDx0YWJsZV9tYXg7dGFibGVfaW5kZXgrKykKCQl7Ly9wX2Rkcl9iYXNlPShwX2Rkcl9iYXNlKzEpOwoJCQlwcmludGYoIlxudGFibGVfaW5kZXg9JTA4eCxwX2Rkcl9iYXNlX2FkZD0lMDh4LChwX2Rkcl9iYXNlLT5jaGlwX2lkPT0lMDh4IiwKCQkJdGFibGVfaW5kZXgsKHVuc2lnbmVkCWludCkoIHVuc2lnbmVkIGxvbmcgKXBfZGRyX2Jhc2UsKHBfZGRyX2Jhc2UtPmNoaXBfaWQpKTsKCQkJaWYgKChwX2Rkcl9iYXNlLT5jaGlwX2lkID09IGNoaXBfaWQpICYmIChjaGlwX2lkPENISVBfSURfTUFTSykpCgkJCXsKCQkJCXByaW50ZigiXG5maW5kIG1hdGNoIGNoaXAgaWQ9MHglMDh4ICwlcyIsY2hpcF9pZCxwX2Rkcl9iYXNlLT5zb2NfZmFtaWx5X25hbWUpOwoJCQkJYnJlYWs7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwcmludGYoIlxubm8gZmluZCBtYXRjaCBjaGlwIGlkPTB4JTA4eCwgLCVzIHdpbGwgdXNlIGRlZmF1bHQgdmFsdWUiLGNoaXBfaWQscF9kZHJfYmFzZS0+c29jX2ZhbWlseV9uYW1lKTsKCQkJfQoJCQlwX2Rkcl9iYXNlPShwX2Rkcl9iYXNlKzEpOwoJCX0KCX0KCglpbnQgY291bnQ9MDsKCWZvciAoY291bnQgPSAwOyBjb3VudCA8MTI7IGNvdW50KyspIHsKCQlkZHJfc2hhLnNoYV9jaGlwX2lkW2NvdW50XT1nbG9iYWxfY2hpcF9pZFtjb3VudF07Cgl9CgoJcmV0dXJuICh1bnNpZ25lZAlpbnQpKCB1bnNpZ25lZCBsb25nICkocF9kZHJfYmFzZSk7Cn0KCmNoYXIqIGl0b2FfZGRyX3Rlc3QoaW50IG51bSxjaGFyKnN0cixpbnQgcmFkaXgpCnsvKsv30v2x7SovCglwcmludGYoIlxuaXRvYV9kZHJfdGVzdCAxXG4iKTsKCWNoYXIgaW5kZXhbXT0iMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKCXVuc2lnbmVkIHVudW07LyrW0LzkseTBvyovCgljaGFyIHRlbXA7CglpbnQgaT0wLGosazsKCS8qyLe2qHVudW21xNa1Ki8KCWlmIChyYWRpeCA9PSAxMCAmJiBudW08MCkgLyrKrr341sa4usr9Ki8KCXsKCQl1bnVtID0gKHVuc2lnbmVkKS1udW07CgkJc3RyW2krK10gPSAnLSc7Cgl9CgllbHNlCgkJdW51bSA9ICh1bnNpZ25lZCludW07LyrG5Mv7x+m/9iovCgkvKtequ7sqLwoJcHJpbnRmKCJcbml0b2FfZGRyX3Rlc3QgMlxuIik7CglwcmludGYoIlxudW51bT0weCUwOHhcbiIsdW51bSk7CglwcmludGYoIlxudW51bTI9MHglMDh4XG4iLCh1bnVtJSh1bnNpZ25lZClyYWRpeCkpOwoJcHJpbnRmKCJcbnJhZGl4PTB4JTA4eFxuIixyYWRpeCk7CglzdHJbMF0gPSBpbmRleFswXTsKCXByaW50ZigiXG5pdG9hX2Rkcl90ZXN0IDIyXG4iKTsKCXVudW0gLz0gcmFkaXg7CglwcmludGYoIlxuaXRvYV9kZHJfdGVzdCAyM1xuIik7CglkbyB7CgkJc3RyW2krK10gPSBpbmRleFt1bnVtJSh1bnNpZ25lZClyYWRpeF07CgkJdW51bSAvPSByYWRpeDsKCX13aGlsZSh1bnVtKTsKCXByaW50ZigiXG5pdG9hX2Rkcl90ZXN0IDNcbiIpOwoJc3RyW2ldID0gJ1wwJzsKCS8qxObQ8iovCglpZiAoc3RyWzBdID09ICctJykKCQlrID0gMTsvKsquvfjWxri6yv0qLwoJZWxzZQoJCWsgPSAwOwoJcHJpbnRmKCJcbml0b2FfZGRyX3Rlc3QgNFxuIik7Cglmb3IgKGogPSBrO2ogPD0gKGktMSkvMjtqKyspCgl7CgkJdGVtcCA9IHN0cltqXTsKCQlzdHJbal0gPSBzdHJbaS0xK2stal07CgkJc3RyW2ktMStrLWpdID0gdGVtcDsKCX0KCXJldHVybiBzdHI7Cn0KLy8jZW5kaWYKCi8qCmNoYXIgKnN0cnNlcChjaGFyICoqc3RyaW5ncCwgY29uc3QgY2hhciAqZGVsaW0pCnsKY2hhciAqczsKY29uc3QgY2hhciAqc3BhbnA7CmludCBjLCBzYzsKY2hhciAqdG9rOwppZiAoKHMgPSAqc3RyaW5ncCk9PSBOVUxMKQpyZXR1cm4gKE5VTEwpOwpmb3IgKHRvayA9IHM7OykgewpjID0gKnMrKzsKc3BhbnAgPSBkZWxpbTsKZG8gewppZiAoKHNjID0qc3BhbnArKykgPT0gYykgewppZiAoYyA9PSAwKQpzID0gTlVMTDsKZWxzZQpzWy0xXSA9IDA7CipzdHJpbmdwID0gczsKcmV0dXJuICh0b2spOwp9Cn0gd2hpbGUgKHNjICE9IDApOwp9Cgp9CiovCmludCBUT0xPV0VSKGludCBjaCkKewoJaWYgKCh1bnNpZ25lZCBpbnQpKGNoIC0gJ0EnKSA8IDI2dSApCgkJY2ggKz0gJ2EnIC0gJ0EnOwoJcmV0dXJuIGNoOwp9Ly+089C019bEuNequ7vOqtCh0LTX1sS4oaMKCmludCBpc3hkaWdpdChpbnQgY2gpCnsKCXJldHVybiAodW5zaWduZWQgaW50KSggY2ggICAgICAgICAtICcwJykgPCAxMHUgIHx8CgkodW5zaWduZWQgaW50KSgoY2ggfCAweDIwKSAtICdhJykgPCAgNnU7Cn0vL8XQts/X1rf7Y8rHt/HOqsquwfm9+NbGyv3X1qGjCi8vtbFjzqpBLUYsYS1mu/IwLTnWrrzktcTKrsH5vfjWxsr919bKsaOst7W72LfHwePWtaOst/HU8re1u9jB46GjCmludCBpc2RpZ2l0KGludCBjaCkKewoJcmV0dXJuICh1bnNpZ25lZCBpbnQpKGNoIC0gJzAnKSA8IDEwdTsKfS8vxdC2z9fWt/tjyse38c6qyv3X1gp1bnNpZ25lZCBpbnQgc2ltcGxlX2d1ZXNzX2Jhc2UoY29uc3QgY2hhciAqY3ApCnsKCWlmIChjcFswXSA9PSAnMCcpIHsKCQlpZiAoVE9MT1dFUihjcFsxXSkgPT0gJ3gnICYmIGlzeGRpZ2l0KGNwWzJdKSkKCQkJcmV0dXJuIDE2OwoJCWVsc2UKCQkJLy8gcmV0dXJuIDg7CgkJCXJldHVybiAxMDsKCX0gZWxzZSB7CgkJcmV0dXJuIDEwOwoJfQp9CnVuc2lnbmVkIGludCBzaW1wbGVfc3RydG91bGxfZGRyKGNvbnN0IGNoYXIgKmNwLCBjaGFyICoqZW5kcCwgdW5zaWduZWQgaW50IGJhc2UpCnsKCXVuc2lnbmVkIGludCAgcmVzdWx0ID0gMDsKCS8vcHJpbnRmKCJ0ZXN0IHNpemVvZihzdHJfYnVmKT09JWRcbiIsMSk7CglpZiAoY3AgPT0gTlVMTCkgLy9qaWF4aW5nIGFkZCAyMDE3MDYxNgoJCXJldHVybiAwOwoJaWYgKCFiYXNlKQoJCWJhc2UgPSBzaW1wbGVfZ3Vlc3NfYmFzZShjcCk7CglpZiAoYmFzZSA9PSAxNiAmJiBjcFswXSA9PSAnMCcgJiYgVE9MT1dFUihjcFsxXSkgPT0gJ3gnKQoJCWNwICs9IDI7CglpZiAoYmFzZSA9PSAxMCkgewoJCXdoaWxlICgoKmNwKT09ICcwJykKCQkJY3ArKzsKCX0KCXdoaWxlIChpc3hkaWdpdCgqY3ApKSB7Ly+87LLptbHHsGNwyse38crHuPbKrsH5vfjWxsr91rWjrLK7ysfWsb3Tt7W72DAKCQl1bnNpZ25lZCBpbnQgdmFsdWU7CgkJdmFsdWUgPSBpc2RpZ2l0KCpjcCkgPyAqY3AgLSAnMCcgOiBUT0xPV0VSKCpjcCkgLSAnYScgKyAxMDsKCQlpZiAodmFsdWUgPj0gYmFzZSkKCQkJYnJlYWs7CgkJcmVzdWx0ID0gcmVzdWx0ICogYmFzZSArIHZhbHVlOwoJCWNwKys7Cgl9CglpZiAoZW5kcCkKCQkqZW5kcCA9IChjaGFyICopY3A7CglyZXR1cm4gcmVzdWx0Owp9CnVuc2lnbmVkIGludCBlbnZfdG9fYV9udW0oY29uc3QgY2hhciAqZW52X25hbWUpCnsKCWNoYXIgKnN0cl9idWYgPSBOVUxMOwoJY2hhciBidWZbNDhdOwoJc3RyX2J1ZiA9IChjaGFyICopKCZidWYpOwoJbWVtc2V0KHN0cl9idWYsIDAsIHNpemVvZihidWYpKTsKCXByaW50Zigic2l6ZW9mKHN0cl9idWYpPT0lZFxuIiwodW5zaWduZWQgaW50KShzaXplb2YoYnVmKSkpOwoJc3RyX2J1ZiA9IGdldGVudihlbnZfbmFtZSk7Cgl1bnNpZ25lZCBpbnQgYV9udW0gPSAwOwoJY2hhciAqZW5kcDsKCglwcmludGYoInN0cj09JXNcbiIsc3RyX2J1Zik7CgoJYV9udW09c2ltcGxlX3N0cnRvdWxsX2RkcihzdHJfYnVmLCAmZW5kcCwgMCk7CglwcmludGYoIiVzPT0weCUwOHhcbiIsc3RyX2J1ZixhX251bSk7CgoJcmV0dXJuIGFfbnVtOwp9CnVuc2lnbmVkIGludCBhX251bV90b19lbnYoY29uc3QgY2hhciAqZW52X25hbWUgLHVuc2lnbmVkIGludCAqYV9udW0pCnsKCWNoYXIgKnN0cl9idWY9TlVMTDsKCWNoYXIgYnVmWzEwMjRdOwoJLy91bnNpZ25lZCBpbnQgc3RyX3RvX251bWFycnlbNDhdOwoJLy9zdHJfYnVmID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKGNoYXIpKjEwMjQpOwoJc3RyX2J1ZiA9IChjaGFyICopKCZidWYpOwoJbWVtc2V0KHN0cl9idWYsIDAsIHNpemVvZihidWYpKTsKCXByaW50Zigic2l6ZW9mKHN0cl9idWYpPT0lZFxuIiwodW5zaWduZWQgaW50KShzaXplb2YoYnVmKSkpOwoJc3RyX2J1ZiA9IGdldGVudihlbnZfbmFtZSk7CgoJcHJpbnRmKCJzdHI9PSVzXG4iLHN0cl9idWYpOwoKCXNwcmludGYoYnVmLCAiMHglMDh4IiwgKmFfbnVtKTsKCglwcmludGYoICIlcz09MHglMDh4IiwgYnVmLCphX251bSk7CglzZXRlbnYoZW52X25hbWUsIGJ1Zik7CgoJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJcmV0dXJuIDE7Cn0KdW5zaWduZWQgaW50IGVudl90b19udW0oY29uc3QgY2hhciAqZW52X25hbWUsdW5zaWduZWQgaW50ICpudW1fYXJyeSkKewoJY2hhciAqc3RyX2J1ZiA9IE5VTEw7CgljaGFyIGJ1ZlsxMDI0XTsKCXVuc2lnbmVkIGludCBzdHJfdG9fbnVtYXJyeVs0OF07CgkvL3N0cl9idWYgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikqMTAyNCk7CglzdHJfYnVmID0gKGNoYXIgKikoJmJ1Zik7CgltZW1zZXQoc3RyX2J1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwoJcHJpbnRmKCJzaXplb2Yoc3RyX2J1Zik9PSVkXG4iLCh1bnNpZ25lZCBpbnQpKHNpemVvZihidWYpKSk7CglzdHJfYnVmID0gZ2V0ZW52KGVudl9uYW1lKTsKCgljaGFyICogc3RyWzQ4XTsKCWNoYXIgKmVuZHA7CglpbnQgaTsKCWZvciAoaSA9IDA7IGkgPCA0ODsgaSsrKQoJCXN0cl90b19udW1hcnJ5W2ldID0gMDsKCXByaW50Zigic3RyPT0lc1xuIixzdHJfYnVmKTsKCWZvciAoaSA9IDA7IGkgPCA0ODsgaSsrKSB7CgkJc3RyW2ldID0gc3Ryc2VwKCZzdHJfYnVmLCAiOyIpOwoJCS8vc3RyW2ldID0gc3Ryc2VwKCZzdHJfYnVmLCAiICIpOwoJCWlmIChzdHJbaV0gPT0gTlVMTCkKCQkJYnJlYWs7CgkJc3RyX3RvX251bWFycnlbaV0gPSBzaW1wbGVfc3RydG91bGxfZGRyKHN0cltpXSwgJmVuZHAsIDApOwoJCS8vcHJpbnRmKCJzdHJfdG9fbnVtYXJyeVslZF09PSVkXG4iLGksc3RyX3RvX251bWFycnlbaV0pOwoJCS8vbnVtX2FycnlbaV09c3RyX3RvX251bWFycnlbaV07Cgl9Cglmb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykgewoJCXByaW50Zigic3RyX3RvX251bWFycnlbJWRdPT0lZFxuIixpLHN0cl90b19udW1hcnJ5W2ldKTsKCQludW1fYXJyeVtpXSA9IHN0cl90b19udW1hcnJ5W2ldOwoJfQoJLy9udW1fYXJyeT0odW5zaWduZWQgaW50ICopKCZzdHJfdG9fbnVtYXJyeSk7CglyZXR1cm4gMTsKfQoKdW5zaWduZWQgaW50IG51bV90b19lbnYoY29uc3QgY2hhciAqZW52X25hbWUsdW5zaWduZWQgaW50ICpudW1fYXJyeSkKewoJY2hhciAqc3RyX2J1Zj1OVUxMOwoJY2hhciBidWZbMTAyNF07CglpbnQgaTsKCS8vdW5zaWduZWQgaW50IHN0cl90b19udW1hcnJ5WzQ4XTsKCS8vc3RyX2J1ZiA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSoxMDI0KTsKCXN0cl9idWYgPSAoY2hhciAqKSgmYnVmKTsKCW1lbXNldChzdHJfYnVmLCAwLCBzaXplb2YoYnVmKSk7CglwcmludGYoInNpemVvZihzdHJfYnVmKT09JWRcbiIsKHVuc2lnbmVkIGludCkoc2l6ZW9mKGJ1ZikpKTsKCXN0cl9idWYgPSBnZXRlbnYoZW52X25hbWUpOwoKCS8vY2hhciAqIHN0cls0OF07CglwcmludGYoInN0cj09JXNcbiIsc3RyX2J1Zik7CgoKCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbnVtX2FycnlbMF0pOwoJZm9yIChpID0gMTsgaSA8IDQ4OyBpKyspIHsKCQkvL251bV9hcnJ5W2ldPTA7CgkJc3ByaW50ZihidWYsICIlczsweCUwOHgiLCBidWYsbnVtX2FycnlbaV0pOwoJCXByaW50ZigiJWQgICVkXG4iLCBpLG51bV9hcnJ5W2ldKTsKCX0KCS8vc3ByaW50ZihzdHIsICIlbHgiLCB2YWx1ZSk7CglwcmludGYoICIlcyIsIGJ1Zik7CglzZXRlbnYoZW52X25hbWUsIGJ1Zik7CgoJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJLy9udW1fYXJyeT0odW5zaWduZWQgaW50ICopKCZzdHJfdG9fbnVtYXJyeSk7CglyZXR1cm4gMTsKfQoKCgoKI2RlZmluZSBUREFUQTMyRiAweGZmZmZmZmZmCiNkZWZpbmUgVERBVEEzMkEgMHhhYWFhYWFhYQojZGVmaW5lIFREQVRBMzI1IDB4NTU1NTU1NTUKLy8jZGVmaW5lICAgICBQUkVHX1NUSUNLWV9HMTJBX1JFRzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweGZmNjM0NDAwICsgKDB4MDcwIDw8IDIpKQovLyNkZWZpbmUgICAgIFBSRUdfU1RJQ0tZX0ExX1JFRzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAwYjAgIDw8IDIpICsgMHhmZTAwNTgwMCkKLy8jZGVmaW5lIFNZU0NUUkxfU1RJQ0tZX1JFRzAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDBiMCAgPDwgMikgKyAweGZlMDA1ODAwKQoKCgovLyNkZWZpbmUgKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSAgICAgKDB4ZmMwMDAwMDApCi8vI2RlZmluZSAgRERSX1RFU1RfQVVUT19URVNUX0NNRF9NQUdJQyAgIDB4MDEyMzQ1NjcKLy8jZGVmaW5lIERNQ19TVElDS1lfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDAwMCAgPDwgMikgKyAweGZmNjM5ODAwKQovLyNkZWZpbmUgRE1DX1NUSUNLWV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwMDAwICA8PCAyKSArIDB4ZmQwMjA4MDApCi8vI2RlZmluZSAocF9kZHJfYmFzZS0+ZGRyX2RtY19zdGlja3kwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChETUNfU1RJQ0tZXzApCiNkZWZpbmUgRE1DX1NUSUNLWV9NQUdJQ18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjM0NTY3OAojZGVmaW5lIERNQ19TVElDS1lfTUFHSUNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWJjZGJlYWQKI2RlZmluZSBETUNfU1RJQ0tZX1VCT09UX1dJTkRPV19NQUdJQ18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMgojZGVmaW5lIERNQ19TVElDS1lfQVVUT19URVNUX0NNRF9JTkRFWF9NQUdJQ18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMwoKCi8vI2RlZmluZSAocF9kZHJfYmFzZS0+cHJlZ19zdGlja3lfcmVnMCkgICAgICAgICAgICAgICAgICBTWVNDVFJMX1NUSUNLWV9SRUcwLy8oRE1DX1NUSUNLWV8wKQovLyNkZWZpbmUgKHBfZGRyX2Jhc2UtPnByZWdfc3RpY2t5X3JlZzArNCkgICAgICAgICAgICAgICAgICAgICAoKHBfZGRyX2Jhc2UtPnByZWdfc3RpY2t5X3JlZzApKzQpCgovLyNkZWZpbmUgKHBfZGRyX2Jhc2UtPmRkcl9kZHJfcGN0bF90aW1pbmdfZW5kX2FkZHJlc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAwMWQgIDw8IDIpICsgMHhmZjYzODQwMCkKLy8jZGVmaW5lIChwX2Rkcl9iYXNlLT5kZHJfcGN0bF90aW1pbmdfYmFzZV9hZGRyZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwMDAwICA8PCAyKSArIDB4ZmY2Mzg0MDApCi8vI2RlZmluZSAocF9kZHJfYmFzZS0+ZGRyX2Rkcl9wY3RsX3RpbWluZ19lbmRfYWRkcmVzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDAxZCAgPDwgMikgKyAweGZkMDIwNDAwKQovLyNkZWZpbmUgKHBfZGRyX2Jhc2UtPmRkcl9wY3RsX3RpbWluZ19iYXNlX2FkZHJlc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAwMDAgIDw8IDIpICsgMHhmZDAyMDQwMCkKLy8jZGVmaW5lIChwX2Rkcl9iYXNlLT5kZHJfZG1jX3N0aWNreTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChETUNfU1RJQ0tZXzApCnVuc2lnbmVkIGludCBkbWNfc3RpY2t5WzY0XTsKdW5zaWduZWQgaW50IHN0aWNreV9yZWdfYmFzZV9hZGQ9MDsKCi8vI2RlZmluZSBERFJfVEVTVF9BQ0xDRExSCnVuc2lnbmVkIGludCAgIGdsb2JhbF9ib290X3RpbWVzPSAwOwp1bnNpZ25lZCBpbnQgICB3YXRjaGRvZ190aW1lX3M9IDIwOwp1bnNpZ25lZCBpbnQgZ2xvYmFsX2Rkcl9jbGs9MTsKdW5zaWduZWQgaW50CWJkbHJfMTAwc3RlcD0wOwp1bnNpZ25lZCBpbnQgICAgICAgdWlfMV8zMl8xMDBzdGVwPTA7CnVuc2lnbmVkIGludCAgIGVycm9yX2NvdW50ID0wOwp1bnNpZ25lZCBpbnQgIGVycm9yX291dG9mX2NvdW50X2ZsYWc9MDsKdW5zaWduZWQgaW50ICBjb3B5X3Rlc3RfZmxhZyA9IDA7CnVuc2lnbmVkIGludCAgdHJhaW5pbmdfcGF0dGVybl9mbGFnID0gMDsKdW5zaWduZWQgaW50IHRlc3Rfc3RhcnRfYWRkcj0weDEwODAwMDA7Cgp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9taW5fYTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9hOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9tYXhfYTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21heF9hOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hOwoKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2I7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYjsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2I7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9taW5fYjsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2I7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYjsKCnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVs0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hWzRdOwoKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYls0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2JbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2JbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2JbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9iWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYls0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYls0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2JbNF07CnVuc2lnbmVkIGludCAgYWNiZGxyMF85X3JlZ19vcmdbMTBdOwp1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfc2V0dXBfbWF4WzQwXTsKdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX2hvbGRfbWF4WzQwXTsKdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX3NldHVwX3RpbWVbNDBdOwp1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfaG9sZF90aW1lWzQwXTsKLy91bnNpZ25lZCBpbnQgIGRhdGFfYmRscjBfNV9yZWdfb3JnWzZdOwp1bnNpZ25lZCBpbnQgIGRhdGFfYmRscjBfNV9yZWdfb3JnWzI4XTsvLzQvLzRsYW5lCnVuc2lnbmVkIGludCAgYmRscjBfOV9yZWdfc2V0dXBfbWF4WzI0KjRdOy8vNC8vNCBsYW5lIDk2IGJkbHIKdW5zaWduZWQgaW50ICBiZGxyMF85X3JlZ19ob2xkX21heFsyNCo0XTsKdW5zaWduZWQgaW50ICBiZGxyMF85X3JlZ19zZXR1cF90aW1lWzI0KjRdOwp1bnNpZ25lZCBpbnQgIGJkbHIwXzlfcmVnX2hvbGRfdGltZVsyNCo0XTsKCgp1bnNpZ25lZCBpbnQgIHByZV9mZXRjaF9lbmFibGU9MDsKCiNkZWZpbmUgcmVhZGwoYWRkcikgICAgKHVuc2lnbmVkIGludCApKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSkgIC8vcmRfcmVnKGFkZHIpCiNkZWZpbmUgd3JpdGVsKGRhdGEgLGFkZHIpICAoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKT0oZGF0YSkgIC8vd3JfcmVnKGFkZHIsIGRhdGEpCgojZGVmaW5lIHdyX3JlZyhhZGRyLCBkYXRhKQkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKT0oZGF0YSkgIC8vd3JfcmVnKGFkZHIsIGRhdGEpCiNkZWZpbmUgcmRfcmVnKGFkZHIpCQkgKHVuc2lnbmVkIGludCApKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSkgIC8vcmRfcmVnKGFkZHIpCgovLyNkZWZpbmUgQ09ORklHX0REUl9DTURfQkRMX1RVTkUKLy8jZGVmaW5lICBDT05GSUdfQ01EX0REUl9URVNUCgojaWZuZGVmIENPTkZJR19DSElQCi8vI2RlZmluZSBDT05GSUdfQ0hJUCAgICBDSElQX09MRCAvL0NISVBfT0xELy8gLy8jZGVmaW5lIENISVBfT0xEICAgICAgICAgICAwICAvLyNkZWZpbmUgQ0hJUF9UWExYICAgICAgICAgICAxCiNkZWZpbmUgQ0hJUF9PTEQgICAgICAgICAgIDAKI2RlZmluZSBDSElQX1RYTFggICAgICAgICAgIDEKI2RlZmluZSBDSElQX0ExMTMgICAgICAgICAgIDIKI2RlZmluZSBDSElQX0cxMiAgICAgICAgIDMKI2RlZmluZSBDT05GSUdfQ0hJUCAgIENISVBfRzEyLy8gQ0hJUF9PTEQvLwojZW5kaWYKCiNkZWZpbmUgUF9ERFJfUEhZX0RFRkFVTFQgICAgICAgICAgIDAKI2RlZmluZSBQX0REUl9QSFlfR1hfQkFCWSAgICAgICAgICAgICAxCiNkZWZpbmUgIFBfRERSX1BIWV9HWF9UVl9CQUJZICAgICAyCiNkZWZpbmUgIFBfRERSX1BIWV85MDVYICAgICAgICAzCgovLyNkZWZpbmUgIFBfRERSX1BIWV9PTERfVEFHICAgICAgICAgMAojZGVmaW5lICBQX0REUl9QSFlfRzEyICAgICAgICA0CiNkZWZpbmUgQ09ORklHX0REUl9QSFkgICBQX0REUl9QSFlfRzEyCgovLyNkZWZpbmUgRzEyX0FNX0REUl9QTExfQ05UTDAgICAweGZmNjM4YzAwCgovLyNpZiAoQ09ORklHX0REUl9QSFkgPiBQX0REUl9QSFlfREVGQVVMVCkKLy8jaW5jbHVkZSA8YXNtL2FyY2gvc2VjdXJlX2FwYi5oPgovLyNlbmRpZgoKI2RlZmluZSBQQVRURVJOX1VTRV9ERFJfREVTCiNkZWZpbmUgIFVTRV82NEJJVF9QT0lOVEVSCi8vI2RlZmluZSAgVVNFXzMyQklUX1BPSU5URVIKI2lmZGVmIFVTRV82NEJJVF9QT0lOVEVSCiNkZWZpbmUgcF9jb252dGVyX2ludChhKSAgKCB1bnNpZ25lZCBpbnQgKSggdW5zaWduZWQgbG9uZyApKGEpCiNkZWZpbmUgaW50X2NvbnZ0ZXJfcChhKSAgKCB1bnNpZ25lZCBsb25nICkoYSkKCiNlbHNlCiNkZWZpbmUgcF9jb252dGVyX2ludChhKSAgKCB1bnNpZ25lZCBpbnQgKShhKQojZGVmaW5lIGludF9jb252dGVyX3AoYSkgICggdW5zaWduZWQgaW50ICkoYSkKI2VuZGlmCgojaWZkZWYgUEFUVEVSTl9VU0VfRERSX0RFUwojZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICAoZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdKQojZGVmaW5lIGRlc19pbnZfcGF0dGVybihhLGIsYyxkKSAgICggZGVzW2FdXih+KHBhdHRlcm5fIyNiW2NdW2RdKSkpCiNkZWZpbmUgZGVzX3hvcl9wYXR0ZXJuKGEsYikgICAoIGFeYikKLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCiNlbHNlCiNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIChkZXNbYV0mMCkrcGF0dGVybl8jI2JbY11bZF0KI2RlZmluZSBkZXNfaW52X3BhdHRlcm4oYSxiLGMsZCkgIChkZXNbYV0mMCkrfihwYXR0ZXJuXyMjYltjXVtkXSkKI2RlZmluZSBkZXNfeG9yX3BhdHRlcm4oYSxiKSAgKGEmMCtiKQojZW5kaWYKCgojZGVmaW5lICBERFJfTENETFJfQ0tfVVNFX0ZBU1RfUEFUVEVSTgojaWYgKENPTkZJR19ERFJfUEhZID4gUF9ERFJfUEhZX0RFRkFVTFQpCgkjZGVmaW5lICBERFJfUFJFRkVUQ0hfQ0FDSEUKI2VuZGlmCiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCSNkZWZpbmUgZGRyX3BsZF9jYWNoZShQKSAgIGFzbSAoInByZm0gUExETDFLRUVQLCBbJTAsICMzNzZdIjo6InIiIChQKSkKI2Vsc2UKCSNkZWZpbmUgZGRyX3BsZF9jYWNoZShQKQojZW5kaWYKCgojZGVmaW5lIEREUl9URVNUX1NUQVJUX0FERFIgIDB4MTA4MDAwMC8vICAweDEwMDAwMDAwIC8vQ09ORklHX1NZU19NRU1URVNUX1NUQVJUCiNkZWZpbmUgRERSX1RFU1RfU0laRSAweDIwMDAwMDAKLy8jZGVmaW5lIEREUl9URVNUX1NJWkUgMHgyMDAwCgojaWYgKENPTkZJR19DSElQPj1DSElQX1RYTFgpCgovLyNkZWZpbmUgUF9FRV9USU1FUl9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSgoMHgzYzYyICA8PCAyKSArIDB4ZmZkMDAwMDApCi8vI2RlZmluZSBQX1BJTl9NVVhfUkVHMSAgICAgICAgUF9QRVJJUEhTX1BJTl9NVVhfMS8vICgoKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4ZGE4MzQ0MDAgKyAoMHgyZCA8PCAyKSkpKQovLyNkZWZpbmUgUF9QSU5fTVVYX1JFRzIgICAgICAgUF9QRVJJUEhTX1BJTl9NVVhfMi8vICAoKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGRhODM0NDAwICsgKDB4MmUgPDwgMikpKSkKLy8jZGVmaW5lIFBfUElOX01VWF9SRUczCQlQX1BFUklQSFNfUElOX01VWF8zLy8oKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGRhODM0NDAwICsgKDB4MmYgPDwgMikpKSkKLy8jZGVmaW5lIFBfUElOX01VWF9SRUc3CQlQX1BFUklQSFNfUElOX01VWF83Ly8oKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGRhODM0NDAwICsgKDB4MzMgPDwgMikpKSkKCiNlbmRpZgoKI2RlZmluZSBnZXRfdXNfdGltZSgpICAgIChyZF9yZWcocF9kZHJfYmFzZS0+ZWVfdGltZXJfYmFzZV9hZGRyZXNzKSkvLyAocmVhZGwoUF9JU0FfVElNRVJFKSkKCi8vI2RlZmluZSBERFJfUEhZX0JBU0UgICgweGZjMDAwMDAwKQoKLy8jZGVmaW5lIGR3Y19kZHJwaHlfYXBiX3dyKGFkZHIsIGRhdCkgICAqKHZvbGF0aWxlIHVpbnQxNl90ICopKGludF9jb252dGVyX3AoKChhZGRyKSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSk9KCh1aW50MTZfdClkYXQpCi8vI2RlZmluZSBkd2NfZGRycGh5X2FwYl9yZChhZGRyKSAgICoodm9sYXRpbGUgdWludDE2X3QgKikoaW50X2NvbnZ0ZXJfcCgoKGFkZHIpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKQojZGVmaW5lIEFDWF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCgovL09WRVJSSURFX09QVElPTgojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkgMQojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSAyCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZICAzCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkgIDQKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSAgNQojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWEVORExZICA2CiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFlfMiA3CiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0RGSU1STCA4CiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1ZSRUYgOQojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SRVRSQUlOSU5HIDEwCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0VYVEVSQV9DT01NT04gMTEKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfRVhURVJBX1BTIDEyCgojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWV9EQUMxICAxMgojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZX0RBQzEgIDEzCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFlfMl9EQUMxIDE0CgojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9FRV9WT0xUQUdFICAweDExCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGICAweDEyCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0RSQU1fVlJFRiAgICAweDEzCgojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9ERFIzX1dSSVRFX1ZSRUZfUkFORzAgMHgyMQojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9ERFIzX1dSSVRFX1ZSRUZfUkFORzEgMHgyMgojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9ERFIzX1JFQURfVlJFRl9SQU5HMCAweDIzCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0REUjNfUkVBRF9WUkVGX1JBTkcxIDB4MjQKCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0REUjRfV1JJVEVfVlJFRl9SQU5HMCAweDMxCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0REUjRfV1JJVEVfVlJFRl9SQU5HMSAweDMyCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0REUjRfUkVBRF9WUkVGX1JBTkcwIDB4MzMKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfRERSNF9SRUFEX1ZSRUZfUkFORzEgMHgzNAoKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfTFBERFI0X1dSSVRFX1ZSRUZfUkFORzAgMHg0MQojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9MUEREUjRfV1JJVEVfVlJFRl9SQU5HMSAweDQyCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0xQRERSNF9SRUFEX1ZSRUZfUkFORzAgMHg0MwojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9MUEREUjRfUkVBRF9WUkVGX1JBTkcxIDB4NDQKCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0xQRERSM19XUklURV9WUkVGX1JBTkcwIDB4NTEKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfTFBERFIzX1dSSVRFX1ZSRUZfUkFORzEgMHg1MgojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9MUEREUjNfUkVBRF9WUkVGX1JBTkcwIDB4NTMKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfTFBERFIzX1JFQURfVlJFRl9SQU5HMSAweDU0CnVuc2lnbmVkIGludCAgZHdjX2RkcnBoeV9hcGJfd3IodW5zaWduZWQgaW50IGFkZHIsdW5zaWduZWQgaW50IGRhdCkKewoJKih2b2xhdGlsZSB1aW50MTZfdCAqKShpbnRfY29udnRlcl9wKCgoYWRkcikgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpPSgodWludDE2X3QpZGF0KTsKCXJldHVybiAxOwp9Cgp1bnNpZ25lZCBpbnQgIGR3Y19kZHJwaHlfYXBiX3JkKHVuc2lnbmVkIGludCBhZGRyKQp7CglyZXR1cm4gKih2b2xhdGlsZSB1aW50MTZfdCAqKShpbnRfY29udnRlcl9wKCgoYWRkcikgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpOwp9Cgp2b2lkIGRkcl91ZGVsYXkodW5zaWduZWQgaW50IHVzKQp7Cgl1bnNpZ25lZCBpbnQgdDAgPSAocmRfcmVnKChwX2Rkcl9iYXNlLT5lZV90aW1lcl9iYXNlX2FkZHJlc3MpKSk7Cgl3aGlsZSAoKHJkX3JlZygoKHBfZGRyX2Jhc2UtPmVlX3RpbWVyX2Jhc2VfYWRkcmVzcykpKSkgLSB0MCA8PSB1cykJOwp9CgojZGVmaW5lIEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fRE1DX1NUSUNLWSAgMQojZGVmaW5lIEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fVUJPT1RfRU5WICAgIDIKI2RlZmluZSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX1VCT09UX0lETUUgIDMKI2RlZmluZSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1kgIDQKCiNkZWZpbmUgCUREUl9QQVJBTUVURVJfUkVBRAkJMQojZGVmaW5lIAlERFJfUEFSQU1FVEVSX1dSSVRFCQkyCiNkZWZpbmUgCUREUl9QQVJBTUVURVJfTEVGVAkJMQojZGVmaW5lIAlERFJfUEFSQU1FVEVSX1JJR0hUCQkyCgojZGVmaW5lICAgUkVHSVNURVJfUkVBRCAgICAxCiNkZWZpbmUgICBSRUdJU1RFUl9XUklURSAgMAoKdHlwZWRlZiBzdHJ1Y3QgZGRyX3Rlc3Rfc3RydWN0IHsKCXVuc2lnbmVkCWludAlkZHJfZGF0YV9zb3VyY2UJOwoJdW5zaWduZWQJaW50CWRkcl9kYXRhX3Rlc3Rfc2l6ZQk7Cgl1bnNpZ25lZAlpbnQJZGRyX2FkZHJlc3NfdGVzdF9zaXplCTsKCXVuc2lnbmVkCWludAlkZHJfdGVzdF93YXRjaGRvZ190aW1lc19zCTsKCXVuc2lnbmVkCWludAlkZHJfdGVzdF9sYW5lX2Rpc2FibGUJOwoKCXVuc2lnbmVkCWludAlkZHJfdGVzdF93aW5kb3dfZmxhZ1s4XQk7Cgl1bnNpZ25lZAlpbnQJZGRyX3Rlc3Rfd2luZG93X2RhdGFbMTAwXQk7Cn0gIGRkcl90ZXN0X3N0cnVjdF90OwpkZHJfdGVzdF9zdHJ1Y3RfdCAqZ19kZHJfdGVzdF9zdHJ1Y3Q7Cgp1bnNpZ25lZCBpbnQgIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKHVuc2lnbmVkIGludCBzb3VyY2VfaW5kZXgsIHVuc2lnbmVkIGludCBwYXJhbWV0ZXJfaW5kZXggLHVuc2lnbmVkIGludCBwYXJhbWV0ZXJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApCnsKCglpZiAoc291cmNlX2luZGV4ID09IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fRE1DX1NUSUNLWSkKCXsKCQlzdGlja3lfcmVnX2Jhc2VfYWRkID0gKCgocF9kZHJfYmFzZS0+ZGRyX2RtY19zdGlja3kwKSkmMHhmZmZmKTsKCgkJaWYgKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1dSSVRFKQoJCQl3cl9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrKHBhcmFtZXRlcl9pbmRleDw8MikpLCBwYXJhbWV0ZXJfdmFsdWUpOwoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9SRUFEKQoJCQlwYXJhbWV0ZXJfdmFsdWUgPSByZF9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrKHBhcmFtZXRlcl9pbmRleDw8MikpKTsKCX0KCglpZiAoc291cmNlX2luZGV4ID09IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fVUJPT1RfRU5WKQoJewoJCWNoYXIgKnByZV9lbnZfbmFtZSA9ICJkZHJfdGVzdF9kYXRhX251bSI7CgkJY2hhciAqZW52X25hbWUgPSAiZGRyX3Rlc3RfZGF0YV9udW1fMDAwMCI7CgkJY2hhciAqc3RyX2J1ZiA9IE5VTEw7CgkJY2hhciAqdGVtcF9zID0gTlVMTDsKCQljaGFyICplbmRwID0gTlVMTDsKCQljaGFyIGJ1ZlsxMDI0XTsKCQlzdHJfYnVmID0gKGNoYXIgKikoJmJ1Zik7CgkJbWVtc2V0KHN0cl9idWYsIDAsIHNpemVvZihidWYpKTsKCQlzcHJpbnRmKGVudl9uYW1lLCIlc18lMDRkIixwcmVfZW52X25hbWUscGFyYW1ldGVyX2luZGV4KTsKCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIHBhcmFtZXRlcl92YWx1ZSk7CgoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9XUklURSkKCQl7CgkJCXNldGVudihlbnZfbmFtZSwgYnVmKTsKCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCX0KCQlpZiAocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfUkVBRCkKCQl7CgkJCXRlbXBfcyA9IGdldGVudihlbnZfbmFtZSk7CgkJCWlmICh0ZW1wX3MpCgkJCQlwYXJhbWV0ZXJfdmFsdWUgPSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQllbHNlCgkJCQlwYXJhbWV0ZXJfdmFsdWUgPSAwOwoJCX0KCX0KCglpZiAoc291cmNlX2luZGV4ID09IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSkKCXsKCQlzdGlja3lfcmVnX2Jhc2VfYWRkPSgocF9kZHJfYmFzZS0+cHJlZ19zdGlja3lfcmVnMCkpOwoKCQlpZiAocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfV1JJVEUpCgkJCXdyX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCsocGFyYW1ldGVyX2luZGV4PDwyKSksIHBhcmFtZXRlcl92YWx1ZSk7CgkJaWYgKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1JFQUQpCgkJCXBhcmFtZXRlcl92YWx1ZT1yZF9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrKHBhcmFtZXRlcl9pbmRleDw8MikpKTsKCX0KCXJldHVybiBwYXJhbWV0ZXJfdmFsdWU7Cn0KCgp1bnNpZ25lZCBpbnQgIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyh1bnNpZ25lZCBpbnQgc291cmNlX2luZGV4LCB1bnNpZ25lZCBpbnQgcGFyYW1ldGVyX2luZGV4ICx1bnNpZ25lZCBpbnQgcGFyYW1ldGVyX3ZhbHVlLHVuc2lnbmVkIGludCByZWFkX3dyaXRlX2ZsYWcgKQp7CgoJaWYgKHNvdXJjZV9pbmRleCA9PSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1kpCgl7CgkJc3RpY2t5X3JlZ19iYXNlX2FkZCA9IHBfZGRyX2Jhc2UtPnByZWdfc3RpY2t5X3JlZzA7CgoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9XUklURSkKCQkJd3JfcmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkKyhwYXJhbWV0ZXJfaW5kZXg8PDIpKSwgcGFyYW1ldGVyX3ZhbHVlKTsKCQlpZiAocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfUkVBRCkKCQkJcGFyYW1ldGVyX3ZhbHVlID0gcmRfcmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkKyhwYXJhbWV0ZXJfaW5kZXg8PDIpKSk7Cgl9CgoJaWYgKHNvdXJjZV9pbmRleCA9PSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX0RNQ19TVElDS1kpCgl7CgkJc3RpY2t5X3JlZ19iYXNlX2FkZCA9ICgoKHBfZGRyX2Jhc2UtPmRkcl9kbWNfc3RpY2t5MCkpJjB4ZmZmZik7CgoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9XUklURSkKCQkJd3JfcmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkKyhwYXJhbWV0ZXJfaW5kZXg8PDIpKSwgcGFyYW1ldGVyX3ZhbHVlKTsKCQlpZiAocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfUkVBRCkKCQkJcGFyYW1ldGVyX3ZhbHVlID0gcmRfcmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkKyhwYXJhbWV0ZXJfaW5kZXg8PDIpKSk7Cgl9CgoJaWYgKHNvdXJjZV9pbmRleCA9PSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX1VCT09UX0VOVikKCXsKCQljaGFyICpwcmVfZW52X25hbWUgPSAiZGRyX3Rlc3RfZGF0YV9udW0iOwoJCWNoYXIgKmVudl9uYW1lID0gImRkcl90ZXN0X2RhdGFfbnVtXzAwMDAiOwoJCWNoYXIgKnN0cl9idWYgPSBOVUxMOwoJCWNoYXIgKnRlbXBfcyA9IE5VTEw7CgkJY2hhciAqZW5kcCA9IE5VTEw7CgkJY2hhciBidWZbMTAyNF07CgkJc3RyX2J1ZiA9IChjaGFyICopKCZidWYpOwoJCW1lbXNldChzdHJfYnVmLCAwLCBzaXplb2YoYnVmKSk7CgkJc3ByaW50ZihlbnZfbmFtZSwiJXNfJTA0ZCIscHJlX2Vudl9uYW1lLHBhcmFtZXRlcl9pbmRleCk7CgkJc3ByaW50ZihidWYsICIweCUwOHgiLCBwYXJhbWV0ZXJfdmFsdWUpOwoKCQlpZiAocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfV1JJVEUpCgkJewoJCQlzZXRlbnYoZW52X25hbWUsIGJ1Zik7CgkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQl9CgkJaWYgKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1JFQUQpCgkJewoJCQl0ZW1wX3MgPSBnZXRlbnYoZW52X25hbWUpOwoJCQlpZiAodGVtcF9zKQoJCQkJcGFyYW1ldGVyX3ZhbHVlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQkJZWxzZQoJCQkJcGFyYW1ldGVyX3ZhbHVlID0gMDsKCQl9Cgl9CgoJcmV0dXJuIHBhcmFtZXRlcl92YWx1ZTsKfQoKLy8jZGVmaW5lIChwX2Rkcl9iYXNlLT5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzKSAgICAgICAgICAgICAgICAgICAoKDB4MDA0MCAgPDwgMikgKyAweGZlMDAwMDAwKQovLyNkZWZpbmUgKHBfZGRyX2Jhc2UtPnN5c193YXRjaGRvZ19iYXNlX2FkZHJlc3MrNCkgICAgICAgICAgICAgICAgICAgKCgweDAwNDEgIDw8IDIpICsgMHhmZTAwMDAwMCkKLy8jZGVmaW5lIChwX2Rkcl9iYXNlLT5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzKzgpICAgICAgICAgICAgICAgICAgICAgKCgweDAwNDIgIDw8IDIpICsgMHhmZTAwMDAwMCkKLy8jZGVmaW5lIChwX2Rkcl9iYXNlLT5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzKzEyKSAgICAgICAgICAgICAgICAgICAgICgoMHgwMDQzICA8PCAyKSArIDB4ZmUwMDAwMDApCgp2b2lkIGRkcl90ZXN0X3dhdGNoZG9nX2luaXQodWludDMyX3QgbXNlYykKewoJLy8gc3JjOiAyNE1IegoJLy8gZGl2OiAyNDAwMCBmb3IgMW1zCgkvLyByZXNldCBhby0yMiBhbmQgZWUtMjEKCSoodm9sYXRpbGUgdWludDMyX3QgKikoIHVuc2lnbmVkIGxvbmcgKShwX2Rkcl9iYXNlLT5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzKSA9ICgxPDwyNCl8KDE8PDI1KXwoMTw8MjIpfCgxPDwyMSl8KDI0MDAwLTEpOwoKCS8vIHNldCB0aW1lb3V0CgkqKHZvbGF0aWxlIHVpbnQzMl90ICopKCB1bnNpZ25lZCBsb25nICkocF9kZHJfYmFzZS0+c3lzX3dhdGNoZG9nX2Jhc2VfYWRkcmVzcys4KSA9IG1zZWM7CgkqKHZvbGF0aWxlIHVpbnQzMl90ICopKCB1bnNpZ25lZCBsb25nICkocF9kZHJfYmFzZS0+c3lzX3dhdGNoZG9nX2Jhc2VfYWRkcmVzcysxMikgPSAwOwoKCS8vIGVuYWJsZQoJKih2b2xhdGlsZSB1aW50MzJfdCAqKSggdW5zaWduZWQgbG9uZyApKHBfZGRyX2Jhc2UtPnN5c193YXRjaGRvZ19iYXNlX2FkZHJlc3MpIHw9ICgxPDwxOCk7Cn0KCnZvaWQgZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIodm9pZCkKewoJKih2b2xhdGlsZSB1aW50MzJfdCAqKSggdW5zaWduZWQgbG9uZyApKHBfZGRyX2Jhc2UtPnN5c193YXRjaGRvZ19iYXNlX2FkZHJlc3MrMTIpID0gMDsKfQoKdm9pZCBkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKHZvaWQpCnsKCS8vIHR1cm4gb2ZmIGludGVybmFsIGNvdW50ZXIgYW5kIGRpc2FibGUKCSoodm9sYXRpbGUgdWludDMyX3QgKikoIHVuc2lnbmVkIGxvbmcgKShwX2Rkcl9iYXNlLT5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzKSAmPSB+KCgxPDwxOCl8KDE8PDI1KSk7Cn0Kdm9pZCBkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodWludDMyX3Qgc2VjKQp7CgoJLy8gc3JjOiAyNE1IegoJLy8gZGl2OiAyNDAwMCBmb3IgMW1zCgkvLyByZXNldCBhby0yMiBhbmQgZWUtMjEKCS8vCXdyaXRlbCggKDE8PDI0KXwoMTw8MjUpfCgxPDwyMyl8KDE8PDIxKXwoMjQwMDAtMSksKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKI2lmIChDT05GSUdfRERSX1BIWSA+IFBfRERSX1BIWV9ERUZBVUxUKQoJKih2b2xhdGlsZSB1aW50MzJfdCAqKSggdW5zaWduZWQgbG9uZyApKHBfZGRyX2Jhc2UtPnN5c193YXRjaGRvZ19iYXNlX2FkZHJlc3MpPSgxPDwyNCl8KDE8PDI1KXwoMTw8MjMpfCgxPDwyMSl8KDI0MDAwMC0xKTsgLy8xMG1zCgkvLyBzZXQgdGltZW91dAoJLy8qUF9XQVRDSERPR19UQ05UID0gbXNlYzsKCS8vCXdyaXRlbChtc2VjLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7IC8vYml0MC0xNQoJaWYgKHNlYyoxMDA+MHhmZmZmKQoJCSoodm9sYXRpbGUgdWludDMyX3QgKikoIHVuc2lnbmVkIGxvbmcgKShwX2Rkcl9iYXNlLT5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzKzgpPTB4ZmZmZjsKCWVsc2UKCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKCB1bnNpZ25lZCBsb25nICkocF9kZHJfYmFzZS0+c3lzX3dhdGNoZG9nX2Jhc2VfYWRkcmVzcys4KT1zZWMqMTAwOyAgLy9tYXggNjU1cwoJLy93cml0ZWwoMCwodW5zaWduZWQgaW50IClQX1dBVENIRE9HX1JFU0VUKTsKCSoodm9sYXRpbGUgdWludDMyX3QgKikoIHVuc2lnbmVkIGxvbmcgKShwX2Rkcl9iYXNlLT5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzKzEyKT0wOwoJLy8qUF9XQVRDSERPR19SRVNFVCA9IDA7CgoJLy8gZW5hYmxlCgkqKHZvbGF0aWxlIHVpbnQzMl90ICopKCB1bnNpZ25lZCBsb25nICkocF9kZHJfYmFzZS0+c3lzX3dhdGNoZG9nX2Jhc2VfYWRkcmVzcyk9KCoodm9sYXRpbGUgdWludDMyX3QgKikoIHVuc2lnbmVkIGxvbmcgKShwX2Rkcl9iYXNlLT5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzKSl8KDE8PDE4KTsKCS8vd3JpdGVsKChyZWFkbCgodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpKXwoMTw8MTgpLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7CgkvLypQX1dBVENIRE9HX0NOVEwgfD0gKDE8PDE4KTsKCiNlbmRpZgoJcHJpbnRmKCJcblBfV0FUQ0hET0dfRU5BQkxFXG4iKTsKfQp2b2lkIGRkcl90ZXN0X3dhdGNoZG9nX3Jlc2V0X3N5c3RlbSh2b2lkKQp7CglpbnQgaTsKCS8vX3VkZWxheSgxMDAwMCk7IC8vd2FpdCBwcmludAoJaWYgKHBfZGRyX2Jhc2UtPnN5c193YXRjaGRvZ19lbmFibGVfdmFsdWUgPT0gMCkKCQlwX2Rkcl9iYXNlLT5zeXNfd2F0Y2hkb2dfZW5hYmxlX3ZhbHVlPTB4MyB8ICgxIDw8IDIxKSAvLyBzeXMgcmVzZXQgZW4KCQkJCQl8ICgxIDw8IDIzKSAvLyBpbnRlcnJ1cHQgZW4KCQkJCQl8ICgxIDw8IDI0KSAvLyBjbGsgZW4KCQkJCQl8ICgxIDw8IDI1KSAvLyBjbGsgZGl2IGVuCgkJCQkJfCAoMSA8PCAyNikgOy8vIHN5cyByZXNldCBub3cKCXdyaXRlbCgwLCAocF9kZHJfYmFzZS0+c3lzX3dhdGNoZG9nX2Jhc2VfYWRkcmVzcysxMikpOwoJd2hpbGUgKDEpIHsKCQl3cml0ZWwocF9kZHJfYmFzZS0+c3lzX3dhdGNoZG9nX2VuYWJsZV92YWx1ZQoJCQksIChwX2Rkcl9iYXNlLT5zeXNfd2F0Y2hkb2dfYmFzZV9hZGRyZXNzKSk7CgkJLy93cml0ZWwoMCwgKHBfZGRyX2Jhc2UtPnN5c193YXRjaGRvZ19iYXNlX2FkZHJlc3MrMTIpKTsKCQl3cml0ZWwoMCwgKHBfZGRyX2Jhc2UtPnN5c193YXRjaGRvZ19iYXNlX2FkZHJlc3MrMTIpKTsKCQl3cml0ZWwoKHBfZGRyX2Jhc2UtPnN5c193YXRjaGRvZ19lbmFibGVfdmFsdWUpIHwgKDE8PDE4KSwKCQkJKHBfZGRyX2Jhc2UtPnN5c193YXRjaGRvZ19iYXNlX2FkZHJlc3MpKTsvLyB3YXRjaGRvZyBlbgoJCWZvciAoaT0wOyBpPDEwMDsgaSsrKQoJCQlyZWFkbCgocF9kZHJfYmFzZS0+c3lzX3dhdGNoZG9nX2Jhc2VfYWRkcmVzcykpOy8qRGVjZWl2ZSBnY2MgZm9yIHdhaXRpbmcgc29tZSBjeWNsZXMgKi8KCX0KfQoKCiNpZiAwCnZvaWQgZGRyX3Rlc3Rfd2F0Y2hkb2dfaW5pdCh1aW50MzJfdCBtc2VjKQp7CgoJLy8gc3JjOiAyNE1IegoJLy8gZGl2OiAyNDAwMCBmb3IgMW1zCgkvLyByZXNldCBhby0yMiBhbmQgZWUtMjEKCS8vCXdyaXRlbCggKDE8PDI0KXwoMTw8MjUpfCgxPDwyMyl8KDE8PDIxKXwoMjQwMDAtMSksKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKI2lmIChDT05GSUdfRERSX1BIWSA+IFBfRERSX1BIWV9ERUZBVUxUKQoJKlBfV0FUQ0hET0dfQ05UTCA9ICgxPDwyNCl8KDE8PDI1KXwoMTw8MjMpfCgxPDwyMSl8KDI0MDAwLTEpOwoKCS8vIHNldCB0aW1lb3V0CgkvLypQX1dBVENIRE9HX1RDTlQgPSBtc2VjOwoJLy8Jd3JpdGVsKG1zZWMsKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsgLy9iaXQwLTE1CgkqUF9XQVRDSERPR19UQ05UID0gbXNlYzsKCS8vd3JpdGVsKDAsKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19SRVNFVCk7CgkqUF9XQVRDSERPR19SRVNFVCA9IDA7CgkvLypQX1dBVENIRE9HX1JFU0VUID0gMDsKCgkvLyBlbmFibGUKCSpQX1dBVENIRE9HX0NOVEwgPSAoKlBfV0FUQ0hET0dfQ05UTCl8KDE8PDE4KTsKCS8vd3JpdGVsKChyZWFkbCgodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpKXwoMTw8MTgpLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7CgkvLypQX1dBVENIRE9HX0NOVEwgfD0gKDE8PDE4KTsKI2Vsc2UKCSpQX1dBVENIRE9HX0NOVEwgPSAoMDw8MjQpfChtc2VjKjgtMSk7CgkvLypQX1dBVENIRE9HX1RDTlQ9bXNlYzsKI2VuZGlmCn0KCnZvaWQgZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHVpbnQzMl90IHNlYykKewoKCS8vIHNyYzogMjRNSHoKCS8vIGRpdjogMjQwMDAgZm9yIDFtcwoJLy8gcmVzZXQgYW8tMjIgYW5kIGVlLTIxCgkvLwl3cml0ZWwoICgxPDwyNCl8KDE8PDI1KXwoMTw8MjMpfCgxPDwyMSl8KDI0MDAwLTEpLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7CiNpZiAoQ09ORklHX0REUl9QSFkgPiBQX0REUl9QSFlfREVGQVVMVCkKCSpQX1dBVENIRE9HX0NOVEw9KDE8PDI0KXwoMTw8MjUpfCgxPDwyMyl8KDE8PDIxKXwoMjQwMDAwLTEpOyAvLzEwbXMKCS8vIHNldCB0aW1lb3V0CgkvLypQX1dBVENIRE9HX1RDTlQgPSBtc2VjOwoJLy8Jd3JpdGVsKG1zZWMsKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsgLy9iaXQwLTE1CglpZiAoc2VjKjEwMD4weGZmZmYpCgkJKlBfV0FUQ0hET0dfVENOVD0weGZmZmY7CgllbHNlCgkJKlBfV0FUQ0hET0dfVENOVD1zZWMqMTAwOyAgLy9tYXggNjU1cwoJLy93cml0ZWwoMCwodW5zaWduZWQgaW50IClQX1dBVENIRE9HX1JFU0VUKTsKCSpQX1dBVENIRE9HX1JFU0VUPTA7CgkvLypQX1dBVENIRE9HX1JFU0VUID0gMDsKCgkvLyBlbmFibGUKCSpQX1dBVENIRE9HX0NOVEw9KCpQX1dBVENIRE9HX0NOVEwpfCgxPDwxOCk7CgkvL3dyaXRlbCgocmVhZGwoKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKSl8KDE8PDE4KSwodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOwoJLy8qUF9XQVRDSERPR19DTlRMIHw9ICgxPDwxOCk7CiNlbHNlCgkvLypQX1dBVENIRE9HX0NOVEw9KDE8PDI0KXwoMTw8MTkpfChzZWMqODAwMC0xKTsKCSpQX1dBVENIRE9HX0NOVEw9KDE8PDI0KXwoMTw8MTkpfCgweGZmZmYpOwoJcHJpbnRmKCJcbm04YmFieV93YXRjaGRvZyBtYXggb25seSA1cyxwbGVhc2UgdGFrZSBjYXJlIHRlc3Qgc2l6ZSBub3QgdG9vIGxvbmcgZm9yIG04YmFieVxuIik7CiNlbmRpZgoJcHJpbnRmKCJcblBfV0FUQ0hET0dfRU5BQkxFXG4iKTsKfQoKdm9pZCBkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKHZvaWQgKQp7CgoJLy8gc3JjOiAyNE1IegoJLy8gZGl2OiAyNDAwMCBmb3IgMW1zCgkvLyByZXNldCBhby0yMiBhbmQgZWUtMjEKCS8vCXdyaXRlbCggKDE8PDI0KXwoMTw8MjUpfCgxPDwyMyl8KDE8PDIxKXwoMjQwMDAtMSksKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKI2lmIChDT05GSUdfRERSX1BIWSA+IFBfRERSX1BIWV9ERUZBVUxUKQoJKlBfV0FUQ0hET0dfQ05UTD0oMTw8MjQpfCgxPDwyNSl8KDE8PDIzKXwoMTw8MjEpfCgyNDAwMDAtMSk7IC8vMTBtcwoJLy8gc2V0IHRpbWVvdXQKCS8vKlBfV0FUQ0hET0dfVENOVCA9IG1zZWM7CgkvLwl3cml0ZWwobXNlYywodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOyAvL2JpdDAtMTUKCS8vKlBfV0FUQ0hET0dfVENOVD1zZWMqMTAwOwoJLy93cml0ZWwoMCwodW5zaWduZWQgaW50IClQX1dBVENIRE9HX1JFU0VUKTsKCSpQX1dBVENIRE9HX1JFU0VUPTA7CgkvLypQX1dBVENIRE9HX1JFU0VUID0gMDsKCgkvLyBlbmFibGUKCSpQX1dBVENIRE9HX0NOVEw9KCpQX1dBVENIRE9HX0NOVEwpJih+KDE8PDE4KSk7CgkvL3dyaXRlbCgocmVhZGwoKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKSl8KDE8PDE4KSwodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOwoJLy8qUF9XQVRDSERPR19DTlRMIHw9ICgxPDwxOCk7CiNlbHNlCgkqUF9XQVRDSERPR19DTlRMPSgwPDwyNCl8KDA8PDE5KXwoMjQwMDAtMSk7CiNlbmRpZgoJcHJpbnRmKCJcblBfV0FUQ0hET0dfRElTQUJMRVxuIik7Cn0KCgp2b2lkIGRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKHZvaWQgKQp7CgkqUF9XQVRDSERPR19SRVNFVD0wOwp9Cgp2b2lkIGRkcl90ZXN0X3dhdGNoZG9nX3Jlc2V0X3N5c3RlbSh2b2lkKQp7CgkvLyNkZWZpbmUgUF9XQVRDSERPR19DTlRMICAgICAgICAgICAgICAweGMxMTA5OGQwCgkvLyNkZWZpbmUgUF9XQVRDSERPR19DTlRMMSAgICAgICAgICAgIDB4YzExMDk4ZDQKCS8vI2RlZmluZSBQX1dBVENIRE9HX1RDTlQgICAgICAgICAgICAgMHhjMTEwOThkOAoJLy8jZGVmaW5lIFBfV0FUQ0hET0dfUkVTRVQgICAgICAgICAgICAweGMxMTA5OGRjCiNpZiAoQ09ORklHX0REUl9QSFkgPiBQX0REUl9QSFlfREVGQVVMVCkKCWludCBpOwoKCXdoaWxlICgxKSB7CgkJLyoKCQkgICB3cml0ZWwoCTB4Mwl8ICgxIDw8IDIxKSAvLyBzeXMgcmVzZXQgZW4gIGFvIGVlIDMKCQkgICB8ICgxIDw8IDIzKSAvLyBpbnRlcnJ1cHQgZW4KCQkgICB8ICgxIDw8IDI0KSAvLyBjbGsgZW4KCQkgICB8ICgxIDw8IDI1KSAvLyBjbGsgZGl2IGVuCgkJICAgfCAoMSA8PCAyNikgLy8gc3lzIHJlc2V0IG5vdyAgYW8gZWUgMwoJCSAgICwgKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKCQkgICAqLwoJCSpQX1dBVENIRE9HX0NOVEw9CgkJCTB4Mwl8ICgxIDw8IDIxKSAvLyBzeXMgcmVzZXQgZW4gIGFvIGVlIDMKCQkJfCAoMSA8PCAyMykgLy8gaW50ZXJydXB0IGVuCgkJCXwgKDEgPDwgMjQpIC8vIGNsayBlbgoJCQl8ICgxIDw8IDI1KSAvLyBjbGsgZGl2IGVuCgkJCXwgKDEgPDwgMjYpOyAvLyBzeXMgcmVzZXQgbm93ICBhbyBlZSAzOwoJCS8vcHJpbnRmKCJcblBfV0FUQ0hET0dfQ05UTCByZWdfYWRkXyV4MDg9PSV4MDgiLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCxyZWFkbCgodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpKTsKCQkvL3ByaW50ZigiXG5QX1dBVENIRE9HX0NOVEw9PSV4MDgiLHJlYWRsKCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCkpOwoJCS8vcHJpbnRmKCJcblBfV0FUQ0hET0dfQ05UTD09JXgwOCIscmVhZGwoKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKSk7CgkJcHJpbnRmKCJcblBfV0FUQ0hET0dfQ05UTFJFR19BREQgJXgwOD09JXgwOCIsKHVuc2lnbmVkIGludCkodW5zaWduZWQgbG9uZylQX1dBVENIRE9HX0NOVEwsCgkJCQkqUF9XQVRDSERPR19DTlRMKTsKCQkvL3dyaXRlbCgwLCAodW5zaWduZWQgaW50IClQX1dBVENIRE9HX1JFU0VUKTsKCQkqUF9XQVRDSERPR19SRVNFVD0wOwoKCQkvLwl3cml0ZWwocmVhZGwoKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKSB8ICgxPDwxOCksIC8vIHdhdGNoZG9nIGVuCgkJLy8odW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOwoJCSpQX1dBVENIRE9HX0NOVEw9KCpQX1dBVENIRE9HX0NOVEwpfCgxPDwxOCk7CgkJZm9yIChpPTA7IGk8MTAwOyBpKyspCgkJCSpQX1dBVENIRE9HX0NOVEw7CgkJLy9yZWFkbCgodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOy8qRGVjZWl2ZSBnY2MgZm9yIHdhaXRpbmcgc29tZSBjeWNsZXMgKi8KCX0KCiNlbHNlCgkvL1dSSVRFX0NCVVNfUkVHKFdBVENIRE9HX1RDLCAweGYwODAwMDAgfCAyMDAwKTsKCSpQX1dBVENIRE9HX0NOVEw9KDB4ZjA4MDAwMCB8IDIwMDApOwojZW5kaWYKCXdoaWxlICgxKSA7Cn0KI2VuZGlmCnN0YXRpYyB2b2lkIGRkcl93cml0ZSh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCXVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJZm9yIChqPTA7ajwzMjtqKyspCgkJewoKCQkJaWYgKG1fbGVuID49IDEyOCkKCQkJCW4gPSAzMjsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMzA6CgkJCQkJCSoocCtpKSA9IFREQVRBMzJGOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDE6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMjI6CgkJCQkJCSoocCtpKSA9IDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSAyMzoKCQkJCQljYXNlIDMxOgoJCQkJCQkqKHAraSkgPSBUREFUQTMyQTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA3OgoJCQkJCWNhc2UgMTU6CgkJCQkJY2FzZSAyNDoKCQkJCQkJKihwK2kpID0gVERBVEEzMjU7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTk6CgkJCQkJY2FzZSAyMToKCQkJCQljYXNlIDI3OgoJCQkJCWNhc2UgMjk6CgkJCQkJCSoocCtpKSA9IDE8PGo7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMzoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSAxMToKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjg6CgkJCQkJCSoocCtpKSA9IH4oMTw8aik7CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiAxMjgpCgkJCXsKCQkJCW1fbGVuIC09IDEyODsKCQkJCXAgKz0gMzI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQgZGRyX3JlYWQodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7Cgl1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCWZvciAoaj0wO2o8MzI7aisrKQoJCXsKCgkJCWlmIChtX2xlbiA+PSAxMjgpCgkJCQluID0gMzI7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCWlmICgoZXJyb3Jfb3V0b2ZfY291bnRfZmxhZykgJiYgKGVycm9yX2NvdW50KSkKCQkJCXsKCQkJCQlwcmludGYoIkVycm9yIGRhdGEgb3V0IG9mIGNvdW50Iik7CgkJCQkJbV9sZW49MDsKCQkJCQlicmVhazsKCQkJCX0KCQkJCXN3aXRjaCAoaSkKCQkJCXsKCgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMjU6CgkJCQkJY2FzZSAzMDoKCQkJCQkJaWYgKCoocCtpKSAhPSBUREFUQTMyRikKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzJGKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIDE6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMjI6CgkJCQkJCWlmICgqKHAraSkgIT0gMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDApOwoJCQkJCQl9YnJlYWs7CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDIzOgoJCQkJCWNhc2UgMzE6CgkJCQkJCWlmICgqKHAraSkgIT0gVERBVEEzMkEpCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyQSk7CgkJCQkJCX0gYnJlYWs7CgkJCQkJY2FzZSA3OgoJCQkJCWNhc2UgMTU6CgkJCQkJY2FzZSAyNDoKCQkJCQkJaWYgKCoocCtpKSAhPSBUREFUQTMyNSkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzI1KTsKCQkJCQkJfSBicmVhazsKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDE5OgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyNzoKCQkJCQljYXNlIDI5OgoJCQkJCQlpZiAoKihwK2kpICE9IDE8PGopCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAxPDxqKTsKCQkJCQkJfSBicmVhazsKCQkJCQljYXNlIDM6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgMTE6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI4OgoJCQkJCQlpZiAoKihwK2kpICE9IH4oMTw8aikpCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+KDE8PGopKTsKCQkJCQkJfSBicmVhazsKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4gMTI4KQoJCQl7CgkJCQltX2xlbiAtPSAxMjg7CgkJCQlwICs9IDMyOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCgpzdGF0aWMgdm9pZCBkZHJfd3JpdGU0KHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQlmb3IgKGo9MDtqPDMyO2orKykKCQl7CgoJCQlpZiAobV9sZW4gPj0gMTI4KQoJCQkJbiA9IDMyOwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSAzOgoJCQkJCQkqKHAraSkgPSAweGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDc6CgkJCQkJCSoocCtpKSA9IH4weGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSA5OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMToKCQkJCQkJKihwK2kpID0gMHhhYTU1YWE1NTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCQkJKihwK2kpID0gfjB4YWE1NWFhNTU7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMTk6CgoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjc6CgkJCQkJCSoocCtpKSA9IDE8PGo7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSAyMToKCQkJCQljYXNlIDIyOgoJCQkJCWNhc2UgMjM6CgkJCQkJY2FzZSAyODoKCQkJCQljYXNlIDI5OgoJCQkJCWNhc2UgMzA6CgkJCQkJY2FzZSAzMToKCQkJCQkJKihwK2kpID0gfigxPDxqKTsKCQkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCgkJCWlmIChtX2xlbiA+IDEyOCkKCQkJewoJCQkJbV9sZW4gLT0gMTI4OwoJCQkJcCArPSAzMjsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBkZHJfcmVhZDQodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7Cgl1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCWZvciAoaj0wO2o8MzI7aisrKQoJCXsKCgkJCWlmIChtX2xlbiA+PSAxMjgpCgkJCQluID0gMzI7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCWlmICgoZXJyb3Jfb3V0b2ZfY291bnRfZmxhZykgJiYgKGVycm9yX2NvdW50KSkKCQkJCXsKCQkJCQlwcmludGYoIkVycm9yIGRhdGEgb3V0IG9mIGNvdW50Iik7CgkJCQkJbV9sZW49MDsKCQkJCQlicmVhazsKCQkJCX0KCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgkJCQkJCS8vICAgKihwK2kpID0gMHhmZjAwZmYwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGZmMDBmZjAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNzoKCQkJCQkJLy8gICAgICAqKHAraSkgPSB+MHhmZjAwZmYwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmZjAwZmYwMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzJGKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSA5OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMToKCQkJCQkJLy8gICAgKihwK2kpID0gMHhhYTU1YWE1NTsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGFhNTVhYTU1KQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMTU6CgkJCQkJCS8vICAgKihwK2kpID0gfjB4YWE1NWFhNTU7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4YWE1NWFhNTUpCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCQkJLy8gICAqKHAraSkgPSAxPDxqOwoJCQkJCQlpZiAoKihwK2kpICE9ICgxPDxqKSkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzJGKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIDIwOgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyMjoKCQkJCQljYXNlIDIzOgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCS8vICAqKHAraSkgPSB+KDE8PGopOwoJCQkJCQlpZiAoKihwK2kpICE9figgMTw8aikpCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCgkJCWlmIChtX2xlbiA+IDEyOCkKCQkJewoJCQkJbV9sZW4gLT0gMTI4OwoJCQkJcCArPSAzMjsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBkZHJfcmVhZF9mdWxsKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoLHVuc2lnbmVkIGludCAgc3RhcnRfcGF0dGVybiwKCXVuc2lnbmVkIGludCAgcGF0dGVybl9vZmZzZXQpCnsKCXVuc2lnbmVkIGludCAgKnA7Cgl1bnNpZ25lZCBpbnQgIGk9MDsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aCYweGZmZmZmZmZjOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoJLy8qKHApPXN0YXJ0X3BhdHRlcm47Cgl3aGlsZSAobV9sZW4pCgl7CgkJbV9sZW49bV9sZW4tNDsKCgkJLy8JKihwK2kpID0gKCoocCkpK3BhdHRlcm5fb2Zmc2V0OwoKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCWRkcl9wbGRfY2FjaGUocCtpKSAgOwojZW5kaWYKCQlpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJewoJCQlwcmludGYoIkVycm9yIGRhdGEgb3V0IG9mIGNvdW50Iik7CgkJCW1fbGVuPTA7CgkJCWJyZWFrOwoJCX0KCQlpZiAoKCoocCtpKSkgIT0oc3RhcnRfcGF0dGVybitwYXR0ZXJuX29mZnNldCppKSkKCQl7CgkJCWVycm9yX2NvdW50Kys7CgkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksCgkJCQkJKHN0YXJ0X3BhdHRlcm4rcGF0dGVybl9vZmZzZXQqaSkpOwoJCX0KCQkvL2JyZWFrOwoJCWkrKzsKCX0KfQoKc3RhdGljIHZvaWQgZGRyX3dyaXRlX2Z1bGwodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgsdW5zaWduZWQgaW50ICBzdGFydF9wYXR0ZXJuLAoJdW5zaWduZWQgaW50ICBwYXR0ZXJuX29mZnNldCkKewoJdW5zaWduZWQgaW50ICAqcDsKCXVuc2lnbmVkIGludCAgaT0wOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoJjB4ZmZmZmZmZmM7CgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgkvLyoocCk9c3RhcnRfcGF0dGVybjsKCXdoaWxlIChtX2xlbikKCXsKCQltX2xlbj1tX2xlbi00OwoJCSoocCtpKSA9IHN0YXJ0X3BhdHRlcm4rcGF0dGVybl9vZmZzZXQqaTsKCQlpKys7Cgl9Cn0KCi8vLyoKc3RhdGljIHZvaWQgZGRyX3Rlc3RfY29weSh2b2lkICphZGRyX2Rlc3Qsdm9pZCAqYWRkcl9zcmMsdW5zaWduZWQgaW50IG1lbWNweV9zaXplKQp7Cgl1bnNpZ25lZCBpbnQgICpwX2Rlc3Q7Cgl1bnNpZ25lZCBpbnQgICpwX3NyYzsKCgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbWVtY3B5X3NpemU7CgoJcF9kZXN0ID0gKCB1bnNpZ25lZCBpbnQgICopYWRkcl9kZXN0OwoJcF9zcmMgPSAoIHVuc2lnbmVkIGludCAgKilhZGRyX3NyYzsKCW1fbGVuID0gbV9sZW4vNDsgLy9hc3N1bWUgaXQncyBtdWx0aXBsZSBvZiA0Cgl3aGlsZSAobV9sZW4tLSkgewoJCWRkcl9wbGRfY2FjaGUocF9zcmMpICA7Ly8jZGVmaW5lIGRkcl9wbGRfY2FjaGUoUCkgICBhc20gKCJwcmZtIFBMREwxS0VFUCwgWyUwLCAjMzc2XSI6OiJyIiAoUCkpCgkJKnBfZGVzdCsrID0gKnBfc3JjKys7CgkJKnBfZGVzdCsrID0gKnBfc3JjKys7CgkJKnBfZGVzdCsrID0gKnBfc3JjKys7CgkJKnBfZGVzdCsrID0gKnBfc3JjKys7Cgl9Cn0KLy8qLwppbnQgZG9fZGRyX3Rlc3RfY29weShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCWNoZWNrX2Jhc2VfYWRkcmVzcygpOwoJY2hhciAqZW5kcCA9IE5VTEw7Cgl1bnNpZ25lZCBsb25nICAgbG9vcCA9IDE7Cgl1bnNpZ25lZCBpbnQgICBwcmludF9mbGFnID0xOwoJLy8gdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCXVuc2lnbmVkIGludCAgc3JjX2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJdW5zaWduZWQgaW50ICBkZWNfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFIrMHg4MDAwMDAwOwoJdW5zaWduZWQgaW50ICB0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoKCglwcmludF9mbGFnPTE7CgoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoKCS8vICAgIHByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CglpZiAoYXJnYyA9PTEpIHsKCQkvLyAgICBzdGFydF9hZGRyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCS8vICAgIGlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJc3JjX2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJCWxvb3AgPSAxOwoJfQoJaWYgKGFyZ2MgPiAyKSB7CgkJLy8gICAgc3RhcnRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlzcmNfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7Cgl9CglpZiAoYXJnYyA+IDMpIHsKCQlzcmNfYWRkciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDE2KTsKCQlkZWNfYWRkciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQl0ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJbG9vcCA9IDE7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCgl9CglpZiAodGVzdF9zaXplPDB4MTAwMCkKCQl0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoJaWYgKGFyZ2MgPiA0KSB7CgkJbG9vcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlsb29wID0gMTsKCX0KCWlmIChhcmdjID4gNSkgewoJCXByaW50X2ZsYWcgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJcHJpbnRfZmxhZyA9IDE7Cgl9CgkvL0NPUFlfVEVTVF9TVEFSVDoKCgkvLy8qCgl1bnNpZ25lZCBsb25nIHRpbWVfc3RhcnQsIHRpbWVfZW5kLHRlc3RfbG9vcHM7Cgl0ZXN0X2xvb3BzPWxvb3A7Cgl1bnNpZ25lZCBsb25nIHNpemVfY291bnQ9MDsKCXNpemVfY291bnQ9bG9vcCp0ZXN0X3NpemU7Cgl0aW1lX3N0YXJ0ID0gZ2V0X3VzX3RpbWUoKTsvL3VzCgoJZG8gewoJCS8vICAgICBsb29wID0gMTsKCQlkZHJfdGVzdF9jb3B5KCh2b2lkICopKGludF9jb252dGVyX3AoZGVjX2FkZHIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKHNyY19hZGRyKSksdGVzdF9zaXplKTsKCQkvL2Jjb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3JjX2FkZHIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKGRlY19hZGRyKSksdGVzdF9zaXplKTsKCQkvL21jb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3JjX2FkZHIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKGRlY19hZGRyKSksdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykKCQl7CgkJCXByaW50ZigiXG5sb29wPT0weCUwOHgiLCAoIHVuc2lnbmVkIGludCApbG9vcCk7CgkJCXByaW50ZigiXG4gICAgICBcbiIpOwoJCX0KCX13aGlsZSgtLWxvb3ApOwoJLy8qLwoJdGltZV9lbmQgPSBnZXRfdXNfdGltZSgpOy8vdXMKCXByaW50ZigiXG5jb3B5ICVkIHRpbWVzIHVzZSAlZHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiwoIHVuc2lnbmVkIGludCApdGVzdF9sb29wcywoIHVuc2lnbmVkIGludCApKHRpbWVfZW5kLXRpbWVfc3RhcnQpKTsKCglwcmludGYoIlxuZGRyIGNvcHkgYmFuZHdpZHRoPT0lZCBNQllURS9TIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIsKHVuc2lnbmVkIGludCkoc2l6ZV9jb3VudC8odGltZV9lbmQtdGltZV9zdGFydCkpKTsKCXByaW50ZigiXHJFbmQgZGRyIHRlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgl1bnNpZ25lZCBpbnQgbV9sZW49MCxjb3VudGVyPTA7Cgl1bnNpZ25lZCBpbnQgICpwX2Rlc3Q7CglwX2Rlc3Q9ICAodm9pZCAqKShpbnRfY29udnRlcl9wKGRlY19hZGRyKSk7CgltX2xlbiA9IHRlc3Rfc2l6ZS80OyAvL2Fzc3VtZSBpdCdzIG11bHRpcGxlIG9mIDQKCWNvdW50ZXI9KHVuc2lnbmVkIGludCl0ZXN0X2xvb3BzOwoJc2l6ZV9jb3VudD1jb3VudGVyKnRlc3Rfc2l6ZTsKCXRpbWVfc3RhcnQgPSBnZXRfdXNfdGltZSgpOy8vdXMKCWRvIHsKCQlsb29wID0gMTsKCQltX2xlbiA9IHRlc3Rfc2l6ZS80OwoJCXdoaWxlIChtX2xlbi0tKSB7CgkJCWRkcl9wbGRfY2FjaGUocF9kZXN0KSAgOwoJCQkqcF9kZXN0KysgPSAweDEyMzQ1Njc4OwoJCQkqcF9kZXN0KysgPSAweDEyMzQ1Njc4OwoJCQkqcF9kZXN0KysgPSAweDEyMzQ1Njc4OwoJCQkqcF9kZXN0KysgPSAweDEyMzQ1Njc4OwoJCX0KCX13aGlsZSgtLWNvdW50ZXIpOwoJdGltZV9lbmQgPSBnZXRfdXNfdGltZSgpOy8vdXMKCXByaW50ZigiXG53cml0ZSAlZCBieXRlcyB1c2UgJWR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIsKCB1bnNpZ25lZCBpbnQgKXRlc3Rfc2l6ZSwoIHVuc2lnbmVkIGludCApKHRpbWVfZW5kLXRpbWVfc3RhcnQpKTsKCglwcmludGYoIlxuZGRyIHdyaXRlIGJhbmR3aWR0aD09JWQgTUJZVEUvUyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLCh1bnNpZ25lZCBpbnQpKHNpemVfY291bnQvKHRpbWVfZW5kLXRpbWVfc3RhcnQpKSk7CgoJdW5zaWduZWQgaW50ICAqcF9zcmM7CglwX3NyYz0gICh2b2lkICopKGludF9jb252dGVyX3Aoc3JjX2FkZHIpKTsKCW1fbGVuID0gdGVzdF9zaXplLzQ7IC8vYXNzdW1lIGl0J3MgbXVsdGlwbGUgb2YgNAoJdW5zaWduZWQgaW50IHRlbXAwPTA7CgkvL3Vuc2lnbmVkIGludCB0ZW1wMT0wOwoJLy91bnNpZ25lZCBpbnQgdGVtcDI9MDsKCS8vdW5zaWduZWQgaW50IHRlbXAzPTA7Cgljb3VudGVyPSh1bnNpZ25lZCBpbnQpdGVzdF9sb29wczsKCXNpemVfY291bnQ9Y291bnRlcip0ZXN0X3NpemU7CgoJLy8gICNkZWZpbmUgT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpICAgICAgKHdyaXRlbCgoMCksIDB4Yzg4MzZjMDApKQoJLy93cml0ZWwoKDEwMDAwMDA8PDApLCBETUNfTU9OX0NUUkwxKTsKCS8vd3JpdGVsKCgwPDwzMSl8KDE8PDMwKXwoMDw8MjApfCgxPDwxNil8KDE8PDApLCBETUNfTU9OX0NUUkwyKTsKCS8vd3JpdGVsKCgxPDwzMSl8KDA8PDMwKXwoMDw8MjApfCgxPDwxNil8KDE8PDApLCBETUNfTU9OX0NUUkwyKTsKCXRpbWVfc3RhcnQgPSBnZXRfdXNfdGltZSgpOy8vdXMKCWRvIHsKCQlsb29wID0gMTsKCQltX2xlbiA9IHRlc3Rfc2l6ZS80OwoJCXdoaWxlIChtX2xlbi0tKSB7CgkJCS8vICBkZHJfcGxkX2NhY2hlKHBfc3JjKyspICA7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJwcmZtIFBMREwxS0VFUCwgWyUwLCAjMzc2XSI6OiJyIiAocF9zcmMpKTsKI2VuZGlmCgkJCXBfc3JjKys7CgkJCXRlbXAwID0oICpwX3NyYyk7CgkJCW1fbGVuLS07CgkJCW1fbGVuLS07CgkJCW1fbGVuLS07CgkJCW1fbGVuLS07CgkJCW1fbGVuLS07CgkJCW1fbGVuLS07CgkJCW1fbGVuLS07CgkJfQoJfXdoaWxlKC0tY291bnRlcik7CgkqcF9kZXN0KysgPSB0ZW1wMDsKCSpwX2Rlc3QrKyA9ICpwX3NyYzsKCSpwX2Rlc3QrKyA9ICpwX3NyYzsKCSpwX2Rlc3QrKyA9ICpwX3NyYzsKCXRpbWVfZW5kID0gZ2V0X3VzX3RpbWUoKTsvL3VzCgoJcHJpbnRmKCJcbnJlYWQgJWQgS2J5dGVzIHVzZSAlZHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiwodW5zaWduZWQgaW50KShzaXplX2NvdW50LzEwMDApLCggdW5zaWduZWQgaW50ICkodGltZV9lbmQtdGltZV9zdGFydCkpOwoJcHJpbnRmKCJcbmRkciByZWFkIGJhbmR3aWR0aD09JWQgTUJZVEUvUyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLCh1bnNpZ25lZCBpbnQpKHNpemVfY291bnQvKHRpbWVfZW5kLXRpbWVfc3RhcnQpKSk7CgoJcmV0dXJuIDA7Cn0KClVfQk9PVF9DTUQoCglkZHJfdGVzdF9jb3B5LAk3LAkxLAlkb19kZHJfdGVzdF9jb3B5LAoJImRkcl90ZXN0X2NvcHkgZnVuY3Rpb24iLAoJImRkcl90ZXN0X2NvcHkgIDB4MDgwMDAwMDAgMHgxMDAwMDAwMCAweDAyMDAwMDAwIDEgMCA/IFxuIgopOwoKCiNkZWZpbmUgRERSX1BBVFRFUk5fTE9PUF8xIDMyCiNkZWZpbmUgRERSX1BBVFRFUk5fTE9PUF8yIDY0CiNkZWZpbmUgRERSX1BBVFRFUk5fTE9PUF8zIDk2CgoKCgpzdGF0aWMgdm9pZCBkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJLy8gICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoJLy8jZGVmaW5lIGRkcl9wYXR0ZXJuX2xvb3AgMzIKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSAzOgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDExOgoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMTk6CgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCQkJLy8gICBjYXNlIDMwOgoJCQkJCQkqKHAraSkgPSBUREFUQTMyRjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgNToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA3OgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMTU6CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJCQkvLyAgIGNhc2UgMjI6CgkJCQkJCSoocCtpKSA9IDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzExOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI3OgoJCQkJCQkvLyAgIGNhc2UgMzA6CgkJCQkJCSoocCtpKSA9IFREQVRBMzJBOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMxOgoJCQkJCQkqKHAraSkgPSBUREFUQTMyNTsKCgoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszOgoJCQkJCQkqKHAraSkgPTB4ZmUwMWZlMDE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzc6CgkJCQkJCSoocCtpKSA9MHhmZDAyZmQwMjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzExOgoJCQkJCQkqKHAraSkgPTB4ZmIwNGZiMDQ7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE1OgoJCQkJCQkqKHAraSkgPTB4ZjcwOGY3MDg7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE5OgoJCQkJCQkqKHAraSkgPTB4ZWYxMGVmMTA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIzOgoJCQkJCQkqKHAraSkgPTB4ZGYyMGRmMjA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI3OgoJCQkJCQkqKHAraSkgPTB4YmY0MGJmNDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMxOgoJCQkJCQkqKHAraSkgPTB4N2Y4MDdmODA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCQkJCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNzoKCQkJCQkJKihwK2kpID0weDAwMDAwMjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCSoocCtpKSA9MHgwMDAwMDQwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTU6CgkJCQkJCSoocCtpKSA9MHgwMDAwMDgwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTk6CgkJCQkJCSoocCtpKSA9MHgwMDAwMTAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCSoocCtpKSA9MHgwMDAwMjAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjc6CgkJCQkJCSoocCtpKSA9MHgwMDAwNDAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzE6CgkJCQkJCSoocCtpKSA9MHgwMDAwODAwMDsKCQkJCQkJYnJlYWs7CgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4oIDEyOCo0KSkKCQkJewoJCQkJbV9sZW4gLT0oIDEyOCo0KTsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wMih2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCS8vICAgIHVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgaSwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCS8vI2RlZmluZSBkZHJfcGF0dGVybl9sb29wIDMyCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJLy8gIGZvcihqPTA7ajwzMjtqKyspCgkJewoJCQlpZiAobV9sZW4gPj0gMTI4KjQpCgkJCQluID0gMzIqNDsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszOgoJCQkJCQkqKHAraSkgPSAweGZlMDFmZTAxOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzc6CgkJCQkJCSoocCtpKSA9IDB4ZmQwMmZkMDI7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMToKCQkJCQkJKihwK2kpID0gMHhmYjA0ZmIwNDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTU6CgkJCQkJCSoocCtpKSA9IDB4ZjcwOGY3MDg7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkJCQkqKHAraSkgPSAweGVmMTBlZjEwOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJKihwK2kpID0gMHhkZjIwZGYyMDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjc6CgkJCQkJCSoocCtpKSA9IDB4YmY0MGJmNDA7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMxOgoJCQkJCQkqKHAraSkgPSAweDdmODA3ZjgwOwoJCQkJCQlicmVhazsKCgoJCQkJCWRlZmF1bHQ6CgoJCQkJCQkqKHAraSkgPSAweGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCgkJCQkJCWJyZWFrOwoKCgkJCQl9CgkJCX0KCgkJCWlmIChtX2xlbiA+KCAxMjgqNCkpCgkJCXsKCQkJCW1fbGVuIC09KCAxMjgqNCk7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQpzdGF0aWMgdm9pZCBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3Aodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgIHVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgaSwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJLy8gIGZvcihqPTA7ajwzMjtqKyspCgkJewoJCQlpZiAobV9sZW4gPj0gMTI4KjQpCgkJCQluID0gMzIqNDsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJaWYgKChlcnJvcl9vdXRvZl9jb3VudF9mbGFnKSAmJiAoZXJyb3JfY291bnQpKQoJCQkJewoJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBvdXQgb2YgY291bnQiKTsKCQkJCQltX2xlbj0wOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSAzOgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDExOgoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMTk6CgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCQkJLy8gICBjYXNlIDMwOgoJCQkJCQkvLyAgICAgICoocCtpKSA9IFREQVRBMzJGOwoJCQkJCQlpZiAoKihwK2kpICE9IFREQVRBMzJGKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkYpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgNToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA3OgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMTU6CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJCQkvLyAgIGNhc2UgMjI6CgkJCQkJCS8vICAgKihwK2kpID0gMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMCk7CgkJCQkJCQlicmVhazt9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzExOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI3OgoJCQkJCQkvLyAgIGNhc2UgMzA6CgkJCQkJCS8vICAgICAgICAqKHAraSkgPSBUREFUQTMyQTsKCQkJCQkJaWYgKCoocCtpKSAhPSBUREFUQTMyQSkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzJBKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzE6CgkJCQkJCS8vCSoocCtpKSA9IFREQVRBMzI1OwoJCQkJCQlpZiAoKihwK2kpICE9IFREQVRBMzI1KQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMjUpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzoKCQkJCQkJLy8gICAJKihwK2kpID0weGZlMDFmZTAxOwoJCQkJCQlpZiAoKihwK2kpICE9MHhmZTAxZmUwMSkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmUwMWZlMDEpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNzoKCQkJCQkJLy8gCSoocCtpKSA9MHhmZDAyZmQwMjsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGZkMDJmZDAyKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZDAyZmQwMik7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTE6CgkJCQkJCS8vCSoocCtpKSA9MHhmYjA0ZmIwNDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGZiMDRmYjA0KQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmYjA0ZmIwNCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNToKCQkJCQkJLy8JKihwK2kpID0weGY3YjA4ZjcwODsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGY3MDhmNzA4KQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmNzA4ZjcwOCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOToKCQkJCQkJLy8JKihwK2kpID0weGVmMTBlZjEwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4ZWYxMGVmMTApCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGVmMTBlZjEwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIzOgoJCQkJCQkvLwkqKHAraSkgPTB4ZGYyMGRmMjA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhkZjIwZGYyMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZGYyMGRmMjApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjc6CgkJCQkJCS8vICAJKihwK2kpID0weGJmNDBiZjQwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4YmY0MGJmNDApCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGJmNDBiZjQwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMxOgoJCQkJCQkvLyAgIAkqKHAraSkgPTB4N2Y4MDdmODA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHg3ZjgwN2Y4MCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4N2Y4MDdmODApOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCQkJCS8vCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweDAwMDAwMTAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMDEwMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkvLyAgCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweDAwMDAwMjAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMDIwMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCS8vCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweDAwMDAwNDAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMDQwMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJLy8JKihwK2kpID0weDAwMDAwMTAwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4MDAwMDA4MDApCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDAwODAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkJCQkvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gMHgwMDAwMTAwMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDAwMDEwMDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCS8vIAkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gMHgwMDAwMjAwMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDAwMDIwMDApOwoKCQkJCQkJfSBicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkJLy8JKihwK2kpID0weGZmZmZmZWZmOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4MDAwMDQwMDApCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDA0MDAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMxOgoJCQkJCQkvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gMHgwMDAwODAwMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDAwMDgwMDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoKCgkJCQl9CgkJCX0KCgkJCWlmIChtX2xlbiA+IDEyOCo0KQoJCQl7CgkJCQltX2xlbiAtPSAxMjgqNDsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9Ci8vKi8Kc3RhdGljIHZvaWQgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wMih2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCS8vICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJCQl7CgkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIG91dCBvZiBjb3VudCIpOwoJCQkJCW1fbGVuPTA7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJLy8gICAqKHAraSkgPSAweGZlMDFmZTAxOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4ZmUwMWZlMDEpCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZlMDFmZTAxKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNzoKCQkJCQkJLy8JICAgKihwK2kpID0gMHhmZDAyZmQwMjsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGZkMDJmZDAyKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZDAyZmQwMik7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCS8vICAgKihwK2kpID0gMHhmYjA0ZmIwNDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGZiMDRmYjA0KQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmYjA0ZmIwNCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJLy8JICAgKihwK2kpID0gMHhmNzA4ZjcwODsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGY3MDhmNzA4KQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmNzA4ZjcwOCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJLy8JICAgKihwK2kpID0gMHhlZjEwZWYxMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGVmMTBlZjEwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhlZjEwZWYxMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJLy8gICAqKHAraSkgPSAweGRmMjBkZjIwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4ZGYyMGRmMjApCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGRmMjBkZjIwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkvLwkgICAqKHAraSkgPSAweGJmNDBiZjQwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4YmY0MGJmNDApCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGJmNDBiZjQwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzE6CgkJCQkJCS8vCSAgICoocCtpKSA9IDB4N2Y4MDdmODA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHg3ZjgwN2Y4MCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4N2Y4MDdmODApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoKCQkJCQlkZWZhdWx0OgoKCQkJCQkJLy8gICoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhmZjAwZmYwMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMGZmMDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCQlicmVhazsKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiAxMjgqNCkKCQkJewoJCQkJbV9sZW4gLT0gMTI4KjQ7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQgZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbih2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCS8vICAgIHVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgaSwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCS8vI2RlZmluZSBkZHJfcGF0dGVybl9sb29wIDMyCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJLy8gIGZvcihqPTA7ajwzMjtqKyspCgkJewoJCQlpZiAobV9sZW4gPj0gMTI4KjQpCgkJCQluID0gMzIqNDsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDE6CgkJCQkJY2FzZSAyOgoJCQkJCWNhc2UgMzoKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSA5OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMToKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgMTc6CgkJCQkJY2FzZSAxODoKCQkJCQljYXNlIDE5OgoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjc6CgkJCQkJCS8vICAgY2FzZSAzMDoKCQkJCQkJKihwK2kpID0gflREQVRBMzJGOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDc6CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCQljYXNlIDIwOgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyMjoKCQkJCQljYXNlIDIzOgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCS8vICAgY2FzZSAyMjoKCQkJCQkJKihwK2kpID0gfjA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzExOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI3OgoJCQkJCQkvLyAgIGNhc2UgMzA6CgkJCQkJCSoocCtpKSA9IH5UREFUQTMyQTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszMToKCQkJCQkJKihwK2kpID1+VERBVEEzMjU7CgoKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzoKCQkJCQkJKihwK2kpID1+MHhmZTAxZmUwMTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNzoKCQkJCQkJKihwK2kpID1+MHhmZDAyZmQwMjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzExOgoJCQkJCQkqKHAraSkgPX4weGZiMDRmYjA0OwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNToKCQkJCQkJKihwK2kpID1+MHhmNzA4ZjcwODsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTk6CgkJCQkJCSoocCtpKSA9fjB4ZWYxMGVmMTA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIzOgoJCQkJCQkqKHAraSkgPX4weGRmMjBkZjIwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNzoKCQkJCQkJKihwK2kpID1+MHhiZjQwYmY0MDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzE6CgkJCQkJCSoocCtpKSA9fjB4N2Y4MDdmODA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCQkJCSoocCtpKSA9fjB4MDAwMDAxMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzc6CgkJCQkJCSoocCtpKSA9fjB4MDAwMDAyMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMToKCQkJCQkJKihwK2kpID1+MHgwMDAwMDQwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTU6CgkJCQkJCSoocCtpKSA9fjB4MDAwMDA4MDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkJCQkqKHAraSkgPX4weDAwMDAxMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJKihwK2kpID1+MHgwMDAwMjAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjc6CgkJCQkJCSoocCtpKSA9fjB4MDAwMDQwMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMxOgoJCQkJCQkqKHAraSkgPX4weDAwMDA4MDAwOwoJCQkJCQlicmVhazsKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiggMTI4KjQpKQoJCQl7CgkJCQltX2xlbiAtPSggMTI4KjQpOwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCgpzdGF0aWMgdm9pZCBkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uMih2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCS8vICAgIHVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgaSwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCS8vI2RlZmluZSBkZHJfcGF0dGVybl9sb29wIDMyCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJLy8gIGZvcihqPTA7ajwzMjtqKyspCgkJewoJCQlpZiAobV9sZW4gPj0gMTI4KjQpCgkJCQluID0gMzIqNDsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCQkJCSoocCtpKSA9IH4weGZlMDFmZTAxOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzc6CgkJCQkJCSoocCtpKSA9IH4weGZkMDJmZDAyOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCSoocCtpKSA9IH4weGZiMDRmYjA0OwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJKihwK2kpID0gfjB4ZjcwOGY3MDg7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkJCQkqKHAraSkgPSB+MHhlZjEwZWYxMDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCSoocCtpKSA9IH4weGRmMjBkZjIwOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkJKihwK2kpID1+MHhiZjQwYmY0MDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJKihwK2kpID0gfjB4N2Y4MDdmODA7CgkJCQkJCWJyZWFrOwoKCgkJCQkJZGVmYXVsdDoKCgkJCQkJCSoocCtpKSA9IH4weGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCgkJCQkJCWJyZWFrOwoKCgkJCQl9CgkJCX0KCgkJCWlmIChtX2xlbiA+KCAxMjgqNCkpCgkJCXsKCQkJCW1fbGVuIC09KCAxMjgqNCk7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJLy8gICB1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIGksIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCS8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKCQkJaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCWlmICgoZXJyb3Jfb3V0b2ZfY291bnRfZmxhZykgJiYgKGVycm9yX2NvdW50KSkKCQkJCXsKCQkJCQlwcmludGYoIkVycm9yIGRhdGEgb3V0IG9mIGNvdW50Iik7CgkJCQkJbV9sZW49MDsKCQkJCQlicmVhazsKCQkJCX0KCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCQkJCWNhc2UgMTE6CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgMjU6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI3OgoJCQkJCQkvLyAgIGNhc2UgMzA6CgkJCQkJCS8vICAgICAgKihwK2kpID0gVERBVEEzMkY7CgkJCQkJCWlmICgqKHAraSkgIT1+VERBVEEzMkYpCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+VERBVEEzMkYpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgNToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA3OgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMTU6CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJCQkvLyAgIGNhc2UgMjI6CgkJCQkJCS8vICAgKihwK2kpID0gMDsKCQkJCQkJaWYgKCoocCtpKSAhPX4wKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzExOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI3OgoJCQkJCQkvLyAgIGNhc2UgMzA6CgkJCQkJCS8vICAgICAgICAqKHAraSkgPSBUREFUQTMyQTsKCQkJCQkJaWYgKCoocCtpKSAhPSB+VERBVEEzMkEpCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLH5UREFUQTMyQSk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszMToKCQkJCQkJLy8JKihwK2kpID0gVERBVEEzMjU7CgkJCQkJCWlmICgqKHAraSkgIT0gflREQVRBMzI1KQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgflREQVRBMzI1KTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszOgoJCQkJCQkvLyAgIAkqKHAraSkgPTB4ZmUwMWZlMDE7CgkJCQkJCWlmICgqKHAraSkgIT1+MHhmZTAxZmUwMSkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZlMDFmZTAxKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis3OgoJCQkJCQkvLyAJKihwK2kpID0weGZkMDJmZDAyOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGZkMDJmZDAyKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmQwMmZkMDIpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTE6CgkJCQkJCS8vCSoocCtpKSA9MHhmYjA0ZmIwNDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmYjA0ZmIwNCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZiMDRmYjA0KTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNToKCQkJCQkJLy8JKihwK2kpID0weGY3YjA4ZjcwODsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmNzA4ZjcwOCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGY3MDhmNzA4KTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOToKCQkJCQkJLy8JKihwK2kpID0weGVmMTBlZjEwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGVmMTBlZjEwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZWYxMGVmMTApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIzOgoJCQkJCQkvLwkqKHAraSkgPTB4ZGYyMGRmMjA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4ZGYyMGRmMjApCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhkZjIwZGYyMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjc6CgkJCQkJCS8vICAJKihwK2kpID0weGJmNDBiZjQwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGJmNDBiZjQwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4YmY0MGJmNDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMxOgoJCQkJCQkvLyAgIAkqKHAraSkgPTB4N2Y4MDdmODA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4N2Y4MDdmODApCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHg3ZjgwN2Y4MCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCQkJCS8vCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHgwMDAwMDEwMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDAwMTAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkvLyAgCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHgwMDAwMDIwMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDAwMjAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCS8vCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHgwMDAwMDQwMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDAwNDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJLy8JKihwK2kpID0weDAwMDAwMTAwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weDAwMDAwODAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDA4MDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkJCQkvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4MDAwMDEwMDApCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMDAwMTAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCS8vIAkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4MDAwMDIwMDApCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMDAwMjAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjc6CgkJCQkJCS8vCSoocCtpKSA9MHhmZmZmZmVmZjsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHgwMDAwNDAwMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDA0MDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJLy8JKihwK2kpID0weGZmZmZmZWZmOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weDAwMDA4MDAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDgwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiAxMjgqNCkKCQkJewoJCQkJbV9sZW4gLT0gMTI4KjQ7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKCi8vKi8Kc3RhdGljIHZvaWQgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMih2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCS8vICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJCQl7CgkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIG91dCBvZiBjb3VudCIpOwoJCQkJCW1fbGVuPTA7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJLy8gICAqKHAraSkgPSAweGZlMDFmZTAxOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGZlMDFmZTAxKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmUwMWZlMDEpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkvLwkgICAqKHAraSkgPSAweGZkMDJmZDAyOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGZkMDJmZDAyKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmQwMmZkMDIpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkvLyAgICoocCtpKSA9IDB4ZmIwNGZiMDQ7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4ZmIwNGZiMDQpCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmYjA0ZmIwNCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJLy8JICAgKihwK2kpID0gMHhmNzA4ZjcwODsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmNzA4ZjcwOCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGY3MDhmNzA4KTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkJCQkvLwkgICAqKHAraSkgPSAweGVmMTBlZjEwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGVmMTBlZjEwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZWYxMGVmMTApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCS8vICAgKihwK2kpID0gMHhkZjIwZGYyMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhkZjIwZGYyMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGRmMjBkZjIwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkvLwkgICAqKHAraSkgPSAweGJmNDBiZjQwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGJmNDBiZjQwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4YmY0MGJmNDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJLy8JICAgKihwK2kpID0gMHg3ZjgwN2Y4MDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHg3ZjgwN2Y4MCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDdmODA3ZjgwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCgkJCQkJZGVmYXVsdDoKCgkJCQkJCS8vICAqKHAraSkgPSAweGZmMDBmZjAwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGZmMDBmZjAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmMDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCQlicmVhazsKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiAxMjgqNCkKCQkJewoJCQkJbV9sZW4gLT0gMTI4KjQ7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQgZGRyX3dyaXRlX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgICB1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIGksIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgkvLyNkZWZpbmUgZGRyX3BhdHRlcm5fbG9vcCAzMgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCS8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKCQkJaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgkJCQkJCSoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNzoKCQkJCQkJKihwK2kpID0gMHhmZmZmMDAwMDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDExOgoJCQkJCQkqKHAraSkgPSAweGZmMDAwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTM6CgkJCQkJY2FzZSAxNDoKCQkJCQljYXNlIDE1OgoJCQkJCQkqKHAraSkgPSAweGZmMDBmZmZmOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCQkJCQkJKihwK2kpID0gMHhmZjAwZmZmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQkJKihwK2kpID0gMHhmZjAwMDBmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCQkJKihwK2kpID0gMHhmZmZmMDAwMDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCSoocCtpKSA9IDB4MDBmZjAwZmY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzM6CgkJCQkJCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzc6CgkJCQkJCSoocCtpKSA9fjB4ZmZmZjAwMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMToKCQkJCQkJKihwK2kpID1+MHhmZjAwMDAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTU6CgkJCQkJCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE5OgoJCQkJCQkqKHAraSkgPX4weGZmMDBmZmZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMzoKCQkJCQkJKihwK2kpID1+MHhmZjAwZmZmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjc6CgkJCQkJCSoocCtpKSA9fjB4ZmZmZjAwMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMxOgoJCQkJCQkqKHAraSkgPX4weDAwZmYwMGZmOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzoKCQkJCQkJKihwK2kpID0weDAwZmYwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis3OgoJCQkJCQkqKHAraSkgPTB4ZmYwMDAwMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMToKCQkJCQkJKihwK2kpID0weDAwMDBmZmZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNToKCQkJCQkJKihwK2kpID0weDAwMDAwMGZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOToKCQkJCQkJKihwK2kpID0weDAwZmYwMGZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMzoKCQkJCQkJKihwK2kpID0weGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNzoKCQkJCQkJKihwK2kpID0weGZmMDBmZmZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMToKCQkJCQkJKihwK2kpID0weGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszOgoJCQkJCQkqKHAraSkgPX4weDAwZmYwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkqKHAraSkgPX4weGZmMDAwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCSoocCtpKSA9fjB4MDAwMGZmZmY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCQkqKHAraSkgPX4weDAwMDAwMGZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJKihwK2kpID1+MHgwMGZmMDBmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkqKHAraSkgPX4weGZmMDBmZmZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJKihwK2kpID1+MHhmZjAwZmYwMDsKCQkJCQkJYnJlYWs7CgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4oIDEyOCo0KSkKCQkJewoJCQkJbV9sZW4gLT0oIDEyOCo0KTsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJLy8gICB1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIGksIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7Cgl3aGlsZSAobV9sZW4pCgl7CgkJLy8gIGZvcihqPTA7ajwzMjtqKyspCgkJewoJCQlpZiAobV9sZW4gPj0gMTI4KjQpCgkJCQluID0gMzIqNDsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJaWYgKChlcnJvcl9vdXRvZl9jb3VudF9mbGFnKSAmJiAoZXJyb3JfY291bnQpKQoJCQkJewoJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBvdXQgb2YgY291bnQiKTsKCQkJCQltX2xlbj0wOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDE6CgkJCQkJY2FzZSAyOgoJCQkJCWNhc2UgMzoKCQkJCQkJLy8JICBpZigqKHAraSkgIT1+VERBVEEzMkYpCgoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDBmZjAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwZmYwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgNToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA3OgoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmZmYwMDAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZmZmMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDExOgoJCQkJCQkvLyAqKHAraSkgPSAweGZmMDAwMDAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDAwMDAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCQkJLy8gKihwK2kpID0gMHhmZjAwZmZmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHhmZjAwZmZmZikKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgMTc6CgkJCQkJY2FzZSAxODoKCQkJCQljYXNlIDE5OgoJCQkJCQkvLwkgKihwK2kpID0gMHhmZjAwZmZmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHhmZjAwZmZmZikKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSAyMToKCQkJCQljYXNlIDIyOgoJCQkJCWNhc2UgMjM6CgkJCQkJCS8vICAqKHAraSkgPSAweGZmMDAwMGZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDAwMGZmKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwMDBmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCQkJLy8gICoocCtpKSA9IDB4ZmZmZjAwMDA7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmZmZjAwMDApCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZmZmYwMDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyODoKCQkJCQljYXNlIDI5OgoJCQkJCWNhc2UgMzA6CgkJCQkJY2FzZSAzMToKCQkJCQkJLy8gICoocCtpKSA9IDB4MDBmZjAwZmY7CgkJCQkJCWlmICggKihwK2kpICE9IDB4MDBmZjAwZmYpCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwZmYwMGZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszOgoJCQkJCQkvLyAgCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDBmZjAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzc6CgkJCQkJCS8vIAkqKHAraSkgPX4weGZmZmYwMDAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHhmZmZmMDAwMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmZmYwMDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTE6CgkJCQkJCS8vIAkqKHAraSkgPX4weGZmMDAwMDAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHhmZjAwMDAwMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDAwMDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNToKCQkJCQkJLy8JKihwK2kpID1+MHhmZjAwZmZmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMGZmZmYpCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZjAwZmZmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTk6CgkJCQkJCS8vCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDBmZmZmKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIzOgoJCQkJCQkvLwkqKHAraSkgPX4weGZmMDBmZmZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHhmZjAwZmZmZikKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDBmZmZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNzoKCQkJCQkJLy8JKihwK2kpID1+MHhmZmZmMDAwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmZmZjAwMDApCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZmZmMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzE6CgkJCQkJCS8vICAJKihwK2kpID1+MHgwMGZmMDBmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4MDBmZjAwZmYpCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMGZmMDBmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzM6CgkJCQkJCS8vICAJKihwK2kpID0weDAwZmYwMDAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweDAwZmYwMDAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMGZmMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNzoKCQkJCQkJLy8gICAJKihwK2kpID0weGZmMDAwMDAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDAwMDAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzExOgoJCQkJCQkvLyAJKihwK2kpID0weDAwMDBmZmZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweDAwMDBmZmZmKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwZmZmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTU6CgkJCQkJCS8vICAgCSoocCtpKSA9MHgwMDAwMDBmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHgwMDAwMDBmZikKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDAwMDAwZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE5OgoJCQkJCQkvLyAgIAkqKHAraSkgPTB4MDBmZjAwZmY7CgkJCQkJCWlmICggKihwK2kpICE9IDB4MDBmZjAwZmYpCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwZmYwMGZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMzoKCQkJCQkJLy8JKihwK2kpID0weGZmMDBmZjAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDBmZjAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwZmYwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjc6CgkJCQkJCS8vICAgCSoocCtpKSA9MHhmZjAwZmZmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHhmZjAwZmZmZikKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMxOgoJCQkJCQkvLwkgICAJKihwK2kpID0weGZmMDBmZjAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDBmZjAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwZmYwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJLy8JKihwK2kpID1+MHgwMGZmMDAwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4MDBmZjAwMDApCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMGZmMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNzoKCQkJCQkJLy8gICAJKihwK2kpID1+MHhmZjAwMDAwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMDAwMDApCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZjAwMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkvLyAgCSoocCtpKSA9fjB4MDAwMGZmZmY7CgkJCQkJCWlmICggKihwK2kpICE9IH4weDAwMDBmZmZmKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCQkvLyAgIAkqKHAraSkgPX4weDAwMDAwMGZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHgwMDAwMDBmZikKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDAwMGZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJLy8gICAJKihwK2kpID1+MHgwMGZmMDBmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4MDBmZjAwZmYpCgkJCQkJCXsKCQkJCQkJCWVycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMGZmMDBmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCS8vCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDBmZjAwKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkvLyAgCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDBmZmZmKQoJCQkJCQl7CgkJCQkJCQllcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMxOgoJCQkJCQkvLyAgIAkqKHAraSkgPX4weGZmMDBmZjAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHhmZjAwZmYwMCkKCQkJCQkJewoJCQkJCQkJZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDBmZjAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiggMTI4KjQpKQoJCQl7CgkJCQltX2xlbiAtPSggMTI4KjQpOwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCgoKaW50IGRvX2Rkcl90ZXN0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwoJdW5zaWduZWQgaW50ICAgbGZsYWcgPSAwOwoJdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCXVuc2lnbmVkIGludCAgdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCXVuc2lnbmVkIGludCAgIHNpbXBsZV9wYXR0ZXJuX2ZsYWcgPSAxOwoJdW5zaWduZWQgaW50ICAgY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPSAxOwoJdW5zaWduZWQgaW50ICAgb2xkX3BhdHRlcm5fZmxhZyA9IDE7CgoJdW5zaWduZWQgaW50ICAgcHJpbnRfZmxhZyA9IDE7CgkvLwkgIGNvcHlfdGVzdF9mbGFnID0gMDsKCXByaW50X2ZsYWcgPSAxOwoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZyA9MDsKCWVycm9yX2NvdW50ID0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoJaWYgKCFhcmdjKQoJCWdvdG8gRERSX1RFU1RfU1RBUlQ7CglpZiAoYXJnYyA+IDEpIHsKCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJsIikgPT0gMCkgewoJCQlsZmxhZyA9IDE7CgkJfQoJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaCIpID09IDApewoJCQlnb3RvIHVzYWdlOwoJCX0KCQllbHNlewoJCQlsb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTApOwoJCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQkJbG9vcCA9IDE7CgkJfQoJfQoJLy8gICAgcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCWlmIChhcmdjID09MSkgewoJCS8vICAgIHN0YXJ0X2FkZHIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJLy8gICAgaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQlzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCQlsb29wID0gMTsKCgl9CglpZiAoYXJnYyA+IDIpIHsKCQlzdGFydF9hZGRyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoKCX0KCWlmIChhcmdjID4gMykgewoJCXRlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoKCX0KCWlmICh0ZXN0X3NpemU8MHgxMDAwKQoJCXRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgoJb2xkX3BhdHRlcm5fZmxhZyA9IDE7CglzaW1wbGVfcGF0dGVybl9mbGFnID0gMTsKCWNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID0gMTsKCS8vcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCWlmIChhcmdjID09MikgewoJCWlmICggKHN0cmNtcChhcmd2WzFdLCAicyIpID09IDApKQoJCXsKCQkJc2ltcGxlX3BhdHRlcm5fZmxhZyA9IDE7CgkJCW9sZF9wYXR0ZXJuX2ZsYWc9MDsKCQkJY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPSAwOwoJCX0KCQllbHNlIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJjIikgPT0gMCkpCgkJewoJCQlzaW1wbGVfcGF0dGVybl9mbGFnID0gMDsKCQkJb2xkX3BhdHRlcm5fZmxhZz0wOwoJCQljcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9IDE7CgkJfQoJCWVsc2UgIGlmICggKHN0cmNtcChhcmd2WzFdLCAiZSIpID09IDApKQoJCXsKCQkJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoJCX0KCX0KCWlmIChhcmdjID4yKSB7CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJuIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAibiIpID09IDApKQoJCXsKCQkJcHJpbnRfZmxhZyA9IDA7CgkJfQoJCWlmICggKHN0cmNtcChhcmd2WzFdLCAicCIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgInAiKSA9PSAwKSkKCQl7CgkJCWNvcHlfdGVzdF9mbGFnID0gMTsKCQl9CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJzIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAicyIpID09IDApKQoJCXsKCQkJc2ltcGxlX3BhdHRlcm5fZmxhZyA9IDE7CgkJCW9sZF9wYXR0ZXJuX2ZsYWc9MDsKCQkJY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPSAwOwoJCX0KCQllbHNlIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJjIikgPT0gMCl8fChzdHJjbXAoYXJndlsyXSwgImMiKSA9PSAwKSkKCQl7CgkJCXNpbXBsZV9wYXR0ZXJuX2ZsYWcgPSAwOwoJCQlvbGRfcGF0dGVybl9mbGFnPTA7CgkJCWNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID0gMTsKCQl9CgkJZWxzZSAgaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJlIikgPT0gMCl8fChzdHJjbXAoYXJndlsyXSwgImUiKSA9PSAwKSkKCQl7CgkJCWVycm9yX291dG9mX2NvdW50X2ZsYWc9MTsKCQl9Cgl9CgkvL3ByaW50ZigiXG5MSU5FMT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJaWYgKGFyZ2MgPiAzKSB7CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJwIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAicCIpID09IDApIHx8IChzdHJjbXAoYXJndlszXSwgInAiKSA9PSAwKSkKCQl7CgkJCWNvcHlfdGVzdF9mbGFnID0gMTsKCQl9CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJuIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAibiIpID09IDApIHx8IChzdHJjbXAoYXJndlszXSwgIm4iKSA9PSAwKSkKCQl7CgkJCXByaW50X2ZsYWcgPSAwOwoJCX0KCQlpZiAoIChzdHJjbXAoYXJndlsxXSwgInMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJzIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzNdLCAicyIpID09IDApKQoJCXsKCQkJc2ltcGxlX3BhdHRlcm5fZmxhZyA9IDE7CgkJCW9sZF9wYXR0ZXJuX2ZsYWc9MDsKCQkJY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPSAwOwoJCX0KCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYyIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbM10sICJjIikgPT0gMCkpCgkJewoJCQlzaW1wbGVfcGF0dGVybl9mbGFnID0gMDsKCQkJb2xkX3BhdHRlcm5fZmxhZz0wOwoJCQljcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9IDE7CgkJfQoJCWlmICggKHN0cmNtcChhcmd2WzFdLCAiZSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbM10sICJlIikgPT0gMCkpCgkJewoJCQllcnJvcl9vdXRvZl9jb3VudF9mbGFnPTE7CgkJfQoJfQoKCS8vICAgIHByaW50ZigiXG5MSU5FMj09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJLy8JcHJpbnRmKCJcbkxJTkUzPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkvLwlwcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoKRERSX1RFU1RfU1RBUlQ6CgoJLy8vKgoJZG8gewoJCWlmIChsZmxhZykKCQkJbG9vcCA9IDg4ODsKCgkJaWYgKG9sZF9wYXR0ZXJuX2ZsYWcgPT0gMSkKCQl7CgkJCXsKCQkJCS8vCXByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJCQkvL3ByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJCQkvL3ByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJCQlpZiAocHJpbnRfZmxhZykKCQkJCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCQkJCWRkcl93cml0ZSgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQkJCS8vCSBmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCQkJCWlmIChwcmludF9mbGFnKSB7CgkJCQkJcHJpbnRmKCJcbkVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCQlwcmludGYoIlxuU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJfQoJCQkJZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCQlpZiAocHJpbnRfZmxhZykgewoJCQkJCXByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQkJcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJCQlkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQkJCWlmIChwcmludF9mbGFnKSB7CgkJCQkJcHJpbnRmKCJcbkVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCQlwcmludGYoIlxuU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQkJCWRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCQkJaWYgKHByaW50X2ZsYWcpCgkJCQkJcHJpbnRmKCJcbkVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCQkJCWlmIChjb3B5X3Rlc3RfZmxhZykKCQkJCXtpZihwcmludF9mbGFnKQoJCQkJCXByaW50ZigiXG4gY29weV90ZXN0X2ZsYWcgPSAxLHN0YXJ0IGNvcHkgdGVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoJCQkJCWRkcl90ZXN0X2NvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZS8yICk7CgkJCQkJZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksIHRlc3Rfc2l6ZS8yKTsKCQkJCQlkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwgdGVzdF9zaXplLzIpOwoJCQkJfQoKCQkJfQoJCQl7CgkJCQkvLwlwcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJCQkJLy9wcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJCQkJLy9wcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJCQkJaWYgKHByaW50X2ZsYWcpIHsKCQkJCQlwcmludGYoIlxuU3RhcnQgKjQgbm9ybWFsIHBhdHRlcm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgkJCQl9CgkJCQlkZHJfd3JpdGU0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCQkJaWYgKHByaW50X2ZsYWcpIHsKCQkJCQlwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJCXByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCQkJZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCQkJaWYgKHByaW50X2ZsYWcpIHsKCQkJCQlwcmludGYoIlxuRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJCXByaW50ZigiXG5TdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCQkJZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCQkJaWYgKHByaW50X2ZsYWcpIHsKCQkJCQlwcmludGYoIlxuRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJCXByaW50ZigiXG5TdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCQkJZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCQkJaWYgKHByaW50X2ZsYWcpCgkJCQkJcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoJCQkJaWYgKGNvcHlfdGVzdF9mbGFnKQoJCQkJewoKCQkJCQlkZHJfdGVzdF9jb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUvMiApOwoJCQkJCWRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwgdGVzdF9zaXplLzIpOwoJCQkJCWRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwgdGVzdF9zaXplLzIpOwoJCQkJfQoKCgkJCX0KCQl9CgoJCWlmIChzaW1wbGVfcGF0dGVybl9mbGFnID09IDEpCgkJewoJCQlpZiAocHJpbnRfZmxhZykgewoJCQkJcHJpbnRmKCJcblN0YXJ0ICo0IG5vIGNyb3NzIHRhbGsgcGF0dGVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJCQl9CgkJCWRkcl93cml0ZV9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCQlpZiAocHJpbnRfZmxhZykgewoJCQkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCQlkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCQlpZiAocHJpbnRfZmxhZykgewoJCQkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCQlkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCQlpZiAocHJpbnRfZmxhZykgewoJCQkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCXByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCQlkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCQlpZiAocHJpbnRfZmxhZykKCQkJCXByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgkJCWlmIChjb3B5X3Rlc3RfZmxhZykKCQkJewoJCQkJZGRyX3Rlc3RfY29weSgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplLzIgKTsKCQkJCWRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksIHRlc3Rfc2l6ZS8yKTsKCQkJCWRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksIHRlc3Rfc2l6ZS8yKTsKCQkJfQoKCQl9CgoJCWlmIChjcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9PSAxKQoJCXtpZihwcmludF9mbGFnKXsKCQkJCQkJICAgcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCQkJICAgcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgkJCQkJICAgfQoJCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCQkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7fQoJCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCQkJLy8vKgoJCQlwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBwMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7fQoJCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgkJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIG4yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTt9CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpCgkJCXByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgkJaWYgKGNvcHlfdGVzdF9mbGFnKQoJCXsKCQkJZGRyX3Rlc3RfY29weSgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplLzIgKTsKCQkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwgdGVzdF9zaXplLzIpOwoJCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCB0ZXN0X3NpemUvMik7CgkJfQoJCS8vICAgICovCgoJCX0KCgkJaWYgKHByaW50X2ZsYWcpCgkJCXByaW50ZigiXG5FcnJvciBjb3VudD09MHglMDh4IiwgZXJyb3JfY291bnQpOwoKCX13aGlsZSgtLWxvb3ApOwoJLy8qLwoKCXByaW50ZigiXHJFbmQgZGRyIHRlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCglyZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwp9CgpVX0JPT1RfQ01EKAoJZGRydGVzdCwJNSwJMSwJZG9fZGRyX3Rlc3QsCgkiRERSIHRlc3QgZnVuY3Rpb24iLAoJImRkcnRlc3QgW0xPT1BdIFtBRERSXS5EZWZhdWx0IGFkZHJlc3MgaXMgMHg4ZDAwMDAwMFxuIgopOwoKaW50IGRvX2Rkcl9zcGVjaWFsX3Rlc3QoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7Cgl1bnNpZ25lZCBpbnQgICBsZmxhZyA9IDA7Cgl1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJdW5zaWduZWQgaW50IHRlc3RfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7Cgl1bnNpZ25lZCBpbnQgIHRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7Cgl1bnNpZ25lZCBpbnQgICB3cml0ZV90aW1lcyA9IDE7Cgl1bnNpZ25lZCBpbnQgIHJlYWRfdGltZXMgPSAzOwoJLy8gIHVuc2lnbmVkIGludCAgIG9sZF9wYXR0ZXJuX2ZsYWcgPSAxOwoKCXVuc2lnbmVkIGludCAgIHByaW50X2ZsYWcgPSAxOwoJLy8JICBjb3B5X3Rlc3RfZmxhZyA9IDA7CglwcmludF9mbGFnID0gMTsKCWVycm9yX291dG9mX2NvdW50X2ZsYWcgPTA7CgllcnJvcl9jb3VudCA9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWludCBpIDsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCglpZiAoc3RyY21wKGFyZ3ZbMV0sICJsIikgPT0gMCkgewoJCWxmbGFnID0gMTsKCX0KCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaCIpID09IDApewoJCWdvdG8gdXNhZ2U7Cgl9CgllbHNlewoJCWxvb3AgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxMCk7CgkJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJbG9vcCA9IDE7Cgl9CgoJLy8gICAgcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCWlmIChhcmdjID09MSkgewoJCS8vICAgIHN0YXJ0X2FkZHIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJLy8gICAgaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQlzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCQlsb29wID0gMTsKCgl9CglpZiAoYXJnYyA+IDIpIHsKCQlzdGFydF9hZGRyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoKCX0KCWlmIChhcmdjID4gMykgewoJCXRlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoKCX0KCWlmICh0ZXN0X3NpemU8MHgxMDAwKQoJCXRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CglpZiAoYXJnYyA+IDQpIHsKCQl3cml0ZV90aW1lcyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl3cml0ZV90aW1lcyA9IDA7CgoJfQoJaWYgKGFyZ2MgPiA1KSB7CgkJcmVhZF90aW1lcyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlyZWFkX3RpbWVzID0gMDsKCgl9Cgl1bnNpZ25lZCBpbnQgIGJhc2VfcGF0dGVybiA9IDE7Cgl1bnNpZ25lZCBpbnQgIGluY19mbGFnID0gMTsKCWlmIChhcmdjID4gNikgewoJCWJhc2VfcGF0dGVybiA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQliYXNlX3BhdHRlcm4gPSAwOwoKCX0KCWlmIChhcmdjID4gNykgewoJCWluY19mbGFnID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzddLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls3XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWluY19mbGFnID0gMDsKCgl9CgoKCXVuc2lnbmVkIGludCAgY291bnQgICAgPSAxOwoJdW5zaWduZWQgaW50ICAgdGVzdF92YWwgPSAxOwoKCS8vLyoKCWRvIHsKCQlpZiAobGZsYWcpCgkJCWxvb3AgPSA4ODg7CgoJCWlmICgxKQoJCXsKCgkJCWZvciAoaT0wO2k8d3JpdGVfdGltZXM7KQoJCQl7aSsrOwoJCQkJcHJpbnRmKCJcbndyaXRlX3RpbWVzPT0weCUwOHggXG4iLCgodW5zaWduZWQgaW50KWkpKTsKCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyOwoJCQkJdGVzdF92YWw9YmFzZV9wYXR0ZXJuOwoJCQkJY291bnQ9KHRlc3Rfc2l6ZT4+Mik7CgkJCQlkbwoJCQkJewoJCQkJCXdyaXRlbCh0ZXN0X3ZhbCwodW5zaWduZWQgbG9uZyl0ZXN0X2FkZHIpOwoJCQkJCXRlc3RfYWRkcj10ZXN0X2FkZHIrNDsKCQkJCQlpZiAoaW5jX2ZsYWcpCgkJCQkJCXRlc3RfdmFsPXRlc3RfdmFsKzE7CgoJCQkJfQoJCQkJd2hpbGUgKGNvdW50LS0pIDsKCQkJfQoKCQkJZm9yIChpPTA7aTxyZWFkX3RpbWVzOykKCQkJe2krKzsKCQkJCXByaW50ZigiXG5yZWFkX3RpbWVzPT0weCUwOHggXG4iLCgodW5zaWduZWQgaW50KWkpKTsKCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyOwoJCQkJdGVzdF92YWw9YmFzZV9wYXR0ZXJuOwoJCQkJY291bnQ9KHRlc3Rfc2l6ZT4+Mik7CgoJCQkJZG8KCQkJCXsKCgkJCQkJLy93cml0ZWwodmFsLCh1bnNpZ25lZCBsb25nKXJlZyk7CgkJCQkJaWYgKHRlc3RfdmFsICE9IChyZWFkbCgodW5zaWduZWQgbG9uZyl0ZXN0X2FkZHIpKSkgewoKCQkJCQkJcHJpbnRmKCJcbmFkZD09MHglMDh4LHBhdHRlcm49PTB4JTA4eCxyZWFkPT0weCUwOHggXG4iLCgodW5zaWduZWQgaW50KXRlc3RfYWRkciksKCh1bnNpZ25lZCBpbnQpdGVzdF92YWwpLChyZWFkbCgodW5zaWduZWQgaW50KXRlc3RfYWRkcikpKTsKCQkJCQl9CgkJCQkJdGVzdF9hZGRyPXRlc3RfYWRkcis0OwoJCQkJCWlmIChpbmNfZmxhZykKCQkJCQkJdGVzdF92YWw9dGVzdF92YWwrMTsKCQkJCX0KCQkJCXdoaWxlIChjb3VudC0tKSA7CgkJCX0KCQl9CgoKCgkJaWYgKHByaW50X2ZsYWcpCgkJCXByaW50ZigiXG5FcnJvciBjb3VudD09MHglMDh4IiwgZXJyb3JfY291bnQpOwoKCX13aGlsZSgtLWxvb3ApOwoJLy8qLwoKCXByaW50ZigiXHJFbmQgZGRyIHRlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCglyZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwp9ClVfQk9PVF9DTUQoCglkZHJfc3BlY190ZXN0LAk4LAkxLAlkb19kZHJfc3BlY2lhbF90ZXN0LAoJIkREUiB0ZXN0IGZ1bmN0aW9uIiwKCSJkZHJ0ZXN0IFtMT09QXSBbQUREUl0gW3NpemVdIFt3cml0ZV90aW1lc10gW3JlYWQgdGltZXNdIFtwYXR0ZXJuXSBbaW5jXS5kZHJfc3BlY190ZXN0IDEgMHgxMDgwMDAwIDB4MjAwMDAwIDEgIDMgMSAxIFxuIgopOwoKaW50IGRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGludCBkZHJfdGVzdF9zaXplKQp7CiNkZWZpbmUgVEVTVF9PRkZTRVQgIDAvLzBYNDAwMDAwMDAKCS8vIHVuc2lnbmVkIGludCAgc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFIrVEVTVF9PRkZTRVQ7Cgl1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHI9dGVzdF9zdGFydF9hZGRyOwoKCWVycm9yX291dG9mX2NvdW50X2ZsYWc9MTsKCgllcnJvcl9jb3VudD0wOwoKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCgl0cmFpbmluZ19wYXR0ZXJuX2ZsYWc9MDsKI2VuZGlmCgkvLy8qCglpZiAodHJhaW5pbmdfcGF0dGVybl9mbGFnKQoJewojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfR1hfQkFCWSkKCQlkZHJfdGVzdF9neF90cmFpbmluZ19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZW5kaWYKCQlpZiAoZXJyb3JfY291bnQpCgkJCXJldHVybiAxOwoJCWVsc2UKCQkJcmV0dXJuIDA7Cgl9CgllbHNlCgl7CiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9CQUJZKQoJCWRkcl90ZXN0X2d4X3RyYWluaW5nX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbmRpZgoKCX0KCgl7CgkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZSgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcbkVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCWlmIChlcnJvcl9jb3VudCkKCQlyZXR1cm4gZXJyb3JfY291bnQ7CgkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgcGF0dGVybjQgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZTQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoKCQlpZiAoZXJyb3JfY291bnQpCgkJcmV0dXJuIGVycm9yX2NvdW50OwoJCXByaW50ZigiXG5TdGFydCAqNCBubyBjcm9zcyB0YWxrIHBhdHRlcm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZV9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcbkVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJfQoKCWlmIChlcnJvcl9jb3VudCkKCQlyZXR1cm4gZXJyb3JfY291bnQ7CgkvL2lmKGNyb3NzX3RhbGtfcGF0dGVybl9mbGFnPT0xKQoJewoJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgoJCWlmIChlcnJvcl9jb3VudCkKCQlyZXR1cm4gZXJyb3JfY291bnQ7CgkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkvLyAgICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKXN0YXJ0X2FkZHIsIGRkcl90ZXN0X3NpemUpOwoJCS8vICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoJfQoJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiBlcnJvcl9jb3VudDsKCXsKCQlwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBwMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkJLy8gICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKXN0YXJ0X2FkZHIsIGRkcl90ZXN0X3NpemUpOwoJCS8vICAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCQlpZiAoZXJyb3JfY291bnQpCgkJcmV0dXJuIGVycm9yX2NvdW50OwoJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIG4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgoJCWlmIChjb3B5X3Rlc3RfZmxhZykKCQl7CgkJCWlmIChlcnJvcl9jb3VudCkKCQkJcmV0dXJuIGVycm9yX2NvdW50OwoJCQlwcmludGYoIlxuIHN0YXJ0IGNvcHkgdGVzdCAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlkZHJfdGVzdF9jb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcitkZHJfdGVzdF9zaXplLzIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZS8yICk7CgkJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK2Rkcl90ZXN0X3NpemUvMikpLCBkZHJfdGVzdF9zaXplLzIpOwoJCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcitkZHJfdGVzdF9zaXplLzIpKSwgZGRyX3Rlc3Rfc2l6ZS8yKTsKCQl9Cgl9CgoJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiAxOwoJZWxzZQoJCXJldHVybiAwOwoJfQoKCgppbnQgZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm5fcXVpY2tfcmV0cnVuKGludCBkZHJfdGVzdF9zaXplKQp7CgllcnJvcl9vdXRvZl9jb3VudF9mbGFnID0xOwoJI2RlZmluZSBURVNUX09GRlNFVCAgMC8vMFg0MDAwMDAwMAoJLy8gdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUitURVNUX09GRlNFVDsKCXVuc2lnbmVkIGludCAgc3RhcnRfYWRkcj10ZXN0X3N0YXJ0X2FkZHI7CgoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoKCWVycm9yX2NvdW50PTA7CgoJI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCgkJdHJhaW5pbmdfcGF0dGVybl9mbGFnPTA7CgkjZW5kaWYKCS8vLyoKCWlmICh0cmFpbmluZ19wYXR0ZXJuX2ZsYWcpCgl7CgkjaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfR1hfQkFCWSkKCQlkZHJfdGVzdF9neF90cmFpbmluZ19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJI2VuZGlmCglpZiAoZXJyb3JfY291bnQpCgkJcmV0dXJuIDE7CgllbHNlCgkJcmV0dXJuIDA7Cgl9CgllbHNlCgl7CgkjaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfR1hfQkFCWSkKCQlkZHJfdGVzdF9neF90cmFpbmluZ19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJI2VuZGlmCgl9CgkvLwkJCSovCgkvKgoJZGRyX3Rlc3RfZ3hfY3Jvc3NfdGFsa19wYXR0ZXJuKCBkZHJfdGVzdF9zaXplKTsKCWlmIChlcnJvcl9jb3VudCkKCXJldHVybiAxOwoJZWxzZQoJcmV0dXJuIDA7CgkqLwoKCXsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIHBhdHRlcm40IGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGU0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCgkJcHJpbnRmKCJcblN0YXJ0ICo0IG5vIGNyb3NzIHRhbGsgcGF0dGVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7Cgl9CgkvL2lmKGNyb3NzX3RhbGtfcGF0dGVybl9mbGFnPT0xKQoJewoJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgoJCS8vICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkvLyAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKilzdGFydF9hZGRyLCBkZHJfdGVzdF9zaXplKTsKCQkvLyAgICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIG4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJLy8gICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkvLyAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKilzdGFydF9hZGRyLCBkZHJfdGVzdF9zaXplKTsKCQkvLyAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgoJfQoKCXsKCQlwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBwMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkJLy8gICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKXN0YXJ0X2FkZHIsIGRkcl90ZXN0X3NpemUpOwoJCS8vICAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkvLyAgICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKXN0YXJ0X2FkZHIsIGRkcl90ZXN0X3NpemUpOwoJIC8vICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoJCWlmIChjb3B5X3Rlc3RfZmxhZykKCQl7CgkJCXByaW50ZigiXG4gc3RhcnQgY29weSB0ZXN0ICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCWRkcl90ZXN0X2NvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK2Rkcl90ZXN0X3NpemUvMikpLCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplLzIgKTsKCQkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrZGRyX3Rlc3Rfc2l6ZS8yKSksIGRkcl90ZXN0X3NpemUvMik7CgkJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK2Rkcl90ZXN0X3NpemUvMikpLCBkZHJfdGVzdF9zaXplLzIpOwoJCX0KCgl9CgoJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiAxOwoJZWxzZQoJCXJldHVybiAwOwp9CgoKaW50IGRvX2RkcjJwbGxfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKCWV4dGVybiBpbnQgZG9fZGRyMnBsbF9nMTJfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSk7Cglkb19kZHIycGxsX2cxMl9jbWQoY21kdHAsZmxhZyxhcmdjLCBhcmd2KTsKCXJldHVybiAxOwojZW5kaWYKfQoKaW50IGRvX2Rkcl91Ym9vdF9uZXdfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJLy9kZHJfdGVzdF9jbWQgMHgzNiAweDIwMTgwMDMwIDB4MSBjbWRfb2Zmc2V0IGNtZF92YWx1ZSB2YWx1ZV9zaXplIHJlc2V0X2VuYWJsZQojaWYgMQoKI2RlZmluZSBERFJfU1RJQ0tZX09WRVJSSURFX0NPTkZJR19NRVNTQUdFX0NNRAkweDEgLy9vdmVycmlkZSBjb25maWcKI2RlZmluZSBERFJfU1RJQ0tZX1NQRUNJQUxfRlVOQ1RJT05fQ01ECQkJMHgyIC8vc3BlY2lhbCB0ZXN0IHN1Y2ggYXMgc2hpZnQgc29tZSBiZGxyIG9yIHBhcmFtZXRlciBvciBpbnRlcmxlYXZlIHRlc3QKCgl1aW50MzJfdCBtYWdpY19jaGlwaWQ9IDA7Ly9yZF9yZWcoUF9QUkVHX1NUSUNLWV9SRUcwKTsKCXVpbnQzMl90IHN0aWNreV9jbWQgPSAwOy8vcmRfcmVnKFBfUFJFR19TVElDS1lfUkVHMSk7Cgl1aW50MzJfdCBjbWRfb2Zmc2V0ID0gMDsKCXVpbnQzMl90IGNtZF92YWx1ZSA9IDA7Cgl1aW50MzJfdCByZXNldF9lbmFibGUgPSAwOwoJdWludDMyX3QgdmFsdWVfc2l6ZSA9IDQ7CgljaGFyICplbmRwOwoJLy9iaXQgMCB0cmlnZ2VyIGVmZmVjdCByZXNldC4KCWlmICgobWFnaWNfY2hpcGlkKSAhPSAoKEREUl9TVElDS1lfTUFHSUNfTlVNQkVSK0REUl9DSElQX0lEKSYweGZmZmYwMDAwKSkgewoJCS8vbWFnaWMgbnVtYmVyIG5vdCBtYXRjaAoJCS8vCW1hZ2ljX2NoaXBpZD1ERFJfU1RJQ0tZX01BR0lDX05VTUJFUitERFJfQ0hJUF9JRDsKCQkvLwlzdGlja3lfY21kPUREUl9TVElDS1lfT1ZFUlJJREVfQ09ORklHX01FU1NBR0VfQ01EOwoJCXByaW50Zigic3RpY2t5MCBtYWdpYyBub3QgbWF0Y2hcbiIpOwoKCX0KCgoJLy8Jd3JfcmVnKFBfUFJFR19TVElDS1lfUkVHMCwgMCk7CgkvLwl3cl9yZWcoUF9QUkVHX1NUSUNLWV9SRUcxLCAwKTsKCgoKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWludCBpIDsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCgoKCWlmIChhcmdjIDwgMikKCQlnb3RvIHVzYWdlOwoKCW1hZ2ljX2NoaXBpZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsMCk7CglpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJcHJpbnRmICgiRXJyb3I6IFdyb25nIGZvcm1hdCBwYXJhbWVudCFcbiIpOwoJCXJldHVybiAxOwoJfQoJaWYgKGFyZ2MgPjIpCgl7CgkJc3RpY2t5X2NtZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2t5X2NtZCA9IDA7CgkJfQoJfQoKCWlmIChhcmdjID4zKQoJewoJCWNtZF9vZmZzZXQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCWNtZF9vZmZzZXQgPSAwOwoJCX0KCX0KCWlmIChhcmdjID40KQoJewoJCWNtZF92YWx1ZT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQljbWRfdmFsdWUgPSAwOwoJCX0KCX0KCWlmIChhcmdjID41KQoJewoJCXZhbHVlX3NpemU9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJdmFsdWVfc2l6ZSA9IDQ7CgkJfQoJfQoJaWYgKGFyZ2MgPjYpCgl7CgkJcmVzZXRfZW5hYmxlPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXJlc2V0X2VuYWJsZSA9IDA7CgkJfQoJfQoJcHJpbnRmKCJjbWRfb2Zmc2V0WzB4JTA4eH09PWNtZF92YWx1ZSBbMHglMDh4XVxuIiwgY21kX29mZnNldCxjbWRfdmFsdWUpOwoJd3JpdGVsKChtYWdpY19jaGlwaWQmMHhmZmZmMDAwMCl8KHJkX3JlZygocF9kZHJfYmFzZS0+cHJlZ19zdGlja3lfcmVnMCkpKSwgKHBfZGRyX2Jhc2UtPnByZWdfc3RpY2t5X3JlZzApKTsKCXdyaXRlbChzdGlja3lfY21kLCAocF9kZHJfYmFzZS0+cHJlZ19zdGlja3lfcmVnMCs0KSk7CgoJdWludDMyX3QgcmVhZF92YWx1ZSA9IDA7CglpZiAodmFsdWVfc2l6ZSkKCXsKCQlyZWFkX3ZhbHVlPXJkX3JlZygocF9kZHJfYmFzZS0+ZGRyX2RtY19zdGlja3kwKSsoKGNtZF9vZmZzZXQvNCk8PDIpKTsKCQlpZiAodmFsdWVfc2l6ZSA9PSAxKSB7CgkJCXdyX3JlZygoKHBfZGRyX2Jhc2UtPmRkcl9kbWNfc3RpY2t5MCkrKChjbWRfb2Zmc2V0LzQpPDwyKSksICgoY21kX3ZhbHVlPDwoKGNtZF9vZmZzZXQlNCkqOCkpfChyZWFkX3ZhbHVlJih+KDB4ZmY8PCgoY21kX29mZnNldCU0KSo4KSkpKSkpOwoJCX0KCQlpZiAodmFsdWVfc2l6ZSA9PSAyKSB7CgkJCXdyX3JlZygoKHBfZGRyX2Jhc2UtPmRkcl9kbWNfc3RpY2t5MCkrKChjbWRfb2Zmc2V0LzQpPDwyKSksICgoY21kX3ZhbHVlPDwoKGNtZF9vZmZzZXQlNCkqOCkpfChyZWFkX3ZhbHVlJih+KDB4ZmZmZjw8KChjbWRfb2Zmc2V0JTQpKjgpKSkpKSk7CgkJfQoJCWlmICh2YWx1ZV9zaXplID09IDQpIHsKCQkJLy8Jd3JfcmVnKCgocF9kZHJfYmFzZS0+ZGRyX2RtY19zdGlja3kwKStjbWRfb2Zmc2V0LzQpLCAoKGNtZF92YWx1ZTw8KChjbWRfb2Zmc2V0JTQpKjgpKXwocmVhZF92YWx1ZSYofigweGZmZmY8PCgoY21kX29mZnNldCU0KSo4KSkpKSkpOwoJCQl3cl9yZWcoKChwX2Rkcl9iYXNlLT5kZHJfZG1jX3N0aWNreTApKygoY21kX29mZnNldC80KTw8MikpLCBjbWRfdmFsdWUpOwoJCX0KCgoKCgkJcHJpbnRmKCJETUNfU1RJQ0tZXzBfIG9mZnNldFsweCUwOHh9PT0gWzB4JTA4eF1cbiIsIGNtZF9vZmZzZXQscmVhZGwoKChwX2Rkcl9iYXNlLT5kZHJfZG1jX3N0aWNreTApKygoY21kX29mZnNldC80KTw8MikpKSk7Cgl9CgoKCXByaW50ZigiKHBfZGRyX2Jhc2UtPnByZWdfc3RpY2t5X3JlZzApPT0gWzB4JTA4eF1cbiIsIHJlYWRsKChwX2Rkcl9iYXNlLT5wcmVnX3N0aWNreV9yZWcwKSkpOwoKCWlmIChyZXNldF9lbmFibGUpCgl7CgkJZGRyX3Rlc3Rfd2F0Y2hkb2dfcmVzZXRfc3lzdGVtKCk7CgoJCXdoaWxlICgxKSA7Cgl9CglyZXR1cm4gMDsKCnVzYWdlOgoKCgoKCgljbWRfdXNhZ2UoY21kdHApOwoKI2VuZGlmCglyZXR1cm4gMTsKfQoKCnVuc2lnbmVkIGludApkb190ZXN0X2FkZHJlc3NfYnVzKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqIGJhc2VBZGRyZXNzLCB1bnNpZ25lZCBpbnQgbkJ5dGVzKQp7Cgl1bnNpZ25lZCBpbnQgYWRkcmVzc01hc2sgPSAobkJ5dGVzL3NpemVvZih1bnNpZ25lZCBpbnQpIC0gMSk7Cgl1bnNpZ25lZCBpbnQgb2Zmc2V0OwoJdW5zaWduZWQgaW50IHRlc3RPZmZzZXQ7CgoJdW5zaWduZWQgaW50IHBhdHRlcm4JID0gKHVuc2lnbmVkIGludCkgMHhBQUFBQUFBQTsKCXVuc2lnbmVkIGludCBhbnRpcGF0dGVybiA9ICh1bnNpZ25lZCBpbnQpIDB4NTU1NTU1NTU7CgoJdW5zaWduZWQgaW50IGRhdGExLCBkYXRhMjsKCgl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKCgkvKgoJICogV3JpdGUgdGhlIGRlZmF1bHQgcGF0dGVybiBhdCBlYWNoIG9mIHRoZSBwb3dlci1vZi10d28gb2Zmc2V0cy4KCSAqLwoJZm9yIChvZmZzZXQgPSAxOyAob2Zmc2V0ICYgYWRkcmVzc01hc2spICE9IDA7IG9mZnNldCA8PD0gMSkKCXsKCQliYXNlQWRkcmVzc1tvZmZzZXRdID0gcGF0dGVybjsKCX0KCgkvKgoJICogQ2hlY2sgZm9yIGFkZHJlc3MgYml0cyBzdHVjayBoaWdoLgoJICovCgl0ZXN0T2Zmc2V0ID0gMDsKCWJhc2VBZGRyZXNzW3Rlc3RPZmZzZXRdID0gYW50aXBhdHRlcm47CgoJZm9yIChvZmZzZXQgPSAxOyAob2Zmc2V0ICYgYWRkcmVzc01hc2spICE9IDA7IG9mZnNldCA8PD0gMSkKCXsKCQlkYXRhMSA9IGJhc2VBZGRyZXNzW29mZnNldF07CgkJZGF0YTIgPSBiYXNlQWRkcmVzc1tvZmZzZXRdOwoJCWlmIChkYXRhMSAhPSBkYXRhMikKCQl7CgkJCXByaW50ZigiICBtZW1UZXN0QWRkcmVzc0J1cyAtIHJlYWQgdHdpY2UgZGlmZmVyZW50W29mZnNldF06IDB4JTh4LTB4JTh4XG4iLCBkYXRhMSwgZGF0YTIpOwoJCQlyZXQgPSAxOwoJCX0KCQlpZiAoZGF0YTEgIT0gcGF0dGVybikKCQl7CgkJCXByaW50ZigiICBtZW1UZXN0QWRkcmVzc0J1cyAtIHdyaXRlWzB4JTh4XTogMHglOHgsIHJlYWRbMHglOHhdOiAweCU4eFxuIiwgXAoJCQkJCW9mZnNldCwgcGF0dGVybiwgb2Zmc2V0LCBkYXRhMSk7CgkJCXJldCA9IDE7CgkJCS8vcmV0dXJuICgodW5zaWduZWQgaW50KSAmYmFzZUFkZHJlc3Nbb2Zmc2V0XSk7CgkJfQoJfQoKCWJhc2VBZGRyZXNzW3Rlc3RPZmZzZXRdID0gcGF0dGVybjsKCgkvKgoJICogQ2hlY2sgZm9yIGFkZHJlc3MgYml0cyBzdHVjayBsb3cgb3Igc2hvcnRlZC4KCSAqLwoJZm9yICh0ZXN0T2Zmc2V0ID0gMTsgKHRlc3RPZmZzZXQgJiBhZGRyZXNzTWFzaykgIT0gMDsgdGVzdE9mZnNldCA8PD0gMSkKCXsKCQliYXNlQWRkcmVzc1t0ZXN0T2Zmc2V0XSA9IGFudGlwYXR0ZXJuOwoKCQlpZiAoYmFzZUFkZHJlc3NbMF0gIT0gcGF0dGVybikKCQl7CgkJCXByaW50ZigiICBtZW1UZXN0QWRkcmVzc0J1czIgLSB3cml0ZSBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4LCByZWFkIGJhc2VBZGRyZXNzWzBdOiAweCU4eFxuIiwgXAoJCQkJCXRlc3RPZmZzZXQsIGFudGlwYXR0ZXJuLCBiYXNlQWRkcmVzc1swXSk7CgkJCXJldCA9IDE7CgkJCS8vcmV0dXJuICgodW5zaWduZWQgaW50KSAmYmFzZUFkZHJlc3NbdGVzdE9mZnNldF0pOwoJCX0KCgkJZm9yIChvZmZzZXQgPSAxOyAob2Zmc2V0ICYgYWRkcmVzc01hc2spICE9IDA7IG9mZnNldCA8PD0gMSkKCQl7CgkJCWRhdGExID0gYmFzZUFkZHJlc3Nbb2Zmc2V0XTsKCQkJaWYgKChkYXRhMSAhPSBwYXR0ZXJuKSAmJiAob2Zmc2V0ICE9IHRlc3RPZmZzZXQpKQoJCQl7CgkJCQlwcmludGYoIiAgbWVtVGVzdEFkZHJlc3NCdXMzIC0gd3JpdGUgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eCwgcmVhZCBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4XG4iLCBcCgkJCQkJCXRlc3RPZmZzZXQsIGFudGlwYXR0ZXJuLCB0ZXN0T2Zmc2V0LCBkYXRhMSk7CgkJCQlyZXQgPSAxOwoJCQkJLy9yZXR1cm4gKCh1bnNpZ25lZCBpbnQpICZiYXNlQWRkcmVzc1t0ZXN0T2Zmc2V0XSk7CgkJCX0KCQl9CgoJCWJhc2VBZGRyZXNzW3Rlc3RPZmZzZXRdID0gcGF0dGVybjsKCX0KCgoJZm9yIChvZmZzZXQgPSAweDE7IChvZmZzZXQgPD1hZGRyZXNzTWFzaykgOyBvZmZzZXQrKykKCXsKCQlpZiAoKCh+b2Zmc2V0KSA8PSBhZGRyZXNzTWFzaykgKQoJCXsKCQkJYmFzZUFkZHJlc3Nbb2Zmc2V0XSA9IHBhdHRlcm47CgkJCWJhc2VBZGRyZXNzWyh+b2Zmc2V0KV0gPSBhbnRpcGF0dGVybjsKCQl9Cgl9CgoJZm9yIChvZmZzZXQgPSAweDE7IChvZmZzZXQgPD1hZGRyZXNzTWFzayk7IG9mZnNldCsrKQoJewoJCWlmICgoKH5vZmZzZXQpIDw9IGFkZHJlc3NNYXNrKSApCgkJewoJCQlpZiAoYmFzZUFkZHJlc3Nbb2Zmc2V0XSAhPSBwYXR0ZXJuKQoJCQl7CgkJCQlwcmludGYoIiAgbWVtVGVzdEFkZHJlc3NCdXM0IC0gd3JpdGUgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eCwgcmVhZCBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4XG4iLCBcCgkJCQkJCW9mZnNldCwgcGF0dGVybiwgb2Zmc2V0LCBiYXNlQWRkcmVzc1tvZmZzZXRdKTsKCgkJCQlyZXQgPSAxOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmIChiYXNlQWRkcmVzc1sofm9mZnNldCldICE9IGFudGlwYXR0ZXJuKQoJCQl7CgkJCQlwcmludGYoIiAgbWVtVGVzdEFkZHJlc3NCdXM1IC0gd3JpdGUgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eCwgcmVhZCBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4XG4iLCBcCgkJCQkJCSgofm9mZnNldCkpLCBhbnRpcGF0dGVybiwgKCh+b2Zmc2V0KSksIGJhc2VBZGRyZXNzWygofm9mZnNldCkpXSk7CgkJCQlyZXQgPSAxOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CgoJaWYgKHJldCkKCXtyZXR1cm4gKHJldCk7Cgl9CgkvL3Vuc2lnbmVkIGludCBzdXFfdmFsdWU7Cglmb3IgKG9mZnNldCA9IDB4MTsgKG9mZnNldCA8PWFkZHJlc3NNYXNrKSA7IG9mZnNldCsrKQoJewoKCQl7CgkJCXBhdHRlcm49KChvZmZzZXQ8PDIpLW9mZnNldCk7CgkJCWJhc2VBZGRyZXNzW29mZnNldF0gPSBwYXR0ZXJuOwoJCQkvL2Jhc2VBZGRyZXNzWyh+b2Zmc2V0KV0gPSBhbnRpcGF0dGVybjsKCQl9Cgl9CgoJZm9yIChvZmZzZXQgPSAweDE7IChvZmZzZXQgPD1hZGRyZXNzTWFzayk7IG9mZnNldCsrKQoJewoKCQl7CgkJCXBhdHRlcm49KChvZmZzZXQ8PDIpLW9mZnNldCk7CgkJCWlmIChiYXNlQWRkcmVzc1tvZmZzZXRdICE9IHBhdHRlcm4pCgkJCXsKCQkJCXByaW50ZigiICBtZW1UZXN0QWRkcmVzc0J1czYgLSB3cml0ZSBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4LCByZWFkIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHhcbiIsIFwKCQkJCQkJb2Zmc2V0LHBhdHRlcm4sIG9mZnNldCwgYmFzZUFkZHJlc3Nbb2Zmc2V0XSk7CgkJCQlyZXQgPSAxOwoJCQkJYnJlYWs7CgkJCX0KCgoJCX0KCX0KCWlmIChyZXQpCgl7cmV0dXJuIChyZXQpOwoJfQoJZm9yIChvZmZzZXQgPSAweDE7IChvZmZzZXQgPD1hZGRyZXNzTWFzaykgOyBvZmZzZXQrKykKCXsKCgkJewoJCQlwYXR0ZXJuPX4oKG9mZnNldDw8Miktb2Zmc2V0KTsKCQkJYmFzZUFkZHJlc3Nbb2Zmc2V0XSA9IHBhdHRlcm47CgkJCS8vYmFzZUFkZHJlc3NbKH5vZmZzZXQpXSA9IGFudGlwYXR0ZXJuOwoJCX0KCX0KCglmb3IgKG9mZnNldCA9IDB4MTsgKG9mZnNldCA8PWFkZHJlc3NNYXNrKTsgb2Zmc2V0KyspCgl7CgoJCXsKCQkJcGF0dGVybj1+KChvZmZzZXQ8PDIpLW9mZnNldCk7CgkJCWlmIChiYXNlQWRkcmVzc1tvZmZzZXRdICE9IHBhdHRlcm4pCgkJCXsKCQkJCXByaW50ZigiICBtZW1UZXN0QWRkcmVzc0J1czcgLSB3cml0ZSBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4LCByZWFkIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHhcbiIsIFwKCQkJCQkJb2Zmc2V0LHBhdHRlcm4sIG9mZnNldCwgYmFzZUFkZHJlc3Nbb2Zmc2V0XSk7CgkJCQlyZXQgPSAxOwoJCQkJYnJlYWs7CgkJCX0KCgoJCX0KCX0KCgoJcmV0dXJuIChyZXQpOwp9ICAgLyogbWVtVGVzdEFkZHJlc3NCdXMoKSAqLwoKaW50IGRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihpbnQgZGRyX3Rlc3Rfc2l6ZSkKewoJLy8gdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCXVuc2lnbmVkIGludCAgc3RhcnRfYWRkcj10ZXN0X3N0YXJ0X2FkZHI7CgllcnJvcl9vdXRvZl9jb3VudF9mbGFnPTE7CgllcnJvcl9jb3VudD0wOwoJLy8vKgoJcHJpbnRmKCJcclN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJZGRyX3dyaXRlKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxuU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkvLyovCgkvKgoJICAgcHJpbnRmKCJcclN0YXJ0IHdyaXRpbmcgcGF0dGVybjQgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJICAgZGRyX3dyaXRlNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICBwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgIGRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICBwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgIGRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICAqLwoJZGRyX3dyaXRlX2Z1bGwoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUsMHgwLDB4Myk7CglwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWRkcl9yZWFkX2Z1bGwoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUsMCwzKTsKCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWRfZnVsbCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSwwLDMpOwoKCglwcmludGYoIlxyU3RhcnQgd3JpdGluZyBhZGQgcGF0dGVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJaWYgKGRvX3Rlc3RfYWRkcmVzc19idXMoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpKQoJCWVycm9yX2NvdW50Kys7CgoKCS8qCgkgICBwcmludGYoIlxuU3RhcnQgKjQgbm8gY3Jvc3MgdGFsayBwYXR0ZXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJICAgZGRyX3dyaXRlX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgcHJpbnRmKCJcbkVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgIHByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICBkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgIHByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICBwcmludGYoIlxuU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgoJLy9pZihjcm9zc190YWxrX3BhdHRlcm5fZmxhZz09MSkKCXsKCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CglkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgoJLy8gICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCS8vICAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCglwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJLy8gICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkvLyAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgoJfQoKCXsKCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoKCS8vICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkvLyAgICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCS8vICAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkvLyAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJLy8gICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoKfQoJKi8KaWYgKGVycm9yX2NvdW50KQoJcmV0dXJuIDE7CgllbHNlCglyZXR1cm4gMDsKCX0KCmludCBwbGxfY29udmVydF90b19kZHJfY2xrX2cxMmEodW5zaWduZWQgaW50IGRkcl9wbGwpCnsKCXVuc2lnbmVkIGludCBkZHJfY2xrPTA7Cgl1bnNpZ25lZCBpbnQgb2RfZGl2PTB4ZmZmOwoJZGRyX3BsbD1kZHJfcGxsJjB4ZmZmZmY7CiNpZiAxLy8gKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCS8vdW5zaWduZWQgaW50IGRkcl9jbGsgPSAyKigoKCgyNCAqICgoZGRyX3BsbD4+NCkmMHgxZmYpKS8oKGRkcl9wbGw+PjE2KSYweDFmKSk+PigoKChkZHJfcGxsPj4wKSYweDMpPT0zKT8oMik6KCgoZGRyX3BsbD4+MCkmMHgzKSkpKS8oKChkZHJfcGxsPj4yKSYweDMpKzEpKTsgIC8vb2QxICBvZAoJaWYgKCgoZGRyX3BsbD4+MTYpJjcpID09IDApCgkJb2RfZGl2PTI7CglpZiAoKChkZHJfcGxsPj4xNikmNykgPT0gMSkKCQlvZF9kaXY9MzsKCglpZiAoKChkZHJfcGxsPj4xNikmNykgPT0gMikKCQlvZF9kaXY9NDsKCglpZiAoKChkZHJfcGxsPj4xNikmNykgPT0gMykKCQlvZF9kaXY9NjsKCglpZiAoKChkZHJfcGxsPj4xNikmNykgPT0gNCkKCQlvZF9kaXY9ODsKCglpZiAoKChkZHJfcGxsPj4xMCkmMHgxZikpCgkJZGRyX2NsayA9IDIqKCgoKDI0ICogKChkZHJfcGxsPj4wKSYweDFmZikpLygoZGRyX3BsbD4+MTApJjB4MWYpKT4+KCgoKGRkcl9wbGw+PjE5KSYweDEpPT0xKT8oMik6KDEpKSkpL29kX2RpdjsKCiNlbHNlCglkZHJfY2xrID0gMiooKCgyNCAqIChkZHJfcGxsJjB4MWZmKSkvKChkZHJfcGxsPj45KSYweDFmKSk+PigoZGRyX3BsbD4+MTYpJjB4MykpOwoKI2VuZGlmCgoKCXJldHVybiBkZHJfY2xrOwp9CgoKaW50IGRkcl9jbGtfY29udmVydF90b19wbGxfZzEyYSh1bnNpZ25lZCBpbnQgZGRyX2NsaywgdW5zaWduZWQgY2hhciBwbGxfYnlwYXNzX2VuKQp7Cgl1aW50MzJfdCBkZHJfcGxsX3Zjb19jdHJsPTA7Cgl1aW50MzJfdCBkZHJfcGxsX3Zjb19tPTA7Cgl1aW50MzJfdCBkZHJfcGxsX3Zjb19uPTA7Cgl1aW50MzJfdCBkZHJfcGxsX3Zjb19jdHJsX29kPTA7Cgl1aW50MzJfdCBkZHJfcGxsX3Zjb19jdHJsX29kMT0wOwoJZGRyX3BsbF92Y29fbj0xOwoJaWYgKHBsbF9ieXBhc3NfZW4gPT0gMCkgewoJCWlmICgoZGRyX2NsayA+PTQ4MDAvNCkpIHsKCQkJLy9kYXRhcmF0ZT09dmNvIHNob3VsZCAzLTQuOGcKCQkJZGRyX3BsbF92Y29fY3RybF9vZD0xOwoJCQlkZHJfcGxsX3Zjb19jdHJsX29kMT0weDI7IC8vMAoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjMpLzI0OyAvLzYKCQl9CgkJZWxzZSBpZiAoKGRkcl9jbGsgPjQ4MDAvNikpIHsKCQkJZGRyX3BsbF92Y29fY3RybF9vZD0yOwoJCQlkZHJfcGxsX3Zjb19jdHJsX29kMT0weDI7IC8vMAoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjQpLzI0OyAvLzgKCQl9CgkJZWxzZSBpZiAoKGRkcl9jbGsgPiA0ODAwLzgpKSB7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9MzsKCQkJZGRyX3BsbF92Y29fY3RybF9vZDE9MHgyOyAvLzAKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2Nsayo2KS8yNDsgLy8xMgoJCX0KCQllbHNlIGlmICgoZGRyX2NsayA+IDQ4MDAvMTIpKSB7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9NDsKCQkJZGRyX3BsbF92Y29fY3RybF9vZDE9MHgyOyAvLzAKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2Nsayo4KS8yNDsgLy8xNgoJCX0KCQllbHNlIGlmICgoZGRyX2NsayA+IDM2MCkpIHsKCQkJZGRyX3BsbF92Y29fY3RybF9vZD0zOwoJCQlkZHJfcGxsX3Zjb19jdHJsX29kMT0weDM7IC8vMAoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjEyKS8yNDsKCQl9CgkJZWxzZSB7CgkJCS8vMzIgICBzaG91bGQgPjIwME0KCQkJZGRyX3BsbF92Y29fY3RybF9vZD00OwoJCQlkZHJfcGxsX3Zjb19jdHJsX29kMT0weDM7Ly8wCgkJCWRkcl9wbGxfdmNvX209KGRkcl9jbGsqMTYpLzI0OwoJCX0KCX0KCWlmIChwbGxfYnlwYXNzX2VuID09IDEpIHsKCQlkZHJfcGxsX3Zjb19jdHJsX29kMT0weDM7Ly8wCgkJaWYgKChkZHJfY2xrID49ODAwKSkgewoJCQkvL2RhdGFyYXRlPT12Y28gc2hvdWxkIDIuNC00LjhnCgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9MDsKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2Nsayo0KS8yNDsKCQl9CgkJZWxzZSBpZiAoKGRkcl9jbGsgPCA0ODAwLzYpKSB7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9MTsKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2NsayoyKjMpLzI0OwoJCX0KCQllbHNlIGlmICgoZGRyX2NsayA8IDQ4MDAvOCkpIHsKCQkJZGRyX3BsbF92Y29fY3RybF9vZD0yOwoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjIqNCkvMjQ7CgkJfQoJCWVsc2UgaWYgKChkZHJfY2xrIDwgNDgwMC8xMikpIHsKCQkJZGRyX3BsbF92Y29fY3RybF9vZD0zOwoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjIqNikvMjQ7CgkJfQoJCWVsc2UgaWYgKChkZHJfY2xrIDwgNDgwMC8xNikpIHsKCQkJZGRyX3BsbF92Y29fY3RybF9vZD00OwoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjIqOCkvMjQ7CgkJfQoJfQoJZGRyX3BsbF92Y29fY3RybD1kZHJfcGxsX3Zjb19tfChkZHJfcGxsX3Zjb19uPDwxMCl8KGRkcl9wbGxfdmNvX2N0cmxfb2Q8PDE2KXwoZGRyX3BsbF92Y29fY3RybF9vZDE8PDE5KTsKCXJldHVybiBkZHJfcGxsX3Zjb19jdHJsOwoKCS8vcmV0dXJuIGRkcl9wbGxfdmNvX2N0cmw7Cn0KaW50IHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsodW5zaWduZWQgaW50IGRkcl9wbGwpCnsKCXVuc2lnbmVkIGludCBkZHJfY2xrPTA7CglkZHJfcGxsPWRkcl9wbGwmMHhmZmZmZjsKCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCgkvLyAgIHByaW50ZigiXG5nMTIgZGRyX3BsbD09ICUwOHggXG4iLCBkZHJfcGxsKTsKCWRkcl9jbGs9cGxsX2NvbnZlcnRfdG9fZGRyX2Nsa19nMTJhKCAgZGRyX3BsbCk7CglyZXR1cm4gZGRyX2NsazsKI2VuZGlmCiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoJLy91bnNpZ25lZCBpbnQgZGRyX2NsayA9IDIqKCgoKDI0ICogKChkZHJfcGxsPj40KSYweDFmZikpLygoZGRyX3BsbD4+MTYpJjB4MWYpKT4+KCgoKGRkcl9wbGw+PjApJjB4Myk9PTMpPygyKTooKChkZHJfcGxsPj4wKSYweDMpKSkpLygoKGRkcl9wbGw+PjIpJjB4MykrMSkpOwoJaWYgKCgoZGRyX3BsbD4+MTYpJjB4MWYpKQoKCQlkZHJfY2xrID0gMiooKCgoMjQgKiAoKGRkcl9wbGw+PjQpJjB4MWZmKSkvKChkZHJfcGxsPj4xNikmMHgxZikpPj4oKCgoZGRyX3BsbD4+MCkmMHgzKT09Myk/KDIpOigoKGRkcl9wbGw+PjApJjB4MykpKSk+PigoKChkZHJfcGxsPj4yKSYweDMpPT0zKT8oMik6KCgoZGRyX3BsbD4+MikmMHgzKSkpKTsKCiNlbHNlCglpZiAoKGRkcl9wbGw+PjkpJjB4MWYpCgkJZGRyX2NsayA9IDIqKCgoMjQgKiAoZGRyX3BsbCYweDFmZikpLygoZGRyX3BsbD4+OSkmMHgxZikpPj4oKGRkcl9wbGw+PjE2KSYweDMpKTsKCiNlbmRpZgoKI2lmIChDT05GSUdfRERSX1BIWSA9PSBQX0REUl9QSFlfREVGQVVMVCkKCWlmICgoZGRyX3BsbD4+OSkmMHgxZikKCQlkZHJfY2xrID0gMiooKDI0ICogKGRkcl9wbGwmMHgxZmYpKS8oKGRkcl9wbGw+PjkpJjB4MWYpKT4+KChkZHJfcGxsPj4xNikmMHgzKTsKI2VuZGlmCgoJcmV0dXJuIGRkcl9jbGs7Cn0KCmludCBkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHVuc2lnbmVkIGludCBkZHJfY2xrKQp7Cgl1bnNpZ25lZCBpbnQgZGRyX3BsbD0weDEwMjIxOwoKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKCWRkcl9wbGw9ZGRyX2Nsa19jb252ZXJ0X3RvX3BsbF9nMTJhKCAgZGRyX2NsaywwKTsKCXJldHVybiBkZHJfcGxsOwojZW5kaWYKCgkvKiBzZXQgZGRyIHBsbCByZWcgKi8KCWlmICgoZGRyX2NsayA+PSA0MCkgJiYgKGRkcl9jbGsgPCA3NTApKSB7CgkJLy8JCQkJCQkJT0QJCQlOCQkJCQlNCgkJZGRyX3BsbD0gKDIgPDwgMTYpIHwgKDEgPDwgOSkgfCAoKCgoZGRyX2Nsay82KSo2KS8xMikgPDwgMCk7Cgl9CgllbHNlIGlmKChkZHJfY2xrID49IDc1MCkgJiYgKGRkcl9jbGsgPCAyMDAwKSkgewoJCS8vCQkJCQkJCU9ECQkJTgkJCQkJTQoJCWRkcl9wbGw9ICgxIDw8IDE2KSB8ICgxIDw8IDkpIHwgKCgoKGRkcl9jbGsvMTIpKjEyKS8yNCkgPDwgMCk7Cgl9CgojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCWRkcl9wbGw9MHgwMDEwNGM1OwoJLyogc2V0IGRkciBwbGwgcmVnICovCgkvKgoJICAgaWYgKChkZHJfY2xrID49IDQwKSAmJiAoZGRyX2NsayA8IDc1MCkpIHsKCS8vCQkJCQkJCU9ECQkJTgkJCQkJTQoJZGRyX3BsbD0gKDIgPDwgMikgfCAoMSA8PCAxNikgfCAoKCgoZGRyX2Nsay82KSo2KS8xMikgPDwgNCk7Cgl9CgllbHNlIGlmKChkZHJfY2xrID49IDc1MCkgJiYgKGRkcl9jbGsgPCAyMDAwKSkgewoJLy8JCQkJCQkJT0QJCQlOCQkJCQlNCglkZHJfcGxsPSAoMSA8PCAyKSB8ICgxIDw8IDE2KSB8ICgoKChkZHJfY2xrLzEyKSoxMikvMjQpIDw8IDQpOwoJfQoJKi8KCWlmICgoZGRyX2NsayA8IDIwMCkpIHsKCQkvLwkJCQkJCQlPRDEJCQlPRAkJCU4JCQkJCU0KCQlkZHJfcGxsPSAoMiA8PCAwKSB8ICgzIDw8IDIpIHwgKDEgPDwgMTYpIHwgKCgoKGRkcl9jbGsqNikvNikvMykgPDwgNCk7Cgl9CgllbHNlIGlmICgoZGRyX2Nsaz49IDIwMCkgJiYgKGRkcl9jbGs8IDQwMCkpIHsKCQkvLwkJCQkJCQlPRDEJCQlPRAkJCU4JCQkJCU0KCQlkZHJfcGxsPSAoMiA8PCAwKSB8ICgxIDw8IDIpIHwgKDEgPDwgMTYpIHwgKCgoKGRkcl9jbGsqNikvNikvNikgPDwgNCk7Cgl9CgllbHNlIGlmICgoZGRyX2Nsaz49IDQwMCkgJiYgKGRkcl9jbGsgPCA4MDApKSB7CgkJLy8JCQkJCQkJT0QxCQkJT0QJCQlOCQkJCQlNCgkJZGRyX3BsbD0gKDEgPDwgMCkgfCAoMSA8PCAyKSB8ICgxIDw8IDE2KSB8ICgoKChkZHJfY2xrKjEyKS8xMikvMTIpIDw8IDQpOwoJfQoJZWxzZSBpZiAoKGRkcl9jbGsgPj0gODAwKSAmJiAoZGRyX2NsayA8IDIwMDApKSB7CgkJLy8JCQkJCQkJT0QxCQkJT0QJCQlOCQkJCQlNCgkJZGRyX3BsbD0gKDAgPDwgMCkgfCAoMSA8PCAyKSB8ICgxIDw8IDE2KSB8ICgoKChkZHJfY2xrKjEyKS8xMikvMjQpIDw8IDQpOwoJfQojZW5kaWYKCiNpZiAoQ09ORklHX0REUl9QSFkgPT0gUF9ERFJfUEhZX0RFRkFVTFQpCgl7CgoKCQlpZiAoKGRkcl9jbGsgPCA3NTApKSB7CgkJCS8vCQlPRAkJCU4JCU0KCQkJZGRyX3BsbD0gKDIgPDwgMTYpIHwgKDEgPDwgOSkgfCAoKChkZHJfY2xrLzI0KSoyKTw8IDApIDsKCQl9CgkJZWxzZSBpZiAoKGRkcl9jbGsgPj0gNzUwKSkgewoJCQkvLwkJT0QJCQlOCQlNCgkJCWRkcl9wbGw9ICgxIDw8IDE2KSB8ICgxIDw8IDkpIHwgKChkZHJfY2xrLzI0KTw8IDApIDsKCQl9CgoJfQojZW5kaWYKCglyZXR1cm4gZGRyX3BsbDsKfQoKaW50IGdldF9kZHJfY2xrKHZvaWQpCnsKCXVuc2lnbmVkIGludCBkZHJfY2xrPTEwOwoJdW5zaWduZWQgaW50IGRkcl9wbGw9MDsKCWlmICgocF9kZHJfYmFzZS0+Y2hpcF9pZCA9PSBNRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgfHwKCQkocF9kZHJfYmFzZS0+Y2hpcF9pZD09TUVTT05fQ1BVX01BSk9SX0lEX0cxMkIpfHwKCQkocF9kZHJfYmFzZS0+Y2hpcF9pZD09TUVTT05fQ1BVX01BSk9SX0lEX1RMMSl8fAoJCShwX2Rkcl9iYXNlLT5jaGlwX2lkPT1NRVNPTl9DUFVfTUFKT1JfSURfU00xKXx8CgkJKHBfZGRyX2Jhc2UtPmNoaXBfaWQ9PU1FU09OX0NQVV9NQUpPUl9JRF9UTTIpfHwKCQkocF9kZHJfYmFzZS0+Y2hpcF9pZD09TUVTT05fQ1BVX01BSk9SX0lEX0MxKXx8CgkJKHBfZGRyX2Jhc2UtPmNoaXBfaWQ9PU1FU09OX0NQVV9NQUpPUl9JRF9TQzIpKQoJewoJCWRkcl9wbGw9cmRfcmVnKHBfZGRyX2Jhc2UtPmRkcl9wbGxfYmFzZV9hZGRyZXNzKTsKCQlkZHJfcGxsPWRkcl9wbGwmMHhmZmZmZjsKCQlkZHJfY2xrPXBsbF9jb252ZXJ0X3RvX2Rkcl9jbGtfZzEyYSggIGRkcl9wbGwpOwoJfQoJZWxzZSBpZiAocF9kZHJfYmFzZS0+Y2hpcF9pZCA9PSBNRVNPTl9DUFVfTUFKT1JfSURfQTEpCgl7CgkJZGRyX2Nsaz03Njg7Cgl9CgllbHNlIGlmIChwX2Rkcl9iYXNlLT5jaGlwX2lkID09IE1FU09OX0NQVV9NQUpPUl9JRF9DMikKCXsKCQkvL3VpbnQzMl90IERSQU1GcmVxPTA7CgkJdWludDMyX3Qgc3RpY2tfc3RvcmVfc3RpY2t5X2YwX3JlZ19iYXNlX3Q9KDB4ZmQwMDAwMDArMHgwMTI4KTsKCQlkZHJfY2xrID0gcmRfcmVnKHN0aWNrX3N0b3JlX3N0aWNreV9mMF9yZWdfYmFzZV90KTsKCX0KCWVsc2UKCXsKCQlkZHJfY2xrPTEwOwoJfQoJcmV0dXJuIGRkcl9jbGs7Ci8vI2VuZGlmCgkvL3JldHVybiBkZHJfY2xrOwp9CnZvaWQgZGRyX21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgdWludDMyX3QgbGVuKQp7CgkvL2VuYWJsZV9tbXVfZWwxX3MoKTsKCS8vcHJpbnRmKCJcbmxlbj09JWQsIixsZW4pOwoJLy9wcmludGYobGVuKTsKCS8vc2VyaWFsX3B1dHMoIlxuIik7CgkvL3VpbnQzMl90IGRkcl90ZXN0X3N0YXJ0X3RpbWVfdXM9Z2V0X3VzX3RpbWUoKTsgIC8vIGNoZWNrIGNvc3QgdGltZQoJLy9jb25zdCBjaGFyICpzID0gc3JjOwoJLy9jaGFyICpkID0gZHN0OwoJbGVuPShsZW4+PjMpOwoJY29uc3QgbG9uZyBsb25nICpzID0gc3JjOwoJbG9uZyBsb25nICpkID0gZHN0OwoJI2lmZGVmIFRFU1RfTDFfQ0FDSEUKCXZvaWQgKmJvdW5kPSh2b2lkICopc3JjKzE2KjEwMjQ7IC8vZGVidWcgZm9yIHRlc3QgTDEgY2FjaGUgLGlmIG9ubHkgcmVhZCB3cml0ZSBzbWFsbCBhcmVhZAoJI2VuZGlmCgkJaWYgKHByZV9mZXRjaF9lbmFibGUpCgkJCXsKCXdoaWxlIChsZW4pCgl7CgkvL2lmKHByZV9mZXRjaF9lbmFibGUpCgkJLy9mb3IgYmVzdCB0ZXN0IGVmZmljaWVuY3kgIG5vdCBpbmNsdWVkIG11Y2ggbW9yZSBjb2RlIGluIHRoZSB3aGlsZSBsb29wCgkJZGRyX3BsZF9jYWNoZShzKSA7CgkJLy8vMSB0aW1lcyAgIGxlbj09MzM1NTQ0MzIgICBjb3B5IHRpbWU9PTE4MTkyIHVzICAgMS4yZyAgYmFuZHdpZHRoIDM2ODhNL1MKCQkvLyA0dGltZXMgICBsZW49PTMzNTU0NDMyICAgY29weSB0aW1lPT0xMTg0NCB1cyAgIDEuMmcgIGJhbmR3aWR0aCA1NjY2TS9TCgkJLy8gOHRpbWVzICAgbGVuPT0zMzU1NDQzMiAgIGNvcHkgdGltZT09MTE4NDQgdXMgICAxLjJnICBiYW5kd2lkdGggNTY2Nk0vUwoJCSpkKysgPSAqcysrOwoJCSpkKysgPSAqcysrOwoJCSpkKysgPSAqcysrOwoJCSpkKysgPSAqcysrOwoJCWxlbj1sZW4tNDsKCQkjaWZkZWYgVEVTVF9MMV9DQUNIRQoJCWlmICgodm9pZCAqKXMgPj1ib3VuZCkKCQkJewoJCQkgIHM9c3JjOwoJCSAgICAgICAgIGQ9ZHN0OwoJCQkgfQoJCSNlbmRpZgoJfQoJCQl9CgllbHNlCgkJewoJd2hpbGUgKGxlbikKCXsgIC8vZm9yIGJlc3QgdGVzdCBlZmZpY2llbmN5ICBub3QgaW5jbHVlZCBtdWNoIG1vcmUgY29kZSBpbiB0aGUgd2hpbGUgbG9vcAoJLy9pZihwcmVfZmV0Y2hfZW5hYmxlKQoKCS8vCWRkcl9wbGRfY2FjaGUocykgOwoJCS8vLzEgdGltZXMgICBsZW49PTMzNTU0NDMyICAgY29weSB0aW1lPT0xODE5MiB1cyAgIDEuMmcgIGJhbmR3aWR0aCAzNjg4TS9TCgkJLy8gNHRpbWVzICAgbGVuPT0zMzU1NDQzMiAgIGNvcHkgdGltZT09MTE4NDQgdXMgICAxLjJnICBiYW5kd2lkdGggNTY2Nk0vUwoJCS8vIDh0aW1lcyAgIGxlbj09MzM1NTQ0MzIgICBjb3B5IHRpbWU9PTExODQ0IHVzICAgMS4yZyAgYmFuZHdpZHRoIDU2NjZNL1MKCQkqZCsrID0gKnMrKzsKCQkqZCsrID0gKnMrKzsKCQkqZCsrID0gKnMrKzsKCQkqZCsrID0gKnMrKzsKCQlsZW49bGVuLTQ7CgkJI2lmZGVmIFRFU1RfTDFfQ0FDSEUKCQlpZiAoKHZvaWQgKilzID49Ym91bmQpCgkJCXsKCQkJICBzPXNyYzsKCQkgICAgICAgICBkPWRzdDsKCQkJIH0KCQkjZW5kaWYKCX0KCQkJfQoJLy8JdWludDMyX3QgZGRyX3Rlc3RfZW5kX3RpbWVfdXM9Z2V0X3VzX3RpbWUoKTsgIC8vIGNoZWNrIGNvc3QgdGltZQoJLy8Jc2VyaWFsX3B1dHMoIlxuY29weSB0aW1lPT0iKTsKCS8vCXNlcmlhbF9wdXRfZGVjKGRkcl90ZXN0X2VuZF90aW1lX3VzLWRkcl90ZXN0X3N0YXJ0X3RpbWVfdXMpOwoJLy8Jc2VyaWFsX3B1dHMoIlxuIik7CgkvL3ByaW50ZigiXG5jb3B5IHRpbWU9PSVkIHVzLCIsKGRkcl90ZXN0X2VuZF90aW1lX3VzLWRkcl90ZXN0X3N0YXJ0X3RpbWVfdXMpKTsKfQoKI2RlZmluZSBQQVRURVJOX01BVFJJWF9YICAgKDMrMzIrMTYrMTcpICAgICAvLzY4KjMyPT0yMTc2IC8vLzIuMmsgLTB4ODgwLTEgbG9vcAojZGVmaW5lIFBBVFRFUk5fTUFUUklYX1kgICgzMikKI2RlZmluZSBQQVRURVJOX01BVFJJWF9MT09QX1NJWkUgICAoKFBBVFRFUk5fTUFUUklYX1gpKihQQVRURVJOX01BVFJJWF9ZKSo0KQoKdW5zaWduZWQgaW50IGNwdV9kZHJfdGVzdF9pbml0X3BhdHRlcm5fZ2VuZXJhdGVyKHVuc2lnbmVkIGludCBhZGRfb2Zmc2V0ICkKewoKCXVuc2lnbmVkIGludCBwYXR0ZXJuX3NlbGVjdD0wOwoJdW5zaWduZWQgaW50IHBhdHRlcm5fdmFsdWU9MDsKCS8vdGVzdF9zaXplPSh0ZXN0X3NpemU+MHgxMDAwMCk/dGVzdF9zaXplOjB4MTAwMDA7CgkvLwl1aW50MzJfdCB3cml0ZV9hZGRyID0gc3RhcnRfYWRkOwoJdWludDMyX3QgbWFydGl4X3hfc2VsZWN0PSAwOwoJdWludDMyX3QgbWFydGl4X3lfc2VsZWN0PSAwOwoJdW5zaWduZWQgaW50IHBhdHRlcm5fdmFsdWVfdGVtcF8xNj0wOwoJewoJCS8vCXVpbnQzMl90IHRlc3RfZW5kX2FkZCA9IHN0YXJ0X2FkZCt0ZXN0X3NpemU7CgkJLy8JZm9yKCh3cml0ZV9hZGRyPXN0YXJ0X2FkZCk7KHdyaXRlX2FkZHI8dGVzdF9lbmRfYWRkKTspCgkJewoJCQlwYXR0ZXJuX3NlbGVjdD0oKGFkZF9vZmZzZXQpJSgoUEFUVEVSTl9NQVRSSVhfWSkqKFBBVFRFUk5fTUFUUklYX1gpKSk7CgkJCW1hcnRpeF94X3NlbGVjdD1wYXR0ZXJuX3NlbGVjdC8oUEFUVEVSTl9NQVRSSVhfWSk7CgkJCW1hcnRpeF95X3NlbGVjdD1wYXR0ZXJuX3NlbGVjdCUoUEFUVEVSTl9NQVRSSVhfWSk7CgkJCS8vd3JpdGVfYWRkcl9uaWJibGVfc3RhcnQ9KCgoKGFkZF9vZmZzZXQvUEFUVEVSTl9NQVRSSVhfWSkvUEFUVEVSTl9NQVRSSVhfWCkpKgoJCQkvLwkoKChQQVRURVJOX01BVFJJWF9ZKSpQQVRURVJOX01BVFJJWF9YKSkpOwoJCQkvL3dyaXRlX2FkZHJfbmliYmxlX3N0YXJ0PSgoKGFkZF9vZmZzZXQpJVBBVFRFUk5fTUFUUklYX1kpJVBBVFRFUk5fTUFUUklYX1gpCgkJCXsKCQkJCWlmIChtYXJ0aXhfeF9zZWxlY3QgPT0gMCkKCQkJCQlwYXR0ZXJuX3ZhbHVlPTB4YWFhYTU1NTU7ICAvL2ZvciAxNiBiaXQgYnVzIHBhdHRlcm4KCgkJCQlpZiAobWFydGl4X3hfc2VsZWN0ID09IDEpCgkJCQkJcGF0dGVybl92YWx1ZT0weDAwMDBmZmZmOyAvL2ZvciAxNiBiaXQgYnVzIHBhdHRlcm4KCgkJCQlpZiAobWFydGl4X3hfc2VsZWN0ID09IDIpCgkJCQkJcGF0dGVybl92YWx1ZT0wOwoKCQkJCWlmICgobWFydGl4X3hfc2VsZWN0PjIpICYmIChtYXJ0aXhfeF9zZWxlY3Q8KDMrMzIpKSkKCQkJCXsKCQkJCQlwYXR0ZXJuX3ZhbHVlPTE8PChtYXJ0aXhfeF9zZWxlY3QtMyk7CgkJCQl9CgkJCQlpZiAoKG1hcnRpeF94X3NlbGVjdD4oMiszMikpICYmIChtYXJ0aXhfeF9zZWxlY3Q8KDMrMzIrMTYpKSkgICAvL2ZvciAxNiBiaXQgYnVzIHBhdHRlcm4KCQkJCXsKCQkJCQlwYXR0ZXJuX3ZhbHVlX3RlbXBfMTY9KDE8PChtYXJ0aXhfeF9zZWxlY3QtMy0zMikpOwoJCQkJCXBhdHRlcm5fdmFsdWU9cGF0dGVybl92YWx1ZV90ZW1wXzE2fCgofnBhdHRlcm5fdmFsdWVfdGVtcF8xNik8PDE2KTsKCQkJCX0KCQkJCWlmICgobWFydGl4X3hfc2VsZWN0PigyKzMyKzE2KSkgJiYgKG1hcnRpeF94X3NlbGVjdDwoMyszMisxNisxNykpKSAgIC8vZm9yIGRiaSBidXMgcGF0dGVybiAgMTcgZ3JvdXAKCQkJCXsKCQkJCQlwYXR0ZXJuX3ZhbHVlX3RlbXBfMTY9KDB4MGYwZisweGYwZioobWFydGl4X3hfc2VsZWN0LTMtMzItMTYpKTsKCQkJCQlwYXR0ZXJuX3ZhbHVlPXBhdHRlcm5fdmFsdWVfdGVtcF8xNnwoKH5wYXR0ZXJuX3ZhbHVlX3RlbXBfMTYpPDwxNik7CgkJCQl9CgkJCX0KCQkJaWYgKG1hcnRpeF95X3NlbGVjdCUyKQoJCQlwYXR0ZXJuX3ZhbHVlPX5wYXR0ZXJuX3ZhbHVlOwoJCX0KCX0KCS8vCXNlcmlhbF9wdXRzKCJcbmNwdV90ZXN0X2Rkcl9kZWJ1ZzQiKTsKCXJldHVybiBwYXR0ZXJuX3ZhbHVlOwp9Cgp2b2lkIGNwdV9kZHJfdGVzdF9pbml0X3BhdHRlcm5fYXJlYSh1bnNpZ25lZCBpbnQgdGVzdF9pbml0X3N0YXJ0LHVuc2lnbmVkIGludCB0ZXN0X3NpemUsdW5zaWduZWQgaW50IHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nICkKewoJLy8JcHJpbnRmKCJcbiAxMTEiKTsKCWlmIChwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZyA9PSAwKQoJcGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmc9MTsgIC8vZm9yIGRpZmZlcmVudCAgZnJlcXVlbmN5IHBhdHRlcm4KCXRlc3Rfc2l6ZT0odGVzdF9zaXplPigoUEFUVEVSTl9NQVRSSVhfTE9PUF9TSVpFKSoocGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmcpKSk/dGVzdF9zaXplOigoUEFUVEVSTl9NQVRSSVhfTE9PUF9TSVpFKSoocGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmcpKTsKCS8vdW5zaWduZWQgaW50IHRlc3Rfc3RhcnQ9MHgxMDgwMDAwOwoJdW5zaWduZWQgaW50IHdyaXRlX2FkZD10ZXN0X2luaXRfc3RhcnQ7Cgl1bnNpZ25lZCBpbnQgc2l6ZV9sb29wPTA7Cgl1bnNpZ25lZCBpbnQgc2l6ZV9sb29wX21heD0wOwoJLy91bnNpZ25lZCBpbnQgY291bnQ9MDsKCWZvciAoOyhzaXplX2xvb3A8KChQQVRURVJOX01BVFJJWF9MT09QX1NJWkUpKihwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZykpKTspCgl7CgkJLy9zZXJpYWxfcHV0cygiXG5jcHVfdGVzdF9kZHJfZGVidWc1Iik7CgoJCS8vCWZvciggIGNvdW50PTA7Y291bnQ8KHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKTspCgkJewoJCQl3cml0ZV9hZGQgPSAodWludDMyX3QpKHNpemVfbG9vcCArIHRlc3RfaW5pdF9zdGFydCk7CgkJCXdyX3JlZygodW5zaWduZWQgbG9uZyl3cml0ZV9hZGQsIGNwdV9kZHJfdGVzdF9pbml0X3BhdHRlcm5fZ2VuZXJhdGVyKChzaXplX2xvb3A+PjIpL3BhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKSk7CgkJCXNpemVfbG9vcD1zaXplX2xvb3ArNDsKCQl9CgkJLy8Jc2VyaWFsX3B1dHMoIlxuY3B1X3Rlc3RfZGRyX2RlYnVnNiIpOwoKCQkvLwlzZXJpYWxfcHV0cygiICIpOwoJCSNpZiAwCgkJc2VyaWFsX3B1dF9oZXgoc2l6ZV9sb29wLDMyKTsKCQlzZXJpYWxfcHV0cygiICIpOwoJCXNlcmlhbF9wdXRfaGV4KGNwdV9kZHJfdGVzdF9pbml0X3BhdHRlcm5fZ2VuZXJhdGVyKHNpemVfbG9vcD4+MiksMzIpOwoJCSNlbmRpZgoJfQoJc2l6ZV9sb29wPTE7CglzaXplX2xvb3BfbWF4PSgodGVzdF9zaXplLygoKFBBVFRFUk5fTUFUUklYX0xPT1BfU0laRSkqKHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKSkpKSsxKTsKCWZvciAoOyhzaXplX2xvb3A8c2l6ZV9sb29wX21heCk7KQoJewoJCS8vCXNlcmlhbF9wdXRzKCJcbmNwdV90ZXN0X2Rkcl9kZWJ1ZzQxIik7CgkJZGRyX21lbWNweSgodm9pZCAqKSh1aW50NjRfdCkodGVzdF9pbml0X3N0YXJ0KygoUEFUVEVSTl9NQVRSSVhfTE9PUF9TSVpFKSoocGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmcpKSooc2l6ZV9sb29wKSksICh2b2lkICopKHVpbnQ2NF90KXRlc3RfaW5pdF9zdGFydCwgKChQQVRURVJOX01BVFJJWF9MT09QX1NJWkUpKihwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZykpKTsKCQkvL3NlcmlhbF9wdXRzKCJcbmNwdV90ZXN0X2Rkcl9kZWJ1ZzQyIik7CgkJc2l6ZV9sb29wKys7Cgl9Cn0KCnVuc2lnbmVkIGludCBjcHVfZGRyX3Rlc3QodW5zaWduZWQgdGVzdF9pbml0X3N0YXJ0LHVuc2lnbmVkIGludCBzdGFydF9hZGQsIHVuc2lnbmVkIGludCB0ZXN0X3NpemUsIHVuc2lnbmVkIGludCB0ZXN0X2RhdGFfYml0X2VuYWJsZSx1bnNpZ25lZCBpbnQgcGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmcpCnsKCS8vcHJpbnRmKCJcbiAxMTEyIik7CgoJdW5zaWduZWQgaW50IHNyY19hZGQ9dGVzdF9pbml0X3N0YXJ0OwoJdW5zaWduZWQgaW50IHBhdHRlcm5fdmFsdWU9MDsKCXVuc2lnbmVkIGludCBzaXplX2xvb3A9MDsKCXVuc2lnbmVkIGludCBkZHJfdGVzdF9lcnJvcj0wOwoJdW5zaWduZWQgaW50IHJlYWRfYWRkPTA7Cgl1bnNpZ25lZCBpbnQgcmVhZF92YWx1ZT0wOwoJdGVzdF9zaXplPSh0ZXN0X3NpemU+MHgyMDAwKT8odGVzdF9zaXplKTooMHgyMDAwKTsKCS8vY3B1X2Rkcl90ZXN0X2luaXRfcGF0dGVybl9hcmVhKHRlc3Rfc2l6ZSk7Cgl1aW50MzJfdCBkZHJfdGVzdF9zdGFydF90aW1lX3VzPWdldF91c190aW1lKCk7ICAvLyBjaGVjayBjb3N0IHRpbWUKCWRkcl9tZW1jcHkoKHZvaWQgKikodWludDY0X3Qpc3RhcnRfYWRkLCAodm9pZCAqKSh1aW50NjRfdClzcmNfYWRkLCB0ZXN0X3NpemUpOwoJdWludDMyX3QgZGRyX3Rlc3RfZW5kX3RpbWVfdXM9Z2V0X3VzX3RpbWUoKTsgIC8vIGNoZWNrIGNvc3QgdGltZQoJcHJpbnRmKCJcbmNwdV9kZHJfdGVzdF90ZXN0X2NvcHlfYmFuZHdpZHRoPT0lZCBNYnl0ZS9zXG4iLCgxKnRlc3Rfc2l6ZSoyKS8oZGRyX3Rlc3RfZW5kX3RpbWVfdXMtZGRyX3Rlc3Rfc3RhcnRfdGltZV91cykpOwoKCWZvciAoO3NpemVfbG9vcDwodGVzdF9zaXplKTspCgl7CgkJcmVhZF9hZGQgPSAodWludDMyX3QpKHNpemVfbG9vcCArIHN0YXJ0X2FkZCk7CgkJcmVhZF92YWx1ZT0ocmRfcmVnKCh1bnNpZ25lZCBsb25nKXJlYWRfYWRkKSk7CgkJcGF0dGVybl92YWx1ZT0oIGNwdV9kZHJfdGVzdF9pbml0X3BhdHRlcm5fZ2VuZXJhdGVyKChzaXplX2xvb3A+PjIpL3BhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKSk7CgkJaWYgKCgodGVzdF9kYXRhX2JpdF9lbmFibGUpJnJlYWRfdmFsdWUpICE9ICgodGVzdF9kYXRhX2JpdF9lbmFibGUpJnBhdHRlcm5fdmFsdWUpKQoJCXsKCQkJI2lmIDEKCQkJcHJpbnRmKCJlcnJvciBkYXRhICBlbmFibGUgJTA4eCByZWFkX3ZhbHVlICUwOHggIHBhdHRlcm5fdmFsdWUgJTA4eCIsdGVzdF9kYXRhX2JpdF9lbmFibGUscmVhZF92YWx1ZSxwYXR0ZXJuX3ZhbHVlKTsKCQkJI2lmIDAKCQkJc2VyaWFsX3B1dHMoIlxuZXJyb3IgZGF0YSAiKTsKCQkJc2VyaWFsX3B1dF9oZXgodGVzdF9kYXRhX2JpdF9lbmFibGUsMzIpOwoJCQlzZXJpYWxfcHV0cygiICIpOwoJCQlzZXJpYWxfcHV0X2hleChyZWFkX3ZhbHVlLDMyKTsKCQkJc2VyaWFsX3B1dHMoIiAiKTsKCQkJc2VyaWFsX3B1dF9oZXgocGF0dGVybl92YWx1ZSwzMik7CgkJCXNlcmlhbF9wdXRzKCJcbiIpOwoJCQkjZW5kaWYKCQkJI2VuZGlmCgkJCWRkcl90ZXN0X2Vycm9yKys7CgkJCXJldHVybiBkZHJfdGVzdF9lcnJvcjsKCQl9CgkJc2l6ZV9sb29wPXNpemVfbG9vcCsoMTw8Mik7Ly8gdXNlIGJpZyBzdGVwIHdpbGwgZmFzdCB0ZXN0ICxidXQgbG9zZSBhY2N1cmFjeS4KCX0KCS8vcHJpbnRmKCJcbiAxMTE0Iik7CglyZXR1cm4gZGRyX3Rlc3RfZXJyb3I7Cn0KCmludCBkb19jcHVfZGRyX3Rlc3QgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJY2hlY2tfYmFzZV9hZGRyZXNzKCk7CgkvL2Rkcl9jcHVfdGVzdCAweDEwODAwMDAgMHgxMDAwMDAwMCAweDIwMDAwMDAgMHhmZmZmZmZmZiAxMCAgLy9zaXplIGRvIG5vdCBvdmVybGFwCglpbnQgaT0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoJdW5zaWduZWQgaW50IGluaXRfc3RhcnRfYWRkPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9hZGQ9MDsKCXVuc2lnbmVkIGludCB0ZXN0X3NpemU9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2RhdGFfYml0X2VuYWJsZT0wOwoJdW5zaWduZWQgaW50IHRlc3RfbG9vcHM9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2xvb3A9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2Vycm9ycz0wOwoJdW5zaWduZWQgaW50IHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nID0xOwoJY2hhciAqZW5kcDsKCWlmIChhcmdjID09IDEpCgkJcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoJZWxzZQoJewoJCWlmIChhcmdjID49IDIpCgkJewoJCQkvLyB6cTBwcjAgPSBhcmd2WzFdOwoJCQlpbml0X3N0YXJ0X2FkZD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJfQoKCQlpZiAoYXJnYyA+PSAzKQoJCXsKCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJdGVzdF9hZGQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCX0KCQlpZiAoYXJnYyA+PSA0KQoJCXsKCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJdGVzdF9zaXplPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQl9CgkJaWYgKGFyZ2MgPj0gNSkKCQl7CgkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCXRlc3RfZGF0YV9iaXRfZW5hYmxlPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQl9CgkJaWYgKGFyZ2MgPj0gNikKCQl7CgkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCXRlc3RfbG9vcHM9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCQlpZiAodGVzdF9sb29wcyA9PSAwKQoJCQl0ZXN0X2xvb3BzPTE7CgkJfQoJCWlmIChhcmdjID49IDcpCgkJewoJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQlwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZz0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMCk7CgkJCWlmIChwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZyA9PSAwKQoJCQlwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZz0xOwoJCX0KCQlpZiAoYXJnYyA+PSA4KQoJCXsKCQkJcHJlX2ZldGNoX2VuYWJsZT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzddLCAmZW5kcCwgMCk7CgoJCX0KCX0KCXVpbnQzMl90IGRkcl90ZXN0X3N0YXJ0X3RpbWVfdXM9Z2V0X3VzX3RpbWUoKTsgIC8vIGNoZWNrIGNvc3QgdGltZQoJY3B1X2Rkcl90ZXN0X2luaXRfcGF0dGVybl9hcmVhKGluaXRfc3RhcnRfYWRkLHRlc3Rfc2l6ZSxwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZyk7Cglmb3IgKHRlc3RfbG9vcD0wO3Rlc3RfbG9vcDx0ZXN0X2xvb3BzOykKCXsKCQl0ZXN0X2Vycm9ycz10ZXN0X2Vycm9ycytjcHVfZGRyX3Rlc3QoaW5pdF9zdGFydF9hZGQsdGVzdF9hZGQsdGVzdF9zaXplLHRlc3RfZGF0YV9iaXRfZW5hYmxlLHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKTsKCQl0ZXN0X2xvb3ArKzsKCQlwcmludGYoIlxuY3B1X2Rkcl90ZXN0X3Rlc3RfdGltZXM9PSVkICB0ZXN0X2Vycm9ycz09JWQiLHRlc3RfbG9vcCx0ZXN0X2Vycm9ycyk7Cgl9Cgl1aW50MzJfdCBkZHJfdGVzdF9lbmRfdGltZV91cz1nZXRfdXNfdGltZSgpOyAgLy8gY2hlY2sgY29zdCB0aW1lCglwcmludGYoIlxuY3B1X2Rkcl90ZXN0X3Rlc3RfYW5kIGNvbXBhcmVfYmFuZHdpZHRoPT0lZCBNYnl0ZS9zXG4iLCh0ZXN0X2xvb3BzKnRlc3Rfc2l6ZSoyKS8oZGRyX3Rlc3RfZW5kX3RpbWVfdXMtZGRyX3Rlc3Rfc3RhcnRfdGltZV91cykpOwoJcmV0dXJuIHRlc3RfZXJyb3JzOwp9ClVfQk9PVF9DTUQoCglkZHJfY3B1X3Rlc3QsCTMwLAkxLAlkb19jcHVfZGRyX3Rlc3QsCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiIsCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiBcbiBkY2FjaGUgb2ZmID8gXG4iCgkpOwoKaW50IGRvX2Rkcl90ZXN0X3dyaXRlX3JlYWQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJLy8vKgoJewoJCXByaW50ZigiXG5FbnRlciBkb19kZHJfdGVzdF9kZHJfd3JpdGVfcmVhZF9jdXJyZW50XG4iKTsKCQkvLyAgIGlmKCFhcmdjKQoJCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJCWludCBpPTA7CgkJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCQl7CgkJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJCX0KCgkJY2hhciAqZW5kcDsKCgkJdW5zaWduZWQgaW50IHBhdHRlcm5faWQ9MTsKCQl1bnNpZ25lZCBpbnQgcGF0dGVybls0XSA9ezB9OwoJCXVuc2lnbmVkIGludCB3cml0ZV9yZWFkPTA7CgkJdW5zaWduZWQgaW50IHJlYWRfcGF0dGVybls0XT17MH0gOwoJCXVuc2lnbmVkIGludCBsb29wPTE7CgkJdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCQl1bnNpZ25lZCBpbnQgIHRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgkJdW5zaWduZWQgaW50ICBjb3B5X29mZnNldD0gRERSX1RFU1RfU0laRTsKCQl1bnNpZ25lZCBpbnQgIG5vX3Nob3dfaW5mbz0gMDsKCQl1bnNpZ25lZCBpbnQgIHVzX2RlbGF5X2NvdW50ZXI9IDA7CgoKCQlpZiAoYXJnYyA9PSAxKQoJCQlwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgkJZWxzZSB7CgkJCWlmIChhcmdjID49IDIpCgkJCXsKCQkJCS8vIHpxMHByMCA9IGFyZ3ZbMV07CgkJCQl3cml0ZV9yZWFkPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQkJfQoKCQkJaWYgKGFyZ2MgPj0gMykKCQkJewoJCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJCXBhdHRlcm5faWQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCQl9CgkJCWlmIChhcmdjID49IDQpCgkJCXsKCQkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCQlsb29wPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQkJfQoJCQlpZiAoYXJnYyA+PTUpCgkJCXsKCQkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCQlzdGFydF9hZGRyPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQkJfQoJCQlpZiAoYXJnYyA+PTYpCgkJCXsKCQkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCQl0ZXN0X3NpemU9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCQl9CgkJCWlmIChhcmdjID49NykKCQkJewoJCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJCW5vX3Nob3dfaW5mbz0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMCk7CgkJCX0KCQkJaWYgKGFyZ2MgPj04KQoJCQl7CgkJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQkJdXNfZGVsYXlfY291bnRlcj0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzddLCAmZW5kcCwgMCk7CgkJCX0KCQl9CgkJcHJpbnRmKCJcbndyaXRlX3JlYWQ9PSAweCUwOGRcbiIsIHdyaXRlX3JlYWQpOwoJCXByaW50ZigiXG5wYXR0ZXJuX2lkPT0gMHglMDhkXG4iLCBwYXR0ZXJuX2lkKTsKCQlwcmludGYoIlxubG9vcD09IDB4JTA4ZFxuIiwgbG9vcCk7CgkJcHJpbnRmKCJcbnN0YXJ0X2FkZHI9PSAweCUwOHhcbiIsIHN0YXJ0X2FkZHIpOwoJCXByaW50ZigiXG50ZXN0X3NpemU9PSAweCUwOHhcbiIsIHRlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcbnVzX2RlbGF5X2NvdW50ZXI9PSAlZFxuIiwgdXNfZGVsYXlfY291bnRlcik7CgkJY29weV9vZmZzZXQ9dGVzdF9zaXplOwoKCQl1bnNpZ25lZCBpbnQgICpwOwoJCXVuc2lnbmVkIGludCAgIGo7CgoKCQlwID0gKHVuc2lnbmVkIGludCAgKiApKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpOwoKCQlpZiAocGF0dGVybl9pZCA9PSAwKQoJCXsKCQkJcGF0dGVyblswXT0wOwoJCQlwYXR0ZXJuWzFdPTA7CgkJCXBhdHRlcm5bMl09MDsKCQkJcGF0dGVyblszXT0wOwoJCX0KCQlpZiAocGF0dGVybl9pZCA9PSAxKQoJCXsKCQkJcGF0dGVyblswXT0weGZmZmZmZmZmOwoJCQlwYXR0ZXJuWzFdPTB4ZmZmZmZmZmY7CgkJCXBhdHRlcm5bMl09MHhmZmZmZmZmZjsKCQkJcGF0dGVyblszXT0weGZmZmZmZmZmOwoJCX0KCgoJCWRvCgkJewoJCQlpZiAod3JpdGVfcmVhZCA9PSAwKQoJCQl7CgkJCQlpZiAoIW5vX3Nob3dfaW5mbykKCQkJCQlwcmludGYoIlxubG9vcDoweCUwOHg6U3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBsb29wLHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJCQkJZm9yIChqPTA7ajx0ZXN0X3NpemUvNDspCgkJCQl7CgkJCQkJKihwK2opPShwYXR0ZXJuWzBdKTsKCQkJCQkqKHAraisxKT0ocGF0dGVyblsxXSk7CgkJCQkJKihwK2orMik9KHBhdHRlcm5bMl0pOwoJCQkJCSoocCtqKzMpPShwYXR0ZXJuWzNdKTsKCQkJCQlqPWorNDsKCQkJCX0KCQkJfQoJCQlpZiAod3JpdGVfcmVhZCA9PSAxKQoJCQl7CgkJCQlpZiAoIW5vX3Nob3dfaW5mbykKCQkJCQlwcmludGYoIlxubG9vcDoweCUwOHg6U3RhcnQgcmVhZGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBsb29wLHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJCQkJZm9yIChqPTA7ajx0ZXN0X3NpemUvNDspCgkJCQl7CgkJCQkJcmVhZF9wYXR0ZXJuWzBdPSAqKHAraik7CgkJCQkJcmVhZF9wYXR0ZXJuWzFdPSAqKHAraisxKTsKCQkJCQlyZWFkX3BhdHRlcm5bMl09KihwK2orMik7CgkJCQkJcmVhZF9wYXR0ZXJuWzNdPSAqKHAraiszKTsKCQkJCQlqPWorNDsKCQkJCX0KCQkJCWlmIChsb29wID09IDEpIHsKCQkJCQlpZiAoIW5vX3Nob3dfaW5mbykKCQkJCQkJcHJpbnRmKCIgXG5sb29wOjB4JTA4eDpTdGFydCByZWFkaW5nIHJlYWRfcGF0dGVyblswXSAweCUwOHgsIHBhdHRlcm5bMV0gMHglMDh4LHBhdHRlcm5bMl0gMHglMDh4LHBhdHRlcm5bM10gMHglMDh4IiwKCQkJCQkJCQlsb29wLHJlYWRfcGF0dGVyblswXSwgcmVhZF9wYXR0ZXJuWzFdLHJlYWRfcGF0dGVyblsyXSxyZWFkX3BhdHRlcm5bM10KCQkJCQkJCSAgKTsgIH0KCQkJfQoJCQlpZiAod3JpdGVfcmVhZCA9PSAyKQoJCQl7CgkJCQlpZiAoIW5vX3Nob3dfaW5mbykKCQkJCQlwcmludGYoIlxubG9vcDoweCUwOHg6U3RhcnQgY29weWluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBsb29wLHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJCQkJZm9yIChqPTA7ajx0ZXN0X3NpemUvNDspCgkJCQl7CgkJCQkJKihwK2orY29weV9vZmZzZXQvNCk9ICoocCtqKTsKCQkJCQkqKHAraisxK2NvcHlfb2Zmc2V0LzQpPSAqKHAraisxKTsKCQkJCQkqKHAraisyK2NvcHlfb2Zmc2V0LzQpPSAqKHAraisyKTsKCQkJCQkqKHAraiszK2NvcHlfb2Zmc2V0LzQpPSAqKHAraiszKTsKCQkJCQlqPWorNDsKCQkJCX0KCQkJfQoJCQlpZiAodXNfZGVsYXlfY291bnRlcikKCQkJewoJCQkJZGRyX3VkZWxheSh1c19kZWxheV9jb3VudGVyKTsKCQkJfQoJCX13aGlsZShsb29wLS0pOwoKCQlwcmludGYoIlxudGVzdCBlbmRcbiIpOwoKCQlyZXR1cm4gMTsKCX0KCS8vKi8KfQoKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKCiNkZWZpbmUgVEVTVF9NSU5fRERSX0VFX1ZPTFRBR0UgIDY4MQojZGVmaW5lIFRFU1RfTUFYX0REUl9FRV9WT0xUQUdFICA5NjIKLy8jZGVmaW5lICAgIChwX2Rkcl9iYXNlLT5lZV9wd21fYmFzZV9hZGRyZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweGZmODA3MDAwICsgKDB4MDAxIDw8IDIpKQpzdGF0aWMgaW50IHB3bV92b2x0YWdlX3RhYmxlX2VlW11bMl0gPQp7Cgl7IDB4MWMwMDAwLCAgNjgxfSwKCXsgMHgxYjAwMDEsICA2OTF9LAoJeyAweDFhMDAwMiwgIDcwMX0sCgl7IDB4MTkwMDAzLCAgNzExfSwKCXsgMHgxODAwMDQsICA3MjF9LAoJeyAweDE3MDAwNSwgIDczMX0sCgl7IDB4MTYwMDA2LCAgNzQxfSwKCXsgMHgxNTAwMDcsICA3NTF9LAoJeyAweDE0MDAwOCwgIDc2MX0sCgl7IDB4MTMwMDA5LCAgNzcyfSwKCXsgMHgxMjAwMGEsICA3ODJ9LAoJeyAweDExMDAwYiwgIDc5Mn0sCgl7IDB4MTAwMDBjLCAgODAyfSwKCXsgMHgwZjAwMGQsICA4MTJ9LAoJeyAweDBlMDAwZSwgIDgyMn0sCgl7IDB4MGQwMDBmLCAgODMyfSwKCXsgMHgwYzAwMTAsICA4NDJ9LAoJeyAweDBiMDAxMSwgIDg1Mn0sCgl7IDB4MGEwMDEyLCAgODYyfSwKCXsgMHgwOTAwMTMsICA4NzJ9LAoJeyAweDA4MDAxNCwgIDg4Mn0sCgl7IDB4MDcwMDE1LCAgODkyfSwKCXsgMHgwNjAwMTYsICA5MDJ9LAoJeyAweDA1MDAxNywgIDkxMn0sCgl7IDB4MDQwMDE4LCAgOTIyfSwKCXsgMHgwMzAwMTksICA5MzJ9LAoJeyAweDAyMDAxYSwgIDk0Mn0sCgl7IDB4MDEwMDFiLCAgOTUyfSwKCXsgMHgwMDAwMWMsICA5NjJ9Cn07CnVpbnQzMl90IGZpbmRfdmRkZWVfdm9sdGFnZV9pbmRleCh1bnNpZ25lZCBpbnQgdGFyZ2V0X3ZvbHRhZ2UpCnsKCXVuc2lnbmVkIGludCB0bzsKCWZvciAodG8gPSAwOyB0byA8IEFSUkFZX1NJWkUocHdtX3ZvbHRhZ2VfdGFibGVfZWUpOyB0bysrKSB7CgkJaWYgKHB3bV92b2x0YWdlX3RhYmxlX2VlW3RvXVsxXSA+PSB0YXJnZXRfdm9sdGFnZSkgewoJCQlicmVhazsKCQl9Cgl9CglpZiAodG8gPj0gQVJSQVlfU0laRShwd21fdm9sdGFnZV90YWJsZV9lZSkpIHsKCQl0byA9IEFSUkFZX1NJWkUocHdtX3ZvbHRhZ2VfdGFibGVfZWUpIC0gMTsKCX0KCXJldHVybiB0bzsKfQoKdm9pZCBzZXRfZWVfdm9sdGFnZSh1aW50MzJfdCBlZV9vdmVyX3JpZGVfdm9sdGFnZSkKewoJdW5zaWduZWQgaW50IHRvOwoJZm9yICh0byA9ICAoQVJSQVlfU0laRShwd21fdm9sdGFnZV90YWJsZV9lZSkpOyggdG8gPjApOyB0by0tKSB7CgkJaWYgKChwd21fdm9sdGFnZV90YWJsZV9lZVt0by0xXVsxXTxlZV9vdmVyX3JpZGVfdm9sdGFnZSkgJiYgKHB3bV92b2x0YWdlX3RhYmxlX2VlW3RvXVsxXSA+PSBlZV9vdmVyX3JpZGVfdm9sdGFnZSkpIHsKCQkJYnJlYWs7CgkJfQoJfQoJaWYgKGVlX292ZXJfcmlkZV92b2x0YWdlKSB7CgkJd3JpdGVsKHB3bV92b2x0YWdlX3RhYmxlX2VlW3RvXVswXSwocF9kZHJfYmFzZS0+ZWVfcHdtX2Jhc2VfYWRkcmVzcykpOwoJCXByaW50ZiAoIlxuRERSX292ZXJpZGVfRUVfdm9sdGFnZSA9PSVkIG12IC9uIixwd21fdm9sdGFnZV90YWJsZV9lZVt0by0xXVsxXSk7Cgl9Cn0KCnVuc2lnbmVkIGludCByZWFkX2VlX3ZvbHRhZ2Uodm9pZCkKewoJdW5zaWduZWQgaW50IHRvOwoJdW5zaWduZWQgaW50IHJlZ192YWx1ZT0wOwoJcmVnX3ZhbHVlPXJlYWRsKChwX2Rkcl9iYXNlLT5lZV9wd21fYmFzZV9hZGRyZXNzKSk7Cgl0bz1yZWdfdmFsdWUmMHhmZjsKCXJldHVybiBwd21fdm9sdGFnZV90YWJsZV9lZVt0b11bMV07Cn0KCnVpbnQzMl90IGdldF9iZGxyXzEwMHN0ZXAodWludDMyX3QgZGRyX2ZyZXF1ZW5jeSkKewoJdWludDMyX3QgYmRscl8xMDBzdGVwPTA7CglpZiAocF9kZHJfYmFzZS0+Y2hpcF9pZCA9PSBNRVNPTl9DUFVfTUFKT1JfSURfQzIpCgl7CgkJYmRscl8xMDBzdGVwPWRvX3JlYWRfYzJfZGRyX2JkbHJfc3RlcHMoKTsKCX0KCWVsc2UKCXsKCQkvL3VpbnQzMl90IHBzPTA7CgkJLy9wcz0ocmRfcmVnKERNQ19EUkFNX0ZSRVFfQ1RSTCkpJjE7CgkJZHdjX2RkcnBoeV9hcGJfd3IoKCgoKDA8PDIwKXwoMjw8MTYpfCgwPDwxMil8KDB4ZTMpKSkpLDB4YzAwKTsKCQliZGxyXzEwMHN0ZXA9KDEwMDAwMDAwMC8oMipkZHJfZnJlcXVlbmN5KSkvKChkd2NfZGRycGh5X2FwYl9yZCgoKCgwPDwyMCl8KDI8PDE2KXwoMDw8MTIpfCgweGU0KSkpKSkmMHgzZmYpOwoJfQoJcmV0dXJuIGJkbHJfMTAwc3RlcDsKfQoKaW50IGRvX2Rkcl90ZXN0X3B3bV9iZGxyIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCWNoYXIgKmVuZHA7CglwcmludGYoIlxuRW50ZXIgZzEyIGRvX2Rkcl90ZXN0X3B3bV9iZGwgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJaW50IGk9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCgkvL2lmIChhcmdjIDwgMikKCS8vCWdvdG8gdXNhZ2U7CgoKCXVuc2lnbmVkIGludCBhcmdjX2NvdW50PTE7Cgl1bnNpZ25lZCBpbnQgIHBhcmFfbWV0ZXJbMzBdPXswLDAsMCwwLDAsIDAsMCwwLDAsMCwgMCwwLDAsMCwwLCAwLDAsMCwwLDAsIDAsMCwwLDAsMCwgMCwwLDAsMCwwLH07Cgl3aGlsZSAoYXJnY19jb3VudDxhcmdjKQoJe3BhcmFfbWV0ZXJbYXJnY19jb3VudC0xXT0gc2ltcGxlX3N0cnRvdWwoYXJndlthcmdjX2NvdW50XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlthcmdjX2NvdW50XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJcGFyYV9tZXRlclthcmdjX2NvdW50LTFdID0gMDsKCQl9CgkJYXJnY19jb3VudCsrOwoJfQoKCS8vdWludDMyX3QgaWQ9cGFyYV9tZXRlclswXTsKCS8vdWludDMyX3Qgdm9sdGFnZT1wYXJhX21ldGVyWzFdOwoJdWludDMyX3QgbG9vcD1wYXJhX21ldGVyWzBdOwoJdWludDMyX3Qgdm9sdGFnZV9taW49cGFyYV9tZXRlclsxXTsKCXVpbnQzMl90IHZvbHRhZ2VfbWF4PXBhcmFfbWV0ZXJbMl07Cgl1aW50MzJfdCBzaG93X2NvdW50X21lc3NhZ2U9cGFyYV9tZXRlclszXTsKCgkvLyNkZWZpbmUgUFdNX0lEX0RFRkFVTFQgICAwPDwwCgkvLyNkZWZpbmUgUFdNX1ZPTFRBR0VfREVGQVVMVCAgIDgwMDw8MAoJI2RlZmluZSBQV01fTE9PUF9ERUZBVUxUICAgMTA8PDAKCSNkZWZpbmUgUFdNX1ZPTFRBR0VfTUlOX0RFRkFVTFQgICBURVNUX01JTl9ERFJfRUVfVk9MVEFHRQoJI2RlZmluZSBQV01fVk9MVEFHRV9NQVhfREVGQVVMVCAgIFRFU1RfTUFYX0REUl9FRV9WT0xUQUdFCgoKCS8vaWQ9aWQ/aWQ6UFdNX0lEX0RFRkFVTFQ7CgkvL3ZvbHRhZ2U9dm9sdGFnZT92b2x0YWdlOlBXTV9WT0xUQUdFX0RFRkFVTFQ7Cglsb29wPWxvb3A/bG9vcDpQV01fTE9PUF9ERUZBVUxUOwoJdm9sdGFnZV9taW49KHZvbHRhZ2VfbWluPFBXTV9WT0xUQUdFX01JTl9ERUZBVUxUKT9QV01fVk9MVEFHRV9NSU5fREVGQVVMVDp2b2x0YWdlX21pbjsKCXZvbHRhZ2VfbWF4PSh2b2x0YWdlX21heD5QV01fVk9MVEFHRV9NQVhfREVGQVVMVCk/UFdNX1ZPTFRBR0VfTUFYX0RFRkFVTFQ6dm9sdGFnZV9tYXg7Cgl2b2x0YWdlX21heD0odm9sdGFnZV9tYXg8UFdNX1ZPTFRBR0VfTUlOX0RFRkFVTFQpP1BXTV9WT0xUQUdFX01BWF9ERUZBVUxUOnZvbHRhZ2VfbWF4OwoKCS8vCSAgcHJpbnRmKCJcbnZvbHRhZ2VfbWluPSVkXG4iLHZvbHRhZ2VfbWluKTsKCS8vCSAgCQkgIHByaW50ZigiXG52b2x0YWdlX21heD0lZFxuIix2b2x0YWdlX21heCk7Cgl1aW50MTZfdCBiZGxyXzEwMF9taW49MDsKCXVpbnQxNl90IGJkbHJfMTAwX2F2ZXJhZ2U9MDsKCXVpbnQxNl90IGJkbHJfMTAwX21heD0wOwoJdWludDE2X3QgYmRscl8xMDBfY3VyPTA7CgkvL3VpbnQxNl90IGN1cl9kZHJfZnJlcXVlbmN5PTA7Cgl1aW50MzJfdCBjb3VudD0xOwoKCWJkbHJfMTAwX2N1cj1nZXRfYmRscl8xMDBzdGVwKGdsb2JhbF9kZHJfY2xrKTsKCWJkbHJfMTAwX21pbj1iZGxyXzEwMF9jdXI7CgliZGxyXzEwMF9tYXg9YmRscl8xMDBfY3VyOwoJYmRscl8xMDBfYXZlcmFnZT1iZGxyXzEwMF9jdXI7CgoJdW5zaWduZWQgaW50IHRvPTA7Cgl1bnNpZ25lZCBpbnQgdG9fbWluPTA7Cgl1bnNpZ25lZCBpbnQgdG9fbWF4PShBUlJBWV9TSVpFKHB3bV92b2x0YWdlX3RhYmxlX2VlKSktMTsKCS8vdW5zaWduZWQgaW50IHRlbXBfY291bnQ9MDsKCXByaW50ZigiXG5yZWFkIG9yZ19FRV92b2x0YWdlICVkIG12IFxuIixyZWFkX2VlX3ZvbHRhZ2UoKSk7Cgl0b19taW49ZmluZF92ZGRlZV92b2x0YWdlX2luZGV4KHZvbHRhZ2VfbWluKTsKCXRvX21heD1maW5kX3ZkZGVlX3ZvbHRhZ2VfaW5kZXgodm9sdGFnZV9tYXgpOwoJZm9yICh0byA9KHRvX21heCsxKSAgOyggdG8gPnRvX21pbik7IHRvLS0pIHsKCQkvLyAgcHJpbnRmKCJcblRPPSVkXG4iLHRvKTsKCQl3cml0ZWwocHdtX3ZvbHRhZ2VfdGFibGVfZWVbdG8tMV1bMF0sKHBfZGRyX2Jhc2UtPmVlX3B3bV9iYXNlX2FkZHJlc3MpKTsKCQl1ZGVsYXkoMTAwMCk7CgkJYmRscl8xMDBfY3VyPWdldF9iZGxyXzEwMHN0ZXAoZ2xvYmFsX2Rkcl9jbGspOwoJCWJkbHJfMTAwX21pbj1iZGxyXzEwMF9jdXI7CgkJYmRscl8xMDBfbWF4PWJkbHJfMTAwX2N1cjsKCQliZGxyXzEwMF9hdmVyYWdlPWJkbHJfMTAwX2N1cjsKCQljb3VudD0xOwoKCQkvLwlwcmludGYoIlxuRERSX3NldCBFRV92b2x0YWdlICVkICBiZGxyXzEwMF9hdmVyYWdlICVkICBiZGxyXzEwMF9taW4gJWQgYmRscl8xMDBfbWF4ICVkIGNvdW50ICVkLGJkbHJfMTAwX2N1ciAlZCBcbiIscHdtX3ZvbHRhZ2VfdGFibGVfZWVbdG8tMV1bMV0sCgkJLy9iZGxyXzEwMF9hdmVyYWdlLGJkbHJfMTAwX21pbixiZGxyXzEwMF9tYXgsY291bnQsYmRscl8xMDBfY3VyKTsKCgkJZG8gewoJCQliZGxyXzEwMF9jdXI9KDEwMDAwMDAwMC8oMipnbG9iYWxfZGRyX2NsaykpLygoZHdjX2RkcnBoeV9hcGJfcmQoKCgoMDw8MjApfCgyPDwxNil8KDA8PDEyKXwoMHhlNCkpKSkpJjB4M2ZmKTsKCQkJYmRscl8xMDBfbWluPShiZGxyXzEwMF9jdXI8YmRscl8xMDBfbWluKT9iZGxyXzEwMF9jdXI6YmRscl8xMDBfbWluOwoJCQliZGxyXzEwMF9tYXg9KGJkbHJfMTAwX2N1cj5iZGxyXzEwMF9tYXgpP2JkbHJfMTAwX2N1cjpiZGxyXzEwMF9tYXg7CgkJCWJkbHJfMTAwX2F2ZXJhZ2U9KGJkbHJfMTAwX2N1citiZGxyXzEwMF9hdmVyYWdlKmNvdW50KS8oY291bnQrMSk7CgkJCWNvdW50Kys7CgkJCWlmIChzaG93X2NvdW50X21lc3NhZ2UpCgkJCQlwcmludGYoIiVkXG4iLGJkbHJfMTAwX2N1cik7CgoJCX13aGlsZShjb3VudDxsb29wKTsKCQlwcmludGYoIlxuRERSX3NldCBFRV92b2x0YWdlICVkICBiZGxyXzEwMF9hdmVyYWdlICVkICBiZGxyXzEwMF9taW4gJWQgYmRscl8xMDBfbWF4ICVkIGNvdW50ICVkIixwd21fdm9sdGFnZV90YWJsZV9lZVt0by0xXVsxXSwKCQkJCWJkbHJfMTAwX2F2ZXJhZ2UsYmRscl8xMDBfbWluLGJkbHJfMTAwX21heCxjb3VudCk7Cgl9CglyZXR1cm4gMTsKfQoKCmludCBwcmludGZfbG9nKGNoYXIgbG9nX2xldmVsLGNvbnN0IGNoYXIgKiBmbXQsLi4uKQp7CglpZiAobG9nX2xldmVsPDEpCgl7CgkJdmFfbGlzdCBhcmdzOwoJCXZhX3N0YXJ0KGFyZ3MsZm10KTsKCQl2cHJpbnRmKGZtdCxhcmdzKTsgIC8vCgkJdmFfZW5kKGFyZ3MpOwoJCXJldHVybiAwOwoJfQoJZWxzZQoJCXJldHVybiAxOwp9CmludCBkb19yZWFkX2Rkcl90cmFpbmluZ19kYXRhKGNoYXIgbG9nX2xldmVsLGRkcl9zZXRfdCAqZGRyX3NldF90X3ApCnsKCi8vCWRkcl9zZXRfdCAqZGRyX3NldF90X3A9TlVMTDsKLy8JZGRyX3NldF90X3A9KGRkcl9zZXRfdCAqKShkZHJfc2V0X3RfcF9hcnJhcnkpOwoJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuZGRyX3NldF90X3A9PTB4JTA4eFxuIiwodWludDMyX3QpKHVpbnQ2NF90KShkZHJfc2V0X3RfcCkpOwoJdWludDMyX3QgbG9vcD0wOwoJdWludDMyX3QgbG9vcF9tYXggPSAoNCsoMHgzZjw8MikpOy8vKChETUNfU1RJQ0tZXzYzLURNQ19TVElDS1lfMCkpOwoJLy8JbG9vcF9tYXg9c2l6ZW9mKGRkcl9zZXRfdCk7Cglmb3IgKGxvb3AgPSAwOyBsb29wIDxsb29wX21heDsgbG9vcCs9NCkgewoJCXdyX3JlZygoKHVpbnQ2NF90KShkZHJfc2V0X3RfcCkgKyBsb29wKSwgcmRfcmVnKChwX2Rkcl9iYXNlLT5kZHJfZG1jX3N0aWNreTApICsgbG9vcCkpOwoJfQoKCWZvciAobG9vcCA9IDA7IGxvb3AgPE1FU09OX0NQVV9DSElQX0lEX1NJWkU7IGxvb3ArKykgICAvL3VwZGF0ZSBjaGlwIGlkCgl7CgkJZGRyX3NoYS5zaGFfY2hpcF9pZFtsb29wXT1nbG9iYWxfY2hpcF9pZFtsb29wXTsKCX0KCXsKCQl1aW50MTZfdAlkcV9iaXRfZGVsYXlbNzJdOwoJCXVuc2lnbmVkCWNoYXIgdF9jb3VudD0wOwoJCXVpbnQxNl90CWRlbGF5X29yZz0wOwoJCXVpbnQxNl90CWRlbGF5X3RlbXA9MDsKCQl1aW50MzJfdAlhZGRfb2Zmc2V0PTA7CgkJZHdjX2RkcnBoeV9hcGJfd3IoMHhkMDAwMCwweDApOwoJCWJkbHJfMTAwc3RlcD1nZXRfYmRscl8xMDBzdGVwKGdsb2JhbF9kZHJfY2xrKTsKCQl1aV8xXzMyXzEwMHN0ZXA9KDEwMDAwMDAqMTAwLyhnbG9iYWxfZGRyX2NsayoyKjMyKSk7CgkJdWludDMyX3QgIHBzPTA7CgkJZm9yIChwcz0wO3BzPDI7cHMrKykKCQl7CgkJCXsKCQkJCWRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5BUmRQdHJJbml0VmFsPTA7CgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gQVJkUHRySW5pdFZhbCBwcz0lZCIscHMpOwoJCQkJYWRkX29mZnNldD0oKHBzPDwyMCl8KDI8PDE2KXwoMDw8MTIpfCgweDJlKSk7CgkJCQlkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCQlkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uQVJkUHRySW5pdFZhbD1kZWxheV9vcmc7CgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDAsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSksZGVsYXlfb3JnKTsKCgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gZGZpbXJsMCBkZmltcmwxIGRmaW1ybDIgZGZpbXJsMyBId3RNUkwgcHM9JWQiLHBzKTsKCQkJCWFkZF9vZmZzZXQ9KChwczw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHgyMCkpOwoJCQkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLmRmaV9tcmw9ZGVsYXlfb3JnOwoJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwwLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpLGRlbGF5X29yZyk7CgkJCQlhZGRfb2Zmc2V0PSgocHM8PDIwKXwoMTw8MTYpfCgxPDwxMil8KDB4MjApKTsKCQkJCWRlbGF5X29yZz1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMSxkZWxheV9vcmcsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKSxkZWxheV9vcmcpOwoJCQkJYWRkX29mZnNldD0oKHBzPDwyMCl8KDE8PDE2KXwoMjw8MTIpfCgweDIwKSk7CgkJCQlkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDIsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSksZGVsYXlfb3JnKTsKCQkJCWFkZF9vZmZzZXQ9KChwczw8MjApfCgxPDwxNil8KDM8PDEyKXwoMHgyMCkpOwoJCQkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwzLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpLGRlbGF5X29yZyk7CgkJCQlhZGRfb2Zmc2V0PSgocHM8PDIwKXwoMjw8MTYpfCgwPDwxMil8KDB4MjApKTsKCQkJCWRlbGF5X29yZz1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCgkJCQlkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uZGZpX2h3dG1ybD1kZWxheV9vcmc7CgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDAsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSksZGVsYXlfb3JnKTsKCQkJfQoJCQl7CgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gY291bnRfaW5kZXggICAgIGRlbGF5X3ZhbHVlICAgICByZWdpc3Rlcl9hZGQgICAgIHJlZ2lzdGVyX3ZhbHVlICBwcz0lZFxuICIscHMpOwoJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIGFkZHJlc3MgZGVsYXkgKiAxLzMyVUl4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lICAtLXN0ZXA9PTEvMzJVSSAsYml0IDYgaXMgY29hcnNlICAtLXN0ZXA9PTFVSSAgcHM9JWQiLHVpXzFfMzJfMTAwc3RlcCxwcyk7CgkJCQlmb3IgKHRfY291bnQ9MDt0X2NvdW50PDEwO3RfY291bnQrKykKCQkJCXsKCQkJCQlhZGRfb2Zmc2V0PSgocHM8PDIwKXwoMDw8MTYpfCh0X2NvdW50PDwxMil8KDB4ODApKTsKCQkJCQlkcV9iaXRfZGVsYXlbdF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJCQlkZWxheV90ZW1wPSgzMiooKChkZWxheV9vcmc+PjYpJjB4ZikrKChkZWxheV9vcmc+PjUpJjEpKSsoZGVsYXlfb3JnJjB4MWYpKTsKCQkJCQlkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uYWNfdHJhY2VfZGVsYXlbdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJCQl9CgkJCX0KCQkJewoJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRkcXMgZGVsYXkgKiAxLzMyVUl4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lIC0tc3RlcD09MS8zMlVJICxiaXQgNi05IGlzIGNvYXJzZSAgLS1zdGVwPT0xVUkgcHM9JWQiLHVpXzFfMzJfMTAwc3RlcCxwcyk7CgkJCQlmb3IgKHRfY291bnQ9MDt0X2NvdW50PDE2O3RfY291bnQrKykKCQkJCXsKCQkJCQlhZGRfb2Zmc2V0PSgocHM8PDIwKXwoMTw8MTYpfCgoKHRfY291bnQlOCk+PjEpPDwxMil8KDB4ZDArKHRfY291bnQvOCkrKCh0X2NvdW50JTIpPDw4KSkpOwoJCQkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQkJCWRlbGF5X3RlbXA9KDMyKigoKGRlbGF5X29yZz4+NikmMHhmKSsoKGRlbGF5X29yZz4+NSkmMSkpKyhkZWxheV9vcmcmMHgxZikpOwoKCQkJCQlkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10ud3JpdGVfZHFzX2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgoJCQkJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQkJCX0KCQkJfQoJCQl7CgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gcnhkcXMgZGVsYXkgKiAxLzMyVUl4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lIC0tc3RlcD09MS8zMlVJLG5vIGNvYXJzZSBwcz0lZCIsdWlfMV8zMl8xMDBzdGVwLHBzKTsKCQkJCWZvciAodF9jb3VudD0wO3RfY291bnQ8MTY7dF9jb3VudCsrKQoJCQkJewoJCQkJCWFkZF9vZmZzZXQ9KChwczw8MjApfCgxPDwxNil8KCgodF9jb3VudCU4KT4+MSk8PDEyKXwoMHg4YysodF9jb3VudC84KSsoKHRfY291bnQlMik8PDgpKSk7CgkJCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJCWRlbGF5X29yZz1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgkJCQkJZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLnJlYWRfZHFzX2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCQkJfQoJCQl9CgkJCXsKCQkJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB3cml0ZSBkcV9iaXQgZGVsYXkgKiAxLzMyVUl4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lIC0tc3RlcD09MS8zMlVJICxiaXQgNi04IGlzIGNvYXJzZSAgLS1zdGVwPT0xVSBwcz0lZCIsdWlfMV8zMl8xMDBzdGVwLHBzKTsKCQkJCWZvciAodF9jb3VudD0wO3RfY291bnQ8NzI7dF9jb3VudCsrKQoJCQkJewoJCQkJCWFkZF9vZmZzZXQ9KChwczw8MjApfCgxPDwxNil8KCgodF9jb3VudCUzNikvOSk8PDEyKXwoMHhjMCsoKHRfY291bnQlOSk8PDgpKyh0X2NvdW50LzM2KSkpOwoJCQkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQkJCWRlbGF5X3RlbXA9KDMyKigoKGRlbGF5X29yZz4+NikmMHhmKSsoKGRlbGF5X29yZz4+NSkmMSkpKyhkZWxheV9vcmcmMHgxZikpOwoKCQkJCQlkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10ud3JpdGVfZHFfYml0X2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCQkJfQoJCQl9CgkJCXsKCQkJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiByZWFkIGRxX2JpdCBkZWxheSAqIEJETFJ4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lIC0tc3RlcD09YmRsciBzdGVwIHNpemUgYWJvdXQgNXBzLG5vIGNvYXJzZSBwcz0lZCIsYmRscl8xMDBzdGVwLHBzKTsKCQkJCWZvciAodF9jb3VudD0wO3RfY291bnQ8NzI7dF9jb3VudCsrKQoJCQkJewoJCQkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTM2KS85KTw8MTIpfCgweDY4KygodF9jb3VudCU5KTw8OCkrKHRfY291bnQvMzYpKSk7CgkJCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJCWRlbGF5X29yZz1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCQkJZGVsYXlfdGVtcD0oKGRlbGF5X29yZyYweDNmKSk7CgoJCQkJCWRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5yZWFkX2RxX2JpdF9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoJCQkJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQkJCX0KCQkJfQoJCQl7CgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gcmVhZCBkcXMgZ2F0ZSBkZWxheSAqIDEvMzJVSXgxMDA9PSVkIHBzIGJpdDAtNCBmaW5lIHR1bmUgLGJpdCA2LTEwIGlzIGNvYXJzZSBwcz0lZCIsdWlfMV8zMl8xMDBzdGVwLHBzKTsKCQkJCWZvciAodF9jb3VudD0wO3RfY291bnQ8MTY7dF9jb3VudCsrKQoJCQkJewoJCQkJCWFkZF9vZmZzZXQ9KChwczw8MjApfCgxPDwxNil8KCgodF9jb3VudCU4KT4+MSk8PDEyKXwoMHg4MCsodF9jb3VudC84KSsoKHRfY291bnQlMik8PDgpKSk7CgkJCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJCWRlbGF5X29yZz1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweDFmKSsoKGRlbGF5X29yZz4+NSkmMSkpKyhkZWxheV9vcmcmMHgxZikpOwoKCQkJCQlkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10ucmVhZF9kcXNfZ2F0ZV9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoJCQkJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQkJCX0KCgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gc29jIHZyZWYgOiBscGRkcjQtLSBWUkVGID0gVkREUSooMC4wNDcgKyBWcmVmREFDMFs2OjBdKjAuMDAzNjcgICBERFI0IC0tVlJFRiA9IFZERFEqKDAuNTEwICsgVnJlZkRBQzBbNjowXSowLjAwMzQ1IHBzPSVkIixwcyk7CgkJCQkvLygoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KSU5KTw8OCl8KDB4NDApLG92ZXJfcmlkZV92YWx1ZSkKCQkJCXVpbnQzMl90IHZyZWZfdF9jb3VudD0wOwoJCQkJZm9yICh0X2NvdW50PTA7dF9jb3VudDw3Mjt0X2NvdW50KyspCgkJCQl7Ly9hZGQgbm9ybWFsIHZyZWYwLS0tdnJlZkRhYzAgZm9yIGp1c3QgMS0+eCB0cmFuc2l0aW9ucwoJCQkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTM2KS85KTw8MTIpfCgoKHRfY291bnQlMzYpJTkpPDw4KXwoMHg0MCkpOwoJCQkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQkJCWRlbGF5X3RlbXA9KChkZWxheV9vcmcpKTsKCQkJCQlpZiAodF9jb3VudDwzNSkKCQkJCQl7CgkJCQkJCXZyZWZfdF9jb3VudD0oKCgodF9jb3VudCUzNikvOSkqOCkrKHRfY291bnQlOSkpOwoJCQkJCQlkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uc29jX2JpdF92cmVmW3ZyZWZfdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkJCQl9CgkJCQkJaWYgKCh0X2NvdW50JTkpID09IDgpCgkJCQkJewoJCQkJCQl2cmVmX3RfY291bnQ9MzIrKCgoKHRfY291bnQlMzYpLzkpKSk7CgkJCQkJCWRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5zb2NfYml0X3ZyZWZbdnJlZl90X2NvdW50XT1kZWxheV90ZW1wOwoJCQkJCX0KCgkJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCQkJfQoJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHNvYyB2cmVmLWRmZSBkYWMxIDAtLS0+eCA6IGxwZGRyNC0tIFZSRUYgPSBWRERRKigwLjA0NyArIFZyZWZEQUMwWzY6MF0qMC4wMDM2NyAgIEREUjQgLS1WUkVGID0gVkREUSooMC41MTAgKyBWcmVmREFDMFs2OjBdKjAuMDAzNDUgcHM9JWQiLHBzKTsKCQkJCWZvciAodF9jb3VudD0wO3RfY291bnQ8NzI7dF9jb3VudCsrKQoJCQkJeyAvL2FkZCBkZmUgdnJlZjEtLS12cmVmRGFjMSBmb3IganVzdCAwLT54IHRyYW5zaXRpb25zCgkJCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgoKHRfY291bnQlMzYpLzkpPDwxMil8KCgodF9jb3VudCUzNiklOSk8PDgpfCgweDMwKSk7CgkJCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJCWRlbGF5X29yZz1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCQkJZGVsYXlfdGVtcD0oKGRlbGF5X29yZykpOwoJCQkJCWlmICh0X2NvdW50PDM1KQoJCQkJCXsKCQkJCQkJdnJlZl90X2NvdW50PSgoKCh0X2NvdW50JTM2KS85KSo4KSsodF9jb3VudCU5KSk7CgkJCQkJCWRkcl9zZXRfdF9wLT5jZmdfZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QuY3NyX3NvY192cmVmX2RhYzFfZGZlW3ZyZWZfdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkJCQl9CgkJCQkJaWYgKCh0X2NvdW50JTkpID09IDgpCgkJCQkJewoJCQkJCQl2cmVmX3RfY291bnQ9MzIrKCgoKHRfY291bnQlMzYpLzkpKSk7CgkJCQkJCWRkcl9zZXRfdF9wLT5jZmdfZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QuY3NyX3NvY192cmVmX2RhYzFfZGZlW3ZyZWZfdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkJCQl9CgkJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCQkJfQoJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIGRyYW0gdnJlZiA6IGxwZGRyNC0tIFZSRUYgPSBWRERRKigwLiArIFZyZWZEQUMwWzY6MF0qMC4gICBERFI0IC0tVlJFRiA9IFZERFEqKDAuICsgVnJlZkRBQzBbNjowXSowLiAgcHM9JWQiLHBzKTsKCQkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDA4MikpOwoJCQkJZGVsYXlfdGVtcD1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCWZvciAodF9jb3VudD0wO3RfY291bnQ8MzI7dF9jb3VudCsrKQoJCQkJewoJCQkJCWRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5kcmFtX2JpdF92cmVmW3RfY291bnRdPWRlbGF5X3RlbXA7CgoJCQkJCS8vCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQkJCX0KCQkJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSksZGVsYXlfdGVtcCk7CgkJCX0KCQkjaWYgMAoJCQkvLwlpZihvdmVyX3JpZGVfaW5kZXggPT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUkVUUkFJTklORykKCQkJewkvLwlpZiAocmVhZF93cml0ZT09UkVHSVNURVJfUkVBRCkKCQkJCWZvciAodF9jb3VudD0wO3RfY291bnQ8NDt0X2NvdW50KyspCgkJCQkJewlkZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1s0KnRfY291bnQrMF09KGR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwodF9jb3VudDw8MTIpfCgweGFhKSkpJjB4ZmY7ICAvL1BwdEN0bFN0YXRpYwoJCQkJCQlkZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1s0KnRfY291bnQrMV09KGR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwodF9jb3VudDw8MTIpfCgweGFhKSkpPj44OyAgLy9QcHRDdGxTdGF0aWMKCQkJCQkJZGRyX3NldF90X3AtPnJldHJhaW5pbmdbNCp0X2NvdW50KzJdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwodF9jb3VudDw8MTIpfCgweGFlKSk7ICAvL1BwdERxc0NudEludlRyblRnMCAgcHMwIHJhbmswIGxhbmUgMC0zCgkJCQkJCWRkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzQqdF9jb3VudCszXT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KHRfY291bnQ8PDEyKXwoMHhhZikpOyAgLy9QcHREcXNDbnRJbnZUcm5UZzAgIHBzMCByYW5rMSBsYW5lIDAtMwoJCQkJCX0KCQkJfQoJCSNlbmRpZgoJCQkjaWYgMSAgLy9hZGQgZm9yIHNraXAgdHJhaW5pbmcKCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIGV4dHJhIHJldHJhaW5pbmcgc2V0dGluZy4gcHM9JWQiLHBzKTsKCQkJdF9jb3VudD0wOwoJCQlhZGRfb2Zmc2V0PSgwPDwyMCl8KDI8PDE2KXwoMDw8MTIpfCgweGNiKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV90ZW1wPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGRyX3NldF90X3AtPmNmZ19kZHJfcGh5X2NvbW1vbl9leHRyYV9zZXRfdC5jc3JfcGxsY3RybDM9ZGVsYXlfdGVtcDsKCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoKCQkJZm9yICh0X2NvdW50PTA7dF9jb3VudDw0O3RfY291bnQrKykKCQkJewoJCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCh0X2NvdW50PDwxMil8KDB4YWEpKTsKCQkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCWRlbGF5X3RlbXA9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQkJZGRyX3NldF90X3AtPmNmZ19kZHJfcGh5X2NvbW1vbl9leHRyYV9zZXRfdC5jc3JfcHB0Y3Rsc3RhdGljW3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJCX0KCQkJZm9yICh0X2NvdW50PTA7dF9jb3VudDw0O3RfY291bnQrKykKCQkJewoJCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCh0X2NvdW50PDwxMil8KDB4NjIpKTsKCQkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCWRlbGF5X3RlbXA9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQkJZGRyX3NldF90X3AtPmNmZ19kZHJfcGh5X2NvbW1vbl9leHRyYV9zZXRfdC5jc3JfdHJhaW5pbmdpbmNkZWNkdHNtZW5bdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQkJfQoJCQlmb3IgKHRfY291bnQ9MDt0X2NvdW50PDQ7dF9jb3VudCsrKQoJCQl7CgkJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KHRfY291bnQ8PDEyKXwoMHgwMSkpOwoJCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJZGVsYXlfdGVtcD1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCQlkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl90c21ieXRlMFt0X2NvdW50XT1kZWxheV90ZW1wOwoJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCQl9CgkJCWZvciAodF9jb3VudD0wO3RfY291bnQ8NDt0X2NvdW50KyspCgkJCXsKCQkJCWFkZF9vZmZzZXQ9KChwczw8MjApfCgxPDwxNil8KHRfY291bnQ8PDEyKXwoMHg0MykpOwoJCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJZGVsYXlfdGVtcD1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCQlkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uY3NyX2Rxc3JjdmNudHJsW3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJCX0KCQkJZm9yICh0X2NvdW50PTA7dF9jb3VudDw0O3RfY291bnQrKykKCQkJewoJCQkJLy90X2NvdW50PTA7CgkJCQlhZGRfb2Zmc2V0PSgocHM8PDIwKXwoMTw8MTYpfCh0X2NvdW50PDwxMil8KDB4YWUpKTsKCQkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCWRlbGF5X3RlbXA9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQkJZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLmNzcl9wcHRkcXNjbnRpbnZ0cm50ZzBbdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQkJfQoJCQlmb3IgKHRfY291bnQ9MDt0X2NvdW50PDQ7dF9jb3VudCsrKQoJCQl7CgkJCQkvL3RfY291bnQ9MDsKCQkJCWFkZF9vZmZzZXQ9KChwczw8MjApfCgxPDwxNil8KHRfY291bnQ8PDEyKXwoMHhhZikpOwoJCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJZGVsYXlfdGVtcD1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCQlkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uY3NyX3BwdGRxc2NudGludnRybnRnMVt0X2NvdW50XT1kZWxheV90ZW1wOwoJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCQl9CgkJCS8vZm9yKHRfY291bnQ9MDt0X2NvdW50PDQ7dF9jb3VudCsrKQoJCQl7CgkJCQl0X2NvdW50PTA7CgkJCQlhZGRfb2Zmc2V0PSgocHM8PDIwKXwoMjw8MTYpfCh0X2NvdW50PDwxMil8KDB4YjIpKTsKCQkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCWRlbGF5X3RlbXA9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQkJZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLmNzcl92cmVmaW5nbG9iYWw9ZGVsYXlfdGVtcDsKCQkJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQkJfQoJCQlmb3IgKHRfY291bnQ9MTt0X2NvdW50PDk7dF9jb3VudCsrKQoJCQl7CgkJCQkvL3RfY291bnQ9MDsKCQkJCWFkZF9vZmZzZXQ9KChwczw8MjApfCg5PDwxNil8KDA8PDEyKXwoMHgyMDApfHRfY291bnQpOwoJCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJZGVsYXlfdGVtcD1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCQlkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uY3NyX3NlcTBiZ3ByW3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJCX0KCQkJewoJCQkJdF9jb3VudD0wOwoJCQkJYWRkX29mZnNldD0oKHBzPDwyMCl8KDI8PDE2KXwodF9jb3VudDw8MTIpfCgweDdjKSk7CgkJCQlkcV9iaXRfZGVsYXlbdF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCQlkZWxheV90ZW1wPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJCWRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5jc3JfZGxsZ2FpbmN0bD1kZWxheV90ZW1wOwoJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCQl9CgkJCXsKCQkJCXRfY291bnQ9MDsKCQkJCWFkZF9vZmZzZXQ9KChwczw8MjApfCgyPDwxNil8KHRfY291bnQ8PDEyKXwoMHg3ZCkpOwoJCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJZGVsYXlfdGVtcD1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCQlkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uY3NyX2RsbGxvY2twYXJhPWRlbGF5X3RlbXA7CgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJCX0KCQkJewoJCQkJdF9jb3VudD0wOwoJCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMjw8MTYpfCh0X2NvdW50PDwxMil8KDB4NzcpKTsKCQkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCWRlbGF5X3RlbXA9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQkJZGRyX3NldF90X3AtPmNmZ19kZHJfcGh5X2NvbW1vbl9leHRyYV9zZXRfdC5jc3JfaHd0Y2Ftb2RlPWRlbGF5X3RlbXA7CgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJCX0KCQkJewoJCQkJdF9jb3VudD0wOwoJCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMjw8MTYpfCh0X2NvdW50PDwxMil8KDB4NzIpKTsKCQkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCWRlbGF5X3RlbXA9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQkJZGRyX3NldF90X3AtPmNmZ19kZHJfcGh5X2NvbW1vbl9leHRyYV9zZXRfdC5jc3JfaHd0bHBjc2VuYT1kZWxheV90ZW1wOwoJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCQl9CgkJCXsKCQkJCXRfY291bnQ9MDsKCQkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDI8PDE2KXwodF9jb3VudDw8MTIpfCgweDczKSk7CgkJCQlkcV9iaXRfZGVsYXlbdF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCQlkZWxheV90ZW1wPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJCWRkcl9zZXRfdF9wLT5jZmdfZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QuY3NyX2h3dGxwY3NlbmI9ZGVsYXlfdGVtcDsKCQkJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQkJfQoJCQl7CgkJCQl0X2NvdW50PTA7CgkJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCg0PDwxNil8KHRfY291bnQ8PDEyKXwoMHhmZCkpOwoJCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJZGVsYXlfdGVtcD1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCQlkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl9hY3NtY3RybDEzPWRlbGF5X3RlbXA7CgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJCX0KCQkJewoJCQkJdF9jb3VudD0wOwoJCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoNDw8MTYpfCh0X2NvdW50PDwxMil8KDB4YzApKTsKCQkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCWRlbGF5X3RlbXA9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQkJZGRyX3NldF90X3AtPmNmZ19kZHJfcGh5X2NvbW1vbl9leHRyYV9zZXRfdC5jc3JfYWNzbWN0cmwyMz1kZWxheV90ZW1wOwoJCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCQl9CgkJCS8vZHdjX2RkcnBoeV9hcGJfd3IoKHBzPDwyMCl8KDk8PDE2KXwoMDw8MTIpfCgweDI4KSwJCTApOyAgIC8vICBjc3JfUGh5SW5MUDNfQUREUgoJCQkjZW5kaWYKCQl9Cgl9CglyZXR1cm4gMTsKfQppbnQgZG9fZGRyX2Rpc3BsYXlfZzEyX2Rkcl9pbmZvcm1hdGlvbihjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaT0wOwoJdW5zaWduZWQgaW50IHBzPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CglkZHJfc2V0X3QgKmRkcl9zZXRfdF9wPU5VTEw7CglkZHJfc2V0X3RfcD0oZGRyX3NldF90ICopKGRkcl9zZXRfdF9wX2FycmFyeSk7Cglkb19yZWFkX2Rkcl90cmFpbmluZ19kYXRhKDAsZGRyX3NldF90X3ApOwoKCXsKCQl1aW50MzJfdCAgY291bnQ9MDsKCQl1aW50MzJfdCAgcmVnX2FkZF9vZmZzZXQ9MDsKCQl1aW50MTZfdCAgcmVnX3ZhbHVlPTA7CgkJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCJcbnBjdGwgdGltbWluZzpcbiIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCgoJCXByaW50ZigiXG4gUENUTCB0aW1taW5nOiAweCIpOwoKCQlmb3IgKGNvdW50PTA7Y291bnQ8KChwX2Rkcl9iYXNlLT5kZHJfcGN0bF90aW1pbmdfZW5kX2FkZHJlc3MpLShwX2Rkcl9iYXNlLT5kZHJfcGN0bF90aW1pbmdfYmFzZV9hZGRyZXNzKSk7KSB7CgkJCXJlZ19hZGRfb2Zmc2V0PSgocF9kZHJfYmFzZS0+ZGRyX3BjdGxfdGltaW5nX2Jhc2VfYWRkcmVzcykrKGNvdW50KSk7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0cygiXG4iLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0X2hleChyZWdfYWRkX29mZnNldCwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dHMoIjogIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dF9oZXgocmVhZGwocmVnX2FkZF9vZmZzZXQpLDMyLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCXByaW50ZigiXG4gcmVnX2FkZF9vZmZzZXQ6ICUwOHggJTA4eCAlMDh4ICIscmVnX2FkZF9vZmZzZXQscmVhZGwocmVnX2FkZF9vZmZzZXQpLHJlZ19hZGRfb2Zmc2V0KTsKCQkJY291bnQ9Y291bnQrNDsKCQl9CgkJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCJcbm1ycyByZWdpc3RlcjogYmFzZSAoMHg1NDAwMDw8MSkrRERSX1BIWV9CQVNFLGJ5dGUgb2Zmc2V0XG4iLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJcHJpbnRmKCJcbiBtcnMgcmVnaXN0ZXI6ICIpOwoJCXByaW50ZigiXG4gbXJzIHJlZ2lzdGVyOiBiYXNlICgweDU0MDAwPDwxKStERFJfUEhZX0JBU0UsJTA4eCAgYnl0ZSBvZmZzZXRcbiIsKDB4NTQwMDA8PDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpOwoJCWZvciAoY291bnQ9MDtjb3VudDwweDgwOykgewoJCQlyZWdfYWRkX29mZnNldD0weDU0MDAwK2NvdW50Oy8vZHdjX2RkcnBoeV9hcGJfd3IoMHg1NDAwOCwweDEwMDEpOwoJCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dHMoIlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dF9oZXgoY291bnQsMzIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCI6ICIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJcmVnX3ZhbHVlPSAoKCoodm9sYXRpbGUgdWludDE2X3QgKikoKHVpbnQ2NF90KSgoKDB4NTQwMDArKGNvdW50Pj4xKSkpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKT4+KCgoY291bnQpJTIpPzg6MCkpOy8vZHdjX2RkcnBoeV9hcGJfcmQoMHg1NDAwMCthZGRfb2Zmc2V0KzEpOwoJCQlyZWdfdmFsdWU9cmVnX3ZhbHVlJjB4ZmY7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0X2hleChyZWdfdmFsdWUsMzIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJcHJpbnRmKCJcbiByZWdfYWRkX29mZnNldDogJTA4eCAlMDh4ICUwOHgiLHJlZ19hZGRfb2Zmc2V0LHJlZ192YWx1ZSwoKCgoMHg1NDAwMCsoY291bnQ+PjEpKSkgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpOwoJCQljb3VudD1jb3VudCsxOwoJCX0KCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dHMoIlxudGltbWluZy5jOlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoKCgkJcHJpbnRmKCJcbiBzdGlja3kgcmVnaXN0ZXI6ICIpOwoJCXsKCQkJdWludDMyX3QgbG9vcF9tYXggPSAwOwoJCQlsb29wX21heD02NDw8MjsvL3NpemVvZihkZHJfc2V0X3QpOwoJCQkvL3VpbnQzMl90IGxvb3AgPSAwOwoJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBsb29wX21heDsgY291bnQrPTQpIHsKCQkJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dHMoIlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0X2hleChjb3VudCwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0cygiOiAiLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCQkvLwlkZHJfbG9nX3NlcmlhbF9wdXRfaGV4KHJkX3JlZygodWludDY0X3QpKHBfZGV2LT5wX2RkcnMpICsgY291bnQpLDMyLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCQkvLwljb3VudD1jb3VudCs0OwoJCQkJcHJpbnRmKCJcbiByZWdfYWRkX29mZnNldDogJTA4eCAlMDh4ICUwOHgiLGNvdW50LHJkX3JlZygodWludDY0X3QpKChwX2Rkcl9iYXNlLT5kZHJfZG1jX3N0aWNreTApKSArIGNvdW50KSwoKChwX2Rkcl9iYXNlLT5kZHJfZG1jX3N0aWNreTApKSArIGNvdW50KSk7CgkJCX0KCQl9CgoJCXsKCQkJdWludDMyX3QgbG9vcF9tYXggPSAwOwoJCQlsb29wX21heD1zaXplb2YoZGRyX3NldF90KTsKCQkJdWludDMyX3QgY291bnQgPSAwOwoJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBsb29wX21heDsgKSB7CgkJCQkvLwlkZHJfbG9nX3NlcmlhbF9wdXRzKCJcbiIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dF9oZXgoY291bnQsMzIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dHMoIjogIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0X2hleChyZF9yZWcoKHVpbnQ2NF90KShwX2Rldi0+cF9kZHJzKSArIGNvdW50KSwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJcHJpbnRmKCJcbiUwOHggJTA4eCIsY291bnQscmRfcmVnKCh1aW50NjRfdCkoZGRyX3NldF90X3ApICsgY291bnQpKTsKCQkJCWNvdW50PWNvdW50KzQ7CgkJCQkvL3ByaW50ZigiXG4gcmVnX2FkZF9vZmZzZXQ6ICUwOHggJTA4eCAlMDh4Iixjb3VudCxyZF9yZWcoKHVpbnQ2NF90KSgocF9kZHJfYmFzZS0+ZGRyX2RtY19zdGlja3kwKSkgKyBjb3VudCksKCgocF9kZHJfYmFzZS0+ZGRyX2RtY19zdGlja3kwKSkgKyBjb3VudCkpOwoJCQl9CgkJfQoJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dHMoIlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJfQoKCXByaW50ZigiXG4geyIpOwoKCgl1aW50MzJfdCB0ZW1wX2NvdW50PTA7Cgl7CgkJcHJpbnRmKCJcbi5tYWdpYz0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5tYWdpYyxkZHJfc2V0X3RfcC0+bWFnaWMpOwoJCXByaW50ZigiXG4vL29sZCBmYXN0X2Jvb3RbJWRdPTB4JTA4eCwvLyAlZCIsMCxkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdLGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMF0pOwoJCWRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMF09MHhmZDsgLy9hZGQgZm9yIGF1dG8gY29weSB0byAgY29kZSB0ZXN0CgkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8NDt0ZW1wX2NvdW50KyspCgkJCXByaW50ZigiXG4uZmFzdF9ib290WyVkXT0weCUwOHgsLy8gJWQiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPmZhc3RfYm9vdFt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+ZmFzdF9ib290W3RlbXBfY291bnRdKTsKCQkvL3ByaW50ZigiXG4ucnN2X2ludDA9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cnN2X2ludDAsZGRyX3NldF90X3AtPnJzdl9pbnQwKTsKCQlwcmludGYoIlxuLmJvYXJkX2lkPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmJvYXJkX2lkLGRkcl9zZXRfdF9wLT5ib2FyZF9pZCk7CgkJcHJpbnRmKCJcbi52ZXJzaW9uPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnZlcnNpb24sZGRyX3NldF90X3AtPnZlcnNpb24pOwoJCXByaW50ZigiXG4uRHJhbVR5cGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+RHJhbVR5cGUsZGRyX3NldF90X3AtPkRyYW1UeXBlKTsKCQlwcmludGYoIlxuLkRpc2FibGVkRGJ5dGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+RGlzYWJsZWREYnl0ZSxkZHJfc2V0X3RfcC0+RGlzYWJsZWREYnl0ZSk7CgkJcHJpbnRmKCJcbi5JczJUdGltaW5nPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPklzMlR0aW1pbmcsZGRyX3NldF90X3AtPklzMlR0aW1pbmcpOwoJCXByaW50ZigiXG4uSGR0Q3RybD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5IZHRDdHJsLGRkcl9zZXRfdF9wLT5IZHRDdHJsKTsKCQlwcmludGYoIlxuLmRyYW1fcmFua19jb25maWc9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZHJhbV9yYW5rX2NvbmZpZyxkZHJfc2V0X3RfcC0+ZHJhbV9yYW5rX2NvbmZpZyk7CgkJcHJpbnRmKCJcbi5kaWFnbm9zZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kaWFnbm9zZSxkZHJfc2V0X3RfcC0+ZGlhZ25vc2UpOwoJCS8vcHJpbnRmKCJcbi5pbWVtX2xvYWRfYWRkcj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5pbWVtX2xvYWRfYWRkcixkZHJfc2V0X3RfcC0+aW1lbV9sb2FkX2FkZHIpOwoJCS8vcHJpbnRmKCJcbi5kbWVtX2xvYWRfYWRkcj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kbWVtX2xvYWRfYWRkcixkZHJfc2V0X3RfcC0+ZG1lbV9sb2FkX2FkZHIpOwoJCS8vcHJpbnRmKCJcbi5pbWVtX2xvYWRfc2l6ZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5pbWVtX2xvYWRfc2l6ZSxkZHJfc2V0X3RfcC0+aW1lbV9sb2FkX3NpemUpOwoJCXByaW50ZigiXG4uc29jX2RhdGFfZHJ2X29obV9wczE9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c29jX2RhdGFfZHJ2X29obV9wczEsZGRyX3NldF90X3AtPnNvY19kYXRhX2Rydl9vaG1fcHMxKTsKCQlwcmludGYoIlxuLmRyYW1fZGF0YV9kcnZfb2htX3BzMT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX2RhdGFfZHJ2X29obV9wczEsZGRyX3NldF90X3AtPmRyYW1fZGF0YV9kcnZfb2htX3BzMSk7CgkJcHJpbnRmKCJcbi5zb2NfZGF0YV9vZHRfb2htX3BzMT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9vZHRfb2htX3BzMSxkZHJfc2V0X3RfcC0+c29jX2RhdGFfb2R0X29obV9wczEpOwoJCXByaW50ZigiXG4uZHJhbV9kYXRhX29kdF9vaG1fcHMxPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRyYW1fZGF0YV9vZHRfb2htX3BzMSxkZHJfc2V0X3RfcC0+ZHJhbV9kYXRhX29kdF9vaG1fcHMxKTsKCQlwcmludGYoIlxuLmRyYW1fZGF0YV93cl9vZHRfb2htX3BzMT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX2RhdGFfd3Jfb2R0X29obV9wczEsZGRyX3NldF90X3AtPmRyYW1fZGF0YV93cl9vZHRfb2htX3BzMSk7CgoJCXByaW50ZigiXG4uZG1lbV9sb2FkX3NpemU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZG1lbV9sb2FkX3NpemUsZGRyX3NldF90X3AtPmRtZW1fbG9hZF9zaXplKTsKCQlwcmludGYoIlxuLmRkcl9iYXNlX2FkZHI9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2Jhc2VfYWRkcixkZHJfc2V0X3RfcC0+ZGRyX2Jhc2VfYWRkcik7CgkJcHJpbnRmKCJcbi5kZHJfc3RhcnRfb2Zmc2V0PTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9zdGFydF9vZmZzZXQsZGRyX3NldF90X3AtPmRkcl9zdGFydF9vZmZzZXQpOwoJCXByaW50ZigiXG4uZHJhbV9jczBfc2l6ZV9NQj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX2NzMF9zaXplX01CLGRkcl9zZXRfdF9wLT5kcmFtX2NzMF9zaXplX01CKTsKCQlwcmludGYoIlxuLmRyYW1fY3MxX3NpemVfTUI9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZHJhbV9jczFfc2l6ZV9NQixkZHJfc2V0X3RfcC0+ZHJhbV9jczFfc2l6ZV9NQik7CgkJcHJpbnRmKCJcbi50cmFpbmluZ19TZXF1ZW5jZUN0cmxbMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+dHJhaW5pbmdfU2VxdWVuY2VDdHJsWzBdLGRkcl9zZXRfdF9wLT50cmFpbmluZ19TZXF1ZW5jZUN0cmxbMF0pOwoJCXByaW50ZigiXG4udHJhaW5pbmdfU2VxdWVuY2VDdHJsWzFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnRyYWluaW5nX1NlcXVlbmNlQ3RybFsxXSxkZHJfc2V0X3RfcC0+dHJhaW5pbmdfU2VxdWVuY2VDdHJsWzFdKTsKCQlwcmludGYoIlxuLnBoeV9vZHRfY29uZmlnX3JhbmtbMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cGh5X29kdF9jb25maWdfcmFua1swXSxkZHJfc2V0X3RfcC0+cGh5X29kdF9jb25maWdfcmFua1swXSk7CgkJcHJpbnRmKCJcbi5waHlfb2R0X2NvbmZpZ19yYW5rWzFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnBoeV9vZHRfY29uZmlnX3JhbmtbMV0sZGRyX3NldF90X3AtPnBoeV9vZHRfY29uZmlnX3JhbmtbMV0pOwoJCS8vcHJpbnRmKCJcbi5yZXZlcjE9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmV2ZXIxLGRkcl9zZXRfdF9wLT5yZXZlcjEpOwoJCS8vcHJpbnRmKCJcbi5yZXZlcjI9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmV2ZXIyLGRkcl9zZXRfdF9wLT5yZXZlcjIpOwoJCXByaW50ZigiXG4ucmFuazFfY2FfdnJlZl9wZXJtaWw9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmFuazFfY2FfdnJlZl9wZXJtaWwsZGRyX3NldF90X3AtPnJhbmsxX2NhX3ZyZWZfcGVybWlsKTsKCgkJLy8JdW5zaWduZWQJY2hhcglwaHlfb2R0X2NvbmZpZ19yYW5rWzJdOwoJCS8vCXVuc2lnbmVkCWNoYXIJIGRkcl9mYXN0X2Jvb3RfZnVuY3Rpb247CgkJLy8JdW5zaWduZWQJY2hhcgkgZHFzX29mZnNldF92YWx1ZTsKCQlwcmludGYoIlxuLmRmaV9vZHRfY29uZmlnPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9vZHRfY29uZmlnLGRkcl9zZXRfdF9wLT5kZmlfb2R0X2NvbmZpZyk7CgkJcHJpbnRmKCJcbi5EUkFNRnJlcVswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5EUkFNRnJlcVswXSxkZHJfc2V0X3RfcC0+RFJBTUZyZXFbMF0pOwoJCXByaW50ZigiXG4uRFJBTUZyZXFbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+RFJBTUZyZXFbMV0sZGRyX3NldF90X3AtPkRSQU1GcmVxWzFdKTsKCQlwcmludGYoIlxuLkRSQU1GcmVxWzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPkRSQU1GcmVxWzJdLGRkcl9zZXRfdF9wLT5EUkFNRnJlcVsyXSk7CgkJcHJpbnRmKCJcbi5EUkFNRnJlcVszXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5EUkFNRnJlcVszXSxkZHJfc2V0X3RfcC0+RFJBTUZyZXFbM10pOwoJCXByaW50ZigiXG4uUGxsQnlwYXNzRW49MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+UGxsQnlwYXNzRW4sZGRyX3NldF90X3AtPlBsbEJ5cGFzc0VuKTsKCQlwcmludGYoIlxuLmRkcl9yZGJpX3dyX2VuYWJsZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfcmRiaV93cl9lbmFibGUsZGRyX3NldF90X3AtPmRkcl9yZGJpX3dyX2VuYWJsZSk7CgkJcHJpbnRmKCJcbi5kZHJfcmZjX3R5cGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX3JmY190eXBlLGRkcl9zZXRfdF9wLT5kZHJfcmZjX3R5cGUpOwoJCXByaW50ZigiXG4uZW5hYmxlX2xwZGRyNHhfbW9kZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5lbmFibGVfbHBkZHI0eF9tb2RlLGRkcl9zZXRfdF9wLT5lbmFibGVfbHBkZHI0eF9tb2RlKTsKCQlwcmludGYoIlxuLnBsbF9zc2NfbW9kZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5wbGxfc3NjX21vZGUsZGRyX3NldF90X3AtPnBsbF9zc2NfbW9kZSk7CgkJcHJpbnRmKCJcbi5jbGtfZHJ2X29obT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jbGtfZHJ2X29obSxkZHJfc2V0X3RfcC0+Y2xrX2Rydl9vaG0pOwoJCXByaW50ZigiXG4uY3NfZHJ2X29obT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jc19kcnZfb2htLGRkcl9zZXRfdF9wLT5jc19kcnZfb2htKTsKCQlwcmludGYoIlxuLmFjX2Rydl9vaG09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfZHJ2X29obSxkZHJfc2V0X3RfcC0+YWNfZHJ2X29obSk7CgkJcHJpbnRmKCJcbi5zb2NfZGF0YV9kcnZfb2htX3A9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c29jX2RhdGFfZHJ2X29obV9wLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9kcnZfb2htX3ApOwoJCXByaW50ZigiXG4uc29jX2RhdGFfZHJ2X29obV9uPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnNvY19kYXRhX2Rydl9vaG1fbixkZHJfc2V0X3RfcC0+c29jX2RhdGFfZHJ2X29obV9uKTsKCQlwcmludGYoIlxuLnNvY19kYXRhX29kdF9vaG1fcD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9vZHRfb2htX3AsZGRyX3NldF90X3AtPnNvY19kYXRhX29kdF9vaG1fcCk7CgkJcHJpbnRmKCJcbi5zb2NfZGF0YV9vZHRfb2htX249MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c29jX2RhdGFfb2R0X29obV9uLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9vZHRfb2htX24pOwoJCXByaW50ZigiXG4uZHJhbV9kYXRhX2Rydl9vaG09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZHJhbV9kYXRhX2Rydl9vaG0sZGRyX3NldF90X3AtPmRyYW1fZGF0YV9kcnZfb2htKTsKCQlwcmludGYoIlxuLmRyYW1fZGF0YV9vZHRfb2htPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRyYW1fZGF0YV9vZHRfb2htLGRkcl9zZXRfdF9wLT5kcmFtX2RhdGFfb2R0X29obSk7CgkJcHJpbnRmKCJcbi5kcmFtX2FjX29kdF9vaG09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZHJhbV9hY19vZHRfb2htLGRkcl9zZXRfdF9wLT5kcmFtX2FjX29kdF9vaG0pOwoJCXByaW50ZigiXG4uc29jX2Nsa19zbGV3X3JhdGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c29jX2Nsa19zbGV3X3JhdGUsZGRyX3NldF90X3AtPnNvY19jbGtfc2xld19yYXRlKTsKCQlwcmludGYoIlxuLnNvY19jc19zbGV3X3JhdGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c29jX2NzX3NsZXdfcmF0ZSxkZHJfc2V0X3RfcC0+c29jX2NzX3NsZXdfcmF0ZSk7CgkJcHJpbnRmKCJcbi5zb2NfYWNfc2xld19yYXRlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnNvY19hY19zbGV3X3JhdGUsZGRyX3NldF90X3AtPnNvY19hY19zbGV3X3JhdGUpOwoJCXByaW50ZigiXG4uc29jX2RhdGFfc2xld19yYXRlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnNvY19kYXRhX3NsZXdfcmF0ZSxkZHJfc2V0X3RfcC0+c29jX2RhdGFfc2xld19yYXRlKTsKCQlwcmludGYoIlxuLnZyZWZfb3V0cHV0X3Blcm1pbCA9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+dnJlZl9vdXRwdXRfcGVybWlsICxkZHJfc2V0X3RfcC0+dnJlZl9vdXRwdXRfcGVybWlsICk7CgkJcHJpbnRmKCJcbi52cmVmX3JlY2VpdmVyX3Blcm1pbCA9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+dnJlZl9yZWNlaXZlcl9wZXJtaWwgLGRkcl9zZXRfdF9wLT52cmVmX3JlY2VpdmVyX3Blcm1pbCApOwoJCXByaW50ZigiXG4udnJlZl9kcmFtX3Blcm1pbD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT52cmVmX2RyYW1fcGVybWlsLGRkcl9zZXRfdF9wLT52cmVmX2RyYW1fcGVybWlsKTsKCQlwcmludGYoIlxuLm1heF9jb3JlX3RpbW1taW5nX2ZyZXF1ZW5jeT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5tYXhfY29yZV90aW1tbWluZ19mcmVxdWVuY3ksZGRyX3NldF90X3AtPm1heF9jb3JlX3RpbW1taW5nX2ZyZXF1ZW5jeSk7CgkJcHJpbnRmKCJcbi5hY190cmFjZV9kZWxheVswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVswXSxkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbMF0pOwoJCXByaW50ZigiXG4uYWNfdHJhY2VfZGVsYXlbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbMV0sZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzFdKTsKCQlwcmludGYoIlxuLmFjX3RyYWNlX2RlbGF5WzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzJdLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVsyXSk7CgkJcHJpbnRmKCJcbi5hY190cmFjZV9kZWxheVszXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVszXSxkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbM10pOwoJCXByaW50ZigiXG4uYWNfdHJhY2VfZGVsYXlbNF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbNF0sZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzRdKTsKCQlwcmludGYoIlxuLmFjX3RyYWNlX2RlbGF5WzVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzVdLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs1XSk7CgkJcHJpbnRmKCJcbi5hY190cmFjZV9kZWxheVs2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs2XSxkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbNl0pOwoJCXByaW50ZigiXG4uYWNfdHJhY2VfZGVsYXlbN109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbN10sZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzddKTsKCQlwcmludGYoIlxuLmFjX3RyYWNlX2RlbGF5WzhdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzhdLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs4XSk7CgkJcHJpbnRmKCJcbi5hY190cmFjZV9kZWxheVs5XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs5XSxkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbOV0pOwoJCXByaW50ZigiXG4ubHBkZHI0X2RyYW1fdm91dF92b2x0YWdlXzFfM18yXzVfc2V0dGluZz0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5scGRkcjRfZHJhbV92b3V0X3ZvbHRhZ2VfMV8zXzJfNV9zZXR0aW5nLGRkcl9zZXRfdF9wLT5scGRkcjRfZHJhbV92b3V0X3ZvbHRhZ2VfMV8zXzJfNV9zZXR0aW5nKTsKCQlwcmludGYoIlxuLmxwZGRyNF94OF9tb2RlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmxwZGRyNF94OF9tb2RlLGRkcl9zZXRfdF9wLT5scGRkcjRfeDhfbW9kZSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzBdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMF0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxXSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzFdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMl0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyXSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzNdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbM10pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFs0XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzRdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFs1XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbNV0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFs1XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzZdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbNl0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzddPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFs3XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzddKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFs4XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbOF0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFs4XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbOV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzldLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbOV0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzEwXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTBdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTBdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsxMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzExXSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzExXSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMTJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxMl0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxMl0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzEzXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTNdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTNdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsxNF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE0XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE0XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMTVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxNV0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxNV0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzE2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTZdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTZdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsxN109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE3XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE3XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMThdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxOF0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxOF0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzE5XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTldLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTldKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsyMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzIwXSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzIwXSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMjFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyMV0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyMV0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzIyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjJdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjJdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsyM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzIzXSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzIzXSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMjRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyNF0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyNF0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzI1XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjVdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjVdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsyNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzI2XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzI2XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMjddPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyN10sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyN10pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzBdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzBdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxXSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMl0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMl0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFszXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzNdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzNdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbNF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs0XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs0XSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbNV0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbNV0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFs2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzZdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzZdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbN109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs3XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs3XSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzhdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbOF0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbOF0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFs5XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzldLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzldKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMTBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTBdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzEwXSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzExXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzExXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxMV0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsxMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxMl0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTJdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMTNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTNdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzEzXSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzE0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE0XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxNF0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsxNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxNV0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTVdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMTZdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTZdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE2XSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzE3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE3XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxN10pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsxOF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxOF0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMThdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMTldPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTldLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE5XSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzIwXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzIwXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyMF0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsyMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyMV0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjFdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMjJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjJdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzIyXSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzIzXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzIzXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyM10pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsyNF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyNF0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjRdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMjVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjVdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzI1XSk7CgkJcHJpbnRmKCJcbi5zbHRfdGVzdF9mdW5jdGlvblswXSAgPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnNsdF90ZXN0X2Z1bmN0aW9uWzBdICAsZGRyX3NldF90X3AtPnNsdF90ZXN0X2Z1bmN0aW9uWzBdICApOwoJCXByaW50ZigiXG4uc2x0X3Rlc3RfZnVuY3Rpb25bMV0gID0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zbHRfdGVzdF9mdW5jdGlvblsxXSAgLGRkcl9zZXRfdF9wLT5zbHRfdGVzdF9mdW5jdGlvblsxXSAgKTsKCQlwcmludGYoIlxuLnRkcXMyZHE9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+dGRxczJkcSxkZHJfc2V0X3RfcC0+dGRxczJkcSk7CgkJcHJpbnRmKCJcbi5kcmFtX2RhdGFfd3Jfb2R0X29obT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX2RhdGFfd3Jfb2R0X29obSxkZHJfc2V0X3RfcC0+ZHJhbV9kYXRhX3dyX29kdF9vaG0pOwoJCXByaW50ZigiXG4uYml0VGltZUNvbnRyb2xfMmQ9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+Yml0VGltZUNvbnRyb2xfMmQsZGRyX3NldF90X3AtPmJpdFRpbWVDb250cm9sXzJkKTsKCQlwcmludGYoIlxuLmRkcl9kbWNfcmVtYXBbMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFswXSxkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFswXSk7CgkJcHJpbnRmKCJcbi5kZHJfZG1jX3JlbWFwWzFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbMV0sZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbMV0pOwoJCXByaW50ZigiXG4uZGRyX2RtY19yZW1hcFsyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzJdLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzJdKTsKCQlwcmludGYoIlxuLmRkcl9kbWNfcmVtYXBbM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFszXSxkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFszXSk7CgkJcHJpbnRmKCJcbi5kZHJfZG1jX3JlbWFwWzRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbNF0sZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbNF0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfY2FfcmVtYXBbMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfY2FfcmVtYXBbMF0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2NhX3JlbWFwWzBdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2NhX3JlbWFwWzFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2NhX3JlbWFwWzFdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9jYV9yZW1hcFsxXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9jYV9yZW1hcFsyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9jYV9yZW1hcFsyXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfY2FfcmVtYXBbMl0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfY2FfcmVtYXBbM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfY2FfcmVtYXBbM10sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2NhX3JlbWFwWzNdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzBdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFswXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMV0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMl0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzJdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzNdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFszXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFs0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs0XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbNF0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbNV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzVdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzZdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzZdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs2XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFs3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs3XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbN10pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbOF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbOF0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzhdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzldPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzldLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs5XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTBdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMF0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzExXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTFdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzEyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMl0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzEyXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTNdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxM10pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE0XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTRdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzE1XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE1XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTZdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNl0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTddPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE3XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTddKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzE4XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxOF0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE4XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxOV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTldLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxOV0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzIwXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjBdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzIxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzIxXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjJdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMl0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzIzXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjNdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzI0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNF0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI0XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjVdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNV0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjZdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI2XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjZdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzI3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyN10sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI3XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyOF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjhdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyOF0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjldPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI5XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjldKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzMwXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFszMF0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzMwXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFszMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMzFdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFszMV0pOwoJCXByaW50ZigiXG4uZHJhbV9ydHRfbm9tX3dyX3BhcmtbMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZHJhbV9ydHRfbm9tX3dyX3BhcmtbMF0sZGRyX3NldF90X3AtPmRyYW1fcnR0X25vbV93cl9wYXJrWzBdKTsKCQlwcmludGYoIlxuLmRyYW1fcnR0X25vbV93cl9wYXJrWzFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRyYW1fcnR0X25vbV93cl9wYXJrWzFdLGRkcl9zZXRfdF9wLT5kcmFtX3J0dF9ub21fd3JfcGFya1sxXSk7CgkJcHJpbnRmKCJcbi5kZHJfZnVuYz0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfZnVuYyxkZHJfc2V0X3RfcC0+ZGRyX2Z1bmMpOwoJCWZvciAoIHBzPTA7cHM8MjtwcysrKQoJCXsKCQkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8MTA7dGVtcF9jb3VudCsrKQoJCQkJcHJpbnRmKCJcbi5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzWyVkXS5hY190cmFjZV9kZWxheVslZF09MHglMDh4LC8vICVkIixwcyx0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5hY190cmFjZV9kZWxheVt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uYWNfdHJhY2VfZGVsYXlbdGVtcF9jb3VudF0pOwoKCQkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8MTY7dGVtcF9jb3VudCsrKQoJCQkJcHJpbnRmKCJcbi5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzWyVkXS5yZWFkX2Rxc19kZWxheVslZF09MHglMDh4LC8vICVkIixwcyx0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5yZWFkX2Rxc19kZWxheVt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10ucmVhZF9kcXNfZGVsYXlbdGVtcF9jb3VudF0pOwoJCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDw3Mjt0ZW1wX2NvdW50KyspCgkJCQlwcmludGYoIlxuLmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbJWRdLnJlYWRfZHFfYml0X2RlbGF5WyVkXT0weCUwOHgsLy8gJWQiLHBzLHRlbXBfY291bnQsZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLnJlYWRfZHFfYml0X2RlbGF5W3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5yZWFkX2RxX2JpdF9kZWxheVt0ZW1wX2NvdW50XSk7CgkJCWZvciAoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDE2O3RlbXBfY291bnQrKykKCQkJCS8vcHJpbnRmKCJcbi53cml0ZV9kcXNfZGVsYXlbJWRdPSVkLCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+d3JpdGVfZHFzX2RlbGF5W3RlbXBfY291bnRdKTsKCQkJCXByaW50ZigiXG4uY2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1slZF0ud3JpdGVfZHFzX2RlbGF5WyVkXT0weCUwOHgsLy8gJWQiLHBzLHRlbXBfY291bnQsZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLndyaXRlX2Rxc19kZWxheVt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10ud3JpdGVfZHFzX2RlbGF5W3RlbXBfY291bnRdKTsKCQkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8NzI7dGVtcF9jb3VudCsrKQoJCQkJLy9wcmludGYoIlxuLndyaXRlX2RxX2JpdF9kZWxheVslZF09JWQsIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT53cml0ZV9kcV9iaXRfZGVsYXlbdGVtcF9jb3VudF0pOwoJCQkJcHJpbnRmKCJcbi5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzWyVkXS53cml0ZV9kcV9iaXRfZGVsYXlbJWRdPTB4JTA4eCwvLyAlZCIscHMsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10ud3JpdGVfZHFfYml0X2RlbGF5W3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS53cml0ZV9kcV9iaXRfZGVsYXlbdGVtcF9jb3VudF0pOwoJCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDwxNjt0ZW1wX2NvdW50KyspCgkJCQkvL3ByaW50ZigiXG4ucmVhZF9kcXNfZ2F0ZV9kZWxheVslZF09JWQsIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19nYXRlX2RlbGF5W3RlbXBfY291bnRdKTsKCQkJCXByaW50ZigiXG4uY2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1slZF0ucmVhZF9kcXNfZ2F0ZV9kZWxheVslZF09MHglMDh4LC8vICVkIixwcyx0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5yZWFkX2Rxc19nYXRlX2RlbGF5W3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5yZWFkX2Rxc19nYXRlX2RlbGF5W3RlbXBfY291bnRdKTsKCQkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8MzY7dGVtcF9jb3VudCsrKQoJCQkJLy9wcmludGYoIlxuLnNvY19iaXRfdnJlZlslZF09JWQsIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5zb2NfYml0X3ZyZWZbdGVtcF9jb3VudF0pOwoJCQkJcHJpbnRmKCJcbi5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzWyVkXS5zb2NfYml0X3ZyZWZbJWRdPTB4JTA4eCwvLyAlZCIscHMsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uc29jX2JpdF92cmVmW3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5zb2NfYml0X3ZyZWZbdGVtcF9jb3VudF0pOwoJCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDwzNjt0ZW1wX2NvdW50KyspCgkJCQkvL3ByaW50ZigiXG4uc29jX2JpdF92cmVmWyVkXT0lZCwiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPnNvY19iaXRfdnJlZlt0ZW1wX2NvdW50XSk7CgkJCQlwcmludGYoIlxuLmNmZ19kZHJfcGh5X2NvbW1vbl9leHRyYV9zZXRfdC5jc3Jfc29jX3ZyZWZfZGFjMV9kZmVbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl9zb2NfdnJlZl9kYWMxX2RmZVt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl9zb2NfdnJlZl9kYWMxX2RmZVt0ZW1wX2NvdW50XSk7CgkJCS8vcHJpbnRmKCJcbi5zb2NfYml0X3ZyZWZbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+c29jX2JpdF92cmVmW3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5zb2NfYml0X3ZyZWZbdGVtcF9jb3VudF0pOwoJCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDwzMjt0ZW1wX2NvdW50KyspCgkJCQkvL3ByaW50ZigiXG4uZHJhbV9iaXRfdnJlZlslZF09JWQsIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5kcmFtX2JpdF92cmVmW3RlbXBfY291bnRdKTsKCQkJCXByaW50ZigiXG4uY2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1slZF0uZHJhbV9iaXRfdnJlZlslZF09MHglMDh4LC8vICVkIixwcyx0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5kcmFtX2JpdF92cmVmW3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5kcmFtX2JpdF92cmVmW3RlbXBfY291bnRdKTsKCgkJCS8vZGRyX3NldF90X3AtPmRxX2Rxc19kZWxheV9mbGFnPTB4ZmY7CgkJCS8vcHJpbnRmKCJcbi5yZXZlcjM9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmV2ZXIzLGRkcl9zZXRfdF9wLT5yZXZlcjMpOwoJCQlwcmludGYoIlxuLmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbJWRdLmRmaV9tcmw9MHglMDh4LC8vICVkIixwcyxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uZGZpX21ybCxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uZGZpX21ybCk7CgkJCXByaW50ZigiXG4uY2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1slZF0uZGZpX2h3dG1ybD0weCUwOHgsLy8gJWQiLHBzLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5kZmlfaHd0bXJsLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5kZmlfaHd0bXJsKTsKCQkJcHJpbnRmKCJcbi5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzWyVkXS5BUmRQdHJJbml0VmFsPTB4JTA4eCwvLyAlZCIscHMsZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLkFSZFB0ckluaXRWYWwsZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLkFSZFB0ckluaXRWYWwpOwoKCQkJcHJpbnRmKCJcbi5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzWyVkXS5jc3JfdnJlZmluZ2xvYmFsPTB4JTA4eCwvLyAlZCIscHMsZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLmNzcl92cmVmaW5nbG9iYWwsZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLmNzcl92cmVmaW5nbG9iYWwpOwoJCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDw0O3RlbXBfY291bnQrKykKCQkJCXByaW50ZigiXG4uY2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1slZF0uY3NyX2Rxc3JjdmNudHJsWyVkXT0weCUwOHgsLy8gJWQiLHBzLHRlbXBfY291bnQsZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLmNzcl9kcXNyY3ZjbnRybFt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uY3NyX2Rxc3JjdmNudHJsW3RlbXBfY291bnRdKTsKCQkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8NDt0ZW1wX2NvdW50KyspCgkJCQlwcmludGYoIlxuLmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbJWRdLmNzcl9wcHRkcXNjbnRpbnZ0cm50ZzBbJWRdPTB4JTA4eCwvLyAlZCIscHMsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uY3NyX3BwdGRxc2NudGludnRybnRnMFt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uY3NyX3BwdGRxc2NudGludnRybnRnMFt0ZW1wX2NvdW50XSk7CgkJCWZvciAoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDQ7dGVtcF9jb3VudCsrKQoJCQkJcHJpbnRmKCJcbi5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzWyVkXS5jc3JfcHB0ZHFzY250aW52dHJudGcxWyVkXT0weCUwOHgsLy8gJWQiLHBzLHRlbXBfY291bnQsZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLmNzcl9wcHRkcXNjbnRpbnZ0cm50ZzFbdGVtcF9jb3VudF0sZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLmNzcl9wcHRkcXNjbnRpbnZ0cm50ZzFbdGVtcF9jb3VudF0pOwoJCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDw5O3RlbXBfY291bnQrKykKCQkJCXByaW50ZigiXG4uY2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1slZF0uY3NyX3NlcTBiZ3ByWyVkXT0weCUwOHgsLy8gJWQiLHBzLHRlbXBfY291bnQsZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLmNzcl9zZXEwYmdwclt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uY3NyX3NlcTBiZ3ByW3RlbXBfY291bnRdKTsKCQkJcHJpbnRmKCJcbi5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzWyVkXS5jc3JfZGxsZ2FpbmN0bD0weCUwOHgsLy8gJWQiLHBzLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5jc3JfZGxsZ2FpbmN0bCxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uY3NyX2RsbGdhaW5jdGwpOwoJCQlwcmludGYoIlxuLmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbJWRdLmNzcl9kbGxsb2NrcGFyYT0weCUwOHgsLy8gJWQiLHBzLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5jc3JfZGxsbG9ja3BhcmEsZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLmNzcl9kbGxsb2NrcGFyYSk7CgkJfQoJCSNpZiAwCgkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8MTY7dGVtcF9jb3VudCsrKQoJCQkvL3ByaW50ZigiXG4uZHJhbV9iaXRfdnJlZlslZF09JWQsIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5kcmFtX2JpdF92cmVmW3RlbXBfY291bnRdKTsKCQkJcHJpbnRmKCJcbi5yZXRyYWluaW5nWyVkXT0weCUwOHgsLy8gJWQiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPnJldHJhaW5pbmdbdGVtcF9jb3VudF0sZGRyX3NldF90X3AtPnJldHJhaW5pbmdbdGVtcF9jb3VudF0pOwoJCSNlbmRpZgoJCXByaW50ZigiXG4uY2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl9wbGxjdHJsMz0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QuY3NyX3BsbGN0cmwzLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QuY3NyX3BsbGN0cmwzKTsKCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDw0O3RlbXBfY291bnQrKykKCQkJcHJpbnRmKCJcbi5jZmdfZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QuY3NyX3BwdGN0bHN0YXRpY1slZF09MHglMDh4LC8vICVkIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5jZmdfZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QuY3NyX3BwdGN0bHN0YXRpY1t0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl9wcHRjdGxzdGF0aWNbdGVtcF9jb3VudF0pOwoJCWZvciAoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDQ7dGVtcF9jb3VudCsrKQoJCQlwcmludGYoIlxuLmNmZ19kZHJfcGh5X2NvbW1vbl9leHRyYV9zZXRfdC5jc3JfdHJhaW5pbmdpbmNkZWNkdHNtZW5bJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl90cmFpbmluZ2luY2RlY2R0c21lblt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl90cmFpbmluZ2luY2RlY2R0c21lblt0ZW1wX2NvdW50XSk7CgkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8NDt0ZW1wX2NvdW50KyspCgkJCXByaW50ZigiXG4uY2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl90c21ieXRlMFslZF09MHglMDh4LC8vICVkIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5jZmdfZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QuY3NyX3RzbWJ5dGUwW3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QuY3NyX3RzbWJ5dGUwW3RlbXBfY291bnRdKTsKCgkJcHJpbnRmKCJcbi5jZmdfZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QuY3NyX2h3dGNhbW9kZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QuY3NyX2h3dGNhbW9kZSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl9od3RjYW1vZGUpOwoJCXByaW50ZigiXG4uY2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl9od3RscGNzZW5hPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmNmZ19kZHJfcGh5X2NvbW1vbl9leHRyYV9zZXRfdC5jc3JfaHd0bHBjc2VuYSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl9od3RscGNzZW5hKTsKCQlwcmludGYoIlxuLmNmZ19kZHJfcGh5X2NvbW1vbl9leHRyYV9zZXRfdC5jc3JfaHd0bHBjc2VuYj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QuY3NyX2h3dGxwY3NlbmIsZGRyX3NldF90X3AtPmNmZ19kZHJfcGh5X2NvbW1vbl9leHRyYV9zZXRfdC5jc3JfaHd0bHBjc2VuYik7CgkJcHJpbnRmKCJcbi5jZmdfZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QuY3NyX2Fjc21jdHJsMTM9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl9hY3NtY3RybDEzLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3BoeV9jb21tb25fZXh0cmFfc2V0X3QuY3NyX2Fjc21jdHJsMTMpOwoJCXByaW50ZigiXG4uY2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl9hY3NtY3RybDIzPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmNmZ19kZHJfcGh5X2NvbW1vbl9leHRyYV9zZXRfdC5jc3JfYWNzbWN0cmwyMyxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl9waHlfY29tbW9uX2V4dHJhX3NldF90LmNzcl9hY3NtY3RybDIzKTsKCgkJcHJpbnRmKCJcbn0sXG4iKTsKCgl9CglyZXR1cm4gMTsKfQoKCi8vI2VuZGlmCiNpZiAxCnVpbnQzMl90IGRkcl9tYXNrX2NvbnZlcnRfb2Zmc2V0KHVpbnQzMl90IG1hc2spCnsKCXVpbnQzMl90IG9mZnNldD0wOwoJd2hpbGUgKChtYXNrJjEpKQoJewoJCW9mZnNldCsrOwoJCW1hc2s9KG1hc2s+PjEpOwoJfQoJcmV0dXJuIG9mZnNldDsKfQoKdWludDMyX3QgIGRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcF9jMihjaGFyIHRlc3RfaW5kZXgsdWludDMyX3QgdmFsdWUpIHsKCS8vdmFsdWUJYml0MC0xNSBmaW5lIHZhbHVlICxiaXQgMTYtMzIgY29hcnNlIHZhbHVlCgl1aW50MzJfdCByZXN1bHQ9MDsKCXVpbnQzMl90IGNvYXJzZV92YWx1ZT0wOwoJdWludDMyX3QgZmluZV92YWx1ZT0wOwoJaWYgKHZhbHVlKQoJCWNvYXJzZV92YWx1ZT0odmFsdWU+PjE2KTsKCWVsc2UKCQljb2Fyc2VfdmFsdWU9MDsKCWZpbmVfdmFsdWU9KHZhbHVlJjB4ZmZmZik7CglyZXN1bHQ9KGNvYXJzZV92YWx1ZSoxMjgrZmluZV92YWx1ZSk7CglyZXR1cm4gcmVzdWx0Owp9Cgp1aW50MzJfdCBkZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnX2MyKGNoYXIgdGVzdF9pbmRleCx1aW50MzJfdCB2YWx1ZSkgewoJdWludDMyX3QgcmVzdWx0PTA7IC8vYml0MC0xNSBmaW5lIHZhbHVlICxiaXQgMTYtMzIgY29hcnNlIHZhbHVlCglpZiAoKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgKQoJewoJCWlmICh2YWx1ZT4oMyoxMjgrMTI3KSkKCQkJdmFsdWU9KDMqMTI4KzEyNyk7CgkJcmVzdWx0PSh2YWx1ZSUxMjgpKygodmFsdWUvMTI4KTw8MTYpOwoJfQoJZWxzZSBpZigodGVzdF9pbmRleD09RE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKXx8KHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKSkKCXsKCQlpZiAodmFsdWU+KDcqMTI4KzEyNykpCgkJCXZhbHVlPSg3KjEyOCsxMjcpOwoJCXJlc3VsdD0odmFsdWUlMTI4KSsoKHZhbHVlLzEyOCk8PDE2KTsKCX0KCWVsc2UgaWYoKHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSl8fCh0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkpCgl7CgkJaWYgKHZhbHVlPigxKjEyOCsxMjcpKQoJCQl2YWx1ZT0oMSoxMjgrMTI3KTsKCQlyZXN1bHQ9dmFsdWU7Cgl9CgllbHNlIGlmKCh0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhFTkRMWSkpCgl7CgkJaWYgKHZhbHVlPigzMSoxMjgrMTI3KSkKCQkJdmFsdWU9KDMxKjEyOCsxMjcpOwoJCXJlc3VsdD0odmFsdWUlMTI4KSsoKHZhbHVlLzEyOCk8PDE2KTsKCX0KCWVsc2UgaWYoKHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9TT0NfVlJFRikpCgl7CgkJaWYgKHZhbHVlPig2MykpCgkJCXZhbHVlPSg2Myk7CgkJcmVzdWx0PXZhbHVlOwoJfQoJcmV0dXJuIHJlc3VsdDsKfQoKdWludDMyX3QgIGRkcl9kaXNhYmxlX3VwZGF0ZV9kZWxheV9saW5lX2MyKHZvaWQpIHsKCS8vY29uZmlnIHBoeSB1cGRhdGUgdXNlIHJlZ2lzdGVyIGNoYW5nZSBhbmQgY3RybCB1cGRhdGUgcmVxIGFuZCBjb25kaXRpb24scG93ZXIgb24gZGVmYXVsdCBpcyBvciBjb25kaXRpb24KCS8vZGlzYWJsZSBjdHJsIHVwZGF0ZSByZXEKCXJldHVybiAxOwp9Cgp1aW50MzJfdCAgZGRyX2VuYWJsZV91cGRhdGVfZGVsYXlfbGluZV9jMih2b2lkKSB7CgkvL2NvbmZpZyBwaHkgdXBkYXRlIHVzZSByZWdpc3RlciBjaGFuZ2UgYW5kIGN0cmwgdXBkYXRlIHJlcSBhbmQgY29uZGl0aW9uLHBvd2VyIG9uIGRlZmF1bHQgaXMgb3IgY29uZGl0aW9uCgkvL2VuYWJsZSBjdHJsIHVwZGF0ZSByZXEKCXJldHVybiAxOwp9Cgp1aW50MzJfdCBkZHJfcGh5X3RyYWluaW5nX3JlZ19yZWFkX3dyaXRlKGRkcl9zZXRfdF9jMiAqcF9kZHJzICxjaGFyIGluZGV4LAoJdWludDMyX3Qgc3ViX2luZGV4LHVpbnQzMl90IHJlYWRfd3JpdGVfdmFsdWUsY2hhciByZWFkX3dyaXRlX2VuYWJsZSxjaGFyIHBzKQp7CgkvL3JlYWRfd3JpdGVfdmFsdWUJYml0MC0xNSBmaW5lIHZhbHVlICxiaXQgMTYtMzIgY29hcnNlIHZhbHVlCgl1aW50MzJfdCBkZWxheV9vbGRfdmFsdWU9MDsKCXVpbnQzMl90IGRlbGF5X25ld192YWx1ZT0wOwoJdWludDMyX3QgZGVsYXlfcmVnX2NvYXJzZV92YWx1ZT0wOwoJdWludDMyX3QgZGVsYXlfcmVnX2ZpbmVfdmFsdWU9MDsKCXVpbnQ2NF90IHJlZ19hZGRfY29hcnNlPTA7Cgl1aW50MzJfdCByZWdfYWRkX2NvYXJzZV9iaXRfbWFzaz0wOwoJdWludDY0X3QgcmVnX2FkZF9maW5lPTA7Cgl1aW50MzJfdCByZWdfYWRkX2ZpbmVfYml0X21hc2s9MDsKCXVpbnQ2NF90IGFkZF9iYXNlID0gKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKTsKCXVpbnQzMl90IHJlZ19vZmZzZXQ9MDsKCSNkZWZpbmUgCUREUl9YMzJfRjBfQTgwMCAgKDB4ODAwKQoJI2RlZmluZSAJRERSX1gzMl9GMF9BODA0ICAoMHg4MDQpCgkjZGVmaW5lIAlERFJfWDMyX0YwX0E4MDggICgweDgwOCkKCSNkZWZpbmUgCUREUl9YMzJfRjBfQTgxMCAgKDB4ODEwKQoJI2RlZmluZSAJRERSX1gzMl9GMF9BODI4ICAoMHg4MjgpCgkjZGVmaW5lIAlERFJfWDMyX0YwX0E4MkMgICgweDgyYykKCSNkZWZpbmUgCUREUl9YMzJfRjBfQTg0MCAgKDB4ODQwKQoJI2RlZmluZSAJRERSX1gzMl9GMF9BODQ0ICAoMHg4NDQpCgkjZGVmaW5lIAlERFJfWDMyX0YwX0E4NTAgICgweDg1MCkKCSNkZWZpbmUgCUREUl9YMzJfRjBfQTg1OCAgKDB4ODU4KQoJI2RlZmluZSAJRERSX1gzMl9GMF9BODkwICAoMHg4OTApCgkjZGVmaW5lIAlERFJfWDMyX0YwX0E4RDAgICgweDhkMCkKCSNkZWZpbmUgCUREUl9YMzJfRjBfQThGMCAgKDB4OEYwKQoJI2RlZmluZSAJRERSX1gzMl9GMF9BOEY4ICAoMHg4RjgpCgkjZGVmaW5lIAlERFJfWDMyX0YwX0E4RDQgICgweDhkNCkKCSNkZWZpbmUgCUREUl9YMzJfRjBfQTkzMCAgKDB4OTMwKQoJI2RlZmluZSAJRERSX1gzMl9GMF9BQzA4ICAoMHhjMDgpCgkjZGVmaW5lIAlERFJfWDMyX0YwX0FDMkMgICgweGMyYykKCSNkZWZpbmUgCUREUl9YMzJfRjBfQUM0MCAgKDB4YzQwKQoJI2RlZmluZSAJRERSX1gzMl9GMF9BQzQ0ICAoMHhjNDQpCgkjZGVmaW5lIAlERFJfWDMyX0YwX0FDNTAgICgweGM1MCkKCSNkZWZpbmUgCUREUl9YMzJfRjBfQUM1OCAgKDB4YzU4KQoJI2RlZmluZSAJRERSX1gzMl9GMF9BQ0QwICAoMHhjZDApCgkjZGVmaW5lIAlERFJfWDMyX0YwX0FDRDQgICgweGNkNCkKCSNkZWZpbmUgCUREUl9YMzJfRjBfQUNGMCAgKDB4Y2YwKQoJI2RlZmluZSAJRERSX1gzMl9GMF9BQ0Y4ICAoMHhjZjgpCgkjZGVmaW5lIAlERFJfWDMyX0YwX0FEMzAgICgweEQzMCkKCSNpZiAwCglyZWdfb2Zmc2V0PShwX2Rldi0+cF9kZHJfZndfaW50ZXJfbWVzc2FnZS0+cF9kZHJfY29tbW9uX21lc3NhZ2UtPmN1cl9wc3RhdGUpKigKCQlwX2Rldi0+cF9kZHJfZndfaW50ZXJfbWVzc2FnZS0+cF9kZHJfY29tbW9uX21lc3NhZ2UKCQktPmRkcl9jb21tb25fcmVnX2Jhc2VfYWRkX3AtPmFtbF9waHlfYmFzZV9mMV9hZGQtCgkJcF9kZXYtPnBfZGRyX2Z3X2ludGVyX21lc3NhZ2UtPnBfZGRyX2NvbW1vbl9tZXNzYWdlCgkJLT5kZHJfY29tbW9uX3JlZ19iYXNlX2FkZF9wLT5hbWxfcGh5X2Jhc2VfZjBfYWRkKTsKCSNlbmRpZgoJcmVnX29mZnNldD1wcyooMHgxMDAwKTsKCWlmICghaW5kZXgpIHsKCQlyZXR1cm4JcmVhZF93cml0ZV92YWx1ZTsKCX0KCS8vZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWdfYzIob3Zlcl9yaWRlX2luZGV4LCBvdmVyX3JpZGVfdmFsdWUpOwoJLy9hYyBncm91cDAgdGhlbiBhYyBncm91cDEKCWlmIChpbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKQoJewoJCWlmIChzdWJfaW5kZXg8OCkgLy9hYyBncm91cCAwCgkJewoJCQlzd2l0Y2gJKHN1Yl9pbmRleCkKCQkJewoJCQkJY2FzZQkJMDoJLy9ja2UwCgkJCQkJcmVnX2FkZF9jb2Fyc2U9KGFkZF9iYXNlK0REUl9YMzJfRjBfQTgwOCtyZWdfb2Zmc2V0KTsKCQkJCQlyZWdfYWRkX2ZpbmU9KGFkZF9iYXNlK0REUl9YMzJfRjBfQTgyQytyZWdfb2Zmc2V0KTsKCQkJCQlyZWdfYWRkX2NvYXJzZV9iaXRfbWFzaz0ofigzPDw0KSk7CgkJCQkJcmVnX2FkZF9maW5lX2JpdF9tYXNrPSh+KDB4N2Y8PDE2KSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlCQkxOgkvL2NrZTEKCQkJCQlyZWdfYWRkX2NvYXJzZT0oYWRkX2Jhc2UrRERSX1gzMl9GMF9BQzA4K3JlZ19vZmZzZXQpOwoJCQkJCXJlZ19hZGRfZmluZT0oYWRkX2Jhc2UrRERSX1gzMl9GMF9BQzJDK3JlZ19vZmZzZXQpOwoJCQkJCXJlZ19hZGRfY29hcnNlX2JpdF9tYXNrPSh+KDM8PDQpKTsKCQkJCQlyZWdfYWRkX2ZpbmVfYml0X21hc2s9KH4oMHg3Zjw8MTYpKTsKCQkJCQlicmVhazsKCQkJCWNhc2UJCTI6CS8vY3MwCgkJCQkJcmVnX2FkZF9jb2Fyc2U9KGFkZF9iYXNlK0REUl9YMzJfRjBfQTgwOCtyZWdfb2Zmc2V0KTsKCQkJCQlyZWdfYWRkX2ZpbmU9KGFkZF9iYXNlK0REUl9YMzJfRjBfQTgyQytyZWdfb2Zmc2V0KTsKCQkJCQlyZWdfYWRkX2NvYXJzZV9iaXRfbWFzaz0ofigzPDwyKSk7CgkJCQkJcmVnX2FkZF9maW5lX2JpdF9tYXNrPSh+KDB4N2Y8PDgpKTsKCQkJCQlicmVhazsKCQkJCWNhc2UJCTM6CS8vY3MxCgkJCQkJcmVnX2FkZF9jb2Fyc2U9KGFkZF9iYXNlK0REUl9YMzJfRjBfQUMwOCtyZWdfb2Zmc2V0KTsKCQkJCQlyZWdfYWRkX2ZpbmU9KGFkZF9iYXNlK0REUl9YMzJfRjBfQUMyQytyZWdfb2Zmc2V0KTsKCQkJCQlyZWdfYWRkX2NvYXJzZV9iaXRfbWFzaz0ofigzPDwyKSk7CgkJCQkJcmVnX2FkZF9maW5lX2JpdF9tYXNrPSh+KDB4N2Y8PDgpKTsKCQkJCQlicmVhazsKCQkJCWNhc2UJCTQ6CS8vb2R0MAoJCQkJCXJlZ19hZGRfY29hcnNlPShhZGRfYmFzZStERFJfWDMyX0YwX0E4MDgrcmVnX29mZnNldCk7CgkJCQkJcmVnX2FkZF9maW5lPShhZGRfYmFzZStERFJfWDMyX0YwX0E4MkMrcmVnX29mZnNldCk7CgkJCQkJcmVnX2FkZF9jb2Fyc2VfYml0X21hc2s9KH4oMzw8MCkpOwoJCQkJCXJlZ19hZGRfZmluZV9iaXRfbWFzaz0ofigweDdmPDwwKSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlCQk1OgkvL29kdDEKCQkJCQlyZWdfYWRkX2NvYXJzZT0oYWRkX2Jhc2UrRERSX1gzMl9GMF9BQzA4K3JlZ19vZmZzZXQpOwoJCQkJCXJlZ19hZGRfZmluZT0oYWRkX2Jhc2UrRERSX1gzMl9GMF9BQzJDK3JlZ19vZmZzZXQpOwoJCQkJCXJlZ19hZGRfY29hcnNlX2JpdF9tYXNrPSh+KDM8PDApKTsKCQkJCQlyZWdfYWRkX2ZpbmVfYml0X21hc2s9KH4oMHg3Zjw8MCkpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZQkJNjoJLy9jbGsKCQkJCQlyZWdfYWRkX2NvYXJzZT0oYWRkX2Jhc2UrRERSX1gzMl9GMF9BODA0K3JlZ19vZmZzZXQpOwoJCQkJCXJlZ19hZGRfZmluZT0oYWRkX2Jhc2UrRERSX1gzMl9GMF9BODI4K3JlZ19vZmZzZXQpOwoJCQkJCXJlZ19hZGRfY29hcnNlX2JpdF9tYXNrPSh+KDE8PDE4KSk7CgkJCQkJcmVnX2FkZF9maW5lX2JpdF9tYXNrPSh+KDB4N2Y8PDgpKTsKCQkJCQlicmVhazsKCQkJCWNhc2UJCTc6CgkJCQkJcmVnX2FkZF9jb2Fyc2U9MDsKCQkJCQlyZWdfYWRkX2ZpbmU9MDsKCQkJCQlicmVhazsKCQkJfQoJCX0KCQllbHNlIGlmCShzdWJfaW5kZXg8KDgrMTYpKS8vLy9hYyBncm91cCAxCgkJewoJCQlyZWdfYWRkX2NvYXJzZT0oYWRkX2Jhc2UrRERSX1gzMl9GMF9BODAwKygoKHN1Yl9pbmRleC04KS8xNik8PDIpK3JlZ19vZmZzZXQpOwoJCQlyZWdfYWRkX2ZpbmU9KGFkZF9iYXNlK0REUl9YMzJfRjBfQTgxMCsoKChzdWJfaW5kZXgtOCkvNCk8PDIpK3JlZ19vZmZzZXQpOwoJCQlyZWdfYWRkX2NvYXJzZV9iaXRfbWFzaz0ofigzPDwoKChzdWJfaW5kZXgtOCklMTYpPDwxKSkpOwoJCQlyZWdfYWRkX2ZpbmVfYml0X21hc2s9KH4oMHg3Zjw8KCgoc3ViX2luZGV4LTgpJTQpKjgpKSk7CgkJfQoJCWVsc2UgaWYJKHN1Yl9pbmRleDwoOCsxNis0KSkKCQl7CgkJCXJlZ19hZGRfY29hcnNlPTA7CgkJCXJlZ19hZGRfZmluZT0wOwoJCX0KCQllbHNlIGlmCShzdWJfaW5kZXg8KDgrMTYrNCszKSkKCQl7CgkJCXJlZ19hZGRfY29hcnNlPShhZGRfYmFzZStERFJfWDMyX0YwX0E4MDArKCgoc3ViX2luZGV4LTgtNCkvMTYpPDwyKStyZWdfb2Zmc2V0KTsKCQkJcmVnX2FkZF9maW5lPShhZGRfYmFzZStERFJfWDMyX0YwX0E4MTArKCgoc3ViX2luZGV4LTgtNCkvNCk8PDIpK3JlZ19vZmZzZXQpOwoJCQlyZWdfYWRkX2NvYXJzZV9iaXRfbWFzaz0ofigzPDwoKChzdWJfaW5kZXgtOC00KSUxNik8PDEpKSk7CgkJCXJlZ19hZGRfZmluZV9iaXRfbWFzaz0ofigweDdmPDwoKChzdWJfaW5kZXgtOC00KSU0KSo4KSkpOwoJCX0KCQllbHNlIGlmCShzdWJfaW5kZXg8KDgrMTYrNCszKzIpKQoJCXsKCQkJcmVnX2FkZF9jb2Fyc2U9MDsKCQkJcmVnX2FkZF9maW5lPTA7CgkJfQoJCWVsc2UgaWYJKHN1Yl9pbmRleDwoOCsyOCkpCgkJewoJCQlyZWdfYWRkX2NvYXJzZT0oYWRkX2Jhc2UrRERSX1gzMl9GMF9BODAwKygoKHN1Yl9pbmRleC04LTQtMisyKS8xNik8PDIpK3JlZ19vZmZzZXQpOwoJCQlyZWdfYWRkX2ZpbmU9KGFkZF9iYXNlK0REUl9YMzJfRjBfQTgxMCsoKChzdWJfaW5kZXgtOC00LTIrMikvNCk8PDIpK3JlZ19vZmZzZXQpOwoJCQlyZWdfYWRkX2NvYXJzZV9iaXRfbWFzaz0ofigzPDwoKChzdWJfaW5kZXgtOC00LTIrMiklMTYpPDwxKSkpOwoJCQlyZWdfYWRkX2ZpbmVfYml0X21hc2s9KH4oMHg3Zjw8KCgoc3ViX2luZGV4LTgtNC0yKzIpJTQpKjgpKSk7CgkJfQoJCWVsc2UKCQl7CgkJCXJlZ19hZGRfY29hcnNlPTA7CgkJCXJlZ19hZGRfZmluZT0wOwoJCX0KCQkvL2RlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCX0KCWVsc2UJaWYgKGluZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkKCXsKCQlyZWdfYWRkX2NvYXJzZT0oYWRkX2Jhc2UrRERSX1gzMl9GMF9BOEQ0KyhzdWJfaW5kZXgvNCkqKAoJCQlERFJfWDMyX0YwX0FDRDQtRERSX1gzMl9GMF9BOEQ0KSsoKChzdWJfaW5kZXglNCk8PDEpPDwyKStyZWdfb2Zmc2V0KTsKCQlyZWdfYWRkX2ZpbmU9KGFkZF9iYXNlK0REUl9YMzJfRjBfQThGOCsoc3ViX2luZGV4LzQpKigKCQkJRERSX1gzMl9GMF9BQ0Y4LUREUl9YMzJfRjBfQThGOCkrKChzdWJfaW5kZXglNCk8PDQpK3JlZ19vZmZzZXQpOwoJCXJlZ19hZGRfY29hcnNlX2JpdF9tYXNrPSh+KDM8PCgoNCkpKSk7CgkJcmVnX2FkZF9maW5lX2JpdF9tYXNrPSh+KDB4N2Y8PDgpKTsKCX0KCWVsc2UJaWYgKGluZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSkKCXsKCQlyZWdfYWRkX2NvYXJzZT0wOwoJCXJlZ19hZGRfZmluZT0oYWRkX2Jhc2UrRERSX1gzMl9GMF9BODU4KyhzdWJfaW5kZXgvNCkqKAoJCQlERFJfWDMyX0YwX0FDNTgtRERSX1gzMl9GMF9BODU4KSsoKHN1Yl9pbmRleCU0KTw8NCkrcmVnX29mZnNldCk7CgkJcmVnX2FkZF9jb2Fyc2VfYml0X21hc2s9MDsKCQlyZWdfYWRkX2ZpbmVfYml0X21hc2s9KH4oMHhmZjw8KDgpKSk7Cgl9CgkvL2QwLWQ3IGRtMCBkOC1kMTUgZG0xLi4uCgllbHNlCWlmIChpbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkKCXsKCQlyZWdfYWRkX2NvYXJzZT0oYWRkX2Jhc2UrRERSX1gzMl9GMF9BOEQwKyhzdWJfaW5kZXgvMzYpKihERFJfWDMyX0YwX0FDRDAKCQkJLUREUl9YMzJfRjBfQThEMCkrKCgoKHN1Yl9pbmRleCUzNikvOSk8PDEpPDwyKSsoKCgoKHN1Yl9pbmRleCklOSkvOCkpPDwyKStyZWdfb2Zmc2V0KTsKCQlyZWdfYWRkX2ZpbmU9KGFkZF9iYXNlK0REUl9YMzJfRjBfQThGMCsoc3ViX2luZGV4LzM2KSooRERSX1gzMl9GMF9BQ0YwCgkJCS1ERFJfWDMyX0YwX0E4RjApKygoKChzdWJfaW5kZXglMzYpLzkpKTw8NCkrKCgoKChzdWJfaW5kZXgpJTkpKT4+Mik8PDIpK3JlZ19vZmZzZXQpOwoJCXJlZ19hZGRfY29hcnNlX2JpdF9tYXNrPSh+KDc8PCgoKCgoc3ViX2luZGV4KSU5KSU4KTw8MikpKSk7CgkJcmVnX2FkZF9maW5lX2JpdF9tYXNrPSh+KDB4N2Y8PCgoKCgoc3ViX2luZGV4KSU5KSU0KTw8MykpKSk7Cgl9CgkvL2QwLWQ3IGRtMCBkOC1kMTUgZG0xLi4uCgllbHNlCWlmIChpbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkKCXsKCQlyZWdfYWRkX2NvYXJzZT0wOwoJCXJlZ19hZGRfZmluZT0oYWRkX2Jhc2UrRERSX1gzMl9GMF9BODUwKyhzdWJfaW5kZXgvMzYpKihERFJfWDMyX0YwX0FDNTAKCQkJLUREUl9YMzJfRjBfQTg1MCkrKCgoKHN1Yl9pbmRleCUzNikvOSkpPDw0KSsoKChzdWJfaW5kZXglOSk+PjIpPDwyKStyZWdfb2Zmc2V0KTsKCQlyZWdfYWRkX2NvYXJzZV9iaXRfbWFzaz0wOwoJCXJlZ19hZGRfZmluZV9iaXRfbWFzaz0ofigweGZmPDwoKCgoKHN1Yl9pbmRleCklOSklNCk8PDMpKSkpOwoJfQoJZWxzZQlpZiAoaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkpCgl7CgkJcmVnX2FkZF9jb2Fyc2U9KGFkZF9iYXNlK0REUl9YMzJfRjBfQTg0MCsoc3ViX2luZGV4LzQpKihERFJfWDMyX0YwX0FDNDAKCQkJLUREUl9YMzJfRjBfQTg0MCkrcmVnX29mZnNldCk7CgkJcmVnX2FkZF9maW5lPShhZGRfYmFzZStERFJfWDMyX0YwX0E4NDQrKHN1Yl9pbmRleC80KSooRERSX1gzMl9GMF9BQzQ0CgkJCS1ERFJfWDMyX0YwX0E4NDQpK3JlZ19vZmZzZXQpOwoJCXJlZ19hZGRfY29hcnNlX2JpdF9tYXNrPSh+KDB4MWY8PCgoc3ViX2luZGV4PDwzKSkpKTsKCQlyZWdfYWRkX2ZpbmVfYml0X21hc2s9KH4oMHg3Zjw8KChzdWJfaW5kZXg8PDMpKSkpOwoJfQoJZWxzZQlpZiAoaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGKQoJewoJCWlmCShzdWJfaW5kZXg8KDM2KSkJLy92cmVmIGRxIGFuZCBkYmkKCQl7CgkJCXJlZ19hZGRfY29hcnNlPTA7CgkJCXJlZ19hZGRfZmluZT0oYWRkX2Jhc2UrRERSX1gzMl9GMF9BODkwKygoKHN1Yl9pbmRleC85KSo0KTw8MikKCQkJCSsoKChzdWJfaW5kZXglOSk+PjIpPDwyKStyZWdfb2Zmc2V0KTsKCQkJcmVnX2FkZF9jb2Fyc2VfYml0X21hc2s9MDsKCQkJcmVnX2FkZF9maW5lX2JpdF9tYXNrPSh+KDB4M2Y8PCgoKCgoc3ViX2luZGV4KSU5KSU0KTw8MykpKSk7CgkJfQoJCWVsc2UgaWYJKHN1Yl9pbmRleDwoNDQpKQkvL3ZyZWYgZHFzIGFuZCBkcXNuCgkJewoJCQlyZWdfYWRkX2NvYXJzZT0wOwoJCQlyZWdfYWRkX2ZpbmU9KGFkZF9iYXNlK0REUl9YMzJfRjBfQTg5MCs4KygoKChzdWJfaW5kZXgtMzYpLzIpKjQpPDwyKStyZWdfb2Zmc2V0KTsKCQkJcmVnX2FkZF9jb2Fyc2VfYml0X21hc2s9MDsKCQkJcmVnX2FkZF9maW5lX2JpdF9tYXNrPSh+KDB4M2Y8PCgoKCgoc3ViX2luZGV4LTM2KSUyKSk8PDMpKzgpKSk7CgkJfQoJfQoJZWxzZQlpZiAoaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0RSQU1fVlJFRikKCXsKCQlpZgkoc3ViX2luZGV4PCgzNikpCS8vRERSX1gzMl9GMF9BRDMwCUREUl9YMzJfRjBfQTkzMAoJCXsKCQkJcmVnX2FkZF9jb2Fyc2U9MDsKCQkJcmVnX2FkZF9maW5lPShhZGRfYmFzZStERFJfWDMyX0YwX0E5MzArCgkJCQkoKEREUl9YMzJfRjBfQUQzMC1ERFJfWDMyX0YwX0E5MzApKnN1Yl9pbmRleCUyKStyZWdfb2Zmc2V0KTsKCQkJcmVnX2FkZF9jb2Fyc2VfYml0X21hc2s9MDsKCQkJcmVnX2FkZF9maW5lX2JpdF9tYXNrPSh+KDB4ZmY8PDApKTsKCQl9Cgl9CgllbHNlCWlmIChpbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfRVhURVJBX1BTKQoJewoJCWlmCShzdWJfaW5kZXggPT0gMSkJLy9ERFJfWDMyX0YwX0FEMzAJRERSX1gzMl9GMF9BOTMwCgkJewoJCQkvL2lmIChyZWFkX3dyaXRlX2VuYWJsZSA9PSBSRUdJU1RFUl9SRUFEKQoJCQkvL3JlYWRfd3JpdGVfdmFsdWU9ZGRyX2dldF9kcXNfZ2F0ZV9tb2RlKCk7CgkJCS8vaWYocmVhZF93cml0ZV9lbmFibGU9PVJFR0lTVEVSX1dSSVRFKQoJCQkvLwlkZHJfc2V0X2Rxc19nYXRlX21vZGUocmVhZF93cml0ZV92YWx1ZSk7CgkJfQoKCQlyZXR1cm4JcmVhZF93cml0ZV92YWx1ZTsKCX0KCS8vaWYocmVhZF93cml0ZV9lbmFibGU9PVJFR0lTVEVSX1JFQUQpCgl7CgkJaWYgKHJlZ19hZGRfY29hcnNlKQoJCQlkZWxheV9yZWdfY29hcnNlX3ZhbHVlPSgoKHJkX3JlZyhyZWdfYWRkX2NvYXJzZSkpJih+cmVnX2FkZF9jb2Fyc2VfYml0X21hc2spKQoJCQk+PihkZHJfbWFza19jb252ZXJ0X29mZnNldChyZWdfYWRkX2NvYXJzZV9iaXRfbWFzaykpKTsKCQlpZiAocmVnX2FkZF9maW5lKQoJCQlkZWxheV9yZWdfZmluZV92YWx1ZT0oKChyZF9yZWcocmVnX2FkZF9maW5lKSkmKH5yZWdfYWRkX2ZpbmVfYml0X21hc2spKQoJCQk+PihkZHJfbWFza19jb252ZXJ0X29mZnNldChyZWdfYWRkX2ZpbmVfYml0X21hc2spKSk7CgoJCWRlbGF5X29sZF92YWx1ZT0oKGRlbGF5X3JlZ19jb2Fyc2VfdmFsdWU8PDE2KXxkZWxheV9yZWdfZmluZV92YWx1ZSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcF9jMihpbmRleCxkZWxheV9vbGRfdmFsdWUpOwoJfQoKCWlmIChyZWFkX3dyaXRlX2VuYWJsZSA9PSBSRUdJU1RFUl9SRUFEKQoJewoJCXJlYWRfd3JpdGVfdmFsdWU9ZGVsYXlfb2xkX3ZhbHVlOwoJfQoJZWxzZQlpZihyZWFkX3dyaXRlX2VuYWJsZT09UkVHSVNURVJfV1JJVEUpCgl7CgkJZGVsYXlfbmV3X3ZhbHVlPXJlYWRfd3JpdGVfdmFsdWU7CgkJZGVsYXlfbmV3X3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWdfYzIoaW5kZXgsZGVsYXlfbmV3X3ZhbHVlKTsKCQkvLyNkZWZpbmUgRE1DX0RSQU1fUkVGUl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAwOTIgIDw8IDIpICsgMHhmZTAyNDQwMCkKCQl3cl9yZWcoICgoMHgwMDkyICA8PCAyKSArIDB4ZmUwMjQ0MDApICwweDIxKTsKCQl3cl9yZWcoMHhmZDAwMjQ0MCAsMCk7Ly9kZXRlY3Qgc2hvdWxkIHVwZGF0ZSBkZWxheSB3aGVuIGNvbnRyb2xsZXIgdXBkYXRlIGFycml2ZQoJCWlmIChyZWdfYWRkX2NvYXJzZSkKCQl7CgkJCXdyX3JlZyhyZWdfYWRkX2NvYXJzZSwoKHJkX3JlZyhyZWdfYWRkX2NvYXJzZSkpJihyZWdfYWRkX2NvYXJzZV9iaXRfbWFzaykpCgkJCXwoKGRlbGF5X25ld192YWx1ZT4+MTYpPDwoZGRyX21hc2tfY29udmVydF9vZmZzZXQocmVnX2FkZF9jb2Fyc2VfYml0X21hc2spKSkpOwoJCX0KCQlpZiAocmVnX2FkZF9maW5lKQoJCXsKCQkJd3JfcmVnKHJlZ19hZGRfZmluZSwoKHJkX3JlZyhyZWdfYWRkX2ZpbmUpKSYocmVnX2FkZF9maW5lX2JpdF9tYXNrKSkKCQkJfCgoZGVsYXlfbmV3X3ZhbHVlJjB4ZmZmZik8PChkZHJfbWFza19jb252ZXJ0X29mZnNldChyZWdfYWRkX2ZpbmVfYml0X21hc2spKSkpOwoJCX0KCQkvL3dyX3JlZygweGZkMDAyNDQwICwwKTsvL2RldGVjdCBzaG91bGQgdXBkYXRlIGRlbGF5IHdoZW4gY29udHJvbGxlciB1cGRhdGUgYXJyaXZlCgkJd3JfcmVnKDB4ZmQwMDI0NDAgLDEpOy8vZGV0ZWN0IHNob3VsZCB1cGRhdGUgZGVsYXkgd2hlbiBjb250cm9sbGVyIHVwZGF0ZSBhcnJpdmUKCQl3cl9yZWcoICgoMHgwMDkyICA8PCAyKSArIDB4ZmUwMjQ0MDApICwweDMxKTsKCX0KCSNpZiAwCgkvL2lmIChpbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfU09DX1ZSRUYpCgkvL2lmIChpbmRleCA9PURNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSkKCS8vaWYgKGluZGV4ID09RE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKQoJaWYgKGluZGV4ID09RE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkKCXsKCWlmIChyZWdfYWRkX2NvYXJzZSkKCQlkZHJfbG9nX2luZm8oTE9HX0NITF8wLCAiRERSIGRlYnVnIDEgJXMgLCVkLHJlZ19hZGRfY29hcnNlLCUwOHgsJTA4eCwlMDh4LCUwOHhcbiIsIF9fRklMRV9fLF9fTElORV9fLHJlZ19hZGRfY29hcnNlLGRlbGF5X3JlZ19jb2Fyc2VfdmFsdWUscmRfcmVnKHJlZ19hZGRfY29hcnNlKSxzdWJfaW5kZXgpOwoJaWYgKHJlZ19hZGRfZmluZSkKCQlkZHJfbG9nX2luZm8oTE9HX0NITF8wLCAiRERSIGRlYnVnIDEgJXMgLCVkLHJlZ19hZGRfZmluZSwlMDh4LGRlbGF5X25ld192YWx1ZSwlMDh4LCUwOHgsJTA4eFxuIiwgX19GSUxFX18sX19MSU5FX18scmVnX2FkZF9maW5lLGRlbGF5X25ld192YWx1ZSxyZF9yZWcocmVnX2FkZF9maW5lKSxzdWJfaW5kZXgpOwoJfQoJI2VuZGlmCgkjaWYgMAoJewoJaWYgKHJlZ19hZGRfY29hcnNlKQoJCXByaW50ZiggIkREUiBkZWJ1ZyAxICVzICwlZCxyZWdfYWRkX2NvYXJzZSwlMDh4LCUwOHgsJTA4eCwlMDh4XG4iLCBfX0ZJTEVfXyxfX0xJTkVfXyxyZWdfYWRkX2NvYXJzZSxkZWxheV9yZWdfY29hcnNlX3ZhbHVlLHJkX3JlZyhyZWdfYWRkX2NvYXJzZSksc3ViX2luZGV4KTsKCWlmIChyZWdfYWRkX2ZpbmUpCgkJcHJpbnRmKCAiRERSIGRlYnVnIDEgJXMgLCVkLHJlZ19hZGRfZmluZSwlMDh4LGRlbGF5X25ld192YWx1ZSwlMDh4LCUwOHgsJTA4eFxuIiwgX19GSUxFX18sX19MSU5FX18scmVnX2FkZF9maW5lLGRlbGF5X25ld192YWx1ZSxyZF9yZWcocmVnX2FkZF9maW5lKSxzdWJfaW5kZXgpOwoJfQoJcHJpbnRmKCAiRERSIGRlYnVnIDEgJXMgLCVkLGRlbGF5X29sZF92YWx1ZSwlMDh4LGRlbGF5X25ld192YWx1ZSwlMDh4LGluZGV4LCUwOHgsc3ViX2luZGV4LCUwOHhcbiIsIF9fRklMRV9fLF9fTElORV9fLGRlbGF5X29sZF92YWx1ZSxkZWxheV9uZXdfdmFsdWUsaW5kZXgsc3ViX2luZGV4KTsKCSNlbmRpZgoJcHJpbnRmKCAiZGVsYXlfb2xkX3ZhbHVlLCUwOHgscmVhZF93cml0ZV92YWx1ZSwlMDh4LGluZGV4LCUwOHgsc3ViX2luZGV4LCUwOHhcbiIsIGRlbGF5X29sZF92YWx1ZSxyZWFkX3dyaXRlX3ZhbHVlLGluZGV4LHN1Yl9pbmRleCk7CgoJcmV0dXJuCXJlYWRfd3JpdGVfdmFsdWU7CgkvL2Rkcl9kbWNfdXBkYXRlX2RlbGF5X3JlZ2lzdGVyX2FmdGVyKCk7Cn0KCnZvaWQgZGRyX3JlYWRfd3JpdGVfdHJhaW5pbmdfdmFsdWUoZGRyX3NldF90X2MyICpwX2RkcnMgLGNoYXIgb3Zlcl9yaWRlX2luZGV4LAoJY2hhciByZWFkX3dyaXRlLHVpbnQzMl90IHBzLHZvaWQgKmlucHV0LGNoYXIgcHJpbnQpCnsKCS8vcmV0dXJuIDsKCS8vdWludDY0X3QgcmVnX2FkZD0wOwoJLy9pbnQgb2xkX3BzPShwX2Rldi0+cF9kZHJfZndfaW50ZXJfbWVzc2FnZS0+cF9kZHJfY29tbW9uX21lc3NhZ2UtPmN1cl9wc3RhdGUpOwoJLy8ocF9kZXYtPnBfZGRyX2Z3X2ludGVyX21lc3NhZ2UtPnBfZGRyX2NvbW1vbl9tZXNzYWdlLT5jdXJfcHN0YXRlKT1wczsKCXVpbnQxNl90IHRfY291bnQ9MDsKCWNoYXIgY291bnRfbWF4PTcyOwoJdWludDE2X3QgdF9jb3VudF92YWx1ZT0wOwoJdWludDE2X3QgZGVsYXlfdGVtcD0wOwoJY2hhciAqaW5wdXRfdWludDhfcD1pbnB1dDsKCXVpbnQxNl90ICppbnB1dF91aW50MTZfcD1pbnB1dDsKCWNoYXIgcF9zaXplPTE7CgljaGFyIHJlYWRfc2tpcD0wOwoJLy91aW50MzJfdCAgcHM9cHNfdCYxOwoJZm9yICh0X2NvdW50PTA7dF9jb3VudDxjb3VudF9tYXg7dF9jb3VudCsrKQoJewoJCWlmICggKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKQoJCQl8fChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKQoJCQl8fChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkpCgkJCXx8IChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkpCgkJCXx8IChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKQoJCQl8fCAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKQoJCQl8fChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGKQoJCQkpCgkJewoJCQlpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpCgkJCXsKCQkJCXBfc2l6ZT0yOwoJCQkJY291bnRfbWF4PTM2OwoJCQl9CgkJCWVsc2UJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpCgkJCXsKCQkJCXBfc2l6ZT0yOwoJCQkJY291bnRfbWF4PTg7CgkJCX0KCQkJZWxzZQlpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKQoJCQl7CgkJCQlwX3NpemU9MTsKCQkJCWNvdW50X21heD03MjsKCQkJfQoJCQllbHNlCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkpCgkJCXsKCQkJCXBfc2l6ZT0yOwoJCQkJY291bnRfbWF4PTg7CgkJCX0KCQkJZWxzZQlpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSkKCQkJewoJCQkJcF9zaXplPTE7CgkJCQljb3VudF9tYXg9ODsKCQkJfQoJCQllbHNlCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpCgkJCXsKCQkJCXBfc2l6ZT0yOwoJCQkJY291bnRfbWF4PTcyOwoJCQl9CgkJCWVsc2UJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfU09DX1ZSRUYpCgkJCXsKCQkJCXBfc2l6ZT0xOwoJCQkJY291bnRfbWF4PTQ0OwoJCQl9CgkJCWVsc2UJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfRVhURVJBX1BTKQoJCQl7CXBfc2l6ZT0yOwoJCQkJY291bnRfbWF4PTg7CgkJCX0KCQkJaWYgKHJlYWRfd3JpdGUgPT0gUkVHSVNURVJfUkVBRCkKCQkJewoJCQkJcmVhZF9za2lwPTA7CgkJCQlpZiAoKHBzID09IDMpICYmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGKSkKCQkJCXsKCQkJCQlpZiAodF9jb3VudD4zNSkKCQkJCQkJcmVhZF9za2lwPTE7CgkJCQkJZWxzZQoJCQkJCXsvL3JvIHRyYWluaW5nIG5vIHZyZWYgdmFsdWUKCQkJCQkJaWYgKCh0X2NvdW50JTkpID09IDgpCgkJCQkJCQlyZWFkX3NraXA9MTsKCQkJCQl9CgkJCQl9CgkJCQl0X2NvdW50X3ZhbHVlPWRkcl9waHlfdHJhaW5pbmdfcmVnX3JlYWRfd3JpdGUocF9kZHJzLAoJCQkJCW92ZXJfcmlkZV9pbmRleCx0X2NvdW50LHRfY291bnRfdmFsdWUscmVhZF93cml0ZSxwcyk7CgkJCQlkZWxheV90ZW1wPXRfY291bnRfdmFsdWU7CgkJCQlpZiAocmVhZF9za2lwKQoJCQkJewoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCWlmIChwX3NpemUgPT0gMSkKCQkJCQkJKCppbnB1dF91aW50OF9wICk9ZGVsYXlfdGVtcDsKCQkJCQlpZiAocF9zaXplID09IDIpCgkJCQkJCSgqaW5wdXRfdWludDE2X3AgKT1kZWxheV90ZW1wOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaWYgKHBfc2l6ZSA9PSAxKQoJCQkJCWRlbGF5X3RlbXA9KCppbnB1dF91aW50OF9wICk7CgkJCQlpZiAocF9zaXplID09IDIpCgkJCQkJZGVsYXlfdGVtcD0oKmlucHV0X3VpbnQxNl9wICk7CgkJCQkvL3RfY291bnRfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsZGVsYXlfdGVtcCk7CgkJCQl0X2NvdW50X3ZhbHVlPWRlbGF5X3RlbXA7CgkJCQlkZHJfcGh5X3RyYWluaW5nX3JlZ19yZWFkX3dyaXRlKHBfZGRycyxvdmVyX3JpZGVfaW5kZXgsdF9jb3VudCx0X2NvdW50X3ZhbHVlLHJlYWRfd3JpdGUscHMpOwoJCQl9CgkJCWlmIChwX3NpemUgPT0gMSkKCQkJCWlucHV0X3VpbnQ4X3ArKzsKCQkJaWYgKHBfc2l6ZSA9PSAyKQoJCQkJaW5wdXRfdWludDE2X3ArKzsKCQkJaWYgKHByaW50ID09IEREUl9QUklOVF9FTkFCTEUpCgkJCXsKCQkJCXByaW50ZiggInRyYWluaW5nX2luZGV4CSVkCXN1Yl9pbmRleAklZAlwaGFzZQklZFxuIixvdmVyX3JpZGVfaW5kZXgsdF9jb3VudCx0X2NvdW50X3ZhbHVlKTsKCQkJfQoJCQllbHNlCgkJCXsgLy9tYXliZSBmdW5jaXRvbiB3aWxsICBiZSBvcHRpbWl6ZSBub3QgdXNlIHRoZSAgdmFyaWFibGUKCQkJCXByaW50ZiggInRyYWluaW5nX2luZGV4CSVkCXN1Yl9pbmRleAklZAlwaGFzZQklZFxuIixvdmVyX3JpZGVfaW5kZXgsdF9jb3VudCx0X2NvdW50X3ZhbHVlKTsKCQkJfQoJCX0KCX0KCS8vKHBfZGV2LT5wX2Rkcl9md19pbnRlcl9tZXNzYWdlLT5wX2Rkcl9jb21tb25fbWVzc2FnZS0+Y3VyX3BzdGF0ZSk9b2xkX3BzOwp9Cgp2b2lkIGRkcl9yZWFkX3dyaXRlX3RyYWluaW5nX2FsbF9kZWxheV92YWx1ZSAgKGRkcl9zZXRfdF9jMiAqcF9kZHJzICxjaGFyIHJlYWRfd3JpdGUsY2hhciBwcmludCkKewoJLy9kZHJfcmVhZF93cml0ZV90cmFpbmluZ192YWx1ZShwX2RldixETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZLAoJLy8JUkVHSVNURVJfV1JJVEUsMCxwX2Rldi0+cF9kZHJzLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzWzBdLmFjX3RyYWNlX2RlbGF5LEREUl9QUklOVF9FTkFCTEUpOwoJLy8jaWYgMQoJdWludDMyX3QgcHM9MDsKCS8vdWludDMyX3Qgb2xkX3BzPShwX2Rldi0+cF9kZHJfZndfaW50ZXJfbWVzc2FnZS0+cF9kZHJfY29tbW9uX21lc3NhZ2UtPmN1cl9wc3RhdGUpOwoJZm9yICggcHM9MDtwczwyOykKCXsKCQkvL3BfZGV2LT5wX2Rkcl9md19pbnRlcl9tZXNzYWdlLT5wX2Rkcl9jb21tb25fbWVzc2FnZS0+Y3VyX3BzdGF0ZT1wczsKCQlkZHJfcmVhZF93cml0ZV90cmFpbmluZ192YWx1ZShwX2RkcnMsRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSwKCQkJcmVhZF93cml0ZSxwcywmKHBfZGRycy0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uYWNfdHJhY2VfZGVsYXkpLHByaW50KTsKCQlkZHJfcmVhZF93cml0ZV90cmFpbmluZ192YWx1ZShwX2RkcnMsRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZLAoJCQlyZWFkX3dyaXRlLHBzLCYocF9kZHJzLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS53cml0ZV9kcXNfZGVsYXkpLHByaW50KTsKCQlkZHJfcmVhZF93cml0ZV90cmFpbmluZ192YWx1ZShwX2RkcnMsRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZLAoJCQlyZWFkX3dyaXRlLHBzLCYocF9kZHJzLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5yZWFkX2Rxc19kZWxheSkscHJpbnQpOwoJCWRkcl9yZWFkX3dyaXRlX3RyYWluaW5nX3ZhbHVlKHBfZGRycyxETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSwKCQkJcmVhZF93cml0ZSxwcywmKHBfZGRycy0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10ud3JpdGVfZHFfYml0X2RlbGF5KSxwcmludCk7CgkJZGRyX3JlYWRfd3JpdGVfdHJhaW5pbmdfdmFsdWUocF9kZHJzLERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZLAoJCQlyZWFkX3dyaXRlLHBzLCYocF9kZHJzLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5yZWFkX2RxX2JpdF9kZWxheSkscHJpbnQpOwoJCWRkcl9yZWFkX3dyaXRlX3RyYWluaW5nX3ZhbHVlKHBfZGRycyxETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhFTkRMWSwKCQkJcmVhZF93cml0ZSxwcywmKHBfZGRycy0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10ucmVhZF9kcXNfZ2F0ZV9kZWxheSkscHJpbnQpOwoJCWRkcl9yZWFkX3dyaXRlX3RyYWluaW5nX3ZhbHVlKHBfZGRycyxETUNfVEVTVF9XSU5ET1dfSU5ERVhfU09DX1ZSRUYsCgkJCXJlYWRfd3JpdGUscHMsJihwX2RkcnMtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLnNvY19iaXRfdnJlZikscHJpbnQpOwoJCWRkcl9yZWFkX3dyaXRlX3RyYWluaW5nX3ZhbHVlKHBfZGRycyxETUNfVEVTVF9XSU5ET1dfSU5ERVhfRVhURVJBX1BTLAoJCQlyZWFkX3dyaXRlLHBzLDAscHJpbnQpOwoKCQlwcz1wcysxOwoJfQp9Cgp1aW50MzJfdCBkZHJfZ2V0X2MyX2JkbHJfMTAwc3RlcF9taW4odm9pZCkKewoJdWludDMyX3QgYmRscl8xMDBzdGVwPTA7CgkvL3VpbnQzMl90IHBzPTA7Cgl1aW50MzJfdCBEUkFNRnJlcT0wOwoJdWludDMyX3Qgc3RpY2tfc3RvcmVfc3RpY2t5X2YwX3JlZ19iYXNlX3Q9KDB4ZmQwMDAwMDArMHgwMTI4KTsKCURSQU1GcmVxID0gcmRfcmVnKHN0aWNrX3N0b3JlX3N0aWNreV9mMF9yZWdfYmFzZV90KTsKCXVpbnQzMl90IGRsbF9jb3VudGVyPTA7Cgl1aW50MzJfdCBkbGxfY291bnRlcl9tYXg9MDsKCS8vZGxsX2NvdW50ZXI9cmRfcmVnKDB4ZmQwMDMxMjgpOwoJLy9kbGxfY291bnRlcj0oKChkbGxfY291bnRlciYweGZmKSsoKGRsbF9jb3VudGVyPj44KSYweGZmKSsoKGRsbF9jb3VudGVyPj4xNikmMHhmZikrKChkbGxfY291bnRlcj4+MjQpJjB4ZmYpKT4+Mik7CgoJZGxsX2NvdW50ZXI9KCgocmRfcmVnKDB4ZmQwMDMxMzApKSkpOwoJZGxsX2NvdW50ZXJfbWF4PWRkcl9tYXgoKGRsbF9jb3VudGVyJjB4ZmYpLCgoZGxsX2NvdW50ZXI+PjgpJjB4ZmYpKTsKCWRsbF9jb3VudGVyX21heD1kZHJfbWF4KGRsbF9jb3VudGVyX21heCwoKGRsbF9jb3VudGVyPj4xNikmMHhmZikpOwoJZGxsX2NvdW50ZXJfbWF4PWRkcl9tYXgoZGxsX2NvdW50ZXJfbWF4LCgoZGxsX2NvdW50ZXI+PjI0KSYweGZmKSk7CglkbGxfY291bnRlcl9tYXg9ZGxsX2NvdW50ZXJfbWF4P2RsbF9jb3VudGVyX21heDoxOwoJYmRscl8xMDBzdGVwPSgxMDAwMDAwMDAvKDIqKERSQU1GcmVxKSkpIC8gKGRsbF9jb3VudGVyX21heCk7CglyZXR1cm4gYmRscl8xMDBzdGVwOwp9Cgp1aW50MzJfdCBkZHJfZ2V0X2MyX2JkbHJfMTAwc3RlcF9tYXgodm9pZCkKewoJdWludDMyX3QgYmRscl8xMDBzdGVwPTA7CgkvL3VpbnQzMl90IHBzPTA7Cgl1aW50MzJfdCBEUkFNRnJlcT0wOwoJdWludDMyX3Qgc3RpY2tfc3RvcmVfc3RpY2t5X2YwX3JlZ19iYXNlX3Q9KDB4ZmQwMDAwMDArMHgwMTI4KTsKCURSQU1GcmVxID0gcmRfcmVnKHN0aWNrX3N0b3JlX3N0aWNreV9mMF9yZWdfYmFzZV90KTsKCXVpbnQzMl90IGRsbF9jb3VudGVyPTA7Cgl1aW50MzJfdCBkbGxfY291bnRlcl9taW49MDsKCS8vZGxsX2NvdW50ZXI9cmRfcmVnKDB4ZmQwMDMxMjgpOwoJLy9kbGxfY291bnRlcj0oKChkbGxfY291bnRlciYweGZmKSsoKGRsbF9jb3VudGVyPj44KSYweGZmKSsoKGRsbF9jb3VudGVyPj4xNikmMHhmZikrKChkbGxfY291bnRlcj4+MjQpJjB4ZmYpKT4+Mik7CgoJZGxsX2NvdW50ZXI9KCgocmRfcmVnKDB4ZmQwMDMxMmMpKSkpOwoJZGxsX2NvdW50ZXJfbWluPWRkcl9taW4oKGRsbF9jb3VudGVyJjB4ZmYpLCgoZGxsX2NvdW50ZXI+PjgpJjB4ZmYpKTsKCWRsbF9jb3VudGVyX21pbj1kZHJfbWluKGRsbF9jb3VudGVyX21pbiwoKGRsbF9jb3VudGVyPj4xNikmMHhmZikpOwoJZGxsX2NvdW50ZXJfbWluPWRkcl9taW4oZGxsX2NvdW50ZXJfbWluLCgoZGxsX2NvdW50ZXI+PjI0KSYweGZmKSk7CglkbGxfY291bnRlcl9taW49ZGxsX2NvdW50ZXJfbWluP2RsbF9jb3VudGVyX21pbjoxOwoJYmRscl8xMDBzdGVwPSgxMDAwMDAwMDAvKDIqKERSQU1GcmVxKSkpIC8gKGRsbF9jb3VudGVyX21pbik7CglyZXR1cm4gYmRscl8xMDBzdGVwOwp9Cgp1aW50MzJfdCBkZHJfZ2V0X2MyX2JkbHJfMTAwc3RlcCh2b2lkKQp7Cgl1aW50MzJfdCBiZGxyXzEwMHN0ZXA9MDsKCS8vdWludDMyX3QgcHM9MDsKCXVpbnQzMl90IERSQU1GcmVxPTA7CgkvL3VpbnQzMl90CWN1cl9wc3RhdGU9MDsvLyhyZF9yZWcoRE1DX0RSQU1fRlJFUV9DVFJMKSkmMTsKCXVpbnQzMl90IGRsbF9jb3VudGVyPTA7Cgl1aW50MzJfdCBzdGlja19zdG9yZV9zdGlja3lfZjBfcmVnX2Jhc2VfdD0oMHhmZDAwMDAwMCsweDAxMjgpOwoJRFJBTUZyZXEgPSByZF9yZWcoc3RpY2tfc3RvcmVfc3RpY2t5X2YwX3JlZ19iYXNlX3QpOwoJZGxsX2NvdW50ZXI9cmRfcmVnKDB4ZmQwMDMxMjgpOwoJZGxsX2NvdW50ZXI9KCgoZGxsX2NvdW50ZXImMHhmZikrKChkbGxfY291bnRlcj4+OCkmMHhmZikrKChkbGxfY291bnRlcj4+MTYpJjB4ZmYpKygoZGxsX2NvdW50ZXI+PjI0KSYweGZmKSk+PjIpOwoJLy9kd2NfZGRycGh5X2FwYl93cigoKCgoMDw8MjApfCgyPDwxNil8KDA8PDEyKXwoMHhlMykpKSksMHhjMDApOwoJYmRscl8xMDBzdGVwPSgxMDAwMDAwMDAvKDIqRFJBTUZyZXEpKSAvIChkbGxfY291bnRlcisxKTsKCXJldHVybiBiZGxyXzEwMHN0ZXA7Cn0KCnVpbnQzMl90IGRkcl9nZXRfYzJfYmRscl8xMDBzdGVwX2N1cih2b2lkKQp7Cgl1aW50MzJfdCBiZGxyXzEwMHN0ZXA9MDsKCS8vdWludDMyX3QgcHM9MDsKCXVpbnQzMl90IERSQU1GcmVxPTA7CgkvL3VpbnQzMl90CWN1cl9wc3RhdGU9MDsvLyhyZF9yZWcoRE1DX0RSQU1fRlJFUV9DVFJMKSkmMTsKCXVpbnQzMl90IGRsbF9jb3VudGVyPTA7Cgl1aW50MzJfdAlzdGlja19zdG9yZV9zdGlja3lfZjBfcmVnX2Jhc2VfdD0oMHhmZDAwMDAwMCsweDAxMjgpOwoJRFJBTUZyZXE9cmRfcmVnKHN0aWNrX3N0b3JlX3N0aWNreV9mMF9yZWdfYmFzZV90KTsKCWRsbF9jb3VudGVyPXJkX3JlZygweGZkMDAzMTAwKTsKCWRsbF9jb3VudGVyPSgoKGRsbF9jb3VudGVyPj4xKSYweGZmKSk7CgkvL2R3Y19kZHJwaHlfYXBiX3dyKCgoKCgwPDwyMCl8KDI8PDE2KXwoMDw8MTIpfCgweGUzKSkpKSwweGMwMCk7CgliZGxyXzEwMHN0ZXA9KDEwMDAwMDAwMC8oMipEUkFNRnJlcSkpIC8JKGRsbF9jb3VudGVyKzEpOwoJcmV0dXJuIGJkbHJfMTAwc3RlcDsKfQoKdWludDMyX3QgZGRyX2dldF91aV8xXzEyOF8xMDBzdGVwKHZvaWQpCnsKCXVpbnQzMl90IERSQU1GcmVxPTA7CgkvL0RSQU1GcmVxPXJkX3JlZygweGZkMDAwMjA4KTsKCXVpbnQzMl90IHN0aWNrX3N0b3JlX3N0aWNreV9mMF9yZWdfYmFzZV90PSgweGZkMDAwMDAwKzB4MDEyOCk7CglEUkFNRnJlcSA9IHJkX3JlZyhzdGlja19zdG9yZV9zdGlja3lfZjBfcmVnX2Jhc2VfdCk7CglyZXR1cm4gKCgxMDAwMDAwKjEwMC8oMioxMjgpKSAvICgoRFJBTUZyZXEpKSk7Cn0KCnVpbnQzMl90ICBkb19yZWFkX2MyX2Rkcl9iZGxyX3N0ZXBzKHZvaWQpCnsKCXVpbnQzMl90IERSQU1GcmVxPTA7CgkvL3VpbnQzMl90CXN0aWNrX3N0b3JlX3N0aWNreV9mMF9yZWdfYmFzZV90PSgweGZkMDAwMDAwKzB4MDEyOCk7CgkvL0RSQU1GcmVxPXJkX3JlZyhzdGlja19zdG9yZV9zdGlja3lfZjBfcmVnX2Jhc2VfdCk7CglEUkFNRnJlcT1nZXRfZGRyX2NsaygpOwoJcHJpbnRmKCJccmMyX2NoaXBfRFJBTUZyZXE9JWQgTUh6LDEwMG1pbl9iZGxyPSVkIHBzLDEwMG1heF9iZGxyPSVkIHBzLGF2ZV8xMDBfYmRscj0lZCBwcyxjdXJfMTAwX2JkbHI9JWQgcHMsYmRscl92YXI9JWQgdGhvdXNhbmRcbiIsCgkgRFJBTUZyZXEsZGRyX2dldF9jMl9iZGxyXzEwMHN0ZXBfbWluKCksZGRyX2dldF9jMl9iZGxyXzEwMHN0ZXBfbWF4KCksZGRyX2dldF9jMl9iZGxyXzEwMHN0ZXAoKSwKCSAyMDAwKihkZHJfZ2V0X2MyX2JkbHJfMTAwc3RlcF9tYXgoKS1kZHJfZ2V0X2MyX2JkbHJfMTAwc3RlcF9taW4oKSkvKGRkcl9nZXRfYzJfYmRscl8xMDBzdGVwX21heCgpK2Rkcl9nZXRfYzJfYmRscl8xMDBzdGVwX21pbigpKSxkZHJfZ2V0X2MyX2JkbHJfMTAwc3RlcF9jdXIoKSk7CgoJcmV0dXJuIGRkcl9nZXRfYzJfYmRscl8xMDBzdGVwKCk7Cn0KCmludCBkb19yZWFkX2MyX2Rkcl90cmFpbmluZ19kYXRhKGNoYXIgbG9nX2xldmVsLGRkcl9zZXRfdF9jMiAqZGRyX3NldF90X3ApCnsKCXVpbnQzMl90CXN0aWNrX3N0b3JlX3N0aWNreV9mMF9yZWdfYmFzZV90PSgweGZkMDAwMDAwKzB4MDEyOCk7Cgl1aW50MzJfdAlzdGlja19zdG9yZV9zdGlja3lfZjFfcmVnX2Jhc2VfdD0oMHhmZDAwMDAwMCsweDExMjgpOwoJLy9kZHJfc2V0X3QgKmRkcl9zZXRfdF9wPU5VTEw7CgkvL2Rkcl9zZXRfdF9wPShkZHJfc2V0X3QgKikoZGRyX3NldF90X3BfYXJyYXJ5KTsKCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbmRkcl9zZXRfdF9wPT0weCUwOHhcbiIsKHVpbnQzMl90KSh1aW50NjRfdCkoZGRyX3NldF90X3ApKTsKCXVpbnQzMl90IGxvb3A9MDsKCXVpbnQzMl90IGxvb3BfbWF4ID0gKDQrKDB4M2Y8PDIpKTsvLygoRE1DX1NUSUNLWV82My1ETUNfU1RJQ0tZXzApKTsKCS8vbG9vcF9tYXg9c2l6ZW9mKGRkcl9zZXRfdCk7Cglmb3IgKGxvb3AgPSAwOyBsb29wIDxsb29wX21heDsgbG9vcCs9NCkgewoJCXdyX3JlZygoKHVpbnQ2NF90KShkZHJfc2V0X3RfcCkgKyBsb29wKSwgcmRfcmVnKChwX2Rkcl9iYXNlLT5kZHJfZG1jX3N0aWNreTApICsgbG9vcCkpOwoJfQoJbG9vcF9tYXg9c2l6ZW9mKGJvYXJkX1NJX3NldHRpbmdfcHNfdCk7Cglmb3IgKGxvb3AgPSAwOyBsb29wIDwgbG9vcF9tYXg7IGxvb3ArPTQpCgl7CgkJd3JfcmVnKCgodWludDY0X3QpKCYoZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzWzBdKSkgKyBsb29wKSwgcmRfcmVnKChzdGlja19zdG9yZV9zdGlja3lfZjBfcmVnX2Jhc2VfdCArIGxvb3ApKSk7CgkJLy93cl9yZWcoKHN0aWNrX3N0b3JlX3N0aWNreV9mMF9yZWdfYmFzZV90ICsgbG9vcCksIHJkX3JlZygodWludHB0cl90KSgmKHBfZGV2LT5wX2RkcnMtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzWzBdKSkgKyBsb29wKSk7Cgl9Cglmb3IgKGxvb3AgPSAwOyBsb29wIDwgbG9vcF9tYXg7IGxvb3ArPTQpCgl7CgkJd3JfcmVnKCgodWludDY0X3QpKCYoZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzWzFdKSkgKyBsb29wKSwgcmRfcmVnKChzdGlja19zdG9yZV9zdGlja3lfZjFfcmVnX2Jhc2VfdCArIGxvb3ApKSk7CgkJLy9wcmludGYoIlxuY2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbMV0gcmVnWyVkXT0lMDh4XG4iLCgodWludDY0X3QpKCYoZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzWzFdKSkgKyBsb29wKSxyZF9yZWcoKHVpbnQ2NF90KSgmKGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1sxXSkpICsgbG9vcCkpOwoJCS8vd3JfcmVnKChzdGlja19zdG9yZV9zdGlja3lfZjBfcmVnX2Jhc2VfdCArIGxvb3ApLCByZF9yZWcoKHVpbnRwdHJfdCkoJihwX2Rldi0+cF9kZHJzLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1swXSkpICsgbG9vcCkpOwoJfQoJZm9yIChsb29wID0gMDsgbG9vcCA8TUVTT05fQ1BVX0NISVBfSURfU0laRTsgbG9vcCsrKSAgIC8vdXBkYXRlIGNoaXAgaWQKCXsKCQlkZHJfc2hhX2MyLnNoYV9jaGlwX2lkW2xvb3BdPWdsb2JhbF9jaGlwX2lkW2xvb3BdOwoJfQoJewoJCWJkbHJfMTAwc3RlcD1nZXRfYmRscl8xMDBzdGVwKGdsb2JhbF9kZHJfY2xrKTsKCQl1aV8xXzMyXzEwMHN0ZXA9KDEwMDAwMDAqMTAwLyhnbG9iYWxfZGRyX2NsayoyKjMyKSk7CgkJLy91aW50MzJfdCAgcHM9MDsKCQlkZHJfcmVhZF93cml0ZV90cmFpbmluZ19hbGxfZGVsYXlfdmFsdWUgIChkZHJfc2V0X3RfcCxSRUdJU1RFUl9SRUFELEREUl9QUklOVF9FTkFCTEUpOwoJfQoJcmV0dXJuIDE7Cn0KCmludCBkb19kZHJfZGlzcGxheV9jMl9kZHJfaW5mb3JtYXRpb24oY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglpbnQgaT0wOwoJdW5zaWduZWQgaW50IHBzPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgoJZG9fcmVhZF9jMl9kZHJfdHJhaW5pbmdfZGF0YSgwLGRkcl9zZXRfdF9wKTsKCgl7CgkJdWludDMyX3QgIGNvdW50PTA7CgkJdWludDMyX3QgIHJlZ19hZGRfb2Zmc2V0PTA7CgkJLy91aW50MTZfdCAgcmVnX3ZhbHVlPTA7CgkJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCJcbnBjdGwgdGltbWluZzpcbiIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQlwcmludGYoIlxuIFBDVEwgdGltbWluZzogMHgiKTsKCgkJZm9yIChjb3VudD0wO2NvdW50PCgocF9kZHJfYmFzZS0+ZGRyX3BjdGxfdGltaW5nX2VuZF9hZGRyZXNzKS0ocF9kZHJfYmFzZS0+ZGRyX3BjdGxfdGltaW5nX2Jhc2VfYWRkcmVzcykpOykgewoJCQlyZWdfYWRkX29mZnNldD0oKHBfZGRyX2Jhc2UtPmRkcl9wY3RsX3RpbWluZ19iYXNlX2FkZHJlc3MpKyhjb3VudCkpOwoJCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dHMoIlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dF9oZXgocmVnX2FkZF9vZmZzZXQsMzIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCI6ICIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJLy9kZHJfbG9nX3NlcmlhbF9wdXRfaGV4KHJlYWRsKHJlZ19hZGRfb2Zmc2V0KSwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQlwcmludGYoIlxuIHJlZ19hZGRfb2Zmc2V0OiAlMDh4ICUwOHggJTA4eCAiLHJlZ19hZGRfb2Zmc2V0LHJlYWRsKHJlZ19hZGRfb2Zmc2V0KSxyZWdfYWRkX29mZnNldCk7CgkJCWNvdW50PWNvdW50KzQ7CgkJfQoJCS8vZGRyX2xvZ19zZXJpYWxfcHV0cygiXG5tcnMgcmVnaXN0ZXI6IGJhc2UgKDB4NTQwMDA8PDEpK0REUl9QSFlfQkFTRSxieXRlIG9mZnNldFxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCXByaW50ZigiXG4gbXJzIHJlZ2lzdGVyOiAiKTsKCQlwcmludGYoIlxuIG1ycyByZWdpc3RlcjogYmFzZSAoMHg1NDAwMDw8MSkrRERSX1BIWV9CQVNFLCUwOHggIGJ5dGUgb2Zmc2V0XG4iLCgweDU0MDAwPDwxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKTsKCQkjaWYgMAoJCWZvciAoY291bnQ9MDtjb3VudDwweDgwOykgewoJCQlyZWdfYWRkX29mZnNldD0weDU0MDAwK2NvdW50Oy8vZHdjX2RkcnBoeV9hcGJfd3IoMHg1NDAwOCwweDEwMDEpOwoJCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dHMoIlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dF9oZXgoY291bnQsMzIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCI6ICIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJcmVnX3ZhbHVlPSAoKCoodm9sYXRpbGUgdWludDE2X3QgKikoKHVpbnQ2NF90KSgoKDB4NTQwMDArKGNvdW50Pj4xKSkpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKT4+KCgoY291bnQpJTIpPzg6MCkpOy8vZHdjX2RkcnBoeV9hcGJfcmQoMHg1NDAwMCthZGRfb2Zmc2V0KzEpOwoJCQlyZWdfdmFsdWU9cmVnX3ZhbHVlJjB4ZmY7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0X2hleChyZWdfdmFsdWUsMzIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJcHJpbnRmKCJcbiByZWdfYWRkX29mZnNldDogJTA4eCAlMDh4ICUwOHgiLHJlZ19hZGRfb2Zmc2V0LHJlZ192YWx1ZSwoKCgoMHg1NDAwMCsoY291bnQ+PjEpKSkgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpOwoJCQljb3VudD1jb3VudCsxOwoJCX0KCQkjZW5kaWYKCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dHMoIlxudGltbWluZy5jOlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoKCQlwcmludGYoIlxuIHN0aWNreSByZWdpc3RlcjogIik7CgkJewoJCQl1aW50MzJfdCBsb29wX21heCA9IDA7CgkJCWxvb3BfbWF4PTY0PDwyOy8vc2l6ZW9mKGRkcl9zZXRfdCk7CgkJCS8vdWludDMyX3QgbG9vcCA9IDA7CgkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxvb3BfbWF4OyBjb3VudCs9NCkgewoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0cygiXG4iLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCQkvLwlkZHJfbG9nX3NlcmlhbF9wdXRfaGV4KGNvdW50LDMyLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCQkvLwlkZHJfbG9nX3NlcmlhbF9wdXRzKCI6ICIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dF9oZXgocmRfcmVnKCh1aW50NjRfdCkocF9kZXYtPnBfZGRycykgKyBjb3VudCksMzIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJCS8vCWNvdW50PWNvdW50KzQ7CgkJCQlwcmludGYoIlxuIHJlZ19hZGRfb2Zmc2V0OiAlMDh4ICUwOHggJTA4eCIsY291bnQscmRfcmVnKCh1aW50NjRfdCkoKHBfZGRyX2Jhc2UtPmRkcl9kbWNfc3RpY2t5MCkpICsgY291bnQpLCgoKHBfZGRyX2Jhc2UtPmRkcl9kbWNfc3RpY2t5MCkpICsgY291bnQpKTsKCQkJfQoJCX0KCgkJewoJCQl1aW50MzJfdCBsb29wX21heCA9IDA7CgkJCWxvb3BfbWF4PXNpemVvZihkZHJfc2V0X3RfYzIpOwoJCQl1aW50MzJfdCBjb3VudCA9IDA7CgkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxvb3BfbWF4OyApIHsKCQkJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dHMoIlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0X2hleChjb3VudCwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0cygiOiAiLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCQkvLwlkZHJfbG9nX3NlcmlhbF9wdXRfaGV4KHJkX3JlZygodWludDY0X3QpKHBfZGV2LT5wX2RkcnMpICsgY291bnQpLDMyLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCQlwcmludGYoIlxuJTA4eCAlMDh4Iixjb3VudCxyZF9yZWcoKHVpbnQ2NF90KShkZHJfc2V0X3RfcCkgKyBjb3VudCkpOwoJCQkJY291bnQ9Y291bnQrNDsKCQkJCS8vcHJpbnRmKCJcbiByZWdfYWRkX29mZnNldDogJTA4eCAlMDh4ICUwOHgiLGNvdW50LHJkX3JlZygodWludDY0X3QpKChwX2Rkcl9iYXNlLT5kZHJfZG1jX3N0aWNreTApKSArIGNvdW50KSwoKChwX2Rkcl9iYXNlLT5kZHJfZG1jX3N0aWNreTApKSArIGNvdW50KSk7CgkJCX0KCQl9CgkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0cygiXG4iLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7Cgl9CgoJcHJpbnRmKCJcbiB7Iik7CgoJdWludDMyX3QgdGVtcF9jb3VudD0wOwoJewoJCXByaW50ZigiXG4vL29sZCBmYXN0X2Jvb3RbJWRdPTB4JTA4eCwvLyAlZCIsMCxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmZhc3RfYm9vdFswXSxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmZhc3RfYm9vdFswXSk7CgkJZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5mYXN0X2Jvb3RbMF09MHhmZDsgLy9hZGQgZm9yIGF1dG8gY29weSB0byAgY29kZSB0ZXN0CgkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8NDt0ZW1wX2NvdW50KyspCgkJCXByaW50ZigiXG4uY2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmZhc3RfYm9vdFslZF09MHglMDh4LC8vICVkIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZmFzdF9ib290W3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZmFzdF9ib290W3RlbXBfY291bnRdKTsKCgkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcudGltbWluZ19tYWdpYz0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcudGltbWluZ19tYWdpYyxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLnRpbW1pbmdfbWFnaWMpOwoJCXByaW50ZigiXG4uY2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLnRpbW1pbmdfbWF4X3ZhbGlkX2NvbmZpZ3M9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLnRpbW1pbmdfbWF4X3ZhbGlkX2NvbmZpZ3MsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy50aW1taW5nX21heF92YWxpZF9jb25maWdzKTsKCQlwcmludGYoIlxuLmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy50aW1taW5nX3N0cnVjdF92ZXJzaW9uPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy50aW1taW5nX3N0cnVjdF92ZXJzaW9uLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcudGltbWluZ19zdHJ1Y3RfdmVyc2lvbik7CgkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcudGltbWluZ19zdHJ1Y3Rfb3JnX3NpemU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLnRpbW1pbmdfc3RydWN0X29yZ19zaXplLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcudGltbWluZ19zdHJ1Y3Rfb3JnX3NpemUpOwoJCXByaW50ZigiXG4uY2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLnRpbW1pbmdfc3RydWN0X3JlYWxfc2l6ZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcudGltbWluZ19zdHJ1Y3RfcmVhbF9zaXplLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcudGltbWluZ19zdHJ1Y3RfcmVhbF9zaXplKTsKCQkvL3ByaW50ZigiXG4uY2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmZhc3RfYm9vdD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZmFzdF9ib290LGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZmFzdF9ib290KTsKCQlwcmludGYoIlxuLmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5kZHJfZnVuYz0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZGRyX2Z1bmMsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5kZHJfZnVuYyk7CgkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuYm9hcmRfaWQ9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmJvYXJkX2lkLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuYm9hcmRfaWQpOwoJCXByaW50ZigiXG4uY2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLkRyYW1UeXBlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5EcmFtVHlwZSxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLkRyYW1UeXBlKTsKCQlwcmludGYoIlxuLmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5kcmFtX3JhbmtfY29uZmlnPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5kcmFtX3JhbmtfY29uZmlnLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZHJhbV9yYW5rX2NvbmZpZyk7CgkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuRGlzYWJsZWREYnl0ZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuRGlzYWJsZWREYnl0ZSxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLkRpc2FibGVkRGJ5dGUpOwoJCXByaW50ZigiXG4uY2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmRyYW1fY3MwX2Jhc2VfYWRkPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5kcmFtX2NzMF9iYXNlX2FkZCxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmRyYW1fY3MwX2Jhc2VfYWRkKTsKCQlwcmludGYoIlxuLmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5kcmFtX2NzMV9iYXNlX2FkZD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZHJhbV9jczFfYmFzZV9hZGQsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5kcmFtX2NzMV9iYXNlX2FkZCk7CgkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZHJhbV9jczBfc2l6ZV9NQj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZHJhbV9jczBfc2l6ZV9NQixkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmRyYW1fY3MwX3NpemVfTUIpOwoJCXByaW50ZigiXG4uY2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmRyYW1fY3MxX3NpemVfTUI9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmRyYW1fY3MxX3NpemVfTUIsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5kcmFtX2NzMV9zaXplX01CKTsKCQlwcmludGYoIlxuLmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5kcmFtX3g0eDh4MTZfbW9kZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZHJhbV94NHg4eDE2X21vZGUsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5kcmFtX3g0eDh4MTZfbW9kZSk7CgkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuSXMyVHRpbWluZz0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuSXMyVHRpbWluZyxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLklzMlR0aW1pbmcpOwoJCXByaW50ZigiXG4uY2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmxvZ19sZXZlbD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcubG9nX2xldmVsLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcubG9nX2xldmVsKTsKCQlwcmludGYoIlxuLmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5kZHJfcmRiaV93cl9lbmFibGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmRkcl9yZGJpX3dyX2VuYWJsZSxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmRkcl9yZGJpX3dyX2VuYWJsZSk7CgkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcucGxsX3NzY19tb2RlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5wbGxfc3NjX21vZGUsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5wbGxfc3NjX21vZGUpOwoJCXByaW50ZigiXG4uY2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLm9yZ190ZHFzMmRxPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5vcmdfdGRxczJkcSxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLm9yZ190ZHFzMmRxKTsKCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDwyO3RlbXBfY291bnQrKykKCQlwcmludGYoIlxuLmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5yZXNlcnZlMV90ZXN0X2Z1bmN0aW9uWyVkXT0weCUwOHgsLy8gJWQiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5yZXNlcnZlMV90ZXN0X2Z1bmN0aW9uW3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcucmVzZXJ2ZTFfdGVzdF9mdW5jdGlvblt0ZW1wX2NvdW50XSk7CgkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8NTt0ZW1wX2NvdW50KyspCgkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZGRyX2RtY19yZW1hcFslZF09MHglMDh4LC8vICVkIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZGRyX2RtY19yZW1hcFt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmRkcl9kbWNfcmVtYXBbdGVtcF9jb3VudF0pOwoJCWZvciAoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDM1O3RlbXBfY291bnQrKykKCQlwcmludGYoIlxuLmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5hY19waW5tdXhbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmFjX3Bpbm11eFt0ZW1wX2NvdW50XSwodWludDMyX3QpZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5hY19waW5tdXhbdGVtcF9jb3VudF0pOwoJCXByaW50ZigiXG4uY2ZnX2JvYXJkX2NvbW1vbl9zZXR0aW5nLmRkcl9kcXNfc3dhcD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZGRyX2Rxc19zd2FwLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZGRyX2Rxc19zd2FwKTsKCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDwzNjt0ZW1wX2NvdW50KyspCgkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZGRyX2RxX3JlbWFwWyVkXT0weCUwOHgsLy8gJWQiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5kZHJfZHFfcmVtYXBbdGVtcF9jb3VudF0sKHVpbnQzMl90KWRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZGRyX2RxX3JlbWFwW3RlbXBfY291bnRdKTsKCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDw0O3RlbXBfY291bnQrKykKCQlwcmludGYoIlxuLmNmZ19ib2FyZF9jb21tb25fc2V0dGluZy5kZHJfdmRkZWVfc2V0dGluZ1slZF09MHglMDh4LC8vICVkIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZGRyX3ZkZGVlX3NldHRpbmdbdGVtcF9jb3VudF0sKHVpbnQzMl90KWRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfY29tbW9uX3NldHRpbmcuZGRyX3ZkZGVlX3NldHRpbmdbdGVtcF9jb3VudF0pOwoKCQlmb3IgKCBwcz0wO3BzPDI7cHMrKykKCQl7CgkJCXByaW50ZigiXG4uY2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbJWRdLkRSQU1GcmVxPTB4JTA4eCwvLyAlZCIscHMsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS5EUkFNRnJlcSxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLkRSQU1GcmVxKTsKCQkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1slZF0uUGxsQnlwYXNzRW49MHglMDh4LC8vICVkIixwcyxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLlBsbEJ5cGFzc0VuLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1twc10uUGxsQnlwYXNzRW4pOwoJCQlwcmludGYoIlxuLmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzWyVkXS50cmFpbmluZ19TZXF1ZW5jZUN0cmw9MHglMDh4LC8vICVkIixwcyxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLnRyYWluaW5nX1NlcXVlbmNlQ3RybCxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLnRyYWluaW5nX1NlcXVlbmNlQ3RybCk7CgkJCXByaW50ZigiXG4uY2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbJWRdLmRkcl9vZHRfY29uZmlnPTB4JTA4eCwvLyAlZCIscHMsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS5kZHJfb2R0X2NvbmZpZyxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLmRkcl9vZHRfY29uZmlnKTsKCQkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1slZF0uY2xrX2Rydl9vaG09MHglMDh4LC8vICVkIixwcyxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLmNsa19kcnZfb2htLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1twc10uY2xrX2Rydl9vaG0pOwoJCQlwcmludGYoIlxuLmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzWyVkXS5jc19kcnZfb2htPTB4JTA4eCwvLyAlZCIscHMsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS5jc19kcnZfb2htLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1twc10uY3NfZHJ2X29obSk7CgkJCXByaW50ZigiXG4uY2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbJWRdLmFjX2Rydl9vaG09MHglMDh4LC8vICVkIixwcyxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLmFjX2Rydl9vaG0sZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS5hY19kcnZfb2htKTsKCQkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1slZF0uc29jX2RhdGFfZHJ2X29obV9wPTB4JTA4eCwvLyAlZCIscHMsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS5zb2NfZGF0YV9kcnZfb2htX3AsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS5zb2NfZGF0YV9kcnZfb2htX3ApOwoJCQlwcmludGYoIlxuLmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzWyVkXS5zb2NfZGF0YV9kcnZfb2htX249MHglMDh4LC8vICVkIixwcyxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLnNvY19kYXRhX2Rydl9vaG1fbixkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLnNvY19kYXRhX2Rydl9vaG1fbik7CgkJCXByaW50ZigiXG4uY2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbJWRdLnNvY19kYXRhX29kdF9vaG1fcD0weCUwOHgsLy8gJWQiLHBzLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1twc10uc29jX2RhdGFfb2R0X29obV9wLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1twc10uc29jX2RhdGFfb2R0X29obV9wKTsKCQkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1slZF0uc29jX2RhdGFfb2R0X29obV9uPTB4JTA4eCwvLyAlZCIscHMsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS5zb2NfZGF0YV9vZHRfb2htX24sZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS5zb2NfZGF0YV9vZHRfb2htX24pOwoJCQlwcmludGYoIlxuLmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzWyVkXS5kcmFtX2RhdGFfZHJ2X29obT0weCUwOHgsLy8gJWQiLHBzLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1twc10uZHJhbV9kYXRhX2Rydl9vaG0sZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS5kcmFtX2RhdGFfZHJ2X29obSk7CgkJCXByaW50ZigiXG4uY2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbJWRdLmRyYW1fZGF0YV9vZHRfb2htPTB4JTA4eCwvLyAlZCIscHMsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS5kcmFtX2RhdGFfb2R0X29obSxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLmRyYW1fZGF0YV9vZHRfb2htKTsKCQkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1slZF0uZHJhbV9kYXRhX3dyX29kdF9vaG09MHglMDh4LC8vICVkIixwcyxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLmRyYW1fZGF0YV93cl9vZHRfb2htLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1twc10uZHJhbV9kYXRhX3dyX29kdF9vaG0pOwoJCQlwcmludGYoIlxuLmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzWyVkXS5kcmFtX2FjX29kdF9vaG09MHglMDh4LC8vICVkIixwcyxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLmRyYW1fYWNfb2R0X29obSxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLmRyYW1fYWNfb2R0X29obSk7CgkJCXByaW50ZigiXG4uY2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbJWRdLmRyYW1fZGF0YV9kcnZfcHVsbF91cF9jYWxpYnJhdGlvbl9vaG09MHglMDh4LC8vICVkIixwcyxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLmRyYW1fZGF0YV9kcnZfcHVsbF91cF9jYWxpYnJhdGlvbl9vaG0sZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS5kcmFtX2RhdGFfZHJ2X3B1bGxfdXBfY2FsaWJyYXRpb25fb2htKTsKCQkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1slZF0ubHBkZHI0X2RyYW1fdm91dF92b2x0YWdlX3JhbmdlX3NldHRpbmc9MHglMDh4LC8vICVkIixwcyxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLmxwZGRyNF9kcmFtX3ZvdXRfdm9sdGFnZV9yYW5nZV9zZXR0aW5nLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1twc10ubHBkZHI0X2RyYW1fdm91dF92b2x0YWdlX3JhbmdlX3NldHRpbmcpOwoJCQlwcmludGYoIlxuLmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzWyVkXS5yZXNlcnZlMj0weCUwOHgsLy8gJWQiLHBzLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1twc10ucmVzZXJ2ZTIsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS5yZXNlcnZlMik7CgkJCXByaW50ZigiXG4uY2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbJWRdLnZyZWZfYWNfcGVybWlsID0weCUwOHgsLy8gJWQiLHBzLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1twc10udnJlZl9hY19wZXJtaWwgLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1twc10udnJlZl9hY19wZXJtaWwgKTsKCQkJcHJpbnRmKCJcbi5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1slZF0udnJlZl9zb2NfZGF0YV9wZXJtaWwgPTB4JTA4eCwvLyAlZCIscHMsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS52cmVmX3NvY19kYXRhX3Blcm1pbCAsZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS52cmVmX3NvY19kYXRhX3Blcm1pbCApOwoJCQlwcmludGYoIlxuLmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzWyVkXS52cmVmX2RyYW1fZGF0YV9wZXJtaWw9MHglMDh4LC8vICVkIixwcyxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLnZyZWZfZHJhbV9kYXRhX3Blcm1pbCxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLnZyZWZfZHJhbV9kYXRhX3Blcm1pbCk7CgkJCXByaW50ZigiXG4uY2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbJWRdLm1heF9jb3JlX3RpbW1taW5nX2ZyZXF1ZW5jeT0weCUwOHgsLy8gJWQiLHBzLGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1twc10ubWF4X2NvcmVfdGltbW1pbmdfZnJlcXVlbmN5LGRkcl9zZXRfdF9wLT5jZmdfYm9hcmRfU0lfc2V0dGluZ19wc1twc10ubWF4X2NvcmVfdGltbW1pbmdfZnJlcXVlbmN5KTsKCQkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8Mjt0ZW1wX2NvdW50KyspCgkJCQlwcmludGYoIlxuLmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzWyVkXS50cmFpbmluZ19waGFzZV9wYXJhbWV0ZXJbJWRdPTB4JTA4eCwvLyAlZCIscHMsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLnRyYWluaW5nX3BoYXNlX3BhcmFtZXRlclt0ZW1wX2NvdW50XSwodWludDMyX3QpZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS50cmFpbmluZ19waGFzZV9wYXJhbWV0ZXJbdGVtcF9jb3VudF0pOwoJCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDwzNjt0ZW1wX2NvdW50KyspCgkJCQlwcmludGYoIlxuLmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzWyVkXS5hY190cmFjZV9kZWxheV9vcmdbJWRdPTB4JTA4eCwvLyAlZCIscHMsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+Y2ZnX2JvYXJkX1NJX3NldHRpbmdfcHNbcHNdLmFjX3RyYWNlX2RlbGF5X29yZ1t0ZW1wX2NvdW50XSwodWludDMyX3QpZGRyX3NldF90X3AtPmNmZ19ib2FyZF9TSV9zZXR0aW5nX3BzW3BzXS5hY190cmFjZV9kZWxheV9vcmdbdGVtcF9jb3VudF0pOwoKCQkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8MzY7dGVtcF9jb3VudCsrKQoJCQkJcHJpbnRmKCJcbi5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzWyVkXS5hY190cmFjZV9kZWxheVslZF09MHglMDh4LC8vICVkIixwcyx0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5hY190cmFjZV9kZWxheVt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uYWNfdHJhY2VfZGVsYXlbdGVtcF9jb3VudF0pOwoJCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDw4O3RlbXBfY291bnQrKykKCQkJCXByaW50ZigiXG4uY2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1slZF0ud3JpdGVfZHFzX2RlbGF5WyVkXT0weCUwOHgsLy8gJWQiLHBzLHRlbXBfY291bnQsZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLndyaXRlX2Rxc19kZWxheVt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10ud3JpdGVfZHFzX2RlbGF5W3RlbXBfY291bnRdKTsKCQkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8NzI7dGVtcF9jb3VudCsrKQoJCQkJcHJpbnRmKCJcbi5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzWyVkXS53cml0ZV9kcV9iaXRfZGVsYXlbJWRdPTB4JTA4eCwvLyAlZCIscHMsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10ud3JpdGVfZHFfYml0X2RlbGF5W3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS53cml0ZV9kcV9iaXRfZGVsYXlbdGVtcF9jb3VudF0pOwoJCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDw4O3RlbXBfY291bnQrKykKCQkJCXByaW50ZigiXG4uY2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1slZF0ucmVhZF9kcXNfZ2F0ZV9kZWxheVslZF09MHglMDh4LC8vICVkIixwcyx0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5yZWFkX2Rxc19nYXRlX2RlbGF5W3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5yZWFkX2Rxc19nYXRlX2RlbGF5W3RlbXBfY291bnRdKTsKCQkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8ODt0ZW1wX2NvdW50KyspCgkJCQlwcmludGYoIlxuLmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbJWRdLnJlYWRfZHFzX2RlbGF5WyVkXT0weCUwOHgsLy8gJWQiLHBzLHRlbXBfY291bnQsZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLnJlYWRfZHFzX2RlbGF5W3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5yZWFkX2Rxc19kZWxheVt0ZW1wX2NvdW50XSk7CgkJCWZvciAoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDcyO3RlbXBfY291bnQrKykKCQkJCXByaW50ZigiXG4uY2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1slZF0ucmVhZF9kcV9iaXRfZGVsYXlbJWRdPTB4JTA4eCwvLyAlZCIscHMsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10ucmVhZF9kcV9iaXRfZGVsYXlbdGVtcF9jb3VudF0sZGRyX3NldF90X3AtPmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbcHNdLnJlYWRfZHFfYml0X2RlbGF5W3RlbXBfY291bnRdKTsKCQkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8NDQ7dGVtcF9jb3VudCsrKQoJCQkJcHJpbnRmKCJcbi5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzWyVkXS5zb2NfYml0X3ZyZWZbJWRdPTB4JTA4eCwvLyAlZCIscHMsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uc29jX2JpdF92cmVmW3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5zb2NfYml0X3ZyZWZbdGVtcF9jb3VudF0pOwoJCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDwzNjt0ZW1wX2NvdW50KyspCgkJCQlwcmludGYoIlxuLmNmZ19kZHJfdHJhaW5pbmdfZGVsYXlfcHNbJWRdLmRyYW1fYml0X3ZyZWZbJWRdPTB4JTA4eCwvLyAlZCIscHMsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uZHJhbV9iaXRfdnJlZlt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10uZHJhbV9iaXRfdnJlZlt0ZW1wX2NvdW50XSk7CgkJCWZvciAoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDg7dGVtcF9jb3VudCsrKQoJCQkJcHJpbnRmKCJcbi5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzWyVkXS5yZXNlcnZlX3RyYWluaW5nX3BhcmFtZXRlclslZF09MHglMDh4LC8vICVkIixwcyx0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5jZmdfZGRyX3RyYWluaW5nX2RlbGF5X3BzW3BzXS5yZXNlcnZlX3RyYWluaW5nX3BhcmFtZXRlclt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+Y2ZnX2Rkcl90cmFpbmluZ19kZWxheV9wc1twc10ucmVzZXJ2ZV90cmFpbmluZ19wYXJhbWV0ZXJbdGVtcF9jb3VudF0pOwoJCX0KCQlwcmludGYoIlxufSxcbiIpOwoJfQoJcmV0dXJuIDE7Cn0KCi8vI2VuZGlmCiNlbmRpZgoKI2lmZGVmIFVTRV9GT1JfVUJPT1RfMjAxOAojaW5jbHVkZSA8YW1sb2dpYy9zdG9yYWdlLmg+CmV4dGVybiAgc3RydWN0IHN0b3JhZ2VfdCAqY3VycmVudDsKI2lmIDEKCnN0YXRpYyBpbnQgZGRyX2RvX3N0b3JlX2Rkcl9wYXJhbWV0ZXJfb3BzKHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKQp7CgkvL2lmICghY3VycmVudCkgewoJLy8JSU5JVF9MSVNUX0hFQUQoJnN0b3JlX2Rldi0+bGlzdCk7CgkvLwljdXJyZW50ID0gc3RvcmVfZGV2OwoJLy8JcmV0dXJuIDA7CgkvL30KCWNoYXIgc3RyWzEwMjRdPSIiOwoJaWYgKCFjdXJyZW50KQoJewoJCXNwcmludGYoc3RyLCJzdG9yZSBpbml0Iik7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJfQoKCWNoYXIgKm5hbWUgPSBOVUxMOwoJewoJCW5hbWUgPSJkZHItcGFyYW1ldGVyIjsKCQlwcmludGYoIlxuc3RvcmUgcnN2IHdyaXRlIGRkci1wYXJhbWV0ZXIgMHglMDh4IDB4JTA4eFxuIiwodWludDMyX3QpKHVpbnQ2NF90KWJ1ZmZlcixsZW5ndGgpOwoJCS8vc3RydWN0IHN0b3JhZ2VfdCAqc3RvcmUgPSBjdXJyZW50Oy8vc3RvcmVfZ2V0X2N1cnJlbnQoKTsKCQkvL3JldHVybiBzdG9yZS0+d3JpdGVfcnN2KG5hbWUsIGxlbmd0aCwgKHVfY2hhciAqKWJ1ZmZlcik7CgkJc3ByaW50ZihzdHIsInN0b3JlIHJzdiB3cml0ZSBkZHItcGFyYW1ldGVyIDB4JTA4eCAweCUwOHhcbiIsKHVpbnQzMl90KSh1aW50NjRfdClidWZmZXIsbGVuZ3RoKTsKCQlydW5fY29tbWFuZChzdHIsMCk7Cgl9Cn0KI2VuZGlmCiNlbHNlCgpzdGF0aWMgaW50IGRkcl9kb19zdG9yZV9kZHJfcGFyYW1ldGVyX29wcyh1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IGxlbmd0aCkKewojaWYgMAoJdW5zaWduZWQgbG9uZyBhZGRyOwoJaW50IHJldCA9IDA7CgkvL2NoYXIqIG9wcyA9IGFyZ3ZbMl07Cgljb25zdCB1bnNpZ25lZCBtYXhEZHJQU3ogPSAyICogMTAyNDsKCXVuc2lnbmVkIGludCBhY3R1YWxEdGJTeiA9IDA7CglhY3R1YWxEdGJTeiA9IG1heERkclBTejsKCWlmIChhcmdjID4gNCkgewoJCWNvbnN0IHVuc2lnbmVkIGJ1ZlN6ID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCBOVUxMLCAwKTsKCQlpZiAoYnVmU3ogPiBtYXhEZHJQU3opIHsKCQkJcHJpbnRmKCJmYWlsIGJ1ZlN6ICglcykgPiBtYXggMHgleFxuIiwgYXJndls0XSwgbWF4RGRyUFN6KTsKCQkJLy9yZXR1cm4gQ01EX1JFVF9GQUlMVVJFOwoJCX0KCX0KCWFkZHIgPSAodW5zaWduZWQgbG9uZylzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sIE5VTEwsIDE2KTsKI2VuZGlmCglleHRlcm4gaW50IHN0b3JlX2Rkcl9wYXJhbWV0ZXJfd3JpdGUodWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBsZW5ndGgpOwoJLy9jaGFyIHN0clsxMDI0XT0iIjsKCXByaW50ZigiXG5zdG9yZSBkZHJfcGFyYW1ldGVyIHdyaXRlIDB4JTA4eCAweCUwOHhcbiIsKHVpbnQzMl90KSh1aW50NjRfdClidWZmZXIsbGVuZ3RoKTsKCS8vcnVuX2NvbW1hbmQoc3RyLDApOwoJc3RvcmVfZGRyX3BhcmFtZXRlcl93cml0ZSgodWludDhfdCAqKWJ1ZmZlciwgbGVuZ3RoKTsKCgoJcmV0dXJuIDE7Cn0KI2VuZGlmCiNpZiAwCmludCBkb19kZHJfc3RvcmVfd3JpdGVfZGRyX3BhcmFtZXRlcl9vcHMoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgkvL2RvX3N0b3JlX2Rkcl9wYXJhbWV0ZXJfb3BzKGNtZF90YmxfdCAqIGNtZHRwLCAgICAgIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKCS8vdW5zaWduZWQgaW50ICBkZHJfdGVzdF9jbWQ9MDsKCXVuc2lnbmVkIGludCAgYXJnWzMwXT17MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsfTsKCS8vY2hhciAqZW5kcDsKCXVuc2lnbmVkIGludCBpPTA7CgkvL2Rkcl90ZXN0X2NtZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJLy9mb3IgKGkgPSAyO2k8YXJnYztpKyspCgkvLwlhcmdbaS0yXT1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbaV0sICZlbmRwLCAwKTsKCS8vcHJpbnRmKCJcbmRkcl90ZXN0X2NtZD09IDB4JTA4eFxuIiwgZGRyX3Rlc3RfY21kKTsKCglmb3IgKGkgPSAwO2k8KGFyZ2MtMCk7aSsrKQoJCXByaW50ZigiXG5hcmdbJTA4eF09JTA4eFxuIixpLGFyZ1tpXSk7Cglmb3IgKGkgPSAwO2k8KGFyZ2MtMCk7aSsrKQoJCXByaW50ZigiXG5hcmd2WyUwOHhdPSVzXG4iLGksYXJndltpXSk7CgkvL2ludCBhcmdjMl9sZW5ndGg7CgkvL2FyZ2MyX2xlbmd0aD0oYXJnYy0yKTsKCS8vY21kX3RibF90ICpjbWR0cDI7CgkvL2ludCBmbGFnMjsKCWludCBhcmdjMjsKCWNoYXIqIGFyZ3YyWzMwXTsKCglhcmdjMj01Oy8vYXJnYy0xOwoJLy9mb3IgKGkgPSAxO2k8KGFyZ2MpO2krKykKCS8vCWFyZ3YyW2ktMV09YXJndltpXTsKCgkJI2lmZGVmIFVTRV9GT1JfVUJPT1RfMjAxOAoJCS8vc3ByaW50ZihzdHIsInN0b3JlIHJzdiB3cml0ZSBkZHItcGFyYW1ldGVyIDB4JTA4eCAweCUwOHggIixkZHJfc2V0X2FkZC1TSEEyNTZfU1VNX0xFTix3cml0ZV9zaXplKTsKCQlhcmdjMj02OwoJCWFyZ3YyWzFdPSJyc3YiOwoJCWFyZ3YyWzJdPSJ3cml0ZSI7CgkJYXJndjJbM109ImRkci1wYXJhbWV0ZXIiOwoJCWFyZ3YyWzRdPWFyZ3ZbMV07Ly9zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlhcmd2Mls1XT1hcmd2WzJdOy8vc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJZG9fc3RvcmVfcnN2X29wcyhjbWR0cCxmbGFnLGFyZ2MyLGFyZ3YyW10pOwoJCSNlbHNlCgkJLy9zcHJpbnRmKHN0ciwic3RvcmUgZGRyX3BhcmFtZXRlciB3cml0ZSAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQtU0hBMjU2X1NVTV9MRU4sd3JpdGVfc2l6ZSk7CgkJYXJnYzI9NTsKCQlhcmd2MlsxXT0iZGRyX3BhcmFtZXRlciI7CgkJYXJndjJbMl09IndyaXRlIjsKCQlhcmd2MlszXT1hcmd2WzFdOy8vIHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCWFyZ3YyWzRdPWFyZ3ZbMl07Ly9zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQkvL2V4dGVybiAgaW50IGRvX3N0b3JlX2Rkcl9wYXJhbWV0ZXJfb3BzKGNtZF90YmxfdCAqIGNtZHRwLAoJCS8vCQkgICAgICBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pOwoJCWRkcl9kb19zdG9yZV9kZHJfcGFyYW1ldGVyX29wcyhjbWR0cCxmbGFnLGFyZ2MyLGFyZ3YyKTsKCQkjZW5kaWYKCXJldHVybiAxOwp9ClVfQk9PVF9DTUQoCglkZHJfc3RvcmVfd3JpdGUsCTMwLAkxLAlkb19kZHJfc3RvcmVfd3JpdGVfZGRyX3BhcmFtZXRlcl9vcHMsCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiIsCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiBcbiBkY2FjaGUgb2ZmID8gXG4iCgkpOwojZW5kaWYKaW50IGRvX2Rkcl9mYXN0Ym9vdF9jb25maWcoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgljaGVja19iYXNlX2FkZHJlc3MoKTsKCWludCBpPTA7CglpbnQgY291bnQ9MDsKCWNoYXIgKmVuZHA7Cgl1bnNpZ25lZCBpbnQgZW5hYmxlX2Rkcl9mYXN0X2Jvb3Q9MDsgIC8vIDAgcGF1c2UgMSxyZXN1bWUKCglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CglpZiAoYXJnYyA9PSAxKQoJCXByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCWVsc2UgaWYgKGFyZ2MgPiAxKQoJewoJCWNvdW50PTA7CgkJZW5hYmxlX2Rkcl9mYXN0X2Jvb3Q9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQllbmFibGVfZGRyX2Zhc3RfYm9vdCA9IDA7CgkJfQoJCS8vCWNvdW50Kys7Cgl9CglpZiAoIWVuYWJsZV9kZHJfZmFzdF9ib290KQoJCXJldHVybiAxOwoJI2RlZmluZSBETUNfUEhZX1JFVFJBSU5JTkdfQ1RSTCAgICAgKCBwX2Rkcl9iYXNlLT5kZHJfZG1jX2xwZGQ0X3JldHJhaW5pbmdfYWRkcmVzcykKCXVpbnQzMl90IGRtY19yZXRyYWluaW5nX2N0cmw9MDsKCWRtY19yZXRyYWluaW5nX2N0cmw9cmRfcmVnKERNQ19QSFlfUkVUUkFJTklOR19DVFJMKTsKCXdyX3JlZyhETUNfUEhZX1JFVFJBSU5JTkdfQ1RSTCxkbWNfcmV0cmFpbmluZ19jdHJsJih+KDE8PDMxKSkpOwoJZGRyX3NldF90ICpkZHJfc2V0X3RfcD1OVUxMOwoJZGRyX3NldF90X3A9KGRkcl9zZXRfdCAqKShkZHJfc2V0X3RfcF9hcnJhcnkpOwoJdWludDMyX3QgIGRkcl9zZXRfYWRkPTA7Cgl1aW50MzJfdCAgZGRyX3NldF9zaXplPTA7CglkZHJfc2V0X2FkZD0odWludDMyX3QpKHVpbnQ2NF90KShkZHJfc2V0X3RfcCk7CglkZHJfc2V0X3NpemU9c2l6ZW9mKGRkcl9zZXRfdCk7Cgl1aW50MzJfdCAgd3JpdGVfc2l6ZT0wOwoJd3JpdGVfc2l6ZT0oKGRkcl9zZXRfc2l6ZStTSEEyNTZfU1VNX0xFTitNRVNPTl9DUFVfQ0hJUF9JRF9TSVpFKzUxMSkvNTEyKSo1MTI7Cglkb19yZWFkX2Rkcl90cmFpbmluZ19kYXRhKDEsZGRyX3NldF90X3ApOwoJewoJZHdjX2RkcnBoeV9hcGJfd3IoMHhkMDAwMCwweDApOwoKCWNoYXIgZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4PTA7CgljaGFyIGRtY190ZXN0X3dvcnN0X3dpbmRvd190eD0wOwoKCXsKCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDB4ZDw8MTYpfCgwPDwxMil8KDB4MCksMCk7IC8vIERXQ19ERFJQSFlBX0FQQk9OTFkwX01pY3JvQ29udE11eFNlbAoKCWRtY190ZXN0X3dvcnN0X3dpbmRvd190eD1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHgwYzIpKTsKCWRtY190ZXN0X3dvcnN0X3dpbmRvd19yeD1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHgwYzMpKTsKCWlmIChkbWNfdGVzdF93b3JzdF93aW5kb3dfdHg+MzApCgkJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4PTMwOwoJaWYgKGRtY190ZXN0X3dvcnN0X3dpbmRvd19yeD4zMCkKCQlkbWNfdGVzdF93b3JzdF93aW5kb3dfcng9MzA7Ci8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDFjMiksdDRfd3JpdGVfd29yc3RfbWFyZ2luX3JhbmsxKTsKLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4MWMzKSx0NF9yZWFkX3dvcnN0X21hcmdpbl9yYW5rMSk7CglkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzFdPSgoKGRtY190ZXN0X3dvcnN0X3dpbmRvd190eC8yKTw8NCkpfCgoKGRtY190ZXN0X3dvcnN0X3dpbmRvd19yeC8yKSkpOwoJfQoJfQoKCgkvL3N0b3JlIGRkcl9wYXJhbWV0ZXIgd3JpdGUgMHg3N2Y4MWNmMCAweDMwMAoJLy9wcmludGYoIlxuICIpOwoKCWlmIChlbmFibGVfZGRyX2Zhc3RfYm9vdCA9PSAxKQoJCWRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMF09MHhmZjsKCglpZiAoZW5hYmxlX2Rkcl9mYXN0X2Jvb3QgPT0gMikKCQlkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdPTA7CgoJewoJCSNpZiAxCgkJcHJpbnRmKCImZGRyX3NoYS5kZHJzIDogMHgleFxuIiwgKHVpbnQzMl90KSh1aW50NjRfdCkmZGRyX3NoYS5kZHJzKTsKCQlwcmludGYoIiZkZHJfc2hhLnNoYTIgOiAweCV4XG4iLCAodWludDMyX3QpKHVpbnQ2NF90KSZkZHJfc2hhLnNoYTIpOwoJCXByaW50ZigiZGRyX3NldF9hZGQgOiAweCV4ICAgc2l6ZW9mKGRkcl9zZXRfdCk6MHgleFxuICIsICh1aW50MzJfdCkodWludDY0X3QpZGRyX3NldF9hZGQsICh1aW50MzJfdCkodWludDY0X3Qpc2l6ZW9mKGRkcl9zZXRfdCkpOwoJCXByaW50ZigiZGRyX3NldF9hZGRfY2hpcF9pZCA6IDB4JXhcbiIsICh1aW50MzJfdCkodWludDY0X3QpKGRkcl9zZXRfYWRkK2Rkcl9zZXRfc2l6ZSkpOwoJCXNoYTI1Nl9jc3VtX3dkX2ludGVybmFsKCh1bnNpZ25lZCBjaGFyICopKHVpbnQ2NF90KWRkcl9zZXRfYWRkLCBzaXplb2YoZGRyX3NldF90KSwgZGRyX3NoYS5zaGEyLCAwKTsKCQkvL3NoYTIoKHVuc2lnbmVkIGNoYXIgKikodWludDY0X3QpZGRyX3NldF9hZGQsIHNpemVvZihkZHJfc2V0X3QpLCBkZHJfc2hhLnNoYTIsIDApOwoJCXByaW50ZigicHJpbnQgc2hhXG4iKTsKCQkvL3NwcmludGYoc3RyLCJtZCAlMDh4IDB4MTAwIiwgKHVpbnQzMl90KSh1aW50NjRfdCkoZGRyX3NldF9hZGQtMzIpKTsKCQkvL3J1bl9jb21tYW5kKHN0ciwwKTsKCQkjZW5kaWYKCQkjaWYgMAoJCWNoYXIgc3RyWzEwMjRdPSIiOwoJCSNpZmRlZiBVU0VfRk9SX1VCT09UXzIwMTgKCQlzcHJpbnRmKHN0ciwic3RvcmUgcnN2IHdyaXRlIGRkci1wYXJhbWV0ZXIgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLVNIQTI1Nl9TVU1fTEVOLHdyaXRlX3NpemUpOwoJCSNlbHNlCgkJc3ByaW50ZihzdHIsInN0b3JlIGRkcl9wYXJhbWV0ZXIgd3JpdGUgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLVNIQTI1Nl9TVU1fTEVOLHdyaXRlX3NpemUpOwoJCSNlbmRpZgoJCS8vCXNwcmludGYoc3RyLCJzdG9yZSBkZHJfcGFyYW1ldGVyIHdyaXRlIDB4JTA4eCAweCUwOHggIixkZHJfc2V0X2FkZCxkZHJfc2V0X3NpemUpOwoJCS8vCXNwcmludGYoc3RyLCJzdG9yZSByc3Ygd3JpdGUgZGRyLXBhcmFtZXRlciAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQsZGRyX3NldF9zaXplKTsKCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCSNlbmRpZgoJCSNpZiAwCgkJaW50IGFyZ2MyOwoJCWNoYXIqIGFyZ3YyWzMwXTsKCQlhcmdjMj0zOwoKCQkvL2ZvciAoaSA9IDI7aTxhcmdjO2krKykKCQkvLwlhcmdbaS0yXT1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbaV0sICZlbmRwLCAwKTsKCQkvL3ByaW50ZigiXG5kZHJfdGVzdF9jbWQ9PSAweCUwOHhcbiIsIGRkcl90ZXN0X2NtZCk7CgkJLy8Jc3ByaW50Zihhcmd2MlswXSwiZGRyX3N0b3JlX3dyaXRlIik7CgkJc3ByaW50Zihhcmd2MlsxXSwiMHglMDh4IixkZHJfc2V0X2FkZC1TSEEyNTZfU1VNX0xFTik7CgkJc3ByaW50Zihhcmd2MlsyXSwiMHglMDh4Iix3cml0ZV9zaXplKTsKCQkvL3NwcmludGYoYXJndjJbM10sIjB4JTA4eCIsMCk7CgkJZm9yIChpID0gMDtpPChhcmdjMi0wKTtpKyspCgkJCXByaW50ZigiXG5hcmdjMlslMDh4XT0lc1xuIixpLGFyZ3YyW2ldKTsKCQlmb3IgKGkgPSAwO2k8KGFyZ2MyLTApO2krKykKCQkJcHJpbnRmKCJcbmRlYnVnXG4iKTsKCgkJZG9fZGRyX3N0b3JlX3dyaXRlX2Rkcl9wYXJhbWV0ZXJfb3BzKGNtZHRwLGZsYWcsYXJnYzIsYXJndjIpOwoJCSNlbmRpZgoJCWRkcl9kb19zdG9yZV9kZHJfcGFyYW1ldGVyX29wcygodWludDhfdCAqKSh1bnNpZ25lZCBsb25nKShkZHJfc2V0X2FkZC1TSEEyNTZfU1VNX0xFTiksd3JpdGVfc2l6ZSk7Cgl9CgkjaWYgMAoJc2VyaWFsX3B1dHMoIlxuIik7Cglmb3IgKCAgY291bnQ9MDtjb3VudDwoc2l6ZW9mKGRkcl9zZXRfdCkpOykgewoJCS8vcHJpbnRmKCJcbiUwOHggJTA4eCIsY291bnQsKHJkX3JlZygodWludDY0X3QpKGRkcl9zZXRfdF9wKSsodWludDY0X3QpY291bnQpKSk7CgkJc2VyaWFsX3B1dHMoIlxuIik7CgkJc2VyaWFsX3B1dF9oZXgoY291bnQsMzIpOwoJCXNlcmlhbF9wdXRzKCIgIik7CgkJc2VyaWFsX3B1dF9oZXgocmRfcmVnKCh1aW50NjRfdCkocF9kZXYtPnBfZGRycykrKHVpbnQ2NF90KWNvdW50KSwzMik7CgkJY291bnQ9Y291bnQrNDsKCX0KCXNlcmlhbF9wdXRzKCJcbiIpOwoJI2VuZGlmCgl3cl9yZWcoRE1DX1BIWV9SRVRSQUlOSU5HX0NUUkwsZG1jX3JldHJhaW5pbmdfY3RybCk7CglyZXR1cm4gMTsKfQoKI2VuZGlmCmludCBkb19kZHJfc2V0X3dhdGNoZG9nX3ZhbHVlKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJY2hhciAqZW5kcDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgoJaWYgKGFyZ2MgPT0gMSkKCQlwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgoJZWxzZSBpZiAgKGFyZ2MgPiAxKQoJewoJCXsKCQkJd2F0Y2hkb2dfdGltZV9zID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCQl3YXRjaGRvZ190aW1lX3M9IDIwOwoJCX0KCQlwcmludGYoIndhdGNoZG9nX3RpbWVfcz09JWRcbiIsd2F0Y2hkb2dfdGltZV9zKTsKCX0KCglyZXR1cm4gMTsKfQoKCi8vI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKCSNkZWZpbmUgIEcxMl9EQVRBX1JFQURfT0ZGU0VUX01BWCAgICgwWDNGKQoJI2RlZmluZSAgRzEyX0RBVEFfV1JJVEVfT0ZGU0VUX01BWCAgICgwWDNGKzcqMzIpCgoJI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZIDEKCSNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZIDIKCSNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZICAzCgkjZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZICA0CgkjZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZICA1CgkjZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWEVORExZICA2CgoJI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfRUVfVk9MVEFHRSAgMHgxMQoJI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfU09DX1ZSRUYgIDB4MTIKCSNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0RSQU1fVlJFRiAgICAweDEzCgoJdHlwZWRlZiBzdHJ1Y3QgdHJhaW5pbmdfZGVsYXlfaW5mb3JtYXRpb257Cgl1aW50MTZfdCBhY19kZWxheVsxMF07Cgl1aW50MTZfdCB0eGRxc19kZWxheVsxNl07Cgl1aW50MTZfdCByeGRxc19kZWxheVsxNl07Cgl1aW50MTZfdCB0eGRxX2RlbGF5WzcyXTsKCXVpbnQxNl90IHJ4ZHFfZGVsYXlbNzJdOwoJdWludDE2X3QgZ2F0ZV9yeGRxX2RlbGF5WzcyXTsKCgl9IHRyYWluaW5nX2RlbGF5X3Q7Cgl0cmFpbmluZ19kZWxheV90ICB0cmFpbmluZ19kZWxheV90X3A7CgoJdWludDE2X3QgIGxjZF9iZGxfdmFsdWVbNzJdWzRdOyAvL29yZyBtaW4gbWF4IHN0YXR1cwoJLy8gICNkZWZpbmUgTENEX0JETFJfT1JHICAgMAoJI2RlZmluZSBMQ0RfQkRMUl9NSU4gIDAKCSNkZWZpbmUgTENEX0JETFJfTUFYICAgMQoJI2RlZmluZSBMQ0RfQkRMUl9TVEFUVVMgIDIKCgkvL0JZVEUwLTMKCSNkZWZpbmUgIFRFU1RfQVJHXzBfRE1DX1NUSUNLWV9NQUdJQyAgMAoJI2RlZmluZSAgVEVTVF9BUkdfMV9DTUQwICAxCgkjZGVmaW5lICBURVNUX0FSR18yX1NURVAgIDIgICAvLyAwIGluaXQgICAxIHRlc3QgYWMgIDIgdGVzdCB0ZHFzX3dyaXRlCgkjZGVmaW5lICBURVNUX0FSR18zX0FMTF9UT0dIVEVSICAzCgoJLy9CWVRFNC03CgkjZGVmaW5lICBURVNUX0FSR19GUkVRX05JQkJMRV9MICA0CgkjZGVmaW5lICBURVNUX0FSR19GUkVRX05JQkJMRV9IICA1CgoJLy9CWVRFOC0xMQoJI2RlZmluZSAgVEVTVF9BUkdfQk9PVF9USU1FU19MIDYKCSNkZWZpbmUgIFRFU1RfQVJHX0JPT1RfVElNRVNfSCA3CgoJLy9CWVRFMTItMTUKCSNkZWZpbmUgIFRFU1RfQVJHX0VSUk9SX0ZMQUcgOCAgIC8vdGFrZSA0IGJ5dGUgZm9yIGtlcm5lbCB0ZXN0IGZsYWcKCS8vI2RlZmluZSAgVEVTVF9BUkdfRVJST1JfRkxBRyA2Myo0ICAgLy90YWtlIDQgYnl0ZSBmb3Iga2VybmVsIHRlc3QgZmxhZwoKCS8vQllURTE2LTE5CgkvLyNkZWZpbmUgIFRFU1RfQVJHXzE2X0xDRExSX1RFTVBfQ09VTlQgMTYKCSNkZWZpbmUgIFRFU1RfQVJHX0NTMF9URVNUX1NUQVJUX0lOREVYICAxMgoJI2RlZmluZSAgVEVTVF9BUkdfQ1MwX1RFU1RfU0laRV9JTkRFWCAgMTYKCSNkZWZpbmUgIFRFU1RfQVJHX0NTMV9URVNUX1NUQVJUX0lOREVYICAyMAoJI2RlZmluZSAgVEVTVF9BUkdfQ1MxX1RFU1RfU0laRV9JTkRFWCAgMjQKCgkjZGVmaW5lICBURVNUX0FSR19XQVRDSERPR19USU1FX1NJWkVfSU5ERVggIDI4CgkjZGVmaW5lICBURVNUX0FSR19URVNUX0lOREVYX0VOQUxCRV9JTkRFWCAgMzAKCS8vI2RlZmluZSAgVEVTVF9BUkdfTklCQkxFX01BU0swX0VOQUxCRV9JTkRFWCAgMzIKCgkjZGVmaW5lICBURVNUX0FSR19FUlJPUl9GTEFHX05VTEwgMAoJI2RlZmluZSAgVEVTVF9BUkdfRVJST1JfRkxBR19GQUlMIDEKCSNkZWZpbmUgIFRFU1RfQVJHX0VSUk9SX0ZMQUdfUEFTUyAyCgoJI2RlZmluZSAgVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUgIDMyICAvLyAzMkJZVEUKCSNkZWZpbmUgIFRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFICAzICAvLzMvLy9CWVRFCgppbnQgZG9fZGRyX3Rlc3RfZHFzX3dpbmRvd19zdGlja3koY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXJkZHJfdGVzdF9kcXNfd2luZG93IGZ1bmN0aW9uICBkZHJfdGVzdF9jbWQgMHgyNyAweDEwODAwMDAgMHg4MDAwMDAgIDB4NDAwMDAwMDAgMHg4MDAwMDAgMTUgMHg2ICAwIDAgMCAwIDAgMCAxL2NvbmZpZ1xuIik7CglwcmludGYoIlxuZGRyX3Rlc3RfY21kIDB4MjcgY3MwX3Rlc3Rfc3RhcnQgIGNzMF90ZXN0X3NpemUgIGNzMV90ZXN0X3N0YXJ0ICBjczFfdGVzdF9zaXplICBucyB0ZXN0X2luZGV4X2VuYWJsZSAgbmliYmxlX21hc2swIG5pYmJsZV9tYXNrMSBuaWJibGVfbWFzazIgZHJhbV90eXBlIGNoYW5uZWxfbW9kZSAgY29uZmlnX3JlZ2lzdGVyIGFsbF90b2d0aGVyLS0tIHdhdGNoZG9nIHNob3VsZCA+MTVzXG4iKTsKCXByaW50ZigiXG4gYWMgd3JpdGVfZHFzIHJlYWRfZHFzIGNhbiB0ZXN0IHRvZ3RoZXIgdGVzdF9pbmRleF9lbmFibGUgY2FuIGVuYWJsZSBrZXJuZWwgdGVzdCBcbiIpOwoJLy8gICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJLy8gdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJLy8gdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7CgkjZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCgl1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9MDsKCXVuc2lnbmVkIGludCAgbmliYmxlX3NhdmVfb2Zmc2V0PSAwOwoJdW5zaWduZWQgaW50ICBuaWJibGVfc3RlcD0gMDsKCXVuc2lnbmVkIGludCAgbmliYmxlX21heD0gMTY7Cgl1bnNpZ25lZCBpbnQgIHRlc3RfaW5kZXhfZW5hYmxlPSAwOwoJdW5zaWduZWQgaW50ICB0ZXN0X2luZGV4PSAwOwoJdW5zaWduZWQgaW50ICB0ZXN0X2luZGV4X21heD0gNjsKCXVuc2lnbmVkIGludCAgIHJlZ192YWx1ZT0gMDsKCXVuc2lnbmVkIGludCAgZHJhbV90eXBlPSAwOwoJdW5zaWduZWQgaW50ICBjaGFubmVsX21vZGU9IDA7Cgl1bnNpZ25lZCBpbnQgIGtlcm5lbF93YXRjaGRvZ19zPSAyMDsvLzI0MDsKCS8vCSAgdW5zaWduZWQgaW50ICBmaW5pc2hfY2xlYXJfZmxhZz0gMDsKCXVuc2lnbmVkIGludCAgY29uZmlnX3JlZ2lzdGVyPSAwOwoJdW5zaWduZWQgaW50ICAgYWxsX3RvZ2h0ZXJfZW5hYmxlPTA7Cgl1bnNpZ25lZCBpbnQgICBlcnJvcl9mbGFnX3JlZ19hZGQ9MDsKCWNoYXIgKnN0cmluZ19wcmludF9mbGFnPSAgICIgdWJvb3Qtd2luZG93LWxvb3AgXG4iOwoJLy9pbnQgYXJnYzI7CgkvL2NoYXIgICAgICogIGFyZ3YyWzMwXTsKCWNoYXIgKmVuZHA7CgljaGFyICpidWY7CglidWY9IiI7CgoJdW5zaWduZWQgaW50ICAgY3MwX3Rlc3Rfc3RhcnQ9IDB4MTA4MDAwMDsKCXVuc2lnbmVkIGludCAgIGNzMF90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCXVuc2lnbmVkIGludCAgIGNzMV90ZXN0X3N0YXJ0PSAwOwoJdW5zaWduZWQgaW50ICAgY3MxX3Rlc3Rfc2l6ZT0gMDsKCXVuc2lnbmVkIGludCAgIGVuYWJsZV9rZXJuZWxfdGVzdD0wOwoJaWYgKGFyZ2MgPjEpIHsKCQljczBfdGVzdF9zdGFydCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJY3MwX3Rlc3Rfc3RhcnQgPSAweDEwODAwMDA7CgkJfQoJfQoKCWlmIChhcmdjID4yKSB7CgkJY3MwX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJY3MwX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9Cgl9CgoJaWYgKGFyZ2MgPjMpIHsKCQljczFfdGVzdF9zdGFydCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJY3MxX3Rlc3Rfc3RhcnQgPSAwOwoJCX0KCX0KCWlmIChhcmdjID40KSB7CgkJY3MxX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJY3MxX3Rlc3Rfc2l6ZSA9IDA7CgkJfQoJfQoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWRkcl90ZXN0X3NpemUgPSBjczBfdGVzdF9zaXplOwoJaWYgKGFyZ2MgPjUpIHsKCQl3YXRjaGRvZ190aW1lX3MgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJd2F0Y2hkb2dfdGltZV9zPSAyMDsKCQl9Cgl9CglwcmludGYoIndhdGNoZG9nX3RpbWVfcz09JWRcbiIsd2F0Y2hkb2dfdGltZV9zKTsKCglpZiAoYXJnYyA+NikgewoJCXRlc3RfaW5kZXhfZW5hYmxlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfaW5kZXhfZW5hYmxlPSAwOwoJCX0KCX0KCXByaW50ZigidGVzdF9pbmRleF9lbmFibGU9PTB4JTA4eFxuIix0ZXN0X2luZGV4X2VuYWJsZSk7CgllbmFibGVfa2VybmVsX3Rlc3Q9KHRlc3RfaW5kZXhfZW5hYmxlPj43KSYxOwoJaWYgKGVuYWJsZV9rZXJuZWxfdGVzdCkgewoJCXByaW50ZigiZW5hYmxlIGtlcm5lbCB3aW5kb3cgdGVzdFxuIik7Cgl9CgoJdW5zaWduZWQgaW50ICAgbmliYmxlX21hc2tbM109IHswLDAsMH07CglpZiAoYXJnYyA+NykgewoJCW5pYmJsZV9tYXNrWzBdID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzddLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCW5pYmJsZV9tYXNrWzBdPSAwOwoJCX0KCX0KCXByaW50ZigibmliYmxlX21hc2tbMF09PTB4JTA4eFxuIixuaWJibGVfbWFza1swXSk7CglpZiAoYXJnYyA+OCkgewoJCW5pYmJsZV9tYXNrWzFdID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzhdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzhdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCW5pYmJsZV9tYXNrWzFdPSAwOwoJCX0KCX0KCXByaW50ZigibmliYmxlX21hc2tbMV09PTB4JTA4eFxuIixuaWJibGVfbWFza1sxXSk7CglpZiAoYXJnYyA+OSkgewoJCW5pYmJsZV9tYXNrWzJdID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzldLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzldID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCW5pYmJsZV9tYXNrWzJdPSAwOwoJCX0KCX0KCXByaW50ZigibmliYmxlX21hc2tbMl09PTB4JTA4eFxuIixuaWJibGVfbWFza1syXSk7CgoJaWYgKGFyZ2MgPjEwKSB7CgkJZHJhbV90eXBlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzEwXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxMF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZHJhbV90eXBlPSAwOwoJCX0KCX0KCWlmIChhcmdjID4xMSkgewoJCWNoYW5uZWxfbW9kZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxMV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMTFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWNoYW5uZWxfbW9kZT0gMDsKCQl9Cgl9CgkvLy8qCglpZiAoYXJnYyA+MTIpIHsKCQljb25maWdfcmVnaXN0ZXIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMTJdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzEyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQljb25maWdfcmVnaXN0ZXI9IDA7CgkJfQoJfS8vKi8KCS8vLyoKCWlmIChhcmdjID4xMykgewoJCWFsbF90b2dodGVyX2VuYWJsZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxM10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMTNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWFsbF90b2dodGVyX2VuYWJsZT0gMDsKCQl9Cgl9Ly8qLwoJcHJpbnRmKCJhbGxfdG9naHRlcl9lbmFibGU9PTB4JTA4eFxuIixhbGxfdG9naHRlcl9lbmFibGUpOwoKCWlmIChhcmdjID4xNCkgewoJCWVycm9yX2ZsYWdfcmVnX2FkZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxNF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMTRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWVycm9yX2ZsYWdfcmVnX2FkZD0gMDsKCQl9Cgl9CglwcmludGYoImVycm9yX2ZsYWdfcmVnX2FkZD09MHglMDh4XG4iLGVycm9yX2ZsYWdfcmVnX2FkZCk7CglwcmludGYoIlxudGVzdCB1c2UgdWJvb3Qgc3RpY2t5IHJlZ2lzdGVyXG4iKTsKCgkvL0RNQ19TVElDS1lfMAoJY2hhciBzdHJbMTAyNF09IiI7CgkvL2NoYXIgc3RyX3RlbXAxWzEwMjRdPSIiOwoJLy9jaGFyIHN0cl90ZW1wMlsxMDI0XT0iIjsKCXZvbGF0aWxlIHVpbnQxNl90ICAqbnVtX2Fycnk9TlVMTDsKCS8vdm9sYXRpbGUgdWludDE2X3QgICpwX251bV9hcnJ5OwoJaW50IGk7CgkvL3Vuc2lnbmVkIGludCBzdGlja19iYXNlX2FkZD0wOwoJLy91aW50MzJfdCBkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyh1aW50MzJfdCBiYXNlX2FkZHIsdWludDMyX3Qgc2l6ZSx1aW50MzJfdCBvZmZzZXRfaW5kZXgsdWludDMyX3QgdmFsdWUpCgoJc3RpY2t5X3JlZ19iYXNlX2FkZD0oKChwX2Rkcl9iYXNlLT5kZHJfZG1jX3N0aWNreTApKSYweGZmZmYpOwoJLy9udW1fYXJyeSA9ICh1aW50MTZfdCAqKSh1aW50NjRfdCApKHN0aWNreV9yZWdfYmFzZV9hZGQpOwoJLy9udW1fYXJyeT1wX251bV9hcnJ5OwoJZm9yIChpID0gMDsgaSA8IDY0KjQ7IGkrKykgewoJCW51bV9hcnJ5W2ldPWRkcl9yZF84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxpKTsKCQlpZiAoKGkgPT0gMCkgfHwgKGkgPT0gMzIpIHx8IChpID09ICgzMisxMCozKSkgfHwgKGkgPT0gKDMyKzEwKjMrMTYqMykpIHx8IChpID09ICgzMisxMCozKzE2KjMrMTYqMykpKQoJCXsKCQkJcHJpbnRmKCJcbiBudW1hcnJ5WyVkXSIgLGkpOwoJCX0KCQlwcmludGYoIiAlZCAiLG51bV9hcnJ5W2ldKTsKCX0KCgkvKgoJI2RlZmluZSAgVEVTVF9BUkdfMV9DTUQwICAxCgkvLyNkZWZpbmUgIFRFU1RfQVJHXzFfQ01EMSAgMQoJI2RlZmluZSAgVEVTVF9BUkdfMl9TVEVQICAyCgkjZGVmaW5lICBURVNUX0FSR18zX0ZSRVEgIDMKCSNkZWZpbmUgIFRFU1RfQVJHXzRfU1RFUF9TVEFUVVMgIDQKCSNkZWZpbmUgIFRFU1RfQVJHXzVfQk9PVF9USU1FUyAgNQoJI2RlZmluZSAgVEVTVF9BUkdfNl9MQ0RMUl9URU1QX0NPVU5UIDYKCSNkZWZpbmUgIFRFU1RfQVJHXzdfRE1DX1NUSUNLWV9NQUdJQyAgNwoJKi8KCgl1aW50MTZfdCB0ZXN0X2xlZnRfbWF4X2luaXRfdmFsdWUgPTMyOwoJdWludDE2X3QgdGVzdF9yaWdodF9tYXhfaW5pdF92YWx1ZSA9MzI7Cgl1aW50MTZfdCB0ZXN0X2Jvb3RfdGltZXMgPTA7Cgl1aW50MTZfdCB0ZXN0X2Rkcl9mcmVxdWVuY3kgPTA7CgkvL3VpbnQxNl90IHRlbXBfc3ViX3ZhbHVlX2EgPTA7CgkvKgoJdWludDE2X3QgdGVzdF9hcmdfMV9jbWQwID0xOyAgLy9tYXN0ZXIgY21kCgl1aW50MTZfdCB0ZXN0X2FyZ18xX2NtZDEgPTA7ICAvL21pbiBjbWQKCXVpbnQxNl90IHRlc3RfYXJnXzJfc3RlcCA9MDsgLy9zdGVwIDAgIGluaXQgIC0xIGxhbmUwIHcgbWluICAtMiBsYW5lMCB3IG1heCAtMyBsYW5lMCByIG1pbiAgICA0IGxhbmUwIHIgbWF4IC0tLS0tNSBsYW5lMSB3IG1pbiAuLi4KCXVpbnQxNl90IHRlc3RfYXJnXzNfZnJlcSA9MDsKCXVpbnQxNl90IHRlc3RfYXJnXzRfc3RlcF9zdGF0dXMgPTA7IC8vdWJvb3QgdGVzdCB3ZSBzaG91bGQgcmVhZCBlcnJvciB0aGVuIGRvbmUgc3RhdHVzLiAgMCBubyB0ZXN0IDEgb25nb2luZyAyIHRoaXMgc3RlcCBkb25lICBmYWlsIG9yIHBhc3MKCXRlc3RfYXJnXzBfY21kMD1udW1fYXJyeVswXTsKCXRlc3RfYXJnXzFfY21kMT1udW1fYXJyeVsxXTsKCXRlc3RfYXJnXzJfc3RlcD1udW1fYXJyeVsyXTsKCXRlc3RfYXJnXzNfZnJlcT1udW1fYXJyeVszXTsKCXRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9bnVtX2FycnlbNF07CgkvL2Jvb3RfdGltZXM9bnVtX2FycnlbNV07CgkvL2xjZGxyX3RlbXBfY291bnQ9bnVtX2FycnlbNl07CgkqLwoJcHJpbnRmKCJcblRFU1RfQVJHXzBfRE1DX1NUSUNLWV9NQUdJQz09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHXzBfRE1DX1NUSUNLWV9NQUdJQ10pOwoJcHJpbnRmKCJcblRFU1RfQVJHXzFfQ01EMD09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHXzFfQ01EMF0pOwoJcHJpbnRmKCJURVNUX0FSR18yX1NURVA9PTB4JTA4eFxuIixudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCXByaW50ZigiVEVTVF9BUkdfM19BTExfVE9HSFRFUj09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHXzNfQUxMX1RPR0hURVJdKTsKCXByaW50ZigiVEVTVF9BUkdfRlJFUV9OSUJCTEVfTD09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0xdKTsKCXByaW50ZigiVEVTVF9BUkdfRlJFUV9OSUJCTEVfSD09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0hdKTsKCXByaW50ZigiVEVTVF9BUkdfQk9PVF9USU1FU19MPT0weCUwOHhcbiIsbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXSk7CglwcmludGYoIlRFU1RfQVJHX0JPT1RfVElNRVNfSD09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfSF0pOwoJcHJpbnRmKCJURVNUX0FSR19FUlJPUl9GTEFHPT0weCUwOHhcbiIsbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoKCXByaW50ZigiVEVTVF9BUkdfRlJFUT09JWRNXG4iLChudW1fYXJyeVtURVNUX0FSR19GUkVRX05JQkJMRV9IXTw8OCl8KG51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0xdPDwwKSk7CglwcmludGYoIlRFU1RfQVJHX0JPT1RfVElNRVM9PSVkXG4iLChudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0hdPDw4KXwobnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXTw8MCkpOwoJdGVzdF9ib290X3RpbWVzPShudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0hdPDw4KXwobnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXTw8MCk7Cgl0ZXN0X2Rkcl9mcmVxdWVuY3k9KG51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0hdPDw4KXwobnVtX2FycnlbVEVTVF9BUkdfRlJFUV9OSUJCTEVfTF08PDApOwoJaWYgKChudW1fYXJyeVtURVNUX0FSR18wX0RNQ19TVElDS1lfTUFHSUNdID09IChETUNfU1RJQ0tZX1VCT09UX1dJTkRPV19NQUdJQ18xJjB4ZmYpKSAmJgoJKG51bV9hcnJ5W1RFU1RfQVJHXzFfQ01EMF09PShETUNfU1RJQ0tZX1VCT09UX1dJTkRPV19NQUdJQ18xJjB4ZmYpKSApIC8vZm9yIGNoZWNrIG1hZ2ljIG51bWJlciBtYWtlIHN1bWUgZW50ZXIgdGVzdCBjb21tYW5kCgl7CgkJLy9udW1fYXJyeVtURVNUX0FSR181X0JPT1RfVElNRVNdKys7CgkJdGVzdF9ib290X3RpbWVzKys7CgkJbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXT10ZXN0X2Jvb3RfdGltZXMmMHhmZjsKCQludW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0hdPSh0ZXN0X2Jvb3RfdGltZXM+PjgpJjB4ZmY7CgkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHX0JPT1RfVElNRVNfTCxudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0xdKTsKCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfQk9PVF9USU1FU19ILG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfSF0pOwoKCQlpZiAoIHRlc3RfZGRyX2ZyZXF1ZW5jeSAhPSBnbG9iYWxfZGRyX2NsaykgIC8vCgkJewoJCQlwcmludGYoInJ1bm5pbmcgZGRyIGZyZXE9PSVkLGJ1dCB0ZXN0IGZyZXEgaXMlZCx3aWxsIHJlYm9vdCB1c2UgZDJwbGwgXG4iLGdsb2JhbF9kZHJfY2xrLHRlc3RfZGRyX2ZyZXF1ZW5jeSk7CgkJCXNwcmludGYoc3RyLCJkMnBsbCAgJWQiLHRlc3RfZGRyX2ZyZXF1ZW5jeSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQl3aGlsZSAoMSkgOwoJCX0KCX0KCWVsc2UKCXsKCQl0ZXN0X2Jvb3RfdGltZXM9MDsKCQludW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0xdPXRlc3RfYm9vdF90aW1lcyYweGZmOwoJCW51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfSF09KHRlc3RfYm9vdF90aW1lcz4+OCkmMHhmZjsKCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfQk9PVF9USU1FU19MLG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfTF0pOwoJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19CT09UX1RJTUVTX0gsbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19IXSk7CgkJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT0wOwoJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18yX1NURVAsbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7Cgl9CglwcmludGYoInRlc3Rfc3RpY2t5IGlzIG5vdCBtYWdpYyBudW1tYmVyLGJvb3QgdGltZXM9PSVkXG4iLHRlc3RfYm9vdF90aW1lcyk7CgoJLy9pZihjb25maWdfcmVnaXN0ZXI9PTEpCgl7CgkJd3JfcmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkK1RFU1RfQVJHX0NTMF9URVNUX1NUQVJUX0lOREVYKSwgY3MwX3Rlc3Rfc3RhcnQpOwoJCXdyX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCtURVNUX0FSR19DUzBfVEVTVF9TSVpFX0lOREVYKSwgY3MwX3Rlc3Rfc2l6ZSk7CgkJd3JfcmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkK1RFU1RfQVJHX0NTMV9URVNUX1NUQVJUX0lOREVYKSwgY3MxX3Rlc3Rfc3RhcnQpOwoJCXdyX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCtURVNUX0FSR19DUzFfVEVTVF9TSVpFX0lOREVYKSwgY3MxX3Rlc3Rfc2l6ZSk7CgkJewoJCQludW1fYXJyeVtURVNUX0FSR19XQVRDSERPR19USU1FX1NJWkVfSU5ERVhdPXdhdGNoZG9nX3RpbWVfcyYweGZmOwoJCQludW1fYXJyeVtURVNUX0FSR19XQVRDSERPR19USU1FX1NJWkVfSU5ERVgrMV09KHdhdGNoZG9nX3RpbWVfcz4+OCkmMHhmZjsKCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHX1dBVENIRE9HX1RJTUVfU0laRV9JTkRFWCxudW1fYXJyeVtURVNUX0FSR19XQVRDSERPR19USU1FX1NJWkVfSU5ERVhdKTsKCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LChURVNUX0FSR19XQVRDSERPR19USU1FX1NJWkVfSU5ERVgrMSksbnVtX2FycnlbVEVTVF9BUkdfV0FUQ0hET0dfVElNRV9TSVpFX0lOREVYKzFdKTsKCQl9CgkJbnVtX2FycnlbVEVTVF9BUkdfVEVTVF9JTkRFWF9FTkFMQkVfSU5ERVhdPXRlc3RfaW5kZXhfZW5hYmxlOwoJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19URVNUX0lOREVYX0VOQUxCRV9JTkRFWCxudW1fYXJyeVtURVNUX0FSR19URVNUX0lOREVYX0VOQUxCRV9JTkRFWF0pOwoJCWlmIChjb25maWdfcmVnaXN0ZXIgPT0gMSkKCQkJewoJCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF09MDsKCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfMl9TVEVQLG51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pOwoJCQl9CgkJbnVtX2FycnlbVEVTVF9BUkdfM19BTExfVE9HSFRFUl09YWxsX3RvZ2h0ZXJfZW5hYmxlOwoJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18zX0FMTF9UT0dIVEVSLG51bV9hcnJ5W1RFU1RfQVJHXzNfQUxMX1RPR0hURVJdKTsKCX0KCglpZiAoKCBudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKSA9PSAwKQoJewoJCXsKCQkJbnVtX2FycnlbVEVTVF9BUkdfMF9ETUNfU1RJQ0tZX01BR0lDXT1ETUNfU1RJQ0tZX1VCT09UX1dJTkRPV19NQUdJQ18xOwoJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfMF9ETUNfU1RJQ0tZX01BR0lDLG51bV9hcnJ5W1RFU1RfQVJHXzBfRE1DX1NUSUNLWV9NQUdJQ10pOwoJCQludW1fYXJyeVtURVNUX0FSR18xX0NNRDBdPURNQ19TVElDS1lfVUJPT1RfV0lORE9XX01BR0lDXzE7CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18xX0NNRDAsbnVtX2FycnlbVEVTVF9BUkdfMV9DTUQwXSk7CgkJCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF09MTsKCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHXzJfU1RFUCxudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCQkJewoJCQkJdGVzdF9ib290X3RpbWVzPTA7CgkJCQludW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0xdPXRlc3RfYm9vdF90aW1lcyYweGZmOwoJCQkJbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19IXT0odGVzdF9ib290X3RpbWVzPj44KSYweGZmOwoJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHX0JPT1RfVElNRVNfTCxudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0xdKTsKCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19CT09UX1RJTUVTX0gsbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19IXSk7CgkJCX0KCQkJewoJCQkJdGVzdF9kZHJfZnJlcXVlbmN5PWdsb2JhbF9kZHJfY2xrOwoJCQkJbnVtX2FycnlbVEVTVF9BUkdfRlJFUV9OSUJCTEVfTF09dGVzdF9kZHJfZnJlcXVlbmN5JjB4ZmY7CgkJCQludW1fYXJyeVtURVNUX0FSR19GUkVRX05JQkJMRV9IXT0odGVzdF9kZHJfZnJlcXVlbmN5Pj44KSYweGZmOwoJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHX0ZSRVFfTklCQkxFX0wsbnVtX2FycnlbVEVTVF9BUkdfRlJFUV9OSUJCTEVfTF0pOwoJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHX0ZSRVFfTklCQkxFX0gsbnVtX2FycnlbVEVTVF9BUkdfRlJFUV9OSUJCTEVfSF0pOwoJCQl9CgoJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXT1URVNUX0FSR19FUlJPUl9GTEFHX05VTEw7CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19FUlJPUl9GTEFHLG51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKTsKCQl9CgoKCQlmb3IgKG5pYmJsZV9zdGVwID0gMDsgbmliYmxlX3N0ZXAgPCA3MjsgbmliYmxlX3N0ZXArKykKCQl7CgkJCS8vaWYobGFuZV9zdGVwJTIpCgkJCXsKCQkJCS8vbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKG5pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9PUkddPTB4ZmZmZjsKCQkJCXRlc3RfbGVmdF9tYXhfaW5pdF92YWx1ZT0xNjsKCQkJCXRlc3RfcmlnaHRfbWF4X2luaXRfdmFsdWU9MTY7CgkJCQlpZiAobmliYmxlX3N0ZXA8MTApCgkJCQl7CgkJCQkJdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlPTMyOwoJCQkJCXRlc3RfcmlnaHRfbWF4X2luaXRfdmFsdWU9MzI7CgkJCQl9CgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKG5pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU5dPXRlc3RfbGVmdF9tYXhfaW5pdF92YWx1ZTsKCQkJCQludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsobmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWF09dGVzdF9yaWdodF9tYXhfaW5pdF92YWx1ZTsKCQkJCQludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsobmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVU109MDsvLzAKCQkJCQkvL2Rkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxpLG51bV9hcnJ5W2ldKTsKCQkJfQoKCQkJewoJCQkJaWYgKG5pYmJsZV9zdGVwPDMyKQoJCQkJewoJCQkJCWlmICgoKG5pYmJsZV9tYXNrWzBdKT4+bmliYmxlX3N0ZXApJjEpCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109NDsKCQkJCX0KCQkJCWVsc2UgaWYgKG5pYmJsZV9zdGVwPDY0KQoJCQkJewoJCQkJCWlmICgoKG5pYmJsZV9tYXNrWzFdKT4+KG5pYmJsZV9zdGVwLTMyKSkmMSkKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUrTENEX0JETFJfU1RBVFVTXT00OwoJCQkJfQoJCQkJZWxzZSBpZiAobmliYmxlX3N0ZXA8OTYpCgkJCQl7CgkJCQkJaWYgKCgobmliYmxlX21hc2tbMl0pPj4obmliYmxlX3N0ZXAtNjQpKSYxKQoJCQkJCQludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURStuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURStMQ0RfQkRMUl9TVEFUVVNdPTQ7CgkJCQl9CgkJCQlpZiAoYWxsX3RvZ2h0ZXJfZW5hYmxlKQoJCQkJewoJCQkJCWlmICgobmliYmxlX3N0ZXAgPT0gMCkgfHwgKG5pYmJsZV9zdGVwID09IDEwKSB8fCAobmliYmxlX3N0ZXAgPT0gKDEwKzE2KSkpCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109MDsKCQkJCQllbHNlCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109NDsKCQkJCX0KCQkJfQoJCS8vbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKG5pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVNdPTB4ZmZmZjsvLzAKCQl9CgoJCXsKCQkJLy9wcmludGYoIi4ubnVtX2FycnlbVEVTVF9BUkdfMV9DTUQwXT0lZFxuIixudW1fYXJyeVtURVNUX0FSR18xX0NNRDBdKTsKCQkJZm9yIChpID0gVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEU7IGkgPCA3MipURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURTsgaSsrKSB7CgkJCQkvLwludW1fYXJyeVtpXT0wOwoJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LGksbnVtX2FycnlbaV0pOwoJCQkJLy8JZGRyX3dyXzE2Yml0X29uXzMycmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwxKSksbnVtX2FycnlbaV0pOwoJCQkJLy8JcHJpbnRmKCJudW1fYXJyeVsweCUwOHhdID09MHglMDh4XG4iLGksbnVtX2FycnlbaV0pOwoJCQl9CgoJCQludW1fYXJyeVtURVNUX0FSR18yX1NURVBdPTE7CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18yX1NURVAsCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pOwoJCX0KCgl9CgoJaWYgKGFsbF90b2dodGVyX2VuYWJsZSkKCXsKCQlmb3IgKG5pYmJsZV9zdGVwID0gMDsgbmliYmxlX3N0ZXAgPCA3MjsgbmliYmxlX3N0ZXArKykKCQl7CgkJCWlmICgobmliYmxlX3N0ZXAgPT0gMCkgfHwgKG5pYmJsZV9zdGVwID09IDEwKSB8fCAobmliYmxlX3N0ZXAgPT0gKDEwKzE2KSkpCgkJCXsKCQkJLy8JbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUrTENEX0JETFJfU1RBVFVTXT0wOwoJCQl9CgkJCWVsc2UKCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109NDsKCQl9Cgl9CgoJaWYgKGNvbmZpZ19yZWdpc3RlciA9PSAxKQoJewoJCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF09MDsKCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfMl9TVEVQLAludW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCX0KCmlmICgoIG51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pKQp7CmZvciAodGVzdF9pbmRleD1udW1fYXJyeVtURVNUX0FSR18yX1NURVBdO3Rlc3RfaW5kZXg8dGVzdF9pbmRleF9tYXggO3Rlc3RfaW5kZXgrKyApCnsKCXByaW50ZigiXG50ZXN0X2luZGV4PSVkXG4iLHRlc3RfaW5kZXgpOwoJaWYgKCgoKHRlc3RfaW5kZXhfZW5hYmxlKT4+KHRlc3RfaW5kZXgtMSkpJjEpID09IDApCgl7CgkJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT0oKG51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pKzEpOy8vd2h5IGNhbiBub3QgdXNlICsrCgkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHXzJfU1RFUCwJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CgkJY29udGludWU7Cgl9Cgl7CgkJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkKCQl7CgkJCW5pYmJsZV9zYXZlX29mZnNldD0wOwoJCQluaWJibGVfbWF4PTEwOwoJCQluaWJibGVfbWFza1swXT0gMHgzMDsKCQkJaWYgKChkcmFtX3R5cGUgPT0gQ09ORklHX0REUl9UWVBFX0xQRERSMykpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSAweDNlMzsKCQkJfQoJCQlpZiAoKGRyYW1fdHlwZSA9PSBDT05GSUdfRERSX1RZUEVfTFBERFI0KSkKCQkJewoJCQkJbmliYmxlX21hc2tbMF09IDB4MjczOwoJCQkJaWYgKChjaGFubmVsX21vZGUgPT0gQ09ORklHX0REUjBfMzJCSVRfUkFOSzAxX0NIMCkpCgkJCQkJbmliYmxlX21hc2tbMF09IDB4M2YzOwoJCQl9CgkJCXRlc3RfbGVmdF9tYXhfaW5pdF92YWx1ZT02NDsKCQkJdGVzdF9yaWdodF9tYXhfaW5pdF92YWx1ZT02NDsKCQl9CgkJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKQoJCXsKCQkJbmliYmxlX3NhdmVfb2Zmc2V0PTEwOwoJCQluaWJibGVfbWF4PTE2OwoJCQlpZiAoKGNzMV90ZXN0X3NpemUgPT0gMCkpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSAweGZmMDA7CgkJCX0KCQkJdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlPTE2OwoJCQl0ZXN0X3JpZ2h0X21heF9pbml0X3ZhbHVlPTE2OwoJCX0KCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpCgkJewoJCQluaWJibGVfc2F2ZV9vZmZzZXQ9KDEwKSsoMTYpOwoJCQlpZiAoKGNzMV90ZXN0X3NpemUgPT0gMCkpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSAweGZmMDA7CgkJCX0KCQkJbmliYmxlX21heD0xNjsKCQkJdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlPTE2OwoJCQl0ZXN0X3JpZ2h0X21heF9pbml0X3ZhbHVlPTE2OwoJCX0KCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkKCQl7CgkJCW5pYmJsZV9zYXZlX29mZnNldD0wOwoJCQluaWJibGVfbWF4PTcyOwoJCQlpZiAoKGNzMV90ZXN0X3NpemUgPT0gMCkpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzFdPSAweGZmZmZmZmYwOwoJCQkJbmliYmxlX21hc2tbMl09IDB4ZmZmZmZmZmY7CgkJCX0KCQkJdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlPTE2OwoJCQl0ZXN0X3JpZ2h0X21heF9pbml0X3ZhbHVlPTE2OwoJCX0KCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkKCQl7CgkJCW5pYmJsZV9zYXZlX29mZnNldD0wOwoJCQluaWJibGVfbWF4PTcyOwoJCQlpZiAoKGNzMV90ZXN0X3NpemUgPT0gMCkpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzFdPSAweGZmZmZmZmYwOwoJCQkJbmliYmxlX21hc2tbMl09IDB4ZmZmZmZmZmY7CgkJCX0KCgkJdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlPTY0OwoJCXRlc3RfcmlnaHRfbWF4X2luaXRfdmFsdWU9NjQ7fQoJCS8vbmliYmxlX21heD04Oy8vCgkJLy8gaWYobmliYmxlX21heD4zMCkgIGNhbiBub3Qgb3ZlciBzdGlja3kgcmVnaXN0ZXIgc2l6ZQoJCS8vIAluaWJibGVfbWF4PTMwOwoJCWZvciAoKG5pYmJsZV9zdGVwPTApOyhuaWJibGVfc3RlcDxuaWJibGVfbWF4KTsobmliYmxlX3N0ZXArKykpCgkJewoJCQlpZiAobmliYmxlX3N0ZXA8MzIpCgkJCXsKCQkJCWlmICgoKG5pYmJsZV9tYXNrWzBdKT4+bmliYmxlX3N0ZXApJjEpCgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUrTENEX0JETFJfU1RBVFVTXT00OwoJCQl9CgkJCWVsc2UgaWYgKG5pYmJsZV9zdGVwPDY0KQoJCQl7CgkJCQlpZiAoKChuaWJibGVfbWFza1sxXSk+PihuaWJibGVfc3RlcC0zMikpJjEpCgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUrTENEX0JETFJfU1RBVFVTXT00OwoJCQl9CgkJCWVsc2UgaWYgKG5pYmJsZV9zdGVwPDk2KQoJCQl7CgkJCQlpZiAoKChuaWJibGVfbWFza1syXSk+PihuaWJibGVfc3RlcC02NCkpJjEpCgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUrTENEX0JETFJfU1RBVFVTXT00OwoJCQl9CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwKCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCX0KCX0KCnsKCWZvciAoKG5pYmJsZV9zdGVwPTApOyhuaWJibGVfc3RlcDxuaWJibGVfbWF4KTsobmliYmxlX3N0ZXArKykpCgl7CgkJaWYgKG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldID09IDQpCgkJCWNvbnRpbnVlOwoJCXByaW50ZigibmliYmxlX3N0ZXAgPT0lZFxuIixuaWJibGVfc3RlcCk7CgoJCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkKCQl7CgkJCWlmIChuaWJibGVfc3RlcCUyKQoJCQl7CgkJCQkvL25pYmJsZV9zYXZlX29mZnNldAoJCQkJLy9udW1fYXJyeVtURVNUX0FSR18yX1NURVBdPTE7CgkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pLAoJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXAtMStuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pXSk7CgkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpLAoJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXAtMStuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXSk7CgkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAoJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXAtMStuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkvL25pYmJsZV9zdGVwKys7CgkJCQljb250aW51ZTsKCQkJfQoJCX0KCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MwX3Rlc3Rfc3RhcnQ7CgkJZGRyX3Rlc3Rfc2l6ZT1jczBfdGVzdF9zaXplOwoJCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpCgkJewoJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MwX3Rlc3Rfc3RhcnQ7CgkJCWRkcl90ZXN0X3NpemU9Y3MwX3Rlc3Rfc2l6ZTsKCQl9CgoJCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkKCQl7CgkJCWlmIChuaWJibGVfc3RlcD43KQoJCQl7CgkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MxX3Rlc3Rfc3RhcnQ7CgkJCQlkZHJfdGVzdF9zaXplPWNzMV90ZXN0X3NpemU7CgkJCX0KCQl9CgkJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKQoJCXsKCQkJaWYgKG5pYmJsZV9zdGVwPjcpCgkJCXsKCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczFfdGVzdF9zdGFydDsKCQkJCWRkcl90ZXN0X3NpemU9Y3MxX3Rlc3Rfc2l6ZTsKCQkJfQoJCX0KCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkKCQl7CgkJCWlmIChuaWJibGVfc3RlcD4zNSkKCQkJewoJCQkJdGVzdF9zdGFydF9hZGRyPWNzMV90ZXN0X3N0YXJ0OwoJCQkJZGRyX3Rlc3Rfc2l6ZT1jczFfdGVzdF9zaXplOwoJCQl9CgkJfQoJCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKQoJCXsKCQkJaWYgKG5pYmJsZV9zdGVwPjM1KQoJCQl7CgkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MxX3Rlc3Rfc3RhcnQ7CgkJCQlkZHJfdGVzdF9zaXplPWNzMV90ZXN0X3NpemU7CgkJCX0KCQl9CgkJewoJCQlpZiAobmliYmxlX3N0ZXA8MzIpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSgoMHhmZmZmZmZmZikmKH4oMTw8bmliYmxlX3N0ZXApKSk7CgkJCQluaWJibGVfbWFza1sxXT0oKDB4ZmZmZmZmZmYpKTsKCQkJCW5pYmJsZV9tYXNrWzJdPSgoMHhmZmZmZmZmZikpOwoJCQl9CgkJCWVsc2UgaWYgKG5pYmJsZV9zdGVwPDY0KQoJCQl7CgkJCQluaWJibGVfbWFza1swXT0oKDB4ZmZmZmZmZmYpKTsKCQkJCW5pYmJsZV9tYXNrWzFdPSgoMHhmZmZmZmZmZikmKH4oMTw8KG5pYmJsZV9zdGVwLTMyKSkpKTsKCQkJCW5pYmJsZV9tYXNrWzJdPSgoMHhmZmZmZmZmZikpOwoJCQl9CgkJCWVsc2UgaWYgKG5pYmJsZV9zdGVwPDk2KQoJCQl7CgkJCQluaWJibGVfbWFza1swXT0oKDB4ZmZmZmZmZmYpKTsKCQkJCW5pYmJsZV9tYXNrWzFdPSgoMHhmZmZmZmZmZikpOwoJCQkJbmliYmxlX21hc2tbMl09KCgweGZmZmZmZmZmKSYofigxPDwobmliYmxlX3N0ZXAtNjQpKSkpOwoJCQl9CgkJfQoJCWlmIChhbGxfdG9naHRlcl9lbmFibGUpCgkJewoJCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKQoJCQl7CgkJCQluaWJibGVfc2F2ZV9vZmZzZXQ9MDsKCQkJCW5pYmJsZV9tYXg9MTA7CgkJCQluaWJibGVfbWFza1swXT0gMHgzMDsKCQkJCW5pYmJsZV9tYXNrWzFdPSAwOwoJCQkJbmliYmxlX21hc2tbMl09IDA7CgkJCQlpZiAoKGRyYW1fdHlwZSA9PSBDT05GSUdfRERSX1RZUEVfTFBERFIzKSkKCQkJCXsKCQkJCQluaWJibGVfbWFza1swXT0gMHgzZTM7CgkJCQl9CgkJCQlpZiAoKGRyYW1fdHlwZSA9PSBDT05GSUdfRERSX1RZUEVfTFBERFI0KSkKCQkJCXsKCQkJCQluaWJibGVfbWFza1swXT0gMHgyNzM7CgkJCQkJaWYgKChjaGFubmVsX21vZGUgPT0gQ09ORklHX0REUjBfMzJCSVRfUkFOSzAxX0NIMCkpCgkJCQkJCW5pYmJsZV9tYXNrWzBdPSAweDNmMzsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSAwOwoJCQkJbmliYmxlX21hc2tbMV09IDA7CgkJCQluaWJibGVfbWFza1syXT0gMDsKCQkJfQoJCX0KCgkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHdhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix3YXRjaGRvZ190aW1lX3MpOwoJCWlmICgobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0gPT0gMHhmZmZmKQoJCXx8KG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPT0wKQoJCXx8KG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPT0xKSApCgkJewoJCQlwcmludGYoIlxubmliYmxlX3N0ZXAgID09JWQgIiwgbmliYmxlX3N0ZXApOwoJCQlpZiAoKG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldID09IDB4ZmZmZikKCQkJfHwobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09PTApKQoJCQl7CgkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT0xOwoJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCgkJCQlpZiAobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0gPT0gMCkKCQkJCXsKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT0yOwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoJCQkJewoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildPQoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildLTE7CgkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTiksCgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0pOwoJCQkJfQoKCQkJCXsKCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXT1URVNUX0FSR19FUlJPUl9GTEFHX0ZBSUw7CgkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJfQoKCQkJCS8vaWYoYWxsX3RvZ2h0ZXJfZW5hYmxlKQoJCQkJLy8Jc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgICVkICAweCUwOHggMHglMDh4ICAweCUwOHggICVkICVkIix0ZXN0X2luZGV4LDAsMCwwLEREUl9QQVJBTUVURVJfTEVGVCwKCQkJCS8vCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildKTsKCQkJCS8vZWxzZQoJCQkJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgICVkICAweCUwOHggMHglMDh4ICAweCUwOHggICVkICVkIix0ZXN0X2luZGV4LG5pYmJsZV9tYXNrWzBdLG5pYmJsZV9tYXNrWzFdLG5pYmJsZV9tYXNrWzJdLEREUl9QQVJBTUVURVJfTEVGVCwKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildKTsKCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQlydW5fY29tbWFuZChzdHIsMCk7CgoJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJaWYgKGFsbF90b2dodGVyX2VuYWJsZSAmJiBjczFfdGVzdF9zaXplKQoJCQkJewoJCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczFfdGVzdF9zdGFydDsKCQkJCQlkZHJfdGVzdF9zaXplPWNzMV90ZXN0X3NpemU7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MwX3Rlc3Rfc3RhcnQ7CgkJCQkJZGRyX3Rlc3Rfc2l6ZT1jczBfdGVzdF9zaXplOwoJCQkJCS8vdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCX0KCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQl7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkvLwoJCQkJCWlmICghZW5hYmxlX2tlcm5lbF90ZXN0KQoJCQkJCXsKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR109VEVTVF9BUkdfRVJST1JfRkxBR19QQVNTOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKGtlcm5lbF93YXRjaGRvZ19zKTsgLy9zCgkJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIixrZXJuZWxfd2F0Y2hkb2dfcyk7CgkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQl9CgkJCQkJLyoKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT0yOwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCSovCgkJCQl9CgkJCX0KCQkJZWxzZSBpZiAobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09PTEpCgkJCXsvL2dvIG9uIGZpbmQgbGVmdCBlZGdlCgoJCQkJaWYgKG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildID09IDApCgkJCQl7CgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09MjsKCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCgkJCQlpZiAoKG51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKSA9PSBURVNUX0FSR19FUlJPUl9GTEFHX1BBU1MpCgkJCQl7CgkJCQkJewoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT0yOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQl9CgkJCQkJewoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXT1URVNUX0FSR19FUlJPUl9GTEFHX05VTEw7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJVEVTVF9BUkdfRVJST1JfRkxBRywKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJCX0KCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoJCQkJaWYgKChudW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSkgPT0gVEVTVF9BUkdfRVJST1JfRkxBR19GQUlMKQoJCQkJewoJCQkJCXsKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV09CgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildLTE7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKSwKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0pOwoJCQkJCX0KCQkJCQl7CgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfRkFJTDsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQlURVNUX0FSR19FUlJPUl9GTEFHLAoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgkJCQkJfQoJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgKCBudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pXSkpOwoJCQkJCXByaW50ZiggIiVzIiwgYnVmKTsKCQkJCS8vCWlmKGFsbF90b2dodGVyX2VuYWJsZSkKCQkJCS8vCQlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAgJWQgIDB4JTA4eCAweCUwOHggIDB4JTA4eCAgJWQgJWQiLHRlc3RfaW5kZXgsMCwwLDAsRERSX1BBUkFNRVRFUl9MRUZULAoJCQkJLy8JCSggbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0pKTsKCQkJCS8vCWVsc2UKCQkJCQlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAgJWQgIDB4JTA4eCAweCUwOHggIDB4JTA4eCAgJWQgJWQiLHRlc3RfaW5kZXgsbmliYmxlX21hc2tbMF0sbmliYmxlX21hc2tbMV0sbmliYmxlX21hc2tbMl0sRERSX1BBUkFNRVRFUl9MRUZULAoJCQkJCQkoIG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildKSk7CgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQlpZiAoYWxsX3RvZ2h0ZXJfZW5hYmxlICYmIGNzMV90ZXN0X3NpemUpCgkJCQkJewoJCQkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MxX3Rlc3Rfc3RhcnQ7CgkJCQkJCWRkcl90ZXN0X3NpemU9Y3MxX3Rlc3Rfc2l6ZTsKCQkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJdGVzdF9zdGFydF9hZGRyPWNzMF90ZXN0X3N0YXJ0OwoJCQkJCQlkZHJfdGVzdF9zaXplPWNzMF90ZXN0X3NpemU7CgkJCQkJCS8vdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQl9CgkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQl7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCS8vCgkJCQkJCWlmICghZW5hYmxlX2tlcm5lbF90ZXN0KQoJCQkJCQl7CgkJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXT1URVNUX0FSR19FUlJPUl9GTEFHX1BBU1M7CgkJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCQlURVNUX0FSR19FUlJPUl9GTEFHLAoJCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZShrZXJuZWxfd2F0Y2hkb2dfcyk7IC8vcwoJCQkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLGtlcm5lbF93YXRjaGRvZ19zKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQkJfQoJCQkJCQkvKgoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT0yOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJKi8KCQkJCQl9CgkJCQl9CgkJCX0KCQkJLy8JcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQl9CgoJCWlmICgobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0gPT0gMikgfHwKCQkobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09PTMpKQoJCXsKCQkJcHJpbnRmKCJcbm5pYmJsZV9zdGVwICA9PSVkICIsIG5pYmJsZV9zdGVwKTsKCQkJaWYgKChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSA9PSAyKQoJCQl8fChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT09MikpCgkJCXsKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTM7CgkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAoJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoKCQkJCWlmIChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXSA9PSAwKQoJCQkJewoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTQ7CgkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQl9CgkJCQl7CgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV09CgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV0tMTsKCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKSwKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXSk7CgkJCQl9CgoJCQkJewoJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfRkFJTDsKCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJVEVTVF9BUkdfRVJST1JfRkxBRywKCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgkJCQl9CgkJCS8vCWlmKGFsbF90b2dodGVyX2VuYWJsZSkKCQkJLy8Jc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgICVkICAweCUwOHggMHglMDh4ICAweCUwOHggICVkICVkIix0ZXN0X2luZGV4LDAsMCwwLEREUl9QQVJBTUVURVJfUklHSFQsCgkJCS8vCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldKTsKCQkJLy8JZWxzZQoJCQkJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgICVkICAweCUwOHggMHglMDh4ICAweCUwOHggICVkICVkIix0ZXN0X2luZGV4LG5pYmJsZV9tYXNrWzBdLG5pYmJsZV9tYXNrWzFdLG5pYmJsZV9tYXNrWzJdLEREUl9QQVJBTUVURVJfUklHSFQsCgkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXSk7CgkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJaWYgKGFsbF90b2dodGVyX2VuYWJsZSAmJiBjczFfdGVzdF9zaXplKQoJCQkJewoJCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczFfdGVzdF9zdGFydDsKCQkJCQlkZHJfdGVzdF9zaXplPWNzMV90ZXN0X3NpemU7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MwX3Rlc3Rfc3RhcnQ7CgkJCQkJZGRyX3Rlc3Rfc2l6ZT1jczBfdGVzdF9zaXplOwoJCQkJCS8vdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCX0KCQkJLy8JdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJLy8JdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQl7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkvLwoJCQkJCWlmICghZW5hYmxlX2tlcm5lbF90ZXN0KQoJCQkJCXsKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR109VEVTVF9BUkdfRVJST1JfRkxBR19QQVNTOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKGtlcm5lbF93YXRjaGRvZ19zKTsgLy9zCgkJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIixrZXJuZWxfd2F0Y2hkb2dfcyk7CgkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQl9CgkJCQkJLyoKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT0yOwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCSovCgkJCQl9CgkJCX0KCQkJZWxzZSBpZiAobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09PTMpCgkJCXsvL2dvIG9uIGZpbmQgbGVmdCBlZGdlCgkJCQlpZiAobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV0gPT0gMCkKCQkJCXsKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT00OwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoKCQkJCWlmICgobnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pID09IFRFU1RfQVJHX0VSUk9SX0ZMQUdfUEFTUykKCQkJCXsKCQkJCQl7CgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTQ7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCQkJCX0KCQkJCQl7CgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfTlVMTDsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQlURVNUX0FSR19FUlJPUl9GTEFHLAoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgkJCQkJfQoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQl9CgkJCQlpZiAoKG51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKSA9PSBURVNUX0FSR19FUlJPUl9GTEFHX0ZBSUwpCgkJCQl7CgkJCQkJewoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXT0KCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV0tMTsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpLAoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXSk7CgkJCQkJfQoJCQkJCXsKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR109VEVTVF9BUkdfRVJST1JfRkxBR19GQUlMOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKTsKCQkJCQl9CgkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCAoIG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldKSk7CgkJCQkJcHJpbnRmKCAiJXMiLCBidWYpOwoJCQkJLy8JaWYoYWxsX3RvZ2h0ZXJfZW5hYmxlKQoJCQkJLy8Jc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgICVkICAweCUwOHggMHglMDh4ICAweCUwOHggICVkICVkIix0ZXN0X2luZGV4LDAsMCwwLEREUl9QQVJBTUVURVJfUklHSFQsCgkJCQkvLwkoIG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldKSk7CgkJCQkvLwllbHNlCgkJCQkJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgICVkICAweCUwOHggMHglMDh4ICAweCUwOHggICVkICVkIix0ZXN0X2luZGV4LG5pYmJsZV9tYXNrWzBdLG5pYmJsZV9tYXNrWzFdLG5pYmJsZV9tYXNrWzJdLEREUl9QQVJBTUVURVJfUklHSFQsCgkJCQkJKCBudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXSkpOwoJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJaWYgKGFsbF90b2dodGVyX2VuYWJsZSAmJiBjczFfdGVzdF9zaXplKQoJCQkJCXsKCQkJCQkJdGVzdF9zdGFydF9hZGRyPWNzMV90ZXN0X3N0YXJ0OwoJCQkJCQlkZHJfdGVzdF9zaXplPWNzMV90ZXN0X3NpemU7CgkJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczBfdGVzdF9zdGFydDsKCQkJCQkJZGRyX3Rlc3Rfc2l6ZT1jczBfdGVzdF9zaXplOwoJCQkJCQkvL3RlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJfQoJCQkJCS8vdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkvL3RlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQl7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWlmICghZW5hYmxlX2tlcm5lbF90ZXN0KQoJCQkJCQl7CgkJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXT1URVNUX0FSR19FUlJPUl9GTEFHX1BBU1M7CgkJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCQlURVNUX0FSR19FUlJPUl9GTEFHLAoJCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZShrZXJuZWxfd2F0Y2hkb2dfcyk7IC8vcwoJCQkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLGtlcm5lbF93YXRjaGRvZ19zKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQkJfQoKCQkJCQkJLyoKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09MjsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCSovCgkJCQkJfQoJCQkJfQoJCQl9CgkJCS8vCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJfQoKCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCXsKCQkJcHJpbnRmKCJjbG9zZSAgd2F0Y2hkb2dcbiIpOwoJCX0KCX0KCglwcmludGYoIjExbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT09JWRcbiIsbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CgludW1fYXJyeVtURVNUX0FSR18yX1NURVBdPShudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKSsxOwoJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHXzJfU1RFUCwJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CglwcmludGYoIjIybnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT09JWRcbiIsbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CgkvL30KCglkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJcHJpbnRmKCJjbG9zZSAgd2F0Y2hkb2dcbiIpOwoJLy99CgkvL2Zvcih0ZXN0X2luZGV4PTE7dGVzdF9pbmRleDx0ZXN0X2luZGV4X21heCA7dGVzdF9pbmRleCsrICkKCXsKCQl1bnNpZ25lZCBpbnQgIHVpXzFfMzJfMTAwc3RlcD0gMDsKCQl1bnNpZ25lZCBpbnQgIGJkbHJfMTAwc3RlcD0gMDsKCQl1aV8xXzMyXzEwMHN0ZXA9KDEwMDAwMDAqMTAwLyhnbG9iYWxfZGRyX2NsayoyKjMyKSk7CgkJYmRscl8xMDBzdGVwPWdldF9iZGxyXzEwMHN0ZXAoZ2xvYmFsX2Rkcl9jbGspOwoJCS8vaWYoKCgodGVzdF9pbmRleF9lbmFibGUpPj4odGVzdF9pbmRleC0xKSkmMSk9PTApCgoJCXByaW50ZigiXG5hY21kbHI9MHglMDh4LS0+ZGVjICVkLGRkciBjbGs9PSVkLGJkbHJfMTAwc3RlcD0lZCBwcyx1aV8xXzMyXzEwMHN0ZXA9JWQgcHMsXG4iLDAsMCxnbG9iYWxfZGRyX2NsaywKCQliZGxyXzEwMHN0ZXAsdWlfMV8zMl8xMDBzdGVwKTsKCgkJcHJpbnRmKCJcbiB0ZXN0IHJlc3VsdCBpbmRleD09Iik7CgkJcHJpbnRmKCIlMDhkIix0ZXN0X2luZGV4KTsKCgkJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgewoJCQlwcmludGYoIiBhYyB3aW5kb3c6Iik7CgkJCXByaW50ZigiIHN0ZXBfc2l6ZSBwcz09Iik7CgkJCXByaW50ZigiJTA4ZCIsdWlfMV8zMl8xMDBzdGVwKTsKCQkJcHJpbnRmKCIvMTAwIHBzICIpOwoJCX0KCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpIHsKCQkJcHJpbnRmKCIgdHhkcXMgd2luZG93OiIpOwoJCQlwcmludGYoIiBzdGVwX3NpemUgcHM9PSIpOwoJCQlwcmludGYoIiUwOGQiLHVpXzFfMzJfMTAwc3RlcCk7CgkJCXByaW50ZigiLzEwMCBwcyAiKTsKCQl9CgkJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKSB7CgkJCXByaW50ZigiIHJ4X2Nsa193aW5kb3c6Iik7CgkJCXByaW50ZigiIHN0ZXBfc2l6ZSBwcz09Iik7CgkJCXByaW50ZigiJTA4ZCIsdWlfMV8zMl8xMDBzdGVwKTsKCQkJcHJpbnRmKCIvMTAwIHBzICIpOwoJCX0KCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkgewoJCQlwcmludGYoIiB0eF9iaXRfZHFfd2luZG93OiIpOwoJCQlwcmludGYoIiBzdGVwX3NpemUgcHM9PSIpOwoJCQlwcmludGYoIiUwOGQiLHVpXzFfMzJfMTAwc3RlcCk7CgkJCXByaW50ZigiLzEwMCBwcyAiKTsKCQl9CgkJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkpIHsKCQkJcHJpbnRmKCIgcnhfYml0X2RxX3dpbmRvdyIpOwoJCQlwcmludGYoIiBzdGVwX3NpemUgcHM9PSIpOwoJCQlwcmludGYoIiUwOGQiLGJkbHJfMTAwc3RlcCk7Ly80ODBwcwoJCQlwcmludGYoIi8xMDAgcHMgIik7CgkJfQoJCXByaW50ZigiZGRyIGNsayBmcmVxdWVuY3kgOiAiKTsKCQlwcmludGYoIiUwOGQiLChnbG9iYWxfZGRyX2NsaykpOwoJCXByaW50ZigiTWh6ICIpOwoJCXByaW50ZihzdHJpbmdfcHJpbnRfZmxhZyk7CgkJcHJpbnRmKCJpbmRleCAgICBvcmcgICAgICBtaW4gICAgICBtYXggICAgICBsZWZ0ICAgICByaWdodCAgICBkZWMgdnJlZl9yYW5nZSB2cmVmX2NvdW50Iik7CgkJcHJpbnRmKHN0cmluZ19wcmludF9mbGFnKTsKCgkJY2hhciBkZWxheV9sZWZ0X21hcmdpbj0wOwoJCWNoYXIgZGVsYXlfcmlnaHRfbWFyZ2luPTA7CgkJaWYgKGFsbF90b2dodGVyX2VuYWJsZSA9PSAxKQoJCXsKCQkJbmliYmxlX21heD0xOwoJCX0KCQlmb3IgKCBuaWJibGVfc3RlcD0wO25pYmJsZV9zdGVwPG5pYmJsZV9tYXg7bmliYmxlX3N0ZXArKykKCQl7CgkJCS8vc2VyaWFsX3B1dF9kZWNfb3V0X2FsaWduKGRlbGF5X21hcnRpeFtjb3VudF0uYWRkX2luZGV4LDgpOwoJCQlwcmludGYoIiUwOGQiLG5pYmJsZV9zdGVwKTsKCQkJcHJpbnRmKCIgIik7CgkJCXByaW50ZigiJTA4ZCIsMCk7CgkJCS8vc2VyaWFsX3B1dHMoIiAiKTsKCQkJLy9pZiAoKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKSApCgkJCXsKCQkJCXByaW50ZigiICIpOwoJCQkJcHJpbnRmKCIlMDhkIiwwLy9udW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVQrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIK0xDRF9CRExSX01JTl0KCQkJCQkpOwoJCQl9CgkJCXsKCQkJCXByaW50ZigiICIpOwoJCQkJcHJpbnRmKCIlMDhkIiwwLy9udW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVQrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIK0xDRF9CRExSX01BWF0KCQkJCQkpOwoJCQl9CgoJCQkvLwlkZWxheV9sZWZ0X21hcmdpbj0oKG51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVCtuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEgrTENEX0JETFJfT1JHXT5udW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVQrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIK0xDRF9CRExSX01JTl0pPwoJCQkvLwkJKG51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVCtuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEgrTENEX0JETFJfT1JHXS1udW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVQrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIK0xDRF9CRExSX01JTl0pOjApOwoJCQkvLwlkZWxheV9yaWdodF9tYXJnaW49KChudW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVQrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIK0xDRF9CRExSX01BWF0+bnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSCtMQ0RfQkRMUl9PUkddKT8KCQkJLy8JCShudW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVQrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIK0xDRF9CRExSX01BWF0tbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSCtMQ0RfQkRMUl9PUkddKTowKTsKCQkJZGVsYXlfbGVmdF9tYXJnaW49bnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV07CgkJCWRlbGF5X3JpZ2h0X21hcmdpbj1udW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXTsKCQkJcHJpbnRmKCIgIik7CgkJCXByaW50ZigiJTA4ZCIsZGVsYXlfbGVmdF9tYXJnaW4pOwoKCQkJLy9zZXJpYWxfcHV0X2RlY19vdXRfYWxpZ24oKGRlbGF5X21hcnRpeFtjb3VudF0uZGVsYXlfb3JnPmRlbGF5X21hcnRpeFtjb3VudF0uZGVsYXlfbWluKT8oZGVsYXlfbWFydGl4W2NvdW50XS5kZWxheV9vcmctZGVsYXlfbWFydGl4W2NvdW50XS5kZWxheV9taW4pOjAsOCk7CgkJCXByaW50ZigiICIpOwoJCQlwcmludGYoIiUwOGQiLGRlbGF5X3JpZ2h0X21hcmdpbik7CgkJCS8vc2VyaWFsX3B1dF9kZWNfb3V0X2FsaWduKChkZWxheV9tYXJ0aXhbY291bnRdLmRlbGF5X21heD5kZWxheV9tYXJ0aXhbY291bnRdLmRlbGF5X29yZyk/KGRlbGF5X21hcnRpeFtjb3VudF0uZGVsYXlfbWF4LWRlbGF5X21hcnRpeFtjb3VudF0uZGVsYXlfb3JnKTowLDgpOwoJCQlwcmludGYoIiAgICAgIik7CgkJCXByaW50ZigiJTA4ZCIsMCk7CgkJCXByaW50ZigiICAgIik7CgkJCXByaW50ZigiJTA4ZCIsMCk7CgkJCXByaW50ZigiICAgMmQtZXllIik7IC8vcF9kZXYtPmN1cl90eXBlCgkJCXByaW50ZigiIGRyYW10eXBlICIpOwoJCQlwcmludGYoIiUwOGQiLDApOwoJCQlwcmludGYoIiAiKTsKCQkJcHJpbnRmKCIlMDhkIiwoZ2xvYmFsX2Rkcl9jbGspKTsKCQkJcHJpbnRmKCIgTSBiZGwgIik7CgkJCXByaW50ZigiJTA4ZCIsYmRscl8xMDBzdGVwKTsvLzQ4MHBzCgkJCXByaW50ZigiIC8xMDAgcHMgIik7CgkJCXByaW50ZigiMS8zMnN0ZXA9PSAiKTsKCQkJcHJpbnRmKCIlMDhkIix1aV8xXzMyXzEwMHN0ZXApOwoJCQlwcmludGYoIiAvMTAwIHBzICIpOwoJCQkvL3NlcmlhbF9wdXRzKCJiaXRfaW5pdF92YWx1ZSAiKTsKCQkJLy9zZXJpYWxfcHV0X2RlY19vdXRfYWxpZ24oKHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9yZWFkX3Blcl9iaXRfaW5pdF92YWx1ZSksNCk7CgkJCS8vaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKXsKCQkJLy9zZXJpYWxfcHV0cygidHhkcXNkbHlfc2Vjb25kX3R1bmVfbWluX3ZhbHVlICIpOwoJCQkvL3NlcmlhbF9wdXRfZGVjX291dF9hbGlnbih0eGRxc2RseV9zZWNvbmRfdHVuZV92YWx1ZVtjb3VudF0sNCk7CgkJCQkvL30KCQkJcHJpbnRmKHN0cmluZ19wcmludF9mbGFnKTsKCQkJLy9zZXJpYWxfcHV0cygiXG4iKTsKCQl9Cgl9Cn0KfQp9CgoJaWYgKGNvbmZpZ19yZWdpc3RlciA9PSAxKQoJewoJCWlmIChudW1fYXJyeVtURVNUX0FSR18yX1NURVBdID09IDApCgkJewoJCQludW1fYXJyeVtURVNUX0FSR18yX1NURVBdPTE7CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18yX1NURVAsCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pOwoJCX0KCX0KCgkJaWYgKChlbmFibGVfa2VybmVsX3Rlc3QpICYmIChudW1fYXJyeVtURVNUX0FSR18yX1NURVBdPjEpKQoJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCXJldHVybiByZWdfdmFsdWU7Cn0KLy9vdXlhbmcKCi8vI2RlZmluZSBkd2NfZGRycGh5X2FwYl93cihhZGRyLCBkYXQpICAgKih2b2xhdGlsZSB1aW50MTZfdCAqKShpbnRfY29udnRlcl9wKCgoYWRkcikgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpPSgodWludDE2X3QpZGF0KQovLyNkZWZpbmUgZHdjX2RkcnBoeV9hcGJfcmQoYWRkcikgICAqKHZvbGF0aWxlIHVpbnQxNl90ICopKGludF9jb252dGVyX3AoKChhZGRyKSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSkKCi8vI2RlZmluZSBkd2NfZGRycGh5X2FwYl93cihhZGRyLCBkYXQpICAgKih2b2xhdGlsZSB1aW50MTZfdCAqKShpbnRfY29udnRlcl9wKCgoYWRkcikgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpPSgodWludDE2X3QpZGF0KQovLyNkZWZpbmUgZHdjX2RkcnBoeV9hcGJfcmQoYWRkcikgICAqKHZvbGF0aWxlIHVpbnQxNl90ICopKGludF9jb252dGVyX3AoKChhZGRyKSA8PCAxKSsocF9kZHJfYmFzZS0+ZGRyX3BoeV9iYXNlX2FkZHJlc3MpKSkKI2RlZmluZSBBQ1hfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAoKLy9kd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgyPDwxNil8KDA8PDEyKXwoMHhiMCksMCk7Ci8vZHdjX2RkcnBoeV9hcGJfd3IoMHhkMDAwMCwwKTsKLy9kd2NfZGRycGh5X2FwYl93cigweGQwMDAwLDEpOwoKLy8qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSk7Ci8vZHdjX2RkcnBoeV9hcGJfd3IoKHBzPDwyMCl8KDA8PDE2KXwoaW5zdGFuY2VfbnVtPDwxMil8KDB4ODApLCk7CgovL2Rkcl90ZXN0X2FjeF9nMTJhIGEgbGVuZ3RoIHN0ZXAgdGVzdF9tb2RlIEFDeAovL2Rkcl90ZXN0X2FjeF9nMTJhICBhICAgICAgIDB4ODAwMDAwMCAgMSAgICAgICAgICAwICAgICAgICAgMHgxCi8vYXJndlswXSAgICAgICAgICAgYXJndlsxXSAgYXJndlsyXSAgICBhcmd2WzNdICAgIGFyZ3ZbNF0gICBhcmd2WzVdCi8vYXJndlsxXSxhCi8vYXJndlsyXSx0ZXN0IGxlbmd0aAovL2FyZ3ZbM10sdGVzdCBzdGVwCi8vYXJndls0XSx0ZXN0X21vZGUsZGlyZWN0aW9uLDAsdXA7ICAgIDEsZG93bjsgICAgMixkb3duIGZpcnN0LHVwIGZvbGxvdzsKLy9hcmd2WzVdLEFDeDswLUFDMCwxLUFDMSwyLUFDMi4uLiw5LUFDOQoKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKI2RlZmluZSAgRzEyX0RBVEFfUkVBRF9PRkZTRVRfTUFYICAgKDBYM0YpCiNkZWZpbmUgIEcxMl9EQVRBX1dSSVRFX09GRlNFVF9NQVggICAoMFgzRis3KjMyKQoKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZIDEKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkgMgojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSAgMwojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZICA0CiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkgIDUKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhFTkRMWSAgNgoKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfRUVfVk9MVEFHRSAgMHgxMQojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9TT0NfVlJFRiAgMHgxMgojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9EUkFNX1ZSRUYgICAgMHgxMwoKdWludDMyX3QgIGRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChjaGFyIHRlc3RfaW5kZXgsdWludDMyX3QgdmFsdWUpCnsKCS8vI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZIDEKCS8vI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkgMgoJLy8jZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSAgMwoJLy8jZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZICA0CgkvLyNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkgIDUKCXVpbnQzMl90IHJlc3VsdD0wOwoJLyoKCSAgIGlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpIHsKCSAgIHJlc3VsdD0zMiooKCh2YWx1ZT4+NikmMSkrKCh2YWx1ZT4+NSkmMSkpK3ZhbHVlJjB4MWY7CgkgICB9CgkgICBpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpIHsKCSAgIHJlc3VsdD0zMiooKCh2YWx1ZT4+NikmMHhmKSsoKHZhbHVlPj41KSYxKSkrdmFsdWUmMHgxZjsKCSAgIH0KCSAgIGlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSkgewoJICAgcmVzdWx0PTMyKigoKHZhbHVlPj42KSYweGYpKygodmFsdWU+PjUpJjEpKSt2YWx1ZSYweDFmOwoJICAgfQoJICAgKi8KI2lmIDAKCWlmICgodGVzdF9pbmRleCA8PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkgKSB7CgkJcmVzdWx0PSgzMiooKCh2YWx1ZT4+NikmMHhmKSsoKHZhbHVlPj41KSYxKSkrKHZhbHVlJjB4MWYpKTsKCX0KCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkgewoJCXJlc3VsdD0oMzIqKCgodmFsdWU+PjYpJjB4ZikrKCgodmFsdWU+PjUpJjEpKjEpKSsodmFsdWUmMHgxZikpOyAvL2JpdCA1IGNoYW5nZSB0byAxIFVJIDIwMTgwNzExCgkJLy9yZXN1bHQ9KDMyKigoKCh2YWx1ZT4+NSkmMSkqMSkpKyh2YWx1ZSYweDFmKSk7IC8vYml0IDUgY2hhbmdlIHRvIDEgVUkgMjAxODA3MTEKCX0KCglpZiAoKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkpKSB7CgkJcmVzdWx0PSgzMiooKCh2YWx1ZT4+NikmMHgxZikrKCgodmFsdWU+PjUpJjEpKjEpKSsodmFsdWUmMHgxZikpOwoJfQoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkpIHsKCQlyZXN1bHQ9dmFsdWUmMHgzZjsKCX0KCiNlbHNlCglpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKSB7CgkJcmVzdWx0PSgzMiooKCh2YWx1ZT4+NikmMSkrKCh2YWx1ZT4+NSkmMSkpKSsodmFsdWUmMHgxZik7Cgl9CgkvL3VzZSBmb3IgdHhkcWRseSByZWdpc3RlciAsYmVjYXVzZSBvZiB0aGlzIHJlZ2lzdGVyIGJpdCA1IGlzIG5vIHVzZSBqaWF4aW5nIDIwMTgwODE0CgkJZWxzZQlpZiggKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpfHwodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpKSAgewoJCXJlc3VsdD0oMzIqKCgodmFsdWU+PjYpJjcpKSkrKHZhbHVlJjB4M2YpOwoJfQoJZWxzZSAgLy9vdGhlciByZWdpc3RlciBiaXQ1IGlzIGVmZmVjdCAsYnV0IGNhbiBub3QgbW9kaWZ5IGNvYXJzZSBkZWxheSB3aHkgID8gIGppYXhpbmcgMjAxODA4MTQKCQlyZXN1bHQ9dmFsdWUmMHgzZjsKI2VuZGlmCglpZiAodGVzdF9pbmRleCA+PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfRUVfVk9MVEFHRSkgewoJCXJlc3VsdD12YWx1ZTsKCX0KCXJldHVybiByZXN1bHQ7Cn0KCnVpbnQzMl90IGRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcoY2hhciB0ZXN0X2luZGV4LHVpbnQzMl90IHZhbHVlICkKewoJLy8jZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkKCS8vI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkgMgoJLy8jZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSAgMwoJLy8jZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZICA0CgkvLyNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkgIDUKCXVpbnQzMl90IHJlc3VsdD0wOwoJaWYgKCh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpICkgewoJCWlmICh2YWx1ZTw2NCkgewoJCQlyZXN1bHQ9KCh2YWx1ZS8zMik8PDYpK3ZhbHVlJTMyOwoJCX0KCQllbHNlIHsKCQkJcmVzdWx0PSgzPDw1KSsodmFsdWUlMzIpOwoJCX0KCX0KCS8qCgkgICBpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpIHsKCSAgIHJlc3VsdD0oKHZhbHVlLzMyKTw8NikrdmFsdWUlMzI7CgkgICB9CgkgICBpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpIHsKCSAgIHJlc3VsdD0oKHZhbHVlLzMyKTw8NikrdmFsdWUlMzI7CgkgICB9CgkgICAqLwoJICAgZWxzZSBpZigodGVzdF9pbmRleD09RE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpCgkJCSAgIHx8KHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSkKCQkJICAgfHwodGVzdF9pbmRleD09RE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkpKSB7CgkJICAgLy9yZXN1bHQ9KCh2YWx1ZS8zMik8PDYpK3ZhbHVlJTY0OwoJCSAgIHJlc3VsdD12YWx1ZSU2NDsKCQkJaWYgKCh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKSB8fCAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhFTkRMWSkpIHsgIC8vdXNlIGZvciB0eGRxZGx5IHJlZ2lzdGVyICxiZWNhdXNlIG9mIHRoaXMgcmVnaXN0ZXIgYml0IDUgaXMgbm8gdXNlIGppYXhpbmcgMjAxODA4MTQKCQkJICAgcmVzdWx0PSgodmFsdWUvMzIpPDw2KSt2YWx1ZSUzMjsKCQkgICB9CgkgICB9CgkgICBlbHNlIGlmKHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKSB7CgkJICAgcmVzdWx0PXZhbHVlJjB4M2Y7CgkgICB9CgkgICBlbHNlIGlmKHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkgewojaWYgMQoJCSAgIHJlc3VsdD0oKHZhbHVlLzMyKTw8NikrdmFsdWUlMzI7CgkJLyoKCQkgICBpZiAoZW5hYmxlX2JpdDUpCgkJICAgewoJCQkgICBpZiAoKHJlc3VsdD4+NikmMSkKCQkJICAge3Jlc3VsdD0ocmVzdWx0JjB4ZmZiZil8KDE8PDUpOwoJCQkgICB9CgkJICAgfQoJCSovCiNlbHNlCgkJICAgcmVzdWx0PXZhbHVlJTY0OwojZW5kaWYKCSAgIH0KCSAgIGVsc2UgaWYodGVzdF9pbmRleD5ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkgewoJCSAgIHJlc3VsdD12YWx1ZTsKCSAgIH0KCgkgICByZXR1cm4gcmVzdWx0Owp9Cgp1bnNpZ25lZCBpbnQgZG9fZGRyX2cxMl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKHVuc2lnbmVkIGludCByYW5rX2luZGV4LHVuc2lnbmVkIGludCBhZGRfaW5kZXgsdW5zaWduZWQgaW50IGxjZGxyX3ZhbHVlLHVuc2lnbmVkIGludCByZWFkX3dyaXRlX2ZsYWcgKQp7Cglkd2NfZGRycGh5X2FwYl93cigweGQwMDAwLDApOy8vbXcgZmUxYTAwMDAgIDAKCS8vICByZWdfYmFzZV9hZGo9KHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKTsKCS8vIHJlZ19hZGQ9KCgoMDw8MjApfCgwPDwxNil8KHRlc3RfQUN4PDwxMil8KDB4ODApKTw8MSkgKyByZWdfYmFzZV9hZGo7CglpZiAocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfUkVBRCkKCXsKCQlsY2Rscl92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgwPDwxNil8KGFkZF9pbmRleDw8MTIpfCgweDgwKSk7Cgl9CglpZiAocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfV1JJVEUpCgl7CgkJZHdjX2RkcnBoeV9hcGJfd3IoKCgwPDwyMCl8KDA8PDE2KXwoYWRkX2luZGV4PDwxMil8KDB4ODApKSwgbGNkbHJfdmFsdWUpOwoJfQoKCXByaW50ZigicmFua19pbmRleCAlZCAgIGFkZF9pbmRleCAlZCAgbGNkbHI9PSAlZCBcbiIsIHJhbmtfaW5kZXgsYWRkX2luZGV4LGxjZGxyX3ZhbHVlKTsKCXJldHVybiBsY2Rscl92YWx1ZTsKfQoKdm9pZCBkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19kcShjaGFyIG92ZXJfcmlkZV9pbmRleCx1aW50MzJfdCBvdmVyX3JpZGVfc3ViX2luZGV4LHVpbnQzMl90IG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSwKCXVpbnQzMl90IHN0ZXBfdmFsdWUpCnsKCXVpbnQzMl90IGRlbGF5X29sZF92YWx1ZT0wOwoJdWludDMyX3QgZGVsYXlfcmVnX3ZhbHVlPTA7CgoJdWludDY0X3QgcmVnX2FkZD0wOwoJaWYgKCFvdmVyX3JpZGVfaW5kZXgpCgkJcmV0dXJuOwoKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHhjMCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKTsKCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlID09IDApCgkJewoJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK3N0ZXBfdmFsdWU7CgkJCWlmIChkZWxheV9yZWdfdmFsdWU+MjU1KQoJCQkJZGVsYXlfcmVnX3ZhbHVlPTI1NTsKCQl9CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSAhPSAwKQoJCXsKCQkJaWYgKGRlbGF5X3JlZ192YWx1ZT5zdGVwX3ZhbHVlKQoJCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZS1zdGVwX3ZhbHVlOwoJCQllbHNlCgkJCQlkZWxheV9yZWdfdmFsdWU9MDsKCQl9CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCQkvLwlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkKzQsZGVsYXlfcmVnX3ZhbHVlKTsKCX0KCglwcmludGYoInJlZ19hZGQgJTA4eCBvbGRfdmFsdWUgJTA4eCB1cGRhdGVfdG8gJTA4eCBkZWMgJWQgdG8gJWQgXG4iLCgodW5zaWduZWQgaW50KSgoKHJlZ19hZGQpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKSwKCQlkZWxheV9vbGRfdmFsdWUsZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCksZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKSwKCQkodW5zaWduZWQgaW50KWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpKSk7Cn0KCnZvaWQgZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlKGNoYXIgb3Zlcl9yaWRlX2luZGV4LHVpbnQzMl90IG92ZXJfcmlkZV9zdWJfaW5kZXgsdWludDMyX3Qgb3Zlcl9yaWRlX3ZhbHVlKQp7Cgl1aW50MzJfdCBkZWxheV9vbGRfdmFsdWU9MDsKCXVpbnQzMl90IGRlbGF5X3JlZ192YWx1ZT0wOwoJdWludDY0X3QgcmVnX2FkZD0wOwoJLy8JaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKQoJLy9wX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWw9MDsKCS8vc2VyaWFsX3B1dHMoIlxuc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2JlZm9yZV9hZnRlcl90cmFpbmluZ19zZXR0aW5nPT0iKTsKCS8vc2VyaWFsX3B1dF9kZWMocF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfYmVmb3JlX2FmdGVyX3RyYWluaW5nX3NldHRpbmcpOwoJLy9zZXJpYWxfcHV0cygiXG4iKTsKCglpZiAoIW92ZXJfcmlkZV9pbmRleCkgewoJCXJldHVybjsKCX0KCS8vZGRyX2RtY191cGRhdGVfZGVsYXlfcmVnaXN0ZXJfYmVmb3JlKCk7CgkvL2NoYXIgZW5hYmxlX2JpdDU9MDsKCS8vCWlmICgocF9kZXYtPnBfZGRycy0+RHJhbVR5cGUgPT0gQ09ORklHX0REUl9UWVBFX0xQRERSNCkgJiYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpKQoJLy8JCXtlbmFibGVfYml0NT0xO30KCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgb3Zlcl9yaWRlX3ZhbHVlKTsKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDA8PDE2KXwob3Zlcl9yaWRlX3N1Yl9pbmRleDw8MTIpfCgweDgwKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCX0KCglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPj4xKTw8MTIpfCgweGQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKygob3Zlcl9yaWRlX3N1Yl9pbmRleCUyKTw8OCkpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU0KTw8MTIpfCgweGQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSxkZWxheV9yZWdfdmFsdWUpOwoJCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHgxZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLGRlbGF5X3JlZ192YWx1ZSk7CgoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCQkvLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4MWQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCgkJLy8Je2VuYWJsZV9iaXQ1PShkZWxheV9vbGRfdmFsdWU+PjUpJjE7fQoJCS8vZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBvdmVyX3JpZGVfdmFsdWUsZW5hYmxlX2JpdDUpOwoKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk+PjEpPDwxMil8KDB4OGMrKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkrKChvdmVyX3JpZGVfc3ViX2luZGV4JTIpPDw4KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KT4+MSk8PDEyKXwoMHg4Yysob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSsoKG92ZXJfcmlkZV9zdWJfaW5kZXglMik8PDgpKSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQrNCxkZWxheV9yZWdfdmFsdWUpOwoJCS8vZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU0KTw8MTIpfCgweDE4Yysob3Zlcl9yaWRlX3N1Yl9pbmRleC80KSksKGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpLXBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfcGh5X3JlYWRfZHFzX25pYmJsZV9vZmZzZXQpOwoJCS8vZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk+PjEpPDwxMil8KDB4OTArKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkrKChvdmVyX3JpZGVfc3ViX2luZGV4JTIpPDw4KSksKGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpKTsKCQkvL2R3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHgxOTArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLChkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKS1wX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX3BoeV9yZWFkX2Rxc19uaWJibGVfb2Zmc2V0KTsKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHhjMCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQkvL2R3Y19kZHJwaHlfYXBiX3dyKCgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHhjMCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpLGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHg2OCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7Cgl9CgoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhFTkRMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk8PDEyKXwoMHg4MCsob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7CgkJLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU0KTw8MTIpfCgweDE4MCsob3Zlcl9yaWRlX3N1Yl9pbmRleC80KSksZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7Cgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9TT0NfVlJFRikgewoJCS8vCWRlbGF5X29sZF92YWx1ZT0gaW5pdF9zb2NfdnJlZihwX2Rldi0+Y3VyX3R5cGUgICwob3Zlcl9yaWRlX3ZhbHVlPj44KSYweGZmLCBvdmVyX3JpZGVfdmFsdWUsIG92ZXJfcmlkZV9zdWJfaW5kZXggLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJLy8Jc2V0X3NvY192cmVmKCBwX2Rldi0+Y3VyX3R5cGUgLCAgKG92ZXJfcmlkZV92YWx1ZT4+OCkmMHhmZiwgb3Zlcl9yaWRlX3ZhbHVlLCBvdmVyX3JpZGVfc3ViX2luZGV4ICk7CgkJZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNiklOSk8PDgpfCgweDQwKSxvdmVyX3JpZGVfdmFsdWUpOwoJfQoKCXByaW50ZigicmVnX2FkZCAlMDh4IG9sZF92YWx1ZSAlMDh4IHVwZGF0ZV90byAlMDh4IGRlYyAlZCB0byAlZCBcbiIsKCh1bnNpZ25lZCBpbnQpKCgocmVnX2FkZCkgPDwgMSkrKHBfZGRyX2Jhc2UtPmRkcl9waHlfYmFzZV9hZGRyZXNzKSkpLAoJCQlkZWxheV9vbGRfdmFsdWUsZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCksZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKSwKCQkJKHVuc2lnbmVkIGludClkZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpKTsKfQoKdm9pZCBkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIoY2hhciBvdmVyX3JpZGVfaW5kZXgsdWludDMyX3Qgb3Zlcl9yaWRlX3N1Yl9pbmRleCx1aW50MzJfdCBvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsCgl1aW50MzJfdCBzdGVwX3ZhbHVlKQp7Cgl1aW50MzJfdCBkZWxheV9vbGRfdmFsdWU9MDsKCXVpbnQzMl90IGRlbGF5X3JlZ192YWx1ZT0wOwoKCXVpbnQ2NF90IHJlZ19hZGQ9MDsKCWlmICghb3Zlcl9yaWRlX2luZGV4KQoJCXJldHVybjsKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgewoKCQlyZWdfYWRkPSgoMDw8MjApfCgwPDwxNil8KG92ZXJfcmlkZV9zdWJfaW5kZXg8PDEyKXwoMHg4MCkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQkvL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgb3Zlcl9yaWRlX3ZhbHVlKTsKCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKTsKCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlID09IDApCgkJewoJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK3N0ZXBfdmFsdWU7CgkJCWlmIChkZWxheV9yZWdfdmFsdWU+OTUpCgkJCWRlbGF5X3JlZ192YWx1ZT05NTsKCQl9CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSAhPSAwKQoJCXsKCQkJaWYgKGRlbGF5X3JlZ192YWx1ZSA+PSBzdGVwX3ZhbHVlKQoJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLXN0ZXBfdmFsdWU7CgkJCWVsc2UKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCX0KCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IoKHJlZ19hZGQpLGRlbGF5X3JlZ192YWx1ZSk7Cgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPj4xKTw8MTIpfCgweGQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKygob3Zlcl9yaWRlX3N1Yl9pbmRleCUyKTw8OCkpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkvLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4ZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLGRlbGF5X3JlZ192YWx1ZSk7CgkvLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4MWQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSxkZWxheV9yZWdfdmFsdWUpOwoKCgkvL3NvbWUgY2FzZSB3aWxsIGhhcHBlbiB0ZHFzIGZyb20gMHgxZiB0byAweDAgb3IgMHgwIHRvIDB4MWYgLHRoZW4gZmFzdCBib290IHdyaXRlIGJhY2sgd2lsbCBoYXBwZW4gZXJyb3IgLGJlY2F1c2UKCS8vIGZhc3QgYm9vdCB3cml0ZSBiYWNrIHdpbGwgcmUtY2FsY3VsYXRlIGNvYXJzZSBVSSx0aGVuIHJlc3VsdCBkcSBwaGFzZSBmYWlsLgoJLyoKCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMCkKCS8vICBpZihvdmVyX3JpZGVfdmFsdWU+ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCxkZWxheV9vbGRfdmFsdWUpKQoJe2R3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsKChkZWxheV9vbGRfdmFsdWUmMHgzZikrc3RlcF92YWx1ZSl8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCWlmICgoKGRlbGF5X29sZF92YWx1ZSYweDNmKStzdGVwX3ZhbHVlKT4weDNmKQoJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCwweDNmfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7Cgl9CgllbHNlCgl7Ly9kd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLCgoZGVsYXlfb2xkX3ZhbHVlJjB4M2YpLXN0ZXBfdmFsdWUpfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CglpZiAoKChkZWxheV9vbGRfdmFsdWUmMHgzZik8c3RlcF92YWx1ZSkpCglkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgllbHNlCglkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLCgoZGVsYXlfb2xkX3ZhbHVlJjB4M2YpLXN0ZXBfdmFsdWUpfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7Cgl9CgoJKi8KCWlmICgob3Zlcl9yaWRlX3N1Yl9pbmRleCUyKSA9PSAwKQoJewoJCWNoYXIJdGVtcF90ZXN0X2luZGV4PURNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZOwoJCWNoYXIgdGVtcF9jb3VudD0wOwoJCS8vCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MCkKCQl7CgkJCWZvciAoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDk7dGVtcF9jb3VudCsrKQoJCQl7CgkJCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19kcSh0ZW1wX3Rlc3RfaW5kZXgKCQkJCSwoKChvdmVyX3JpZGVfc3ViX2luZGV4KT4+MSkqOSt0ZW1wX2NvdW50KSwJCSghb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlKSxzdGVwX3ZhbHVlKSA7CgkJCX0KCQl9Cgl9CgoKCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHgxZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoKCQkvLwl7ZW5hYmxlX2JpdDU9KGRlbGF5X29sZF92YWx1ZT4+NSkmMTt9CgkJLy9kZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIG92ZXJfcmlkZV92YWx1ZSxlbmFibGVfYml0NSk7Cgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KDB4YzArKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPDw4KSsob3Zlcl9yaWRlX3N1Yl9pbmRleC8zNikpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSk7CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAwKQoJCXsKCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZStzdGVwX3ZhbHVlOwoJCQlpZiAoZGVsYXlfcmVnX3ZhbHVlPjI1NSkKCQkJCWRlbGF5X3JlZ192YWx1ZT0yNTU7CgkJfQoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgIT0gMCkKCQl7CgkJCWlmIChkZWxheV9yZWdfdmFsdWU+c3RlcF92YWx1ZSkKCQkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtc3RlcF92YWx1ZTsKCQkJZWxzZQoJCQkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJfQoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7CgkJLy8JZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCs0LGRlbGF5X3JlZ192YWx1ZSk7CgoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KT4+MSk8PDEyKXwoMHg4Yysob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSsoKG92ZXJfcmlkZV9zdWJfaW5kZXglMik8PDgpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMCkKCQl7CgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrc3RlcF92YWx1ZTsKCQkJaWYgKGRlbGF5X3JlZ192YWx1ZT45NSkKCQkJCWRlbGF5X3JlZ192YWx1ZT05NTsKCQl9CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSAhPSAwKQoJCXsKCQkJaWYgKGRlbGF5X3JlZ192YWx1ZT5zdGVwX3ZhbHVlKQoJCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZS1zdGVwX3ZhbHVlOwoJCQllbHNlCgkJCQlkZWxheV9yZWdfdmFsdWU9MDsKCQl9CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkKzQsZGVsYXlfcmVnX3ZhbHVlKTsKCgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KDB4NjgrKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPDw4KSsob3Zlcl9yaWRlX3N1Yl9pbmRleC8zNikpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSk7CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAwKQoJCXsKCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZStzdGVwX3ZhbHVlOwoJCQlpZiAoZGVsYXlfcmVnX3ZhbHVlPjYzKQoJCQkJZGVsYXlfcmVnX3ZhbHVlPTYzOwoJCX0KCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlICE9IDApCgkJewoJCQlpZiAoZGVsYXlfcmVnX3ZhbHVlPnN0ZXBfdmFsdWUpCgkJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLXN0ZXBfdmFsdWU7CgkJCWVsc2UKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCX0KCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhFTkRMWSkgewoJCS8vLyoKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPDwxMil8KDB4ODArKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSk7CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAwKQovLyAgaWYob3Zlcl9yaWRlX3ZhbHVlPmRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsZGVsYXlfb2xkX3ZhbHVlKSkKCXsKCQkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCwoKGRlbGF5X29sZF92YWx1ZSYweDNmKStzdGVwX3ZhbHVlKXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCQlpZiAoKChkZWxheV9vbGRfdmFsdWUmMHgzZikrc3RlcF92YWx1ZSk+MHgzZikKCQkJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsMHgzZnwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJICAgIH0KCQllbHNlCgkJewoJCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLCgoZGVsYXlfb2xkX3ZhbHVlJjB4M2YpLXN0ZXBfdmFsdWUpfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJCWlmICgoKGRlbGF5X29sZF92YWx1ZSYweDNmKTxzdGVwX3ZhbHVlKSkKCQkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCX0KCS8vCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCS8vCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJLy8qLwoJfQoKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGKSB7CgkJLy9kd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KSU5KTw8OCl8KDB4NDApLG92ZXJfcmlkZV92YWx1ZSk7CgkJLy9yZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHg2OCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpJTkpPDw4KXwoMHg0MCkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfb2xkX3ZhbHVlOwoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMCkKCQl7CgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrc3RlcF92YWx1ZTsKCQkJaWYgKGRlbGF5X3JlZ192YWx1ZT4xMjcpCgkJCQlkZWxheV9yZWdfdmFsdWU9MTI3OwoJCX0KCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlICE9IDApCgkJewoJCQlpZiAoZGVsYXlfcmVnX3ZhbHVlID49IHN0ZXBfdmFsdWUpCgkJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLXN0ZXBfdmFsdWU7CgkJCWVsc2UKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCX0KCQkvL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7Cgl9CglwcmludGYoInJlZ19hZGQgJTA4eCBvbGRfdmFsdWUgJTA4eCB1cGRhdGVfdG8gJTA4eCBkZWMgJWQgdG8gJWQgXG4iLCgodW5zaWduZWQgaW50KSgoKHJlZ19hZGQpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKSwKCQlkZWxheV9vbGRfdmFsdWUsZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCksZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKSwKCQkodW5zaWduZWQgaW50KWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpKSk7Cgp9CgoKdm9pZCBkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhcyhjaGFyIG92ZXJfcmlkZV9pbmRleCx1aW50MzJfdCBvdmVyX3JpZGVfc3ViX2luZGV4LHVpbnQzMl90IG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSwKCXVpbnQzMl90IG9mZnNldF92YWx1ZSkKewoJdWludDMyX3QgZGVsYXlfb2xkX3ZhbHVlPTA7CgkvL3VpbnQzMl90IGRlbGF5X3JlZ192YWx1ZT0wOwoJdWludDMyX3QgdGVtcF9jb3VudF8zPTA7CgkvLwl1aW50MzJfdCBkZWxheV9vbGRfdmFsdWVfY2FjbD0wOwoJLy8JdWludDMyX3QgZGVsYXlfcmVnX3ZhbHVlX2NhY2w9MDsKCS8vdWludDMyX3Qgb3Zlcl9yaWRlX3ZhbHVlPTA7CgkvLwlpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpCgkvL3BfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbD0wOwoJLy9zZXJpYWxfcHV0cygiXG5zdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfYmVmb3JlX2FmdGVyX3RyYWluaW5nX3NldHRpbmc9PSIpOwoJLy9zZXJpYWxfcHV0X2RlYyhwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9iZWZvcmVfYWZ0ZXJfdHJhaW5pbmdfc2V0dGluZyk7CgkvL3NlcmlhbF9wdXRzKCJcbiIpOwoJdWludDY0X3QgcmVnX2FkZD0wOwoJaWYgKCFvdmVyX3JpZGVfaW5kZXgpIHsKCQlyZXR1cm47Cgl9CgoJLy9kZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIG92ZXJfcmlkZV92YWx1ZSk7CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgwPDwxNil8KG92ZXJfcmlkZV9zdWJfaW5kZXg8PDEyKXwoMHg4MCkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlmb3IgKCB0ZW1wX2NvdW50XzM9MDt0ZW1wX2NvdW50XzM8b2Zmc2V0X3ZhbHVlO3RlbXBfY291bnRfMysrKQoJCXsKCQkJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfc3ViKG92ZXJfcmlkZV9pbmRleAoJCQksKChvdmVyX3JpZGVfc3ViX2luZGV4KSksCQlvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsMSkgOwoJCX0KCX0KCglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkKCXsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KT4+MSk8PDEyKXwoMHhkMCsob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSsoKG92ZXJfcmlkZV9zdWJfaW5kZXglMik8PDgpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCS8qCgkJLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU0KTw8MTIpfCgweGQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSxkZWxheV9yZWdfdmFsdWUpOwoJCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHgxZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLGRlbGF5X3JlZ192YWx1ZSk7CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSk7CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAwKQoJCXsKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK29mZnNldF92YWx1ZTsKCQlpZiAoZGVsYXlfcmVnX3ZhbHVlPjk2KQoJCWRlbGF5X3JlZ192YWx1ZT05NjsKCQl9CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAxKQoJCXsKCQlpZiAoZGVsYXlfcmVnX3ZhbHVlID49IG9mZnNldF92YWx1ZSkKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLW9mZnNldF92YWx1ZTsKCQllbHNlCgkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJfQoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCS8vZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCs0LGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoKCQkvLwl7ZW5hYmxlX2JpdDU9KGRlbGF5X29sZF92YWx1ZT4+NSkmMTt9CgkJLy9kZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIG92ZXJfcmlkZV92YWx1ZSxlbmFibGVfYml0NSk7CgkJKi8KCQlmb3IgKCB0ZW1wX2NvdW50XzM9MDt0ZW1wX2NvdW50XzM8b2Zmc2V0X3ZhbHVlO3RlbXBfY291bnRfMysrKQoJCXsKCQkJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfc3ViKG92ZXJfcmlkZV9pbmRleAoJCQksKChvdmVyX3JpZGVfc3ViX2luZGV4KSksCQlvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsMSkgOwoJCX0KCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKQoJewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPj4xKTw8MTIpfCgweDhjKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKygob3Zlcl9yaWRlX3N1Yl9pbmRleCUyKTw8OCkpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJLyoKCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKTsKCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlID09IDApCgkJewoJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK29mZnNldF92YWx1ZTsKCQkJaWYgKGRlbGF5X3JlZ192YWx1ZT45NikKCQkJCWRlbGF5X3JlZ192YWx1ZT05NjsKCQl9CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAxKQoJCXsKCQkJCWlmIChkZWxheV9vbGRfdmFsdWUgPj0gb2Zmc2V0X3ZhbHVlKQoJCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZS1vZmZzZXRfdmFsdWU7CgkJCQllbHNlCgkJCQlkZWxheV9yZWdfdmFsdWU9MDsKCQkJfQoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQrNCxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCQkqLwoJCWZvciAoIHRlbXBfY291bnRfMz0wO3RlbXBfY291bnRfMzxvZmZzZXRfdmFsdWU7dGVtcF9jb3VudF8zKyspCgkJewoJCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIob3Zlcl9yaWRlX2luZGV4CgkJCSwoKG92ZXJfcmlkZV9zdWJfaW5kZXgpKSwJCW92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSwxKSA7CgkJfQoKCQkvKgoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPDwxMil8KDB4MThjKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKSk7CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAwKQoJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9vbGRfdmFsdWUrMTsKCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlID09IDEpCgkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X29sZF92YWx1ZS0xOwoJCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk8PDEyKXwoMHgxOGMrKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkpLGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk8PDEyKXwoMHgxOTArKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkpLGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCSovCgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKQoJewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgweGMwKygob3Zlcl9yaWRlX3N1Yl9pbmRleCU5KTw8OCkrKG92ZXJfcmlkZV9zdWJfaW5kZXgvMzYpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCS8qCgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSk7CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAwKQoJCXsKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK29mZnNldF92YWx1ZTsKCQlpZiAoZGVsYXlfcmVnX3ZhbHVlPjk2KQoJCWRlbGF5X3JlZ192YWx1ZT05NjsKCQl9CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAxKQoJCXsKCQlpZiAoZGVsYXlfcmVnX3ZhbHVlID49IG9mZnNldF92YWx1ZSkKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLW9mZnNldF92YWx1ZTsKCQllbHNlCgkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJfQoJCS8vZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsZGVsYXlfb2xkX3ZhbHVlKSsxOwoJCS8vaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0xKQoJCS8vZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsZGVsYXlfb2xkX3ZhbHVlKS0xOwoJCS8vZHdjX2RkcnBoeV9hcGJfd3IoKCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgweGMwKygob3Zlcl9yaWRlX3N1Yl9pbmRleCU5KTw8OCkrKG92ZXJfcmlkZV9zdWJfaW5kZXgvMzYpKSksZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCQkqLwoJCWZvciAoIHRlbXBfY291bnRfMz0wO3RlbXBfY291bnRfMzxvZmZzZXRfdmFsdWU7dGVtcF9jb3VudF8zKyspCgkJewoJCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIob3Zlcl9yaWRlX2luZGV4CgkJCSwoKG92ZXJfcmlkZV9zdWJfaW5kZXgpKSwJCW92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSwxKSA7CgkJfQoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkKCXsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHg2OCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQkvKgoJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9vbGRfdmFsdWU7CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAwKQoJCXsKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK29mZnNldF92YWx1ZTsKCQlpZiAoZGVsYXlfcmVnX3ZhbHVlPjk2KQoJCWRlbGF5X3JlZ192YWx1ZT05NjsKCQl9CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAxKQoJCXsKCQlpZiAoZGVsYXlfcmVnX3ZhbHVlID49IG9mZnNldF92YWx1ZSkKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLW9mZnNldF92YWx1ZTsKCQllbHNlCgkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJfQoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7CgkJKi8KCQlmb3IgKCB0ZW1wX2NvdW50XzM9MDt0ZW1wX2NvdW50XzM8b2Zmc2V0X3ZhbHVlO3RlbXBfY291bnRfMysrKQoJCXsKCQkJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfc3ViKG92ZXJfcmlkZV9pbmRleAoJCQksKChvdmVyX3JpZGVfc3ViX2luZGV4KSksCQlvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsMSkgOwoJCX0KCX0KCglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWEVORExZKQoJewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk8PDEyKXwoMHg4MCsob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQkvKgoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMCkKCQl7CgkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZStvZmZzZXRfdmFsdWU7CgkJaWYgKGRlbGF5X3JlZ192YWx1ZT45NikKCQlkZWxheV9yZWdfdmFsdWU9OTY7CgkJfQoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMSkKCQl7CgkJaWYgKGRlbGF5X3JlZ192YWx1ZSA+PSBvZmZzZXRfdmFsdWUpCgkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZS1vZmZzZXRfdmFsdWU7CgkJZWxzZQoJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCX0KCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCQkqLwoJCWZvciAoIHRlbXBfY291bnRfMz0wO3RlbXBfY291bnRfMzxvZmZzZXRfdmFsdWU7dGVtcF9jb3VudF8zKyspCgkJewoJCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIob3Zlcl9yaWRlX2luZGV4CgkJCSwoKG92ZXJfcmlkZV9zdWJfaW5kZXgpKSwJCW92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSwxKSA7CgkJfQoJfQoKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGKQoJewoJCS8vZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNiklOSk8PDgpfCgweDQwKSxvdmVyX3JpZGVfdmFsdWUpOwoJCS8vcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KDB4NjgrKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPDw4KSsob3Zlcl9yaWRlX3N1Yl9pbmRleC8zNikpKTsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KSU5KTw8OCl8KDB4NDApKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJLyoKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfb2xkX3ZhbHVlOwoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMCkKCQl7CgkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZStvZmZzZXRfdmFsdWU7CgkJaWYgKGRlbGF5X3JlZ192YWx1ZT4xMjcpCgkJZGVsYXlfcmVnX3ZhbHVlPTEyNzsKCQl9CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAxKQoJCXsKCQlpZiAoZGVsYXlfcmVnX3ZhbHVlID49IG9mZnNldF92YWx1ZSkKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLW9mZnNldF92YWx1ZTsKCQllbHNlCgkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJfQoJCS8vZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCQkqLwoJCWZvciAoIHRlbXBfY291bnRfMz0wO3RlbXBfY291bnRfMzxvZmZzZXRfdmFsdWU7dGVtcF9jb3VudF8zKyspCgkJewoJCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIob3Zlcl9yaWRlX2luZGV4CgkJCSwoKG92ZXJfcmlkZV9zdWJfaW5kZXgpKSwJCW92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSwxKSA7CgkJfQoJfQoKCXByaW50Zigib3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0lZFxuIixvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UpOwoKCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMSkKCXsKCQl1bnNpZ25lZCBpbnQgb3JnX2NhY2xfdmFsdWU9KGRlbGF5X29sZF92YWx1ZSkmMHgzZjsKCQlwcmludGYoIm9yZ19jYWNsX3ZhbHVlPT0lZFxuIixvcmdfY2FjbF92YWx1ZSk7CgkJcHJpbnRmKCJvZmZzZXRfdmFsdWU9PSVkXG4iLG9mZnNldF92YWx1ZSk7CgkJaWYgKChvcmdfY2FjbF92YWx1ZSYweDNmKTxvZmZzZXRfdmFsdWUpCgkJewoJCQljaGFyIHRlbXBfdGVzdF9pbmRleF8yPTA7CgkJCWNoYXIgdGVtcF9jb3VudF80PTA7CgkJCWNoYXIgdGVtcF9jb3VudF8yPTA7CgkJCSNpZiAwCgkJCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKQoJCQl7CgkJCQl0ZW1wX3Rlc3RfaW5kZXhfMj1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWTsKCQkJCWlmIChvdmVyX3JpZGVfc3ViX2luZGV4JTIgPT0gMCkKCQkJCXsKCQkJCQlmb3IgKHRlbXBfY291bnRfMj0wO3RlbXBfY291bnRfMjw5O3RlbXBfY291bnRfMisrKQoJCQkJCXsKCQkJCQkJZm9yICh0ZW1wX2NvdW50XzQ9MDt0ZW1wX2NvdW50XzQ8KG9mZnNldF92YWx1ZS1vcmdfY2FjbF92YWx1ZSk7dGVtcF9jb3VudF80KyspCgkJCQkJCXsKCQkJCQkJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1Yih0ZW1wX3Rlc3RfaW5kZXhfMgoJCQkJCQkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleD4+MSkqOSt0ZW1wX2NvdW50XzIpLAkJMCwxKSA7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQkvKgoJCQkJdGVtcF90ZXN0X2luZGV4XzI9RE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZOwoJCQkJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfc3ViKHRlbXBfdGVzdF9pbmRleF8yCgkJCQkJLCgob3Zlcl9yaWRlX2luZGV4JTIpPwoJCQkJCShvdmVyX3JpZGVfaW5kZXgtMSk6CgkJCQkJKG92ZXJfcmlkZV9pbmRleCsxKSksCQkwKSA7CgkJCQkJfQoJCQkJKi8KCQkJfQoJCQkjZW5kaWYKCQkJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpCgkJCXsKCQkJCXRlbXBfdGVzdF9pbmRleF8yPURNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZOwoKCQkJCWZvciAoIHRlbXBfY291bnRfMj0wO3RlbXBfY291bnRfMjw0O3RlbXBfY291bnRfMisrKQoJCQkJCWZvciAodGVtcF9jb3VudF80PTA7dGVtcF9jb3VudF80PCgoKG9mZnNldF92YWx1ZS1vcmdfY2FjbF92YWx1ZSkqdWlfMV8zMl8xMDBzdGVwKS9iZGxyXzEwMHN0ZXApO3RlbXBfY291bnRfNCsrKQoJCQkJCXsKCQkJCQkJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfc3ViKHRlbXBfdGVzdF9pbmRleF8yCgkJCQkJCSwoKG92ZXJfcmlkZV9zdWJfaW5kZXgvMikqOSsKCQkJCQkJdGVtcF9jb3VudF8yKyhvdmVyX3JpZGVfc3ViX2luZGV4JTIpKjQpLAkJMCwxKSA7CgkJCQkJfQoJCQl9CgoJCQlpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKQoJCQl7CgkJCQl0ZW1wX3Rlc3RfaW5kZXhfMj1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWTsKCgkJCQlmb3IgKCB0ZW1wX2NvdW50XzI9MDt0ZW1wX2NvdW50XzI8NDt0ZW1wX2NvdW50XzIrKykKCQkJCXsKCQkJCWlmICh0ZW1wX2NvdW50XzIgPT0gKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpJTQpKQoJCQkJCXRlbXBfY291bnRfMisrOwoJCQkJZm9yICh0ZW1wX2NvdW50XzQ9MDt0ZW1wX2NvdW50XzQ8KG9mZnNldF92YWx1ZS1vcmdfY2FjbF92YWx1ZSk7dGVtcF9jb3VudF80KyspCgkJCQkJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfc3ViKHRlbXBfdGVzdF9pbmRleF8yCgkJCQkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleC85KSo5KwoJCQkJCXRlbXBfY291bnRfMisoKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPjMpPzQ6MCkpLAkJMCwxKSA7CgkJCQl9CgkJCQkvL2JkbHJfMTAwc3RlcCAgKG9yZ19jYWNsX3ZhbHVlPG9mZnNldF92YWx1ZSkKCQkJCWlmICgoKChvZmZzZXRfdmFsdWUtb3JnX2NhY2xfdmFsdWUpKmJkbHJfMTAwc3RlcCkvdWlfMV8zMl8xMDBzdGVwKSkKCQkJCXsKCQkJCQl0ZW1wX3Rlc3RfaW5kZXhfMj1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFk7CgkJCQkJZm9yICh0ZW1wX2NvdW50XzQ9MDt0ZW1wX2NvdW50XzQ8KCgob2Zmc2V0X3ZhbHVlLW9yZ19jYWNsX3ZhbHVlKSpiZGxyXzEwMHN0ZXApL3VpXzFfMzJfMTAwc3RlcCk7dGVtcF9jb3VudF80KyspCgkJCQkJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1Yih0ZW1wX3Rlc3RfaW5kZXhfMgoJCQkJCQksKCgob3Zlcl9yaWRlX3N1Yl9pbmRleC85KTw8MSkrCgkJCQkJCSgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk+Myk/MTowKQoJCQkJCQkpLAkJMCwxKSA7CgkJCQl9CgkJCX0KCQl9Cgl9CglwcmludGYoInJlZ19hZGQgJTA4eCBvbGRfdmFsdWUgJTA4eCB1cGRhdGVfdG8gJTA4eCBkZWMgJWQgdG8gJWQgXG4iLCgodW5zaWduZWQgaW50KSgoKHJlZ19hZGQpIDw8IDEpKyhwX2Rkcl9iYXNlLT5kZHJfcGh5X2Jhc2VfYWRkcmVzcykpKSwKCQlkZWxheV9vbGRfdmFsdWUsZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCksZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKSwKCQlkZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKSkpOwoJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCIgIiwwKTsKCS8vZGRyX2xvZ19zZXJpYWxfcHV0X2hleChkZWxheV9yZWdfdmFsdWUsMTYsMCk7CgkvL2Rkcl9sb2dfc2VyaWFsX3B1dHMoIiAiLDApOwoJLy8JZGRyX2RtY191cGRhdGVfZGVsYXlfcmVnaXN0ZXJfYWZ0ZXIoKTsKfQoKaW50IGRvX2RkcjJwbGxfZzEyX2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCWNoZWNrX2Jhc2VfYWRkcmVzcygpOwoJI2RlZmluZSBETUNfV0lORE9XX0NNRCAgIDIwMTgwMDEwICAvL2cxMl9kMnBsbCAxNTg0IDAgMCAwIDAgMHg4CgkvL2cxMl9kMnBsbCAxNjAwIDUgMCAweDEwIDEKCS8vZzEyX2QycGxsIDE2MDAgMCAwIDAgMCAweDEwIDAgMQoJLy9nMTJfZDJwbGwgMTQwMCAwIDAgMCAwIDAgMCAwIDAgMSAxMjAwICAxOTAwICAgIHRlc3QgZGRyIGZyZXF1ZW5jeQoJLy9nMTJfZDJwbGwgMTQwMCAwIDAgMCAwIDAgMCAwIDAgMyAxMjAwICAxOTAwICAgIHRlc3QgZGRyIGZyZXF1ZW5jeSB3aXRoIEVFIHZvbHRhZ2UKCS8vZzEyX2QycGxsIDE2MDAgMCAwIDAgMCAwIDAgMCAxICAvL2Z1bGwgdGVzdAoJLy9nMTJfZDJwbGwgMTYwMCAwIDAgMCAwIDAgMCAwIDEgIDAgMCAwIDg3MiAvL2Z1bGwgdGVzdCB3aXRoIDg3Mm12IEVFCgkvL2cxMl9kMnBsbCAxNjAwIDAgMCAwIDAgMHgxMCAwIDMgIC8vb25seSB0ZXN0IHNwZWMgc3ViX2luZGV4IGRlbGF5IHdpbmRvdwoJLy9nMTJfZDJwbGwgMTYwMCAgY21kX2luZGV4IGNtZF9wYXJhMSBjbWRfcGFyYTIuLi4uCgkvL2cxMl9kMnBsbCAxNjAwICAweDEgICAgb3ZlcnJpZGVfb3B0aW9uX2FjX2RhdGFfZGVsYXlfdnJlZiAgb3ZlcnJpZGVfaW5kZXggICBvdmVyX3JpZGVfdmFsdWUKCS8vZzEyX2QycGxsIDE2MDAgIDB4MiAgICBvdmVycmlkZSBwbHVzIGZ1bGx0ZXN0CgkvL2cxMl9kMnBsbCAxNjAwICAweDMgICAgb3ZlcnJpZGUgcGx1cy4uLm90aGVyIGZ1bmN0aW9uCgkvL2cxMl9kMnBsbCAxNjAwICAweDExICAgd2luZG93X3Rlc3QKCS8vZzEyX2QycGxsIDE2MDAgIDB4MjEgICBmcmVxdWVuY3kgdGFibGUgdGVzdAoJLy9nMTJfZDJwbGwgMTYwMCAgMHgzMSAgIHN3ZWVwX2VlX3ZvbHRhZ2VfZnJlcXVlbmN5IHRhYmxlIHRlc3QKCgoJLy9nMTJfZDJwbGwgMTgwMCAgMSAgLy9kbWMgZnVsbHRlc3QKCS8vZzEyX2QycGxsIDE4MDAgIDIgMSAxIDEgMDMgIDIgMiAxNDIgIDB4MTEgMCA5NTAgICBvdmVycmlkZSBhZnRlcl90cmFpbmluZ19mbGFnICBvdmVycmlkZV9pbmRleCBzdWJfaW5kZXggdmFsdWUgb3ZlcnJpZGVfaW5kZXgyIHN1Yl9pbmRleDIgdmFsdWUyIG92ZXJyaWRlX2luZGV4MyBzdWJfaW5kZXgzIHZhbHVlMwoJLy9vdmVycmlkZSAxIDIgMyA0IDUgMHgxMQoJLy9nMTJfZDJwbGwgMTgwMCAyIDEgMHgxMiAgMHgxIDB4MGY2ICAgb3ZlcnJpZGVfc29jX3ZyZWYgICBwaW5faW5kZXggICh2cmVmX3JhbmdlPDw4KXwodnJlZl92YWx1ZSkKCgkvL2cxMl9kMnBsbCAxODAwICA0ICA0LzUvYSAgIC8vb3ZlcnJpZGVfdHJhaW5pbmdfaGR0bF9jdGwgdmFsdWUKCgkvL2cxMl9kMnBsbCAxODAwICAweDIxICAgLy9kbWMgc3VzcGVuZCB0ZXN0CgkvL2cxMl9kMnBsbCAxODAwICAweDExICAweDFmIDAgMCAwIDEwICAweDIwIC8vZG1jIHdpbmRvdyB0ZXN0ICBtYXNrMSBtYXNrMiBtYXNrMyBzdWJfaW5kZXggcmVhZF9iaXRfaW5pdF92YWx1ZSh1c2UgZm9yIHZlcnkgaGlnaCBzcGVlZCkKCS8vZzEyX2QycGxsIDE4MDAgIDB4MzIgIDEzMDAgMTUwMCAgNzkwICA4MjAgIC8vZG1jIHN3ZWVwIGZyZXEgYW5kIGVlIHZvbHRhZ2UgdGVzdCAgZnJlcXVlbmN5X21pbiBmcmVxdWVuY3lfbWF4IGVlX3ZvbHRhZ2VfbWluICBlZV92b2x0YWdlX21heAoJLy9nMTJfZDJwbGwgMTgwMCAgMHg0MSAyIDAgMHhmZSAgMCAwICAxIDB4MDEgIDAgIDAgMSAyICAweDEwMDAwMCAvL2RtYyAgZXllX3Rlc3RfZW5hYmxlIGluaXRfcmFuZ2VfMCByYW5nZTAgX3ZhbHVlICB2cmVmX3N0YXJ0IHZyZWZfZW5kCgkvL2luaXRfcmFuZ2VfMiAgcmFuZ2UyX3ZhbHVlIHZyZWZfc3RhcnQyIHZyZWZfZW5kMiBwaW5faW5kZXhfbWluIHBpbl9pbmRleF9tYXggIHRlc3Rfc2l6ZQoKCgkjZGVmaW5lIEcxMl9EMlBMTF9DTURfRE1DX0ZVTExfVEVTVCAgIDB4MDEKCSNkZWZpbmUgRzEyX0QyUExMX0NNRF9PVkVSX1JJREUgICAweDAyCgkjZGVmaW5lIEcxMl9EMlBMTF9DTURfT1ZFUl9SSURFX1BMVVNfRlVMTFRFU1QgIDB4MDMKCSNkZWZpbmUgRzEyX0QyUExMX0NNRF9PVkVSX1JJREVfVFJBSU5JTkdfSERUTCAgMHgwNAoJI2RlZmluZSBHMTJfRDJQTExfQ01EX09GRlNFVCAweDA2CgkjZGVmaW5lIEcxMl9EMlBMTF9DTURfV0lORE9XX1RFU1QgIDB4MTEKCSNkZWZpbmUgRzEyX0QyUExMX0NNRF9XSU5ET1dfVEVTVF9BTkRfU1RJQ0tZX09WRVJSSURFICAweDEyCgkjZGVmaW5lIEcxMl9EMlBMTF9DTURfU1VTUEVORF9URVNUICAweDIxCgkvLyNkZWZpbmUgRzEyX0QyUExMX0NNRF9GUkVRVUVOQ1lfVEFCTEVfVEVTVCAgMHgzMQoJI2RlZmluZSBHMTJfRDJQTExfQ01EX1NXRUVQX0VFX1ZPTFRBR0VfRlJFUVVFTkNZX1RBQkxFX1RFU1QgIDB4MzIKCSNkZWZpbmUgRzEyX0QyUExMX0NNRF9ERFJfRVlFX1RFU1QgIDB4NDEKCSNkZWZpbmUgRzEyX0QyUExMX0NNRF9ERFJfRVlFX1RFU1RfQU5EX1NUSUNLWV9PVkVSUklERSAgICAweDQyCgkjZGVmaW5lIEcxMl9EMlBMTF9DTURfRERSX0VZRV9URVNUX0RBQzEgIDB4NDMKCSNkZWZpbmUgRzEyX0QyUExMX0NNRF9ERFJfRVlFX1RFU1RfQU5EX1NUSUNLWV9PVkVSUklERV9EQUMxICAgIDB4NDQKCgkjZGVmaW5lIEcxMl9EMlBMTF9DTURfRERSX0RWRlNfVEVTVCAgMHg1MQoKCS8vT1ZFUlJJREVfT1BUSU9OCgkjZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkgMQoJI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkgMgoJI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkgIDMKCSNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkgIDQKCSNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkgIDUKCgkjZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9FRV9WT0xUQUdFICAweDExCgoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGludCBwbGw7Cgl1bnNpZ25lZCBpbnQgIHdpbmRvd190ZXN0X3N0aWNrX2NtZF92YWx1ZT0wOwojaWYgMAoJdW5zaWduZWQgaW50IHN0aWNrX3Rlc3RfY21kX2luZGV4PTA7ICAvLyAgMSAgb3ZlcnJpZGVfY21kICAgMgoJdW5zaWduZWQgaW50IHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9lbmFibGU9MDsgLy8gYml0IDAgYWMgIDEgIGRhdGEgZHFzIHdyaXRlICAgMiBkYXRhIGRxcyByZWFkICAzIGRhdGEgYml0IHdyaXRlICAgNCBkYXRhIGJpdCByZWFkICA1Ly9kYXRhIHdyaXRlIHZyZWYgICA2IC8vZGF0YSByZWFkIHZyZWYKCXVuc2lnbmVkIGludCBzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXg9MDsKCXVuc2lnbmVkIGludCBzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfdmFsdWU9MDsKCXVuc2lnbmVkIGludCBzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfYmVmb3JlX2FmdGVyX3RyYWluaW5nX3NldHRpbmc9MDsgIC8vMCAgYmVmb3JlICAsMSBhZnRlciB0cmFpbmluZwoJdW5zaWduZWQgaW50IHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlPTA7Cgl1bnNpZ25lZCBpbnQgc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGVfbWFzaz0wOwoJdW5zaWduZWQgaW50IHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlX3NwZWNfc3ViX2luZGV4PTA7Cgl1bnNpZ25lZCBpbnQgc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9kbWNfZnVsbF90ZXN0X2VuYWJsZT0wOwoJdW5zaWduZWQgaW50IHN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9lZV92b2x0YWdlX2VuYWJsZT0wOwoKCXVuc2lnbmVkIGludCBzdGlja19kbWNfZGRyX2JsMl9zd2VlcF9mcmVxdWVuY3lfbWluPTA7Cgl1bnNpZ25lZCBpbnQgc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X21heD0wOwoJdW5zaWduZWQgaW50IHN0aWNrX2RtY19kZHJfYmwyX2VlX3ZvbHRhZ2U9MDsKI2VuZGlmCgkvL2lmKHdpbmRvd190ZXN0X3N0aWNrX3ZhbHVlKQoJewoJCS8vc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2VuYWJsZT0oKHdpbmRvd190ZXN0X3N0aWNrX3ZhbHVlPj4yNCkmMHhmKTsvL2JpdCAwIGFjICBiaXQxIHdyaXRlIGRxIGJpdCAyIHJlYWQgZHEKCQkvL3N0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9pbmRleD0oKHdpbmRvd190ZXN0X3N0aWNrX3ZhbHVlPj4xNikmMHhmZik7CgkJLy9zdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfdmFsdWU9KHdpbmRvd190ZXN0X3N0aWNrX3ZhbHVlJjB4ZmYpOwoJfQoJLyogbmVlZCBhdCBsZWFzdCB0d28gYXJndW1lbnRzICovCglpZiAocF9kZHJfYmFzZS0+Y2hpcF9pZCA9PSBNRVNPTl9DUFVfTUFKT1JfSURfQzIpCgkJZG9fcmVhZF9jMl9kZHJfYmRscl9zdGVwcygpOwoJaWYgKGFyZ2MgPCAyKQoJCWdvdG8gdXNhZ2U7CgoJcGxsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgJmVuZHAsMCk7CglpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJcHJpbnRmICgiRXJyb3I6IFdyb25nIGZvcm1hdCBwYXJhbWVudCFwbGw9MHglMDh4XG4iLHBsbCk7CgkJcmV0dXJuIDE7Cgl9Cgl1bnNpZ25lZCBpbnQgYXJnY19jb3VudD0xOwoJdW5zaWduZWQgaW50ICBwYXJhX21ldGVyWzMwXT17MCwwLDAsMCwwLCAwLDAsMCwwLDAsIDAsMCwwLDAsMCwgMCwwLDAsMCwwLCAwLDAsMCwwLDAsIDAsMCwwLDAsMCx9OwoJd2hpbGUgKGFyZ2NfY291bnQ8YXJnYykKCXtwYXJhX21ldGVyW2FyZ2NfY291bnQtMV09IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbYXJnY19jb3VudF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbYXJnY19jb3VudF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXBhcmFfbWV0ZXJbYXJnY19jb3VudC0xXSA9IDA7CgkJfQoJCWFyZ2NfY291bnQrKzsKCX0KCgkvL2lmKHN0aWNrX3Rlc3RfY21kX2luZGV4PT0pCiNpZiAwCglpZiAoYXJnYyA+NCkKCXsKCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfZW5hYmxlPTA7CgkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2VuYWJsZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9lbmFibGUgPSAwOwoJCX0KCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXggPSBzaW1wbGVfc3RydG91bChhcmd2WzNdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXggPSAwOwoJCX0KCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfdmFsdWUgPSBzaW1wbGVfc3RydG91bChhcmd2WzRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfdmFsdWUgPSAwOwoJCX0KCX0KCWVsc2UKCXsJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2VuYWJsZT0wOwoJCXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9pbmRleCA9IDA7CgkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX3ZhbHVlID0gMDsKCX0KCglpZiAoYXJnYyA+NSkKCXsKCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfYmVmb3JlX2FmdGVyX3RyYWluaW5nX3NldHRpbmcgPSBzaW1wbGVfc3RydG91bChhcmd2WzVdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfYmVmb3JlX2FmdGVyX3RyYWluaW5nX3NldHRpbmcgPSAwOwoJCX0KCX0KCWlmIChhcmdjID42KQoJewoJCXN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlID0gc2ltcGxlX3N0cnRvdWwoYXJndls2XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGUgPSAwOwoJCX0KCX0KCWlmIChhcmdjID43KQoJewoJCXN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlX21hc2sgPSBzaW1wbGVfc3RydG91bChhcmd2WzddLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZV9tYXNrID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+OCkKCXsKCQlzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZV9zcGVjX3N1Yl9pbmRleCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbOF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbOF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlX3NwZWNfc3ViX2luZGV4ID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+OSkKCXsKCQlzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2RtY19mdWxsX3Rlc3RfZW5hYmxlID0gc2ltcGxlX3N0cnRvdWwoYXJndls5XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls5XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9kbWNfZnVsbF90ZXN0X2VuYWJsZSA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjEwKQoJewoJCXN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9lZV92b2x0YWdlX2VuYWJsZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMTBdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzEwXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X2VlX3ZvbHRhZ2VfZW5hYmxlID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+MTEpCgl7CgkJc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X21pbiA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMTFdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzExXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X21pbiA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjEyKQoJewoJCXN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9tYXggPSBzaW1wbGVfc3RydG91bChhcmd2WzEyXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxMl0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9tYXggPSAwOwoJCX0KCX0KCWlmIChhcmdjID4xMykKCXsKCQlzdGlja19kbWNfZGRyX2JsMl9lZV92b2x0YWdlID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxM10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMTNdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja19kbWNfZGRyX2JsMl9lZV92b2x0YWdlID0gMDsKCQl9Cgl9CgoKI2lmIGRlZmluZWQoQ09ORklHX002VFYpIHx8IGRlZmluZWQoQ09ORklHX002VFZEKQoJd3JfcmVnKCAocF9kZHJfYmFzZS0+cHJlZ19zdGlja3lfcmVnMCksMCB8ICgweDNjIDw8IDI0KSk7CiNlbHNlCgl3cl9yZWcoKHBfZGRyX2Jhc2UtPnByZWdfc3RpY2t5X3JlZzApLDAgfCAoMHhmMTMgPDwgMjApKTsKI2VuZGlmCgoJaWYgKHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlKQoJewoJCXdyX3JlZygocF9kZHJfYmFzZS0+cHJlZ19zdGlja3lfcmVnMCksKChzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZV9zcGVjX3N1Yl9pbmRleCYweGZmKTw8OCl8KHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlJjB4ZmYpIHwgKDB4ZjEyPDwgMjApKTsKCX0KCS8vd3JfcmVnKFBSRUdfU1RJQ0tZX1JFRzEscGxsIHwgKHJkX3JlZyhQUkVHX1NUSUNLWV9SRUcxKSkpOwoJd3JfcmVnKFBSRUdfU1RJQ0tZX1JFRzEscGxsICk7Cgl3cl9yZWcoUFJFR19TVElDS1lfUkVHMiwoc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX3ZhbHVlJjB4ZmZmZikgfCgoc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2luZGV4JjB4ZmYpPDwxNikKCQkJfCgoc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2VuYWJsZSYweDcpPDwyOSkKCQkJfCgoc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2JlZm9yZV9hZnRlcl90cmFpbmluZ19zZXR0aW5nJjB4MSk8PDI4KSk7CglpZiAoc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGVfbWFzaykKCXsKCQl3cl9yZWcoUFJFR19TVElDS1lfUkVHMywoc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGVfbWFzaykpOwoJfQoJLy8JaWYoc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9kbWNfZnVsbF90ZXN0X2VuYWJsZSkKCXsKCQl3cl9yZWcoUFJFR19TVElDS1lfUkVHNCwoc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9kbWNfZnVsbF90ZXN0X2VuYWJsZTw8MzEpfChzdGlja19kbWNfZGRyX2JsMl9zd2VlcF9mcmVxdWVuY3lfZWVfdm9sdGFnZV9lbmFibGU8PDI5KSk7Cgl9CglpZiAoc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X2VlX3ZvbHRhZ2VfZW5hYmxlKQoJewoJCXdyX3JlZyhQUkVHX1NUSUNLWV9SRUc1LChzdGlja19kbWNfZGRyX2JsMl9zd2VlcF9mcmVxdWVuY3lfbWluPDwwKXwoc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X21heDw8MTYpKTsKCX0KCWlmIChzdGlja19kbWNfZGRyX2JsMl9lZV92b2x0YWdlKQoJewoJCXdyX3JlZyhQUkVHX1NUSUNLWV9SRUc2LChzdGlja19kbWNfZGRyX2JsMl9lZV92b2x0YWdlPDwwKSk7Cgl9CiNlbmRpZgoJYXJnY19jb3VudD0yOwoJd2luZG93X3Rlc3Rfc3RpY2tfY21kX3ZhbHVlPXBhcmFfbWV0ZXJbYXJnY19jb3VudC0xXTsKCWlmICgod2luZG93X3Rlc3Rfc3RpY2tfY21kX3ZhbHVlID09IEcxMl9EMlBMTF9DTURfT1ZFUl9SSURFKSB8fCAod2luZG93X3Rlc3Rfc3RpY2tfY21kX3ZhbHVlID09IEcxMl9EMlBMTF9DTURfT1ZFUl9SSURFX1BMVVNfRlVMTFRFU1QpKQoJewoJCXBhcmFfbWV0ZXJbM109KHBhcmFfbWV0ZXJbM108PDI0KXwocGFyYV9tZXRlcls0XTw8MTYpfChwYXJhX21ldGVyWzVdPDwwKTsKCQlwYXJhX21ldGVyWzRdPShwYXJhX21ldGVyWzZdPDwyNCl8KHBhcmFfbWV0ZXJbN108PDE2KXwocGFyYV9tZXRlcls4XTw8MCk7CgkJcGFyYV9tZXRlcls1XT0ocGFyYV9tZXRlcls5XTw8MjQpfChwYXJhX21ldGVyWzEwXTw8MTYpfChwYXJhX21ldGVyWzExXTw8MCk7Cgl9CglpZiAoKHdpbmRvd190ZXN0X3N0aWNrX2NtZF92YWx1ZSA9PSBHMTJfRDJQTExfQ01EX1dJTkRPV19URVNUKSB8fCAod2luZG93X3Rlc3Rfc3RpY2tfY21kX3ZhbHVlID09IEcxMl9EMlBMTF9DTURfV0lORE9XX1RFU1RfQU5EX1NUSUNLWV9PVkVSUklERSkpCgl7CgkJLy9wYXJhX21ldGVyWzhdICBzaXplICAgOSAgc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9ub191c2VfZHFzX2RxX2NvcnJlY3Rpb24gICAxMCBkaXNhYmxlX3NjcmFtYmxlX3VzZV9kZWZpbmVfcGF0dGVybiAgMTEgc3RpY2tfZG1jX3dpbmRvd190ZXN0X2xvb3BfZmxhZyB3aW5kb3cgbG9vcCB0ZXN0CgkJLy8xMiBpZiByZWluaXQgd2hlbiB0ZXN0IGRxICAxMyBwYXNzX3RvX2ZhaWxfZmxhZyAgICAxNCAgdGVzdF9kbWNfb3JfY3B1CgkJcGFyYV9tZXRlcls1XT0ocGFyYV9tZXRlcls5XTw8MjgpfChwYXJhX21ldGVyWzEwXTw8MjQpfChwYXJhX21ldGVyWzExXTw8MjApfChwYXJhX21ldGVyWzEyXTw8MjEpfChwYXJhX21ldGVyWzEzXTw8MjIpfChwYXJhX21ldGVyWzE0XTw8MjUpfChwYXJhX21ldGVyWzVdPDwwKTsKCX0KCWlmICgod2luZG93X3Rlc3Rfc3RpY2tfY21kX3ZhbHVlID49IEcxMl9EMlBMTF9DTURfRERSX0VZRV9URVNUKSYmICh3aW5kb3dfdGVzdF9zdGlja19jbWRfdmFsdWUgPD0gRzEyX0QyUExMX0NNRF9ERFJfRVlFX1RFU1RfQU5EX1NUSUNLWV9PVkVSUklERV9EQUMxKSkKCXsKCQlwYXJhX21ldGVyWzNdPShwYXJhX21ldGVyWzNdPDwwKXwocGFyYV9tZXRlcls0XTw8OCl8KHBhcmFfbWV0ZXJbNV08PDE2KXwocGFyYV9tZXRlcls2XTw8MjQpOwoJCXBhcmFfbWV0ZXJbNF09KHBhcmFfbWV0ZXJbN108PDApfChwYXJhX21ldGVyWzhdPDw4KXwocGFyYV9tZXRlcls5XTw8MTYpfChwYXJhX21ldGVyWzEwXTw8MjQpOwoJCXBhcmFfbWV0ZXJbNV09cGFyYV9tZXRlclsxMV07Ly8ocGFyYV9tZXRlclsxMV08PDApfChwYXJhX21ldGVyWzEyXTw8OCl8KHBhcmFfbWV0ZXJbMTNdPDwxNil8KHBhcmFfbWV0ZXJbMTRdPDwyNCk7CgkJcGFyYV9tZXRlcls2XT1wYXJhX21ldGVyWzEyXTsvL3BhcmFfbWV0ZXJbMTVdOwoJCXBhcmFfbWV0ZXJbN109cGFyYV9tZXRlclsxM107Ly9wYXJhX21ldGVyWzE2XTsKCQlwYXJhX21ldGVyWzhdPXBhcmFfbWV0ZXJbMTRdOy8vcGFyYV9tZXRlclsxN107Cgl9Cgl3cl9yZWcoKHBfZGRyX2Jhc2UtPnByZWdfc3RpY2t5X3JlZzApLChyZF9yZWcoKHBfZGRyX2Jhc2UtPnByZWdfc3RpY2t5X3JlZzApKSYweGZmZmYpIHwgKDB4ZjEzIDw8IDIwKSk7CglhcmdjX2NvdW50PTA7CglwcmludGYoIlxuUF9QUkVHX1NUSUNLWV9SRUcgWzB4JTA4eF0gIFsweCUwOHhdPT1bMHglMDh4XVxuIiwgYXJnY19jb3VudCwoKHBfZGRyX2Jhc2UtPnByZWdfc3RpY2t5X3JlZzApKyhhcmdjX2NvdW50PDwyKSkscmRfcmVnKChwX2Rkcl9iYXNlLT5wcmVnX3N0aWNreV9yZWcwKSsoYXJnY19jb3VudDw8MikpKTsKCWFyZ2NfY291bnQ9MTsKCS8vd2hpbGUoYXJnY19jb3VudDxhcmdjKQoJd2hpbGUgKGFyZ2NfY291bnQ8MTApCgl7CgkJd3JfcmVnKChwX2Rkcl9iYXNlLT5wcmVnX3N0aWNreV9yZWcwKSsoYXJnY19jb3VudDw8MikscGFyYV9tZXRlclthcmdjX2NvdW50LTFdKTsKCQlwcmludGYoIlBfUFJFR19TVElDS1lfUkVHIFsweCUwOHhdICBbMHglMDh4XT09WzB4JTA4eF1cbiIsIGFyZ2NfY291bnQsKChwX2Rkcl9iYXNlLT5wcmVnX3N0aWNreV9yZWcwKSsoYXJnY19jb3VudDw8MikpLHJkX3JlZygocF9kZHJfYmFzZS0+cHJlZ19zdGlja3lfcmVnMCkrKGFyZ2NfY291bnQ8PDIpKSk7CgkJYXJnY19jb3VudCsrOwoJfQoJLyoKCQlwcmludGYoIlBfKHBfZGRyX2Jhc2UtPnByZWdfc3RpY2t5X3JlZzApIFsweCUwOHhdXG4iLCByZF9yZWcoKHBfZGRyX2Jhc2UtPnByZWdfc3RpY2t5X3JlZzApKSk7CgkJcHJpbnRmKCJQXyhwX2Rkcl9iYXNlLT5wcmVnX3N0aWNreV9yZWcwKzQpIFsweCUwOHhdXG4iLCByZF9yZWcoKHBfZGRyX2Jhc2UtPnByZWdfc3RpY2t5X3JlZzArNCkpKTsKCQlwcmludGYoIlBfUFJFR19TVElDS1lfUkVHMiBbMHglMDh4XVxuIiwgcmRfcmVnKFBSRUdfU1RJQ0tZX1JFRzIpKTsKCQlwcmludGYoIlBfUFJFR19TVElDS1lfUkVHMyBbMHglMDh4XVxuIiwgcmRfcmVnKFBSRUdfU1RJQ0tZX1JFRzMpKTsKCQlwcmludGYoIlBfUFJFR19TVElDS1lfUkVHNCBbMHglMDh4XVxuIiwgcmRfcmVnKFBSRUdfU1RJQ0tZX1JFRzQpKTsKCQlwcmludGYoIlBfUFJFR19TVElDS1lfUkVHNSBbMHglMDh4XVxuIiwgcmRfcmVnKFBSRUdfU1RJQ0tZX1JFRzUpKTsKCQlwcmludGYoIlBfUFJFR19TVElDS1lfUkVHNiBbMHglMDh4XVxuIiwgcmRfcmVnKFBSRUdfU1RJQ0tZX1JFRzYpKTsKCQkqLwoJLy9wcmludGYoInJlc2V0Li4uXG4iKTsgLy9yZXNldCB3aWxsIGVudGVyIGJsMiBwYW5pYyBwYXRoCglkY2FjaGVfZGlzYWJsZSgpOwoJaWYgKChwX2Rkcl9iYXNlLT5jaGlwX2lkID09IE1FU09OX0NQVV9NQUpPUl9JRF9BMSkgfHwgKHBfZGRyX2Jhc2UtPmNoaXBfaWQgPT0gTUVTT05fQ1BVX01BSk9SX0lEX0MxKSB8fCAocF9kZHJfYmFzZS0+Y2hpcF9pZCA9PSBNRVNPTl9DUFVfTUFKT1JfSURfQzIpIHx8IChwX2Rkcl9iYXNlLT5jaGlwX2lkID09IE1FU09OX0NQVV9NQUpPUl9JRF9TQzIpKQoJewoJCXByaW50ZigicmVzZXQuLi5cbiIpOwoJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7Cgl9CgllbHNlCgl7Ly9HMTJBL0cxMkIvU00xL1RMMS9UTTIKCQlwcmludGYoInJlYm9vdC4uLlxuIik7IC8vcmVzZXQgd2lsbCBlbnRlciBibDIgcGFuaWMgcGF0aCxzbyBjaGFuZ2UgdG8gInJlYm9vdCIKCQlydW5fY29tbWFuZCgicmVib290IiwwKTsKCQlkZHJfdGVzdF93YXRjaGRvZ19yZXNldF9zeXN0ZW0oKTsKCX0KCglyZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwp9CgoKVV9CT09UX0NNRCgKCWcxMl9kMnBsbCwJMTgsCTEsCWRvX2RkcjJwbGxfZzEyX2NtZCwKCSJnMTJfZDJwbGwgMTMwMCAgMSAweDEwIDAiLAoJImcxMl9kMnBsbCAgY2xrIGRlbGF5X2luZGV4IGRlbGF5X3ZhbHVlIGJlZm9yZV9hZnRlcl90cmFpbmluZ19zZXR0aW5nXG4iCik7CgojZW5kaWYKCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCgppbnQgZG9fZGRyX2cxMl9vdmVycmlkZV9kYXRhKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewpjaGVja19iYXNlX2FkZHJlc3MoKTsKCS8vZGRyX3Rlc3RfY21kIDB4MjUgMSAxICAxMCAxMCAxMCAxMCAxMCAxMCAxMCAxMCAxMCAxMAoKCXByaW50ZigiXDEybm0gcGh5IHJlYWQgd3JpdGUgcmVnaXN0ZXIgc2hvdWxkIGNsb3NkIGFwZCBhbmQgYXNyIGZ1bmNpdG9uXG4iKTsKCXdyaXRlbCgoMCksIHBfZGRyX2Jhc2UtPmRkcl9kbWNfYXBkX2FkZHJlc3MpOwoJd3JpdGVsKCgwKSwgcF9kZHJfYmFzZS0+ZGRyX2RtY19hc3JfYWRkcmVzcyk7CiNkZWZpbmUgIEcxMl9EQVRBX1JFQURfT0ZGU0VUX01BWCAgICgwWDNGKQojZGVmaW5lICBHMTJfREFUQV9XUklURV9PRkZTRVRfTUFYICAgKDBYM0YrNyozMikKCiNpZiAxCgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaT0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoJY2hhciAqZW5kcDsKCS8vcmFua19pbmRleCAgZHFfaW5kZXggIHdyaXRlX3JlYWQgbGVmdC9yaWdodCAgb2Zmc2V0X3ZhbHVlCgl1bnNpZ25lZCBpbnQgdGVzdF9pbmRleD0wOyAvLyAxIGFjICwweDIsIHdyaXRlIGRxcyAsMHg0LHJlYWQgZHFzLDB4OCx3cml0ZSBkcSwweDEwIHJlYWQgZHEKCXVuc2lnbmVkIGludCBkcV9pbmRleD0wOyAgLy8wLTggcmFuazAgbGFuZTAgLHJhbmswIDktMTcgbGFuZTEscmFuazAgMTgtMjYgbGFuZTIsIHJhbmswIDI3LTM1IGxhbmUzLCAgMzYrMC04IHJhbmsxIGxhbmUwICxyYW5rMSAgMzYrOS0xNyBsYW5lMSxyYW5rMSAgMzYrMTgtMjYgbGFuZTIsIHJhbmsxICAzNisyNy0zNSBsYW5lMwoJLy8JdW5zaWduZWQgaW50IHRlc3RfZHFfbWFza18xPTA7IC8vZWFjaCBiaXQgbWFzayBjb3JyZXNzcG9uZCB3aXRoIGRxX2luZGV4CgkvLwl1bnNpZ25lZCBpbnQgdGVzdF9kcV9tYXNrXzI9MDsgLy9lYWNoIGJpdCBtYXNrIGNvcnJlc3Nwb25kIHdpdGggZHFfaW5kZXgKCS8vCXVuc2lnbmVkIGludCB0ZXN0X2RxX21hc2tfMz0wOyAvL2VhY2ggYml0IG1hc2sgY29ycmVzc3BvbmQgd2l0aCBkcV9pbmRleAoJLy91bnNpZ25lZCBpbnQgd3JpdGVfcmVhZF9mbGFnPTA7Ly8gMiB3cml0ZSAsMSByZWFkICNkZWZpbmUgCUREUl9QQVJBTUVURVJfUkVBRAkxICAgICAgI2RlZmluZSAJRERSX1BBUkFNRVRFUl9XUklURQkJMgoJLy8gICAgdW5zaWduZWQgaW50IGxlZnRfcmlnaHRfZmxhZz0wOy8vICAxIGxlZnQgLDIgcmlnaHQgICAjZGVmaW5lICBERFJfUEFSQU1FVEVSX0xFRlQJCTEgICAgICNkZWZpbmUgCUREUl9QQVJBTUVURVJfUklHSFQJCTIKCXVuc2lnbmVkIGludCBvdnJyaWRlX3ZhbHVlPTA7Ly8KCgkvLyAgIHVuc2lnbmVkIGludCBvZmZzZXRfZW5hYmxlPTA7Ly8KCgkvLwkgdW5zaWduZWQgaW50IHRlbXBfdmFsdWU9MDsvLwoJdW5zaWduZWQgaW50IGNvdW50PTA7CgkvLwl1bnNpZ25lZCBpbnQgY291bnQxPTA7CgkvLwl1bnNpZ25lZCBpbnQgY291bnRfbWF4PTA7Cgl1bnNpZ25lZCBpbnQgbGNkbHJfbWF4PTA7CgkvLwl1bnNpZ25lZCBpbnQgcmVnX2FkZD0wOwoJLy8JdW5zaWduZWQgaW50IHJlZ192YWx1ZT0wOwoKCWlmIChhcmdjID09IDEpCgl7CgkJcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoJfQoJZWxzZSBpZiAgKGFyZ2MgPjQpCgl7Ly9vZmZzZXRfZW5hYmxlPTE7CgoJCXsKCQkJY291bnQ9MDsKCQkJdGVzdF9pbmRleD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCXRlc3RfaW5kZXggPSAwOwoJCQl9CgoJCX0KCQl7CgkJCWNvdW50Kys7CgkJCWRxX2luZGV4PSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJZHFfaW5kZXggPSAwOwoJCQl9CgoJCX0KCgoKCQl7CgkJCWNvdW50Kys7CgkJCW92cnJpZGVfdmFsdWU9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbY291bnQrMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQlvdnJyaWRlX3ZhbHVlID0gMDsKCQkJfQoKCQl9CgoKCX0KCWVsc2UgewoJCXJldHVybiAxOwoJfQoJcHJpbnRmKCJsY2Rscl9tYXggJWQsXG4iLGxjZGxyX21heCk7CgkjZGVmaW5lIERNQ19QSFlfUkVUUkFJTklOR19DVFJMICAgICAoIHBfZGRyX2Jhc2UtPmRkcl9kbWNfbHBkZDRfcmV0cmFpbmluZ19hZGRyZXNzKQoJdWludDMyX3QgZG1jX3JldHJhaW5pbmdfY3RybD0wOwoJZG1jX3JldHJhaW5pbmdfY3RybD1yZF9yZWcoRE1DX1BIWV9SRVRSQUlOSU5HX0NUUkwpOwoJd3JfcmVnKERNQ19QSFlfUkVUUkFJTklOR19DVFJMLGRtY19yZXRyYWluaW5nX2N0cmwmKH4oMTw8MzEpKSk7CgoJewoKCgkJewoKCQkJewoJCQkJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlKHRlc3RfaW5kZXgsCgkJCQkJCWRxX2luZGV4LAoJCQkJCQlvdnJyaWRlX3ZhbHVlKTsKCQkJfQoKCQl9Cgl9CgoKI2VuZGlmCgl3cl9yZWcoRE1DX1BIWV9SRVRSQUlOSU5HX0NUUkwsZG1jX3JldHJhaW5pbmdfY3RybCk7CglyZXR1cm4gMTsKfQpVX0JPT1RfQ01EKAoJZGRyX2cxMl9vdmVycmlkZV9kYXRhLAkyMCwJMSwJZG9fZGRyX2cxMl9vdmVycmlkZV9kYXRhLAoJImRkcl9nMTJfb3ZlcnJpZGVfZGF0YSAgMSAwICAwIDAgIDEgMyIsCgkiZGRyX2cxMl9vdmVycmlkZV9kYXRhICB0ZXN0X2luZGV4ICBkcV9pbmRleCBvdnJyaWRlX3ZhbHVlICAgXG4iCik7Cgp2b2lkIGRkcl93aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1Yl9jMihjaGFyIG92ZXJfcmlkZV9pbmRleCx1aW50MzJfdCBvdmVyX3JpZGVfc3ViX2luZGV4LHVpbnQzMl90IG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSx1aW50MzJfdCBzdGVwKSB7Cgl1aW50MzJfdCBkZWxheV9vbGRfdmFsdWU9MDsKCXVpbnQzMl90IGRlbGF5X3JlZ192YWx1ZT0wOwoJdWludDMyX3QgcHM9MDsKCWlmICghb3Zlcl9yaWRlX2luZGV4KSB7CgkJcmV0dXJuOwoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleDwgRE1DX1RFU1RfV0lORE9XX0lOREVYX0VFX1ZPTFRBR0UpCgl7CgkJZGVsYXlfb2xkX3ZhbHVlPWRkcl9waHlfdHJhaW5pbmdfcmVnX3JlYWRfd3JpdGUoZGRyX3NldF90X3Asb3Zlcl9yaWRlX2luZGV4LG92ZXJfcmlkZV9zdWJfaW5kZXgsZGVsYXlfb2xkX3ZhbHVlLFJFR0lTVEVSX1JFQUQscHMpOwoJCS8vZGVsYXlfb2xkX3ZhbHVlPWRkcl9waHlfdHJhaW5pbmdfcmVnX3JlYWRfd3JpdGVfYzIocF9kZXYsb3Zlcl9yaWRlX2luZGV4LG92ZXJfcmlkZV9zdWJfaW5kZXgsZGVsYXlfb2xkX3ZhbHVlLCBSRUdJU1RFUl9SRUFELAoJCS8vCShwX2Rldi0+cF9kZHJfZndfaW50ZXJfbWVzc2FnZS0+cF9kZHJfY29tbW9uX21lc3NhZ2UtPmN1cl9wc3RhdGUpKTsKCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlID09IDApCgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9vbGRfdmFsdWUrc3RlcDsKCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlICE9IDApCgkJewoJCQlpZiAoZGVsYXlfb2xkX3ZhbHVlPnN0ZXApCgkJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfb2xkX3ZhbHVlLXN0ZXA7CgkJCWVsc2UKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCX0KCgkJZGRyX3BoeV90cmFpbmluZ19yZWdfcmVhZF93cml0ZShkZHJfc2V0X3RfcCxvdmVyX3JpZGVfaW5kZXgsb3Zlcl9yaWRlX3N1Yl9pbmRleCxkZWxheV9yZWdfdmFsdWUsIFJFR0lTVEVSX1dSSVRFLAoJCQlwcyk7Cgl9CgkvL2Rkcl9kbWNfdXBkYXRlX2RlbGF5X3JlZ2lzdGVyX2FmdGVyKCk7Cn0KCnZvaWQgZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfYzIoY2hhciBvdmVyX3JpZGVfaW5kZXgsdWludDMyX3Qgb3Zlcl9yaWRlX3N1Yl9pbmRleCx1aW50MzJfdCBvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsCgl1aW50MzJfdCBvZmZzZXRfdmFsdWUpCnsKCS8vdWludDMyX3QgZGVsYXlfb2xkX3ZhbHVlPTA7Cgl1aW50MzJfdCB0ZW1wX2NvdW50XzM9MDsKCS8vdWludDY0X3QgcmVnX2FkZD0wOwoJaWYgKCFvdmVyX3JpZGVfaW5kZXgpIHsKCQlyZXR1cm47Cgl9CgoJLy9kZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIG92ZXJfcmlkZV92YWx1ZSk7CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpIHsKCQlmb3IgKCB0ZW1wX2NvdW50XzM9MDt0ZW1wX2NvdW50XzM8b2Zmc2V0X3ZhbHVlO3RlbXBfY291bnRfMysrKQoJCXsKCQkJZGRyX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfc3ViX2MyKG92ZXJfcmlkZV9pbmRleAoJCQksKChvdmVyX3JpZGVfc3ViX2luZGV4KSksCQlvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsMSkgOwoJCX0KCX0KCglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkKCXsKCgkJZm9yICggdGVtcF9jb3VudF8zPTA7dGVtcF9jb3VudF8zPG9mZnNldF92YWx1ZTt0ZW1wX2NvdW50XzMrKykKCQl7CgkJCWRkcl93aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1Yl9jMihvdmVyX3JpZGVfaW5kZXgKCQkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleCkpLAkJb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLDEpIDsKCQl9Cgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSkKCXsKCgkJZm9yICggdGVtcF9jb3VudF8zPTA7dGVtcF9jb3VudF8zPG9mZnNldF92YWx1ZTt0ZW1wX2NvdW50XzMrKykKCQl7CgkJCWRkcl93aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1Yl9jMihvdmVyX3JpZGVfaW5kZXgKCQkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleCkpLAkJb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLDEpIDsKCQl9CgoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkKCXsKCgkJZm9yICggdGVtcF9jb3VudF8zPTA7dGVtcF9jb3VudF8zPG9mZnNldF92YWx1ZTt0ZW1wX2NvdW50XzMrKykKCQl7CgkJCWRkcl93aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1Yl9jMihvdmVyX3JpZGVfaW5kZXgKCQkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleCkpLAkJb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLDEpIDsKCQl9Cgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKQoJewoJCWZvciAoIHRlbXBfY291bnRfMz0wO3RlbXBfY291bnRfMzxvZmZzZXRfdmFsdWU7dGVtcF9jb3VudF8zKyspCgkJewoJCQlkZHJfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWJfYzIob3Zlcl9yaWRlX2luZGV4CgkJCSwoKG92ZXJfcmlkZV9zdWJfaW5kZXgpKSwJCW92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSwxKSA7CgkJfQoJfQoKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkpCgl7CgkJZm9yICggdGVtcF9jb3VudF8zPTA7dGVtcF9jb3VudF8zPG9mZnNldF92YWx1ZTt0ZW1wX2NvdW50XzMrKykKCQl7CgkJCWRkcl93aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1Yl9jMihvdmVyX3JpZGVfaW5kZXgKCQkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleCkpLAkJb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLDEpIDsKCQl9Cgl9CgoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfU09DX1ZSRUYpCgl7CgkJZm9yICggdGVtcF9jb3VudF8zPTA7dGVtcF9jb3VudF8zPG9mZnNldF92YWx1ZTt0ZW1wX2NvdW50XzMrKykKCQl7CgkJCWRkcl93aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1Yl9jMihvdmVyX3JpZGVfaW5kZXgKCQkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleCkpLAkJb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLDEpIDsKCQl9Cgl9Cn0KCmludCBkb19kZHJfYzJfb2Zmc2V0X2RhdGEoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgljaGVja19iYXNlX2FkZHJlc3MoKTsKCS8vZGRyX2cxMl9vZmZzZXRfZGF0YSAgMSAwICAwIDAgIDEgMwoJI2RlZmluZSBETUNfUEhZX1JFVFJBSU5JTkdfQ1RSTCAgICAgKCBwX2Rkcl9iYXNlLT5kZHJfZG1jX2xwZGQ0X3JldHJhaW5pbmdfYWRkcmVzcykKCXVpbnQzMl90IGRtY19yZXRyYWluaW5nX2N0cmw9MDsKCWRtY19yZXRyYWluaW5nX2N0cmw9cmRfcmVnKERNQ19QSFlfUkVUUkFJTklOR19DVFJMKTsKCXdyX3JlZyhETUNfUEhZX1JFVFJBSU5JTkdfQ1RSTCxkbWNfcmV0cmFpbmluZ19jdHJsJih+KDE8PDMxKSkpOwojZGVmaW5lICBHMTJfREFUQV9SRUFEX09GRlNFVF9NQVggICAoMFgzRikKI2RlZmluZSAgRzEyX0RBVEFfV1JJVEVfT0ZGU0VUX01BWCAgICgwWDNGKzcqMzIpCglwcmludGYoIlwxMm5tIHBoeSByZWFkIHdyaXRlIHJlZ2lzdGVyIHNob3VsZCBjbG9zZCBhcGQgYW5kIGFzciBmdW5jaXRvblxuIik7Cgl3cml0ZWwoKDApLCBwX2Rkcl9iYXNlLT5kZHJfZG1jX2FwZF9hZGRyZXNzKTsKCXdyaXRlbCgoMCksIHBfZGRyX2Jhc2UtPmRkcl9kbWNfYXNyX2FkZHJlc3MpOwojaWYgMQoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJaW50IGk9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCWNoYXIgKmVuZHA7CgkvL3JhbmtfaW5kZXggIGRxX2luZGV4ICB3cml0ZV9yZWFkIGxlZnQvcmlnaHQgIG9mZnNldF92YWx1ZQoJdW5zaWduZWQgaW50IHRlc3RfaW5kZXg9MDsgLy8gMSBhYyAsMHgyLCB3cml0ZSBkcXMgLDB4NCxyZWFkIGRxcywweDgsd3JpdGUgZHEsMHgxMCByZWFkIGRxCgkvL3Vuc2lnbmVkIGludCBkcV9pbmRleD0wOyAgLy8wLTggcmFuazAgbGFuZTAgLHJhbmswIDktMTcgbGFuZTEscmFuazAgMTgtMjYgbGFuZTIsIHJhbmswIDI3LTM1IGxhbmUzLCAgMzYrMC04IHJhbmsxIGxhbmUwICxyYW5rMSAgMzYrOS0xNyBsYW5lMSxyYW5rMSAgMzYrMTgtMjYgbGFuZTIsIHJhbmsxICAzNisyNy0zNSBsYW5lMwoJdW5zaWduZWQgaW50IHRlc3RfZHFfbWFza18xPTA7IC8vZWFjaCBiaXQgbWFzayBjb3JyZXNzcG9uZCB3aXRoIGRxX2luZGV4Cgl1bnNpZ25lZCBpbnQgdGVzdF9kcV9tYXNrXzI9MDsgLy9lYWNoIGJpdCBtYXNrIGNvcnJlc3Nwb25kIHdpdGggZHFfaW5kZXgKCXVuc2lnbmVkIGludCB0ZXN0X2RxX21hc2tfMz0wOyAvL2VhY2ggYml0IG1hc2sgY29ycmVzc3BvbmQgd2l0aCBkcV9pbmRleAoJLy91bnNpZ25lZCBpbnQgd3JpdGVfcmVhZF9mbGFnPTA7Ly8gMiB3cml0ZSAsMSByZWFkICNkZWZpbmUgCUREUl9QQVJBTUVURVJfUkVBRAkxICAgICAgI2RlZmluZSAJRERSX1BBUkFNRVRFUl9XUklURQkJMgoJdW5zaWduZWQgaW50IGxlZnRfcmlnaHRfZmxhZz0wOy8vICAxIGxlZnQgLDIgcmlnaHQgICAjZGVmaW5lICBERFJfUEFSQU1FVEVSX0xFRlQJCTEgICAgICNkZWZpbmUgCUREUl9QQVJBTUVURVJfUklHSFQJCTIKCXVuc2lnbmVkIGludCBvZmZzZXRfdmFsdWU9MDsvLwoKCS8vdW5zaWduZWQgaW50IG9mZnNldF9lbmFibGU9MDsvLwoKCS8vdW5zaWduZWQgaW50IHRlbXBfdmFsdWU9MDsvLwoJdW5zaWduZWQgaW50IGNvdW50PTA7CgkvL3Vuc2lnbmVkIGludCBjb3VudDE9MDsKCXVuc2lnbmVkIGludCBjb3VudF9tYXg9MDsKCXVuc2lnbmVkIGludCBsY2Rscl9tYXg9MDsKCS8vdW5zaWduZWQgaW50IHJlZ19hZGQ9MDsKCS8vdW5zaWduZWQgaW50IHJlZ192YWx1ZT0wOwoKCWdsb2JhbF9kZHJfY2xrPWdldF9kZHJfY2xrKCk7CgliZGxyXzEwMHN0ZXA9Z2V0X2JkbHJfMTAwc3RlcChnbG9iYWxfZGRyX2Nsayk7CgkvL2dsb2JhbF9kZHJfY2xrPTc2ODsKCXVpXzFfMzJfMTAwc3RlcD0oMTAwMDAwMCoxMDAvKGdsb2JhbF9kZHJfY2xrKjIqMzIpKTsKCglpZiAoYXJnYyA9PSAxKQoJewoJCXByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCX0KCWVsc2UgaWYgIChhcmdjID42KQoJey8vb2Zmc2V0X2VuYWJsZT0xOwoKCQl7CgkJCWNvdW50PTA7CgkJCXRlc3RfaW5kZXg9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbY291bnQrMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQl0ZXN0X2luZGV4ID0gMDsKCQkJfQoKCQl9CgkJewoJCQljb3VudCsrOwoJCQl0ZXN0X2RxX21hc2tfMT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCXRlc3RfZHFfbWFza18xID0gMDsKCQkJfQoKCQl9CgkJewoJCQljb3VudCsrOwoJCQl0ZXN0X2RxX21hc2tfMj0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCXRlc3RfZHFfbWFza18yID0gMDsKCQkJfQoKCQl9CgkJewoJCQljb3VudCsrOwoJCQl0ZXN0X2RxX21hc2tfMz0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCXRlc3RfZHFfbWFza18zID0gMDsKCQkJfQoKCQl9CgkJewoJCQljb3VudCsrOwoJCQlsZWZ0X3JpZ2h0X2ZsYWc9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbY291bnQrMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQlsZWZ0X3JpZ2h0X2ZsYWcgPSAwOwoJCQl9CgoJCX0KCQl7CgkJCWNvdW50Kys7CgkJCW9mZnNldF92YWx1ZT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCW9mZnNldF92YWx1ZSA9IDA7CgkJCX0KCgkJfQoKCgl9CgllbHNlIHsKCQl3cl9yZWcoRE1DX1BIWV9SRVRSQUlOSU5HX0NUUkwsZG1jX3JldHJhaW5pbmdfY3RybCk7CgkJcmV0dXJuIDE7Cgl9CglwcmludGYoImxjZGxyX21heCAlZCxcbiIsbGNkbHJfbWF4KTsKCWlmIChsZWZ0X3JpZ2h0X2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9SSUdIVCkKCQlwcmludGYoIm9mZnNldCByaWdodCArKyAgbGVmdF9yaWdodF9mbGFnICVkLFxuIixsZWZ0X3JpZ2h0X2ZsYWcpOwoJaWYgKGxlZnRfcmlnaHRfZmxhZyA9PSBERFJfUEFSQU1FVEVSX0xFRlQpCgkJcHJpbnRmKCJvZmZzZXQgbGVmdCAtLWxlZnRfcmlnaHRfZmxhZyAlZCxcbiIsbGVmdF9yaWdodF9mbGFnKTsKCglpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKSB7CgkJY291bnRfbWF4PTM2OwoJCWxjZGxyX21heD00KjEyOC0xOy8vMHgzZmY7Cgl9CglpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpIHsKCQljb3VudF9tYXg9ODsKCQlsY2Rscl9tYXg9NCoxMjgtMTsvLzB4M2ZmOwoJfQoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKSB7CgkJY291bnRfbWF4PTg7CgkJbGNkbHJfbWF4PTI1NTsvLzB4M2Y7Cgl9CglpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkgewoJCWNvdW50X21heD0zNioyOwoJCWxjZGxyX21heD04KjEyOC0xOzsvLzB4MWZmOwoJfQoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkpIHsKCQljb3VudF9tYXg9MzYqMjsKCQlsY2Rscl9tYXg9MjU1OwoJfQoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGKSB7CgkJY291bnRfbWF4PTM2KjE7CgkJbGNkbHJfbWF4PTB4M2Y7CgkJcHJpbnRmKCIgc29jIHZyZWYgcmFuazAgYW5kIHJhbmsxIHNoYXJlIHZyZWYgZGFjXG4iKTsKCX0KCgljb3VudD0wOwoJZm9yICg7Y291bnQ8Y291bnRfbWF4O2NvdW50KyspIHsKCQlpZiAoKGNvdW50PDMyKSkgewoJCQlpZiAodGVzdF9kcV9tYXNrXzEmKDE8PChjb3VudCUzMikpKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCX0KCQlpZiAoKGNvdW50PjMxKSAmJiAoY291bnQ8NjMpKSB7CgkJCWlmICh0ZXN0X2RxX21hc2tfMiYoMTw8KGNvdW50JTMyKSkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoJCWlmICgoY291bnQ+NjMpKSB7CgkJCWlmICh0ZXN0X2RxX21hc2tfMyYoMTw8KGNvdW50JTMyKSkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoKCQkvLwlmb3IgKGNvdW50MT0wO2NvdW50MTxvZmZzZXRfdmFsdWU7Y291bnQxKyspCgkJewoJCQlpZiAobGVmdF9yaWdodF9mbGFnID09IEREUl9QQVJBTUVURVJfUklHSFQpCgkJCXsKCQkJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX2MyKHRlc3RfaW5kZXgsCgkJCQkJCWNvdW50LAoJCQkJCQkwLG9mZnNldF92YWx1ZSk7CgkJCX0KCQkJaWYgKGxlZnRfcmlnaHRfZmxhZyA9PSBERFJfUEFSQU1FVEVSX0xFRlQpCgkJCXsKCQkJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX2MyKHRlc3RfaW5kZXgsCgkJCQkJCWNvdW50LAoJCQkJCQkxLG9mZnNldF92YWx1ZSk7CgkJCX0KCQl9Cgl9CgojZW5kaWYKCXdyX3JlZyhETUNfUEhZX1JFVFJBSU5JTkdfQ1RSTCxkbWNfcmV0cmFpbmluZ19jdHJsKTsKCXJldHVybiAxOwp9CgppbnQgZG9fZGRyX2cxMl9vZmZzZXRfZGF0YShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCS8vZGRyX2cxMl9vZmZzZXRfZGF0YSAgMSAwICAwIDAgIDEgMwoJY2hlY2tfYmFzZV9hZGRyZXNzKCk7CglpZiAocF9kZHJfYmFzZS0+Y2hpcF9pZCA9PSBNRVNPTl9DUFVfTUFKT1JfSURfQzIpCgl7CgkJZG9fZGRyX2MyX29mZnNldF9kYXRhKGNtZHRwLCAgZmxhZywgIGFyZ2MsIGFyZ3YpOwoJCXJldHVybiAxOwoJfQoJI2RlZmluZSBETUNfUEhZX1JFVFJBSU5JTkdfQ1RSTCAgICAgKCBwX2Rkcl9iYXNlLT5kZHJfZG1jX2xwZGQ0X3JldHJhaW5pbmdfYWRkcmVzcykKCXVpbnQzMl90IGRtY19yZXRyYWluaW5nX2N0cmw9MDsKCWRtY19yZXRyYWluaW5nX2N0cmw9cmRfcmVnKERNQ19QSFlfUkVUUkFJTklOR19DVFJMKTsKCXdyX3JlZyhETUNfUEhZX1JFVFJBSU5JTkdfQ1RSTCxkbWNfcmV0cmFpbmluZ19jdHJsJih+KDE8PDMxKSkpOwojZGVmaW5lICBHMTJfREFUQV9SRUFEX09GRlNFVF9NQVggICAoMFgzRikKI2RlZmluZSAgRzEyX0RBVEFfV1JJVEVfT0ZGU0VUX01BWCAgICgwWDNGKzcqMzIpCglwcmludGYoIlwxMm5tIHBoeSByZWFkIHdyaXRlIHJlZ2lzdGVyIHNob3VsZCBjbG9zZCBhcGQgYW5kIGFzciBmdW5jaXRvblxuIik7Cgl3cml0ZWwoKDApLCBwX2Rkcl9iYXNlLT5kZHJfZG1jX2FwZF9hZGRyZXNzKTsKCXdyaXRlbCgoMCksIHBfZGRyX2Jhc2UtPmRkcl9kbWNfYXNyX2FkZHJlc3MpOwojaWYgMQoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJaW50IGk9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCWNoYXIgKmVuZHA7CgkvL3JhbmtfaW5kZXggIGRxX2luZGV4ICB3cml0ZV9yZWFkIGxlZnQvcmlnaHQgIG9mZnNldF92YWx1ZQoJdW5zaWduZWQgaW50IHRlc3RfaW5kZXg9MDsgLy8gMSBhYyAsMHgyLCB3cml0ZSBkcXMgLDB4NCxyZWFkIGRxcywweDgsd3JpdGUgZHEsMHgxMCByZWFkIGRxCgkvL3Vuc2lnbmVkIGludCBkcV9pbmRleD0wOyAgLy8wLTggcmFuazAgbGFuZTAgLHJhbmswIDktMTcgbGFuZTEscmFuazAgMTgtMjYgbGFuZTIsIHJhbmswIDI3LTM1IGxhbmUzLCAgMzYrMC04IHJhbmsxIGxhbmUwICxyYW5rMSAgMzYrOS0xNyBsYW5lMSxyYW5rMSAgMzYrMTgtMjYgbGFuZTIsIHJhbmsxICAzNisyNy0zNSBsYW5lMwoJdW5zaWduZWQgaW50IHRlc3RfZHFfbWFza18xPTA7IC8vZWFjaCBiaXQgbWFzayBjb3JyZXNzcG9uZCB3aXRoIGRxX2luZGV4Cgl1bnNpZ25lZCBpbnQgdGVzdF9kcV9tYXNrXzI9MDsgLy9lYWNoIGJpdCBtYXNrIGNvcnJlc3Nwb25kIHdpdGggZHFfaW5kZXgKCXVuc2lnbmVkIGludCB0ZXN0X2RxX21hc2tfMz0wOyAvL2VhY2ggYml0IG1hc2sgY29ycmVzc3BvbmQgd2l0aCBkcV9pbmRleAoJLy91bnNpZ25lZCBpbnQgd3JpdGVfcmVhZF9mbGFnPTA7Ly8gMiB3cml0ZSAsMSByZWFkICNkZWZpbmUgCUREUl9QQVJBTUVURVJfUkVBRAkxICAgICAgI2RlZmluZSAJRERSX1BBUkFNRVRFUl9XUklURQkJMgoJdW5zaWduZWQgaW50IGxlZnRfcmlnaHRfZmxhZz0wOy8vICAxIGxlZnQgLDIgcmlnaHQgICAjZGVmaW5lICBERFJfUEFSQU1FVEVSX0xFRlQJCTEgICAgICNkZWZpbmUgCUREUl9QQVJBTUVURVJfUklHSFQJCTIKCXVuc2lnbmVkIGludCBvZmZzZXRfdmFsdWU9MDsvLwoKCS8vdW5zaWduZWQgaW50IG9mZnNldF9lbmFibGU9MDsvLwoJLy91bnNpZ25lZCBpbnQgdGVtcF92YWx1ZT0wOy8vCgl1bnNpZ25lZCBpbnQgY291bnQ9MDsKCS8vdW5zaWduZWQgaW50IGNvdW50MT0wOwoJdW5zaWduZWQgaW50IGNvdW50X21heD0wOwoJdW5zaWduZWQgaW50IGxjZGxyX21heD0wOwoJLy91bnNpZ25lZCBpbnQgcmVnX2FkZD0wOwoJLy91bnNpZ25lZCBpbnQgcmVnX3ZhbHVlPTA7CgoJZ2xvYmFsX2Rkcl9jbGs9Z2V0X2Rkcl9jbGsoKTsKCWJkbHJfMTAwc3RlcD1nZXRfYmRscl8xMDBzdGVwKGdsb2JhbF9kZHJfY2xrKTsKCS8vZ2xvYmFsX2Rkcl9jbGs9NzY4OwoJdWlfMV8zMl8xMDBzdGVwPSgxMDAwMDAwKjEwMC8oZ2xvYmFsX2Rkcl9jbGsqMiozMikpOwoKCWlmIChhcmdjID09IDEpCgl7CgkJcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoJfQoJZWxzZSBpZiAgKGFyZ2MgPjYpCgl7Ly9vZmZzZXRfZW5hYmxlPTE7CgkJewoJCQljb3VudD0wOwoJCQl0ZXN0X2luZGV4PSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdGVzdF9pbmRleCA9IDA7CgkJCX0KCQl9CgkJewoJCQljb3VudCsrOwoJCQl0ZXN0X2RxX21hc2tfMT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCXRlc3RfZHFfbWFza18xID0gMDsKCQkJfQoJCX0KCQl7CgkJCWNvdW50Kys7CgkJCXRlc3RfZHFfbWFza18yPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdGVzdF9kcV9tYXNrXzIgPSAwOwoJCQl9CgkJfQoJCXsKCQkJY291bnQrKzsKCQkJdGVzdF9kcV9tYXNrXzM9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbY291bnQrMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQl0ZXN0X2RxX21hc2tfMyA9IDA7CgkJCX0KCQl9CgkJewoJCQljb3VudCsrOwoJCQlsZWZ0X3JpZ2h0X2ZsYWc9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbY291bnQrMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQlsZWZ0X3JpZ2h0X2ZsYWcgPSAwOwoJCQl9CgkJfQoJCXsKCQkJY291bnQrKzsKCQkJb2Zmc2V0X3ZhbHVlPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJb2Zmc2V0X3ZhbHVlID0gMDsKCQkJfQoJCX0KCX0KCWVsc2UgewoJCXdyX3JlZyhETUNfUEhZX1JFVFJBSU5JTkdfQ1RSTCxkbWNfcmV0cmFpbmluZ19jdHJsKTsKCQlyZXR1cm4gMTsKCX0KCXByaW50ZigibGNkbHJfbWF4ICVkLFxuIixsY2Rscl9tYXgpOwoJaWYgKGxlZnRfcmlnaHRfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1JJR0hUKQoJCXByaW50Zigib2Zmc2V0IHJpZ2h0ICsrICBsZWZ0X3JpZ2h0X2ZsYWcgJWQsXG4iLGxlZnRfcmlnaHRfZmxhZyk7CglpZiAobGVmdF9yaWdodF9mbGFnID09IEREUl9QQVJBTUVURVJfTEVGVCkKCQlwcmludGYoIm9mZnNldCBsZWZ0IC0tbGVmdF9yaWdodF9mbGFnICVkLFxuIixsZWZ0X3JpZ2h0X2ZsYWcpOwoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgewoJCWNvdW50X21heD0xMDsKCQlsY2Rscl9tYXg9MyozMjsvLzB4M2ZmOwoJfQoKCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkgewoJCWNvdW50X21heD0xNjsKCQlsY2Rscl9tYXg9MTYqMzI7Ly8weDNmZjsKCX0KCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSkgewoJCWNvdW50X21heD0xNjsKCQlsY2Rscl9tYXg9OTY7Ly8weDNmOwoJfQoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpIHsKCQljb3VudF9tYXg9MzYqMjsKCQlsY2Rscl9tYXg9OCozMjsvLzB4MWZmOwoJfQoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkpIHsKCQljb3VudF9tYXg9MzYqMjsKCQlsY2Rscl9tYXg9MHgzZjsKCX0KCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9TT0NfVlJFRikgewoJCWNvdW50X21heD0zNioxOwoJCWxjZGxyX21heD0weDNmOwoJCXByaW50ZigiIHNvYyB2cmVmIHJhbmswIGFuZCByYW5rMSBzaGFyZSB2cmVmIGRhY1xuIik7Cgl9CgoKCgljb3VudD0wOwoJZm9yICg7Y291bnQ8Y291bnRfbWF4O2NvdW50KyspIHsKCQlpZiAoKGNvdW50PDMyKSkgewoJCQlpZiAodGVzdF9kcV9tYXNrXzEmKDE8PChjb3VudCUzMikpKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCX0KCQlpZiAoKGNvdW50PjMxKSAmJiAoY291bnQ8NjMpKSB7CgkJCWlmICh0ZXN0X2RxX21hc2tfMiYoMTw8KGNvdW50JTMyKSkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoJCWlmICgoY291bnQ+NjMpKSB7CgkJCWlmICh0ZXN0X2RxX21hc2tfMyYoMTw8KGNvdW50JTMyKSkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoKCQkvLwlmb3IgKGNvdW50MT0wO2NvdW50MTxvZmZzZXRfdmFsdWU7Y291bnQxKyspCgkJewoJCQlpZiAobGVmdF9yaWdodF9mbGFnID09IEREUl9QQVJBTUVURVJfUklHSFQpCgkJCXsKCQkJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzKHRlc3RfaW5kZXgsCgkJCQkJCWNvdW50LAoJCQkJCQkwLG9mZnNldF92YWx1ZSk7CgkJCX0KCQkJaWYgKGxlZnRfcmlnaHRfZmxhZyA9PSBERFJfUEFSQU1FVEVSX0xFRlQpCgkJCXsKCQkJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzKHRlc3RfaW5kZXgsCgkJCQkJCWNvdW50LAoJCQkJCQkxLG9mZnNldF92YWx1ZSk7CgkJCX0KCQl9Cgl9CgoKI2VuZGlmCgl3cl9yZWcoRE1DX1BIWV9SRVRSQUlOSU5HX0NUUkwsZG1jX3JldHJhaW5pbmdfY3RybCk7CglyZXR1cm4gMTsKfQoKClVfQk9PVF9DTUQoCglkZHJfZzEyX29mZnNldF9kYXRhLAkyMCwJMSwJZG9fZGRyX2cxMl9vZmZzZXRfZGF0YSwKCSJkZHJfZzEyX29mZnNldF9kYXRhICAxIDAgIDAgMCAgMSAzIiwKCSJkZHJfZzEyX29mZnNldF9kYXRhICB0ZXN0X2luZGV4ICBtYXNrMSBtYXNrMiBtYXNrMyAgbGVmdC9yaWdodCAgb2Zmc2V0X3ZhbHVlIFxuIgopOwoKI2VuZGlmCgoKLy9jaGFyIENNRF9WRVJbXSA9ICJWZXJfMTEiOwppbnQgZG9fZGRyX3Rlc3RfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJY2hlY2tfYmFzZV9hZGRyZXNzKCk7CgkjZGVmaW5lIERNQ19QSFlfUkVUUkFJTklOR19DVFJMICAgICAoIHBfZGRyX2Jhc2UtPmRkcl9kbWNfbHBkZDRfcmV0cmFpbmluZ19hZGRyZXNzKQoJdWludDMyX3QgZG1jX3JldHJhaW5pbmdfY3RybD0wOwoJZG1jX3JldHJhaW5pbmdfY3RybD1yZF9yZWcoRE1DX1BIWV9SRVRSQUlOSU5HX0NUUkwpOwoJd3JfcmVnKERNQ19QSFlfUkVUUkFJTklOR19DVFJMLGRtY19yZXRyYWluaW5nX2N0cmwmKH4oMTw8MzEpKSk7CgkvL2Rkcl90ZXN0X3dhdGNoZG9nX2luaXQoNDAwMCk7CgkvL3ByaW50ZigiXG5vcGVuIHdhdGNoZG9nICVkbXNcbiIsNDAwMCk7CglwcmludGYoIlxuIGRkciB0ZXN0IGNtZCB2ZXJzaW9uPT0gJXNcbiIsIENNRF9WRVIpOwoJLy9wcmludGYoIkREUiB0ZXN0IGNvZGUgYnVpbGQgdGltZTo9PSIpOwoJLy9wcmludGYoX19EQVRFX18pOwoJLy9wcmludGYoX19USU1FX18pOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoKCS8qIG5lZWQgYXQgbGVhc3QgdHdvIGFyZ3VtZW50cyAqLwoJaWYgKGFyZ2MgPCAyKQoJCWdvdG8gdXNhZ2U7CglpZiAoKHN0cmNtcChhcmd2WzFdLCAiaCIpID09IDApKQoJCWdvdG8gdXNhZ2U7CgojaWYgMS8vICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKCXByaW50ZigiXDEybm0gcGh5IHJlYWQgd3JpdGUgcmVnaXN0ZXIgc2hvdWxkIGNsb3NkIGFwZCBhbmQgYXNyIGZ1bmNpdG9uXG4iKTsKCgl3cml0ZWwoKDApLCBwX2Rkcl9iYXNlLT5kZHJfZG1jX2FwZF9hZGRyZXNzKTsKCXdyaXRlbCgoMCksIHBfZGRyX2Jhc2UtPmRkcl9kbWNfYXNyX2FkZHJlc3MpOwoKCglnbG9iYWxfZGRyX2Nsaz1nZXRfZGRyX2NsaygpOwoJcHJpbnRmKCJcbmRkcl9jbGs9PSAlZE1IelxuIiwgZ2xvYmFsX2Rkcl9jbGspOwoKI2VuZGlmCgojZGVmaW5lICBERFJfVEVTVF9DTURfX05PTkUgICAwCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1QgICAgICAgICAxCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RVTkVfQUNMQ0RMUiAgICAgICAgMgojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9UVU5FX01BWF9DTEsgICAgIDMgICAvL2Rkcl90ZXN0X2NtZCAzIDB4ODAwMDAwMCAzIDEKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVFVORV9aUSAgICAgNAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9UVU5FX1ZSRUYgICAgNQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9HWFRWQkJfQ1JPU1NUQUxLICAgIDYKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfQkFORFdJRFRIX1RFU1QgICA3CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX0xDRExSX0VOVl9UVU5FICAgOAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9NT0RJRllfUkVHX1VTRV9NQVNLICAgOQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9ERFJfVFVORV9BQ19DTEsgICAweGEKCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1NFVFpRICAgMHgxMAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9UVU5FX0RRUyAgMHgxMQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9TRVRfVEVTVF9TVEFSVF9BREQgIDB4MTIKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9BQ19CSVRfU0VUVVBfSE9MRF9NQVJHSU4gIDB4MTMKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9EQVRBX0JJVF9TRVRVUF9IT0xEX01BUkdJTiAgMHgxNAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX0FDX0xBTkVfQklUX01BUkdJTiAgMHgxNQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX0VFX1ZPTFRBR0VfTURMUl9TVEVQICAweDE2CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfRDJQTExfQ01EICAweDE3CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfREFUQV9MQU5FX0JJVF9NQVJHSU4gIDB4MTgKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1RVTkVfUEhZX1ZSRUYgICAweDE5CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSNF9UVU5FX0RSQU1fVlJFRiAgIDB4MUEKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1RVTkVfQUNfVlJFRiAgIDB4MWIKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1NXRUVQX0RSQU1fQ0xLX1VTRV9EMlBMTCAgIDB4MWMKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1RFU1RfU0hJRlRfRERSX0ZSRVFVRU5DWSAgMHgxZAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUjRfVEVTVF9EQVRBX1dSVElFX1JFQUQgIDB4MWUKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9QV01fQ01EICAgICAgICAgICAgICAweDFmCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfRUVfU0kgICAgICAgICAgICAgMHgyMAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX1ZERFFfU0kgICAgICAgICAgICAgMHgyMQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9UVU5FX0REUl9EQVRBX1dJTkRPV19FTlYgICAgICAgICAgICAweDIyCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSNF9URVNUX1NISUZUX0REUl9GUkVRVUVOQ1lfVFhMICAweDIzCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRElTUExBWV9ERFJfSU5GT1JNQVRJT04gIDB4MjQKI2RlZmluZSAgRERSX1RFU1RfQ01EX19PRkZTRVRfTENETFIgIDB4MjUKI2RlZmluZSAgRERSX1RFU1RfQ01EX19TRVRfV0FUQ0hfRE9HX1ZBTFVFICAweDI2CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RVTkVfRERSX0RBVEFfV0lORE9XX1NUSUNLWSAgMHgyNwojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUjRfU1dFRVBfRFJBTV9DTEtfVVNFX0QyUExMX1NUSUNLWSAgMHgyOAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUjRfRERSX0JJU1RfVEVTVF9VU0VfRDJQTExfU1RJQ0tZICAweDI5CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1NFVF9CSVNUX1RFU1RfU0laRV9TVElDS1lfNiAgMHgzMAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9TRVRfVUJPT1RfU1RPUkVfV0lORE9XICAweDMxCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9TVE9SRV9RVUlDS19XSU5ET1cgIDB4MzIKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0tFUk5FTF9TVE9SRV9RVUlDS19XSU5ET1cgIDB4MzMKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0tFUk5FTF9TVE9SRV9RVUlDS19XSU5ET1dfTVVMVEkgIDB4MzQKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0tFUk5FTF9XSU5ET1dfU0FNRV9DSEFOR0UgIDB4MzUKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0cxMl9SRUNPTkZJR19DTUQgIDB4MzYKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ESVNQTEFZX0cxMl9ERFJfSU5GT1JNQVRJT04gIDB4MzcKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfRzEyX0RNQ19URVNUICAweDM4CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX0cxMl9FRV9CRExSX1RFU1QgIDB4MzkKCgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X2NtZD0wOwoJdW5zaWduZWQgaW50ICBhcmdbMzBdPXswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCx9OwoJY2hhciAqZW5kcDsKCWRkcl90ZXN0X2NtZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJZm9yIChpID0gMjtpPGFyZ2M7aSsrKQoJCWFyZ1tpLTJdPXNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltpXSwgJmVuZHAsIDApOwoJcHJpbnRmKCJcbmRkcl90ZXN0X2NtZD09IDB4JTA4eFxuIiwgZGRyX3Rlc3RfY21kKTsKCglmb3IgKGkgPSAwO2k8KGFyZ2MtMik7aSsrKQoJCXByaW50ZigiXG5hcmdbJTA4eF09JTA4eFxuIixpLGFyZ1tpXSk7CgkvL2ludCBhcmdjMl9sZW5ndGg7CgkvL2FyZ2MyX2xlbmd0aD0oYXJnYy0yKTsKCS8vY21kX3RibF90ICpjbWR0cDI7CgkvL2ludCBmbGFnMjsKCWludCBhcmdjMjsKCWNoYXIqIGFyZ3YyWzMwXTsKCglhcmdjMj1hcmdjLTE7Cglmb3IgKGkgPSAxO2k8KGFyZ2MpO2krKykKCQlhcmd2MltpLTFdPWFyZ3ZbaV07CgkvL2FyZ3YyPShjaGFyICAgICopYXJndisrOwoJewoJCXJ1bl9jb21tYW5kKCJkY2FjaGUgb2ZmIiwwKTsKCQlydW5fY29tbWFuZCgiZGNhY2hlIG9uIiwwKTsKCQlwcmludGYoIlxuIGNhY2hlIG9mZiBvbiIpOwoJCXN3aXRjaCAoZGRyX3Rlc3RfY21kKQoJCXtjYXNlKEREUl9URVNUX0NNRF9fTk9ORSk6CgkJCXsKCQkJCXByaW50ZigiXG4gIDB4MCBoZWxwXG4iKTsKCQkJCXByaW50ZigiXG4gIDB4MSBkZHJ0ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxIHN0YXJ0X2FkZCB0ZXN0X3NpemUgbG9vcHMgICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgyIHRlc3QgYWNsY2RsciAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDIgc3RhcnRfYWRkIHRlc3Rfc2l6ZSBsb29wcyAgICBkZHJfdGVzdF9jbWQgMHgyIGEgMCAweDgwMDAwMDAgIDEiKTsKCQkJCXByaW50ZigiXG4gIDB4MyB0ZXN0IG1heF9wbGxjbGsgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgzICB0ZXN0X3NpemUgbG9vcHMgYWRkX2ZyZXEgc3ViX2ZyZXEgIik7CgkJCQlwcmludGYoIlxuICAweDQgdGVzdCB6cSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDQgIHRlc3Rfc2l6ZSBsb29wcyBhZGRfZnJlcSBzdWJfZnJlcSBkcnZfb2R0X2ZsYWcgIik7CgkJCQlwcmludGYoIlxuICAweDUgdGVzdCB2cmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDUgICAiKTsKCQkJCXByaW50ZigiXG4gIDB4NiB0ZXN0IGd4dHZiYl9jcm9zc3RhbGsgICAgICAgICBkZHJfdGVzdF9jbWQgMHg2ICBsb29wcyBwYXR0ZXJuX2ZsYWcgIik7CgkJCQlwcmludGYoIlxuICAweDcgdGVzdCBiYW5kd2lkdGggICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4NyBzaXplIGxvb3BzIHBvcnQgc3ViX2lkIHRpbWVyX21zICIpOwoJCQkJcHJpbnRmKCJcbiAgMHg4IHRlc3QgbGNkbHJfdXNlX2Vudl91YXJ0ICAgICAgZGRyX3Rlc3RfY21kIDB4OCBpbnB1dF9zcmMgd3JfYWRqX3BlcltdIHJkX2Fkal9wZXJbXVtdICIpOwoJCQkJcHJpbnRmKCJcbiAgMHg5IHRlc3RfcmVnX3VzZV9tYXNrICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4OSByZWdfYWRkIHZhbHVlIG1hc2sgICIpOwoJCQkJcHJpbnRmKCJcbiAgMHhhIHRlc3QgYWNfY2xrICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4YSBzdGFydF9hZGQgdGVzdF9zaXplIGxvb3BzICAgZGRyX3Rlc3RfY21kIDB4YSBhIDAgMHg4MDAwMDAwICAxICAiKTsKCQkJCXByaW50ZigiXG4gIDB4YiAuLi4gICIpOwoJCQkJcHJpbnRmKCJcbiAgMHhjIC4uLiAgIik7CgkJCQlwcmludGYoIlxuICAweGQgLi4uICAiKTsKCQkJCXByaW50ZigiXG4gIDB4ZSAuLi4gICIpOwoJCQkJcHJpbnRmKCJcbiAgMHhmIC4uLiAgIik7CgkJCQlwcmludGYoIlxuICAweDEwIHRlc3Qgc2V0IHpxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTAgenEwcHIwIHpxMXByMCB6cTJwcjAgICAiKTsKCQkJCXByaW50ZigiXG4gIDB4MTEgdGVzdCB0dW5lIGRxcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTEgYSAwIHRlc3Rfc2l6ZSAgIGRkcl90ZXN0X2NtZCAweDExIGEgMCAweDgwMDAwIik7CgkJCQlwcmludGYoIlxuICAweDEyIHRlc3Qgc2V0IHN0YXJ0X2FkZCAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTIgc3RhcnRfYWRkICAgIik7CgkJCQlwcmludGYoIlxuICAweDEzIHRlc3QgYWNfYml0X3NldHVwX2hvbGQgdGltZSAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTMgYSAwIHNpemUgbWV0aG9kICBwaW5faWQgICBkZHJfdGVzdF9jbWQgMHgxMyBhIDAgMHg4MDAwMDAwIDAgIDB4YyIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxNCB0ZXN0IGRhdGFfYml0X3NldHVwX2hvbGQgdGltZSAgICAgIGRkcl90ZXN0X2NtZCAweDE0IGEgMCBzaXplIHNldHVwL2hvbGQgcGluX2lkICAgZGRyX3Rlc3RfY21kIDB4MTQgYSAwIDB4ODAwMDAgMCAzICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxNSB0ZXN0IGFjX2xhbmVfc2V0dXBfaG9sZCAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxNSBhIDAgc2l6ZSAgICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxNiB0ZXN0IGVlIG1kbHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxNiAgdm9sdGFnZSBwd21faWQgbG9vcHMgICAiKTsKCQkJCXByaW50ZigiXG4gIDB4MTcgZDJwbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTcgY2xrIHpxX2FjIHpxX3NvY19kcmFtIHNvY192cmVmIGRyYW1fdnJlZiBkZWNfaGV4IHpxX3ZyZWYgMFxuIFwKCQkJCQkJZXhhbXBsZSBkZHJfdGVzdF9jbWQgMHgxNyAxMjAwIDB4MmFhNGEgMHgyMDE1OTk1ZCA1MCA4MSAxIDUwIFxuIFwKCQkJCQkJb3IgIGRkcl90ZXN0X2NtZCAweDE3IDEyMDAgMHgyYWE0YSAweDIwMTU5OTVkIDB4MDkgMHgyMCAwIDUwIFxuIik7CgkJCQlwcmludGYoIm9yICBkZHJfdGVzdF9jbWQgMHgxNyAxMjAwIDYwMzQgNjAzNDYwMzQgMCAwIDAgMCAxIFxuIik7CgkJCQlwcmludGYoIlxuICAweDE4IHRlc3QgZGF0YV9sYW5lX3NldHVwX2hvbGQgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTggYSAwIHNpemUgcmFuZ2Ugc3RhcnRfcGluX2lkIGVuZF9waW5faWQgIGRkcl90ZXN0X2NtZCAweDE4IGEgMCAweDgwMDAwIDEgMCA5NiAiKTsKCQkJCXByaW50ZigiXG4gIDB4MTkgdGVzdCBwaHkgdnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTkgYSAwIDB4ODAwMDAgIDEgc2VlZCBzdGVwIHZyZWZfYWxsIHZyZWZfbGNkbHJfb2Zmc2V0IHRlc3RfZG93bl91cF9zdGVwIHNlZWRfaGV4X2RlYyAgXAoJCQkJCQlkZHJfdGVzdF9jbWQgMHgxOSBhIDAgMHgxMDAwMDAwICAxICA2MyAgMSAxICAweDggMCAxICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxYSB0ZXN0IGRyYW0gdnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDFBIGEgMCAweDgwMDAwICBjbGVhciBzZWVkIHN0ZXAgdnJlZl9hbGwgdnJlZl9sY2Rscl9vZmZzZXQgdGVzdF9kb3duX3VwX3N0ZXAgdnJlZl9yYW5nZSBzZWVkX2hleF9kZWMgXAoJCQkJCQlcbiBzZXRlbnYgIGRkcl90ZXN0X2RkcjRyYW1fdnJlZiBkZHJfdGVzdF9jbWQgMHgxQSBhIDAgMHgwODAwMDAwICAwICAweDE0IDEgIDAgIDB4OCAwIDAgMCA7IHNldGVudiAgc3RvcmVib290ICBydW4gZGRyX3Rlc3RfZGRyNHJhbV92cmVmIDtzYXZlO3Jlc2V0ICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxYiB0ZXN0IGFjIHZyZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MUIgYSAwIDB4ODAwMDAgIGNsZWFyIHNlZWQgc3RlcCB2cmVmX2FsbCB2cmVmX2xjZGxyX29mZnNldCBzZWVkX2hleF9kZWMiKTsKCQkJCXByaW50ZigiXG4gIDB4MWMgc3dlZXAgZHJhbSBjbGsgdXNlIGQycGxsX2VudiAgICAgZGRyX3Rlc3RfY21kIDB4MWMgIHRlc3Rfc2l6ZSBzdGFydF9mcmVxIGVuZF9mcmVxIHRlc3RfbG9vcHMgIGRkcl90ZXN0X2NtZCAweDFjIDB4ODAwMDAwMCA4MDAgMTUwMCAxIik7CgkJCQlwcmludGYoIlxuICAweDFkIHRlc3Qgc2hpZnQgY2xrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDFkIHR5cGUgZGVsYXlfbXMgdGltZXMiKTsKCQkJCXByaW50ZigiXG4gIDB4MWUgdGVzdCB3cml0ZV9yZWFkICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxZSB3cml0ZV9yZWFkIHBhdHRlcm5faWQgbG9vcCBzdGFydF9hZGQgdGVzdF9zaXplIik7CgkJCQlwcmludGYoIlxuICAweDFmIHRlc3QgcHdtX2NtZCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDFmIHB3bWlkICAgcHdtX2xvdyBwd21faGlnaCIpOwoJCQkJcHJpbnRmKCJcbiAgMHgyMiB0ZXN0IGRkcl93aW5kb3cgdXNlIGVudiAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MjIgYSAwIHRlc3Rfc2l6ZSB3YXRjaGRvZ190aW1lIFwKCQkJCQkJbGFuZV9kaXNhYmxlX21hc3JrIGFkZF90ZXN0X3NpemUgIHNldGVudiBib290Y21kICBkZHJfdGVzdF9jbWQgMHgyMiBhIDAgMHg4MDAwMDAgMTUgMCAweDgwMDAwMDAiKTsKCQkJCXByaW50ZigiXG4gZGVmZW52O3NhdmU7c2V0ZW52IGJvb3RjbWQgZGRyX3Rlc3RfY21kIDB4MjIgYSAwIDB4ODAwMDAwIDE4IDB4MCAweDgwMDAwMDAiKTsKCQkJCXByaW50ZigiXG4gc2V0ZW52IGVudl9kZHJ0ZXN0X2RhdGFfbGFuZSAgMHgyMjtzYXZlO3Jlc2V0Iik7CgkJCQlwcmludGYoIlxuICAweDIzIHRlc3Qgc2hpZnQgZGRyIGZyZXF1ZW5jeSAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgyMyIpOwoJCQkJcHJpbnRmKCJcbiAgMHgyNCBkaXNwbGF5IGRkcl9pbmZvcm1hdGlvbiAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgyNCIpOwoJCQkJcHJpbnRmKCJcbiAgMHgyNSBvZmZzZXQgZGRyX2xjZGxyICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDI1Iik7CgkJCQlwcmludGYoIlxuICAweDI2IHNldCB3YXRjaGRvZ192YWx1ZSAgICAgICAgZGRyX3Rlc3RfY21kIDB4MjYgMzAiKTsKCQkJCXByaW50ZigiXG4gIDB4MjcgdGVzdCBkZHJfd2luZG93IHVzZSBzdGlja3kgcmVnaXN0ZXIgICAgICAgIGRkcl90ZXN0X2NtZCAweDI3IGEgMCB0ZXN0X3NpemUgd2F0Y2hkb2dfdGltZSBcCgkJCQkJCWxhbmVfZGlzYWJsZV9tYXNyayBhZGRfdGVzdF9zaXplICBzZXRlbnYgYm9vdGNtZCAgZGRyX3Rlc3RfY21kIDB4MjcgYSAwIDB4ODAwMDAwIDE1IDAgMHg4MDAwMDAwIik7CgkJCQlwcmludGYoIlxuICAweDI4ICBzd2VlcCBkcmFtIGNsayB1c2UgZDJwbGxfc3RpY2t5ICAgICBkZHJfdGVzdF9jbWQgMHgyOCAgdGVzdF9zaXplIHN0YXJ0X2ZyZXEgZW5kX2ZyZXEgdGVzdF9sb29wcyAgZGRyX3Rlc3RfY21kIDB4MjggMHg4MDAwMDAwIDgwMCAxNTAwIDEiKTsKCgkJCQkvKgoJCQkJICAgZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAgMHg4MDAwMDAgMSAyCWxhbmUwLTcJbWluCgkJCQkgICBkZHJfdHVuZV9kcXNfc3RlcCAgYSAwICAweDgwMDAwMCAxIDEJbGFuZTAtNwltYXgKCgkJCQkgICBkZHJfdHVuZV9hY2xjZGxyX3N0ZXAgIGEgMCAweDgwMDAwMDAgMSAyCWxhbmUwLTEJbWluCgkJCQkgICBkZHJfdHVuZV9hY2xjZGxyX3N0ZXAgIGEgMCAweDgwMDAwMDAgMSAxCWxhbmUwLTEJbWF4CgoJCQkJICAgc2V0ZW52IGJvb3RjbWQgICJkZHJfdGVzdF9jbWQgMHgyMiBhIDAgMHg4MDAwMDAgMTggMCAweDgwMDAwMDAiCQkgd2F0Y2hkb2dfdGltZSCjrGxhbmVfZGlzYWJsZV9tYXNrLGFkZF90ZXN0X3NpemUKCQkJCSAgIHNldGVudiBlbnZfZGRydGVzdF9kYXRhX2xhbmUgIDB4MjIJyejWw8P8we6/qsq8serWvgoJCQkJICAgc2F2ZQkgd2F0Y2hkb2dfdGltZSCjrGxhbmVfZGlzYWJsZV9tYXNrLGFkZF90ZXN0X3NpemUKCQkJCSAgIGQycGxsIDEyMDAKCgkJCQkgICBzZXRlbnYgZGRyX3NvY19pb3ZyZWZfdGVzdF9kZHJfY2xrICIweDAwMDAwMDAiOwoJCQkJICAgc2V0ZW52IGRkcl9zb2NfaW92cmVmX2xlZiAiMHgwMDAwMDAwIjsKCQkJCSAgIHNldGVudiBkZHJfc29jX2lvdnJlZl9vcmcgIjB4MCI7CgkJCQkgICBzZXRlbnYgZGRyX3NvY19pb3ZyZWZfcmlnICAiMHgwMDAwMDAgIjsKCQkJCSAgIHNhdmUKCQkJCSAgIGQycGxsIDExMDQKCQkJCSAgIGRkcl90ZXN0X2NtZCAweDE5IGEgMCAweDgwMDAwICAxICA3MCAgMSAxICAweDggMCAxCgoKCgkJCQkgICDW2LLi0qq19LXno6zK/b7dtObU2nN0aWNrILzEtObG98HLCgkJCQkgICBzZXRlbnYgZGRyX2RyYW1faW92cmVmX3Rlc3RfZGRyX2NsayAiMHgwMDAwMDAwIjsKCQkJCSAgIHNldGVudiBkZHJfZHJhbV9pb3ZyZWZfbGVmICIweDAwMDAwMDAiOwoJCQkJICAgc2V0ZW52IGRkcl9kcmFtX2lvdnJlZl9vcmcgIjB4MCI7CgkJCQkgICBzZXRlbnYgZGRyX2RyYW1faW92cmVmX3JpZyAgIjB4MDAwMDAwICI7CgkJCQkgICBzZXRlbnYgIGRkcl90ZXN0X2RkcjRyYW1fdnJlZiAiZGRyX3Rlc3RfY21kIDB4MUEgYSAwIDB4MDgwMDAwICAwICA3MCAwICAwICAweDA4IDAgMCAxIgoJCQkJICAgc2V0ZW52IGJvb3RjbWQgICAicnVuIGRkcl90ZXN0X2RkcjRyYW1fdnJlZiIKCQkJCSAgIHNhdmUKCQkJCSAgILX0tefJz7XnCgkJCQkgICBkMnBsbCAxMTA0CgkJCQkgICAqLwoKCgkJCX0KCQkJd3JfcmVnKERNQ19QSFlfUkVUUkFJTklOR19DVFJMLGRtY19yZXRyYWluaW5nX2N0cmwpOwoJCQlyZXR1cm4gMTsKCgoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1RFU1QpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRydGVzdCAweDEwMDAwMDAwIDB4ODAwMDAwMCAzIiwwKTsKCQkJCS8vZGRyX3Rlc3RfY21kIDB4MSBzdGFyX2FkZCB0ZXN0X3NpemUgbG9vcHMKCQkJCS8vIGRvX2Rkcl90ZXN0KGNtZHRwLCAgZmxhZywgYXJnYzIsYXJndik7CgkJCQlkb19kZHJfdGVzdCgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwoYXJndjIpKTsKCQkJCWJyZWFrOwoJCQl9CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfVFVORV9BQ0xDRExSKToKCQkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX0REUl9UVU5FX0FDX0NMSyk6CgkJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9UVU5FX1pRKToKCQkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX0dYVFZCQl9DUk9TU1RBTEspOgoJCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfQkFORFdJRFRIX1RFU1QpOgoJCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfTENETFJfRU5WX1RVTkUpOgoJCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfTU9ESUZZX1JFR19VU0VfTUFTSyk6CgkJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9TRVRaUSk6CgkJCQlicmVhazsKCgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfVFVORV9ERFJfREFUQV9XSU5ET1dfU1RJQ0tZKToKCQkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSNF9URVNUX0RBVEFfV1JUSUVfUkVBRCk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxZSAgd3JpdGVfcmVhZCAgcGF0dGVybl9pZCBsb29wIHN0YXJ0X2FkZHIgdGVzdF9zaXplIGRlbGF5X3VzIiwwKTsKCQkJCS8vZGRyX3Rlc3RfY21kIDB4MWUgMSAyIDEwIDB4NDAwMDAwMDAgMHgxMDAwMDAwMAoJCQkJLy90aW1lcyA9MHhmZmZmZmZmZiB3aWxsIGF1dG8gbG9vcAoJCQkJcHJpbnRmKCJcbnRlc3QgZGRyIHdyaXRlIHJlYWQgIFxuIik7CgoJCQkJZG9fZGRyX3Rlc3Rfd3JpdGVfcmVhZCgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCS8vRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0cxMl9SRUNPTkZJR19DTUQKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9TRVRfVUJPT1RfRzEyX1JFQ09ORklHX0NNRCk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgzNgoJCQkJcHJpbnRmKCJcbnNldCBkb19kZHJfdWJvb3RfcmVjb25maWcgY21kXG4iKTsKCgkJCQlkb19kZHJfdWJvb3RfbmV3X2NtZCgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgoJCQljYXNlKEREUl9URVNUX0NNRF9fRElTUExBWV9HMTJfRERSX0lORk9STUFUSU9OKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDM3CgkJCQlwcmludGYoIlxuc2hvdyBnMTIgZGRyIGluZm9ybWF0aW9uXG4iKTsKCQkJCWlmIChwX2Rkcl9iYXNlLT5jaGlwX2lkID09IE1FU09OX0NQVV9NQUpPUl9JRF9DMikKCQkJCQlkb19kZHJfZGlzcGxheV9jMl9kZHJfaW5mb3JtYXRpb24oKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQkJZWxzZQoJCQkJCWRvX2Rkcl9kaXNwbGF5X2cxMl9kZHJfaW5mb3JtYXRpb24oKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9HMTJfRE1DX1RFU1QpOgoJCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfRzEyX0VFX0JETFJfVEVTVCk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgzOQoJCQkJcHJpbnRmKCJcblVib290IEJETFIgdGVzdCBcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X3B3bV9iZGxyKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQl9CgkJd3JfcmVnKERNQ19QSFlfUkVUUkFJTklOR19DVFJMLGRtY19yZXRyYWluaW5nX2N0cmwpOwoJCXJldHVybiAxOy8vdGVzdF9zdGFydF9hZGRyCgl9Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7Cgl3cl9yZWcoRE1DX1BIWV9SRVRSQUlOSU5HX0NUUkwsZG1jX3JldHJhaW5pbmdfY3RybCk7CglyZXR1cm4gMTsKCn0KVV9CT09UX0NNRCgKCWRkcl90ZXN0X2NtZCwJMzAsCTEsCWRvX2Rkcl90ZXN0X2NtZCwKCSJkZHJfdGVzdF9jbWQgY21kIGFyZzEgYXJnMiBhcmczLi4uIiwKCSJkZHJfdGVzdF9jbWQgY21kIGFyZzEgYXJnMiBhcmczLi4uIFxuIGRjYWNoZSBvZmYgPyBcbiIKCSk7CgppbnQgZG9fZGRyX2F1dG9fdGVzdF93aW5kb3coY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CmNoZWNrX2Jhc2VfYWRkcmVzcygpOwoJZ2xvYmFsX2Jvb3RfdGltZXM9cmRfcmVnKHBfZGRyX2Jhc2UtPnByZWdfc3RpY2t5X3JlZzApOwoJcHJpbnRmKCJcbmdsb2JhbF9ib290X3RpbWVzPT0gJWRcbiIsIGdsb2JhbF9ib290X3RpbWVzKTsKCglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgoJY2hhciBzdHJbMTAyNF09IiI7Cgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X2NtZD0wOwoJdW5zaWduZWQgaW50ICB0ZW1wX3JlZ19hZGQ9MDsKCXVuc2lnbmVkIGludCAgbnVtX2FycnlbMzJdPXswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9OwoKCS8vaW50IGFyZ2MyOwoJLy9jaGFyICAgICAqICBhcmd2MlszMF07CgoJdGVtcF9yZWdfYWRkPSgoKHBfZGRyX2Jhc2UtPmRkcl9kbWNfc3RpY2t5MCkpKTsKCS8vbnVtX2FycnkgPSAodWludDE2X3QgKikodWludDY0X3QgKShzdGlja3lfcmVnX2Jhc2VfYWRkKTsKCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CgkJCW51bV9hcnJ5W2ldPWRkcl9yZF84XzE2Yml0X29uXzMycmVnKHRlbXBfcmVnX2FkZCw4LGkpOwoJCQlpZiAoKGkgPT0gMCkgfHwgKGkgPT0gMTYpKSB7CgkJCQlwcmludGYoIlxuIG51bWFycnlbJWRdIiAsaSk7CgkJCX0KCQlwcmludGYoIiAlZCAiLG51bV9hcnJ5W2ldKTsKCX0KCglkZHJfdGVzdF9jbWQ9bnVtX2FycnlbMF07CgoJdW5zaWduZWQgaW50ICAgY3MwX3Rlc3Rfc3RhcnQ9IDB4MTA4MDAwMDsKCXVuc2lnbmVkIGludCAgIGNzMF90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCXVuc2lnbmVkIGludCAgIGNzMV90ZXN0X3N0YXJ0PSAwOwoJdW5zaWduZWQgaW50ICAgY3MxX3Rlc3Rfc2l6ZT0gMDsKCXVuc2lnbmVkIGludCAgIHdhdGNoZG9nX3RpbWVfcz0wOwoJdW5zaWduZWQgaW50ICAgdGVzdF9pbmRleF9lbmFibGU9MDsKCXVuc2lnbmVkIGludCBhbGxfdG9naHRlcl9lbmFibGU9MDsKCS8vdW5zaWduZWQgaW50ICAgbmliYmxlX21hc2tbM109ezAsMCwwfTsKCWNzMF90ZXN0X3N0YXJ0PSgobnVtX2FycnlbVEVTVF9BUkdfQ1MwX1RFU1RfU1RBUlRfSU5ERVhdKXwoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMF9URVNUX1NUQVJUX0lOREVYKzFdKTw8OCl8CgkJKChudW1fYXJyeVtURVNUX0FSR19DUzBfVEVTVF9TVEFSVF9JTkRFWCsyXSk8PDE2KXwoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMF9URVNUX1NUQVJUX0lOREVYKzNdKTw8MjQpKTsKCWNzMF90ZXN0X3NpemU9KChudW1fYXJyeVtURVNUX0FSR19DUzBfVEVTVF9TSVpFX0lOREVYXSl8KChudW1fYXJyeVtURVNUX0FSR19DUzBfVEVTVF9TSVpFX0lOREVYKzFdKTw8OCl8CgkJKChudW1fYXJyeVtURVNUX0FSR19DUzBfVEVTVF9TSVpFX0lOREVYKzJdKTw8MTYpfCgobnVtX2FycnlbVEVTVF9BUkdfQ1MwX1RFU1RfU0laRV9JTkRFWCszXSk8PDI0KSk7CgljczFfdGVzdF9zdGFydD0oKG51bV9hcnJ5W1RFU1RfQVJHX0NTMV9URVNUX1NUQVJUX0lOREVYXSl8KChudW1fYXJyeVtURVNUX0FSR19DUzFfVEVTVF9TVEFSVF9JTkRFWCsxXSk8PDgpfAoJCSgobnVtX2FycnlbVEVTVF9BUkdfQ1MxX1RFU1RfU1RBUlRfSU5ERVgrMl0pPDwxNil8KChudW1fYXJyeVtURVNUX0FSR19DUzFfVEVTVF9TVEFSVF9JTkRFWCszXSk8PDI0KSk7CgljczFfdGVzdF9zaXplPSgobnVtX2FycnlbVEVTVF9BUkdfQ1MxX1RFU1RfU0laRV9JTkRFWF0pfCgobnVtX2FycnlbVEVTVF9BUkdfQ1MxX1RFU1RfU0laRV9JTkRFWCsxXSk8PDgpfAoJCSgobnVtX2FycnlbVEVTVF9BUkdfQ1MxX1RFU1RfU0laRV9JTkRFWCsyXSk8PDE2KXwoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMV9URVNUX1NJWkVfSU5ERVgrM10pPDwyNCkpOwoJd2F0Y2hkb2dfdGltZV9zPSgobnVtX2FycnlbVEVTVF9BUkdfV0FUQ0hET0dfVElNRV9TSVpFX0lOREVYXSl8KChudW1fYXJyeVtURVNUX0FSR19XQVRDSERPR19USU1FX1NJWkVfSU5ERVgrMV0pPDw4KSk7Cgl0ZXN0X2luZGV4X2VuYWJsZT0oKG51bV9hcnJ5W1RFU1RfQVJHX1RFU1RfSU5ERVhfRU5BTEJFX0lOREVYXSl8KChudW1fYXJyeVtURVNUX0FSR19URVNUX0lOREVYX0VOQUxCRV9JTkRFWCsxXSk8PDgpKTsKCWFsbF90b2dodGVyX2VuYWJsZT0obnVtX2FycnlbVEVTVF9BUkdfM19BTExfVE9HSFRFUl0pOwoJc3dpdGNoIChkZHJfdGVzdF9jbWQpCgl7CgkJY2FzZShETUNfU1RJQ0tZX1VCT09UX1dJTkRPV19NQUdJQ18xKToKCQlpZiAobnVtX2FycnlbMV0gPT0gRE1DX1NUSUNLWV9VQk9PVF9XSU5ET1dfTUFHSUNfMSkKCQl7CgkJCS8vYXJnYzI9MTA7CgkJCXNwcmludGYoc3RyLCJkZHJfdGVzdF9jbWQgMHgyNyAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eCBcCgkJCTB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4ICAweCUwOHgiLGNzMF90ZXN0X3N0YXJ0LGNzMF90ZXN0X3NpemUsY3MxX3Rlc3Rfc3RhcnQsY3MxX3Rlc3Rfc2l6ZSwKCQkJd2F0Y2hkb2dfdGltZV9zLHRlc3RfaW5kZXhfZW5hYmxlLDAsMCwwLDAsMCwwLGFsbF90b2dodGVyX2VuYWJsZQkpOwoJCQkvLwlmb3IgKGkgPSAxO2k8KGFyZ2MyKTtpKyspCgkJCS8vCXsKCQkJLy8JYXJndjJbaV09KGFyZ1tpXSk7CgkJCS8vCXNwcmludGYoc3RyLCIgMHglMDh4ICIsKGFyZ1tpXSkpOwoJCQkvLwl9CgoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgoJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCS8vIGRkcl90ZXN0X2NtZCgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwoYXJndjIpKTsKCQkJYnJlYWs7CgkJfQoJfQoKCXJldHVybiAxOwp9ClVfQk9PVF9DTUQoCglkZHJfYXV0b190ZXN0X3dpbmRvdywJMzAsCTEsCWRvX2Rkcl9hdXRvX3Rlc3Rfd2luZG93LAoJImRkcl90ZXN0X2NtZCBjbWQgYXJnMSBhcmcyIGFyZzMuLi4iLAoJImRkcl90ZXN0X2NtZCBjbWQgYXJnMSBhcmcyIGFyZzMuLi4gXG4gZGNhY2hlIG9mZiA/IFxuIgoJKTsKCmludCBkb19kZHJfYXV0b19zY2FuX2RydihjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCWNoZWNrX2Jhc2VfYWRkcmVzcygpOwoJLy8gZGRyX3R5cGUgMiBscGRkcjQgICByYW5rX2NvbmZpZwoJI2RlZmluZSAgQVVUT19TQ0FOX0REUjMgIDAKCSNkZWZpbmUgIEFVVE9fU0NBTl9ERFI0ICAxCgkjZGVmaW5lICBBVVRPX1NDQU5fTFBERFIzICAyCgkjZGVmaW5lICBBVVRPX1NDQU5fTFBERFI0ICAzCgoJI2RlZmluZSAgQVVUT19TQ0FOX0NPTkZJR19SQU5LMCAgMAoJI2RlZmluZSAgQVVUT19TQ0FOX0NPTkZJR19SQU5LMDEgIDEKCgljaGFyICpzdHJpbmdfcHJpbnRfZmxhZz0gICAiIHdpbmRvdy1sb29wIFxuIjsKCWdsb2JhbF9ib290X3RpbWVzPXJkX3JlZygocF9kZHJfYmFzZS0+cHJlZ19zdGlja3lfcmVnMCkpOwoKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWludCBpIDsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCgl1bnNpZ25lZCBpbnQgIGRkcl90eXBlPTA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9jaGFubmVsX3JhbmtfY29uZmlnPTA7Cgl1bnNpZ25lZCBpbnQgIGxvb3A9MDsKCWNoYXIgKmVuZHA7CglpZiAoYXJnYz4xKQoJewoJCWRkcl90eXBlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJZGRyX3R5cGU9MDsKCX0KCWlmIChhcmdjPjIpCgl7CgkJZGRyX2NoYW5uZWxfcmFua19jb25maWcgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlkZHJfY2hhbm5lbF9yYW5rX2NvbmZpZz0wOwoJfQppZiAoYXJnYz4zKQoJewoJCWxvb3AgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlsb29wPTA7Cgl9Cgl1bnNpZ25lZCBpbnQgIHRlbXBfcmVnX2FkZD0wOwoJewoJCXRlbXBfcmVnX2FkZD0oKChwX2Rkcl9iYXNlLT5kZHJfZG1jX3N0aWNreTApKSk7Cgl9CgoJY2hhciBzdHJbMTAyNF09IiI7CgkvLyB1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X2NtZD0wOwoJLy8gdW5zaWduZWQgaW50ICB0ZW1wX3JlZ19hZGQ9MDsKCS8vIHVuc2lnbmVkIGludCAgbnVtX2FycnlbMzJdPXswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9OwoKCXVuc2lnbmVkIGludCBjb3VudGVyX2xvb3A9MDsKCXVuc2lnbmVkIGludCBkZHJfZnJlcXVlbmN5PTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfZHJ2X29obV9wPTA7Ly83NCAgLy9jb25maWcgc29jIGRhdGEgcGluIHB1bGwgdXAgZHJpdmVyIHN0ZW5ndGgsc2VsZWN0IDAsMjgsMzAsMzIsMzQsMzcsNDAsNDMsNDgsNTMsNjAsNjgsODAsOTYsMTIwb2htCgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfZHJ2X29obV9uPTA7Ly83NgoJdW5zaWduZWQgaW50IHNvY19kYXRhX29kdF9vaG1fcD0wOy8vNzggIC8vY29uZmlnIHNvYyBkYXRhIHBpbiBvZHQgcHVsbCB1cCBzdGVuZ3RoLHNlbGVjdCAwLDI4LDMwLDMyLDM0LDM3LDQwLDQzLDQ4LDUzLDYwLDY4LDgwLDk2LDEyMG9obQoJdW5zaWduZWQgaW50IHNvY19kYXRhX29kdF9vaG1fbj0wOy8vODAKCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfZHJ2X29obT0wOy8vODIgIC8vY29uZmlnIGRyYW0gZGF0YSBwaW4gcHVsbCB1cCBwdWxsIGRvd24gZHJpdmVyIHN0ZW5ndGgsZGRyMyBzZWxlY3QgMzQsNDBvaG0sZGRyNCBzZWxlY3QgMzQsNDhvaG0sbHBkZHI0IHNlbGVjdCA0MCw0OCw2MCw4MCwxMjAsMjQwb2htCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX29kdF9vaG09MDsvLzg0ICAvL2NvbmZpZyBkcmFtIGRhdGEgcGluIG9kdCBwdWxsIHVwIGRvd24gc3Rlbmd0aCxkZHIzIHNlbGVjdCA0MCw2MCwxMjBvaG0sZGRyNCBzZWxlY3QgMzQsNDAsNDgsNjAsMTIwLDI0MG9obSxscGRkcjQgc2VsZWN0IDQwLDQ4LDYwLDgwLDEyMCwyNDBvaG0KCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfd3Jfb2R0X29obT0wOyAvLzE3NCBjaGFyIDEKCWk9NzQvMjsKCXNvY19kYXRhX2Rydl9vaG1fcD1kZHJfcmRfOF8xNmJpdF9vbl8zMnJlZyh0ZW1wX3JlZ19hZGQsMTYsaSk7CglpPTc2LzI7Cglzb2NfZGF0YV9kcnZfb2htX249ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodGVtcF9yZWdfYWRkLDE2LGkpOwoJaT03OC8yOwoJc29jX2RhdGFfb2R0X29obV9wPWRkcl9yZF84XzE2Yml0X29uXzMycmVnKHRlbXBfcmVnX2FkZCwxNixpKTsKCWk9ODAvMjsKCXNvY19kYXRhX29kdF9vaG1fbj1kZHJfcmRfOF8xNmJpdF9vbl8zMnJlZyh0ZW1wX3JlZ19hZGQsMTYsaSk7CglpPTgyLzI7CglkcmFtX2RhdGFfZHJ2X29obT1kZHJfcmRfOF8xNmJpdF9vbl8zMnJlZyh0ZW1wX3JlZ19hZGQsMTYsaSk7CglpPTg0LzI7CglkcmFtX2RhdGFfb2R0X29obT1kZHJfcmRfOF8xNmJpdF9vbl8zMnJlZyh0ZW1wX3JlZ19hZGQsMTYsaSk7CglpPTE3NC8xOwoJZHJhbV9kYXRhX3dyX29kdF9vaG09ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodGVtcF9yZWdfYWRkLDgsaSk7CglpPTUyLzI7CglkZHJfZnJlcXVlbmN5PWRkcl9yZF84XzE2Yml0X29uXzMycmVnKHRlbXBfcmVnX2FkZCwxNixpKTsKCS8vZGRyX2ZyZXF1ZW5jeT1nbG9iYWxfZGRyX2NsazsKCWlmIChnbG9iYWxfYm9vdF90aW1lcyA9PSAxKQoJewoJCXByaW50ZigiXG5vcmdfZ2xvYmFsX2Jvb3RfdGltZXM9PSAlZCAlcyIsIGdsb2JhbF9ib290X3RpbWVzLHN0cmluZ19wcmludF9mbGFnKTsKCQkvL3ByaW50ZigiXG5tYXhfY291bnRlcj0lZCAgJWQgJXMiLG1heF9jb3VudGVyX3RvdGFsLG1heF9jb3VudGVyX3RvdGFsKjIsc3RyaW5nX3ByaW50X2ZsYWcpOwoJCXByaW50ZigiXG5zb2NfZGF0YV9kcnZfb2htX3A9JWQgJXMiLHNvY19kYXRhX2Rydl9vaG1fcCxzdHJpbmdfcHJpbnRfZmxhZyk7CgkJcHJpbnRmKCJcbnNvY19kYXRhX2Rydl9vaG1fbj0lZCAlcyIsc29jX2RhdGFfZHJ2X29obV9uLHN0cmluZ19wcmludF9mbGFnKTsKCQlwcmludGYoIlxuc29jX2RhdGFfb2R0X29obV9wPSVkICVzIixzb2NfZGF0YV9vZHRfb2htX3Asc3RyaW5nX3ByaW50X2ZsYWcpOwoJCXByaW50ZigiXG5zb2NfZGF0YV9vZHRfb2htX249JWQgJXMiLHNvY19kYXRhX29kdF9vaG1fbixzdHJpbmdfcHJpbnRfZmxhZyk7CgkJcHJpbnRmKCJcbmRyYW1fZGF0YV9kcnZfb2htPSVkICVzIixkcmFtX2RhdGFfZHJ2X29obSxzdHJpbmdfcHJpbnRfZmxhZyk7CgkJcHJpbnRmKCJcbmRyYW1fZGF0YV9vZHRfb2htPSVkICVzIixkcmFtX2RhdGFfb2R0X29obSxzdHJpbmdfcHJpbnRfZmxhZyk7CgkJcHJpbnRmKCJcbmRyYW1fZGF0YV93cl9vZHRfb2htPSVkICVzIixkcmFtX2RhdGFfd3Jfb2R0X29obSxzdHJpbmdfcHJpbnRfZmxhZyk7Cgl9Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfZHJ2X29obV9wX3RbXT17MzQsNDAsNDgsNjB9OwoJLy8gdW5zaWduZWQgaW50IHNvY19kYXRhX2Rydl9vaG1fbl90W109ezM0LDQwLDQ4LDYwfTsKCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX29kdF9vaG1fdF9kZHIzW109ezQwLDYwLDEyMH07CS8vZGRyMwoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV9vZHRfb2htX3RfZGRyNFtdPXs0MCw0OCw2MCwxMjB9OwkvL2RkcjQKCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfb2R0X29obV90X2xwZGRyNFtdPXs0MCw0OCw2MCwxMjB9OwkvL2xwZGRyNAoKCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfZHJ2X29obV90X2RkcjNbXT17MzQsNDB9OwkvL2RkcjMKCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfZHJ2X29obV90X2RkcjRbXT17MzQsNDh9OwkvL2RkcjQKCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfZHJ2X29obV90X2xwZGRyNFtdPXs0MCw0OCw2MH07CS8vbHBkZHI0CgoJdW5zaWduZWQgaW50IHNvY19kYXRhX29kdF9vaG1fcF90W109ezQwLDQ4LDYwLDgwLDEyMH07Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfb2R0X29obV9uX3RbXT17NDAsNDgsNjAsODAsMTIwfTsKCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9kZHIzW109ezYwLDEyMCwwfTsJLy9kZHIzCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9kZHI0W109ezgwLDEyMCwwfTsJLy9kZHI0CgoJdW5zaWduZWQgaW50ICAqcF9zb2NfZGF0YV9kcnZfb2htX3A9TlVMTDsKCS8vICB1bnNpZ25lZCBpbnQgICpwX3NvY19kYXRhX2Rydl9vaG1fbj1OVUxMOwoJdW5zaWduZWQgaW50ICAqcF9zb2NfZGF0YV9vZHRfb2htX3A9TlVMTDsKCXVuc2lnbmVkIGludCAgKnBfc29jX2RhdGFfb2R0X29obV9uPU5VTEw7CgoKCXVuc2lnbmVkIGludCAgKnBfZHJhbV9kYXRhX2Rydl9vaG09TlVMTDsKCXVuc2lnbmVkIGludCAgKnBfZHJhbV9kYXRhX29kdF9vaG09TlVMTDsKCXVuc2lnbmVkIGludCAgKnBfZHJhbV9kYXRhX3dyX29kdF9vaG09TlVMTDsKCglwX3NvY19kYXRhX2Rydl9vaG1fcD1zb2NfZGF0YV9kcnZfb2htX3BfdDsKCS8vIHBfc29jX2RhdGFfZHJ2X29obV9uPXNvY19kYXRhX2Rydl9vaG1fbl90OwoJcF9zb2NfZGF0YV9vZHRfb2htX3A9c29jX2RhdGFfb2R0X29obV9wX3Q7CglwX3NvY19kYXRhX29kdF9vaG1fbj1zb2NfZGF0YV9vZHRfb2htX25fdDsKCgoJcF9kcmFtX2RhdGFfZHJ2X29obT1kcmFtX2RhdGFfZHJ2X29obV90X2RkcjM7CglwX2RyYW1fZGF0YV9vZHRfb2htPWRyYW1fZGF0YV9vZHRfb2htX3RfZGRyMzsKCXBfZHJhbV9kYXRhX3dyX29kdF9vaG09ZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9kZHIzOwoKCXVuc2lnbmVkIGludCBtYXhfY291bnRlcl9sb29wX3cxPShzaXplb2Yoc29jX2RhdGFfZHJ2X29obV9wX3QpKS8oc2l6ZW9mKHNvY19kYXRhX2Rydl9vaG1fcF90WzBdKSk7Cgl1bnNpZ25lZCBpbnQgbWF4X2NvdW50ZXJfbG9vcF93Mj0oc2l6ZW9mKGRyYW1fZGF0YV9vZHRfb2htX3RfZGRyMykpLyhzaXplb2YoZHJhbV9kYXRhX29kdF9vaG1fdF9kZHIzWzBdKSk7Cgl1bnNpZ25lZCBpbnQgbWF4X2NvdW50ZXJfbG9vcF9yMT0oc2l6ZW9mKGRyYW1fZGF0YV9kcnZfb2htX3RfZGRyMykpLyhzaXplb2YoZHJhbV9kYXRhX2Rydl9vaG1fdF9kZHIzWzBdKSk7Cgl1bnNpZ25lZCBpbnQgbWF4X2NvdW50ZXJfbG9vcF9yMj0oc2l6ZW9mKHNvY19kYXRhX29kdF9vaG1fcF90KSkvKHNpemVvZihzb2NfZGF0YV9vZHRfb2htX3BfdFswXSkpOwoJdW5zaWduZWQgaW50IG1heF9jb3VudGVyX2xvb3Bfd3IxPTE7CglpZiAoZGRyX2NoYW5uZWxfcmFua19jb25maWcpCgl7CgkJbWF4X2NvdW50ZXJfbG9vcF93cjE9KHNpemVvZihkcmFtX2RhdGFfd3Jfb2R0X29obV90X2RkcjMpKS8oc2l6ZW9mKGRyYW1fZGF0YV93cl9vZHRfb2htX3RfZGRyM1swXSkpOwoJfQoJLy9kZHJfY2hhbm5lbF9yYW5rX2NvbmZpZ0NPTkZJR19ERFIwXzMyQklUX1JBTkswMV9DSDAKCWlmIChkZHJfdHlwZSA9PSBBVVRPX1NDQU5fRERSNCkKCXsKCQlwX2RyYW1fZGF0YV9kcnZfb2htPWRyYW1fZGF0YV9kcnZfb2htX3RfZGRyNDsKCQlwX2RyYW1fZGF0YV9vZHRfb2htPWRyYW1fZGF0YV9vZHRfb2htX3RfZGRyNDsKCQlwX2RyYW1fZGF0YV93cl9vZHRfb2htPWRyYW1fZGF0YV93cl9vZHRfb2htX3RfZGRyNDsKCQltYXhfY291bnRlcl9sb29wX3cyPShzaXplb2YoZHJhbV9kYXRhX29kdF9vaG1fdF9kZHI0KSkvKHNpemVvZihkcmFtX2RhdGFfb2R0X29obV90X2RkcjRbMF0pKTsKCQltYXhfY291bnRlcl9sb29wX3IxPShzaXplb2YoZHJhbV9kYXRhX2Rydl9vaG1fdF9kZHI0KSkvKHNpemVvZihkcmFtX2RhdGFfZHJ2X29obV90X2RkcjRbMF0pKTsKCgkJaWYgKGRkcl9jaGFubmVsX3JhbmtfY29uZmlnKQoJCXsKCQkJbWF4X2NvdW50ZXJfbG9vcF93cjE9KHNpemVvZihkcmFtX2RhdGFfd3Jfb2R0X29obV90X2RkcjQpKS8oc2l6ZW9mKGRyYW1fZGF0YV93cl9vZHRfb2htX3RfZGRyNFswXSkpOwoJCX0KCX0KCWlmIChkZHJfdHlwZSA9PSBBVVRPX1NDQU5fTFBERFI0KQoJewoJCXBfZHJhbV9kYXRhX2Rydl9vaG09ZHJhbV9kYXRhX2Rydl9vaG1fdF9scGRkcjQ7CgkJcF9kcmFtX2RhdGFfb2R0X29obT1kcmFtX2RhdGFfb2R0X29obV90X2xwZGRyNDsKCQkvLwlwX2RyYW1fZGF0YV93cl9vZHRfb2htPWRyYW1fZGF0YV93cl9vZHRfb2htX3RfbHBkZHI0OwoJCW1heF9jb3VudGVyX2xvb3BfdzI9KHNpemVvZihkcmFtX2RhdGFfb2R0X29obV90X2xwZGRyNCkpLyhzaXplb2YoZHJhbV9kYXRhX29kdF9vaG1fdF9scGRkcjRbMF0pKTsKCQltYXhfY291bnRlcl9sb29wX3IxPShzaXplb2YoZHJhbV9kYXRhX2Rydl9vaG1fdF9scGRkcjQpKS8oc2l6ZW9mKGRyYW1fZGF0YV9kcnZfb2htX3RfbHBkZHI0WzBdKSk7CgkJbWF4X2NvdW50ZXJfbG9vcF9yMj0oc2l6ZW9mKHNvY19kYXRhX29kdF9vaG1fbl90KSkvKHNpemVvZihzb2NfZGF0YV9vZHRfb2htX25fdFswXSkpOwoKCQkvLwl1bnNpZ25lZCBpbnQgICpwX2RyYW1fZGF0YV93cl9vZHRfb2htPWRyYW1fZGF0YV93cl9vZHRfb2htX3RfbHBkZHI0OwoJCWlmIChkZHJfY2hhbm5lbF9yYW5rX2NvbmZpZykKCQl7CgkJCW1heF9jb3VudGVyX2xvb3Bfd3IxPTE7CgkJfQoJfQoKdW5zaWduZWQgaW50IG1heF9jb3VudGVyX3RvdGFsPShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzIpKm1heF9jb3VudGVyX2xvb3Bfd3IxOwoJLy9hZGQgMiB0aW1lcyByZWNvdmVyCgkvKgoJc3dpdGNoIChnbG9iYWxfYm9vdF90aW1lcykKCXsKCQljYXNlKDEpOgoJCXsKCQkJYnJlYWs7CgkJfQoJfQoJKi8KCS8vZWFjaCBhcnJhcnkgdGVzdCAyIHRpbWVzICxmb3IgbWF5YmUgMXRpbWVzIHdpbGwgZmFpbCx0aGVuIG5leHQgdGltZSB3aWxsIHJlY292ZXJ5IC8vamlheGluZyAyMDE4MTExNAoJY291bnRlcl9sb29wPSgoKGdsb2JhbF9ib290X3RpbWVzLTEpLzIpJW1heF9jb3VudGVyX3RvdGFsKTsKCWRyYW1fZGF0YV93cl9vZHRfb2htPTA7CglpZiAobWF4X2NvdW50ZXJfbG9vcF93cjE+MSkKCXsKCQlkcmFtX2RhdGFfd3Jfb2R0X29obT1wX2RyYW1fZGF0YV93cl9vZHRfb2htWyhjb3VudGVyX2xvb3AvKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikpXTsKCX0KCWlmICgoY291bnRlcl9sb29wJShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzIpKTwobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyKSkKCXsKCQlzb2NfZGF0YV9kcnZfb2htX3A9cF9zb2NfZGF0YV9kcnZfb2htX3BbKCgoY291bnRlcl9sb29wJShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzIpKSklbWF4X2NvdW50ZXJfbG9vcF93MSldOwoJCXNvY19kYXRhX2Rydl9vaG1fbj1zb2NfZGF0YV9kcnZfb2htX3A7CgkJZHJhbV9kYXRhX29kdF9vaG09cF9kcmFtX2RhdGFfb2R0X29obVsgICgoKGNvdW50ZXJfbG9vcCUobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSkpL21heF9jb3VudGVyX2xvb3BfdzEpXTsKCX0KCWVsc2UgaWYoKGNvdW50ZXJfbG9vcCUobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSk9PSgobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyKSswKSkKCXsKCQlkZHJfdGVzdF93YXRjaGRvZ19yZXNldF9zeXN0ZW0oKTsKCQkvLwlzcHJpbnRmKHN0ciwiZzEyX2QycGxsIDEyMDAgIDB4MTEgIDB4NiAwIDB4MCAwIDAgMCAweDgwMDAwMCAgICAwIDEgICAiCgkJLy8JcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCS8vCXJ1bl9jb21tYW5kKHN0ciwwKTsKCX0KCWVsc2UgaWYoKGNvdW50ZXJfbG9vcCUobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSk8KG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMi0xKSkKCXsKCQlkcmFtX2RhdGFfZHJ2X29obT1wX2RyYW1fZGF0YV9kcnZfb2htWygoKChjb3VudGVyX2xvb3AlKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikpKS0obWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyKzEpKSVtYXhfY291bnRlcl9sb29wX3IxKV07CgkJc29jX2RhdGFfb2R0X29obV9wPXBfc29jX2RhdGFfb2R0X29obV9wWygoKChjb3VudGVyX2xvb3AlKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikpKS0obWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyKzEpKS9tYXhfY291bnRlcl9sb29wX3IxKV07CgkJc29jX2RhdGFfb2R0X29obV9uPTA7CgkJaWYgKGRkcl90eXBlID09IENPTkZJR19ERFJfVFlQRV9MUEREUjQpCgkJewoJCQlzb2NfZGF0YV9vZHRfb2htX3A9MDsKCQkJc29jX2RhdGFfb2R0X29obV9uPXBfc29jX2RhdGFfb2R0X29obV9uWygoKChjb3VudGVyX2xvb3AlKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikpKS0obWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyKzEpKS9tYXhfY291bnRlcl9sb29wX3IxKV07CgkJfQoJfQoJZWxzZSBpZigoY291bnRlcl9sb29wJShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzIpKT09KG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMi0xKSkKCXsKCQlkZHJfdGVzdF93YXRjaGRvZ19yZXNldF9zeXN0ZW0oKTsKCX0KCXByaW50ZigiXG5nbG9iYWxfYm9vdF90aW1lcz09ICVkICVzIiwgZ2xvYmFsX2Jvb3RfdGltZXMsc3RyaW5nX3ByaW50X2ZsYWcpOwoJaWYgKGxvb3ApCgl7CgkJaWYgKCgoZ2xvYmFsX2Jvb3RfdGltZXMtMSkvMik+bWF4X2NvdW50ZXJfdG90YWwpCgkJCXJldHVybiAxOwoJfQoJcHJpbnRmKCJcbm1heF9jb3VudGVyPSVkICAlZCAlcyIsbWF4X2NvdW50ZXJfdG90YWwsbWF4X2NvdW50ZXJfdG90YWwqMixzdHJpbmdfcHJpbnRfZmxhZyk7CglwcmludGYoIlxuc29jX2RhdGFfZHJ2X29obV9wPSVkICVzIixzb2NfZGF0YV9kcnZfb2htX3Asc3RyaW5nX3ByaW50X2ZsYWcpOwoJcHJpbnRmKCJcbnNvY19kYXRhX2Rydl9vaG1fbj0lZCAlcyIsc29jX2RhdGFfZHJ2X29obV9uLHN0cmluZ19wcmludF9mbGFnKTsKCXByaW50ZigiXG5zb2NfZGF0YV9vZHRfb2htX3A9JWQgJXMiLHNvY19kYXRhX29kdF9vaG1fcCxzdHJpbmdfcHJpbnRfZmxhZyk7CglwcmludGYoIlxuc29jX2RhdGFfb2R0X29obV9uPSVkICVzIixzb2NfZGF0YV9vZHRfb2htX24sc3RyaW5nX3ByaW50X2ZsYWcpOwoJcHJpbnRmKCJcbmRyYW1fZGF0YV9kcnZfb2htPSVkICVzIixkcmFtX2RhdGFfZHJ2X29obSxzdHJpbmdfcHJpbnRfZmxhZyk7CglwcmludGYoIlxuZHJhbV9kYXRhX29kdF9vaG09JWQgJXMiLGRyYW1fZGF0YV9vZHRfb2htLHN0cmluZ19wcmludF9mbGFnKTsKCXByaW50ZigiXG5kcmFtX2RhdGFfd3Jfb2R0X29obT0lZCAlcyIsZHJhbV9kYXRhX3dyX29kdF9vaG0sc3RyaW5nX3ByaW50X2ZsYWcpOwp7CglpZiAoc29jX2RhdGFfZHJ2X29obV9wKQoJewoJCXNwcmludGYoc3RyLCJkZHJfdGVzdF9jbWQgMHgzNiAweDIwMTgwMDMwIDB4MSA3NCAlZCAyICAwICAgIiwKCQlzb2NfZGF0YV9kcnZfb2htX3ApOwoJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQlydW5fY29tbWFuZChzdHIsMCk7Cgl9CglpZiAoc29jX2RhdGFfZHJ2X29obV9uKQoJewoJCXNwcmludGYoc3RyLCJkZHJfdGVzdF9jbWQgMHgzNiAweDIwMTgwMDMwIDB4MSA3NiAlZCAyICAwICAgIiwKCQlzb2NfZGF0YV9kcnZfb2htX24pOwoJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQlydW5fY29tbWFuZChzdHIsMCk7Cgl9CglpZiAoc29jX2RhdGFfb2R0X29obV9wKQoJewoJCXNwcmludGYoc3RyLCJkZHJfdGVzdF9jbWQgMHgzNiAweDIwMTgwMDMwIDB4MSA3OCAlZCAyICAwICAgIiwKCQlzb2NfZGF0YV9vZHRfb2htX3ApOwoJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQlydW5fY29tbWFuZChzdHIsMCk7Cgl9CglpZiAoc29jX2RhdGFfb2R0X29obV9uKQoJewoJCXNwcmludGYoc3RyLCJkZHJfdGVzdF9jbWQgMHgzNiAweDIwMTgwMDMwIDB4MSA4MCAlZCAyICAwICAgIiwKCQlzb2NfZGF0YV9vZHRfb2htX24pOwoJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQlydW5fY29tbWFuZChzdHIsMCk7Cgl9CglpZiAoZHJhbV9kYXRhX2Rydl9vaG0pCgl7CgkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIDgyICVkIDIgIDAgICAiLAoJCWRyYW1fZGF0YV9kcnZfb2htKTsKCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJfQoJaWYgKGRyYW1fZGF0YV9vZHRfb2htKQoJewoJCXNwcmludGYoc3RyLCJkZHJfdGVzdF9jbWQgMHgzNiAweDIwMTgwMDMwIDB4MSA4NCAlZCAyICAwICAgIiwKCQlkcmFtX2RhdGFfb2R0X29obSk7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCX0KCS8vaWYoZHJhbV9kYXRhX3dyX29kdF9vaG0pCgl7CgkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIDE3NCAlZCAxICAwICAgIiwKCQlkcmFtX2RhdGFfd3Jfb2R0X29obSk7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCX0KCglzcHJpbnRmKHN0ciwiZzEyX2QycGxsICVkICAweDEyICAweDYgMCAweDAgMCAwIDAgMHg4MDAwMDAgICAgMCAxICAgIixkZHJfZnJlcXVlbmN5KTsKCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCXJ1bl9jb21tYW5kKHN0ciwwKTsKfQoKcmV0dXJuIDE7Cn0KCnVuc2lnbmVkIGNoYXIgdGVtcF9zaGEyW1NIQTI1Nl9TVU1fTEVOXTsKaW50IGRvX3ZlcmlmeV9mbGFzaF9kZHJfcGFyYW1ldGVyKGNoYXIgbG9nX2xldmVsKQp7CgoJdW5zaWduZWQgY291bnQ9MDsKCXVuc2lnbmVkIGVycm9yPTA7CgkvL2RjYWNoZV9kaXNhYmxlKCk7CgljaGFyIHRlbXBfYnVmWygoc2l6ZW9mKGRkcl9zaGFfdCkrNTExKS81MTIpKjUxMl09ezB9OwoJI2lmZGVmIFVTRV9GT1JfVUJPT1RfMjAxOAoJZXh0ZXJuCWludCBzdG9yZV9yc3ZfcmVhZChjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc2l6ZSwgdm9pZCAqYnVmKTsKCS8vc3RvcmVfcnN2X3JlYWQoImRkci1wYXJhbWV0ZXIiLCgoc2l6ZW9mKGRkcl9zaGFfdCkrNTExKS81MTIpKjUxMiwodWludDhfdCAqKSgmZGRyX3NoYSkpOwoJc3RvcmVfcnN2X3JlYWQoImRkci1wYXJhbWV0ZXIiLCgoc2l6ZW9mKGRkcl9zaGFfdCkrNTExKS81MTIpKjUxMiwodWludDhfdCAqKSh0ZW1wX2J1ZikpOwoJLy9zcHJpbnRmKHN0ciwic3RvcmUgcnN2IHdyaXRlIGRkci1wYXJhbWV0ZXIgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLVNIQTI1Nl9TVU1fTEVOLGRkcl9zZXRfc2l6ZStTSEEyNTZfU1VNX0xFTitNRVNPTl9DUFVfQ0hJUF9JRF9TSVpFKTsKCgkjZWxzZQoJZXh0ZXJuIGludCBzdG9yZV9kZHJfcGFyYW1ldGVyX3JlYWQodWludDhfdCAqYnVmZmVyLCAgIHVpbnQzMl90IGxlbmd0aCk7CgkvL3N0b3JlX2Rkcl9wYXJhbWV0ZXJfcmVhZCgodWludDhfdCAqKSgmZGRyX3NoYSksKChzaXplb2YoZGRyX3NoYV90KSs1MTEpLzUxMikqNTEyKTsKCXN0b3JlX2Rkcl9wYXJhbWV0ZXJfcmVhZCgodWludDhfdCAqKSh0ZW1wX2J1ZiksKChzaXplb2YoZGRyX3NoYV90KSs1MTEpLzUxMikqNTEyKTsKCSNlbmRpZgoJY2hhciAqcyA9IHRlbXBfYnVmOwoJY2hhciAqZCA9KGNoYXIgKikgKCZkZHJfc2hhKTsKCWZvciAoY291bnQ9MDtjb3VudDxzaXplb2YoZGRyX3NoYV90KTtjb3VudCsrKQoJewoJCSpkPSpzOwoJCXMrKzsKCQlkKys7Cgl9Cglmb3IgKGNvdW50PTA7Y291bnQ8U0hBMjU2X1NVTV9MRU47Y291bnQrKykKCXsKCQkoKHRlbXBfc2hhMltjb3VudF0pPShkZHJfc2hhLnNoYTJbY291bnRdKSk7Cgl9CglzaGEyNTZfY3N1bV93ZF9pbnRlcm5hbCgodWludDhfdCAqKSgmKGRkcl9zaGEuZGRycykpLCBzaXplb2YoZGRyX3NldF90KSxkZHJfc2hhLnNoYTIsIDApOwoJLy9zaGEyNTZfY3N1bV93ZF9pbnRlcm5hbCgodWludDhfdCAqKSgmKGRkcl9zaGEuZGRycykpLCBzaXplb2YoZGRyX3NldF90KSxkZHJfc2hhLnNoYTIsIDApOwoJI2lmIDAKCXByaW50ZigidmVyaWZ5IHJlYWRcbiIpOwoJY2hhciBzdHJbMTAyNF09IiI7CglzcHJpbnRmKHN0ciwibWQgJTA4eCAweDEwMCIsICh1aW50MzJfdCkodWludDY0X3QpKCZkZHJfc2hhKSk7CglydW5fY29tbWFuZChzdHIsMCk7CglwcmludGYoInZlcmlmeSAoZGRyX3NoYS0+ZGRycylcbiIpOwoJc3ByaW50ZihzdHIsIm1kICUwOHggMHgxMDAiLCAodWludDMyX3QpKHVpbnQ2NF90KSgmKGRkcl9zaGEuZGRycykpKTsKCXJ1bl9jb21tYW5kKHN0ciwwKTsKCXByaW50ZigiY2FsIHNoYVxuIik7CglzcHJpbnRmKHN0ciwibWQgJTA4eCAweDEwMCIsICh1aW50MzJfdCkodWludDY0X3QpKCZ0ZW1wX3NoYTIpKTsKCXJ1bl9jb21tYW5kKHN0ciwwKTsKCSNlbmRpZgoKCWZvciAoY291bnQ9MDtjb3VudDxTSEEyNTZfU1VNX0xFTjtjb3VudCsrKQoJewoJCWlmICgodGVtcF9zaGEyW2NvdW50XSkgIT0gKGRkcl9zaGEuc2hhMltjb3VudF0pKQoJCQllcnJvcisrOwoJCWlmIChsb2dfbGV2ZWwgPT0gMCkKCQkJcHJpbnRmKCJcbnJlYWQgc2hhWyUwOHhdICUwOHgsY2FsdSAlMDh4Iixjb3VudCwoZGRyX3NoYS5zaGEyW2NvdW50XSksKHRlbXBfc2hhMltjb3VudF0pKTsKCX0KCSNkZWZpbmUgRERSX0ZVTkNfRkFTVF9CT09UX0NIRUNLX0NISVBfSUQJKDE8PDMwKQoJaWYgKChkZHJfc2hhLmRkcnMuZGRyX2Z1bmMpJkREUl9GVU5DX0ZBU1RfQk9PVF9DSEVDS19DSElQX0lEKQoJewoJCWZvciAoY291bnQ9MDtjb3VudDxNRVNPTl9DUFVfQ0hJUF9JRF9TSVpFO2NvdW50KyspCgkJewoJCQlpZiAoKGRkcl9zaGEuc2hhX2NoaXBfaWRbY291bnRdKSAhPSAoZ2xvYmFsX2NoaXBfaWRbY291bnRdKSkKCQkJCWVycm9yKys7CgkJCWlmIChsb2dfbGV2ZWwgPT0gMCkKCQkJCXByaW50ZigiXG5nbG9iYWxfY2hpcF9pZFslMDh4XSAlMDh4LHJlYWQgJTA4eCIsY291bnQsKGdsb2JhbF9jaGlwX2lkW2NvdW50XSksKGRkcl9zaGEuc2hhX2NoaXBfaWRbY291bnRdKSk7CgkJfQoJfQoJcmV0dXJuIGVycm9yOwp9Cgp1aW50MzJfdCBlbmFibGVfZGRyX2NoZWNrX2Jvb3RfcmVhc29uPTA7CnVpbnQzMl90IGJvb3RfcmVhc29uPTA7CiNkZWZpbmUgSE9UX0JPT1RfTUFHSUMgICAweDk5ODg3NzY2CiNkZWZpbmUgSE9UX0JPT1RfU1RJQ0tZX0FERCAgIChwX2Rkcl9iYXNlLT5wcmVnX3N0aWNreV9yZWcwKyg2PDwyKSkKI2RlZmluZSBBTUxPR0lDX0NPTERfQk9PVAkJCQkwCmludCBkb19kZHJfYXV0b19mYXN0Ym9vdF9jaGVjayhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCWNoZWNrX2Jhc2VfYWRkcmVzcygpOwoJI2RlZmluZSBETUNfVEVTVF9TTFRfRU5BQkxFX0REUl9BVVRPX0ZBU1RfQk9PVCAoMTw8NSkKCSNkZWZpbmUgIEFVVE9fV0lORE9XX1RFU1RfRU5BQkxFX0lURU0gICAoKDE8PDEpfCgxPDwyKSkKCS8vCWludCBpPTA7CgkvLwlpbnQgY291bnQ9MDsKCWNoYXIgKmVuZHA7CgkvL3Vuc2lnbmVkIGludCBlbmFibGVfZGRyX2Zhc3RfYm9vdD0wOyAgLy8gMCBwYXVzZSAxLHJlc3VtZQoJY2hhciBhdXRvX3dpbmRvd190ZXN0X2VuYWJsZV9pdGVtPURNQ19URVNUX1NMVF9FTkFCTEVfRERSX0FVVE9fRkFTVF9CT09UOwoJdWludDMyX3QgYXV0b193aW5kb3dfdGVzdF9kcV9zaXplPTA7CgljaGFyIHBhdHRlcm5fZGlzX3NjcmFtYmxlPTA7Cgl1aW50MzJfdCBzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X3JlYWRfdnJlZl9vZmZzZXRfdmFsdWU9MDsKCXVpbnQzMl90IGRkcl9zZXRfc2l6ZT0wOwoJdWludDMyX3QgbmVlZF9kZHJfd2luZG93X3Rlc3Q9MDsKCXVpbnQzMl90IHNraXBfd2luZG93X3Rlc3RfZW5hYmxlPTA7CglpZiAoYXJnYz4xKQoJewoJCWF1dG9fd2luZG93X3Rlc3RfZW5hYmxlX2l0ZW0gPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlhdXRvX3dpbmRvd190ZXN0X2VuYWJsZV9pdGVtPURNQ19URVNUX1NMVF9FTkFCTEVfRERSX0FVVE9fRkFTVF9CT09UOwoJfQoJaWYgKGFyZ2M+MikKCXsKCQlhdXRvX3dpbmRvd190ZXN0X2RxX3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlhdXRvX3dpbmRvd190ZXN0X2RxX3NpemU9MDsKCX0KCWlmIChhcmdjPjMpCgl7CgkJcGF0dGVybl9kaXNfc2NyYW1ibGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXBhdHRlcm5fZGlzX3NjcmFtYmxlPTA7Cgl9CglpZiAoYXJnYz40KQoJewoJCXN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfcmVhZF92cmVmX29mZnNldF92YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9yZWFkX3ZyZWZfb2Zmc2V0X3ZhbHVlPTA7Cgl9CglpZiAoYXJnYz41KQoJewoJCXNraXBfd2luZG93X3Rlc3RfZW5hYmxlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQlza2lwX3dpbmRvd190ZXN0X2VuYWJsZT0wOwoJfQoJY2hhciBzdHJbMTAyNF09IiI7CglpbnQgdmVyaWZ5X2Vycm9yPTA7Cgl2ZXJpZnlfZXJyb3I9ZG9fdmVyaWZ5X2ZsYXNoX2Rkcl9wYXJhbWV0ZXIoMSk7CglpZiAoKHZlcmlmeV9lcnJvcikgPT0gMCkKCXsKCQlpZiAoKGRkcl9zaGEuZGRycy5mYXN0X2Jvb3RbMF0pID09IDB4ZmYpCgkJewoJCQlwcmludGYoIlxudWJvb3QgIGF1dG8gZmFzdCBib290IGNoZWNrIGZsYXNoIGRhdGEgaXMgb2sgcmV0dXJuIFxuIik7CgkJCXJldHVybiAxIDsKCQl9Cgl9CgllbmFibGVfZGRyX2NoZWNrX2Jvb3RfcmVhc29uPTA7CgkjaWYgMAoJc3ByaW50ZihzdHIsInNldGVudiBlbmFibGVfZGRyX2NoZWNrX2Jvb3RfcmVhc29uIDAiKTsKCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCXJ1bl9jb21tYW5kKHN0ciwwKTsKCXNwcmludGYoc3RyLCJzYXZlIik7CglwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CglydW5fY29tbWFuZChzdHIsMCk7CgkjZW5kaWYKCWVuYWJsZV9kZHJfY2hlY2tfYm9vdF9yZWFzb249ZW52X3RvX2FfbnVtKCJlbmFibGVfZGRyX2NoZWNrX2Jvb3RfcmVhc29uIik7CglwcmludGYoIlxuZW5hYmxlX2Rkcl9jaGVja19ib290X3JlYXNvbj09JWQgXG4iLGVuYWJsZV9kZHJfY2hlY2tfYm9vdF9yZWFzb24pOwoJcHJpbnRmKCJcbmRkcl9mYXN0X2Jvb3RfZW5hYmxlX2ZsYWc9PSVkIFxuIixlbnZfdG9fYV9udW0oImRkcl9mYXN0X2Jvb3RfZW5hYmxlX2ZsYWciKSk7CglkZHJfc2V0X3QgKmRkcl9zZXRfdF9wPU5VTEw7CglkZHJfc2V0X3RfcD0oZGRyX3NldF90ICopKGRkcl9zZXRfdF9wX2FycmFyeSk7CgkvL2Rkcl9zZXRfdF9wPSAoZGRyX3NldF90ICopKHBfZGRyX2Jhc2UtPmRkcl9kbWNfc3RpY2t5MCk7CgkvL2lmIChzaXplb2YoZGRyX3NldF90KTxsb29wX21heCkKCXVpbnQzMl90ICBkZHJfc2V0X2FkZD0wOwoKCWRkcl9zZXRfYWRkPSh1aW50MzJfdCkodWludDY0X3QpKGRkcl9zZXRfdF9wKTsKCWRkcl9zZXRfc2l6ZT1zaXplb2YoZGRyX3NldF90KTsKCXByaW50ZigiXG5kZHJfc2V0X3RfcD09MHglMDh4XG4iLGRkcl9zZXRfYWRkKTsKCSNkZWZpbmUgRE1DX1BIWV9SRVRSQUlOSU5HX0NUUkwgICAgICggcF9kZHJfYmFzZS0+ZGRyX2RtY19scGRkNF9yZXRyYWluaW5nX2FkZHJlc3MpCgl1aW50MzJfdCBkbWNfcmV0cmFpbmluZ19jdHJsPTA7CglkbWNfcmV0cmFpbmluZ19jdHJsPXJkX3JlZyhETUNfUEhZX1JFVFJBSU5JTkdfQ1RSTCk7Cgl3cl9yZWcoRE1DX1BIWV9SRVRSQUlOSU5HX0NUUkwsZG1jX3JldHJhaW5pbmdfY3RybCYofigxPDwzMSkpKTsKCXVpbnQzMl90IHdyaXRlX3NpemU9MDsKCXdyaXRlX3NpemU9KChkZHJfc2V0X3NpemUrU0hBMjU2X1NVTV9MRU4rTUVTT05fQ1BVX0NISVBfSURfU0laRSs1MTEpLzUxMikqNTEyOwoJI2lmIDEKCWRvX3JlYWRfZGRyX3RyYWluaW5nX2RhdGEoMSxkZHJfc2V0X3RfcCk7CgkjZW5kaWYKCWlmICgoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbM10pJjB4YzApICYmICgoZGRyX3NldF90X3AtPmZhc3RfYm9vdFszXSkmMHgzZikpCgl7CgkJZW5hYmxlX2Rkcl9jaGVja19ib290X3JlYXNvbj0wOwoJCWlmICgoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMF0pPjApICYmICgoZGRyX3NldF90X3AtPmZhc3RfYm9vdFswXSk8MHhmZikpCgkJewoJCQkoZGRyX3NldF90X3AtPmZhc3RfYm9vdFswXSk9MHhmZTsKCQkJKHZlcmlmeV9lcnJvcik9MDsKCQl9Cgl9CglpZiAoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMF0pKQoJewoJCXByaW50ZigiXG51Ym9vdCBlbmFibGUgYXV0byBmYXN0IGJvb3QgZnVuY2l0b24gXG4iKTsKCQlpZiAoKHZlcmlmeV9lcnJvcikpCgkJewoJCQlwcmludGYoIlxudWJvb3QgIGF1dG8gZmFzdCBib290IGNoZWNrIHZlcmlmeSBkYXRhIGhhcHBlbiB3cm9uZyBcbiIpOwoJCQkoZGRyX3NldF90X3AtPmZhc3RfYm9vdFswXSk9MTsKCQl9Cgl9CgllbHNlCgl7CgkJd3JfcmVnKERNQ19QSFlfUkVUUkFJTklOR19DVFJMLGRtY19yZXRyYWluaW5nX2N0cmwpOwoJCXJldHVybiAxIDsKCX0KCWlmIChlbmFibGVfZGRyX2NoZWNrX2Jvb3RfcmVhc29uKQoJewoJCWJvb3RfcmVhc29uPTA7Ly9kZHJfc2V0X3RfcC0+Ym9vdF9yZWFzb24KCQkvL2lmKGJvb3RfcmVhc29uPT0wKQoJCXsKCQkJLy9pZihlbnZfdG9fYV9udW0oInJlYm9vdF9tb2RlIik9PUFNTE9HSUNfU0hVVERPV05fUkVCT09UKQoJCQkvL2lmICgoZW52X3RvX2FfbnVtKCJyZWJvb3RfbW9kZSIpID09IEFNTE9HSUNfQ09MRF9CT09UKQoJCQlpZiAoKCgocmVhZGwocF9kZHJfYmFzZS0+ZGRyX2Jvb3RfcmVhc29uX2FkZHJlc3MpID4+IDEyKSAmIDB4ZikgPT0gQU1MT0dJQ19DT0xEX0JPT1QpICYmICgocmRfcmVnKEhPVF9CT09UX1NUSUNLWV9BREQpKSA9PSBIT1RfQk9PVF9NQUdJQykpCgkJCQlib290X3JlYXNvbj0xOwoJCQlpZiAoZGRyX3NldF90X3AtPmZhc3RfYm9vdFswXSA9PSAweGZlKQoJCQkJYm9vdF9yZWFzb249MjsKCQl9CgkJcHJpbnRmKCJcbmJvb3RfcmVhc29uPSUwOHggXG4iLChib290X3JlYXNvbikpOwoJCXByaW50ZigiXG5IT1RfQk9PVF9TVElDS1lfQUREPSUwOHggXG4iLChyZF9yZWcoSE9UX0JPT1RfU1RJQ0tZX0FERCkpKTsKCQl3cl9yZWcoSE9UX0JPT1RfU1RJQ0tZX0FERCxIT1RfQk9PVF9NQUdJQyk7CgkJcHJpbnRmICgiXG5IT1RfQk9PVF9TVElDS1lfQUREPSUwOHggXG4iLChyZF9yZWcoSE9UX0JPT1RfU1RJQ0tZX0FERCkpKSA7CgoJCS8vc3ByaW50ZihzdHIsInNhdmUiKTsKCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkvL3J1bl9jb21tYW5kKHN0ciwwKTsKCgkJaWYgKGJvb3RfcmVhc29uID09IDApCgkJewoJCQlpZiAoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMF0pPDB4ZmUpCgkJCXsKCQkJCW5lZWRfZGRyX3dpbmRvd190ZXN0PTE7CgkJCQkjaWYgMAoJCQkJc3ByaW50ZihzdHIsInNldGVudiBkZHJfZmFzdF9ib290X2VuYWJsZV9mbGFnIDAiKTsKCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCXNwcmludGYoc3RyLCJzYXZlIik7CgkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkjZW5kaWYKCQkJCXNwcmludGYoc3RyLCJzZXRlbnYgaW5pdGFyZ3MgJHtpbml0YXJnc30gbmVlZF9kZHJfd2luZG93X3Rlc3Q9JWQiLG5lZWRfZGRyX3dpbmRvd190ZXN0KTsKCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCXNwcmludGYoc3RyLCJzZXRlbnYgYm9vdGFyZ3MgJHtib290YXJnc30gbmVlZF9kZHJfd2luZG93X3Rlc3Q9JWQiLG5lZWRfZGRyX3dpbmRvd190ZXN0KTsKCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCS8vc3ByaW50ZihzdHIsInNhdmUiKTsKCQkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJLy9ydW5fY29tbWFuZChzdHIsMCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlzcHJpbnRmKHN0ciwic2V0ZW52IGluaXRhcmdzICR7aW5pdGFyZ3N9IG5lZWRfZGRyX3dpbmRvd190ZXN0PSVkIixuZWVkX2Rkcl93aW5kb3dfdGVzdCk7CgkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQlzcHJpbnRmKHN0ciwic2V0ZW52IGJvb3RhcmdzICR7Ym9vdGFyZ3N9IG5lZWRfZGRyX3dpbmRvd190ZXN0PSVkIixuZWVkX2Rkcl93aW5kb3dfdGVzdCk7CgkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCX0KCQkJd3JfcmVnKERNQ19QSFlfUkVUUkFJTklOR19DVFJMLGRtY19yZXRyYWluaW5nX2N0cmwpOwoJCQlyZXR1cm4gMSA7CgkJfQoJCWVsc2UKCQl7CgkJCXNwcmludGYoc3RyLCJzZXRlbnYgaW5pdGFyZ3MgJHtpbml0YXJnc30gbmVlZF9kZHJfd2luZG93X3Rlc3Q9JWQiLG5lZWRfZGRyX3dpbmRvd190ZXN0KTsKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCXNwcmludGYoc3RyLCJzZXRlbnYgYm9vdGFyZ3MgJHtib290YXJnc30gbmVlZF9kZHJfd2luZG93X3Rlc3Q9JWQiLG5lZWRfZGRyX3dpbmRvd190ZXN0KTsKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJfQoJfQoJaWYgKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKSA9PSAweGZmKQoJewoJCXByaW50ZigiXG51Ym9vdCAgYXV0byBmYXN0IGJvb3QgIGF1dG8gd2luZG93IHRlc3QgaXMgZG9uZSBcbiIpOwoJCXdyX3JlZyhETUNfUEhZX1JFVFJBSU5JTkdfQ1RSTCxkbWNfcmV0cmFpbmluZ19jdHJsKTsKCQlyZXR1cm4gMSA7Cgl9CglpZiAoc2tpcF93aW5kb3dfdGVzdF9lbmFibGUpCgl7CgkJcHJpbnRmKCJlbmFibGUgc2tpcCB3aW5kb3cgdGVzdCBmYXN0IGJvb3QgbW9kZSEgXG4iKTsKCQlkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdPTB4ZmU7Cgl9CglwcmludGYoIlxuKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMF0pPT0weCUwOHhcbiIsKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMF0pKTsKCglpZiAoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMF0pPDB4ZmUpCgl7CgkJcHJpbnRmKCJcbnVib290ICBhdXRvIGZhc3QgYm9vdCAgYXV0byB3aW5kb3cgdGVzdCBiZWdpbiBcbiIpOwoJCXsKCQkJZGRyX3NldF90X3AtPmZhc3RfYm9vdFswXT0weGZkOyAvLzB4ZmQgZm9yIGNoZWNrIHVuZXhjZXB0IHBvd2VyIG9mZiBzdGF0dXMKCQkJLy8jaWYgMQoJCQkvL3ByaW50ZigicHJpbnQgc2hhXG4iKTsKCQkJLy9zcHJpbnRmKHN0ciwibWQgJTA4eCAweDEwMCIsICh1aW50MzJfdCkodWludDY0X3QpKGRkcl9zZXRfYWRkLTMyKSk7CgkJCS8vcnVuX2NvbW1hbmQoc3RyLDApOwoJCQlzaGEyNTZfY3N1bV93ZF9pbnRlcm5hbCgodW5zaWduZWQgY2hhciAqKSh1aW50NjRfdClkZHJfc2V0X2FkZCwgc2l6ZW9mKGRkcl9zZXRfdCksIGRkcl9zaGEuc2hhMiwgMCk7CgkJCS8vcHJpbnRmKCJwcmludCBzaGFcbiIpOwoJCQkvL3NwcmludGYoc3RyLCJtZCAlMDh4IDB4MTAwIiwgKHVpbnQzMl90KSh1aW50NjRfdCkoZGRyX3NldF9hZGQtMzIpKTsKCQkJLy9ydW5fY29tbWFuZChzdHIsMCk7CgkJCS8vI2VuZGlmCgkJCXdyaXRlX3NpemU9KChkZHJfc2V0X3NpemUrU0hBMjU2X1NVTV9MRU4rTUVTT05fQ1BVX0NISVBfSURfU0laRSs1MTEpLzUxMikqNTEyOwoJCQl7CgkJCQkjaWYgMAoJCQkJI2lmZGVmIFVTRV9GT1JfVUJPT1RfMjAxOAoJCQkJc3ByaW50ZihzdHIsInN0b3JlIHJzdiB3cml0ZSBkZHItcGFyYW1ldGVyIDB4JTA4eCAweCUwOHggIixkZHJfc2V0X2FkZC1TSEEyNTZfU1VNX0xFTix3cml0ZV9zaXplKTsKCQkJCSNlbHNlCgkJCQlzcHJpbnRmKHN0ciwic3RvcmUgZGRyX3BhcmFtZXRlciB3cml0ZSAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQtU0hBMjU2X1NVTV9MRU4sd3JpdGVfc2l6ZSk7CgkJCQkjZW5kaWYKCQkJCS8vc3ByaW50ZihzdHIsInN0b3JlIGRkcl9wYXJhbWV0ZXIgd3JpdGUgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLGRkcl9zZXRfc2l6ZSk7CgkJCQkvL3NwcmludGYoc3RyLCJzdG9yZSByc3Ygd3JpdGUgZGRyLXBhcmFtZXRlciAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQsZGRyX3NldF9zaXplKTsKCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCSNlbmRpZgoKCQkJCSNpZiAwCgkJCQlpbnQgYXJnYzI7CgkJCQljaGFyKiBhcmd2MlszMF07CgkJCQlhcmdjMj0zOwoJCQkJc3ByaW50Zihhcmd2MlsxXSwiMHglMDh4IixkZHJfc2V0X2FkZC1TSEEyNTZfU1VNX0xFTik7CgkJCQlzcHJpbnRmKGFyZ3YyWzJdLCIweCUwOHgiLHdyaXRlX3NpemUpOwoKCQkJCWRvX2Rkcl9zdG9yZV93cml0ZV9kZHJfcGFyYW1ldGVyX29wcyhjbWR0cCxmbGFnLGFyZ2MyLGFyZ3YyKTsKCQkJCSNlbmRpZgoJCQkJZGRyX2RvX3N0b3JlX2Rkcl9wYXJhbWV0ZXJfb3BzKCh1aW50OF90ICopKHVuc2lnbmVkIGxvbmcpKGRkcl9zZXRfYWRkLVNIQTI1Nl9TVU1fTEVOKSx3cml0ZV9zaXplKTsKCQkJfQoJCQkvL3ZlcmlmeV9lcnJvcj1kb192ZXJpZnlfZmxhc2hfZGRyX3BhcmFtZXRlcigmZGRyX3NoYSwwKTsKCQkJLy9yZXR1cm4gMTsKCQkJc3ByaW50ZihzdHIsImcxMl9kMnBsbCAlZCAweDExICVkIDAgMCAwIDAgJWQgMHglMDh4ICAwICVkIixkZHJfc2V0X3RfcC0+RFJBTUZyZXFbMF0sYXV0b193aW5kb3dfdGVzdF9lbmFibGVfaXRlbSxzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X3JlYWRfdnJlZl9vZmZzZXRfdmFsdWUsYXV0b193aW5kb3dfdGVzdF9kcV9zaXplLHBhdHRlcm5fZGlzX3NjcmFtYmxlKTsKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCX0KCQlyZXR1cm4gMSA7Cgl9CgoJaWYgKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKSA9PSAweGZlKQoJewoJCWNoYXIgZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4PTA7CgkJY2hhciBkbWNfdGVzdF93b3JzdF93aW5kb3dfdHg9MDsKCgkJewoJCQlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgweGQ8PDE2KXwoMDw8MTIpfCgweDApLDApOyAvLyBEV0NfRERSUEhZQV9BUEJPTkxZMF9NaWNyb0NvbnRNdXhTZWwKCgkJCWRtY190ZXN0X3dvcnN0X3dpbmRvd190eD1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHgwYzIpKTsKCQkJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4PWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDBjMykpOwoJCQlwcmludGYoIlxuZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4ID0lZCBcbiIsZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4KTsKCQkJcHJpbnRmKCJcbmRtY190ZXN0X3dvcnN0X3dpbmRvd19yeD0lZCBcbiIsZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4KTsKCQkJaWYgKGRtY190ZXN0X3dvcnN0X3dpbmRvd190eD4zMCkKCQkJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4PTMwOwoJCQlpZiAoZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4PjMwKQoJCQlkbWNfdGVzdF93b3JzdF93aW5kb3dfcng9MzA7CgkJCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDFjMiksdDRfd3JpdGVfd29yc3RfbWFyZ2luX3JhbmsxKTsKCQkJLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4MWMzKSx0NF9yZWFkX3dvcnN0X21hcmdpbl9yYW5rMSk7CgkJCWRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMV09KCgoZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4LzIpPDw0KSl8KCgoZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4LzIpKSk7CgkJfQoKCQlkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdPTB4ZmY7CgkJewoJCQlwcmludGYoIlxudWJvb3QgIGF1dG8gZmFzdCBib290ICBhdXRvIHdpbmRvdyB0ZXN0IGZpbmlzaCBcbiIpOwoKCQkJaWYgKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pCgkJCXsKCQkJCWlmICgoZGRyX3NldF90X3AtPmZhc3RfYm9vdFsyXSkmMHg3KQoJCQkJewoJCQkJCWlmICgoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pJjB4OCkpCgkJCQkJCXNwcmludGYoc3RyLCJkZHJfZzEyX29mZnNldF9kYXRhIDMgMHgwICAwIDAgMSAlZCAiLChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzJdKSYweDcpOwoJCQkJCWVsc2UKCQkJCQkJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgMyAweDAgIDAgMCAyICVkICIsKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pJjB4Nyk7CgoJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCgkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJfQoJCQkJaWYgKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzJdKSYweDcwKQoJCQkJewoJCQkJCWlmICgoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pJjB4ODApKQoJCQkJCQlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAyIDB4MCAgMCAwIDEgJWQgIiwoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pPj40KSYweDcpOwoJCQkJCWVsc2UKCQkJCQkJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgMiAweDAgIDAgMCAyICVkICIsKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzJdKT4+NCkmMHg3KTsKCgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoKCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQl9CgoJCQkJc3ByaW50ZihzdHIsImRkcl9mYXN0X2Jvb3QgMSAiKTsKCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJfQoJCQllbHNlCgkJCXsKCS8vCSNpZiAxCgkvLwlwcmludGYoIiZkZHJfc2hhLmRkcnMgOiAweCV4XG4iLCAodWludDMyX3QpKHVpbnQ2NF90KSZkZHJfc2hhLmRkcnMpOwoJLy8JcHJpbnRmKCImZGRyX3NoYS5zaGEyIDogMHgleFxuIiwgKHVpbnQzMl90KSh1aW50NjRfdCkmZGRyX3NoYS5zaGEyKTsKCS8vCXByaW50ZigiZGRyX3NldF9hZGQgOiAweCV4XG4iLCAodWludDMyX3QpKHVpbnQ2NF90KWRkcl9zZXRfYWRkKTsKCgkJc2hhMjU2X2NzdW1fd2RfaW50ZXJuYWwoKHVuc2lnbmVkIGNoYXIgKikodWludDY0X3QpZGRyX3NldF9hZGQsIHNpemVvZihkZHJfc2V0X3QpLCBkZHJfc2hhLnNoYTIsIDApOwoJLy8JcHJpbnRmKCJwcmludCBzaGFcbiIpOwoJLy8Jc3ByaW50ZihzdHIsIm1kICUwOHggMHgxMDAiLCAodWludDMyX3QpKHVpbnQ2NF90KShkZHJfc2V0X2FkZC0zMikpOwoJLy8JcnVuX2NvbW1hbmQoc3RyLDApOwoJLy8JI2VuZGlmCgkjaWYgMAoJCXsKCQkjaWZkZWYgVVNFX0ZPUl9VQk9PVF8yMDE4CgkJc3ByaW50ZiAoc3RyLCJzdG9yZSByc3Ygd3JpdGUgZGRyLXBhcmFtZXRlciAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQtU0hBMjU2X1NVTV9MRU4sd3JpdGVfc2l6ZSk7CgkJI2Vsc2UKCQlzcHJpbnRmIChzdHIsInN0b3JlIGRkcl9wYXJhbWV0ZXIgd3JpdGUgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLVNIQTI1Nl9TVU1fTEVOLHdyaXRlX3NpemUpOwoJCSNlbmRpZgoJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQlydW5fY29tbWFuZChzdHIsMCk7CgkJfQoJI2VuZGlmCgkJZGRyX2RvX3N0b3JlX2Rkcl9wYXJhbWV0ZXJfb3BzKCh1aW50OF90ICopKHVuc2lnbmVkIGxvbmcpKGRkcl9zZXRfYWRkLVNIQTI1Nl9TVU1fTEVOKSx3cml0ZV9zaXplKTsKCQkJfQoJCWlmICggKGVuYWJsZV9kZHJfY2hlY2tfYm9vdF9yZWFzb24pKQoJCXsKCQkJaWYgKGJvb3RfcmVhc29uKQoJCQl7CgkJCQlzcHJpbnRmKHN0ciwic3lzdGVtb2ZmIik7CgkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCX0KCQl9CgkJCXdyX3JlZyhETUNfUEhZX1JFVFJBSU5JTkdfQ1RSTCxkbWNfcmV0cmFpbmluZ19jdHJsKTsKCQkJcmV0dXJuIDE7CgkJfQoJfQoJd3JfcmVnKERNQ19QSFlfUkVUUkFJTklOR19DVFJMLGRtY19yZXRyYWluaW5nX2N0cmwpOwoJcmV0dXJuIDE7Cn0KVV9CT09UX0NNRCgKCWRkcl9hdXRvX3NjYW5fZHJ2LAkzMCwJMSwJZG9fZGRyX2F1dG9fc2Nhbl9kcnYsCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiIsCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiBcbiBkY2FjaGUgb2ZmID8gXG4iCgkpOwpVX0JPT1RfQ01EKAoJZGRyX2Zhc3RfYm9vdCwJMzAsCTEsCWRvX2Rkcl9mYXN0Ym9vdF9jb25maWcsCgkiZGRyX2Zhc3Rib290X2NvbmZpZyBjbWQgYXJnMSBhcmcyIGFyZzMuLi4iLAoJImRkcl9mYXN0Ym9vdF9jb25maWcgY21kIGFyZzEgYXJnMiBhcmczLi4uIFxuIGRjYWNoZSBvZmYgPyBcbiIKCSk7ClVfQk9PVF9DTUQoCglkZHJfYXV0b19mYXN0X2Jvb3RfY2hlY2ssCTMwLAkxLAlkb19kZHJfYXV0b19mYXN0Ym9vdF9jaGVjaywKCSJkZHJfZmFzdGJvb3RfY29uZmlnIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiIsCgkiZGRyX2Zhc3Rib290X2NvbmZpZyBjbWQgYXJnMSBhcmcyIGFyZzMuLi4gXG4gZGNhY2hlIG9mZiA/IFxuIgoJKTsKCg==