ZGlmZiAtLWdpdCBhL2FkYi9hZGIuYyBiL2FkYi9hZGIuYwppbmRleCBkOWY5NmRmLi5mNWU2ZTBjIDEwMDY0NAotLS0gYS9hZGIvYWRiLmMKKysrIGIvYWRiL2FkYi5jCkBAIC0zMDIsOCArMzAyLDEwIEBACiB7CiAgICAgYXNvY2tldCAqczsKIAotICAgIEQoImhhbmRsZV9wYWNrZXQoKSAlZFxuIiwgcC0+bXNnLmNvbW1hbmQpOwotCisgICAgRCgiaGFuZGxlX3BhY2tldCgpICVjJWMlYyVjXG4iLCAoKGNoYXIqKSAoJihwLT5tc2cuY29tbWFuZCkpKVswXSwKKyAgICAgICAgICAgICgoY2hhciopICgmKHAtPm1zZy5jb21tYW5kKSkpWzFdLAorICAgICAgICAgICAgKChjaGFyKikgKCYocC0+bXNnLmNvbW1hbmQpKSlbMl0sCisgICAgICAgICAgICAoKGNoYXIqKSAoJihwLT5tc2cuY29tbWFuZCkpKVszXSk7CiAgICAgcHJpbnRfcGFja2V0KCJyZWN2IiwgcCk7CiAKICAgICBzd2l0Y2gocC0+bXNnLmNvbW1hbmQpewpAQCAtNjgwLDkgKzY4MiwxMSBAQAogICAgIGR1cDIoZmQsIDEpOwogICAgIGR1cDIoZmQsIDIpOwogICAgIGZwcmludGYoc3RkZXJyLCItLS0gYWRiIHN0YXJ0aW5nIChwaWQgJWQpIC0tLVxuIiwgZ2V0cGlkKCkpOworICAgIGFkYl9jbG9zZShmZCk7CiAKICAgICBmZCA9IHVuaXhfb3BlbigiL2Rldi9udWxsIiwgT19SRE9OTFkpOwogICAgIGR1cDIoZmQsIDApOworICAgIGFkYl9jbG9zZShmZCk7CiB9CiAjZW5kaWYKIApAQCAtODczLDcgKzg3Nyw3IEBACiAgICAgICAgICAgICAvLyBkb24ndCBydW4gYXMgcm9vdCBpZiByby5zZWN1cmUgaXMgc2V0Li4uCiAgICAgICAgICAgICBzZWN1cmUgPSAxOwogCi0gICAgICAgICAgICAvLyAuLi4gZXhjZXB0IHdlIGFsbG93IHJ1bm5pbmcgYXMgcm9vdCBpbiB1c2VyZGVidWcgYnVpbGRzIGlmIHRoZSAKKyAgICAgICAgICAgIC8vIC4uLiBleGNlcHQgd2UgYWxsb3cgcnVubmluZyBhcyByb290IGluIHVzZXJkZWJ1ZyBidWlsZHMgaWYgdGhlCiAgICAgICAgICAgICAvLyBzZXJ2aWNlLmFkYi5yb290IHByb3BlcnR5IGhhcyBiZWVuIHNldCBieSB0aGUgImFkYiByb290IiBjb21tYW5kCiAgICAgICAgICAgICBwcm9wZXJ0eV9nZXQoInJvLmRlYnVnZ2FibGUiLCB2YWx1ZSwgIiIpOwogICAgICAgICAgICAgaWYgKHN0cmNtcCh2YWx1ZSwgIjEiKSA9PSAwKSB7CkBAIC0xMjY0LDggKzEyNjgsOCBAQAogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0gICAgYWRiX3RyYWNlX2luaXQoKTsKICNpZiBBREJfSE9TVAorICAgIGFkYl90cmFjZV9pbml0KCk7CiAgICAgYWRiX3N5c2RlcHNfaW5pdCgpOwogICAgIHJldHVybiBhZGJfY29tbWFuZGxpbmUoYXJnYyAtIDEsIGFyZ3YgKyAxKTsKICNlbHNlCmRpZmYgLS1naXQgYS9hZGIvY29tbWFuZGxpbmUuYyBiL2FkYi9jb21tYW5kbGluZS5jCmluZGV4IGRjYmE4M2IuLjVlZDFiNTIgMTAwNjQ0Ci0tLSBhL2FkYi9jb21tYW5kbGluZS5jCisrKyBiL2FkYi9jb21tYW5kbGluZS5jCkBAIC02ODMsNiArNjgzLDcgQEAKICAgICBjaGFyIGJ1Zls0MDk2XTsKICAgICBpbnQgbm9fZGFlbW9uID0gMDsKICAgICBpbnQgaXNfZGFlbW9uID0gMDsKKyAgICBpbnQgaXNfc2VydmVyID0gMDsKICAgICBpbnQgcGVyc2lzdCA9IDA7CiAgICAgaW50IHI7CiAgICAgaW50IHF1b3RlOwpAQCAtNzE5LDcgKzcyMCw5IEBACiAKICAgICAvKiBtb2RpZmllcnMgYW5kIGZsYWdzICovCiAgICAgd2hpbGUoYXJnYyA+IDApIHsKLSAgICAgICAgaWYoIXN0cmNtcChhcmd2WzBdLCJub2RhZW1vbiIpKSB7CisgICAgICAgIGlmKCFzdHJjbXAoYXJndlswXSwic2VydmVyIikpIHsKKyAgICAgICAgICAgIGlzX3NlcnZlciA9IDE7CisgICAgICAgIH0gZWxzZSBpZighc3RyY21wKGFyZ3ZbMF0sIm5vZGFlbW9uIikpIHsKICAgICAgICAgICAgIG5vX2RhZW1vbiA9IDE7CiAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAiZm9yay1zZXJ2ZXIiKSkgewogICAgICAgICAgICAgLyogdGhpcyBpcyBhIHNwZWNpYWwgZmxhZyB1c2VkIG9ubHkgd2hlbiB0aGUgQURCIGNsaWVudCBsYXVuY2hlcyB0aGUgQURCIFNlcnZlciAqLwpAQCAtNzY2LDcgKzc2OSw3IEBACiAgICAgYWRiX3NldF90cmFuc3BvcnQodHR5cGUsIHNlcmlhbCk7CiAgICAgYWRiX3NldF90Y3Bfc3BlY2lmaWNzKHNlcnZlcl9wb3J0KTsKIAotICAgIGlmICgoYXJnYyA+IDApICYmICghc3RyY21wKGFyZ3ZbMF0sInNlcnZlciIpKSkgeworICAgIGlmIChpc19zZXJ2ZXIpIHsKICAgICAgICAgaWYgKG5vX2RhZW1vbiB8fCBpc19kYWVtb24pIHsKICAgICAgICAgICAgIHIgPSBhZGJfbWFpbihpc19kYWVtb24sIHNlcnZlcl9wb3J0KTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTgzOCwxMiArODQxLDI0IEBACiAgICAgICAgIHJldHVybiBhZGJfc2VuZF9lbXVsYXRvcl9jb21tYW5kKGFyZ2MsIGFyZ3YpOwogICAgIH0KIAotICAgIGlmKCFzdHJjbXAoYXJndlswXSwgInNoZWxsIikpIHsKKyAgICBpZighc3RyY21wKGFyZ3ZbMF0sICJzaGVsbCIpIHx8ICFzdHJjbXAoYXJndlswXSwgImhlbGwiKSkgewogICAgICAgICBpbnQgcjsKICAgICAgICAgaW50IGZkOwogCisgICAgICAgIGNoYXIgaCA9IChhcmd2WzBdWzBdID09ICdoJyk7CisKKyAgICAgICAgaWYgKGgpIHsKKyAgICAgICAgICAgIHByaW50ZigiXHgxYls0MTszM20iKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICB9CisKICAgICAgICAgaWYoYXJnYyA8IDIpIHsKLSAgICAgICAgICAgIHJldHVybiBpbnRlcmFjdGl2ZV9zaGVsbCgpOworICAgICAgICAgICAgciA9IGludGVyYWN0aXZlX3NoZWxsKCk7CisgICAgICAgICAgICBpZiAoaCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiXHgxYlswbSIpOworICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgIH0KIAogICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJzaGVsbDolcyIsIGFyZ3ZbMV0pOwpAQCAtODc3LDYgKzg5MiwxMCBAQAogICAgICAgICAgICAgICAgIGFkYl9zbGVlcF9tcygxMDAwKTsKICAgICAgICAgICAgICAgICBkb19jbWQodHR5cGUsIHNlcmlhbCwgIndhaXQtZm9yLWRldmljZSIsIDApOwogICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlx4MWJbMG0iKTsKKyAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9hZGIvZmlsZV9zeW5jX2NsaWVudC5jIGIvYWRiL2ZpbGVfc3luY19jbGllbnQuYwppbmRleCBkYTI1YWU4Li41YzdhMjZmIDEwMDY0NAotLS0gYS9hZGIvZmlsZV9zeW5jX2NsaWVudC5jCisrKyBiL2FkYi9maWxlX3N5bmNfY2xpZW50LmMKQEAgLTU3LDkgKzU3LDkgQEAKICAgICBpZiAodCA9PSAwKSAgLyogcHJldmVudCBkaXZpc2lvbiBieSAwIDotKSAqLwogICAgICAgICB0ID0gMTAwMDAwMDsKIAotICAgIGZwcmludGYoc3RkZXJyLCIlbGxkIEtCL3MgKCVkIGJ5dGVzIGluICVsbGQuJTAzbGxkcylcbiIsCisgICAgZnByaW50ZihzdGRlcnIsIiVsbGQgS0IvcyAoJWxsZCBieXRlcyBpbiAlbGxkLiUwM2xsZHMpXG4iLAogICAgICAgICAgICAgKCgoKGxvbmcgbG9uZykgdG90YWxfYnl0ZXMpICogMTAwMDAwMExMKSAvIHQpIC8gMTAyNExMLAotICAgICAgICAgICAgdG90YWxfYnl0ZXMsICh0IC8gMTAwMDAwMExMKSwgKHQgJSAxMDAwMDAwTEwpIC8gMTAwMExMKTsKKyAgICAgICAgICAgIChsb25nIGxvbmcpIHRvdGFsX2J5dGVzLCAodCAvIDEwMDAwMDBMTCksICh0ICUgMTAwMDAwMExMKSAvIDEwMDBMTCk7CiB9CiAKIHZvaWQgc3luY19xdWl0KGludCBmZCkKZGlmZiAtLWdpdCBhL2FkYi9maWxlX3N5bmNfc2VydmljZS5oIGIvYWRiL2ZpbGVfc3luY19zZXJ2aWNlLmgKaW5kZXggMTFlYTA2Yi4uZTQwMmUwNiAxMDA2NDQKLS0tIGEvYWRiL2ZpbGVfc3luY19zZXJ2aWNlLmgKKysrIGIvYWRiL2ZpbGVfc3luY19zZXJ2aWNlLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgX0ZJTEVfU1lOQ19TRVJWSUNFX0hfCiAjZGVmaW5lIF9GSUxFX1NZTkNfU0VSVklDRV9IXwogCi0jaWZkZWYgX19wcGNfXworI2lmZGVmIEhBVkVfQklHX0VORElBTgogc3RhdGljIGlubGluZSB1bnNpZ25lZCBfX3N3YXBfdWludDMyKHVuc2lnbmVkIHgpIAogewogICAgIHJldHVybiAoKCh4KSAmIDB4RkYwMDAwMDApID4+IDI0KQpkaWZmIC0tZ2l0IGEvYWRiL2pkd3Bfc2VydmljZS5jIGIvYWRiL2pkd3Bfc2VydmljZS5jCmluZGV4IDBjMjZmN2IuLmNkNjJiNTUgMTAwNjQ0Ci0tLSBhL2FkYi9qZHdwX3NlcnZpY2UuYworKysgYi9hZGIvamR3cF9zZXJ2aWNlLmMKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAvKiBoZXJlJ3MgaG93IHRoZXNlIHRoaW5ncyB3b3JrLgogCkBAIC0zMjAsNiArMzIxLDcgQEAKICAgICAgICAgICAgIHN0cnVjdCBpb3ZlYyAgICAgaW92OwogICAgICAgICAgICAgY2hhciAgICAgICAgICAgICBkdW1teSA9ICchJzsKICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgYnVmZmVyW3NpemVvZihzdHJ1Y3QgY21zZ2hkcikgKyBzaXplb2YoaW50KV07CisgICAgICAgICAgICBpbnQgZmxhZ3M7CiAKICAgICAgICAgICAgIGlvdi5pb3ZfYmFzZSAgICAgICA9ICZkdW1teTsKICAgICAgICAgICAgIGlvdi5pb3ZfbGVuICAgICAgICA9IDE7CkBAIC0zMzcsMTAgKzMzOSwyNyBAQAogICAgICAgICAgICAgY21zZy0+Y21zZ190eXBlICA9IFNDTV9SSUdIVFM7CiAgICAgICAgICAgICAoKGludCopQ01TR19EQVRBKGNtc2cpKVswXSA9IGZkOwogCisgICAgICAgICAgICBmbGFncyA9IGZjbnRsKHByb2MtPnNvY2tldCxGX0dFVEZMLDApOworCisgICAgICAgICAgICBpZiAoZmxhZ3MgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBEKCJmYWlsZWQgdG8gZ2V0IGNudGwgZmxhZ3MgZm9yIHNvY2tldCAlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICBwcm9jLT5waWQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgZ290byBDbG9zZVByb2Nlc3M7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZjbnRsKHByb2MtPnNvY2tldCwgRl9TRVRGTCwgZmxhZ3MgJiB+T19OT05CTE9DSykgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBEKCJmYWlsZWQgdG8gcmVtb3ZlIE9fTk9OQkxPQ0sgZmxhZyBmb3Igc29ja2V0ICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIHByb2MtPnBpZCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBnb3RvIENsb3NlUHJvY2VzczsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgIHJldCA9IHNlbmRtc2cocHJvYy0+c29ja2V0LCAmbXNnLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkYl9jbG9zZShmZCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIEQoInNlbmRpbmcgbmV3IGZpbGUgZGVzY3JpcHRvciB0byBKRFdQICVkIGZhaWxlZDogJXNcbiIsCkBAIC0zNTQsNiArMzczLDEyIEBACiAgICAgICAgICAgICBmb3IgKG4gPSAxOyBuIDwgcHJvYy0+b3V0X2NvdW50OyBuKyspCiAgICAgICAgICAgICAgICAgcHJvYy0+b3V0X2Zkc1tuLTFdID0gcHJvYy0+b3V0X2Zkc1tuXTsKIAorICAgICAgICAgICAgaWYgKGZjbnRsKHByb2MtPnNvY2tldCwgRl9TRVRGTCwgZmxhZ3MpID09IC0xKSB7CisgICAgICAgICAgICAgICAgRCgiZmFpbGVkIHRvIHNldCBPX05PTkJMT0NLIGZsYWcgZm9yIHNvY2tldCAlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICBwcm9jLT5waWQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgZ290byBDbG9zZVByb2Nlc3M7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmICgtLXByb2MtPm91dF9jb3VudCA9PSAwKQogICAgICAgICAgICAgICAgIGZkZXZlbnRfZGVsKCBwcm9jLT5mZGUsIEZERV9XUklURSApOwogICAgICAgICB9CkBAIC00NzQsNiArNDk5LDcgQEAKIAogICAgIC8qIG9ubHkgd2FpdCBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMgKi8KICAgICBmZGV2ZW50X2FkZChjb250cm9sLT5mZGUsIEZERV9SRUFEKTsKKyAgICBjbG9zZV9vbl9leGVjKHMpOwogCiAgICAgRCgiamR3cCBjb250cm9sIHNvY2tldCBzdGFydGVkICglZClcbiIsIGNvbnRyb2wtPmxpc3Rlbl9zb2NrZXQpOwogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYWRiL3NlcnZpY2VzLmMgYi9hZGIvc2VydmljZXMuYwppbmRleCA0ODdjN2QzLi5jMjJjZTE3IDEwMDY0NAotLS0gYS9hZGIvc2VydmljZXMuYworKysgYi9hZGIvc2VydmljZXMuYwpAQCAtMzA5LDYgKzMwOSw3IEBACiAgICAgICAgIGR1cDIocHRzLCAxKTsKICAgICAgICAgZHVwMihwdHMsIDIpOwogCisgICAgICAgIGFkYl9jbG9zZShwdHMpOwogICAgICAgICBhZGJfY2xvc2UocHRtKTsKIAogICAgICAgICBleGVjbChjbWQsIGNtZCwgYXJnMCwgYXJnMSwgTlVMTCk7CmRpZmYgLS1naXQgYS9hZGIvc29ja2V0cy5jIGIvYWRiL3NvY2tldHMuYwppbmRleCA5ZjFiNTk4Li5hYTRkNWZjIDEwMDY0NAotLS0gYS9hZGIvc29ja2V0cy5jCisrKyBiL2FkYi9zb2NrZXRzLmMKQEAgLTY1LDggKzY1LDExIEBACiAgICAgYXNvY2tldCAqcmVzdWx0ID0gTlVMTDsKIAogICAgIGFkYl9tdXRleF9sb2NrKCZzb2NrZXRfbGlzdF9sb2NrKTsKLSAgICBmb3IocyA9IGxvY2FsX3NvY2tldF9saXN0Lm5leHQ7IHMgIT0gJmxvY2FsX3NvY2tldF9saXN0ICYmICFyZXN1bHQ7IHMgPSBzLT5uZXh0KSB7Ci0gICAgICAgIGlmKHMtPmlkID09IGlkKSByZXN1bHQgPSBzOworICAgIGZvciAocyA9IGxvY2FsX3NvY2tldF9saXN0Lm5leHQ7IHMgIT0gJmxvY2FsX3NvY2tldF9saXN0OyBzID0gcy0+bmV4dCkgeworICAgICAgICBpZiAocy0+aWQgPT0gaWQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KICAgICBhZGJfbXV0ZXhfdW5sb2NrKCZzb2NrZXRfbGlzdF9sb2NrKTsKIApAQCAtMzY2LDcgKzM2OSw3IEBACiBhc29ja2V0ICpjcmVhdGVfbG9jYWxfc29ja2V0KGludCBmZCkKIHsKICAgICBhc29ja2V0ICpzID0gY2FsbG9jKDEsIHNpemVvZihhc29ja2V0KSk7Ci0gICAgaWYocyA9PSAwKSBmYXRhbCgiY2Fubm90IGFsbG9jYXRlIHNvY2tldCIpOworICAgIGlmIChzID09IE5VTEwpIGZhdGFsKCJjYW5ub3QgYWxsb2NhdGUgc29ja2V0Iik7CiAgICAgaW5zdGFsbF9sb2NhbF9zb2NrZXQocyk7CiAgICAgcy0+ZmQgPSBmZDsKICAgICBzLT5lbnF1ZXVlID0gbG9jYWxfc29ja2V0X2VucXVldWU7CkBAIC00ODIsNyArNDg1LDcgQEAKICAgICBhc29ja2V0ICpzID0gY2FsbG9jKDEsIHNpemVvZihhcmVtb3Rlc29ja2V0KSk7CiAgICAgYWRpc2Nvbm5lY3QqICBkaXMgPSAmKChhcmVtb3Rlc29ja2V0KilzKS0+ZGlzY29ubmVjdDsKIAotICAgIGlmKHMgPT0gMCkgZmF0YWwoImNhbm5vdCBhbGxvY2F0ZSBzb2NrZXQiKTsKKyAgICBpZiAocyA9PSBOVUxMKSBmYXRhbCgiY2Fubm90IGFsbG9jYXRlIHNvY2tldCIpOwogICAgIHMtPmlkID0gaWQ7CiAgICAgcy0+ZW5xdWV1ZSA9IHJlbW90ZV9zb2NrZXRfZW5xdWV1ZTsKICAgICBzLT5yZWFkeSA9IHJlbW90ZV9zb2NrZXRfcmVhZHk7CkBAIC01NjYsNiArNTY5LDMyIEBACiAgICAgcmV0dXJuIG47CiB9CiAKKy8qIHNraXBfaG9zdF9zZXJpYWwgcmV0dXJuIHRoZSBwb3NpdGlvbiBpbiBhIHN0cmluZworICAgc2tpcHBpbmcgb3ZlciB0aGUgJ3NlcmlhbCcgcGFyYW1ldGVyIGluIHRoZSBBREIgcHJvdG9jb2wsCisgICB3aGVyZSBwYXJhbWV0ZXIgc3RyaW5nIG1heSBiZSBhIGhvc3Q6cG9ydCBzdHJpbmcgY29udGFpbmluZworICAgdGhlIHByb3RvY29sIGRlbGltaXRlciAoY29sb24pLiAqLworY2hhciAqc2tpcF9ob3N0X3NlcmlhbChjaGFyICpzZXJ2aWNlKSB7CisgICAgY2hhciAqZmlyc3RfY29sb24sICpzZXJpYWxfZW5kOworCisgICAgZmlyc3RfY29sb24gPSBzdHJjaHIoc2VydmljZSwgJzonKTsKKyAgICBpZiAoIWZpcnN0X2NvbG9uKSB7CisgICAgICAgIC8qIE5vIGNvbG9uIGluIHNlcnZpY2Ugc3RyaW5nLiAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2VyaWFsX2VuZCA9IGZpcnN0X2NvbG9uOworICAgIGlmIChpc2RpZ2l0KHNlcmlhbF9lbmRbMV0pKSB7CisgICAgICAgIHNlcmlhbF9lbmQrKzsKKyAgICAgICAgd2hpbGUgKCgqc2VyaWFsX2VuZCkgJiYgaXNkaWdpdCgqc2VyaWFsX2VuZCkpIHsKKyAgICAgICAgICAgIHNlcmlhbF9lbmQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCpzZXJpYWxfZW5kKSAhPSAnOicpIHsKKyAgICAgICAgICAgIC8vIFNvbWV0aGluZyBvdGhlciB0aGFuIG51bWJlcnMgd2FzIGZvdW5kLCByZXNldCB0aGUgZW5kLgorICAgICAgICAgICAgc2VyaWFsX2VuZCA9IGZpcnN0X2NvbG9uOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZXJpYWxfZW5kOworfQorCiBzdGF0aWMgaW50IHNtYXJ0X3NvY2tldF9lbnF1ZXVlKGFzb2NrZXQgKnMsIGFwYWNrZXQgKnApCiB7CiAgICAgdW5zaWduZWQgbGVuOwpAQCAtNjIxLDggKzY1MCw4IEBACiAgICAgICAgIGNoYXIqIHNlcmlhbF9lbmQ7CiAgICAgICAgIHNlcnZpY2UgKz0gc3RybGVuKCJob3N0LXNlcmlhbDoiKTsKIAotICAgICAgICAvLyBzZXJpYWwgbnVtYmVyIHNob3VsZCBmb2xsb3cgImhvc3Q6IgotICAgICAgICBzZXJpYWxfZW5kID0gc3RyY2hyKHNlcnZpY2UsICc6Jyk7CisgICAgICAgIC8vIHNlcmlhbCBudW1iZXIgc2hvdWxkIGZvbGxvdyAiaG9zdDoiIGFuZCBjb3VsZCBiZSBhIGhvc3Q6cG9ydCBzdHJpbmcuCisgICAgICAgIHNlcmlhbF9lbmQgPSBza2lwX2hvc3Rfc2VyaWFsKHNlcnZpY2UpOwogICAgICAgICBpZiAoc2VyaWFsX2VuZCkgewogICAgICAgICAgICAgKnNlcmlhbF9lbmQgPSAwOyAvLyB0ZXJtaW5hdGUgc3RyaW5nCiAgICAgICAgICAgICBzZXJpYWwgPSBzZXJ2aWNlOwpAQCAtNzYxLDggKzc5MCw3IEBACiB7CiAgICAgRCgiQ3JlYXRpbmcgc21hcnQgc29ja2V0IFxuIik7CiAgICAgYXNvY2tldCAqcyA9IGNhbGxvYygxLCBzaXplb2YoYXNvY2tldCkpOwotICAgIGlmKHMgPT0gMCkgZmF0YWwoImNhbm5vdCBhbGxvY2F0ZSBzb2NrZXQiKTsKLSAgICBzLT5pZCA9IDA7CisgICAgaWYgKHMgPT0gTlVMTCkgZmF0YWwoImNhbm5vdCBhbGxvY2F0ZSBzb2NrZXQiKTsKICAgICBzLT5lbnF1ZXVlID0gc21hcnRfc29ja2V0X2VucXVldWU7CiAgICAgcy0+cmVhZHkgPSBzbWFydF9zb2NrZXRfcmVhZHk7CiAgICAgcy0+Y2xvc2UgPSBzbWFydF9zb2NrZXRfY2xvc2U7CmRpZmYgLS1naXQgYS9hZGIvc3lzZGVwcy5oIGIvYWRiL3N5c2RlcHMuaAppbmRleCA2MzcyNjQ5Li43NGY0ZWQxIDEwMDY0NAotLS0gYS9hZGIvc3lzZGVwcy5oCisrKyBiL2FkYi9zeXNkZXBzLmgKQEAgLTM4Nyw3ICszODcsMTMgQEAKIAogc3RhdGljIF9faW5saW5lX18gaW50ICBhZGJfc29ja2V0X2FjY2VwdChpbnQgIHNlcnZlcmZkLCBzdHJ1Y3Qgc29ja2FkZHIqICBhZGRyLCBzb2NrbGVuX3QgICphZGRybGVuKQogewotICAgIHJldHVybiAgYWNjZXB0KCBzZXJ2ZXJmZCwgYWRkciwgYWRkcmxlbiApOworICAgIGludCBmZDsKKworICAgIGZkID0gYWNjZXB0KHNlcnZlcmZkLCBhZGRyLCBhZGRybGVuKTsKKyAgICBpZiAoZmQgPj0gMCkKKyAgICAgICAgY2xvc2Vfb25fZXhlYyhmZCk7CisKKyAgICByZXR1cm4gZmQ7CiB9CiAKICN1bmRlZiAgIGFjY2VwdApkaWZmIC0tZ2l0IGEvYWRiL3RyYW5zcG9ydC5jIGIvYWRiL3RyYW5zcG9ydC5jCmluZGV4IDYyYmRmZGIuLjJiYWYzNDAgMTAwNjQ0Ci0tLSBhL2FkYi90cmFuc3BvcnQuYworKysgYi9hZGIvdHJhbnNwb3J0LmMKQEAgLTc5LDcgKzc5LDcgQEAKIHsKICAgICBhZGlzY29ubmVjdCogIGRpcyA9IHQtPmRpc2Nvbm5lY3RzLm5leHQ7CiAKLSAgICBEKCJydW5fdHJhbnNwb3J0X2Rpc2Nvbm5lY3RzOiAlcCAoJXMpXG4iLCB0LCB0LT5zZXJpYWwgPyB0LT5zZXJpYWwgOiAidW5rbm93biIgKTsKKyAgICBEKCIlczogcnVuX3RyYW5zcG9ydF9kaXNjb25uZWN0c1xuIiwgdC0+c2VyaWFsKTsKICAgICB3aGlsZSAoZGlzICE9ICZ0LT5kaXNjb25uZWN0cykgewogICAgICAgICBhZGlzY29ubmVjdCogIG5leHQgPSBkaXMtPm5leHQ7CiAgICAgICAgIGRpcy0+ZnVuYyggZGlzLT5vcGFxdWUsIHQgKTsKQEAgLTg3LDc1ICs4Nyw5MSBAQAogICAgIH0KIH0KIAorI2lmIEFEQl9UUkFDRQorc3RhdGljIHZvaWQKK2R1bXBfcGFja2V0KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGZ1bmMsIGFwYWNrZXQqIHApCit7CisgICAgdW5zaWduZWQgIGNvbW1hbmQgPSBwLT5tc2cuY29tbWFuZDsKKyAgICBpbnQgICAgICAgbGVuICAgICA9IHAtPm1zZy5kYXRhX2xlbmd0aDsKKyAgICBjaGFyICAgICAgY21kWzldOworICAgIGNoYXIgICAgICBhcmcwWzEyXSwgYXJnMVsxMl07CisgICAgaW50ICAgICAgIG47CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgNDsgbisrKSB7CisgICAgICAgIGludCAgYiA9IChjb21tYW5kID4+IChuKjgpKSAmIDI1NTsKKyAgICAgICAgaWYgKGIgPCAzMiB8fCBiID49IDEyNykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjbWRbbl0gPSAoY2hhciliOworICAgIH0KKyAgICBpZiAobiA9PSA0KSB7CisgICAgICAgIGNtZFs0XSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVGhlcmUgaXMgc29tZSBub24tQVNDSUkgbmFtZSBpbiB0aGUgY29tbWFuZCwgc28gZHVtcAorICAgICAgICAgICAgKiB0aGUgaGV4YWRlY2ltYWwgdmFsdWUgaW5zdGVhZCAqLworICAgICAgICBzbnByaW50ZihjbWQsIHNpemVvZiBjbWQsICIlMDh4IiwgY29tbWFuZCk7CisgICAgfQorCisgICAgaWYgKHAtPm1zZy5hcmcwIDwgMjU2VSkKKyAgICAgICAgc25wcmludGYoYXJnMCwgc2l6ZW9mIGFyZzAsICIlZCIsIHAtPm1zZy5hcmcwKTsKKyAgICBlbHNlCisgICAgICAgIHNucHJpbnRmKGFyZzAsIHNpemVvZiBhcmcwLCAiMHgleCIsIHAtPm1zZy5hcmcwKTsKKworICAgIGlmIChwLT5tc2cuYXJnMSA8IDI1NlUpCisgICAgICAgIHNucHJpbnRmKGFyZzEsIHNpemVvZiBhcmcxLCAiJWQiLCBwLT5tc2cuYXJnMSk7CisgICAgZWxzZQorICAgICAgICBzbnByaW50ZihhcmcxLCBzaXplb2YgYXJnMSwgIjB4JXgiLCBwLT5tc2cuYXJnMSk7CisKKyAgICBEKCIlczogJXM6IFslc10gYXJnMD0lcyBhcmcxPSVzIChsZW49JWQpICIsCisgICAgICAgIG5hbWUsIGZ1bmMsIGNtZCwgYXJnMCwgYXJnMSwgbGVuKTsKKyAgICBkdW1wX2hleChwLT5kYXRhLCBsZW4pOworfQorI2VuZGlmIC8qIEFEQl9UUkFDRSAqLworCiBzdGF0aWMgaW50Ci1yZWFkX3BhY2tldChpbnQgIGZkLCBhcGFja2V0KiogcHBhY2tldCkKK3JlYWRfcGFja2V0KGludCAgZmQsIGNvbnN0IGNoYXIqIG5hbWUsIGFwYWNrZXQqKiBwcGFja2V0KQogewogICAgIGNoYXIgKnAgPSAoY2hhciopcHBhY2tldDsgIC8qIHJlYWxseSByZWFkIGEgcGFja2V0IGFkZHJlc3MgKi8KICAgICBpbnQgICByOwogICAgIGludCAgIGxlbiA9IHNpemVvZigqcHBhY2tldCk7CisgICAgY2hhciAgYnVmZls4XTsKKyAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgc25wcmludGYoYnVmZiwgc2l6ZW9mIGJ1ZmYsICJmZD0lZCIsIGZkKTsKKyAgICAgICAgbmFtZSA9IGJ1ZmY7CisgICAgfQogICAgIHdoaWxlKGxlbiA+IDApIHsKICAgICAgICAgciA9IGFkYl9yZWFkKGZkLCBwLCBsZW4pOwogICAgICAgICBpZihyID4gMCkgewogICAgICAgICAgICAgbGVuIC09IHI7CiAgICAgICAgICAgICBwICAgKz0gcjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEQoInJlYWRfcGFja2V0OiAlZCBlcnJvciAlZCAlZFxuIiwgZmQsIHIsIGVycm5vKTsKKyAgICAgICAgICAgIEQoIiVzOiByZWFkX3BhY2tldCAoZmQ9JWQpLCBlcnJvciByZXQ9JWQgZXJybm89JWQ6ICVzXG4iLCBuYW1lLCBmZCwgciwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICBpZigociA8IDApICYmIChlcnJubyA9PSBFSU5UUikpIGNvbnRpbnVlOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgfQogCiAjaWYgQURCX1RSQUNFCi0gICAgaWYgKEFEQl9UUkFDSU5HKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgIGNvbW1hbmQgPSAoKnBwYWNrZXQpLT5tc2cuY29tbWFuZDsKLSAgICAgICAgaW50ICAgICAgIGxlbiAgICAgPSAoKnBwYWNrZXQpLT5tc2cuZGF0YV9sZW5ndGg7Ci0gICAgICAgIGNoYXIgICAgICBjbWRbNV07Ci0gICAgICAgIGludCAgICAgICBuOwotCi0gICAgICAgIGZvciAobiA9IDA7IG4gPCA0OyBuKyspIHsKLSAgICAgICAgICAgIGludCAgYiA9IChjb21tYW5kID4+IChuKjgpKSAmIDI1NTsKLSAgICAgICAgICAgIGlmIChiID49IDMyICYmIGIgPCAxMjcpCi0gICAgICAgICAgICAgICAgY21kW25dID0gKGNoYXIpYjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjbWRbbl0gPSAnLic7Ci0gICAgICAgIH0KLSAgICAgICAgY21kWzRdID0gMDsKLQotICAgICAgICBEKCJyZWFkX3BhY2tldDogJWQgb2s6IFslMDh4ICVzXSAlMDh4ICUwOHggKCVkKSAiLAotICAgICAgICAgIGZkLCBjb21tYW5kLCBjbWQsICgqcHBhY2tldCktPm1zZy5hcmcwLCAoKnBwYWNrZXQpLT5tc2cuYXJnMSwgbGVuKTsKLSAgICAgICAgZHVtcF9oZXgoKCpwcGFja2V0KS0+ZGF0YSwgbGVuKTsKKyAgICBpZiAoQURCX1RSQUNJTkcpIHsKKyAgICAgICAgZHVtcF9wYWNrZXQobmFtZSwgImZyb20gcmVtb3RlIiwgKnBwYWNrZXQpOwogICAgIH0KICNlbmRpZgogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci13cml0ZV9wYWNrZXQoaW50ICBmZCwgYXBhY2tldCoqIHBwYWNrZXQpCit3cml0ZV9wYWNrZXQoaW50ICBmZCwgY29uc3QgY2hhciogbmFtZSwgYXBhY2tldCoqIHBwYWNrZXQpCiB7CiAgICAgY2hhciAqcCA9IChjaGFyKikgcHBhY2tldDsgIC8qIHdlIHJlYWxseSB3cml0ZSB0aGUgcGFja2V0IGFkZHJlc3MgKi8KICAgICBpbnQgciwgbGVuID0gc2l6ZW9mKHBwYWNrZXQpOworICAgIGNoYXIgYnVmZls4XTsKKyAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgc25wcmludGYoYnVmZiwgc2l6ZW9mIGJ1ZmYsICJmZD0lZCIsIGZkKTsKKyAgICAgICAgbmFtZSA9IGJ1ZmY7CisgICAgfQogCiAjaWYgQURCX1RSQUNFCi0gICAgaWYgKEFEQl9UUkFDSU5HKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgIGNvbW1hbmQgPSAoKnBwYWNrZXQpLT5tc2cuY29tbWFuZDsKLSAgICAgICAgaW50ICAgICAgIGxlbiAgICAgPSAoKnBwYWNrZXQpLT5tc2cuZGF0YV9sZW5ndGg7Ci0gICAgICAgIGNoYXIgICAgICBjbWRbNV07Ci0gICAgICAgIGludCAgICAgICBuOwotCi0gICAgICAgIGZvciAobiA9IDA7IG4gPCA0OyBuKyspIHsKLSAgICAgICAgICAgIGludCAgYiA9IChjb21tYW5kID4+IChuKjgpKSAmIDI1NTsKLSAgICAgICAgICAgIGlmIChiID49IDMyICYmIGIgPCAxMjcpCi0gICAgICAgICAgICAgICAgY21kW25dID0gKGNoYXIpYjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjbWRbbl0gPSAnLic7Ci0gICAgICAgIH0KLSAgICAgICAgY21kWzRdID0gMDsKLQotICAgICAgICBEKCJ3cml0ZV9wYWNrZXQ6ICVkIFslMDh4ICVzXSAlMDh4ICUwOHggKCVkKSAiLAotICAgICAgICAgIGZkLCBjb21tYW5kLCBjbWQsICgqcHBhY2tldCktPm1zZy5hcmcwLCAoKnBwYWNrZXQpLT5tc2cuYXJnMSwgbGVuKTsKLSAgICAgICAgZHVtcF9oZXgoKCpwcGFja2V0KS0+ZGF0YSwgbGVuKTsKKyAgICBpZiAoQURCX1RSQUNJTkcpIHsKKyAgICAgICAgZHVtcF9wYWNrZXQobmFtZSwgInRvIHJlbW90ZSIsICpwcGFja2V0KTsKICAgICB9CiAjZW5kaWYKICAgICBsZW4gPSBzaXplb2YocHBhY2tldCk7CkBAIC0xNjUsNyArMTgxLDcgQEAKICAgICAgICAgICAgIGxlbiAtPSByOwogICAgICAgICAgICAgcCArPSByOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRCgid3JpdGVfcGFja2V0OiAlZCBlcnJvciAlZCAlZFxuIiwgZmQsIHIsIGVycm5vKTsKKyAgICAgICAgICAgIEQoIiVzOiB3cml0ZV9wYWNrZXQgKGZkPSVkKSBlcnJvciByZXQ9JWQgZXJybm89JWQ6ICVzXG4iLCBuYW1lLCBmZCwgciwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICBpZigociA8IDApICYmIChlcnJubyA9PSBFSU5UUikpIGNvbnRpbnVlOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CkBAIC0xNzUsMTAgKzE5MSwxMSBAQAogCiBzdGF0aWMgdm9pZCB0cmFuc3BvcnRfc29ja2V0X2V2ZW50cyhpbnQgZmQsIHVuc2lnbmVkIGV2ZW50cywgdm9pZCAqX3QpCiB7CisgICAgYXRyYW5zcG9ydCAqdCA9IF90OwogICAgIGlmKGV2ZW50cyAmIEZERV9SRUFEKXsKICAgICAgICAgYXBhY2tldCAqcCA9IDA7Ci0gICAgICAgIGlmKHJlYWRfcGFja2V0KGZkLCAmcCkpewotICAgICAgICAgICAgRCgiZmFpbGVkIHRvIHJlYWQgcGFja2V0IGZyb20gdHJhbnNwb3J0IHNvY2tldCBvbiBmZCAlZFxuIiwgZmQpOworICAgICAgICBpZihyZWFkX3BhY2tldChmZCwgdC0+c2VyaWFsLCAmcCkpeworICAgICAgICAgICAgRCgiJXM6IGZhaWxlZCB0byByZWFkIHBhY2tldCBmcm9tIHRyYW5zcG9ydCBzb2NrZXQgb24gZmQgJWRcbiIsIHQtPnNlcmlhbCwgZmQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaGFuZGxlX3BhY2tldChwLCAoYXRyYW5zcG9ydCAqKSBfdCk7CiAgICAgICAgIH0KQEAgLTIwOCw3ICsyMjUsNyBAQAogICAgICAgICBEKCJUcmFuc3BvcnQgaXMgbnVsbCBcbiIpOwogICAgIH0KIAotICAgIGlmKHdyaXRlX3BhY2tldCh0LT50cmFuc3BvcnRfc29ja2V0LCAmcCkpeworICAgIGlmKHdyaXRlX3BhY2tldCh0LT50cmFuc3BvcnRfc29ja2V0LCB0LT5zZXJpYWwsICZwKSl7CiAgICAgICAgIGZhdGFsX2Vycm5vKCJjYW5ub3QgZW5xdWV1ZSBwYWNrZXQgb24gdHJhbnNwb3J0IHNvY2tldCIpOwogICAgIH0KIH0KQEAgLTIzMSw1MiArMjQ4LDUxIEBACiAgICAgYXRyYW5zcG9ydCAqdCA9IF90OwogICAgIGFwYWNrZXQgKnA7CiAKLSAgICBEKCJmcm9tX3JlbW90ZTogc3RhcnRpbmcgdGhyZWFkIGZvciB0cmFuc3BvcnQgJXAsIG9uIGZkICVkXG4iLCB0LCB0LT5mZCApOwotCi0gICAgRCgiZnJvbV9yZW1vdGU6IHRyYW5zcG9ydCAlcCBTWU5DIG9ubGluZSAoJWQpXG4iLCB0LCB0LT5zeW5jX3Rva2VuICsgMSk7CisgICAgRCgiJXM6IHN0YXJ0aW5nIHRyYW5zcG9ydCBvdXRwdXQgdGhyZWFkIG9uIGZkICVkLCBTWU5DIG9ubGluZSAoJWQpXG4iLAorICAgICAgIHQtPnNlcmlhbCwgdC0+ZmQsIHQtPnN5bmNfdG9rZW4gKyAxKTsKICAgICBwID0gZ2V0X2FwYWNrZXQoKTsKICAgICBwLT5tc2cuY29tbWFuZCA9IEFfU1lOQzsKICAgICBwLT5tc2cuYXJnMCA9IDE7CiAgICAgcC0+bXNnLmFyZzEgPSArKyh0LT5zeW5jX3Rva2VuKTsKICAgICBwLT5tc2cubWFnaWMgPSBBX1NZTkMgXiAweGZmZmZmZmZmOwotICAgIGlmKHdyaXRlX3BhY2tldCh0LT5mZCwgJnApKSB7CisgICAgaWYod3JpdGVfcGFja2V0KHQtPmZkLCB0LT5zZXJpYWwsICZwKSkgewogICAgICAgICBwdXRfYXBhY2tldChwKTsKLSAgICAgICAgRCgiZnJvbV9yZW1vdGU6IGZhaWxlZCB0byB3cml0ZSBTWU5DIGFwYWNrZXQgdG8gdHJhbnNwb3J0ICVwIiwgdCk7CisgICAgICAgIEQoIiVzOiBmYWlsZWQgdG8gd3JpdGUgU1lOQyBwYWNrZXRcbiIsIHQtPnNlcmlhbCk7CiAgICAgICAgIGdvdG8gb29wczsKICAgICB9CiAKLSAgICBEKCJmcm9tX3JlbW90ZTogZGF0YSBwdW1wICBmb3IgdHJhbnNwb3J0ICVwXG4iLCB0KTsKKyAgICBEKCIlczogZGF0YSBwdW1wIHN0YXJ0ZWRcbiIsIHQtPnNlcmlhbCk7CiAgICAgZm9yKDs7KSB7CiAgICAgICAgIHAgPSBnZXRfYXBhY2tldCgpOwogCiAgICAgICAgIGlmKHQtPnJlYWRfZnJvbV9yZW1vdGUocCwgdCkgPT0gMCl7Ci0gICAgICAgICAgICBEKCJmcm9tX3JlbW90ZTogcmVjZWl2ZWQgcmVtb3RlIHBhY2tldCwgc2VuZGluZyB0byB0cmFuc3BvcnQgJXBcbiIsCi0gICAgICAgICAgICAgIHQpOwotICAgICAgICAgICAgaWYod3JpdGVfcGFja2V0KHQtPmZkLCAmcCkpeworICAgICAgICAgICAgRCgiJXM6IHJlY2VpdmVkIHJlbW90ZSBwYWNrZXQsIHNlbmRpbmcgdG8gdHJhbnNwb3J0XG4iLAorICAgICAgICAgICAgICB0LT5zZXJpYWwpOworICAgICAgICAgICAgaWYod3JpdGVfcGFja2V0KHQtPmZkLCB0LT5zZXJpYWwsICZwKSl7CiAgICAgICAgICAgICAgICAgcHV0X2FwYWNrZXQocCk7Ci0gICAgICAgICAgICAgICAgRCgiZnJvbV9yZW1vdGU6IGZhaWxlZCB0byB3cml0ZSBhcGFja2V0IHRvIHRyYW5zcG9ydCAlcCIsIHQpOworICAgICAgICAgICAgICAgIEQoIiVzOiBmYWlsZWQgdG8gd3JpdGUgYXBhY2tldCB0byB0cmFuc3BvcnRcbiIsIHQtPnNlcmlhbCk7CiAgICAgICAgICAgICAgICAgZ290byBvb3BzOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRCgiZnJvbV9yZW1vdGU6IHJlbW90ZSByZWFkIGZhaWxlZCBmb3IgdHJhbnNwb3J0ICVwXG4iLCBwKTsKKyAgICAgICAgICAgIEQoIiVzOiByZW1vdGUgcmVhZCBmYWlsZWQgZm9yIHRyYW5zcG9ydFxuIiwgdC0+c2VyaWFsKTsKICAgICAgICAgICAgIHB1dF9hcGFja2V0KHApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBEKCJmcm9tX3JlbW90ZTogU1lOQyBvZmZsaW5lIGZvciB0cmFuc3BvcnQgJXBcbiIsIHQpOworICAgIEQoIiVzOiBTWU5DIG9mZmxpbmUgZm9yIHRyYW5zcG9ydFxuIiwgdC0+c2VyaWFsKTsKICAgICBwID0gZ2V0X2FwYWNrZXQoKTsKICAgICBwLT5tc2cuY29tbWFuZCA9IEFfU1lOQzsKICAgICBwLT5tc2cuYXJnMCA9IDA7CiAgICAgcC0+bXNnLmFyZzEgPSAwOwogICAgIHAtPm1zZy5tYWdpYyA9IEFfU1lOQyBeIDB4ZmZmZmZmZmY7Ci0gICAgaWYod3JpdGVfcGFja2V0KHQtPmZkLCAmcCkpIHsKKyAgICBpZih3cml0ZV9wYWNrZXQodC0+ZmQsIHQtPnNlcmlhbCwgJnApKSB7CiAgICAgICAgIHB1dF9hcGFja2V0KHApOwotICAgICAgICBEKCJmcm9tX3JlbW90ZTogZmFpbGVkIHRvIHdyaXRlIFNZTkMgYXBhY2tldCB0byB0cmFuc3BvcnQgJXAiLCB0KTsKKyAgICAgICAgRCgiJXM6IGZhaWxlZCB0byB3cml0ZSBTWU5DIGFwYWNrZXQgdG8gdHJhbnNwb3J0IiwgdC0+c2VyaWFsKTsKICAgICB9CiAKIG9vcHM6Ci0gICAgRCgiZnJvbV9yZW1vdGU6IHRocmVhZCBpcyBleGl0aW5nIGZvciB0cmFuc3BvcnQgJXBcbiIsIHQpOworICAgIEQoIiVzOiB0cmFuc3BvcnQgb3V0cHV0IHRocmVhZCBpcyBleGl0aW5nXG4iLCB0LT5zZXJpYWwpOwogICAgIGtpY2tfdHJhbnNwb3J0KHQpOwogICAgIHRyYW5zcG9ydF91bnJlZih0KTsKICAgICByZXR1cm4gMDsKQEAgLTI4OCwzNSArMzA0LDM1IEBACiAgICAgYXBhY2tldCAqcDsKICAgICBpbnQgYWN0aXZlID0gMDsKIAotICAgIEQoInRvX3JlbW90ZTogc3RhcnRpbmcgaW5wdXRfdGhyZWFkIGZvciAlcCwgcmVhZGluZyBmcm9tIGZkICVkXG4iLAotICAgICAgIHQsIHQtPmZkKTsKKyAgICBEKCIlczogc3RhcnRpbmcgdHJhbnNwb3J0IGlucHV0IHRocmVhZCwgcmVhZGluZyBmcm9tIGZkICVkXG4iLAorICAgICAgIHQtPnNlcmlhbCwgdC0+ZmQpOwogCiAgICAgZm9yKDs7KXsKLSAgICAgICAgaWYocmVhZF9wYWNrZXQodC0+ZmQsICZwKSkgewotICAgICAgICAgICAgRCgidG9fcmVtb3RlOiBmYWlsZWQgdG8gcmVhZCBhcGFja2V0IGZyb20gdHJhbnNwb3J0ICVwIG9uIGZkICVkXG4iLCAKLSAgICAgICAgICAgICAgIHQsIHQtPmZkICk7CisgICAgICAgIGlmKHJlYWRfcGFja2V0KHQtPmZkLCB0LT5zZXJpYWwsICZwKSkgeworICAgICAgICAgICAgRCgiJXM6IGZhaWxlZCB0byByZWFkIGFwYWNrZXQgZnJvbSB0cmFuc3BvcnQgb24gZmQgJWRcbiIsCisgICAgICAgICAgICAgICB0LT5zZXJpYWwsIHQtPmZkICk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZihwLT5tc2cuY29tbWFuZCA9PSBBX1NZTkMpewogICAgICAgICAgICAgaWYocC0+bXNnLmFyZzAgPT0gMCkgewotICAgICAgICAgICAgICAgIEQoInRvX3JlbW90ZTogdHJhbnNwb3J0ICVwIFNZTkMgb2ZmbGluZVxuIiwgdCk7CisgICAgICAgICAgICAgICAgRCgiJXM6IHRyYW5zcG9ydCBTWU5DIG9mZmxpbmVcbiIsIHQtPnNlcmlhbCk7CiAgICAgICAgICAgICAgICAgcHV0X2FwYWNrZXQocCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmKHAtPm1zZy5hcmcxID09IHQtPnN5bmNfdG9rZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgRCgidG9fcmVtb3RlOiB0cmFuc3BvcnQgJXAgU1lOQyBvbmxpbmVcbiIsIHQpOworICAgICAgICAgICAgICAgICAgICBEKCIlczogdHJhbnNwb3J0IFNZTkMgb25saW5lXG4iLCB0LT5zZXJpYWwpOwogICAgICAgICAgICAgICAgICAgICBhY3RpdmUgPSAxOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEQoInRvX3JlbW90ZTogdHJhbmRwb3J0ICVwIGlnbm9yaW5nIFNZTkMgJWQgIT0gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgdCwgcC0+bXNnLmFyZzEsIHQtPnN5bmNfdG9rZW4pOworICAgICAgICAgICAgICAgICAgICBEKCIlczogdHJhbnNwb3J0IGlnbm9yaW5nIFNZTkMgJWQgIT0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgdC0+c2VyaWFsLCBwLT5tc2cuYXJnMSwgdC0+c3luY190b2tlbik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYoYWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgRCgidG9fcmVtb3RlOiB0cmFuc3BvcnQgJXAgZ290IHBhY2tldCwgc2VuZGluZyB0byByZW1vdGVcbiIsIHQpOworICAgICAgICAgICAgICAgIEQoIiVzOiB0cmFuc3BvcnQgZ290IHBhY2tldCwgc2VuZGluZyB0byByZW1vdGVcbiIsIHQtPnNlcmlhbCk7CiAgICAgICAgICAgICAgICAgdC0+d3JpdGVfdG9fcmVtb3RlKHAsIHQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBEKCJ0b19yZW1vdGU6IHRyYW5zcG9ydCAlcCBpZ25vcmluZyBwYWNrZXQgd2hpbGUgb2ZmbGluZVxuIiwgdCk7CisgICAgICAgICAgICAgICAgRCgiJXM6IHRyYW5zcG9ydCBpZ25vcmluZyBwYWNrZXQgd2hpbGUgb2ZmbGluZVxuIiwgdC0+c2VyaWFsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zMjcsNyArMzQzLDcgQEAKICAgICAvLyB3aGlsZSBhIGNsaWVudCBzb2NrZXQgaXMgc3RpbGwgYWN0aXZlLgogICAgIGNsb3NlX2FsbF9zb2NrZXRzKHQpOwogCi0gICAgRCgidG9fcmVtb3RlOiB0aHJlYWQgaXMgZXhpdGluZyBmb3IgdHJhbnNwb3J0ICVwLCBmZCAlZFxuIiwgdCwgdC0+ZmQpOworICAgIEQoIiVzOiB0cmFuc3BvcnQgaW5wdXQgdGhyZWFkIGlzIGV4aXRpbmcsIGZkICVkXG4iLCB0LT5zZXJpYWwsIHQtPmZkKTsKICAgICBraWNrX3RyYW5zcG9ydCh0KTsKICAgICB0cmFuc3BvcnRfdW5yZWYodCk7CiAgICAgcmV0dXJuIDA7CkBAIC01MDgsNyArNTI0LDcgQEAKICAgICAgICAgICAgIHAgICArPSByOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYoKHIgPCAwKSAmJiAoZXJybm8gPT0gRUlOVFIpKSBjb250aW51ZTsKLSAgICAgICAgICAgIEQoInRyYW5zcG9ydF9yZWFkX2FjdGlvbjogb24gZmQgJWQsIGVycm9yICVkOiAlc1xuIiwgCisgICAgICAgICAgICBEKCJ0cmFuc3BvcnRfcmVhZF9hY3Rpb246IG9uIGZkICVkLCBlcnJvciAlZDogJXNcbiIsCiAgICAgICAgICAgICAgIGZkLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQpAQCAtNTMwLDcgKzU0Niw3IEBACiAgICAgICAgICAgICBwICAgKz0gcjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmKChyIDwgMCkgJiYgKGVycm5vID09IEVJTlRSKSkgY29udGludWU7Ci0gICAgICAgICAgICBEKCJ0cmFuc3BvcnRfd3JpdGVfYWN0aW9uOiBvbiBmZCAlZCwgZXJyb3IgJWQ6ICVzXG4iLCAKKyAgICAgICAgICAgIEQoInRyYW5zcG9ydF93cml0ZV9hY3Rpb246IG9uIGZkICVkLCBlcnJvciAlZDogJXNcbiIsCiAgICAgICAgICAgICAgIGZkLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQpAQCAtNTU3LDcgKzU3Myw3IEBACiAgICAgdCA9IG0udHJhbnNwb3J0OwogCiAgICAgaWYobS5hY3Rpb24gPT0gMCl7Ci0gICAgICAgIEQoInRyYW5zcG9ydDogJXAgcmVtb3ZpbmcgYW5kIGZyZWUnaW5nICVkXG4iLCB0LCB0LT50cmFuc3BvcnRfc29ja2V0KTsKKyAgICAgICAgRCgidHJhbnNwb3J0OiAlcyByZW1vdmluZyBhbmQgZnJlZSdpbmcgJWRcbiIsIHQtPnNlcmlhbCwgdC0+dHJhbnNwb3J0X3NvY2tldCk7CiAKICAgICAgICAgICAgIC8qIElNUE9SVEFOVDogdGhlIHJlbW92ZSBjbG9zZXMgb25lIGhhbGYgb2YgdGhlCiAgICAgICAgICAgICAqKiBzb2NrZXQgcGFpci4gIFRoZSBjbG9zZSBjbG9zZXMgdGhlIG90aGVyIGhhbGYuCkBAIC01OTMsMTIgKzYwOSwxMSBAQAogICAgICAgICAgICAgZmF0YWxfZXJybm8oImNhbm5vdCBvcGVuIHRyYW5zcG9ydCBzb2NrZXRwYWlyIik7CiAgICAgICAgIH0KIAotICAgICAgICBEKCJ0cmFuc3BvcnQ6ICVwICglZCwlZCkgc3RhcnRpbmdcbiIsIHQsIHNbMF0sIHNbMV0pOworICAgICAgICBEKCJ0cmFuc3BvcnQ6ICVzICglZCwlZCkgc3RhcnRpbmdcbiIsIHQtPnNlcmlhbCwgc1swXSwgc1sxXSk7CiAKICAgICAgICAgdC0+dHJhbnNwb3J0X3NvY2tldCA9IHNbMF07CiAgICAgICAgIHQtPmZkID0gc1sxXTsKIAotICAgICAgICBEKCJ0cmFuc3BvcnQ6ICVwIGluc3RhbGwgJWRcbiIsIHQsIHQtPnRyYW5zcG9ydF9zb2NrZXQgKTsKICAgICAgICAgZmRldmVudF9pbnN0YWxsKCYodC0+dHJhbnNwb3J0X2ZkZSksCiAgICAgICAgICAgICAgICAgICAgICAgICB0LT50cmFuc3BvcnRfc29ja2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3NvY2tldF9ldmVudHMsCkBAIC02NTMsNyArNjY4LDcgQEAKICAgICB0bXNnIG07CiAgICAgbS50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CiAgICAgbS5hY3Rpb24gPSAxOwotICAgIEQoInRyYW5zcG9ydDogJXAgcmVnaXN0ZXJlZFxuIiwgdHJhbnNwb3J0KTsKKyAgICBEKCJ0cmFuc3BvcnQ6ICVzIHJlZ2lzdGVyZWRcbiIsIHRyYW5zcG9ydC0+c2VyaWFsKTsKICAgICBpZih0cmFuc3BvcnRfd3JpdGVfYWN0aW9uKHRyYW5zcG9ydF9yZWdpc3RyYXRpb25fc2VuZCwgJm0pKSB7CiAgICAgICAgIGZhdGFsX2Vycm5vKCJjYW5ub3Qgd3JpdGUgdHJhbnNwb3J0IHJlZ2lzdHJhdGlvbiBzb2NrZXRcbiIpOwogICAgIH0KQEAgLTY2NCw3ICs2NzksNyBAQAogICAgIHRtc2cgbTsKICAgICBtLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKICAgICBtLmFjdGlvbiA9IDA7Ci0gICAgRCgidHJhbnNwb3J0OiAlcCByZW1vdmVkXG4iLCB0cmFuc3BvcnQpOworICAgIEQoInRyYW5zcG9ydDogJXMgcmVtb3ZlZFxuIiwgdHJhbnNwb3J0LT5zZXJpYWwpOwogICAgIGlmKHRyYW5zcG9ydF93cml0ZV9hY3Rpb24odHJhbnNwb3J0X3JlZ2lzdHJhdGlvbl9zZW5kLCAmbSkpIHsKICAgICAgICAgZmF0YWxfZXJybm8oImNhbm5vdCB3cml0ZSB0cmFuc3BvcnQgcmVnaXN0cmF0aW9uIHNvY2tldFxuIik7CiAgICAgfQpAQCAtNjc0LDE1ICs2ODksMTYgQEAKIHN0YXRpYyB2b2lkIHRyYW5zcG9ydF91bnJlZl9sb2NrZWQoYXRyYW5zcG9ydCAqdCkKIHsKICAgICB0LT5yZWZfY291bnQtLTsKLSAgICBEKCJ0cmFuc3BvcnQ6ICVwIFItIChyZWY9JWQpXG4iLCB0LCB0LT5yZWZfY291bnQpOwogICAgIGlmICh0LT5yZWZfY291bnQgPT0gMCkgewotICAgICAgICBEKCJ0cmFuc3BvcnQ6ICVwIGtpY2tpbmcgYW5kIGNsb3NpbmdcbiIsIHQpOworICAgICAgICBEKCJ0cmFuc3BvcnQ6ICVzIHVucmVmIChraWNraW5nIGFuZCBjbG9zaW5nKVxuIiwgdC0+c2VyaWFsKTsKICAgICAgICAgaWYgKCF0LT5raWNrZWQpIHsKICAgICAgICAgICAgIHQtPmtpY2tlZCA9IDE7CiAgICAgICAgICAgICB0LT5raWNrKHQpOwogICAgICAgICB9CiAgICAgICAgIHQtPmNsb3NlKHQpOwogICAgICAgICByZW1vdmVfdHJhbnNwb3J0KHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEQoInRyYW5zcG9ydDogJXMgdW5yZWYgKGNvdW50PSVkKVxuIiwgdC0+c2VyaWFsLCB0LT5yZWZfY291bnQpOwogICAgIH0KIH0KIApAQCAtODU3LDcgKzg3MywxMyBAQAogdm9pZCByZWdpc3Rlcl9zb2NrZXRfdHJhbnNwb3J0KGludCBzLCBjb25zdCBjaGFyICpzZXJpYWwsIGludCBwb3J0LCBpbnQgbG9jYWwpCiB7CiAgICAgYXRyYW5zcG9ydCAqdCA9IGNhbGxvYygxLCBzaXplb2YoYXRyYW5zcG9ydCkpOwotICAgIEQoInRyYW5zcG9ydDogJXAgaW5pdCdpbmcgZm9yIHNvY2tldCAlZCwgb24gcG9ydCAlZFxuIiwgdCwgcywgcG9ydCk7CisgICAgY2hhciBidWZmWzMyXTsKKworICAgIGlmICghc2VyaWFsKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmYsIHNpemVvZiBidWZmLCAiVC0lcCIsIHQpOworICAgICAgICBzZXJpYWwgPSBidWZmOworICAgIH0KKyAgICBEKCJ0cmFuc3BvcnQ6ICVzIGluaXQnaW5nIGZvciBzb2NrZXQgJWQsIG9uIHBvcnQgJWRcbiIsIHNlcmlhbCwgcywgcG9ydCk7CiAgICAgaWYgKCBpbml0X3NvY2tldF90cmFuc3BvcnQodCwgcywgcG9ydCwgbG9jYWwpIDwgMCApIHsKICAgICAgICAgYWRiX2Nsb3NlKHMpOwogICAgICAgICBmcmVlKHQpOwpAQCAtOTYxLDIxICs5ODMsMjYgQEAKICNpZiBBREJfVFJBQ0UKICAgICBpbnQgIGxlbjAgPSBsZW47CiAjZW5kaWYKLSAgICBEKCJyZWFkeDogJWQgJXAgJWRcbiIsIGZkLCBwdHIsIChpbnQpbGVuKTsKKyAgICBEKCJyZWFkeDogZmQ9JWQgd2FudGVkPSVkXG4iLCBmZCwgKGludClsZW4pOwogICAgIHdoaWxlKGxlbiA+IDApIHsKICAgICAgICAgciA9IGFkYl9yZWFkKGZkLCBwLCBsZW4pOwogICAgICAgICBpZihyID4gMCkgewogICAgICAgICAgICAgbGVuIC09IHI7CiAgICAgICAgICAgICBwICs9IHI7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBEKCJyZWFkeDogJWQgJWQgJXNcbiIsIGZkLCByLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgaWYoKHIgPCAwKSAmJiAoZXJybm8gPT0gRUlOVFIpKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChyIDwgMCkgeworICAgICAgICAgICAgICAgIEQoInJlYWR4OiBmZD0lZCBlcnJvciAlZDogJXNcbiIsIGZkLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBEKCJyZWFkeDogZmQ9JWQgZGlzY29ubmVjdGVkXG4iLCBmZCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CiAKICNpZiBBREJfVFJBQ0UKLSAgICBEKCJyZWFkeDogJWQgb2s6ICIsIGZkKTsKKyAgICBEKCJyZWFkeDogZmQ9JWQgd2FudGVkPSVkIGdvdD0lZFxuIiwgZmQsIGxlbjAsIGxlbjAgLSBsZW4pOwogICAgIGR1bXBfaGV4KCBwdHIsIGxlbjAgKTsKICNlbmRpZgogICAgIHJldHVybiAwOwpAQCAtOTg3LDcgKzEwMTQsNyBAQAogICAgIGludCByOwogCiAjaWYgQURCX1RSQUNFCi0gICAgRCgid3JpdGV4OiAlZCAlcCAlZDogIiwgZmQsIHB0ciwgKGludClsZW4pOworICAgIEQoIndyaXRleDogZmQ9JWQgbGVuPSVkOiAiLCBmZCwgKGludClsZW4pOwogICAgIGR1bXBfaGV4KCBwdHIsIGxlbiApOwogI2VuZGlmCiAgICAgd2hpbGUobGVuID4gMCkgewpAQCAtOTk2LDEzICsxMDIzLDE2IEBACiAgICAgICAgICAgICBsZW4gLT0gcjsKICAgICAgICAgICAgIHAgKz0gcjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEQoIndyaXRleDogJWQgJWQgJXNcbiIsIGZkLCByLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgaWYoKHIgPCAwKSAmJiAoZXJybm8gPT0gRUlOVFIpKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChyIDwgMCkgeworICAgICAgICAgICAgICAgIEQoIndyaXRleDogZmQ9JWQgZXJyb3IgJWQ6ICVzXG4iLCBmZCwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRCgid3JpdGV4OiBmZD0lZCBkaXNjb25uZWN0ZWRcbiIsIGZkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgIH0KLQotICAgIEQoIndyaXRleDogJWQgb2tcbiIsIGZkKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYWRiL3RyYW5zcG9ydF9sb2NhbC5jIGIvYWRiL3RyYW5zcG9ydF9sb2NhbC5jCmluZGV4IDhkZmM5OGQuLjQ0MzFiYTcgMTAwNjQ0Ci0tLSBhL2FkYi90cmFuc3BvcnRfbG9jYWwuYworKysgYi9hZGIvdHJhbnNwb3J0X2xvY2FsLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNkZWZpbmUgIFRSQUNFX1RBRyAgVFJBQ0VfVFJBTlNQT1JUCiAjaW5jbHVkZSAiYWRiLmgiCiAKLSNpZmRlZiBfX3BwY19fCisjaWZkZWYgSEFWRV9CSUdfRU5ESUFOCiAjZGVmaW5lIEg0KHgpCSgoKHgpICYgMHhGRjAwMDAwMCkgPj4gMjQpIHwgKCgoeCkgJiAweDAwRkYwMDAwKSA+PiA4KSB8ICgoKHgpICYgMHgwMDAwRkYwMCkgPDwgOCkgfCAoKCh4KSAmIDB4MDAwMDAwRkYpIDw8IDI0KQogc3RhdGljIGlubGluZSB2b2lkIGZpeF9lbmRpYW5zKGFwYWNrZXQgKnApCiB7CkBAIC02MSw3ICs2MSw3IEBACiAKICAgICBmaXhfZW5kaWFucyhwKTsKIAotI2lmIDAgJiYgZGVmaW5lZCBfX3BwY19fCisjaWYgMCAmJiBkZWZpbmVkIEhBVkVfQklHX0VORElBTgogICAgIEQoInJlYWQgcmVtb3RlIHBhY2tldDogJTA0eCBhcmcwPSUweCBhcmcxPSUweCBkYXRhX2xlbmd0aD0lMHggZGF0YV9jaGVjaz0lMHggbWFnaWM9JTB4XG4iLAogICAgICAgcC0+bXNnLmNvbW1hbmQsIHAtPm1zZy5hcmcwLCBwLT5tc2cuYXJnMSwgcC0+bXNnLmRhdGFfbGVuZ3RoLCBwLT5tc2cuZGF0YV9jaGVjaywgcC0+bXNnLm1hZ2ljKTsKICNlbmRpZgpAQCAtODksNyArODksNyBAQAogCiAgICAgZml4X2VuZGlhbnMocCk7CiAKLSNpZiAwICYmIGRlZmluZWQgX19wcGNfXworI2lmIDAgJiYgZGVmaW5lZCBIQVZFX0JJR19FTkRJQU4KICAgICBEKCJ3cml0ZSByZW1vdGUgcGFja2V0OiAlMDR4IGFyZzA9JTB4IGFyZzE9JTB4IGRhdGFfbGVuZ3RoPSUweCBkYXRhX2NoZWNrPSUweCBtYWdpYz0lMHhcbiIsCiAgICAgICBwLT5tc2cuY29tbWFuZCwgcC0+bXNnLmFyZzAsIHAtPm1zZy5hcmcxLCBwLT5tc2cuZGF0YV9sZW5ndGgsIHAtPm1zZy5kYXRhX2NoZWNrLCBwLT5tc2cubWFnaWMpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hZGIvdHJhbnNwb3J0X3VzYi5jIGIvYWRiL3RyYW5zcG9ydF91c2IuYwppbmRleCAyNTg0MTYzLi5lZTZiNjM3IDEwMDY0NAotLS0gYS9hZGIvdHJhbnNwb3J0X3VzYi5jCisrKyBiL2FkYi90cmFuc3BvcnRfdXNiLmMKQEAgLTI3LDggKzI3LDcgQEAKICNpbmNsdWRlICJ1c2JfdmVuZG9ycy5oIgogI2VuZGlmCiAKLS8qIFhYWCBiZXR0ZXIgZGVmaW5lPyAqLwotI2lmZGVmIF9fcHBjX18KKyNpZmRlZiBIQVZFX0JJR19FTkRJQU4KICNkZWZpbmUgSDQoeCkJKCgoeCkgJiAweEZGMDAwMDAwKSA+PiAyNCkgfCAoKCh4KSAmIDB4MDBGRjAwMDApID4+IDgpIHwgKCgoeCkgJiAweDAwMDBGRjAwKSA8PCA4KSB8ICgoKHgpICYgMHgwMDAwMDBGRikgPDwgMjQpCiBzdGF0aWMgaW5saW5lIHZvaWQgZml4X2VuZGlhbnMoYXBhY2tldCAqcCkKIHsKZGlmZiAtLWdpdCBhL2FkYi91c2JfbGludXguYyBiL2FkYi91c2JfbGludXguYwppbmRleCBiYjg2ODEzLi5jZDYxMDgzIDEwMDY0NAotLS0gYS9hZGIvdXNiX2xpbnV4LmMKKysrIGIvYWRiL3VzYl9saW51eC5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAogLy8gICAgICAgIERCR1goIlsgc2Nhbm5pbmcgJXMgXVxuIiwgYnVzbmFtZSk7CiAgICAgICAgIHdoaWxlKChkZSA9IHJlYWRkaXIoZGV2ZGlyKSkpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZGV2ZGVzY1syNTZdOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBkZXZkZXNjWzQwOTZdOwogICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmcHRyID0gZGV2ZGVzYzsKICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZmVuZDsKICAgICAgICAgICAgIHN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IqIGRldmljZTsKQEAgLTE5MSw5ICsxOTEsOCBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB2aWQgPSBfX2xlMTZfdG9fY3B1KGRldmljZS0+aWRWZW5kb3IpOwotICAgICAgICAgICAgcGlkID0gX19sZTE2X3RvX2NwdShkZXZpY2UtPmlkUHJvZHVjdCk7Ci0gICAgICAgICAgICBwaWQgPSBkZXZkZXNjWzEwXSB8IChkZXZkZXNjWzExXSA8PCA4KTsKKyAgICAgICAgICAgIHZpZCA9IGRldmljZS0+aWRWZW5kb3I7CisgICAgICAgICAgICBwaWQgPSBkZXZpY2UtPmlkUHJvZHVjdDsKICAgICAgICAgICAgIERCR1goIlsgJXMgaXMgVjolMDR4IFA6JTA0eCBdXG4iLCBkZXZuYW1lLCB2aWQsIHBpZCk7CiAKICAgICAgICAgICAgICAgICAvLyBzaG91bGQgaGF2ZSBjb25maWcgZGVzY3JpcHRvciBuZXh0CkBAIC02MTcsNyArNjE2LDcgQEAKICAgICAgICAgICAgIGN0cmwuYlJlcXVlc3RUeXBlID0gVVNCX0RJUl9JTnxVU0JfVFlQRV9TVEFOREFSRHxVU0JfUkVDSVBfREVWSUNFOwogICAgICAgICAgICAgY3RybC5iUmVxdWVzdCA9IFVTQl9SRVFfR0VUX0RFU0NSSVBUT1I7CiAgICAgICAgICAgICBjdHJsLndWYWx1ZSA9IChVU0JfRFRfU1RSSU5HIDw8IDgpIHwgc2VyaWFsX2luZGV4OwotICAgICAgICAgICAgY3RybC53SW5kZXggPSBsYW5ndWFnZXNbaV07CisgICAgICAgICAgICBjdHJsLndJbmRleCA9IF9fbGUxNl90b19jcHUobGFuZ3VhZ2VzW2ldKTsKICAgICAgICAgICAgIGN0cmwud0xlbmd0aCA9IHNpemVvZihidWZmZXIpOwogICAgICAgICAgICAgY3RybC5kYXRhID0gYnVmZmVyOwogCkBAIC02MjcsNyArNjI2LDcgQEAKICAgICAgICAgICAgICAgICAvLyBza2lwIGZpcnN0IHdvcmQsIGFuZCBjb3B5IHRoZSByZXN0IHRvIHRoZSBzZXJpYWwgc3RyaW5nLCBjaGFuZ2luZyBzaG9ydHMgdG8gYnl0ZXMuCiAgICAgICAgICAgICAgICAgcmVzdWx0IC89IDI7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJlc3VsdDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBzZXJpYWxbaSAtIDFdID0gYnVmZmVyW2ldOworICAgICAgICAgICAgICAgICAgICBzZXJpYWxbaSAtIDFdID0gX19sZTE2X3RvX2NwdShidWZmZXJbaV0pOwogICAgICAgICAgICAgICAgIHNlcmlhbFtpIC0gMV0gPSAwOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvYWRiL3VzYl92ZW5kb3JzLmMgYi9hZGIvdXNiX3ZlbmRvcnMuYwppbmRleCBjYmMyNDY0Li5kNjQyNTY2IDEwMDY0NAotLS0gYS9hZGIvdXNiX3ZlbmRvcnMuYworKysgYi9hZGIvdXNiX3ZlbmRvcnMuYwpAQCAtNjksNiArNjksOCBAQAogI2RlZmluZSBWRU5ET1JfSURfUEFOVEVDSCAgICAgICAweDEwQTkKIC8vIFF1YWxjb21tJ3MgVVNCIFZlbmRvciBJRAogI2RlZmluZSBWRU5ET1JfSURfUVVBTENPTU0gICAgICAweDA1YzYKKy8vIE9uLVRoZS1Hby1WaWRlbydzIFVTQiBWZW5kb3IgSUQKKyNkZWZpbmUgVkVORE9SX0lEX09UR1YgICAgICAgICAgMHgyMjU3CiAvLyBORUMncyBVU0IgVmVuZG9yIElECiAjZGVmaW5lIFZFTkRPUl9JRF9ORUMgICAgICAgICAgIDB4MDQwOQogLy8gUGFuYXNvbmljIE1vYmlsZSBDb21tdW5pY2F0aW9uJ3MgVVNCIFZlbmRvciBJRApAQCAtODMsNiArODUsOCBAQAogI2RlZmluZSBWRU5ET1JfSURfQVNVUyAgICAgICAgICAweDBiMDUKIC8vIFBoaWxpcHMncyBVU0IgVmVuZG9yIElECiAjZGVmaW5lIFZFTkRPUl9JRF9QSElMSVBTICAgICAgIDB4MDQ3MQorLy8gVGV4YXMgSW5zdHJ1bWVudHMncyBVU0IgVmVuZG9yIElECisjZGVmaW5lIFZFTkRPUl9JRF9USSAgICAgICAgICAgIDB4MDQ1MQogCiAKIC8qKiBidWlsdC1pbiB2ZW5kb3IgbGlzdCAqLwpAQCAtMTA0LDYgKzEwOCw3IEBACiAgICAgVkVORE9SX0lEX0tZT0NFUkEsCiAgICAgVkVORE9SX0lEX1BBTlRFQ0gsCiAgICAgVkVORE9SX0lEX1FVQUxDT01NLAorICAgIFZFTkRPUl9JRF9PVEdWLAogICAgIFZFTkRPUl9JRF9ORUMsCiAgICAgVkVORE9SX0lEX1BNQywKICAgICBWRU5ET1JfSURfVE9TSElCQSwKQEAgLTExMSw2ICsxMTYsNyBAQAogICAgIFZFTkRPUl9JRF9LVF9URUNILAogICAgIFZFTkRPUl9JRF9BU1VTLAogICAgIFZFTkRPUl9JRF9QSElMSVBTLAorICAgIFZFTkRPUl9JRF9USSwKIH07CiAKICNkZWZpbmUgQlVJTFRfSU5fVkVORE9SX0NPVU5UICAgIChzaXplb2YoYnVpbHRJblZlbmRvcklkcykvc2l6ZW9mKGJ1aWx0SW5WZW5kb3JJZHNbMF0pKQpAQCAtMTcyLDcgKzE3OCw3IEBACiAvKiBidWlsZHMgdGhlIHBhdGggdG8gdGhlIGFkYiB2ZW5kb3IgaWQgZmlsZS4gcmV0dXJucyAwIGlmIHN1Y2Nlc3MgKi8KIGludCBidWlsZF9wYXRoKGNoYXIqIGJ1ZmYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIqIGZvcm1hdCwgY29uc3QgY2hhciogaG9tZSkKIHsKLSAgICBpZiAoc25wcmludGYoYnVmZiwgbGVuLCBmb3JtYXQsIGhvbWUsIEFORFJPSURfUEFUSCwgQU5EUk9JRF9BREJfSU5JKSA+PSBsZW4pIHsKKyAgICBpZiAoc25wcmludGYoYnVmZiwgbGVuLCBmb3JtYXQsIGhvbWUsIEFORFJPSURfUEFUSCwgQU5EUk9JRF9BREJfSU5JKSA+PSAoc2lnbmVkKWxlbikgewogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9BbmRyb2lkLm1rIGIvZGVidWdnZXJkL0FuZHJvaWQubWsKaW5kZXggM2MxY2YwMi4uNzUyYzk1MyAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL0FuZHJvaWQubWsKKysrIGIvZGVidWdnZXJkL0FuZHJvaWQubWsKQEAgLTEsMTEgKzEsMTUgQEAKICMgQ29weXJpZ2h0IDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogCi1pZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCitpZm5lcSAoJChmaWx0ZXIgYXJtIHg4NiwkKFRBUkdFVF9BUkNIKSksKQogCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9TUkNfRklMRVM6PSBkZWJ1Z2dlcmQuYyBnZXRldmVudC5jIHVud2luZC1hcm0uYyBwci1zdXBwb3J0LmMgdXRpbGl0eS5jCitMT0NBTF9TUkNfRklMRVM6PSBkZWJ1Z2dlcmQuYyB1dGlsaXR5LmMgZ2V0ZXZlbnQuYyAkKFRBUkdFVF9BUkNIKS9tYWNoaW5lLmMgJChUQVJHRVRfQVJDSCkvdW53aW5kLmMgc3ltYm9sX3RhYmxlLmMKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKFRBUkdFVF9BUkNIKS9wci1zdXBwb3J0LmMKK2VuZGlmCisKIExPQ0FMX0NGTEFHUyA6PSAtV2FsbAogTE9DQUxfTU9EVUxFIDo9IGRlYnVnZ2VyZAogCkBAIC0yMiw3ICsyNiw3IEBACiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfU1JDX0ZJTEVTIDo9IGNyYXNoZXIuYwotTE9DQUxfU1JDX0ZJTEVTICs9IGNyYXNoZ2x1ZS5TCitMT0NBTF9TUkNfRklMRVMgKz0gJChUQVJHRVRfQVJDSCkvY3Jhc2hnbHVlLlMKIExPQ0FMX01PRFVMRSA6PSBjcmFzaGVyCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfT1BUSU9OQUxfRVhFQ1VUQUJMRVMpCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBlbmcKQEAgLTQ2LDQgKzUwLDQgQEAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogZW5kaWYgIyBBUkNIX0FSTV9IQVZFX1ZGUCA9PSB0cnVlCiAKLWVuZGlmICMgVEFSR0VUX0FSQ0ggPT0gYXJtCitlbmRpZiAjIGFybSBvciB4ODYgaW4gVEFSR0VUX0FSQ0gKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9jcmFzaGdsdWUuUyBiL2RlYnVnZ2VyZC9hcm0vY3Jhc2hnbHVlLlMKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gZGVidWdnZXJkL2NyYXNoZ2x1ZS5TCnJlbmFtZSB0byBkZWJ1Z2dlcmQvYXJtL2NyYXNoZ2x1ZS5TCmluZGV4IDBjMWZkOWIuLmViOWQwZTMgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9jcmFzaGdsdWUuUworKysgYi9kZWJ1Z2dlcmQvYXJtL2NyYXNoZ2x1ZS5TCkBAIC0yLDcgKzIsNyBAQAogLnR5cGUgY3Jhc2gxLCAlZnVuY3Rpb24KIC5nbG9ibCBjcmFzaG5vc3RhY2sKIC50eXBlIGNyYXNobm9zdGFjaywgJWZ1bmN0aW9uCi0JCQorCiBjcmFzaDE6CiAJbGRyIHIwLCA9MHhhNWE1MDAwMAogCWxkciByMSwgPTB4YTVhNTAwMDEKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9hcm0vbWFjaGluZS5jIGIvZGVidWdnZXJkL2FybS9tYWNoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkMGJhZgotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyZC9hcm0vbWFjaGluZS5jCkBAIC0wLDAgKzEsMjI5IEBACisvKiBzeXN0ZW0vZGVidWdnZXJkL2RlYnVnZ2VyZC5jCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvZXhlY19lbGYuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3NvY2tldHMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworI2luY2x1ZGUgInV0aWxpdHkuaCIKKworI2lmZGVmIFdJVEhfVkZQCisjaWZkZWYgV0lUSF9WRlBfRDMyCisjZGVmaW5lIE5VTV9WRlBfUkVHUyAzMgorI2Vsc2UKKyNkZWZpbmUgTlVNX1ZGUF9SRUdTIDE2CisjZW5kaWYKKyNlbmRpZgorCisvKiBNYWluIGVudHJ5IHBvaW50IHRvIGdldCB0aGUgYmFja3RyYWNlIGZyb20gdGhlIGNyYXNoaW5nIHByb2Nlc3MgKi8KK2V4dGVybiBpbnQgdW53aW5kX2JhY2t0cmFjZV93aXRoX3B0cmFjZShpbnQgdGZkLCBwaWRfdCBwaWQsIG1hcGluZm8gKm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3BfbGlzdFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZnJhbWUwX3BjX3NhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdF9mYXVsdCk7CisKK3ZvaWQgZHVtcF9zdGFja19hbmRfY29kZShpbnQgdGZkLCBpbnQgcGlkLCBtYXBpbmZvICptYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVud2luZF9kZXB0aCwgdW5zaWduZWQgaW50IHNwX2xpc3RbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF0X2ZhdWx0KQoreworICAgIHVuc2lnbmVkIGludCBzcCwgcGMsIHAsIGVuZCwgZGF0YTsKKyAgICBzdHJ1Y3QgcHRfcmVncyByOworICAgIGludCBzcF9kZXB0aDsKKyAgICBib29sIG9ubHlfaW5fdG9tYnN0b25lID0gIWF0X2ZhdWx0OworICAgIGNoYXIgY29kZV9idWZmZXJbODBdOworCisgICAgaWYocHRyYWNlKFBUUkFDRV9HRVRSRUdTLCBwaWQsIDAsICZyKSkgcmV0dXJuOworICAgIHNwID0gci5BUk1fc3A7CisgICAgcGMgPSByLkFSTV9wYzsKKworICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwgIlxuY29kZSBhcm91bmQgcGM6XG4iKTsKKworICAgIGVuZCA9IHAgPSBwYyAmIH4zOworICAgIHAgLT0gMzI7CisgICAgZW5kICs9IDMyOworCisgICAgLyogRHVtcCB0aGUgY29kZSBhcm91bmQgUEMgYXM6CisgICAgICogIGFkZHIgICAgICAgY29udGVudHMKKyAgICAgKiAgMDAwMDhkMzQgICBmZmZmZmNkMCA0YzBlYjUzMCBiMDkzNGEwZSAxYzA1NDQ3YworICAgICAqICAwMDAwOGQ0NCAgIGY3ZmYxOGEwIDQ5MGNlZDk0IDY4MDM1ODYwIGQwMDEyYjAwCisgICAgICovCisgICAgd2hpbGUgKHAgPD0gZW5kKSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIHNwcmludGYoY29kZV9idWZmZXIsICIlMDh4ICIsIHApOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBkYXRhID0gcHRyYWNlKFBUUkFDRV9QRUVLVEVYVCwgcGlkLCAodm9pZCopcCwgTlVMTCk7CisgICAgICAgICAgICBzcHJpbnRmKGNvZGVfYnVmZmVyICsgc3RybGVuKGNvZGVfYnVmZmVyKSwgIiUwOHggIiwgZGF0YSk7CisgICAgICAgICAgICBwICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLCAiJXNcbiIsIGNvZGVfYnVmZmVyKTsKKyAgICB9CisKKyAgICBpZiAoKHVuc2lnbmVkKSByLkFSTV9sciAhPSBwYykgeworICAgICAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICJcbmNvZGUgYXJvdW5kIGxyOlxuIik7CisKKyAgICAgICAgZW5kID0gcCA9IHIuQVJNX2xyICYgfjM7CisgICAgICAgIHAgLT0gMzI7CisgICAgICAgIGVuZCArPSAzMjsKKworICAgICAgICAvKiBEdW1wIHRoZSBjb2RlIGFyb3VuZCBMUiBhczoKKyAgICAgICAgICogIGFkZHIgICAgICAgY29udGVudHMKKyAgICAgICAgICogIDAwMDA4ZDM0ICAgZmZmZmZjZDAgNGMwZWI1MzAgYjA5MzRhMGUgMWMwNTQ0N2MKKyAgICAgICAgICogIDAwMDA4ZDQ0ICAgZjdmZjE4YTAgNDkwY2VkOTQgNjgwMzU4NjAgZDAwMTJiMDAKKyAgICAgICAgICovCisgICAgICAgIHdoaWxlIChwIDw9IGVuZCkgeworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIHNwcmludGYoY29kZV9idWZmZXIsICIlMDh4ICIsIHApOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgIGRhdGEgPSBwdHJhY2UoUFRSQUNFX1BFRUtURVhULCBwaWQsICh2b2lkKilwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGNvZGVfYnVmZmVyICsgc3RybGVuKGNvZGVfYnVmZmVyKSwgIiUwOHggIiwgZGF0YSk7CisgICAgICAgICAgICAgICAgcCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLCAiJXNcbiIsIGNvZGVfYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHAgPSBzcCAtIDY0OworICAgIHAgJj0gfjM7CisgICAgaWYgKHVud2luZF9kZXB0aCAhPSAwKSB7CisgICAgICAgIGlmICh1bndpbmRfZGVwdGggPCBTVEFDS19DT05URU5UX0RFUFRIKSB7CisgICAgICAgICAgICBlbmQgPSBzcF9saXN0W3Vud2luZF9kZXB0aC0xXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGVuZCA9IHNwX2xpc3RbU1RBQ0tfQ09OVEVOVF9ERVBUSC0xXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZW5kID0gc3AgfCAweDAwMDAwMGZmOworICAgICAgICBlbmQgKz0gMHhmZjsKKyAgICB9CisKKyAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICJcbnN0YWNrOlxuIik7CisKKyAgICAvKiBJZiB0aGUgY3Jhc2ggaXMgZHVlIHRvIFBDID09IDAsIHRoZXJlIHdpbGwgYmUgdHdvIGZyYW1lcyB0aGF0CisgICAgICogaGF2ZSBpZGVudGljYWwgU1AgdmFsdWUuCisgICAgICovCisgICAgaWYgKHNwX2xpc3RbMF0gPT0gc3BfbGlzdFsxXSkgeworICAgICAgICBzcF9kZXB0aCA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzcF9kZXB0aCA9IDA7CisgICAgfQorCisgICAgd2hpbGUgKHAgPD0gZW5kKSB7CisgICAgICAgICBjaGFyICpwcm9tcHQ7CisgICAgICAgICBjaGFyIGxldmVsWzE2XTsKKyAgICAgICAgIGRhdGEgPSBwdHJhY2UoUFRSQUNFX1BFRUtURVhULCBwaWQsICh2b2lkKilwLCBOVUxMKTsKKyAgICAgICAgIGlmIChwID09IHNwX2xpc3Rbc3BfZGVwdGhdKSB7CisgICAgICAgICAgICAgc3ByaW50ZihsZXZlbCwgIiMlMDJkIiwgc3BfZGVwdGgrKyk7CisgICAgICAgICAgICAgcHJvbXB0ID0gbGV2ZWw7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICBwcm9tcHQgPSAiICAgIjsKKyAgICAgICAgIH0KKworICAgICAgICAgLyogUHJpbnQgdGhlIHN0YWNrIGNvbnRlbnQgaW4gdGhlIGxvZyBmb3IgdGhlIGZpcnN0IDMgZnJhbWVzLiBGb3IgdGhlCisgICAgICAgICAgKiByZXN0IG9ubHkgcHJpbnQgdGhlbSBpbiB0aGUgdG9tYnN0b25lIGZpbGUuCisgICAgICAgICAgKi8KKyAgICAgICAgIF9MT0codGZkLCAoc3BfZGVwdGggPiAyKSB8fCBvbmx5X2luX3RvbWJzdG9uZSwKKyAgICAgICAgICAgICAgIiVzICUwOHggICUwOHggICVzXG4iLCBwcm9tcHQsIHAsIGRhdGEsCisgICAgICAgICAgICAgIG1hcF90b19uYW1lKG1hcCwgZGF0YSwgIiIpKTsKKyAgICAgICAgIHAgKz0gNDsKKyAgICB9CisgICAgLyogcHJpbnQgYW5vdGhlciA2NC1ieXRlIG9mIHN0YWNrIGRhdGEgYWZ0ZXIgdGhlIGxhc3QgZnJhbWUgKi8KKworICAgIGVuZCA9IHArNjQ7CisgICAgd2hpbGUgKHAgPD0gZW5kKSB7CisgICAgICAgICBkYXRhID0gcHRyYWNlKFBUUkFDRV9QRUVLVEVYVCwgcGlkLCAodm9pZCopcCwgTlVMTCk7CisgICAgICAgICBfTE9HKHRmZCwgKHNwX2RlcHRoID4gMikgfHwgb25seV9pbl90b21ic3RvbmUsCisgICAgICAgICAgICAgICIgICAgJTA4eCAgJTA4eCAgJXNcbiIsIHAsIGRhdGEsCisgICAgICAgICAgICAgIG1hcF90b19uYW1lKG1hcCwgZGF0YSwgIiIpKTsKKyAgICAgICAgIHAgKz0gNDsKKyAgICB9Cit9CisKK3ZvaWQgZHVtcF9wY19hbmRfbHIoaW50IHRmZCwgaW50IHBpZCwgbWFwaW5mbyAqbWFwLCBpbnQgdW53b3VuZF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBhdF9mYXVsdCkKK3sKKyAgICBzdHJ1Y3QgcHRfcmVncyByOworCisgICAgaWYocHRyYWNlKFBUUkFDRV9HRVRSRUdTLCBwaWQsIDAsICZyKSkgeworICAgICAgICBfTE9HKHRmZCwgIWF0X2ZhdWx0LCAidGlkICVkIG5vdCByZXNwb25kaW5nIVxuIiwgcGlkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh1bndvdW5kX2xldmVsID09IDApIHsKKyAgICAgICAgX0xPRyh0ZmQsICFhdF9mYXVsdCwgIiAgICAgICAgICMlMDJkICBwYyAlMDh4ICAlc1xuIiwgMCwgci5BUk1fcGMsCisgICAgICAgICAgICAgbWFwX3RvX25hbWUobWFwLCByLkFSTV9wYywgIjx1bmtub3duPiIpKTsKKyAgICB9CisgICAgX0xPRyh0ZmQsICFhdF9mYXVsdCwgIiAgICAgICAgICMlMDJkICBsciAlMDh4ICAlc1xuIiwgMSwgci5BUk1fbHIsCisgICAgICAgICAgICBtYXBfdG9fbmFtZShtYXAsIHIuQVJNX2xyLCAiPHVua25vd24+IikpOworfQorCit2b2lkIGR1bXBfcmVnaXN0ZXJzKGludCB0ZmQsIGludCBwaWQsIGJvb2wgYXRfZmF1bHQpCit7CisgICAgc3RydWN0IHB0X3JlZ3MgcjsKKyAgICBib29sIG9ubHlfaW5fdG9tYnN0b25lID0gIWF0X2ZhdWx0OworCisgICAgaWYocHRyYWNlKFBUUkFDRV9HRVRSRUdTLCBwaWQsIDAsICZyKSkgeworICAgICAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsCisgICAgICAgICAgICAgImNhbm5vdCBnZXQgcmVnaXN0ZXJzOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwgIiByMCAlMDh4ICByMSAlMDh4ICByMiAlMDh4ICByMyAlMDh4XG4iLAorICAgICAgICAgci5BUk1fcjAsIHIuQVJNX3IxLCByLkFSTV9yMiwgci5BUk1fcjMpOworICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwgIiByNCAlMDh4ICByNSAlMDh4ICByNiAlMDh4ICByNyAlMDh4XG4iLAorICAgICAgICAgci5BUk1fcjQsIHIuQVJNX3I1LCByLkFSTV9yNiwgci5BUk1fcjcpOworICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwgIiByOCAlMDh4ICByOSAlMDh4ICAxMCAlMDh4ICBmcCAlMDh4XG4iLAorICAgICAgICAgci5BUk1fcjgsIHIuQVJNX3I5LCByLkFSTV9yMTAsIHIuQVJNX2ZwKTsKKyAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsCisgICAgICAgICAiIGlwICUwOHggIHNwICUwOHggIGxyICUwOHggIHBjICUwOHggIGNwc3IgJTA4eFxuIiwKKyAgICAgICAgIHIuQVJNX2lwLCByLkFSTV9zcCwgci5BUk1fbHIsIHIuQVJNX3BjLCByLkFSTV9jcHNyKTsKKworI2lmZGVmIFdJVEhfVkZQCisgICAgc3RydWN0IHVzZXJfdmZwIHZmcF9yZWdzOworICAgIGludCBpOworCisgICAgaWYocHRyYWNlKFBUUkFDRV9HRVRWRlBSRUdTLCBwaWQsIDAsICZ2ZnBfcmVncykpIHsKKyAgICAgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLAorICAgICAgICAgICAgICJjYW5ub3QgZ2V0IHJlZ2lzdGVyczogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1ZGUF9SRUdTOyBpICs9IDIpIHsKKyAgICAgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLAorICAgICAgICAgICAgICIgZCUtMmQgJTAxNmxseCAgZCUtMmQgJTAxNmxseFxuIiwKKyAgICAgICAgICAgICAgaSwgdmZwX3JlZ3MuZnByZWdzW2ldLCBpKzEsIHZmcF9yZWdzLmZwcmVnc1tpKzFdKTsKKyAgICB9CisgICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLCAiIHNjciAlMDhseFxuXG4iLCB2ZnBfcmVncy5mcHNjcik7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9wci1zdXBwb3J0LmMgYi9kZWJ1Z2dlcmQvYXJtL3ByLXN1cHBvcnQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZGVidWdnZXJkL3ByLXN1cHBvcnQuYwpyZW5hbWUgdG8gZGVidWdnZXJkL2FybS9wci1zdXBwb3J0LmMKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC91bndpbmQtYXJtLmMgYi9kZWJ1Z2dlcmQvYXJtL3Vud2luZC5jCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGRlYnVnZ2VyZC91bndpbmQtYXJtLmMKcmVuYW1lIHRvIGRlYnVnZ2VyZC9hcm0vdW53aW5kLmMKaW5kZXggOTY0MmQyZS4uZDk2MDBiNyAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL3Vud2luZC1hcm0uYworKysgYi9kZWJ1Z2dlcmQvYXJtL3Vud2luZC5jCkBAIC0zNyw2ICszNyw4IEBACiAjaW5jbHVkZSA8dW53aW5kLmg+CiAjaW5jbHVkZSAidXRpbGl0eS5oIgogCisjaW5jbHVkZSAic3ltYm9sX3RhYmxlLmgiCisKIHR5cGVkZWYgc3RydWN0IF9aU3Q5dHlwZV9pbmZvIHR5cGVfaW5mbzsgLyogVGhpcyBuYW1lcyBDKysgdHlwZV9pbmZvIHR5cGUgKi8KIAogdm9pZCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgX19jeGFfY2FsbF91bmV4cGVjdGVkKF9VbndpbmRfQ29udHJvbF9CbG9jayAqdWNicCk7CkBAIC0zOTMsNiArMzk1LDcgQEAKICAgICBwaGFzZTJfdnJzICp2cnMgPSAocGhhc2UyX3ZycyopIGNvbnRleHQ7CiAgICAgY29uc3QgbWFwaW5mbyAqbWk7CiAgICAgYm9vbCBvbmx5X2luX3RvbWJzdG9uZSA9ICFhdF9mYXVsdDsKKyAgICBjb25zdCBzdHJ1Y3Qgc3ltYm9sKiBzeW0gPSAwOwogCiAgICAgaWYgKHN0YWNrX2xldmVsIDwgU1RBQ0tfQ09OVEVOVF9ERVBUSCkgewogICAgICAgICBzcF9saXN0W3N0YWNrX2xldmVsXSA9IHZycy0+Y29yZS5yW1JfU1BdOwpAQCAtNDI3LDcgKzQzMCw3IEBACiAgICAgICAgIGlmIChwYyAmIDEpIHsKICAgICAgICAgICAgIF91dyBwcmV2X3dvcmQ7CiAgICAgICAgICAgICBwYyA9IChwYyAmIH4xKTsKLSAgICAgICAgICAgIHByZXZfd29yZCA9IGdldF9yZW1vdGVfd29yZChwaWQsICh2b2lkICopIHBjLTQpOworICAgICAgICAgICAgcHJldl93b3JkID0gZ2V0X3JlbW90ZV93b3JkKHBpZCwgKGNoYXIgKikgcGMtNCk7CiAgICAgICAgICAgICAvLyBMb25nIG9mZnNldCAKICAgICAgICAgICAgIGlmICgocHJldl93b3JkICYgMHhmMDAwMDAwMCkgPT0gMHhmMDAwMDAwMCAmJiAKICAgICAgICAgICAgICAgICAocHJldl93b3JkICYgMHgwMDAwZTAwMCkgPT0gMHgwMDAwZTAwMCkgewpAQCAtNDQ4LDEyICs0NTEsMjIgQEAKICAgICAgKiAxTUIgYm91bmRhcmllcywgYW5kIHRoZSBsaWJyYXJ5IG1heSBiZSBsYXJnZXIgdGhhbiAxTUIuIFNvIGZvciAuc28gCiAgICAgICogYWRkcmVzc2VzIHdlIHByaW50IHRoZSByZWxhdGl2ZSBvZmZzZXQgaW4gYmFjayB0cmFjZS4KICAgICAgKi8KLSAgICByZWxfcGMgPSBwYzsKICAgICBtaSA9IHBjX3RvX21hcGluZm8obWFwLCBwYywgJnJlbF9wYyk7CiAKLSAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsIAotICAgICAgICAgIiAgICAgICAgICMlMDJkICBwYyAlMDh4ICAlc1xuIiwgc3RhY2tfbGV2ZWwsIHJlbF9wYywgCi0gICAgICAgICBtaSA/IG1pLT5uYW1lIDogIiIpOworICAgIC8qIFNlZSBpZiB3ZSBjYW4gZGV0ZXJtaW5lIHdoYXQgc3ltYm9sIHRoaXMgc3RhY2sgZnJhbWUgcmVzaWRlcyBpbiAqLworICAgIGlmIChtaSAhPSAwICYmIG1pLT5zeW1ib2xzICE9IDApIHsKKyAgICAgICAgc3ltID0gc3ltYm9sX3RhYmxlX2xvb2t1cChtaS0+c3ltYm9scywgcmVsX3BjKTsKKyAgICB9CisKKyAgICBpZiAoc3ltKSB7CisgICAgICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwKKyAgICAgICAgICAgICIgICAgICAgICAjJTAyZCAgcGMgJTA4eCAgJXMgKCVzKVxuIiwgc3RhY2tfbGV2ZWwsIHJlbF9wYywKKyAgICAgICAgICAgIG1pID8gbWktPm5hbWUgOiAiIiwgc3ltLT5uYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsCisgICAgICAgICAgICAiICAgICAgICAgIyUwMmQgIHBjICUwOHggICVzXG4iLCBzdGFja19sZXZlbCwgcmVsX3BjLAorICAgICAgICAgICAgbWkgPyBtaS0+bmFtZSA6ICIiKTsKKyAgICB9CiAKICAgICByZXR1cm4gX1VSQ19OT19SRUFTT047CiB9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvY3Jhc2hlci5jIGIvZGVidWdnZXJkL2NyYXNoZXIuYwppbmRleCBmNGE1YTYyLi4wMDY1MmU5IDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvY3Jhc2hlci5jCisrKyBiL2RlYnVnZ2VyZC9jcmFzaGVyLmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogdm9pZCBjcmFzaDEodm9pZCk7CiB2b2lkIGNyYXNobm9zdGFjayh2b2lkKTsKK3ZvaWQgbWF5YmVhYm9ydCh2b2lkKTsKIAogc3RhdGljIHZvaWQgZGVidWdnZXJkX2Nvbm5lY3QoKQogewpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2RlYnVnZ2VyZC5jIGIvZGVidWdnZXJkL2RlYnVnZ2VyZC5jCmluZGV4IGI1NTdjZWEuLmVjZmUwMWYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9kZWJ1Z2dlcmQuYworKysgYi9kZWJ1Z2dlcmQvZGVidWdnZXJkLmMKQEAgLTE2LDggKzE2LDYgQEAKICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgpAQCAtMzMsMzcgKzMxLDIxIEBACiAKICNpbmNsdWRlIDxjdXRpbHMvc29ja2V0cy5oPgogI2luY2x1ZGUgPGN1dGlscy9sb2dkLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3NvY2tldHMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KIAogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCisjaW5jbHVkZSAiZGVidWdnZXJkLmgiCiAjaW5jbHVkZSAidXRpbGl0eS5oIgogCi0jaWZkZWYgV0lUSF9WRlAKLSNpZmRlZiBXSVRIX1ZGUF9EMzIKLSNkZWZpbmUgTlVNX1ZGUF9SRUdTIDMyCi0jZWxzZQotI2RlZmluZSBOVU1fVkZQX1JFR1MgMTYKLSNlbmRpZgotI2VuZGlmCi0KLS8qIE1haW4gZW50cnkgcG9pbnQgdG8gZ2V0IHRoZSBiYWNrdHJhY2UgZnJvbSB0aGUgY3Jhc2hpbmcgcHJvY2VzcyAqLwotZXh0ZXJuIGludCB1bndpbmRfYmFja3RyYWNlX3dpdGhfcHRyYWNlKGludCB0ZmQsIHBpZF90IHBpZCwgbWFwaW5mbyAqbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcF9saXN0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmcmFtZTBfcGNfc2FuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF0X2ZhdWx0KTsKLQotc3RhdGljIGludCBsb2dzb2NrZXQgPSAtMTsKLQogI2RlZmluZSBBTkRST0lEX0xPR19JTkZPIDQKIAogLyogTG9nIGluZm9ybWF0aW9uIG9udG8gdGhlIHRvbWJzdG9uZSAqLwogdm9pZCBfTE9HKGludCB0ZmQsIGJvb2wgaW5fdG9tYnN0b25lX29ubHksIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewotICAgIGNoYXIgYnVmWzEyOF07CisgICAgY2hhciBidWZbNTEyXTsKIAogICAgIHZhX2xpc3QgYXA7CiAgICAgdmFfc3RhcnQoYXAsIGZtdCk7CkBAIC03OSwxMyArNjEsNiBAQAogICAgICAgICBfX2FuZHJvaWRfbG9nX3ZwcmludChBTkRST0lEX0xPR19JTkZPLCAiREVCVUciLCBmbXQsIGFwKTsKIH0KIAotI2RlZmluZSBMT0coZm10Li4uKSBfTE9HKC0xLCAwLCBmbXQpCi0jaWYgMAotI2RlZmluZSBYTE9HKGZtdC4uLikgX0xPRygtMSwgMCwgZm10KQotI2Vsc2UKLSNkZWZpbmUgWExPRyhmbXQuLi4pIGRvIHt9IHdoaWxlKDApCi0jZW5kaWYKLQogLy8gNmYwMDAwMDAtNmYwMWUwMDAgcnd4cCAwMDAwMDAwMCAwMDowYyAxNjM4OTQxOSAgIC9zeXN0ZW0vbGliL2xpYmNvbXBvc2VyLnNvCiAvLyAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKIC8vIDAgICAgICAgICAxICAgICAgICAgMiAgICAgICAgIDMgICAgICAgICA0ICAgICAgICAgNQpAQCAtMTA2LDEwICs4MSwxMSBAQAogCiAgICAgbWktPnN0YXJ0ID0gc3RydG91bChsaW5lLCAwLCAxNik7CiAgICAgbWktPmVuZCA9IHN0cnRvdWwobGluZSArIDksIDAsIDE2KTsKLSAgICAvKiBUbyBiZSBmaWxsZWQgaW4gcGFyc2VfZXhpZHhfaW5mbyBpZiB0aGUgbWFwcGVkIHNlY3Rpb24gc3RhcnRzIHdpdGgKKyAgICAvKiBUbyBiZSBmaWxsZWQgaW4gcGFyc2VfZWxmX2luZm8gaWYgdGhlIG1hcHBlZCBzZWN0aW9uIHN0YXJ0cyB3aXRoCiAgICAgICogZWxmX2hlYWRlcgogICAgICAqLwogICAgIG1pLT5leGlkeF9zdGFydCA9IG1pLT5leGlkeF9lbmQgPSAwOworICAgIG1pLT5zeW1ib2xzID0gMDsKICAgICBtaS0+bmV4dCA9IDA7CiAgICAgc3RyY3B5KG1pLT5uYW1lLCBsaW5lICsgNDkpOwogCkBAIC0xMjUsMTg2ICsxMDEsNiBAQAogICAgIF9MT0codGZkLCBmYWxzZSwgIkJ1aWxkIGZpbmdlcnByaW50OiAnJXMnXG4iLCBmaW5nZXJwcmludCk7CiB9CiAKLQotdm9pZCBkdW1wX3N0YWNrX2FuZF9jb2RlKGludCB0ZmQsIGludCBwaWQsIG1hcGluZm8gKm1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdW53aW5kX2RlcHRoLCB1bnNpZ25lZCBpbnQgc3BfbGlzdFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXRfZmF1bHQpCi17Ci0gICAgdW5zaWduZWQgaW50IHNwLCBwYywgcCwgZW5kLCBkYXRhOwotICAgIHN0cnVjdCBwdF9yZWdzIHI7Ci0gICAgaW50IHNwX2RlcHRoOwotICAgIGJvb2wgb25seV9pbl90b21ic3RvbmUgPSAhYXRfZmF1bHQ7Ci0gICAgY2hhciBjb2RlX2J1ZmZlcls4MF07Ci0KLSAgICBpZihwdHJhY2UoUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgJnIpKSByZXR1cm47Ci0gICAgc3AgPSByLkFSTV9zcDsKLSAgICBwYyA9IHIuQVJNX3BjOwotCi0gICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLCAiXG5jb2RlIGFyb3VuZCBwYzpcbiIpOwotCi0gICAgZW5kID0gcCA9IHBjICYgfjM7Ci0gICAgcCAtPSAzMjsKLSAgICBlbmQgKz0gMzI7Ci0KLSAgICAvKiBEdW1wIHRoZSBjb2RlIGFyb3VuZCBQQyBhczoKLSAgICAgKiAgYWRkciAgICAgICBjb250ZW50cwotICAgICAqICAwMDAwOGQzNCAgIGZmZmZmY2QwIDRjMGViNTMwIGIwOTM0YTBlIDFjMDU0NDdjCi0gICAgICogIDAwMDA4ZDQ0ICAgZjdmZjE4YTAgNDkwY2VkOTQgNjgwMzU4NjAgZDAwMTJiMDAKLSAgICAgKi8KLSAgICB3aGlsZSAocCA8PSBlbmQpIHsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgc3ByaW50Zihjb2RlX2J1ZmZlciwgIiUwOHggIiwgcCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIGRhdGEgPSBwdHJhY2UoUFRSQUNFX1BFRUtURVhULCBwaWQsICh2b2lkKilwLCBOVUxMKTsKLSAgICAgICAgICAgIHNwcmludGYoY29kZV9idWZmZXIgKyBzdHJsZW4oY29kZV9idWZmZXIpLCAiJTA4eCAiLCBkYXRhKTsKLSAgICAgICAgICAgIHAgKz0gNDsKLSAgICAgICAgfQotICAgICAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICIlc1xuIiwgY29kZV9idWZmZXIpOwotICAgIH0KLQotICAgIGlmICgodW5zaWduZWQpIHIuQVJNX2xyICE9IHBjKSB7Ci0gICAgICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwgIlxuY29kZSBhcm91bmQgbHI6XG4iKTsKLQotICAgICAgICBlbmQgPSBwID0gci5BUk1fbHIgJiB+MzsKLSAgICAgICAgcCAtPSAzMjsKLSAgICAgICAgZW5kICs9IDMyOwotCi0gICAgICAgIC8qIER1bXAgdGhlIGNvZGUgYXJvdW5kIExSIGFzOgotICAgICAgICAgKiAgYWRkciAgICAgICBjb250ZW50cwotICAgICAgICAgKiAgMDAwMDhkMzQgICBmZmZmZmNkMCA0YzBlYjUzMCBiMDkzNGEwZSAxYzA1NDQ3YwotICAgICAgICAgKiAgMDAwMDhkNDQgICBmN2ZmMThhMCA0OTBjZWQ5NCA2ODAzNTg2MCBkMDAxMmIwMAotICAgICAgICAgKi8KLSAgICAgICAgd2hpbGUgKHAgPD0gZW5kKSB7Ci0gICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgc3ByaW50Zihjb2RlX2J1ZmZlciwgIiUwOHggIiwgcCk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IHB0cmFjZShQVFJBQ0VfUEVFS1RFWFQsIHBpZCwgKHZvaWQqKXAsIE5VTEwpOwotICAgICAgICAgICAgICAgIHNwcmludGYoY29kZV9idWZmZXIgKyBzdHJsZW4oY29kZV9idWZmZXIpLCAiJTA4eCAiLCBkYXRhKTsKLSAgICAgICAgICAgICAgICBwICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICIlc1xuIiwgY29kZV9idWZmZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcCA9IHNwIC0gNjQ7Ci0gICAgcCAmPSB+MzsKLSAgICBpZiAodW53aW5kX2RlcHRoICE9IDApIHsKLSAgICAgICAgaWYgKHVud2luZF9kZXB0aCA8IFNUQUNLX0NPTlRFTlRfREVQVEgpIHsKLSAgICAgICAgICAgIGVuZCA9IHNwX2xpc3RbdW53aW5kX2RlcHRoLTFdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZW5kID0gc3BfbGlzdFtTVEFDS19DT05URU5UX0RFUFRILTFdOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBlbmQgPSBzcCB8IDB4MDAwMDAwZmY7Ci0gICAgICAgIGVuZCArPSAweGZmOwotICAgIH0KLQotICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwgIlxuc3RhY2s6XG4iKTsKLQotICAgIC8qIElmIHRoZSBjcmFzaCBpcyBkdWUgdG8gUEMgPT0gMCwgdGhlcmUgd2lsbCBiZSB0d28gZnJhbWVzIHRoYXQKLSAgICAgKiBoYXZlIGlkZW50aWNhbCBTUCB2YWx1ZS4KLSAgICAgKi8KLSAgICBpZiAoc3BfbGlzdFswXSA9PSBzcF9saXN0WzFdKSB7Ci0gICAgICAgIHNwX2RlcHRoID0gMTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHNwX2RlcHRoID0gMDsKLSAgICB9Ci0KLSAgICB3aGlsZSAocCA8PSBlbmQpIHsKLSAgICAgICAgIGNoYXIgKnByb21wdDsKLSAgICAgICAgIGNoYXIgbGV2ZWxbMTZdOwotICAgICAgICAgZGF0YSA9IHB0cmFjZShQVFJBQ0VfUEVFS1RFWFQsIHBpZCwgKHZvaWQqKXAsIE5VTEwpOwotICAgICAgICAgaWYgKHAgPT0gc3BfbGlzdFtzcF9kZXB0aF0pIHsKLSAgICAgICAgICAgICBzcHJpbnRmKGxldmVsLCAiIyUwMmQiLCBzcF9kZXB0aCsrKTsKLSAgICAgICAgICAgICBwcm9tcHQgPSBsZXZlbDsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgIHByb21wdCA9ICIgICAiOwotICAgICAgICAgfQotCi0gICAgICAgICAvKiBQcmludCB0aGUgc3RhY2sgY29udGVudCBpbiB0aGUgbG9nIGZvciB0aGUgZmlyc3QgMyBmcmFtZXMuIEZvciB0aGUKLSAgICAgICAgICAqIHJlc3Qgb25seSBwcmludCB0aGVtIGluIHRoZSB0b21ic3RvbmUgZmlsZS4KLSAgICAgICAgICAqLwotICAgICAgICAgX0xPRyh0ZmQsIChzcF9kZXB0aCA+IDIpIHx8IG9ubHlfaW5fdG9tYnN0b25lLAotICAgICAgICAgICAgICAiJXMgJTA4eCAgJTA4eCAgJXNcbiIsIHByb21wdCwgcCwgZGF0YSwKLSAgICAgICAgICAgICAgbWFwX3RvX25hbWUobWFwLCBkYXRhLCAiIikpOwotICAgICAgICAgcCArPSA0OwotICAgIH0KLSAgICAvKiBwcmludCBhbm90aGVyIDY0LWJ5dGUgb2Ygc3RhY2sgZGF0YSBhZnRlciB0aGUgbGFzdCBmcmFtZSAqLwotCi0gICAgZW5kID0gcCs2NDsKLSAgICB3aGlsZSAocCA8PSBlbmQpIHsKLSAgICAgICAgIGRhdGEgPSBwdHJhY2UoUFRSQUNFX1BFRUtURVhULCBwaWQsICh2b2lkKilwLCBOVUxMKTsKLSAgICAgICAgIF9MT0codGZkLCAoc3BfZGVwdGggPiAyKSB8fCBvbmx5X2luX3RvbWJzdG9uZSwKLSAgICAgICAgICAgICAgIiAgICAlMDh4ICAlMDh4ICAlc1xuIiwgcCwgZGF0YSwKLSAgICAgICAgICAgICAgbWFwX3RvX25hbWUobWFwLCBkYXRhLCAiIikpOwotICAgICAgICAgcCArPSA0OwotICAgIH0KLX0KLQotdm9pZCBkdW1wX3BjX2FuZF9scihpbnQgdGZkLCBpbnQgcGlkLCBtYXBpbmZvICptYXAsIGludCB1bndvdW5kX2xldmVsLAotICAgICAgICAgICAgICAgICAgICBib29sIGF0X2ZhdWx0KQotewotICAgIHN0cnVjdCBwdF9yZWdzIHI7Ci0KLSAgICBpZihwdHJhY2UoUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgJnIpKSB7Ci0gICAgICAgIF9MT0codGZkLCAhYXRfZmF1bHQsICJ0aWQgJWQgbm90IHJlc3BvbmRpbmchXG4iLCBwaWQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHVud291bmRfbGV2ZWwgPT0gMCkgewotICAgICAgICBfTE9HKHRmZCwgIWF0X2ZhdWx0LCAiICAgICAgICAgIyUwMmQgIHBjICUwOHggICVzXG4iLCAwLCByLkFSTV9wYywKLSAgICAgICAgICAgICBtYXBfdG9fbmFtZShtYXAsIHIuQVJNX3BjLCAiPHVua25vd24+IikpOwotICAgIH0KLSAgICBfTE9HKHRmZCwgIWF0X2ZhdWx0LCAiICAgICAgICAgIyUwMmQgIGxyICUwOHggICVzXG4iLCAxLCByLkFSTV9sciwKLSAgICAgICAgICAgIG1hcF90b19uYW1lKG1hcCwgci5BUk1fbHIsICI8dW5rbm93bj4iKSk7Ci19Ci0KLXZvaWQgZHVtcF9yZWdpc3RlcnMoaW50IHRmZCwgaW50IHBpZCwgYm9vbCBhdF9mYXVsdCkKLXsKLSAgICBzdHJ1Y3QgcHRfcmVncyByOwotICAgIGJvb2wgb25seV9pbl90b21ic3RvbmUgPSAhYXRfZmF1bHQ7Ci0KLSAgICBpZihwdHJhY2UoUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgJnIpKSB7Ci0gICAgICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwKLSAgICAgICAgICAgICAiY2Fubm90IGdldCByZWdpc3RlcnM6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLCAiIHIwICUwOHggIHIxICUwOHggIHIyICUwOHggIHIzICUwOHhcbiIsCi0gICAgICAgICByLkFSTV9yMCwgci5BUk1fcjEsIHIuQVJNX3IyLCByLkFSTV9yMyk7Ci0gICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLCAiIHI0ICUwOHggIHI1ICUwOHggIHI2ICUwOHggIHI3ICUwOHhcbiIsCi0gICAgICAgICByLkFSTV9yNCwgci5BUk1fcjUsIHIuQVJNX3I2LCByLkFSTV9yNyk7Ci0gICAgX0xPRyh0ZmQsIG9ubHlfaW5fdG9tYnN0b25lLCAiIHI4ICUwOHggIHI5ICUwOHggIDEwICUwOHggIGZwICUwOHhcbiIsCi0gICAgICAgICByLkFSTV9yOCwgci5BUk1fcjksIHIuQVJNX3IxMCwgci5BUk1fZnApOwotICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwKLSAgICAgICAgICIgaXAgJTA4eCAgc3AgJTA4eCAgbHIgJTA4eCAgcGMgJTA4eCAgY3BzciAlMDh4XG4iLAotICAgICAgICAgci5BUk1faXAsIHIuQVJNX3NwLCByLkFSTV9sciwgci5BUk1fcGMsIHIuQVJNX2Nwc3IpOwotCi0jaWZkZWYgV0lUSF9WRlAKLSAgICBzdHJ1Y3QgdXNlcl92ZnAgdmZwX3JlZ3M7Ci0gICAgaW50IGk7Ci0KLSAgICBpZihwdHJhY2UoUFRSQUNFX0dFVFZGUFJFR1MsIHBpZCwgMCwgJnZmcF9yZWdzKSkgewotICAgICAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsCi0gICAgICAgICAgICAgImNhbm5vdCBnZXQgcmVnaXN0ZXJzOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVkZQX1JFR1M7IGkgKz0gMikgewotICAgICAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsCi0gICAgICAgICAgICAgIiBkJS0yZCAlMDE2bGx4ICBkJS0yZCAlMDE2bGx4XG4iLAotICAgICAgICAgICAgICBpLCB2ZnBfcmVncy5mcHJlZ3NbaV0sIGkrMSwgdmZwX3JlZ3MuZnByZWdzW2krMV0pOwotICAgIH0KLSAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICIgc2NyICUwOGx4XG5cbiIsIHZmcF9yZWdzLmZwc2NyKTsKLSNlbmRpZgotfQotCiBjb25zdCBjaGFyICpnZXRfc2lnbmFtZShpbnQgc2lnKQogewogICAgIHN3aXRjaChzaWcpIHsKQEAgLTM5OSw3ICsxOTUsNyBAQAogICAgIGlmKHNpZykgZHVtcF9mYXVsdF9hZGRyKHRmZCwgdGlkLCBzaWcpOwogfQogCi1zdGF0aWMgdm9pZCBwYXJzZV9leGlkeF9pbmZvKG1hcGluZm8gKm1pbGlzdCwgcGlkX3QgcGlkKQorc3RhdGljIHZvaWQgcGFyc2VfZWxmX2luZm8obWFwaW5mbyAqbWlsaXN0LCBwaWRfdCBwaWQpCiB7CiAgICAgbWFwaW5mbyAqbWk7CiAgICAgZm9yIChtaSA9IG1pbGlzdDsgbWkgIT0gTlVMTDsgbWkgPSBtaS0+bmV4dCkgewpAQCAtNDIyLDEzICsyMTgsMTggQEAKICAgICAgICAgICAgICAgICAvKiBQYXJzZSB0aGUgcHJvZ3JhbSBoZWFkZXIgKi8KICAgICAgICAgICAgICAgICBnZXRfcmVtb3RlX3N0cnVjdChwaWQsIChjaGFyICopIChwdHIraSksICZwaGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFbGYzMl9QaGRyKSk7CisjaWZkZWYgX19hcm1fXwogICAgICAgICAgICAgICAgIC8qIEZvdW5kIGEgRVhJRFggc2VnbWVudD8gKi8KICAgICAgICAgICAgICAgICBpZiAocGhkci5wX3R5cGUgPT0gUFRfQVJNX0VYSURYKSB7CiAgICAgICAgICAgICAgICAgICAgIG1pLT5leGlkeF9zdGFydCA9IG1pLT5zdGFydCArIHBoZHIucF9vZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgIG1pLT5leGlkeF9lbmQgPSBtaS0+ZXhpZHhfc3RhcnQgKyBwaGRyLnBfZmlsZXN6OwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CisjZW5kaWYKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogVHJ5IHRvIGxvYWQgc3ltYm9scyBmcm9tIHRoaXMgZmlsZSAqLworICAgICAgICAgICAgbWktPnN5bWJvbHMgPSBzeW1ib2xfdGFibGVfY3JlYXRlKG1pLT5uYW1lKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTQ0MCw3ICsyNDEsOSBAQAogICAgIG1hcGluZm8gKm1pbGlzdCA9IDA7CiAgICAgdW5zaWduZWQgaW50IHNwX2xpc3RbU1RBQ0tfQ09OVEVOVF9ERVBUSF07CiAgICAgaW50IHN0YWNrX2RlcHRoOworI2lmZGVmIF9fYXJtX18KICAgICBpbnQgZnJhbWUwX3BjX3NhbmUgPSAxOworI2VuZGlmCiAKICAgICBpZiAoIWF0X2ZhdWx0KSB7CiAgICAgICAgIF9MT0codGZkLCB0cnVlLApAQCAtNDY2LDggKzI2OSw5IEBACiAgICAgICAgIGZjbG9zZShmcCk7CiAgICAgfQogCi0gICAgcGFyc2VfZXhpZHhfaW5mbyhtaWxpc3QsIHRpZCk7CisgICAgcGFyc2VfZWxmX2luZm8obWlsaXN0LCB0aWQpOwogCisjaWYgX19hcm1fXwogICAgIC8qIElmIHN0YWNrIHVud2luZGVyIGZhaWxzLCB1c2UgdGhlIGRlZmF1bHQgc29sdXRpb24gdG8gZHVtcCB0aGUgc3RhY2sKICAgICAgKiBjb250ZW50LgogICAgICAqLwpAQCAtNDgyLDkgKzI4NiwxOCBAQAogICAgIH0KIAogICAgIGR1bXBfc3RhY2tfYW5kX2NvZGUodGZkLCB0aWQsIG1pbGlzdCwgc3RhY2tfZGVwdGgsIHNwX2xpc3QsIGF0X2ZhdWx0KTsKKyNlbGlmIF9faTM4Nl9fCisgICAgLyogSWYgc3RhY2sgdW53aW5kZXIgZmFpbHMsIHVzZSB0aGUgZGVmYXVsdCBzb2x1dGlvbiB0byBkdW1wIHRoZSBzdGFjaworICAgICogY29udGVudC4KKyAgICAqLworICAgIHN0YWNrX2RlcHRoID0gdW53aW5kX2JhY2t0cmFjZV93aXRoX3B0cmFjZV94ODYodGZkLCB0aWQsIG1pbGlzdCxhdF9mYXVsdCk7CisjZWxzZQorI2Vycm9yICJVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUiCisjZW5kaWYKIAogICAgIHdoaWxlKG1pbGlzdCkgewogICAgICAgICBtYXBpbmZvICpuZXh0ID0gbWlsaXN0LT5uZXh0OworICAgICAgICBzeW1ib2xfdGFibGVfZnJlZShtaWxpc3QtPnN5bWJvbHMpOwogICAgICAgICBmcmVlKG1pbGlzdCk7CiAgICAgICAgIG1pbGlzdCA9IG5leHQ7CiAgICAgfQpAQCAtODYzLDEwICs2NzYsMTIgQEAKICAgICBpZihmZCAhPSAtMSkgY2xvc2UoZmQpOwogfQogCisKIGludCBtYWluKCkKIHsKICAgICBpbnQgczsKICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKKyAgICBpbnQgbG9nc29ja2V0ID0gLTE7CiAKICAgICBsb2dzb2NrZXQgPSBzb2NrZXRfbG9jYWxfY2xpZW50KCJsb2dkIiwKICAgICAgICAgICAgIEFORFJPSURfU09DS0VUX05BTUVTUEFDRV9BQlNUUkFDVCwgU09DS19ER1JBTSk7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvZGVidWdnZXJkLmggYi9kZWJ1Z2dlcmQvZGVidWdnZXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjZGM3YwotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyZC9kZWJ1Z2dlcmQuaApAQCAtMCwwICsxLDM5IEBACisvKiBzeXN0ZW0vZGVidWdnZXJkL2RlYnVnZ2VyZC5oCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nZC5oPgorI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKyNpbmNsdWRlIDx1bndpbmQuaD4KKyNpbmNsdWRlICJ1dGlsaXR5LmgiCisjaW5jbHVkZSAic3ltYm9sX3RhYmxlLmgiCisKKworLyogTWFpbiBlbnRyeSBwb2ludCB0byBnZXQgdGhlIGJhY2t0cmFjZSBmcm9tIHRoZSBjcmFzaGluZyBwcm9jZXNzICovCitleHRlcm4gaW50IHVud2luZF9iYWNrdHJhY2Vfd2l0aF9wdHJhY2UoaW50IHRmZCwgcGlkX3QgcGlkLCBtYXBpbmZvICptYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNwX2xpc3RbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZyYW1lMF9wY19zYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXRfZmF1bHQpOworCitleHRlcm4gdm9pZCBkdW1wX3JlZ2lzdGVycyhpbnQgdGZkLCBpbnQgcGlkLCBib29sIGF0X2ZhdWx0KTsKKworZXh0ZXJuIGludCB1bndpbmRfYmFja3RyYWNlX3dpdGhfcHRyYWNlX3g4NihpbnQgdGZkLCBwaWRfdCBwaWQsIG1hcGluZm8gKm1hcCwgYm9vbCBhdF9mYXVsdCk7CisKK3ZvaWQgZHVtcF9wY19hbmRfbHIoaW50IHRmZCwgaW50IHBpZCwgbWFwaW5mbyAqbWFwLCBpbnQgdW53b3VuZF9sZXZlbCwgYm9vbCBhdF9mYXVsdCk7CisKK3ZvaWQgZHVtcF9zdGFja19hbmRfY29kZShpbnQgdGZkLCBpbnQgcGlkLCBtYXBpbmZvICptYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVud2luZF9kZXB0aCwgdW5zaWduZWQgaW50IHNwX2xpc3RbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF0X2ZhdWx0KTsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9zeW1ib2xfdGFibGUuYyBiL2RlYnVnZ2VyZC9zeW1ib2xfdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDAwOGZlCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXJkL3N5bWJvbF90YWJsZS5jCkBAIC0wLDAgKzEsMjQwIEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpbmNsdWRlICJzeW1ib2xfdGFibGUuaCIKKyNpbmNsdWRlICJ1dGlsaXR5LmgiCisKKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKworLy8gQ29tcGFyZSBmdW5jIGZvciBxc29ydAorc3RhdGljIGludCBxY29tcGFyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgcmV0dXJuICgoc3RydWN0IHN5bWJvbCopYSktPmFkZHIgLSAoKHN0cnVjdCBzeW1ib2wqKWIpLT5hZGRyOworfQorCisvLyBDb21wYXJlIGZ1bmMgZm9yIGJzZWFyY2gKK3N0YXRpYyBpbnQgYmNvbXBhcihjb25zdCB2b2lkICphZGRyLCBjb25zdCB2b2lkICplbGVtZW50KQoreworICAgIHN0cnVjdCBzeW1ib2wgKnN5bWJvbCA9IChzdHJ1Y3Qgc3ltYm9sKillbGVtZW50OworCisgICAgaWYoKHVuc2lnbmVkIGludClhZGRyIDwgc3ltYm9sLT5hZGRyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZigodW5zaWduZWQgaW50KWFkZHIgLSBzeW1ib2wtPmFkZHIgPj0gc3ltYm9sLT5zaXplKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogIENyZWF0ZSBhIHN5bWJvbCB0YWJsZSBmcm9tIGEgZ2l2ZW4gZmlsZQorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBmaWxlbmFtZSAtIEZpbGVuYW1lIHRvIHByb2Nlc3MKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgICAgQSBuZXdseS1hbGxvY2F0ZWQgU3ltYm9sVGFibGUgc3RydWN0dXJlLCBvciBOVUxMIGlmIGVycm9yLgorICogICAgICBGcmVlIHN5bWJvbCB0YWJsZSB3aXRoIHN5bWJvbF90YWJsZV9mcmVlKCkKKyAqLworc3RydWN0IHN5bWJvbF90YWJsZSAqc3ltYm9sX3RhYmxlX2NyZWF0ZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBzdHJ1Y3Qgc3ltYm9sX3RhYmxlICp0YWJsZSA9IE5VTEw7CisKKyAgICAvLyBPcGVuIHRoZSBmaWxlLCBhbmQgbWFwIGl0IGludG8gbWVtb3J5CisgICAgc3RydWN0IHN0YXQgc2I7CisgICAgaW50IGxlbmd0aDsKKyAgICBjaGFyICpiYXNlOworCisgICAgWExPRygiQ3JlYXRpbmcgc3ltYm9sIHRhYmxlIGZvciAlc1xuIiwgZmlsZW5hbWUpOworICAgIGludCBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKworICAgIGlmKGZkIDwgMCkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBmc3RhdChmZCwgJnNiKTsKKyAgICBsZW5ndGggPSBzYi5zdF9zaXplOworCisgICAgYmFzZSA9IG1tYXAoTlVMTCwgbGVuZ3RoLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisKKyAgICBpZighYmFzZSkgeworICAgICAgICBnb3RvIG91dF9jbG9zZTsKKyAgICB9CisKKyAgICAvLyBQYXJzZSB0aGUgZmlsZSBoZWFkZXIKKyAgICBFbGYzMl9FaGRyICpoZHIgPSAoRWxmMzJfRWhkciopYmFzZTsKKyAgICBFbGYzMl9TaGRyICpzaGRyID0gKEVsZjMyX1NoZHIqKShiYXNlICsgaGRyLT5lX3Nob2ZmKTsKKworICAgIC8vIFNlYXJjaCBmb3IgdGhlIGR5bmFtaWMgc3ltYm9scyBzZWN0aW9uCisgICAgaW50IHN5bV9pZHggPSAtMTsKKyAgICBpbnQgZHluc3ltX2lkeCA9IC0xOworICAgIGludCBpOworCisgICAgZm9yKGkgPSAwOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspIHsKKyAgICAgICAgaWYoc2hkcltpXS5zaF90eXBlID09IFNIVF9TWU1UQUIgKSB7CisgICAgICAgICAgICBzeW1faWR4ID0gaTsKKyAgICAgICAgfQorICAgICAgICBpZihzaGRyW2ldLnNoX3R5cGUgPT0gU0hUX0RZTlNZTSApIHsKKyAgICAgICAgICAgIGR5bnN5bV9pZHggPSBpOworICAgICAgICB9CisgICAgfQorICAgIGlmICgoZHluc3ltX2lkeCA9PSAtMSkgJiYgKHN5bV9pZHggPT0gLTEpKSB7CisgICAgICAgIGdvdG8gb3V0X3VubWFwOworICAgIH0KKworICAgIHRhYmxlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3ltYm9sX3RhYmxlKSk7CisgICAgaWYoIXRhYmxlKSB7CisgICAgICAgIGdvdG8gb3V0X3VubWFwOworICAgIH0KKyAgICB0YWJsZS0+bmFtZSA9IHN0cmR1cChmaWxlbmFtZSk7CisgICAgdGFibGUtPm51bV9zeW1ib2xzID0gMDsKKworICAgIEVsZjMyX1N5bSAqZHluc3ltcyA9IE5VTEw7CisgICAgRWxmMzJfU3ltICpzeW1zID0gTlVMTDsKKyAgICBpbnQgZHlubnVtc3ltcyA9IDA7CisgICAgaW50IG51bXN5bXMgPSAwOworICAgIGNoYXIgKmR5bnN0ciA9IE5VTEw7CisgICAgY2hhciAqc3RyID0gTlVMTDsKKworICAgIGlmIChkeW5zeW1faWR4ICE9IC0xKSB7CisgICAgICAgIGR5bnN5bXMgPSAoRWxmMzJfU3ltKikoYmFzZSArIHNoZHJbZHluc3ltX2lkeF0uc2hfb2Zmc2V0KTsKKyAgICAgICAgZHlubnVtc3ltcyA9IHNoZHJbZHluc3ltX2lkeF0uc2hfc2l6ZSAvIHNoZHJbZHluc3ltX2lkeF0uc2hfZW50c2l6ZTsKKyAgICAgICAgaW50IGR5bnN0cl9pZHggPSBzaGRyW2R5bnN5bV9pZHhdLnNoX2xpbms7CisgICAgICAgIGR5bnN0ciA9IGJhc2UgKyBzaGRyW2R5bnN0cl9pZHhdLnNoX29mZnNldDsKKyAgICB9CisKKyAgICBpZiAoc3ltX2lkeCAhPSAtMSkgeworICAgICAgICBzeW1zID0gKEVsZjMyX1N5bSopKGJhc2UgKyBzaGRyW3N5bV9pZHhdLnNoX29mZnNldCk7CisgICAgICAgIG51bXN5bXMgPSBzaGRyW3N5bV9pZHhdLnNoX3NpemUgLyBzaGRyW3N5bV9pZHhdLnNoX2VudHNpemU7CisgICAgICAgIGludCBzdHJfaWR4ID0gc2hkcltzeW1faWR4XS5zaF9saW5rOworICAgICAgICBzdHIgPSBiYXNlICsgc2hkcltzdHJfaWR4XS5zaF9vZmZzZXQ7CisgICAgfQorCisgICAgaW50IHN5bWJvbF9jb3VudCA9IDA7CisgICAgaW50IGR5bnN5bWJvbF9jb3VudCA9IDA7CisKKyAgICBpZiAoZHluc3ltX2lkeCAhPSAtMSkgeworICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBhbmQgY291bnQgaG93IG1hbnkgc3ltYm9scworICAgICAgICAvLyBhcmUgYWN0dWFsbHkgZGVmaW5lZAorICAgICAgICBmb3IoaSA9IDA7IGkgPCBkeW5udW1zeW1zOyBpKyspIHsKKyAgICAgICAgICAgIGlmKGR5bnN5bXNbaV0uc3Rfc2huZHggIT0gU0hOX1VOREVGKSB7CisgICAgICAgICAgICAgICAgZHluc3ltYm9sX2NvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgWExPRygiRHluYW1pYyBTeW1ib2wgY291bnQ6ICVkXG4iLCBkeW5zeW1ib2xfY291bnQpOworICAgIH0KKworICAgIGlmIChzeW1faWR4ICE9IC0xKSB7CisgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlLCBhbmQgY291bnQgaG93IG1hbnkgc3ltYm9scworICAgICAgICAvLyBhcmUgYWN0dWFsbHkgZGVmaW5lZAorICAgICAgICBmb3IoaSA9IDA7IGkgPCBudW1zeW1zOyBpKyspIHsKKyAgICAgICAgICAgIGlmKChzeW1zW2ldLnN0X3NobmR4ICE9IFNITl9VTkRFRikgJiYKKyAgICAgICAgICAgICAgICAoc3RybGVuKHN0citzeW1zW2ldLnN0X25hbWUpKSAmJgorICAgICAgICAgICAgICAgIChzeW1zW2ldLnN0X3ZhbHVlICE9IDApICYmIChzeW1zW2ldLnN0X3NpemUgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICBzeW1ib2xfY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBYTE9HKCJTeW1ib2wgY291bnQ6ICVkXG4iLCBzeW1ib2xfY291bnQpOworICAgIH0KKworICAgIC8vIE5vdywgY3JlYXRlIGFuIGVudHJ5IGluIG91ciBzeW1ib2wgdGFibGUgc3RydWN0dXJlIGZvciBlYWNoIHN5bWJvbC4uLgorICAgIHRhYmxlLT5udW1fc3ltYm9scyArPSBzeW1ib2xfY291bnQgKyBkeW5zeW1ib2xfY291bnQ7CisgICAgdGFibGUtPnN5bWJvbHMgPSBtYWxsb2ModGFibGUtPm51bV9zeW1ib2xzICogc2l6ZW9mKHN0cnVjdCBzeW1ib2wpKTsKKyAgICBpZighdGFibGUtPnN5bWJvbHMpIHsKKyAgICAgICAgZnJlZSh0YWJsZSk7CisgICAgICAgIHRhYmxlID0gTlVMTDsKKyAgICAgICAgZ290byBvdXRfdW5tYXA7CisgICAgfQorCisKKyAgICBpbnQgaiA9IDA7CisgICAgaWYgKGR5bnN5bV9pZHggIT0gLTEpIHsKKyAgICAgICAgLy8gLi4uYW5kIHBvcHVsYXRlIHRoZW0KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgZHlubnVtc3ltczsgaSsrKSB7CisgICAgICAgICAgICBpZihkeW5zeW1zW2ldLnN0X3NobmR4ICE9IFNITl9VTkRFRikgeworICAgICAgICAgICAgICAgIHRhYmxlLT5zeW1ib2xzW2pdLm5hbWUgPSBzdHJkdXAoZHluc3RyICsgZHluc3ltc1tpXS5zdF9uYW1lKTsKKyAgICAgICAgICAgICAgICB0YWJsZS0+c3ltYm9sc1tqXS5hZGRyID0gZHluc3ltc1tpXS5zdF92YWx1ZTsKKyAgICAgICAgICAgICAgICB0YWJsZS0+c3ltYm9sc1tqXS5zaXplID0gZHluc3ltc1tpXS5zdF9zaXplOworICAgICAgICAgICAgICAgIFhMT0coIm5hbWU6ICVzLCBhZGRyOiAleCwgc2l6ZTogJXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5zeW1ib2xzW2pdLm5hbWUsIHRhYmxlLT5zeW1ib2xzW2pdLmFkZHIsIHRhYmxlLT5zeW1ib2xzW2pdLnNpemUpOworICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzeW1faWR4ICE9IC0xKSB7CisgICAgICAgIC8vIC4uLmFuZCBwb3B1bGF0ZSB0aGVtCisgICAgICAgIGZvcihpID0gMDsgaSA8IG51bXN5bXM7IGkrKykgeworICAgICAgICAgICAgaWYoKHN5bXNbaV0uc3Rfc2huZHggIT0gU0hOX1VOREVGKSAmJgorICAgICAgICAgICAgICAgIChzdHJsZW4oc3RyK3N5bXNbaV0uc3RfbmFtZSkpICYmCisgICAgICAgICAgICAgICAgKHN5bXNbaV0uc3RfdmFsdWUgIT0gMCkgJiYgKHN5bXNbaV0uc3Rfc2l6ZSAhPSAwKSkgeworICAgICAgICAgICAgICAgIHRhYmxlLT5zeW1ib2xzW2pdLm5hbWUgPSBzdHJkdXAoc3RyICsgc3ltc1tpXS5zdF9uYW1lKTsKKyAgICAgICAgICAgICAgICB0YWJsZS0+c3ltYm9sc1tqXS5hZGRyID0gc3ltc1tpXS5zdF92YWx1ZTsKKyAgICAgICAgICAgICAgICB0YWJsZS0+c3ltYm9sc1tqXS5zaXplID0gc3ltc1tpXS5zdF9zaXplOworICAgICAgICAgICAgICAgIFhMT0coIm5hbWU6ICVzLCBhZGRyOiAleCwgc2l6ZTogJXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5zeW1ib2xzW2pdLm5hbWUsIHRhYmxlLT5zeW1ib2xzW2pdLmFkZHIsIHRhYmxlLT5zeW1ib2xzW2pdLnNpemUpOworICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNvcnQgdGhlIHN5bWJvbCB0YWJsZSBlbnRyaWVzLCBzbyB0aGV5IGNhbiBiZSBic2VhcmNoZWQgbGF0ZXIKKyAgICBxc29ydCh0YWJsZS0+c3ltYm9scywgdGFibGUtPm51bV9zeW1ib2xzLCBzaXplb2Yoc3RydWN0IHN5bWJvbCksIHFjb21wYXIpOworCitvdXRfdW5tYXA6CisgICAgbXVubWFwKGJhc2UsIGxlbmd0aCk7CisKK291dF9jbG9zZToKKyAgICBjbG9zZShmZCk7CisKK291dDoKKyAgICByZXR1cm4gdGFibGU7Cit9CisKKy8qCisgKiBGcmVlIGEgc3ltYm9sIHRhYmxlCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgICB0YWJsZSAtIFRhYmxlIHRvIGZyZWUKKyAqLwordm9pZCBzeW1ib2xfdGFibGVfZnJlZShzdHJ1Y3Qgc3ltYm9sX3RhYmxlICp0YWJsZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmKCF0YWJsZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yKGk9MDsgaTx0YWJsZS0+bnVtX3N5bWJvbHM7IGkrKykgeworICAgICAgICBmcmVlKHRhYmxlLT5zeW1ib2xzW2ldLm5hbWUpOworICAgIH0KKworICAgIGZyZWUodGFibGUtPnN5bWJvbHMpOworICAgIGZyZWUodGFibGUpOworfQorCisvKgorICogU2VhcmNoIGZvciBhbiBhZGRyZXNzIGluIHRoZSBzeW1ib2wgdGFibGUKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgICB0YWJsZSAtIFRhYmxlIHRvIHNlYXJjaCBpbgorICogICAgICBhZGRyIC0gQWRkcmVzcyB0byBzZWFyY2ggZm9yLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgIEEgcG9pbnRlciB0byB0aGUgU3ltYm9sIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICogICAgICBzeW1ib2wgd2hpY2ggY29udGFpbnMgdGhpcyBhZGRyZXNzLCBvciBOVUxMIGlmIG5vIHN5bWJvbAorICogICAgICBjb250YWlucyBpdC4KKyAqLworY29uc3Qgc3RydWN0IHN5bWJvbCAqc3ltYm9sX3RhYmxlX2xvb2t1cChzdHJ1Y3Qgc3ltYm9sX3RhYmxlICp0YWJsZSwgdW5zaWduZWQgaW50IGFkZHIpCit7CisgICAgaWYoIXRhYmxlKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBic2VhcmNoKCh2b2lkKilhZGRyLCB0YWJsZS0+c3ltYm9scywgdGFibGUtPm51bV9zeW1ib2xzLCBzaXplb2Yoc3RydWN0IHN5bWJvbCksIGJjb21wYXIpOworfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3N5bWJvbF90YWJsZS5oIGIvZGVidWdnZXJkL3N5bWJvbF90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNDFmOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlcmQvc3ltYm9sX3RhYmxlLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBTWU1CT0xfVEFCTEVfSAorI2RlZmluZSBTWU1CT0xfVEFCTEVfSAorCitzdHJ1Y3Qgc3ltYm9sIHsKKyAgICB1bnNpZ25lZCBpbnQgYWRkcjsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICBjaGFyICpuYW1lOworfTsKKworc3RydWN0IHN5bWJvbF90YWJsZSB7CisgICAgc3RydWN0IHN5bWJvbCAqc3ltYm9sczsKKyAgICBpbnQgbnVtX3N5bWJvbHM7CisgICAgY2hhciAqbmFtZTsKK307CisKK3N0cnVjdCBzeW1ib2xfdGFibGUgKnN5bWJvbF90YWJsZV9jcmVhdGUoY29uc3QgY2hhciAqZmlsZW5hbWUpOwordm9pZCBzeW1ib2xfdGFibGVfZnJlZShzdHJ1Y3Qgc3ltYm9sX3RhYmxlICp0YWJsZSk7Citjb25zdCBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xfdGFibGVfbG9va3VwKHN0cnVjdCBzeW1ib2xfdGFibGUgKnRhYmxlLCB1bnNpZ25lZCBpbnQgYWRkcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3V0aWxpdHkuYyBiL2RlYnVnZ2VyZC91dGlsaXR5LmMKaW5kZXggOGYzOTMxYy4uMmFmZGI0NiAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL3V0aWxpdHkuYworKysgYi9kZWJ1Z2dlcmQvdXRpbGl0eS5jCkBAIC0zOCwxNCArMzgsMTQgQEAKICAgICB1bnNpZ25lZCBpbnQgaTsKIAogICAgIGZvciAoaSA9IDA7IGkrNCA8PSBzaXplOyBpKz00KSB7Ci0gICAgICAgICooaW50ICopKGRzdCtpKSA9IHB0cmFjZShQVFJBQ0VfUEVFS1RFWFQsIHBpZCwgc3JjK2ksIE5VTEwpOworICAgICAgICAqKGludCAqKSgoY2hhciAqKWRzdCtpKSA9IHB0cmFjZShQVFJBQ0VfUEVFS1RFWFQsIHBpZCwgKGNoYXIgKilzcmMraSwgTlVMTCk7CiAgICAgfQogCiAgICAgaWYgKGkgPCBzaXplKSB7CiAgICAgICAgIGludCB2YWw7CiAKICAgICAgICAgYXNzZXJ0KChzaXplIC0gaSkgPCA0KTsKLSAgICAgICAgdmFsID0gcHRyYWNlKFBUUkFDRV9QRUVLVEVYVCwgcGlkLCBzcmMraSwgTlVMTCk7CisgICAgICAgIHZhbCA9IHB0cmFjZShQVFJBQ0VfUEVFS1RFWFQsIHBpZCwgKGNoYXIgKilzcmMraSwgTlVMTCk7CiAgICAgICAgIHdoaWxlIChpIDwgc2l6ZSkgewogICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyICopZHN0KVtpXSA9IHZhbCAmIDB4ZmY7CiAgICAgICAgICAgICBpKys7CkBAIC02OSwxMSArNjksMTIgQEAKIC8qIEZpbmQgdGhlIGNvbnRhaW5pbmcgbWFwIGluZm8gZm9yIHRoZSBwYyAqLwogY29uc3QgbWFwaW5mbyAqcGNfdG9fbWFwaW5mbyhtYXBpbmZvICptaSwgdW5zaWduZWQgcGMsIHVuc2lnbmVkICpyZWxfcGMpCiB7CisgICAgKnJlbF9wYyA9IHBjOwogICAgIHdoaWxlKG1pKSB7CiAgICAgICAgIGlmKChwYyA+PSBtaS0+c3RhcnQpICYmIChwYyA8IG1pLT5lbmQpKXsKICAgICAgICAgICAgIC8vIE9ubHkgY2FsY3VsYXRlIHRoZSByZWxhdGl2ZSBvZmZzZXQgZm9yIHNoYXJlZCBsaWJyYXJpZXMKICAgICAgICAgICAgIGlmIChzdHJzdHIobWktPm5hbWUsICIuc28iKSkgewotICAgICAgICAgICAgICAgICpyZWxfcGMgPSBwYyAtIG1pLT5zdGFydDsKKyAgICAgICAgICAgICAgICAqcmVsX3BjIC09IG1pLT5zdGFydDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBtaTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3V0aWxpdHkuaCBiL2RlYnVnZ2VyZC91dGlsaXR5LmgKaW5kZXggNDlmNTk1MS4uMDY4MmI4NSAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL3V0aWxpdHkuaAorKysgYi9kZWJ1Z2dlcmQvdXRpbGl0eS5oCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogCisjaW5jbHVkZSAic3ltYm9sX3RhYmxlLmgiCisKICNpZm5kZWYgUFRfQVJNX0VYSURYCiAjZGVmaW5lIFBUX0FSTV9FWElEWCAgICAweDcwMDAwMDAxICAgICAgLyogLkFSTS5leGlkeCBzZWdtZW50ICovCiAjZW5kaWYKQEAgLTMzLDYgKzM1LDcgQEAKICAgICB1bnNpZ25lZCBlbmQ7CiAgICAgdW5zaWduZWQgZXhpZHhfc3RhcnQ7CiAgICAgdW5zaWduZWQgZXhpZHhfZW5kOworICAgIHN0cnVjdCBzeW1ib2xfdGFibGUgKnN5bWJvbHM7CiAgICAgY2hhciBuYW1lW107CiB9IG1hcGluZm87CiAKQEAgLTUzLDQgKzU2LDExIEBACiAvKiBMb2cgaW5mb3JtYXRpb24gb250byB0aGUgdG9tYnN0b25lICovCiBleHRlcm4gdm9pZCBfTE9HKGludCB0ZmQsIGJvb2wgaW5fdG9tYnN0b25lX29ubHksIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAorI2RlZmluZSBMT0coZm10Li4uKSBfTE9HKC0xLCAwLCBmbXQpCisjaWYgMAorI2RlZmluZSBYTE9HKGZtdC4uLikgX0xPRygtMSwgMCwgZm10KQorI2Vsc2UKKyNkZWZpbmUgWExPRyhmbXQuLi4pIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQveDg2L2NyYXNoZ2x1ZS5TIGIvZGVidWdnZXJkL3g4Ni9jcmFzaGdsdWUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRmNDMyCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXJkL3g4Ni9jcmFzaGdsdWUuUwpAQCAtMCwwICsxLDE1IEBACisuZ2xvYmwgY3Jhc2gxCisuZ2xvYmwgY3Jhc2hub3N0YWNrCisKK2NyYXNoMToKKwltb3ZsICQweGE1YTUwMDAwLCAlZWF4CisJbW92bCAkMHhhNWE1MDAwMSwgJWVieAorCW1vdmwgJDB4YTVhNTAwMDIsICVlY3gKKworCW1vdmwgJDAsICVlZHgKKwlqbXAgKiVlZHgKKworCitjcmFzaG5vc3RhY2s6CisJbW92bCAkMCwgJWVicAorCWptcCAqJWVicApkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3g4Ni9tYWNoaW5lLmMgYi9kZWJ1Z2dlcmQveDg2L21hY2hpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDQxOGNmCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXJkL3g4Ni9tYWNoaW5lLmMKQEAgLTAsMCArMSw2MSBAQAorLyogc3lzdGVtL2RlYnVnZ2VyZC9kZWJ1Z2dlcmQuYworKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL2V4ZWNfZWxmLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPGN1dGlscy9zb2NrZXRzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKKyNpbmNsdWRlICIuLi91dGlsaXR5LmgiCisjaW5jbHVkZSAieDg2X3V0aWxpdHkuaCIKKwordm9pZCBkdW1wX3JlZ2lzdGVycyhpbnQgdGZkLCBpbnQgcGlkLCBib29sIGF0X2ZhdWx0KQoreworICAgIHN0cnVjdCBwdF9yZWdzX3g4NiByOworICAgIGJvb2wgb25seV9pbl90b21ic3RvbmUgPSAhYXRfZmF1bHQ7CisKKyAgICBpZihwdHJhY2UoUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgJnIpKSB7CisgICAgICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwKKyAgICAgICAgICAgICAiY2Fubm90IGdldCByZWdpc3RlcnM6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm47CisgICAgfQorLy9pZiB0aGVyZSBpcyBubyBzdGFjaywgbm8gcHJpbnQganVzdCBsaWtlIGFybQorICAgIGlmKCFyLmVicCkKKyAgICAgICAgcmV0dXJuOworICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwgIiBlYXggJTA4eCAgZWJ4ICUwOHggIGVjeCAlMDh4ICBlZHggJTA4eFxuIiwKKyAgICAgICAgIHIuZWF4LCByLmVieCwgci5lY3gsIHIuZWR4KTsKKyAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICIgZXNpICUwOHggIGVkaSAlMDh4XG4iLAorICAgICAgICAgci5lc2ksIHIuZWRpKTsKKyAgICBfTE9HKHRmZCwgb25seV9pbl90b21ic3RvbmUsICIgeGNzICUwOHggIHhkcyAlMDh4ICB4ZXMgJTA4eCAgeGZzICUwOHggeHNzICUwOHhcbiIsCisgICAgICAgICByLnhjcywgci54ZHMsIHIueGVzLCByLnhmcywgci54c3MpOworICAgIF9MT0codGZkLCBvbmx5X2luX3RvbWJzdG9uZSwKKyAgICAgICAgICIgZWlwICUwOHggIGVicCAlMDh4ICBlc3AgJTA4eCAgZmxhZ3MgJTA4eFxuIiwKKyAgICAgICAgIHIuZWlwLCByLmVicCwgci5lc3AsIHIuZWZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC94ODYvdW53aW5kLmMgYi9kZWJ1Z2dlcmQveDg2L3Vud2luZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmODRlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlcmQveDg2L3Vud2luZC5jCkBAIC0wLDAgKzEsODUgQEAKKyNpbmNsdWRlIDxjdXRpbHMvbG9nZC5oPgorI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKyNpbmNsdWRlICIuLi91dGlsaXR5LmgiCisjaW5jbHVkZSAieDg2X3V0aWxpdHkuaCIKKworCitpbnQgdW53aW5kX2JhY2t0cmFjZV93aXRoX3B0cmFjZV94ODYoaW50IHRmZCwgcGlkX3QgcGlkLCBtYXBpbmZvICptYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF0X2ZhdWx0KQoreworICAgIHN0cnVjdCBwdF9yZWdzX3g4NiByOworICAgIHVuc2lnbmVkIGludCBzdGFja19sZXZlbCA9IDA7CisgICAgdW5zaWduZWQgaW50IHN0YWNrX2RlcHRoID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgcmVsX3BjOworICAgIHVuc2lnbmVkIGludCBzdGFja19wdHI7CisgICAgdW5zaWduZWQgaW50IHN0YWNrX2NvbnRlbnQ7CisKKyAgICBpZihwdHJhY2UoUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgJnIpKSByZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBpbnQgZWlwID0gKHVuc2lnbmVkIGludClyLmVpcDsKKyAgICB1bnNpZ25lZCBpbnQgZWJwID0gKHVuc2lnbmVkIGludClyLmVicDsKKyAgICB1bnNpZ25lZCBpbnQgY3VyX3NwID0gKHVuc2lnbmVkIGludClyLmVzcDsKKyAgICBjb25zdCBtYXBpbmZvICptaTsKKyAgICBjb25zdCBzdHJ1Y3Qgc3ltYm9sKiBzeW0gPSAwOworCisKKy8vZWJwPT0wLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhY2sgaXMgcG9wZWQgdG8gdGhlIGJvdHRvbSBvciB0aGVyZSBpcyBubyBzdGFjayBhdCBhbGwuCisgICAgd2hpbGUgKGVicCkgeworICAgICAgICBfTE9HKHRmZCwgIWF0X2ZhdWx0LCAiIzAlZCAiLHN0YWNrX2xldmVsKTsKKyAgICAgICAgbWkgPSBwY190b19tYXBpbmZvKG1hcCwgZWlwLCAmcmVsX3BjKTsKKworICAgICAgICAvKiBTZWUgaWYgd2UgY2FuIGRldGVybWluZSB3aGF0IHN5bWJvbCB0aGlzIHN0YWNrIGZyYW1lIHJlc2lkZXMgaW4gKi8KKyAgICAgICAgaWYgKG1pICE9IDAgJiYgbWktPnN5bWJvbHMgIT0gMCkgeworICAgICAgICAgICAgc3ltID0gc3ltYm9sX3RhYmxlX2xvb2t1cChtaS0+c3ltYm9scywgcmVsX3BjKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3ltKSB7CisgICAgICAgICAgICBfTE9HKHRmZCwgIWF0X2ZhdWx0LCAiICAgIGVpcDogJTA4eCAgJXMgKCVzKVxuIiwgZWlwLCBtaSA/IG1pLT5uYW1lIDogIiIsIHN5bS0+bmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfTE9HKHRmZCwgIWF0X2ZhdWx0LCAiICAgIGVpcDogJTA4eCAgJXNcbiIsIGVpcCwgbWkgPyBtaS0+bmFtZSA6ICIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YWNrX2xldmVsKys7CisgICAgICAgIGlmIChzdGFja19sZXZlbCA+PSBTVEFDS19ERVBUSCB8fCBlaXAgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBlaXAgPSBwdHJhY2UoUFRSQUNFX1BFRUtURVhULCBwaWQsICh2b2lkKikoZWJwICsgNCksIE5VTEwpOworICAgICAgICBlYnAgPSBwdHJhY2UoUFRSQUNFX1BFRUtURVhULCBwaWQsICh2b2lkKillYnAsIE5VTEwpOworICAgIH0KKyAgICBlYnAgPSAodW5zaWduZWQgaW50KXIuZWJwOworICAgIHN0YWNrX2RlcHRoID0gc3RhY2tfbGV2ZWw7CisgICAgc3RhY2tfbGV2ZWwgPSAwOworICAgIGlmIChlYnApCisgICAgICAgIF9MT0codGZkLCAhYXRfZmF1bHQsICJzdGFjazogXG4iKTsKKyAgICB3aGlsZSAoZWJwKSB7CisgICAgICAgIF9MT0codGZkLCAhYXRfZmF1bHQsICIjMCVkIFxuIixzdGFja19sZXZlbCk7CisgICAgICAgIHN0YWNrX3B0ciA9IGN1cl9zcDsKKyAgICAgICAgd2hpbGUoKGludCkoZWJwIC0gc3RhY2tfcHRyKSA+PSAwKSB7CisgICAgICAgICAgICBzdGFja19jb250ZW50ID0gcHRyYWNlKFBUUkFDRV9QRUVLVEVYVCwgcGlkLCAodm9pZCopc3RhY2tfcHRyLCBOVUxMKTsKKyAgICAgICAgICAgIG1pID0gcGNfdG9fbWFwaW5mbyhtYXAsIHN0YWNrX2NvbnRlbnQsICZyZWxfcGMpOworCisgICAgICAgICAgICAvKiBTZWUgaWYgd2UgY2FuIGRldGVybWluZSB3aGF0IHN5bWJvbCB0aGlzIHN0YWNrIGZyYW1lIHJlc2lkZXMgaW4gKi8KKyAgICAgICAgICAgIGlmIChtaSAhPSAwICYmIG1pLT5zeW1ib2xzICE9IDApIHsKKyAgICAgICAgICAgICAgICBzeW0gPSBzeW1ib2xfdGFibGVfbG9va3VwKG1pLT5zeW1ib2xzLCByZWxfcGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN5bSkgeworICAgICAgICAgICAgICAgIF9MT0codGZkLCAhYXRfZmF1bHQsICIgICAgJTA4eCAgJTA4eCAgJXMgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tfcHRyLCBzdGFja19jb250ZW50LCBtaSA/IG1pLT5uYW1lIDogIiIsIHN5bS0+bmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9MT0codGZkLCAhYXRfZmF1bHQsICIgICAgJTA4eCAgJTA4eCAgJXNcbiIsIHN0YWNrX3B0ciwgc3RhY2tfY29udGVudCwgbWkgPyBtaS0+bmFtZSA6ICIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhY2tfcHRyID0gc3RhY2tfcHRyICsgNDsKKyAgICAgICAgICAgIC8vdGhlIHN0YWNrIGZyYW1lIG1heSBiZSB2ZXJ5IGRlZXAuCisgICAgICAgICAgICBpZigoaW50KShzdGFja19wdHIgLSBjdXJfc3ApID49IFNUQUNLX0ZSQU1FX0RFUFRIKSB7CisgICAgICAgICAgICAgICAgX0xPRyh0ZmQsICFhdF9mYXVsdCwgIiAgICAuLi4uLi4gIC4uLi4uLiAgXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjdXJfc3AgPSBlYnAgKyA0OworICAgICAgICBzdGFja19sZXZlbCsrOworICAgICAgICBpZiAoc3RhY2tfbGV2ZWwgPj0gU1RBQ0tfREVQVEggfHwgc3RhY2tfbGV2ZWwgPj0gc3RhY2tfZGVwdGgpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWJwID0gcHRyYWNlKFBUUkFDRV9QRUVLVEVYVCwgcGlkLCAodm9pZCopZWJwLCBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhY2tfZGVwdGg7Cit9CisKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC94ODYveDg2X3V0aWxpdHkuaCBiL2RlYnVnZ2VyZC94ODYveDg2X3V0aWxpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzZhODg1Ci0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXJkL3g4Ni94ODZfdXRpbGl0eS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgU1RBQ0tfREVQVEggOAorI2RlZmluZSBTVEFDS19GUkFNRV9ERVBUSCA2NAorCit0eXBlZGVmIHN0cnVjdCBwdF9yZWdzX3g4NiB7CisgICAgbG9uZyBlYng7CisgICAgbG9uZyBlY3g7CisgICAgbG9uZyBlZHg7CisgICAgbG9uZyBlc2k7CisgICAgbG9uZyBlZGk7CisgICAgbG9uZyBlYnA7CisgICAgbG9uZyBlYXg7CisgICAgaW50ICB4ZHM7CisgICAgaW50ICB4ZXM7CisgICAgaW50ICB4ZnM7CisgICAgaW50ICB4Z3M7CisgICAgbG9uZyBvcmlnX2VheDsKKyAgICBsb25nIGVpcDsKKyAgICBpbnQgIHhjczsKKyAgICBsb25nIGVmbGFnczsKKyAgICBsb25nIGVzcDsKKyAgICBpbnQgIHhzczsKK31wdF9yZWdzX3g4NjsKKwpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvZW5naW5lLmMgYi9mYXN0Ym9vdC9lbmdpbmUuYwppbmRleCA4YmEyMDJjLi40ODA3M2VlIDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9lbmdpbmUuYworKysgYi9mYXN0Ym9vdC9lbmdpbmUuYwpAQCAtOTcsMTQgKzk3LDIwIEBACiB7CiAgICAgQWN0aW9uICphOwogICAgIHZhX2xpc3QgYXA7CisgICAgc2l6ZV90IGNtZHNpemU7CiAKICAgICBhID0gY2FsbG9jKDEsIHNpemVvZihBY3Rpb24pKTsKICAgICBpZiAoYSA9PSAwKSBkaWUoIm91dCBvZiBtZW1vcnkiKTsKIAogICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIHZzcHJpbnRmKGEtPmNtZCwgZm10LCBhcCk7CisgICAgY21kc2l6ZSA9IHZzbnByaW50ZihhLT5jbWQsIHNpemVvZihhLT5jbWQpLCBmbXQsIGFwKTsKICAgICB2YV9lbmQoYXApOwogCisgICAgaWYgKGNtZHNpemUgPj0gc2l6ZW9mKGEtPmNtZCkpIHsKKyAgICAgICAgZnJlZShhKTsKKyAgICAgICAgZGllKCJDb21tYW5kIGxlbmd0aCAoJWQpIGV4Y2VlZHMgbWF4aW11bSBzaXplICglZCkiLCBjbWRzaXplLCBzaXplb2YoYS0+Y21kKSk7CisgICAgfQorCiAgICAgaWYgKGFjdGlvbl9sYXN0KSB7CiAgICAgICAgIGFjdGlvbl9sYXN0LT5uZXh0ID0gYTsKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvZmFzdGJvb3QuYyBiL2Zhc3Rib290L2Zhc3Rib290LmMKaW5kZXggZjNiZmJlYmEuLjE0MDQ4YTEgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L2Zhc3Rib290LmMKKysrIGIvZmFzdGJvb3QvZmFzdGJvb3QuYwpAQCAtMjIzLDYgKzIyMyw3IEBACiAgICAgICAgICAgICAiICBib290IDxrZXJuZWw+IFsgPHJhbWRpc2s+IF0gICAgICAgICAgICAgIGRvd25sb2FkIGFuZCBib290IGtlcm5lbFxuIgogICAgICAgICAgICAgIiAgZmxhc2g6cmF3IGJvb3QgPGtlcm5lbD4gWyA8cmFtZGlzaz4gXSAgICBjcmVhdGUgYm9vdGltYWdlIGFuZCBmbGFzaCBpdFxuIgogICAgICAgICAgICAgIiAgZGV2aWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0IGFsbCBjb25uZWN0ZWQgZGV2aWNlc1xuIgorICAgICAgICAgICAgIiAgY29udGludWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSB3aXRoIGF1dG9ib290XG4iCiAgICAgICAgICAgICAiICByZWJvb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYm9vdCBkZXZpY2Ugbm9ybWFsbHlcbiIKICAgICAgICAgICAgICIgIHJlYm9vdC1ib290bG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgcmVib290IGRldmljZSBpbnRvIGJvb3Rsb2FkZXJcbiIKICAgICAgICAgICAgICJcbiIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXJjaC9kYXJ3aW4teDg2L0FuZHJvaWRDb25maWcuaCBiL2luY2x1ZGUvYXJjaC9kYXJ3aW4teDg2L0FuZHJvaWRDb25maWcuaAppbmRleCAyYmI0NGM2Li45OTE0YmQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FyY2gvZGFyd2luLXg4Ni9BbmRyb2lkQ29uZmlnLmgKKysrIGIvaW5jbHVkZS9hcmNoL2Rhcndpbi14ODYvQW5kcm9pZENvbmZpZy5oCkBAIC0zMDAsNCArMzAwLDEyIEBACiAgKi8KICNkZWZpbmUgSEFWRV9QUklOVEZfWkQgMQogCisvKgorICogV2UgbmVlZCB0byBvcGVuIGJpbmFyeSBmaWxlcyB1c2luZyBPX0JJTkFSWSBvbiBXaW5kb3dzLgorICogTW9zdCBzeXN0ZW1zIGxhY2sgKGFuZCBhY3R1YWxseSBkb24ndCBuZWVkKSB0aGlzIGZsYWcuCisgKi8KKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmCisKICNlbmRpZiAvKl9BTkRST0lEX0NPTkZJR19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXJjaC9mcmVlYnNkLXg4Ni9BbmRyb2lkQ29uZmlnLmggYi9pbmNsdWRlL2FyY2gvZnJlZWJzZC14ODYvQW5kcm9pZENvbmZpZy5oCmluZGV4IDk5MmI2ODkuLmVkNWFmNTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXJjaC9mcmVlYnNkLXg4Ni9BbmRyb2lkQ29uZmlnLmgKKysrIGIvaW5jbHVkZS9hcmNoL2ZyZWVic2QteDg2L0FuZHJvaWRDb25maWcuaApAQCAtMzU4LDQgKzM1OCwxMiBAQAogICovCiAjZGVmaW5lIEhBVkVfUFJJTlRGX1pEIDEKIAorLyoKKyAqIFdlIG5lZWQgdG8gb3BlbiBiaW5hcnkgZmlsZXMgdXNpbmcgT19CSU5BUlkgb24gV2luZG93cy4KKyAqIE1vc3Qgc3lzdGVtcyBsYWNrIChhbmQgYWN0dWFsbHkgZG9uJ3QgbmVlZCkgdGhpcyBmbGFnLgorICovCisjaWZuZGVmIE9fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCiAjZW5kaWYgLypfQU5EUk9JRF9DT05GSUdfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FyY2gvbGludXgtYXJtL0FuZHJvaWRDb25maWcuaCBiL2luY2x1ZGUvYXJjaC9saW51eC1hcm0vQW5kcm9pZENvbmZpZy5oCmluZGV4IDViN2NjZWUuLmM3MDYxOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXJjaC9saW51eC1hcm0vQW5kcm9pZENvbmZpZy5oCisrKyBiL2luY2x1ZGUvYXJjaC9saW51eC1hcm0vQW5kcm9pZENvbmZpZy5oCkBAIC0zNTQsNCArMzU0LDEyIEBACiAgKi8KICNkZWZpbmUgSEFWRV9QUklOVEZfWkQgMQogCisvKgorICogV2UgbmVlZCB0byBvcGVuIGJpbmFyeSBmaWxlcyB1c2luZyBPX0JJTkFSWSBvbiBXaW5kb3dzLgorICogTW9zdCBzeXN0ZW1zIGxhY2sgKGFuZCBhY3R1YWxseSBkb24ndCBuZWVkKSB0aGlzIGZsYWcuCisgKi8KKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmCisKICNlbmRpZiAvKiBfQU5EUk9JRF9DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcmNoL2xpbnV4LXBwYy9BbmRyb2lkQ29uZmlnLmggYi9pbmNsdWRlL2FyY2gvbGludXgtcHBjL0FuZHJvaWRDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWFmNjI5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hcmNoL2xpbnV4LXBwYy9BbmRyb2lkQ29uZmlnLmgKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQW5kcm9pZCBjb25maWcgLS0gIkxpbnV4Ii4gIFVzZWQgZm9yIGRlc2t0b3AgcHBjIExpbnV4LgorICovCisjaWZuZGVmIF9BTkRST0lEX0NPTkZJR19ICisjZGVmaW5lIF9BTkRST0lEX0NPTkZJR19ICisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISEhIElNUE9SVEFOVCAhISEKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSBBTEwgQy9DKysgc291cmNlIGZpbGVzLiAgRG9uJ3QgcHV0IGFueXRoaW5nIGluCisgKiBoZXJlIHVubGVzcyB5b3UgYXJlIGFic29sdXRlbHkgY2VydGFpbiBpdCBjYW4ndCBnbyBhbnl3aGVyZSBlbHNlLgorICoKKyAqIEFueSBDKysgc3R1ZmYgbXVzdCBiZSB3cmFwcGVkIHdpdGggIiNpZmRlZiBfX2NwbHVzcGx1cyIuICBEbyBub3QgdXNlICIvLyIKKyAqIGNvbW1lbnRzLgorICovCisKKy8qCisgKiBUaHJlYWRpbmcgbW9kZWwuICBDaG9vc2Ugb25lOgorICoKKyAqIEhBVkVfUFRIUkVBRFMgLSB1c2UgdGhlIHB0aHJlYWRzIGxpYnJhcnkuCisgKiBIQVZFX1dJTjMyX1RIUkVBRFMgLSB1c2UgV2luMzIgdGhyZWFkIHByaW1pdGl2ZXMuCisgKiAgLS0gY29tYmluZSBIQVZFX0NSRUFURVRIUkVBRCwgSEFWRV9DUkVBVEVNVVRFWCwgYW5kIEhBVkVfX0JFR0lOVEhSRUFERVgKKyAqLworI2RlZmluZSBIQVZFX1BUSFJFQURTCisKKy8qCisgKiBEbyB3ZSBoYXZlIHRoZSBmdXRleCBzeXNjYWxsPworICovCisKKyNkZWZpbmUgSEFWRV9GVVRFWAorCisvKgorICogUHJvY2VzcyBjcmVhdGlvbiBtb2RlbC4gIENob29zZSBvbmU6CisgKgorICogSEFWRV9GT1JLRVhFQyAtIHVzZSBmb3JrKCkgYW5kIGV4ZWMoKQorICogSEFWRV9XSU4zMl9QUk9DIC0gdXNlIENyZWF0ZVByb2Nlc3MoKQorICovCisjZGVmaW5lIEhBVkVfRk9SS0VYRUMKKworLyoKKyAqIFByb2Nlc3Mgb3V0LW9mLW1lbW9yeSBhZGp1c3RtZW50LiAgU2V0IGlmIHJ1bm5pbmcgb24gTGludXgsCisgKiB3aGVyZSB3ZSBjYW4gd3JpdGUgdG8gL3Byb2MvPHBpZD4vb29tX2FkaiB0byBtb2RpZnkgdGhlIG91dC1vZi1tZW1vcnkKKyAqIGJhZG5lc3MgYWRqdXN0bWVudC4KKyAqLworI2RlZmluZSBIQVZFX09PTV9BREoKKworLyoKKyAqIElQQyBtb2RlbC4gIENob29zZSBvbmU6CisgKgorICogSEFWRV9TWVNWX0lQQyAtIHVzZSB0aGUgY2xhc3NpYyBTeXNWIElQQyBtZWNoYW5pc21zIChzZW1nZXQsIHNobWdldCkuCisgKiBIQVZFX01BQ09TWF9JUEMgLSB1c2UgTWFjaW50b3NoIElQQyBtZWNoYW5pc21zIChzZW1fb3BlbiwgbW1hcCkuCisgKiBIQVZFX1dJTjMyX0lQQyAtIHVzZSBXaW4zMiBJUEMgKENyZWF0ZVNlbWFwaG9yZSwgQ3JlYXRlRmlsZU1hcHBpbmcpLgorICogSEFWRV9BTkRST0lEX0lQQyAtIHVzZSBBbmRyb2lkIHZlcnNpb25zICg/LCBtbWFwKS4KKyAqLworI2RlZmluZSBIQVZFX1NZU1ZfSVBDCisKKy8qCisgKiBNZW1vcnktbWFwcGluZyBtb2RlbC4gQ2hvb3NlIG9uZToKKyAqCisgKiBIQVZFX1BPU0lYX0ZJTEVNQVAgLSB1c2UgdGhlIFBvc2l4IHN5cy9tbWFwLmgKKyAqIEhBVkVfV0lOMzJfRklMRU1BUCAtIHVzZSBXaW4zMiBmaWxlbWFwcworICovCisjZGVmaW5lICBIQVZFX1BPU0lYX0ZJTEVNQVAKKworLyoKKyAqIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIDx0ZXJtaW8uaD4KKyAqLworI2RlZmluZSAgSEFWRV9URVJNSU9fSAorCisvKgorICogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgPHN5cy9zZW5kZmlsZS5oPgorICovCisjZGVmaW5lICBIQVZFX1NZU19TRU5ERklMRV9IIDEKKworLyoKKyAqIERlZmluZSB0aGlzIGlmIHlvdSBidWlsZCBhZ2FpbnN0IE1TVkNSVC5ETEwKKyAqLworLyogI2RlZmluZSBIQVZFX01TX0NfUlVOVElNRSAqLworCisvKgorICogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgc3lzL3Vpby5oCisgKi8KKyNkZWZpbmUgIEhBVkVfU1lTX1VJT19ICisKKy8qCisgKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHBsYXRmb3JtcyBpbXBsZW1lbnRzIHN5bWJvbGljIGxpbmtzCisgKiBpbiBpdHMgZmlsZXN5c3RlbXMKKyAqLworI2RlZmluZSBIQVZFX1NZTUxJTktTCisKKy8qCisgKiBEZWZpbmUgdGhpcyBpZiB3ZSBoYXZlIGxvY2FsdGltZV9yKCkuCisgKi8KKyNkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorCisvKgorICogRGVmaW5lIHRoaXMgaWYgd2UgaGF2ZSBnZXRob3N0YnluYW1lX3IoKS4KKyAqLworI2RlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUVfUgorCisvKgorICogRGVmaW5lIHRoaXMgaWYgd2UgaGF2ZSBpb2N0bCgpLgorICovCisjZGVmaW5lIEhBVkVfSU9DVEwKKworLyoKKyAqIERlZmluZSB0aGlzIGlmIHdlIHdhbnQgdG8gdXNlIFdpblNvY2suCisgKi8KKy8qICNkZWZpbmUgSEFWRV9XSU5TT0NLICovCisKKy8qCisgKiBEZWZpbmUgdGhpcyBpZiBoYXZlIGNsb2NrX2dldHRpbWUoKSBhbmQgZnJpZW5kcworICoKKyAqIERlc2t0b3AgTGludXggaGFzIHRoaXMgaW4gbGlicnQsIGJ1dCBpdCdzIGJyb2tlbiBpbiBnb29idW50dSwgeWllbGRpbmcKKyAqIG1pbGRseSBvciB3aWxkbHkgaW5hY2N1cmF0ZSByZXN1bHRzLgorICovCisvKiNkZWZpbmUgSEFWRV9QT1NJWF9DTE9DS1MqLworCisvKgorICogRGVmaW5lIHRoaXMgaWYgd2UgaGF2ZSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0X21vbm90b25pYygpIGFuZAorICogY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpLgorICovCisvKiAjZGVmaW5lIEhBVkVfVElNRURXQUlUX01PTk9UT05JQyAqLworCisvKgorICogRGVmaW5lIHRoaXMgaWYgd2UgaGF2ZSBsaW51eCBzdHlsZSBlcG9sbCgpCisgKi8KKyNkZWZpbmUgSEFWRV9FUE9MTAorCisvKgorICogRW5kaWFubmVzcyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICBDaG9vc2Ugb25lOgorICoKKyAqIEhBVkVfRU5ESUFOX0ggLS0gaGF2ZSBlbmRpYW4uaCBoZWFkZXIgd2UgY2FuIGluY2x1ZGUuCisgKiBIQVZFX0xJVFRMRV9FTkRJQU4gLS0gd2UgYXJlIGxpdHRsZSBlbmRpYW4uCisgKiBIQVZFX0JJR19FTkRJQU4gLS0gd2UgYXJlIGJpZyBlbmRpYW4uCisgKi8KKyNkZWZpbmUgSEFWRV9FTkRJQU5fSAorI2RlZmluZSBIQVZFX0JJR19FTkRJQU4KKworLyoKKyAqIFdlIG5lZWQgdG8gY2hvb3NlIGJldHdlZW4gMzItYml0IGFuZCA2NC1iaXQgb2ZmX3QuICBBbGwgb2Ygb3VyIGNvZGUgc2hvdWxkCisgKiBhZ3JlZSBvbiB0aGUgc2FtZSBzaXplLiAgRm9yIGRlc2t0b3Agc3lzdGVtcywgdXNlIDY0LWJpdCB2YWx1ZXMsCisgKiBiZWNhdXNlIHNvbWUgb2Ygb3VyIGxpYnJhcmllcyAoZS5nLiB3eFdpZGdldHMpIGV4cGVjdCB0byBiZSBidWlsdCB0aGF0IHdheS4KKyAqLworI2RlZmluZSBfRklMRV9PRkZTRVRfQklUUyA2NAorI2RlZmluZSBfTEFSR0VGSUxFX1NPVVJDRSAxCisKKy8qCisgKiBEZWZpbmVkIGlmIHdlIGhhdmUgdGhlIGJhY2t0cmFjZSgpIGNhbGwgZm9yIHJldHJpZXZpbmcgYSBzdGFjayB0cmFjZS4KKyAqIE5lZWRlZCBmb3IgQ2FsbFN0YWNrIHRvIG9wZXJhdGU7IGlmIG5vdCBkZWZpbmVkLCBDYWxsU3RhY2sgaXMKKyAqIG5vbi1mdW5jdGlvbmFsLgorICovCisjZGVmaW5lIEhBVkVfQkFDS1RSQUNFIDEKKworLyoKKyAqIERlZmluZWQgaWYgd2UgaGF2ZSB0aGUgZGxhZGRyKCkgY2FsbCBmb3IgcmV0cmlldmluZyB0aGUgc3ltYm9sIGFzc29jaWF0ZWQKKyAqIHdpdGggYSBtZW1vcnkgYWRkcmVzcy4gIElmIG5vdCBkZWZpbmVkLCBzdGFjayBjcmF3bHMgd2lsbCBub3QgaGF2ZSBzeW1ib2xpYworICogaW5mb3JtYXRpb24uCisgKi8KKyNkZWZpbmUgSEFWRV9ETEFERFIgMQorCisvKgorICogRGVmaW5lZCBpZiB3ZSBoYXZlIHRoZSBjeHhhYmkuaCBoZWFkZXIgZm9yIGRlbWFuZ2xpbmcgQysrIHN5bWJvbHMuICBJZgorICogbm90IGRlZmluZWQsIHN0YWNrIGNyYXdscyB3aWxsIGJlIGRpc3BsYXllZCB3aXRoIHJhdyBtYW5nbGVkIHN5bWJvbHMKKyAqLworI2RlZmluZSBIQVZFX0NYWEFCSSAwCisKKy8qCisgKiBEZWZpbmVkIGlmIHdlIGhhdmUgdGhlIGdldHRpZCgpIHN5c3RlbSBjYWxsLgorICovCisvKiAjZGVmaW5lIEhBVkVfR0VUVElEICovCisKKy8qCisgKiBEZWZpbmVkIGlmIHdlIGhhdmUgdGhlIHNjaGVkX3NldHNjaGVkdWxlcigpIGNhbGwKKyAqLworI2RlZmluZSBIQVZFX1NDSEVEX1NFVFNDSEVEVUxFUgorCisvKgorICogQWRkIGFueSBleHRyYSBwbGF0Zm9ybS1zcGVjaWZpYyBkZWZpbmVzIGhlcmUuCisgKi8KKworLyoKKyAqIERlZmluZSBpZiB3ZSBoYXZlIDxtYWxsb2MuaD4gaGVhZGVyCisgKi8KKyNkZWZpbmUgSEFWRV9NQUxMT0NfSAorCisvKgorICogRGVmaW5lIGlmIHdlIGhhdmUgTGludXgtc3R5bGUgbm9uLWZpbGVzeXN0ZW0gVW5peCBEb21haW4gU29ja2V0cworICovCisKKy8qCisgKiBXaGF0IENQVSBhcmNoaXRlY3R1cmUgZG9lcyB0aGlzIHBsYXRmb3JtIHVzZT8KKyAqLworI2RlZmluZSBBUkNIX1BQQworCisKKy8qCisgKiBEZWZpbmUgaWYgd2UgaGF2ZSBMaW51eCdzIGlub3RpZnkgaW4gPHN5cy9pbm90aWZ5Lmg+LgorICovCisvKiNkZWZpbmUgSEFWRV9JTk9USUZZIDEqLworCisvKgorICogRGVmaW5lIGlmIHdlIGhhdmUgbWFkdmlzZSgpIGluIDxzeXMvbW1hbi5oPgorICovCisjZGVmaW5lIEhBVkVfTUFEVklTRSAxCisKKy8qCisgKiBEZWZpbmUgaWYgdG0gc3RydWN0IGhhcyB0bV9nbXRvZmYgZmllbGQKKyAqLworI2RlZmluZSBIQVZFX1RNX0dNVE9GRiAxCisKKy8qCisgKiBEZWZpbmUgaWYgZGlyZW50IHN0cnVjdCBoYXMgZF90eXBlIGZpZWxkCisgKi8KKyNkZWZpbmUgSEFWRV9ESVJFTlRfRF9UWVBFIDEKKworLyoKKyAqIERlZmluZSBpZiBsaWJjIGluY2x1ZGVzIEFuZHJvaWQgc3lzdGVtIHByb3BlcnRpZXMgaW1wbGVtZW50YXRpb24uCisgKi8KKy8qICNkZWZpbmUgSEFWRV9MSUJDX1NZU1RFTV9QUk9QRVJUSUVTICovCisKKy8qCisgKiBEZWZpbmUgaWYgc3lzdGVtIHByb3ZpZGVzIGEgc3lzdGVtIHByb3BlcnR5IHNlcnZlciAoc2hvdWxkIGJlCisgKiBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBIQVZFX0xJQkNfU1lTVEVNX1BST1BFUlRJRVMpLgorICovCisjZGVmaW5lIEhBVkVfU1lTVEVNX1BST1BFUlRZX1NFUlZFUgorCisvKgorICogc3ByaW50ZigpIGZvcm1hdCBzdHJpbmcgZm9yIHNoYXJlZCBsaWJyYXJ5IG5hbWluZy4KKyAqLworI2RlZmluZSBPU19TSEFSRURfTElCX0ZPUk1BVF9TVFIgICAgImxpYiVzLnNvIgorCisvKgorICogdHlwZSBmb3IgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIG1pbmNvcmUoKS4KKyAqLworI2RlZmluZSBNSU5DT1JFX1BPSU5URVJfVFlQRSB1bnNpZ25lZCBjaGFyICoKKworLyoKKyAqIERvIHdlIGhhdmUgdGhlIHNpZ2FjdGlvbiBmbGFnIFNBX05PQ0xEV0FJVD8KKyAqLworI2RlZmluZSBIQVZFX1NBX05PQ0xEV0FJVAorCisvKgorICogVGhlIGRlZmF1bHQgcGF0aCBzZXBhcmF0b3IgZm9yIHRoZSBwbGF0Zm9ybQorICovCisjZGVmaW5lIE9TX1BBVEhfU0VQQVJBVE9SICcvJworCisvKgorICogSXMgdGhlIGZpbGVzeXN0ZW0gY2FzZSBzZW5zaXRpdmU/CisgKi8KKyNkZWZpbmUgT1NfQ0FTRV9TRU5TSVRJVkUKKworLyoKKyAqIERlZmluZSBpZiA8c3lzL3NvY2tldC5oPiBleGlzdHMuCisgKi8KKyNkZWZpbmUgSEFWRV9TWVNfU09DS0VUX0ggMQorCisvKgorICogRGVmaW5lIGlmIHRoZSBzdHJsY3B5KCkgZnVuY3Rpb24gZXhpc3RzIG9uIHRoZSBzeXN0ZW0uCisgKi8KKy8qICNkZWZpbmUgSEFWRV9TVFJMQ1BZIDEgKi8KKworLyoKKyAqIERlZmluZSBpZiB0aGUgb3Blbl9tZW1zdHJlYW0oKSBmdW5jdGlvbiBleGlzdHMgb24gdGhlIHN5c3RlbS4KKyAqLworI2RlZmluZSBIQVZFX09QRU5fTUVNU1RSRUFNIDEKKworLyoKKyAqIERlZmluZSBpZiB0aGUgQlNEIGZ1bm9wZW4oKSBmdW5jdGlvbiBleGlzdHMgb24gdGhlIHN5c3RlbS4KKyAqLworLyogI2RlZmluZSBIQVZFX0ZVTk9QRU4gMSAqLworCisvKgorICogRGVmaW5lIGlmIHByY3RsKCkgZXhpc3RzCisgKi8KKyNkZWZpbmUgSEFWRV9QUkNUTCAxCisKKy8qCisgKiBEZWZpbmUgaWYgd3JpdGV2KCkgZXhpc3RzCisgKi8KKyNkZWZpbmUgSEFWRV9XUklURVYgMQorCisvKgorICogRGVmaW5lIGlmIDxzdGRpbnQuaD4gZXhpc3RzLgorICovCisjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorCisvKgorICogRGVmaW5lIGlmIDxzdGRib29sLmg+IGV4aXN0cy4KKyAqLworI2RlZmluZSBIQVZFX1NUREJPT0xfSCAxCisKKy8qCisgKiBEZWZpbmUgaWYgPHNjaGVkLmg+IGV4aXN0cy4KKyAqLworI2RlZmluZSBIQVZFX1NDSEVEX0ggMQorCisvKgorICogRGVmaW5lIGlmIHByZWFkKCkgZXhpc3RzCisgKi8KKyNkZWZpbmUgSEFWRV9QUkVBRCAxCisKKy8qCisgKiBXZSBuZWVkIHRvIG9wZW4gYmluYXJ5IGZpbGVzIHVzaW5nIE9fQklOQVJZIG9uIFdpbmRvd3MuCisgKiBNb3N0IHN5c3RlbXMgbGFjayAoYW5kIGFjdHVhbGx5IGRvbid0IG5lZWQpIHRoaXMgZmxhZy4KKyAqLworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKworI2VuZGlmIC8qX0FORFJPSURfQ09ORklHX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcmNoL2xpbnV4LXNoL0FuZHJvaWRDb25maWcuaCBiL2luY2x1ZGUvYXJjaC9saW51eC1zaC9BbmRyb2lkQ29uZmlnLmgKaW5kZXggMGRkN2IzYi4uNjIyY2E1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hcmNoL2xpbnV4LXNoL0FuZHJvaWRDb25maWcuaAorKysgYi9pbmNsdWRlL2FyY2gvbGludXgtc2gvQW5kcm9pZENvbmZpZy5oCkBAIC0zNjEsNCArMzYxLDEyIEBACiAgKi8KICNkZWZpbmUgSEFWRV9QUklOVEZfWkQgMQogCisvKgorICogV2UgbmVlZCB0byBvcGVuIGJpbmFyeSBmaWxlcyB1c2luZyBPX0JJTkFSWSBvbiBXaW5kb3dzLgorICogTW9zdCBzeXN0ZW1zIGxhY2sgKGFuZCBhY3R1YWxseSBkb24ndCBuZWVkKSB0aGlzIGZsYWcuCisgKi8KKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmCisKICNlbmRpZiAvKiBfQU5EUk9JRF9DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcmNoL2xpbnV4LXg4Ni9BbmRyb2lkQ29uZmlnLmggYi9pbmNsdWRlL2FyY2gvbGludXgteDg2L0FuZHJvaWRDb25maWcuaAppbmRleCAyNGY2Y2NjLi4yNmRjZjFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FyY2gvbGludXgteDg2L0FuZHJvaWRDb25maWcuaAorKysgYi9pbmNsdWRlL2FyY2gvbGludXgteDg2L0FuZHJvaWRDb25maWcuaApAQCAtMzI4LDQgKzMyOCwxMiBAQAogICovCiAjZGVmaW5lIEhBVkVfUFJJTlRGX1pEIDEKIAorLyoKKyAqIFdlIG5lZWQgdG8gb3BlbiBiaW5hcnkgZmlsZXMgdXNpbmcgT19CSU5BUlkgb24gV2luZG93cy4KKyAqIE1vc3Qgc3lzdGVtcyBsYWNrIChhbmQgYWN0dWFsbHkgZG9uJ3QgbmVlZCkgdGhpcyBmbGFnLgorICovCisjaWZuZGVmIE9fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCiAjZW5kaWYgLypfQU5EUk9JRF9DT05GSUdfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FyY2gvdGFyZ2V0X2xpbnV4LXg4Ni9BbmRyb2lkQ29uZmlnLmggYi9pbmNsdWRlL2FyY2gvdGFyZ2V0X2xpbnV4LXg4Ni9BbmRyb2lkQ29uZmlnLmgKaW5kZXggNjE3ZTdmYS4uOWIzNTdkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hcmNoL3RhcmdldF9saW51eC14ODYvQW5kcm9pZENvbmZpZy5oCisrKyBiL2luY2x1ZGUvYXJjaC90YXJnZXRfbGludXgteDg2L0FuZHJvaWRDb25maWcuaApAQCAtMjI3LDcgKzIyNyw3IEBACiAvKgogICogRGVmaW5lIGlmIHdlIGhhdmUgTGludXgncyBkYnVzIAogICovCi0jZGVmaW5lIEhBVkVfREJVUyAxCisvKiAjZGVmaW5lIEhBVkVfREJVUyAxICovCiAKIC8qCiAgKiBEZWZpbmUgaWYgdG0gc3RydWN0IGhhcyB0bV9nbXRvZmYgZmllbGQKQEAgLTM0NSw0ICszNDUsMTIgQEAKICAqLwogI2RlZmluZSBIQVZFX1BSSU5URl9aRCAxCiAKKy8qCisgKiBXZSBuZWVkIHRvIG9wZW4gYmluYXJ5IGZpbGVzIHVzaW5nIE9fQklOQVJZIG9uIFdpbmRvd3MuCisgKiBNb3N0IHN5c3RlbXMgbGFjayAoYW5kIGFjdHVhbGx5IGRvbid0IG5lZWQpIHRoaXMgZmxhZy4KKyAqLworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKwogI2VuZGlmIC8qIF9BTkRST0lEX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FyY2gvd2luZG93cy9BbmRyb2lkQ29uZmlnLmggYi9pbmNsdWRlL2FyY2gvd2luZG93cy9BbmRyb2lkQ29uZmlnLmgKaW5kZXggZjBiZjU2Zi4uMTdjODRjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hcmNoL3dpbmRvd3MvQW5kcm9pZENvbmZpZy5oCisrKyBiL2luY2x1ZGUvYXJjaC93aW5kb3dzL0FuZHJvaWRDb25maWcuaApAQCAtMzMzLDQgKzMzMywxMCBAQAogICovCiAvKiAjZGVmaW5lIEhBVkVfUFJJTlRGX1pEIDEgKi8KIAorLyoKKyAqIFdlIG5lZWQgdG8gb3BlbiBiaW5hcnkgZmlsZXMgdXNpbmcgT19CSU5BUlkgb24gV2luZG93cy4KKyAqIFdlIGRvbid0IGRlZmluZSBpdCBvbiBXaW5kb3dzIHNpbmNlIGl0IGlzIHBhcnQgb2YgdGhlIGlvIGhlYWRlcnMuCisgKi8KKy8qICNkZWZpbmUgT19CSU5BUlkgMCAqLworCiAjZW5kaWYgLypfQU5EUk9JRF9DT05GSUdfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2N1dGlscy9sb2cuaCBiL2luY2x1ZGUvY3V0aWxzL2xvZy5oCmluZGV4IGRkNDdjMzUuLmY2MDIwMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY3V0aWxzL2xvZy5oCisrKyBiL2luY2x1ZGUvY3V0aWxzL2xvZy5oCkBAIC0yOTEsMTEgKzI5MSwxMSBAQAogICovCiAjZGVmaW5lIExPR19BTFdBWVNfRkFUQUxfSUYoY29uZCwgLi4uKSBcCiAgICAgKCAoQ09ORElUSU9OKGNvbmQpKSBcCi0gICAgPyAoKHZvaWQpYW5kcm9pZF9wcmludEFzc2VydCgjY29uZCwgTE9HX1RBRywgX19WQV9BUkdTX18pKSBcCisgICAgPyAoKHZvaWQpYW5kcm9pZF9wcmludEFzc2VydCgjY29uZCwgTE9HX1RBRywgIyMgX19WQV9BUkdTX18pKSBcCiAgICAgOiAodm9pZCkwICkKIAogI2RlZmluZSBMT0dfQUxXQVlTX0ZBVEFMKC4uLikgXAotICAgICggKCh2b2lkKWFuZHJvaWRfcHJpbnRBc3NlcnQoTlVMTCwgTE9HX1RBRywgX19WQV9BUkdTX18pKSApCisgICAgKCAoKHZvaWQpYW5kcm9pZF9wcmludEFzc2VydChOVUxMLCBMT0dfVEFHLCAjIyBfX1ZBX0FSR1NfXykpICkKIAogLyoKICAqIFZlcnNpb25zIG9mIExPR19BTFdBWVNfRkFUQUxfSUYgYW5kIExPR19BTFdBWVNfRkFUQUwgdGhhdApAQCAtMzA4LDcgKzMwOCw3IEBACiAKICNlbHNlCiAKLSNkZWZpbmUgTE9HX0ZBVEFMX0lGKGNvbmQsIC4uLikgTE9HX0FMV0FZU19GQVRBTF9JRihjb25kLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTE9HX0ZBVEFMX0lGKGNvbmQsIC4uLikgTE9HX0FMV0FZU19GQVRBTF9JRihjb25kLCAjIyBfX1ZBX0FSR1NfXykKICNkZWZpbmUgTE9HX0ZBVEFMKC4uLikgTE9HX0FMV0FZU19GQVRBTChfX1ZBX0FSR1NfXykKIAogI2VuZGlmCkBAIC0zMTcsNyArMzE3LDcgQEAKICAqIEFzc2VydGlvbiB0aGF0IGdlbmVyYXRlcyBhIGxvZyBtZXNzYWdlIHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4KICAqIFN0cmlwcGVkIG91dCBvZiByZWxlYXNlIGJ1aWxkcy4gIFVzZXMgdGhlIGN1cnJlbnQgTE9HX1RBRy4KICAqLwotI2RlZmluZSBMT0dfQVNTRVJUKGNvbmQsIC4uLikgTE9HX0ZBVEFMX0lGKCEoY29uZCksIF9fVkFfQVJHU19fKQorI2RlZmluZSBMT0dfQVNTRVJUKGNvbmQsIC4uLikgTE9HX0ZBVEFMX0lGKCEoY29uZCksICMjIF9fVkFfQVJHU19fKQogLy8jZGVmaW5lIExPR19BU1NFUlQoY29uZCkgTE9HX0ZBVEFMX0lGKCEoY29uZCksICJBc3NlcnRpb24gZmFpbGVkOiAiICNjb25kKQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQwMyw4ICs0MDMsMjQgQEAKICNkZWZpbmUgYW5kcm9pZF92cHJpbnRMb2cocHJpbywgY29uZCwgdGFnLCBmbXQuLi4pIFwKICAgICBfX2FuZHJvaWRfbG9nX3ZwcmludChwcmlvLCB0YWcsIGZtdCkKIAorLyogWFhYIE1hY3JvcyB0byB3b3JrIGFyb3VuZCBzeW50YXggZXJyb3JzIGluIHBsYWNlcyB3aGVyZSBmb3JtYXQgc3RyaW5nCisgKiBhcmcgaXMgbm90IHBhc3NlZCB0byBMT0dfQVNTRVJULCBMT0dfQUxXQVlTX0ZBVEFMIG9yIExPR19BTFdBWVNfRkFUQUxfSUYKKyAqIChoYXBwZW5zIG9ubHkgaW4gZGVidWcgYnVpbGRzKS4KKyAqLworCisvKiBSZXR1cm5zIDJuZCBhcmcuICBVc2VkIHRvIHN1YnN0aXR1dGUgZGVmYXVsdCB2YWx1ZSBpZiBjYWxsZXIncyB2YXJhcmcgbGlzdAorICogaXMgZW1wdHkuCisgKi8KKyNkZWZpbmUgX19hbmRyb2lkX3NlY29uZChkdW1teSwgc2Vjb25kLCAuLi4pICAgICBzZWNvbmQKKworLyogSWYgcGFzc2VkIG11bHRpcGxlIGFyZ3MsIHJldHVybnMgJywnIGZvbGxvd2VkIGJ5IGFsbCBidXQgMXN0IGFyZywgb3RoZXJ3aXNlCisgKiByZXR1cm5zIG5vdGhpbmcuCisgKi8KKyNkZWZpbmUgX19hbmRyb2lkX3Jlc3QoZmlyc3QsIC4uLikgICAgICAgICAgICAgICAsICMjIF9fVkFfQVJHU19fCisKICNkZWZpbmUgYW5kcm9pZF9wcmludEFzc2VydChjb25kLCB0YWcsIGZtdC4uLikgXAotICAgIF9fYW5kcm9pZF9sb2dfYXNzZXJ0KGNvbmQsIHRhZywgZm10KQorICAgIF9fYW5kcm9pZF9sb2dfYXNzZXJ0KGNvbmQsIHRhZywgXAorICAgICAgICBfX2FuZHJvaWRfc2Vjb25kKDAsICMjIGZtdCwgTlVMTCkgX19hbmRyb2lkX3Jlc3QoZm10KSkKIAogI2RlZmluZSBhbmRyb2lkX3dyaXRlTG9nKHByaW8sIHRhZywgdGV4dCkgXAogICAgIF9fYW5kcm9pZF9sb2dfd3JpdGUocHJpbywgdGFnLCB0ZXh0KQpAQCAtNDEzLDcgKzQyOSw3IEBACiAgICAgX19hbmRyb2lkX2xvZ19id3JpdGUodGFnLCBwYXlsb2FkLCBsZW4pCiAjZGVmaW5lIGFuZHJvaWRfYnRXcml0ZUxvZyh0YWcsIHR5cGUsIHBheWxvYWQsIGxlbikgXAogICAgIF9fYW5kcm9pZF9sb2dfYnR3cml0ZSh0YWcsIHR5cGUsIHBheWxvYWQsIGxlbikKLQkKKwogLy8gVE9ETzogcmVtb3ZlIHRoZXNlIHByb3RvdHlwZXMgYW5kIHRoZWlyIHVzZXJzCiAjZGVmaW5lIGFuZHJvaWRfdGVzdExvZyhwcmlvLCB0YWcpICgxKQogI2RlZmluZSBhbmRyb2lkX3dyaXRldkxvZyh2ZWMsbnVtKSBkb3t9d2hpbGUoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0dXRpbHMvZGhjcC5oIGIvaW5jbHVkZS9uZXR1dGlscy9kaGNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3OThjNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0dXRpbHMvZGhjcC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTkVUVVRJTFNfREhDUF9IXworI2RlZmluZSBfTkVUVVRJTFNfREhDUF9IXworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCBkb19kaGNwKGNoYXIgKmluYW1lKTsKK2V4dGVybiBpbnQgZGhjcF9kb19yZXF1ZXN0KGNvbnN0IGNoYXIgKmlmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICppcGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqZ2F0ZXdheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICptYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKmRuczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqZG5zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAqbGVhc2UpOworZXh0ZXJuIGludCBkaGNwX3N0b3AoY29uc3QgY2hhciAqaWZuYW1lKTsKK2V4dGVybiBpbnQgZGhjcF9yZWxlYXNlX2xlYXNlKGNvbnN0IGNoYXIgKmlmbmFtZSk7CitleHRlcm4gY2hhciAqZGhjcF9nZXRfZXJybXNnKCk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfTkVUVVRJTFNfREhDUF9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXR1dGlscy9pZmMuaCBiL2luY2x1ZGUvbmV0dXRpbHMvaWZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0NTI2MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0dXRpbHMvaWZjLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9ORVRVVElMU19JRkNfSF8KKyNkZWZpbmUgX05FVFVUSUxTX0lGQ19IXworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCBpZmNfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGlmY19jbG9zZSh2b2lkKTsKKworZXh0ZXJuIGludCBpZmNfZ2V0X2lmaW5kZXgoY29uc3QgY2hhciAqbmFtZSwgaW50ICppZl9pbmRleHApOworZXh0ZXJuIGludCBpZmNfZ2V0X2h3YWRkcihjb25zdCBjaGFyICpuYW1lLCB2b2lkICpwdHIpOworCitleHRlcm4gaW50IGlmY191cChjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiBpbnQgaWZjX2Rvd24oY29uc3QgY2hhciAqbmFtZSk7CisKK2V4dGVybiBpbnQgaWZjX2VuYWJsZShjb25zdCBjaGFyICppZm5hbWUpOworZXh0ZXJuIGludCBpZmNfZGlzYWJsZShjb25zdCBjaGFyICppZm5hbWUpOworCitleHRlcm4gaW50IGlmY19yZXNldF9jb25uZWN0aW9ucyhjb25zdCBjaGFyICppZm5hbWUpOworCitleHRlcm4gaW50IGlmY19zZXRfYWRkcihjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgYWRkcik7CitleHRlcm4gaW50IGlmY19zZXRfbWFzayhjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgbWFzayk7CitleHRlcm4gaW50IGlmY19zZXRfaHdhZGRyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnB0cik7CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVXNlIGlmY19hZGRfcm91dGUgaW5zdGVhZC4gKi8KK2V4dGVybiBpbnQgaWZjX2FkZF9ob3N0X3JvdXRlKGNvbnN0IGNoYXIgKm5hbWUsIGluX2FkZHJfdCBhZGRyKTsKK2V4dGVybiBpbnQgaWZjX3JlbW92ZV9ob3N0X3JvdXRlcyhjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiBpbnQgaWZjX2dldF9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSk7CisvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSBpZmNfYWRkX3JvdXRlIGluc3RlYWQgKi8KK2V4dGVybiBpbnQgaWZjX3NldF9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSwgaW5fYWRkcl90IGdhdGV3YXkpOworLyogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiBVc2UgaWZjX2FkZF9yb3V0ZSBpbnN0ZWFkICovCitleHRlcm4gaW50IGlmY19jcmVhdGVfZGVmYXVsdF9yb3V0ZShjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgYWRkcik7CitleHRlcm4gaW50IGlmY19yZW1vdmVfZGVmYXVsdF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUpOworZXh0ZXJuIGludCBpZmNfYWRkX3JvdXRlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmFkZHIsIGludCBwcmVmaXhfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmd3KTsKKworZXh0ZXJuIGludCBpZmNfZ2V0X2luZm8oY29uc3QgY2hhciAqbmFtZSwgaW5fYWRkcl90ICphZGRyLCBpbl9hZGRyX3QgKm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKmZsYWdzKTsKKworZXh0ZXJuIGludCBpZmNfY29uZmlndXJlKGNvbnN0IGNoYXIgKmlmbmFtZSwgaW5fYWRkcl90IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90IG5ldG1hc2ssIGluX2FkZHJfdCBnYXRld2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCBkbnMxLCBpbl9hZGRyX3QgZG5zMik7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfTkVUVVRJTFNfSUZDX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BpeGVsZmxpbmdlci9waXhlbGZsaW5nZXIuaCBiL2luY2x1ZGUvcGl4ZWxmbGluZ2VyL3BpeGVsZmxpbmdlci5oCmluZGV4IGRjYTBiOTAuLjhhMmI0NDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGl4ZWxmbGluZ2VyL3BpeGVsZmxpbmdlci5oCisrKyBiL2luY2x1ZGUvcGl4ZWxmbGluZ2VyL3BpeGVsZmxpbmdlci5oCkBAIC0zMTUsNyArMzE1LDcgQEAKIHNzaXplX3QgZ2dsSW5pdChHR0xDb250ZXh0KiogY29udGV4dCk7CiBzc2l6ZV90IGdnbFVuaW5pdChHR0xDb250ZXh0KiBjb250ZXh0KTsKIAotR0dMaW50IGdnbEJpdEJsdGkoCitHR0xpbnQgZ2dsQml0QmxpdCgKICAgICAgICAgR0dMQ29udGV4dCogYywKICAgICAgICAgaW50IHRtdSwKICAgICAgICAgR0dMaW50IGNyb3BbNF0sCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oIGIvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaAppbmRleCA4NDhiMTAwLi40ZDE5ZjE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmgKQEAgLTUyLDYgKzUyLDggQEAKICNkZWZpbmUgQUlEX1ZQTiAgICAgICAgICAgMTAxNiAgLyogdnBuIHN5c3RlbSAqLwogI2RlZmluZSBBSURfS0VZU1RPUkUgICAgICAxMDE3ICAvKiBrZXlzdG9yZSBzdWJzeXN0ZW0gKi8KICNkZWZpbmUgQUlEX1VTQiAgICAgICAgICAgMTAxOCAgLyogVVNCIGRldmljZXMgKi8KKyNkZWZpbmUgQUlEX0RSTSAgICAgICAgICAgMTAxOSAgLyogRFJNIHNlcnZlciAqLworI2RlZmluZSBBSURfRFJNSU8gICAgICAgICAxMDIwICAvKiBEUk0gSU8gc2VydmVyICovCiAjZGVmaW5lIEFJRF9HUFMgICAgICAgICAgIDEwMjEgIC8qIEdQUyBkYWVtb24gKi8KICNkZWZpbmUgQUlEX1VOVVNFRDEgICAgICAgMTAyMiAgLyogZGVwcmVjYXRlZCwgRE8gTk9UIFVTRSAqLwogI2RlZmluZSBBSURfUkZVMSAgICAgICAgICAxMDIzICAvKiBSRlUgKi8KQEAgLTk4LDYgKzEwMCw4IEBACiAgICAgeyAiYWRiIiwgICAgICAgQUlEX0FEQiwgfSwKICAgICB7ICJpbnN0YWxsIiwgICBBSURfSU5TVEFMTCwgfSwKICAgICB7ICJtZWRpYSIsICAgICBBSURfTUVESUEsIH0sCisgICAgeyAiZHJtIiwgICAgICAgQUlEX0RSTSwgfSwKKyAgICB7ICJkcm1pbyIsICAgICBBSURfRFJNSU8sIH0sCiAgICAgeyAibmZjIiwgICAgICAgQUlEX05GQywgfSwKICAgICB7ICJzaGVsbCIsICAgICBBSURfU0hFTEwsIH0sCiAgICAgeyAiY2FjaGUiLCAgICAgQUlEX0NBQ0hFLCB9LApAQCAtMTczLDYgKzE3Nyw3IEBACiAgICAgeyAwMDY0MCwgQUlEX1NZU1RFTSwgICAgQUlEX1NZU1RFTSwgICAgInN5c3RlbS9ldGMvYmx1ZXRvb3RoL2F1dG9fcGFpcmluZy5jb25mIiB9LAogICAgIHsgMDA0NDQsIEFJRF9SQURJTywgICAgIEFJRF9BVURJTywgICAgICJzeXN0ZW0vZXRjL0F1ZGlvUGFyYTQuY3N2IiB9LAogICAgIHsgMDA1NTUsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgICJzeXN0ZW0vZXRjL3BwcC8qIiB9LAorICAgIHsgMDA1NTUsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgICJzeXN0ZW0vZXRjL3JjLioiIH0sCiAgICAgeyAwMDY0NCwgQUlEX1NZU1RFTSwgICAgQUlEX1NZU1RFTSwgICAgImRhdGEvYXBwLyoiIH0sCiAgICAgeyAwMDY0NCwgQUlEX1NZU1RFTSwgICAgQUlEX1NZU1RFTSwgICAgImRhdGEvYXBwLXByaXZhdGUvKiIgfSwKICAgICB7IDAwNjQ0LCBBSURfQVBQLCAgICAgICBBSURfQVBQLCAgICAgICAiZGF0YS9kYXRhLyoiIH0sCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5c3V0aWxzL1NvY2tldENsaWVudC5oIGIvaW5jbHVkZS9zeXN1dGlscy9Tb2NrZXRDbGllbnQuaAppbmRleCBlN2ZiMTc3Li5kNmJiN2Q1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N5c3V0aWxzL1NvY2tldENsaWVudC5oCisrKyBiL2luY2x1ZGUvc3lzdXRpbHMvU29ja2V0Q2xpZW50LmgKQEAgLTE5LDYgKzE5LDEwIEBACiAgICAgLyogUGVlciBncm91cCBJRCAqLwogICAgIGdpZF90IG1HaWQ7CiAKKyAgICAvKiBSZWZlcmVuY2UgY291bnQgKHN0YXJ0cyBhdCAxKSAqLworICAgIHB0aHJlYWRfbXV0ZXhfdCBtUmVmQ291bnRNdXRleDsKKyAgICBpbnQgbVJlZkNvdW50OworCiBwdWJsaWM6CiAgICAgU29ja2V0Q2xpZW50KGludCBzb2NrKTsKICAgICB2aXJ0dWFsIH5Tb2NrZXRDbGllbnQoKSB7fQpAQCAtMjgsOCArMzIsMTkgQEAKICAgICB1aWRfdCBnZXRVaWQoKSBjb25zdCB7IHJldHVybiBtVWlkOyB9CiAgICAgZ2lkX3QgZ2V0R2lkKCkgY29uc3QgeyByZXR1cm4gbUdpZDsgfQogCisgICAgLy8gU2VuZCBudWxsLXRlcm1pbmF0ZWQgQyBzdHJpbmdzOgogICAgIGludCBzZW5kTXNnKGludCBjb2RlLCBjb25zdCBjaGFyICptc2csIGJvb2wgYWRkRXJybm8pOwogICAgIGludCBzZW5kTXNnKGNvbnN0IGNoYXIgKm1zZyk7CisKKyAgICAvLyBTZW5kaW5nIGJpbmFyeSBkYXRhOgorICAgIGludCBzZW5kRGF0YShjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKKworICAgIC8vIE9wdGlvbmFsIHJlZmVyZW5jZSBjb3VudGluZy4gIFJlZmVyZW5jZSBjb3VudCBzdGFydHMgYXQgMS4gIElmCisgICAgLy8gaXQncyBkZWNyZW1lbnRlZCB0byAwLCBpdCBkZWxldGVzIGl0c2VsZi4KKyAgICAvLyBTb2NrZXRMaXN0ZW5lciBjcmVhdGVzIGEgU29ja2V0Q2xpZW50IChhdCByZWZjb3VudCAxKSBhbmQgY2FsbHMKKyAgICAvLyBkZWNSZWYoKSB3aGVuIGl0J3MgZG9uZSB3aXRoIHRoZSBjbGllbnQuCisgICAgdm9pZCBpbmNSZWYoKTsKKyAgICBib29sIGRlY1JlZigpOyAvLyByZXR1cm5zIHRydWUgYXQgMCAoYnV0IG5vdGU6IFNvY2tldENsaWVudCBhbHJlYWR5IGRlbGV0ZWQpCiB9OwogCiB0eXBlZGVmIGFuZHJvaWQ6Okxpc3Q8U29ja2V0Q2xpZW50ICo+IFNvY2tldENsaWVudENvbGxlY3Rpb247CmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5c3V0aWxzL1NvY2tldExpc3RlbmVyLmggYi9pbmNsdWRlL3N5c3V0aWxzL1NvY2tldExpc3RlbmVyLmgKaW5kZXggYzdlZGZlYi4uNjU5MmIwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zeXN1dGlscy9Tb2NrZXRMaXN0ZW5lci5oCisrKyBiL2luY2x1ZGUvc3lzdXRpbHMvU29ja2V0TGlzdGVuZXIuaApAQCAtMzAsNyArMzAsNyBAQAogICAgIHB0aHJlYWRfdCAgICAgICAgICAgICAgIG1UaHJlYWQ7CiAKIHB1YmxpYzoKLSAgICBTb2NrZXRMaXN0ZW5lcihjb25zdCBjaGFyICpzb2NrZXROYW1lcywgYm9vbCBsaXN0ZW4pOworICAgIFNvY2tldExpc3RlbmVyKGNvbnN0IGNoYXIgKnNvY2tldE5hbWUsIGJvb2wgbGlzdGVuKTsKICAgICBTb2NrZXRMaXN0ZW5lcihpbnQgc29ja2V0RmQsIGJvb2wgbGlzdGVuKTsKIAogICAgIHZpcnR1YWwgflNvY2tldExpc3RlbmVyKCk7CmRpZmYgLS1naXQgYS9pbml0L2luaXRfcGFyc2VyLmMgYi9pbml0L2luaXRfcGFyc2VyLmMKaW5kZXggZDEzNmMyOC4uZmFmZDczMiAxMDA2NDQKLS0tIGEvaW5pdC9pbml0X3BhcnNlci5jCisrKyBiL2luaXQvaW5pdF9wYXJzZXIuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAKICAgICBuYXJncyA9IDA7CiAgICAgc3RhdGUuZmlsZW5hbWUgPSBmbjsKLSAgICBzdGF0ZS5saW5lID0gMTsKKyAgICBzdGF0ZS5saW5lID0gMDsKICAgICBzdGF0ZS5wdHIgPSBzOwogICAgIHN0YXRlLm5leHR0b2tlbiA9IDA7CiAgICAgc3RhdGUucGFyc2VfbGluZSA9IHBhcnNlX2xpbmVfbm9fb3A7CkBAIC0xOTcsNiArMTk3LDcgQEAKICAgICAgICAgICAgIHN0YXRlLnBhcnNlX2xpbmUoJnN0YXRlLCAwLCAwKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgY2FzZSBUX05FV0xJTkU6CisgICAgICAgICAgICBzdGF0ZS5saW5lKys7CiAgICAgICAgICAgICBpZiAobmFyZ3MpIHsKICAgICAgICAgICAgICAgICBpbnQga3cgPSBsb29rdXBfa2V5d29yZChhcmdzWzBdKTsKICAgICAgICAgICAgICAgICBpZiAoa3dfaXMoa3csIFNFQ1RJT04pKSB7CmRpZmYgLS1naXQgYS9pbml0L3BhcnNlci5jIGIvaW5pdC9wYXJzZXIuYwppbmRleCAyZjM2YWM3Li4zYzJlYzAwIDEwMDY0NAotLS0gYS9pbml0L3BhcnNlci5jCisrKyBiL2luaXQvcGFyc2VyLmMKQEAgLTgzLDcgKzgzLDYgQEAKICAgICAgICAgICAgIHN0YXRlLT5wdHIgPSB4OwogICAgICAgICAgICAgcmV0dXJuIFRfRU9GOwogICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICBzdGF0ZS0+bGluZSsrOwogICAgICAgICAgICAgeCsrOwogICAgICAgICAgICAgc3RhdGUtPnB0ciA9IHg7CiAgICAgICAgICAgICByZXR1cm4gVF9ORVdMSU5FOwpAQCAtOTQsOSArOTMsMTMgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBjYXNlICcjJzoKICAgICAgICAgICAgIHdoaWxlICgqeCAmJiAoKnggIT0gJ1xuJykpIHgrKzsKLSAgICAgICAgICAgIHN0YXRlLT5saW5lKys7Ci0gICAgICAgICAgICBzdGF0ZS0+cHRyID0geDsKLSAgICAgICAgICAgIHJldHVybiBUX05FV0xJTkU7CisgICAgICAgICAgICBpZiAoKnggPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIHN0YXRlLT5wdHIgPSB4KzE7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRfTkVXTElORTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPnB0ciA9IHg7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRfRU9GOworICAgICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgZ290byB0ZXh0OwogICAgICAgICB9CmRpZmYgLS1naXQgYS9pbml0L3V0aWwuYyBiL2luaXQvdXRpbC5jCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMzc3NzU0Yi4uZDhlYzg4ZQotLS0gYS9pbml0L3V0aWwuYworKysgYi9pbml0L3V0aWwuYwpAQCAtNDM5LDggKzQzOSw5IEBACiAgICAgICAgIGlmICh4KSB7CiAgICAgICAgICAgICB4ICs9IDI7CiAgICAgICAgICAgICBuID0gMDsKLSAgICAgICAgICAgIHdoaWxlICgqeCAmJiAhaXNzcGFjZSgqeCkpIHsKLSAgICAgICAgICAgICAgICBoYXJkd2FyZVtuKytdID0gdG9sb3dlcigqeCk7CisgICAgICAgICAgICB3aGlsZSAoKnggJiYgKnggIT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGlmICghaXNzcGFjZSgqeCkpCisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlW24rK10gPSB0b2xvd2VyKCp4KTsKICAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgICAgICAgaWYgKG4gPT0gMzEpIGJyZWFrOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL0FuZHJvaWQubWsgYi9saWJjdXRpbHMvQW5kcm9pZC5tawppbmRleCBlOGM3Nzc1Li4zZGMzZDY5IDEwMDY0NAotLS0gYS9saWJjdXRpbHMvQW5kcm9pZC5taworKysgYi9saWJjdXRpbHMvQW5kcm9pZC5tawpAQCAtMTEyLDEyICsxMTIsMTcgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNvbW1vblNvdXJjZXMpIGFzaG1lbS1kZXYuYyBtcS5jCiAKIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKLUxPQ0FMX1NSQ19GSUxFUyArPSBtZW1zZXQzMi5TCitMT0NBTF9TUkNfRklMRVMgKz0gYXJjaC1hcm0vbWVtc2V0MzIuUwogZWxzZSAgIyAhYXJtCiBpZmVxICgkKFRBUkdFVF9BUkNIKSxzaCkKIExPQ0FMX1NSQ19GSUxFUyArPSBtZW1vcnkuYyBhdG9taWMtYW5kcm9pZC1zaC5jCiBlbHNlICAjICFzaAoraWZlcSAoJChUQVJHRVRfQVJDSF9WQVJJQU5UKSx4ODYtYXRvbSkKK0xPQ0FMX0NGTEFHUyArPSAtREhBVkVfTUVNU0VUMTYgLURIQVZFX01FTVNFVDMyCitMT0NBTF9TUkNfRklMRVMgKz0gYXJjaC14ODYvYW5kcm9pZF9tZW1zZXQxNi5TIGFyY2gteDg2L2FuZHJvaWRfbWVtc2V0MzIuUyBtZW1vcnkuYworZWxzZSAjICF4ODYtYXRvbQogTE9DQUxfU1JDX0ZJTEVTICs9IG1lbW9yeS5jCitlbmRpZiAjICF4ODYtYXRvbQogZW5kaWYgIyAhc2gKIGVuZGlmICMgIWFybQogCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvbWVtc2V0MzIuUyBiL2xpYmN1dGlscy9hcmNoLWFybS9tZW1zZXQzMi5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJjdXRpbHMvbWVtc2V0MzIuUwpyZW5hbWUgdG8gbGliY3V0aWxzL2FyY2gtYXJtL21lbXNldDMyLlMKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9hcmNoLXg4Ni9hbmRyb2lkX21lbXNldDE2LlMgYi9saWJjdXRpbHMvYXJjaC14ODYvYW5kcm9pZF9tZW1zZXQxNi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjA5Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJjdXRpbHMvYXJjaC14ODYvYW5kcm9pZF9tZW1zZXQxNi5TCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoKKyAqIENvbnRyaWJ1dGVkIGJ5OiBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisKKyNpZiBkZWZpbmVkKFVTRV9TU0UyKQorCisjIGluY2x1ZGUgImNhY2hlX3dyYXBwZXIuUyIKKyMgdW5kZWYgX19pNjg2CisjIGRlZmluZSBVU0VfQVNfQU5EUk9JRAorIyBkZWZpbmUgc3NlMl9tZW1zZXQxNl9hdG9tIGFuZHJvaWRfbWVtc2V0MTYKKyMgaW5jbHVkZSAic3NlMi1tZW1zZXQxNi1hdG9tLlMiCisKKyNlbHNlCisKKyMgaW5jbHVkZSAibWVtc2V0MTYuUyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvYXJjaC14ODYvYW5kcm9pZF9tZW1zZXQzMi5TIGIvbGliY3V0aWxzL2FyY2gteDg2L2FuZHJvaWRfbWVtc2V0MzIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmIyZmZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliY3V0aWxzL2FyY2gteDg2L2FuZHJvaWRfbWVtc2V0MzIuUwpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qCisgKiBDb250cmlidXRlZCBieTogSW50ZWwgQ29ycG9yYXRpb24KKyAqLworCisjaWYgZGVmaW5lZChVU0VfU1NFMikKKworIyBpbmNsdWRlICJjYWNoZV93cmFwcGVyLlMiCisjIHVuZGVmIF9faTY4NgorIyBkZWZpbmUgVVNFX0FTX0FORFJPSUQKKyMgZGVmaW5lIHNzZTJfbWVtc2V0MzJfYXRvbSBhbmRyb2lkX21lbXNldDMyCisjIGluY2x1ZGUgInNzZTItbWVtc2V0MzItYXRvbS5TIgorCisjZWxzZQorCisjIGluY2x1ZGUgIm1lbXNldDMyLlMiCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvYXJjaC14ODYvY2FjaGVfd3JhcHBlci5TIGIvbGliY3V0aWxzL2FyY2gteDg2L2NhY2hlX3dyYXBwZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDhmZGQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliY3V0aWxzL2FyY2gteDg2L2NhY2hlX3dyYXBwZXIuUwpAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qCisgKiBDb250cmlidXRlZCBieTogSW50ZWwgQ29ycG9yYXRpb24KKyAqLworCisvKiBWYWx1ZXMgYXJlIG9wdGltaXplZCBmb3IgQXRvbSAqLworI2RlZmluZSBTSEFSRURfQ0FDSEVfU0laRSAgICAgICAoNTEyKjEwMjQpICAgICAgICAgICAgLyogQXRvbSBMMiBDYWNoZSAqLworI2RlZmluZSBEQVRBX0NBQ0hFX1NJWkUgICAgICAgICAoMjQqMTAyNCkgICAgICAgICAgICAgLyogQXRvbSBMMSBEYXRhIENhY2hlICovCisjZGVmaW5lIFNIQVJFRF9DQUNIRV9TSVpFX0hBTEYgIChTSEFSRURfQ0FDSEVfU0laRSAvIDIpCisjZGVmaW5lIERBVEFfQ0FDSEVfU0laRV9IQUxGICAgIChEQVRBX0NBQ0hFX1NJWkUgLyAyKQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2FyY2gteDg2L3NzZTItbWVtc2V0MTYtYXRvbS5TIGIvbGliY3V0aWxzL2FyY2gteDg2L3NzZTItbWVtc2V0MTYtYXRvbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZmVjODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJjdXRpbHMvYXJjaC14ODYvc3NlMi1tZW1zZXQxNi1hdG9tLlMKQEAgLTAsMCArMSw3MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoKKyAqIENvbnRyaWJ1dGVkIGJ5OiBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisKKyNpZm5kZWYgTAorIyBkZWZpbmUgTChsYWJlbCkJLkwjI2xhYmVsCisjZW5kaWYKKworI2lmbmRlZiBBTElHTgorIyBkZWZpbmUgQUxJR04obikJLnAyYWxpZ24gbgorI2VuZGlmCisKKyNpZm5kZWYgY2ZpX3N0YXJ0cHJvYworIyBkZWZpbmUgY2ZpX3N0YXJ0cHJvYwkJCS5jZmlfc3RhcnRwcm9jCisjZW5kaWYKKworI2lmbmRlZiBjZmlfZW5kcHJvYworIyBkZWZpbmUgY2ZpX2VuZHByb2MJCQkuY2ZpX2VuZHByb2MKKyNlbmRpZgorCisjaWZuZGVmIGNmaV9yZWxfb2Zmc2V0CisjIGRlZmluZSBjZmlfcmVsX29mZnNldChyZWcsIG9mZikJLmNmaV9yZWxfb2Zmc2V0IHJlZywgb2ZmCisjZW5kaWYKKworI2lmbmRlZiBjZmlfcmVzdG9yZQorIyBkZWZpbmUgY2ZpX3Jlc3RvcmUocmVnKQkJLmNmaV9yZXN0b3JlIHJlZworI2VuZGlmCisKKyNpZm5kZWYgY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CisjIGRlZmluZSBjZmlfYWRqdXN0X2NmYV9vZmZzZXQob2ZmKQkuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0IG9mZgorI2VuZGlmCisKKyNpZm5kZWYgRU5UUlkKKyMgZGVmaW5lIEVOVFJZKG5hbWUpCQkJXAorCS50eXBlIG5hbWUsICBAZnVuY3Rpb247IAlcCisJLmdsb2JsIG5hbWU7CQkJXAorCS5wMmFsaWduIDQ7CQkJXAorbmFtZToJCQkJCVwKKwljZmlfc3RhcnRwcm9jCisjZW5kaWYKKworI2lmbmRlZiBFTkQKKyMgZGVmaW5lIEVORChuYW1lKQkJCVwKKwljZmlfZW5kcHJvYzsJCQlcCisJLnNpemUgbmFtZSwgLi1uYW1lCisjZW5kaWYKKworI2RlZmluZSBDRklfUFVTSChSRUcpCQkJCQkJXAorICBjZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDQpOwkJCQkJXAorICBjZmlfcmVsX29mZnNldCAoUkVHLCAwKQorCisjZGVmaW5lIENGSV9QT1AoUkVHKQkJCQkJCVwKKyAgY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCk7CQkJCQlcCisgIGNmaV9yZXN0b3JlIChSRUcpCisKKyNkZWZpbmUgUFVTSChSRUcpCXB1c2hsIFJFRzsgQ0ZJX1BVU0ggKFJFRykKKyNkZWZpbmUgUE9QKFJFRykJcG9wbCBSRUc7IENGSV9QT1AgKFJFRykKKworI2lmZGVmIFVTRV9BU19CWkVSTzE2CisjIGRlZmluZSBERVNUCQlQQVJNUworIyBkZWZpbmUgTEVOCQlERVNUKzQKKyNlbHNlCisjIGRlZmluZSBERVNUCQlQQVJNUworIyBkZWZpbmUgQ0hSCQlERVNUKzQKKyMgZGVmaW5lIExFTgkJQ0hSKzQKKyNlbmRpZgorCisjaWYgMQorIyBkZWZpbmUgU0VUUlROVkFMCisjZWxzZQorIyBkZWZpbmUgU0VUUlROVkFMCW1vdmwgREVTVCglZXNwKSwgJWVheAorI2VuZGlmCisKKyNpZmRlZiBTSEFSRUQKKyMgZGVmaW5lIEVOVFJBTkNFCVBVU0ggKCVlYngpOworIyBkZWZpbmUgUkVUVVJOX0VORAlQT1AgKCVlYngpOyByZXQKKyMgZGVmaW5lIFJFVFVSTgkJUkVUVVJOX0VORDsgQ0ZJX1BVU0ggKCVlYngpCisjIGRlZmluZSBQQVJNUwkJOAkJLyogUHJlc2VydmUgRUJYLiAgKi8KKyMgZGVmaW5lIEpNUFRCTChJLCBCKQlJIC0gQgorCisvKiBMb2FkIGFuIGVudHJ5IGluIGEganVtcCB0YWJsZSBpbnRvIEVCWCBhbmQgYnJhbmNoIHRvIGl0LiAgVEFCTEUgaXMgYQorICAganVtcCB0YWJsZSB3aXRoIHJlbGF0aXZlIG9mZnNldHMuICAgKi8KKyMgZGVmaW5lIEJSQU5DSF9UT19KTVBUQkxfRU5UUlkoVEFCTEUpCQkJCVwKKyAgICAvKiBXZSBmaXJzdCBsb2FkIFBDIGludG8gRUJYLiAgKi8JCQkJXAorICAgIGNhbGwJX19pNjg2LmdldF9wY190aHVuay5ieDsJCQkJXAorICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUganVtcCB0YWJsZS4gICovCQkJXAorICAgIGFkZAkJJChUQUJMRSAtIC4pLCAlZWJ4OwkJCQlcCisgICAgLyogR2V0IHRoZSBlbnRyeSBhbmQgY29udmVydCB0aGUgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZQlcCisgICAgICAgYWJzb2x1dGUgYWRkcmVzcy4gICovCQkJCQlcCisgICAgYWRkCQkoJWVieCwlZWN4LDQpLCAlZWJ4OwkJCQlcCisgICAgLyogV2UgbG9hZGVkIHRoZSBqdW1wIHRhYmxlIGFuZCBhZGp1ZXN0ZWQgRURYLiBHby4gICovCVwKKyAgICBqbXAJCSolZWJ4CisKKwkuc2VjdGlvbgkuZ251LmxpbmtvbmNlLnQuX19pNjg2LmdldF9wY190aHVuay5ieCwiYXgiLEBwcm9nYml0cworCS5nbG9ibAlfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4CisJLmhpZGRlbglfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4CisJQUxJR04gKDQpCisJLnR5cGUJX19pNjg2LmdldF9wY190aHVuay5ieCxAZnVuY3Rpb24KK19faTY4Ni5nZXRfcGNfdGh1bmsuYng6CisJbW92bAkoJWVzcCksICVlYngKKwlyZXQKKyNlbHNlCisjIGRlZmluZSBFTlRSQU5DRQorIyBkZWZpbmUgUkVUVVJOX0VORAlyZXQKKyMgZGVmaW5lIFJFVFVSTgkJUkVUVVJOX0VORAorIyBkZWZpbmUgUEFSTVMJCTQKKyMgZGVmaW5lIEpNUFRCTChJLCBCKQlJCisKKy8qIEJyYW5jaCB0byBhbiBlbnRyeSBpbiBhIGp1bXAgdGFibGUuICBUQUJMRSBpcyBhIGp1bXAgdGFibGUgd2l0aAorICAgYWJzb2x1dGUgb2Zmc2V0cy4gICovCisjIGRlZmluZSBCUkFOQ0hfVE9fSk1QVEJMX0VOVFJZKFRBQkxFKQkJCQlcCisgICAgam1wCQkqVEFCTEUoLCVlY3gsNCkKKyNlbmRpZgorCisJLnNlY3Rpb24gLnRleHQuc3NlMiwiYXgiLEBwcm9nYml0cworCUFMSUdOICg0KQorRU5UUlkgKHNzZTJfbWVtc2V0MTZfYXRvbSkKKwlFTlRSQU5DRQorCisJbW92bAlMRU4oJWVzcCksICVlY3gKKyNpZmRlZiBVU0VfQVNfQU5EUk9JRAorCXNocgkkMSwgJWVjeAorI2VuZGlmCisjaWZkZWYgVVNFX0FTX0JaRVJPMTYKKwl4b3IJJWVheCwgJWVheAorI2Vsc2UKKwltb3Z6d2wJQ0hSKCVlc3ApLCAlZWF4CisJbW92CSVlYXgsICVlZHgKKwlzaGwJJDE2LCAlZWF4CisJb3IJJWVkeCwgJWVheAorI2VuZGlmCisJbW92bAlERVNUKCVlc3ApLCAlZWR4CisJY21wCSQzMiwgJWVjeAorCWphZQlMKDMyd29yZHNvcm1vcmUpCisKK0wod3JpdGVfbGVzczMyd29yZHMpOgorCWxlYQkoJWVkeCwgJWVjeCwgMiksICVlZHgKKwlCUkFOQ0hfVE9fSk1QVEJMX0VOVFJZIChMKHRhYmxlX2xlc3MzMndvcmRzKSkKKworCisJLnB1c2hzZWN0aW9uIC5yb2RhdGEuc3NlMiwiYSIsQHByb2diaXRzCisJQUxJR04gKDIpCitMKHRhYmxlX2xlc3MzMndvcmRzKToKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8wd29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xd29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8yd29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8zd29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV80d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV81d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV82d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV83d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV84d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV85d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xMHdvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMTF3b3JkcyksIEwodGFibGVfbGVzczMyd29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzEyd29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xM3dvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMTR3b3JkcyksIEwodGFibGVfbGVzczMyd29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzE1d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xNndvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMTd3b3JkcyksIEwodGFibGVfbGVzczMyd29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzE4d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xOXdvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMjB3b3JkcyksIEwodGFibGVfbGVzczMyd29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzIxd29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8yMndvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMjN3b3JkcyksIEwodGFibGVfbGVzczMyd29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzI0d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8yNXdvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMjZ3b3JkcyksIEwodGFibGVfbGVzczMyd29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzI3d29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8yOHdvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMjl3b3JkcyksIEwodGFibGVfbGVzczMyd29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzMwd29yZHMpLCBMKHRhYmxlX2xlc3MzMndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8zMXdvcmRzKSwgTCh0YWJsZV9sZXNzMzJ3b3JkcykpCisJLnBvcHNlY3Rpb24KKworCUFMSUdOICg0KQorTCh3cml0ZV8yOHdvcmRzKToKKwltb3ZsCSVlYXgsIC01NiglZWR4KQorCW1vdmwJJWVheCwgLTUyKCVlZHgpCitMKHdyaXRlXzI0d29yZHMpOgorCW1vdmwJJWVheCwgLTQ4KCVlZHgpCisJbW92bAklZWF4LCAtNDQoJWVkeCkKK0wod3JpdGVfMjB3b3Jkcyk6CisJbW92bAklZWF4LCAtNDAoJWVkeCkKKwltb3ZsCSVlYXgsIC0zNiglZWR4KQorTCh3cml0ZV8xNndvcmRzKToKKwltb3ZsCSVlYXgsIC0zMiglZWR4KQorCW1vdmwJJWVheCwgLTI4KCVlZHgpCitMKHdyaXRlXzEyd29yZHMpOgorCW1vdmwJJWVheCwgLTI0KCVlZHgpCisJbW92bAklZWF4LCAtMjAoJWVkeCkKK0wod3JpdGVfOHdvcmRzKToKKwltb3ZsCSVlYXgsIC0xNiglZWR4KQorCW1vdmwJJWVheCwgLTEyKCVlZHgpCitMKHdyaXRlXzR3b3Jkcyk6CisJbW92bAklZWF4LCAtOCglZWR4KQorCW1vdmwJJWVheCwgLTQoJWVkeCkKK0wod3JpdGVfMHdvcmRzKToKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCUFMSUdOICg0KQorTCh3cml0ZV8yOXdvcmRzKToKKwltb3ZsCSVlYXgsIC01OCglZWR4KQorCW1vdmwJJWVheCwgLTU0KCVlZHgpCitMKHdyaXRlXzI1d29yZHMpOgorCW1vdmwJJWVheCwgLTUwKCVlZHgpCisJbW92bAklZWF4LCAtNDYoJWVkeCkKK0wod3JpdGVfMjF3b3Jkcyk6CisJbW92bAklZWF4LCAtNDIoJWVkeCkKKwltb3ZsCSVlYXgsIC0zOCglZWR4KQorTCh3cml0ZV8xN3dvcmRzKToKKwltb3ZsCSVlYXgsIC0zNCglZWR4KQorCW1vdmwJJWVheCwgLTMwKCVlZHgpCitMKHdyaXRlXzEzd29yZHMpOgorCW1vdmwJJWVheCwgLTI2KCVlZHgpCisJbW92bAklZWF4LCAtMjIoJWVkeCkKK0wod3JpdGVfOXdvcmRzKToKKwltb3ZsCSVlYXgsIC0xOCglZWR4KQorCW1vdmwJJWVheCwgLTE0KCVlZHgpCitMKHdyaXRlXzV3b3Jkcyk6CisJbW92bAklZWF4LCAtMTAoJWVkeCkKKwltb3ZsCSVlYXgsIC02KCVlZHgpCitMKHdyaXRlXzF3b3Jkcyk6CisJbW92CSVheCwgLTIoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCUFMSUdOICg0KQorTCh3cml0ZV8zMHdvcmRzKToKKwltb3ZsCSVlYXgsIC02MCglZWR4KQorCW1vdmwJJWVheCwgLTU2KCVlZHgpCitMKHdyaXRlXzI2d29yZHMpOgorCW1vdmwJJWVheCwgLTUyKCVlZHgpCisJbW92bAklZWF4LCAtNDgoJWVkeCkKK0wod3JpdGVfMjJ3b3Jkcyk6CisJbW92bAklZWF4LCAtNDQoJWVkeCkKKwltb3ZsCSVlYXgsIC00MCglZWR4KQorTCh3cml0ZV8xOHdvcmRzKToKKwltb3ZsCSVlYXgsIC0zNiglZWR4KQorCW1vdmwJJWVheCwgLTMyKCVlZHgpCitMKHdyaXRlXzE0d29yZHMpOgorCW1vdmwJJWVheCwgLTI4KCVlZHgpCisJbW92bAklZWF4LCAtMjQoJWVkeCkKK0wod3JpdGVfMTB3b3Jkcyk6CisJbW92bAklZWF4LCAtMjAoJWVkeCkKKwltb3ZsCSVlYXgsIC0xNiglZWR4KQorTCh3cml0ZV82d29yZHMpOgorCW1vdmwJJWVheCwgLTEyKCVlZHgpCisJbW92bAklZWF4LCAtOCglZWR4KQorTCh3cml0ZV8yd29yZHMpOgorCW1vdmwJJWVheCwgLTQoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCUFMSUdOICg0KQorTCh3cml0ZV8zMXdvcmRzKToKKwltb3ZsCSVlYXgsIC02MiglZWR4KQorCW1vdmwJJWVheCwgLTU4KCVlZHgpCitMKHdyaXRlXzI3d29yZHMpOgorCW1vdmwJJWVheCwgLTU0KCVlZHgpCisJbW92bAklZWF4LCAtNTAoJWVkeCkKK0wod3JpdGVfMjN3b3Jkcyk6CisJbW92bAklZWF4LCAtNDYoJWVkeCkKKwltb3ZsCSVlYXgsIC00MiglZWR4KQorTCh3cml0ZV8xOXdvcmRzKToKKwltb3ZsCSVlYXgsIC0zOCglZWR4KQorCW1vdmwJJWVheCwgLTM0KCVlZHgpCitMKHdyaXRlXzE1d29yZHMpOgorCW1vdmwJJWVheCwgLTMwKCVlZHgpCisJbW92bAklZWF4LCAtMjYoJWVkeCkKK0wod3JpdGVfMTF3b3Jkcyk6CisJbW92bAklZWF4LCAtMjIoJWVkeCkKKwltb3ZsCSVlYXgsIC0xOCglZWR4KQorTCh3cml0ZV83d29yZHMpOgorCW1vdmwJJWVheCwgLTE0KCVlZHgpCisJbW92bAklZWF4LCAtMTAoJWVkeCkKK0wod3JpdGVfM3dvcmRzKToKKwltb3ZsCSVlYXgsIC02KCVlZHgpCisJbW92dwklYXgsIC0yKCVlZHgpCisJU0VUUlROVkFMCisJUkVUVVJOCisKKwlBTElHTiAoNCkKKworTCgzMndvcmRzb3Jtb3JlKToKKwlzaGwJJDEsICVlY3gKKwl0ZXN0CSQweDAxLCAlZWR4CisJanoJTChhbGlnbmVkMmJ5dGVzKQorCW1vdgklZWF4LCAoJWVkeCkKKwltb3YJJWVheCwgLTQoJWVkeCwgJWVjeCkKKwlzdWIJJDIsICVlY3gKKwlhZGQJJDEsICVlZHgKKwlyb2wJJDgsICVlYXgKK0woYWxpZ25lZDJieXRlcyk6CisjaWZkZWYgVVNFX0FTX0JaRVJPMTYKKwlweG9yCSV4bW0wLCAleG1tMAorI2Vsc2UKKwltb3ZkCSVlYXgsICV4bW0wCisJcHNodWZkCSQwLCAleG1tMCwgJXhtbTAKKyNlbmRpZgorCXRlc3RsCSQweGYsICVlZHgKKwlqeglMKGFsaWduZWRfMTYpCisvKiBFQ1ggPiAzMiBhbmQgRURYIGlzIG5vdCAxNiBieXRlIGFsaWduZWQuICAqLworTChub3RfYWxpZ25lZF8xNik6CisJbW92ZHF1CSV4bW0wLCAoJWVkeCkKKwltb3ZsCSVlZHgsICVlYXgKKwlhbmQJJC0xNiwgJWVkeAorCWFkZAkkMTYsICVlZHgKKwlzdWIJJWVkeCwgJWVheAorCWFkZAklZWF4LCAlZWN4CisJbW92ZAkleG1tMCwgJWVheAorCisJQUxJR04gKDQpCitMKGFsaWduZWRfMTYpOgorCWNtcAkkMTI4LCAlZWN4CisJamFlCUwoMTI4Ynl0ZXNvcm1vcmUpCisKK0woYWxpZ25lZF8xNl9sZXNzMTI4Ynl0ZXMpOgorCWFkZAklZWN4LCAlZWR4CisJc2hyCSQxLCAlZWN4CisJQlJBTkNIX1RPX0pNUFRCTF9FTlRSWSAoTCh0YWJsZV8xNl8xMjhieXRlcykpCisKKwlBTElHTiAoNCkKK0woMTI4Ynl0ZXNvcm1vcmUpOgorI2lmZGVmIFNIQVJFRF9DQUNIRV9TSVpFCisJUFVTSCAoJWVieCkKKwltb3YJJFNIQVJFRF9DQUNIRV9TSVpFLCAlZWJ4CisjZWxzZQorIyBpZmRlZiBTSEFSRUQKKwljYWxsCV9faTY4Ni5nZXRfcGNfdGh1bmsuYngKKwlhZGQJJF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgJWVieAorCW1vdglfX3g4Nl9zaGFyZWRfY2FjaGVfc2l6ZUBHT1RPRkYoJWVieCksICVlYngKKyMgZWxzZQorCVBVU0ggKCVlYngpCisJbW92CV9feDg2X3NoYXJlZF9jYWNoZV9zaXplLCAlZWJ4CisjIGVuZGlmCisjZW5kaWYKKwljbXAJJWVieCwgJWVjeAorCWphZQlMKDEyOGJ5dGVzb3Jtb3JlX250X3N0YXJ0KQorCisJCisjaWZkZWYgREFUQV9DQUNIRV9TSVpFCisJUE9QICglZWJ4KQorIyBkZWZpbmUgUkVTVE9SRV9FQlhfU1RBVEUgQ0ZJX1BVU0ggKCVlYngpCisJY21wCSREQVRBX0NBQ0hFX1NJWkUsICVlY3gKKyNlbHNlCisjIGlmZGVmIFNIQVJFRAorIyAgZGVmaW5lIFJFU1RPUkVfRUJYX1NUQVRFCisJY2FsbAlfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4CisJYWRkCSRfR0xPQkFMX09GRlNFVF9UQUJMRV8sICVlYngKKwljbXAJX194ODZfZGF0YV9jYWNoZV9zaXplQEdPVE9GRiglZWJ4KSwgJWVjeAorIyBlbHNlCisJUE9QICglZWJ4KQorIyAgZGVmaW5lIFJFU1RPUkVfRUJYX1NUQVRFIENGSV9QVVNIICglZWJ4KQorCWNtcAlfX3g4Nl9kYXRhX2NhY2hlX3NpemUsICVlY3gKKyMgZW5kaWYKKyNlbmRpZgorCisJamFlCUwoMTI4Ynl0ZXNfTDJfbm9ybWFsKQorCXN1YmwJJDEyOCwgJWVjeAorTCgxMjhieXRlc29ybW9yZV9ub3JtYWwpOgorCXN1YgkkMTI4LCAlZWN4CisJbW92ZHFhCSV4bW0wLCAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MzAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NDAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NzAoJWVkeCkKKwlsZWEJMTI4KCVlZHgpLCAlZWR4CisJamIJTCgxMjhieXRlc2xlc3Nfbm9ybWFsKQorCisKKwlzdWIJJDEyOCwgJWVjeAorCW1vdmRxYQkleG1tMCwgKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDEwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDIwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDMwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDQwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDUwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDYwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDcwKCVlZHgpCisJbGVhCTEyOCglZWR4KSwgJWVkeAorCWphZQlMKDEyOGJ5dGVzb3Jtb3JlX25vcm1hbCkKKworTCgxMjhieXRlc2xlc3Nfbm9ybWFsKToKKwlsZWEJMTI4KCVlY3gpLCAlZWN4CisJYWRkCSVlY3gsICVlZHgKKwlzaHIJJDEsICVlY3gKKwlCUkFOQ0hfVE9fSk1QVEJMX0VOVFJZIChMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKworCUFMSUdOICg0KQorTCgxMjhieXRlc19MMl9ub3JtYWwpOgorCXByZWZldGNodDAJMHgzODAoJWVkeCkKKwlwcmVmZXRjaHQwCTB4M2MwKCVlZHgpCisJc3ViCSQxMjgsICVlY3gKKwltb3ZkcWEJJXhtbTAsICglZWR4KQorCW1vdmFwcwkleG1tMCwgMHgxMCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHgyMCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHgzMCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg0MCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg1MCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg2MCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg3MCglZWR4KQorCWFkZAkkMTI4LCAlZWR4CisJY21wCSQxMjgsICVlY3ggCQorCWphZQlMKDEyOGJ5dGVzX0wyX25vcm1hbCkKKworTCgxMjhieXRlc2xlc3NfTDJfbm9ybWFsKToKKwlhZGQJJWVjeCwgJWVkeAorCXNocgkkMSwgJWVjeAorCUJSQU5DSF9UT19KTVBUQkxfRU5UUlkgKEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCisJUkVTVE9SRV9FQlhfU1RBVEUKK0woMTI4Ynl0ZXNvcm1vcmVfbnRfc3RhcnQpOgorCXN1YgklZWJ4LCAlZWN4CisJbW92CSVlYngsICVlYXgKKwlhbmQJJDB4N2YsICVlYXgKKwlhZGQJJWVheCwgJWVjeAorCW1vdmQJJXhtbTAsICVlYXgKKwlBTElHTiAoNCkKK0woMTI4Ynl0ZXNvcm1vcmVfc2hhcmVkX2NhY2hlX2xvb3ApOgorCXByZWZldGNodDAJMHgzYzAoJWVkeCkKKwlwcmVmZXRjaHQwCTB4MzgwKCVlZHgpCisJc3ViCSQweDgwLCAlZWJ4CisJbW92ZHFhCSV4bW0wLCAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MzAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NDAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NzAoJWVkeCkKKwlhZGQJJDB4ODAsICVlZHgKKwljbXAJJDB4ODAsICVlYngKKwlqYWUJTCgxMjhieXRlc29ybW9yZV9zaGFyZWRfY2FjaGVfbG9vcCkKKwljbXAJJDB4ODAsICVlY3gKKwlqYglMKHNoYXJlZF9jYWNoZV9sb29wX2VuZCkKKwlBTElHTiAoNCkKK0woMTI4Ynl0ZXNvcm1vcmVfbnQpOgorCXN1YgkkMHg4MCwgJWVjeAorCW1vdm50ZHEJJXhtbTAsICglZWR4KQorCW1vdm50ZHEJJXhtbTAsIDB4MTAoJWVkeCkKKwltb3ZudGRxCSV4bW0wLCAweDIwKCVlZHgpCisJbW92bnRkcQkleG1tMCwgMHgzMCglZWR4KQorCW1vdm50ZHEJJXhtbTAsIDB4NDAoJWVkeCkKKwltb3ZudGRxCSV4bW0wLCAweDUwKCVlZHgpCisJbW92bnRkcQkleG1tMCwgMHg2MCglZWR4KQorCW1vdm50ZHEJJXhtbTAsIDB4NzAoJWVkeCkKKwlhZGQJJDB4ODAsICVlZHgKKwljbXAJJDB4ODAsICVlY3gKKwlqYWUJTCgxMjhieXRlc29ybW9yZV9udCkKKwlzZmVuY2UKK0woc2hhcmVkX2NhY2hlX2xvb3BfZW5kKToKKyNpZiBkZWZpbmVkIERBVEFfQ0FDSEVfU0laRSB8fCAhZGVmaW5lZCBTSEFSRUQKKwlQT1AgKCVlYngpCisjZW5kaWYKKwlhZGQJJWVjeCwgJWVkeAorCXNocgkkMSwgJWVjeAorCUJSQU5DSF9UT19KTVBUQkxfRU5UUlkgKEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCisKKwkucHVzaHNlY3Rpb24gLnJvZGF0YS5zc2UyLCJhIixAcHJvZ2JpdHMKKwlBTElHTiAoMikKK0wodGFibGVfMTZfMTI4Ynl0ZXMpOgorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMGJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8yYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzRieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNmJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl84Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzEwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzEyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzE0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzE2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzE4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzIwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzIyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzI0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzI2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzI4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzMwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzMyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzM0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzM2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzM4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzQwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzQyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzQ0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzQ2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzQ4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzUwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzUyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzU0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzU2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzU4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzYwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzYyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzY0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzY2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzY4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzcwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzcyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzc0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzc2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzc4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzgwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzgyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzg0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzg2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzg4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzkwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzkyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzk0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzk2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2Xzk4Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzEwMGJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8xMDJieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTA0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzEwNmJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8xMDhieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTEwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzExMmJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8xMTRieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTE2Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzExOGJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8xMjBieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTIyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzEyNGJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8xMjZieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5wb3BzZWN0aW9uCisKKworCUFMSUdOICg0KQorTChhbGlnbmVkXzE2XzExMmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0xMTIoJWVkeCkKK0woYWxpZ25lZF8xNl85NmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC05NiglZWR4KQorTChhbGlnbmVkXzE2XzgwYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTgwKCVlZHgpCitMKGFsaWduZWRfMTZfNjRieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNjQoJWVkeCkKK0woYWxpZ25lZF8xNl80OGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC00OCglZWR4KQorTChhbGlnbmVkXzE2XzMyYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTMyKCVlZHgpCitMKGFsaWduZWRfMTZfMTZieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTYoJWVkeCkKK0woYWxpZ25lZF8xNl8wYnl0ZXMpOgorCVNFVFJUTlZBTAorCVJFVFVSTgorCisKKwlBTElHTiAoNCkKK0woYWxpZ25lZF8xNl8xMTRieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTE0KCVlZHgpCitMKGFsaWduZWRfMTZfOThieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtOTgoJWVkeCkKK0woYWxpZ25lZF8xNl84MmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC04MiglZWR4KQorTChhbGlnbmVkXzE2XzY2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTY2KCVlZHgpCitMKGFsaWduZWRfMTZfNTBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNTAoJWVkeCkKK0woYWxpZ25lZF8xNl8zNGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0zNCglZWR4KQorTChhbGlnbmVkXzE2XzE4Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTE4KCVlZHgpCitMKGFsaWduZWRfMTZfMmJ5dGVzKToKKwltb3Z3CSVheCwgLTIoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCUFMSUdOICg0KQorTChhbGlnbmVkXzE2XzExNmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0xMTYoJWVkeCkKK0woYWxpZ25lZF8xNl8xMDBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTAwKCVlZHgpCitMKGFsaWduZWRfMTZfODRieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtODQoJWVkeCkKK0woYWxpZ25lZF8xNl82OGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC02OCglZWR4KQorTChhbGlnbmVkXzE2XzUyYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTUyKCVlZHgpCitMKGFsaWduZWRfMTZfMzZieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMzYoJWVkeCkKK0woYWxpZ25lZF8xNl8yMGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0yMCglZWR4KQorTChhbGlnbmVkXzE2XzRieXRlcyk6CisJbW92bAklZWF4LCAtNCglZWR4KQorCVNFVFJUTlZBTAorCVJFVFVSTgorCisKKwlBTElHTiAoNCkKK0woYWxpZ25lZF8xNl8xMThieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTE4KCVlZHgpCitMKGFsaWduZWRfMTZfMTAyYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTEwMiglZWR4KQorTChhbGlnbmVkXzE2Xzg2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTg2KCVlZHgpCitMKGFsaWduZWRfMTZfNzBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNzAoJWVkeCkKK0woYWxpZ25lZF8xNl81NGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC01NCglZWR4KQorTChhbGlnbmVkXzE2XzM4Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTM4KCVlZHgpCitMKGFsaWduZWRfMTZfMjJieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMjIoJWVkeCkKK0woYWxpZ25lZF8xNl82Ynl0ZXMpOgorCW1vdmwJJWVheCwgLTYoJWVkeCkKKwltb3Z3CSVheCwgLTIoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCisJQUxJR04gKDQpCitMKGFsaWduZWRfMTZfMTIwYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTEyMCglZWR4KQorTChhbGlnbmVkXzE2XzEwNGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0xMDQoJWVkeCkKK0woYWxpZ25lZF8xNl84OGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC04OCglZWR4KQorTChhbGlnbmVkXzE2XzcyYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTcyKCVlZHgpCitMKGFsaWduZWRfMTZfNTZieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNTYoJWVkeCkKK0woYWxpZ25lZF8xNl80MGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC00MCglZWR4KQorTChhbGlnbmVkXzE2XzI0Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTI0KCVlZHgpCitMKGFsaWduZWRfMTZfOGJ5dGVzKToKKwltb3ZxCSV4bW0wLCAtOCglZWR4KQorCVNFVFJUTlZBTAorCVJFVFVSTgorCisKKwlBTElHTiAoNCkKK0woYWxpZ25lZF8xNl8xMjJieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTIyKCVlZHgpCitMKGFsaWduZWRfMTZfMTA2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTEwNiglZWR4KQorTChhbGlnbmVkXzE2XzkwYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTkwKCVlZHgpCitMKGFsaWduZWRfMTZfNzRieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNzQoJWVkeCkKK0woYWxpZ25lZF8xNl81OGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC01OCglZWR4KQorTChhbGlnbmVkXzE2XzQyYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTQyKCVlZHgpCitMKGFsaWduZWRfMTZfMjZieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMjYoJWVkeCkKK0woYWxpZ25lZF8xNl8xMGJ5dGVzKToKKwltb3ZxCSV4bW0wLCAtMTAoJWVkeCkKKwltb3Z3CSVheCwgLTIoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCisJQUxJR04gKDQpCitMKGFsaWduZWRfMTZfMTI0Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTEyNCglZWR4KQorTChhbGlnbmVkXzE2XzEwOGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0xMDgoJWVkeCkKK0woYWxpZ25lZF8xNl85MmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC05MiglZWR4KQorTChhbGlnbmVkXzE2Xzc2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTc2KCVlZHgpCitMKGFsaWduZWRfMTZfNjBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNjAoJWVkeCkKK0woYWxpZ25lZF8xNl80NGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC00NCglZWR4KQorTChhbGlnbmVkXzE2XzI4Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTI4KCVlZHgpCitMKGFsaWduZWRfMTZfMTJieXRlcyk6CisJbW92cQkleG1tMCwgLTEyKCVlZHgpCisJbW92bAklZWF4LCAtNCglZWR4KQorCVNFVFJUTlZBTAorCVJFVFVSTgorCisKKwlBTElHTiAoNCkKK0woYWxpZ25lZF8xNl8xMjZieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTI2KCVlZHgpCitMKGFsaWduZWRfMTZfMTEwYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTExMCglZWR4KQorTChhbGlnbmVkXzE2Xzk0Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTk0KCVlZHgpCitMKGFsaWduZWRfMTZfNzhieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNzgoJWVkeCkKK0woYWxpZ25lZF8xNl82MmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC02MiglZWR4KQorTChhbGlnbmVkXzE2XzQ2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTQ2KCVlZHgpCitMKGFsaWduZWRfMTZfMzBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMzAoJWVkeCkKK0woYWxpZ25lZF8xNl8xNGJ5dGVzKToKKwltb3ZxCSV4bW0wLCAtMTQoJWVkeCkKKwltb3ZsCSVlYXgsIC02KCVlZHgpCisJbW92dwklYXgsIC0yKCVlZHgpCisJU0VUUlROVkFMCisJUkVUVVJOCisKK0VORCAoc3NlMl9tZW1zZXQxNl9hdG9tKQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2FyY2gteDg2L3NzZTItbWVtc2V0MzItYXRvbS5TIGIvbGliY3V0aWxzL2FyY2gteDg2L3NzZTItbWVtc2V0MzItYXRvbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNTI0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJjdXRpbHMvYXJjaC14ODYvc3NlMi1tZW1zZXQzMi1hdG9tLlMKQEAgLTAsMCArMSw1MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoKKyAqIENvbnRyaWJ1dGVkIGJ5OiBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisKKyNpZm5kZWYgTAorIyBkZWZpbmUgTChsYWJlbCkJLkwjI2xhYmVsCisjZW5kaWYKKworI2lmbmRlZiBBTElHTgorIyBkZWZpbmUgQUxJR04obikJLnAyYWxpZ24gbgorI2VuZGlmCisKKyNpZm5kZWYgY2ZpX3N0YXJ0cHJvYworIyBkZWZpbmUgY2ZpX3N0YXJ0cHJvYwkJCS5jZmlfc3RhcnRwcm9jCisjZW5kaWYKKworI2lmbmRlZiBjZmlfZW5kcHJvYworIyBkZWZpbmUgY2ZpX2VuZHByb2MJCQkuY2ZpX2VuZHByb2MKKyNlbmRpZgorCisjaWZuZGVmIGNmaV9yZWxfb2Zmc2V0CisjIGRlZmluZSBjZmlfcmVsX29mZnNldChyZWcsIG9mZikJLmNmaV9yZWxfb2Zmc2V0IHJlZywgb2ZmCisjZW5kaWYKKworI2lmbmRlZiBjZmlfcmVzdG9yZQorIyBkZWZpbmUgY2ZpX3Jlc3RvcmUocmVnKQkJLmNmaV9yZXN0b3JlIHJlZworI2VuZGlmCisKKyNpZm5kZWYgY2ZpX2FkanVzdF9jZmFfb2Zmc2V0CisjIGRlZmluZSBjZmlfYWRqdXN0X2NmYV9vZmZzZXQob2ZmKQkuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0IG9mZgorI2VuZGlmCisKKyNpZm5kZWYgRU5UUlkKKyMgZGVmaW5lIEVOVFJZKG5hbWUpCQkJXAorCS50eXBlIG5hbWUsICBAZnVuY3Rpb247IAlcCisJLmdsb2JsIG5hbWU7CQkJXAorCS5wMmFsaWduIDQ7CQkJXAorbmFtZToJCQkJCVwKKwljZmlfc3RhcnRwcm9jCisjZW5kaWYKKworI2lmbmRlZiBFTkQKKyMgZGVmaW5lIEVORChuYW1lKQkJCVwKKwljZmlfZW5kcHJvYzsJCQlcCisJLnNpemUgbmFtZSwgLi1uYW1lCisjZW5kaWYKKworI2RlZmluZSBDRklfUFVTSChSRUcpCQkJCQkJXAorICBjZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDQpOwkJCQkJXAorICBjZmlfcmVsX29mZnNldCAoUkVHLCAwKQorCisjZGVmaW5lIENGSV9QT1AoUkVHKQkJCQkJCVwKKyAgY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCk7CQkJCQlcCisgIGNmaV9yZXN0b3JlIChSRUcpCisKKyNkZWZpbmUgUFVTSChSRUcpCXB1c2hsIFJFRzsgQ0ZJX1BVU0ggKFJFRykKKyNkZWZpbmUgUE9QKFJFRykJcG9wbCBSRUc7IENGSV9QT1AgKFJFRykKKworI2lmZGVmIFVTRV9BU19CWkVSTzMyCisjIGRlZmluZSBERVNUCQlQQVJNUworIyBkZWZpbmUgTEVOCQlERVNUKzQKKyNlbHNlCisjIGRlZmluZSBERVNUCQlQQVJNUworIyBkZWZpbmUgRFdEUwkJREVTVCs0CisjIGRlZmluZSBMRU4JCURXRFMrNAorI2VuZGlmCisKKyNpZmRlZiBVU0VfQVNfV01FTVNFVDMyCisjIGRlZmluZSBTRVRSVE5WQUwJbW92bCBERVNUKCVlc3ApLCAlZWF4CisjZWxzZQorIyBkZWZpbmUgU0VUUlROVkFMCisjZW5kaWYKKworI2lmZGVmIFNIQVJFRAorIyBkZWZpbmUgRU5UUkFOQ0UJUFVTSCAoJWVieCk7CisjIGRlZmluZSBSRVRVUk5fRU5ECVBPUCAoJWVieCk7IHJldAorIyBkZWZpbmUgUkVUVVJOCQlSRVRVUk5fRU5EOyBDRklfUFVTSCAoJWVieCkKKyMgZGVmaW5lIFBBUk1TCQk4CQkvKiBQcmVzZXJ2ZSBFQlguICAqLworIyBkZWZpbmUgSk1QVEJMKEksIEIpCUkgLSBCCisKKy8qIExvYWQgYW4gZW50cnkgaW4gYSBqdW1wIHRhYmxlIGludG8gRUJYIGFuZCBicmFuY2ggdG8gaXQuICBUQUJMRSBpcyBhCisgICBqdW1wIHRhYmxlIHdpdGggcmVsYXRpdmUgb2Zmc2V0cy4gICAqLworIyBkZWZpbmUgQlJBTkNIX1RPX0pNUFRCTF9FTlRSWShUQUJMRSkJCQkJXAorICAgIC8qIFdlIGZpcnN0IGxvYWQgUEMgaW50byBFQlguICAqLwkJCQlcCisgICAgY2FsbAlfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4OwkJCQlcCisgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBqdW1wIHRhYmxlLiAgKi8JCQlcCisgICAgYWRkCQkkKFRBQkxFIC0gLiksICVlYng7CQkJCVwKKyAgICAvKiBHZXQgdGhlIGVudHJ5IGFuZCBjb252ZXJ0IHRoZSByZWxhdGl2ZSBvZmZzZXQgdG8gdGhlCVwKKyAgICAgICBhYnNvbHV0ZSBhZGRyZXNzLiAgKi8JCQkJCVwKKyAgICBhZGQJCSglZWJ4LCVlY3gsNCksICVlYng7CQkJCVwKKyAgICAvKiBXZSBsb2FkZWQgdGhlIGp1bXAgdGFibGUgYW5kIGFkanVlc3RlZCBFRFguIEdvLiAgKi8JXAorICAgIGptcAkJKiVlYngKKworCS5zZWN0aW9uCS5nbnUubGlua29uY2UudC5fX2k2ODYuZ2V0X3BjX3RodW5rLmJ4LCJheCIsQHByb2diaXRzCisJLmdsb2JsCV9faTY4Ni5nZXRfcGNfdGh1bmsuYngKKwkuaGlkZGVuCV9faTY4Ni5nZXRfcGNfdGh1bmsuYngKKwlBTElHTiAoNCkKKwkudHlwZQlfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4LEBmdW5jdGlvbgorX19pNjg2LmdldF9wY190aHVuay5ieDoKKwltb3ZsCSglZXNwKSwgJWVieAorCXJldAorI2Vsc2UKKyMgZGVmaW5lIEVOVFJBTkNFCisjIGRlZmluZSBSRVRVUk5fRU5ECXJldAorIyBkZWZpbmUgUkVUVVJOCQlSRVRVUk5fRU5ECisjIGRlZmluZSBQQVJNUwkJNAorIyBkZWZpbmUgSk1QVEJMKEksIEIpCUkKKworLyogQnJhbmNoIHRvIGFuIGVudHJ5IGluIGEganVtcCB0YWJsZS4gIFRBQkxFIGlzIGEganVtcCB0YWJsZSB3aXRoCisgICBhYnNvbHV0ZSBvZmZzZXRzLiAgKi8KKyMgZGVmaW5lIEJSQU5DSF9UT19KTVBUQkxfRU5UUlkoVEFCTEUpCQkJCVwKKyAgICBqbXAJCSpUQUJMRSgsJWVjeCw0KQorI2VuZGlmCisKKwkuc2VjdGlvbiAudGV4dC5zc2UyLCJheCIsQHByb2diaXRzCisJQUxJR04gKDQpCitFTlRSWSAoc3NlMl9tZW1zZXQzMl9hdG9tKQorCUVOVFJBTkNFCisKKwltb3ZsCUxFTiglZXNwKSwgJWVjeAorI2lmZGVmIFVTRV9BU19BTkRST0lECisJc2hyICAgICAkMiwgJWVjeAorI2VuZGlmCisjaWZkZWYgVVNFX0FTX0JaRVJPMzIKKwl4b3IJJWVheCwgJWVheAorI2Vsc2UKKwltb3YJRFdEUyglZXNwKSwgJWVheAorCW1vdgklZWF4LCAlZWR4CisjZW5kaWYKKwltb3ZsCURFU1QoJWVzcCksICVlZHgKKwljbXAJJDE2LCAlZWN4CisJamFlCUwoMTZkYndvcmRzb3Jtb3JlKQorCitMKHdyaXRlX2xlc3MxNmRid29yZHMpOgorCWxlYQkoJWVkeCwgJWVjeCwgNCksICVlZHgKKwlCUkFOQ0hfVE9fSk1QVEJMX0VOVFJZIChMKHRhYmxlX2xlc3MxNmRid29yZHMpKQorCisJLnB1c2hzZWN0aW9uIC5yb2RhdGEuc3NlMiwiYSIsQHByb2diaXRzCisJQUxJR04gKDIpCitMKHRhYmxlX2xlc3MxNmRid29yZHMpOgorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzBkYndvcmRzKSwgTCh0YWJsZV9sZXNzMTZkYndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xZGJ3b3JkcyksIEwodGFibGVfbGVzczE2ZGJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMmRid29yZHMpLCBMKHRhYmxlX2xlc3MxNmRid29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzNkYndvcmRzKSwgTCh0YWJsZV9sZXNzMTZkYndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV80ZGJ3b3JkcyksIEwodGFibGVfbGVzczE2ZGJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfNWRid29yZHMpLCBMKHRhYmxlX2xlc3MxNmRid29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzZkYndvcmRzKSwgTCh0YWJsZV9sZXNzMTZkYndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV83ZGJ3b3JkcyksIEwodGFibGVfbGVzczE2ZGJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfOGRid29yZHMpLCBMKHRhYmxlX2xlc3MxNmRid29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzlkYndvcmRzKSwgTCh0YWJsZV9sZXNzMTZkYndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xMGRid29yZHMpLCBMKHRhYmxlX2xlc3MxNmRid29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzExZGJ3b3JkcyksIEwodGFibGVfbGVzczE2ZGJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMTJkYndvcmRzKSwgTCh0YWJsZV9sZXNzMTZkYndvcmRzKSkKKwkuaW50CUpNUFRCTCAoTCh3cml0ZV8xM2Rid29yZHMpLCBMKHRhYmxlX2xlc3MxNmRid29yZHMpKQorCS5pbnQJSk1QVEJMIChMKHdyaXRlXzE0ZGJ3b3JkcyksIEwodGFibGVfbGVzczE2ZGJ3b3JkcykpCisJLmludAlKTVBUQkwgKEwod3JpdGVfMTVkYndvcmRzKSwgTCh0YWJsZV9sZXNzMTZkYndvcmRzKSkKKwkucG9wc2VjdGlvbgorCisJQUxJR04gKDQpCitMKHdyaXRlXzE1ZGJ3b3Jkcyk6CisJbW92bAklZWF4LCAtNjAoJWVkeCkKK0wod3JpdGVfMTRkYndvcmRzKToKKwltb3ZsCSVlYXgsIC01NiglZWR4KQorTCh3cml0ZV8xM2Rid29yZHMpOgorCW1vdmwJJWVheCwgLTUyKCVlZHgpCitMKHdyaXRlXzEyZGJ3b3Jkcyk6CisJbW92bAklZWF4LCAtNDgoJWVkeCkKK0wod3JpdGVfMTFkYndvcmRzKToKKwltb3ZsCSVlYXgsIC00NCglZWR4KQorTCh3cml0ZV8xMGRid29yZHMpOgorCW1vdmwJJWVheCwgLTQwKCVlZHgpCitMKHdyaXRlXzlkYndvcmRzKToKKwltb3ZsCSVlYXgsIC0zNiglZWR4KQorTCh3cml0ZV84ZGJ3b3Jkcyk6CisJbW92bAklZWF4LCAtMzIoJWVkeCkKK0wod3JpdGVfN2Rid29yZHMpOgorCW1vdmwJJWVheCwgLTI4KCVlZHgpCitMKHdyaXRlXzZkYndvcmRzKToKKwltb3ZsCSVlYXgsIC0yNCglZWR4KQorTCh3cml0ZV81ZGJ3b3Jkcyk6CisJbW92bAklZWF4LCAtMjAoJWVkeCkKK0wod3JpdGVfNGRid29yZHMpOgorCW1vdmwJJWVheCwgLTE2KCVlZHgpCitMKHdyaXRlXzNkYndvcmRzKToKKwltb3ZsCSVlYXgsIC0xMiglZWR4KQorTCh3cml0ZV8yZGJ3b3Jkcyk6CisJbW92bAklZWF4LCAtOCglZWR4KQorTCh3cml0ZV8xZGJ3b3Jkcyk6CisJbW92bAklZWF4LCAtNCglZWR4KQorTCh3cml0ZV8wZGJ3b3Jkcyk6CisJU0VUUlROVkFMCisJUkVUVVJOCisKKwlBTElHTiAoNCkKK0woMTZkYndvcmRzb3Jtb3JlKToKKwl0ZXN0CSQzLCAlZWR4CisJanoJTChhbGlnbmVkNGJ5dGVzKQorCW1vdgklZWF4LCAoJWVkeCkKKwltb3YJJWVheCwgLTQoJWVkeCwgJWVjeCwgNCkKKwlzdWIJJDEsICVlY3gKKwlyb2wJJDI0LCAlZWF4CisJYWRkCSQxLCAlZWR4CisJdGVzdAkkMywgJWVkeAorCWp6CUwoYWxpZ25lZDRieXRlcykKKwlyb3IJJDgsICVlYXgKKwlhZGQJJDEsICVlZHgKKwl0ZXN0CSQzLCAlZWR4CisJanoJTChhbGlnbmVkNGJ5dGVzKQorCXJvcgkkOCwgJWVheAorCWFkZAkkMSwgJWVkeAorTChhbGlnbmVkNGJ5dGVzKToKKwlzaGwJJDIsICVlY3gKKworI2lmZGVmIFVTRV9BU19CWkVSTzMyCisJcHhvcgkleG1tMCwgJXhtbTAKKyNlbHNlCisJbW92ZAklZWF4LCAleG1tMAorCXBzaHVmZAkkMCwgJXhtbTAsICV4bW0wCisjZW5kaWYKKwl0ZXN0bAkkMHhmLCAlZWR4CisJanoJTChhbGlnbmVkXzE2KQorLyogRUNYID4gMzIgYW5kIEVEWCBpcyBub3QgMTYgYnl0ZSBhbGlnbmVkLiAgKi8KK0wobm90X2FsaWduZWRfMTYpOgorCW1vdmRxdQkleG1tMCwgKCVlZHgpCisJbW92bAklZWR4LCAlZWF4CisJYW5kCSQtMTYsICVlZHgKKwlhZGQJJDE2LCAlZWR4CisJc3ViCSVlZHgsICVlYXgKKwlhZGQJJWVheCwgJWVjeAorCW1vdmQJJXhtbTAsICVlYXgKKwlBTElHTiAoNCkKK0woYWxpZ25lZF8xNik6CisJY21wCSQxMjgsICVlY3gKKwlqYWUJTCgxMjhieXRlc29ybW9yZSkKKworTChhbGlnbmVkXzE2X2xlc3MxMjhieXRlcyk6CisJYWRkCSVlY3gsICVlZHgKKwlzaHIJJDIsICVlY3gKKwlCUkFOQ0hfVE9fSk1QVEJMX0VOVFJZIChMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKworCUFMSUdOICg0KQorTCgxMjhieXRlc29ybW9yZSk6CisjaWZkZWYgU0hBUkVEX0NBQ0hFX1NJWkUKKwlQVVNIICglZWJ4KQorCW1vdgkkU0hBUkVEX0NBQ0hFX1NJWkUsICVlYngKKyNlbHNlCisjIGlmZGVmIFNIQVJFRAorCWNhbGwJX19pNjg2LmdldF9wY190aHVuay5ieAorCWFkZAkkX0dMT0JBTF9PRkZTRVRfVEFCTEVfLCAlZWJ4CisJbW92CV9feDg2X3NoYXJlZF9jYWNoZV9zaXplQEdPVE9GRiglZWJ4KSwgJWVieAorIyBlbHNlCisJUFVTSCAoJWVieCkKKwltb3YJX194ODZfc2hhcmVkX2NhY2hlX3NpemUsICVlYngKKyMgZW5kaWYKKyNlbmRpZgorCWNtcAklZWJ4LCAlZWN4CisJamFlCUwoMTI4Ynl0ZXNvcm1vcmVfbnRfc3RhcnQpCisJCisjaWZkZWYgREFUQV9DQUNIRV9TSVpFCisJUE9QICglZWJ4KQorIyBkZWZpbmUgUkVTVE9SRV9FQlhfU1RBVEUgQ0ZJX1BVU0ggKCVlYngpCisJY21wCSREQVRBX0NBQ0hFX1NJWkUsICVlY3gKKyNlbHNlCisjIGlmZGVmIFNIQVJFRAorIyAgZGVmaW5lIFJFU1RPUkVfRUJYX1NUQVRFCisJY2FsbAlfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4CisJYWRkCSRfR0xPQkFMX09GRlNFVF9UQUJMRV8sICVlYngKKwljbXAJX194ODZfZGF0YV9jYWNoZV9zaXplQEdPVE9GRiglZWJ4KSwgJWVjeAorIyBlbHNlCisJUE9QICglZWJ4KQorIyAgZGVmaW5lIFJFU1RPUkVfRUJYX1NUQVRFIENGSV9QVVNIICglZWJ4KQorCWNtcAlfX3g4Nl9kYXRhX2NhY2hlX3NpemUsICVlY3gKKyMgZW5kaWYKKyNlbmRpZgorCisJamFlCUwoMTI4Ynl0ZXNfTDJfbm9ybWFsKQorCXN1YmwJJDEyOCwgJWVjeAorTCgxMjhieXRlc29ybW9yZV9ub3JtYWwpOgorCXN1YgkkMTI4LCAlZWN4CisJbW92ZHFhCSV4bW0wLCAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MzAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NDAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NzAoJWVkeCkKKwlsZWEJMTI4KCVlZHgpLCAlZWR4CisJamIJTCgxMjhieXRlc2xlc3Nfbm9ybWFsKQorCisKKwlzdWIJJDEyOCwgJWVjeAorCW1vdmRxYQkleG1tMCwgKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDEwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDIwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDMwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDQwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDUwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDYwKCVlZHgpCisJbW92ZHFhCSV4bW0wLCAweDcwKCVlZHgpCisJbGVhCTEyOCglZWR4KSwgJWVkeAorCWphZQlMKDEyOGJ5dGVzb3Jtb3JlX25vcm1hbCkKKworTCgxMjhieXRlc2xlc3Nfbm9ybWFsKToKKwlsZWEJMTI4KCVlY3gpLCAlZWN4CisJYWRkCSVlY3gsICVlZHgKKwlzaHIJJDIsICVlY3gKKwlCUkFOQ0hfVE9fSk1QVEJMX0VOVFJZIChMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKworCUFMSUdOICg0KQorTCgxMjhieXRlc19MMl9ub3JtYWwpOgorCXByZWZldGNodDAJMHgzODAoJWVkeCkKKwlwcmVmZXRjaHQwCTB4M2MwKCVlZHgpCisJc3ViCSQxMjgsICVlY3gKKwltb3ZkcWEJJXhtbTAsICglZWR4KQorCW1vdmFwcwkleG1tMCwgMHgxMCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHgyMCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHgzMCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg0MCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg1MCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg2MCglZWR4KQorCW1vdmFwcwkleG1tMCwgMHg3MCglZWR4KQorCWFkZAkkMTI4LCAlZWR4CisJY21wCSQxMjgsICVlY3ggCQorCWphZQlMKDEyOGJ5dGVzX0wyX25vcm1hbCkKKworTCgxMjhieXRlc2xlc3NfTDJfbm9ybWFsKToKKwlhZGQJJWVjeCwgJWVkeAorCXNocgkkMiwgJWVjeAorCUJSQU5DSF9UT19KTVBUQkxfRU5UUlkgKEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCisJUkVTVE9SRV9FQlhfU1RBVEUKK0woMTI4Ynl0ZXNvcm1vcmVfbnRfc3RhcnQpOgorCXN1YgklZWJ4LCAlZWN4CisJbW92CSVlYngsICVlYXgKKwlhbmQJJDB4N2YsICVlYXgKKwlhZGQJJWVheCwgJWVjeAorCW1vdmQJJXhtbTAsICVlYXgKKwlBTElHTiAoNCkKK0woMTI4Ynl0ZXNvcm1vcmVfc2hhcmVkX2NhY2hlX2xvb3ApOgorCXByZWZldGNodDAJMHgzYzAoJWVkeCkKKwlwcmVmZXRjaHQwCTB4MzgwKCVlZHgpCisJc3ViCSQweDgwLCAlZWJ4CisJbW92ZHFhCSV4bW0wLCAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4MzAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NDAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NTAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NjAoJWVkeCkKKwltb3ZkcWEJJXhtbTAsIDB4NzAoJWVkeCkKKwlhZGQJJDB4ODAsICVlZHgKKwljbXAJJDB4ODAsICVlYngKKwlqYWUJTCgxMjhieXRlc29ybW9yZV9zaGFyZWRfY2FjaGVfbG9vcCkKKwljbXAJJDB4ODAsICVlY3gKKwlqYglMKHNoYXJlZF9jYWNoZV9sb29wX2VuZCkKKworCUFMSUdOICg0KQorTCgxMjhieXRlc29ybW9yZV9udCk6CisJc3ViCSQweDgwLCAlZWN4CisJbW92bnRkcQkleG1tMCwgKCVlZHgpCisJbW92bnRkcQkleG1tMCwgMHgxMCglZWR4KQorCW1vdm50ZHEJJXhtbTAsIDB4MjAoJWVkeCkKKwltb3ZudGRxCSV4bW0wLCAweDMwKCVlZHgpCisJbW92bnRkcQkleG1tMCwgMHg0MCglZWR4KQorCW1vdm50ZHEJJXhtbTAsIDB4NTAoJWVkeCkKKwltb3ZudGRxCSV4bW0wLCAweDYwKCVlZHgpCisJbW92bnRkcQkleG1tMCwgMHg3MCglZWR4KQorCWFkZAkkMHg4MCwgJWVkeAorCWNtcAkkMHg4MCwgJWVjeAorCWphZQlMKDEyOGJ5dGVzb3Jtb3JlX250KQorCXNmZW5jZQorTChzaGFyZWRfY2FjaGVfbG9vcF9lbmQpOgorI2lmIGRlZmluZWQgREFUQV9DQUNIRV9TSVpFIHx8ICFkZWZpbmVkIFNIQVJFRAorCVBPUCAoJWVieCkKKyNlbmRpZgorCWFkZAklZWN4LCAlZWR4CisJc2hyCSQyLCAlZWN4CisJQlJBTkNIX1RPX0pNUFRCTF9FTlRSWSAoTCh0YWJsZV8xNl8xMjhieXRlcykpCisKKwkucHVzaHNlY3Rpb24gLnJvZGF0YS5zc2UyLCJhIixAcHJvZ2JpdHMKKwlBTElHTiAoMikKK0wodGFibGVfMTZfMTI4Ynl0ZXMpOgorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMGJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl80Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzhieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTJieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTZieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMjBieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMjRieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMjhieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMzJieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMzZieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNDBieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNDRieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNDhieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNTJieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNTZieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNjBieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNjRieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNjhieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNzJieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfNzZieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfODBieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfODRieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfODhieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfOTJieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfOTZieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTAwYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzEwNGJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8xMDhieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTEyYnl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkuaW50CUpNUFRCTCAoTChhbGlnbmVkXzE2XzExNmJ5dGVzKSwgTCh0YWJsZV8xNl8xMjhieXRlcykpCisJLmludAlKTVBUQkwgKEwoYWxpZ25lZF8xNl8xMjBieXRlcyksIEwodGFibGVfMTZfMTI4Ynl0ZXMpKQorCS5pbnQJSk1QVEJMIChMKGFsaWduZWRfMTZfMTI0Ynl0ZXMpLCBMKHRhYmxlXzE2XzEyOGJ5dGVzKSkKKwkucG9wc2VjdGlvbgorCisJQUxJR04gKDQpCitMKGFsaWduZWRfMTZfMTEyYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTExMiglZWR4KQorTChhbGlnbmVkXzE2Xzk2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTk2KCVlZHgpCitMKGFsaWduZWRfMTZfODBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtODAoJWVkeCkKK0woYWxpZ25lZF8xNl82NGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC02NCglZWR4KQorTChhbGlnbmVkXzE2XzQ4Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTQ4KCVlZHgpCitMKGFsaWduZWRfMTZfMzJieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMzIoJWVkeCkKK0woYWxpZ25lZF8xNl8xNmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0xNiglZWR4KQorTChhbGlnbmVkXzE2XzBieXRlcyk6CisJU0VUUlROVkFMCisJUkVUVVJOCisKKwlBTElHTiAoNCkKK0woYWxpZ25lZF8xNl8xMTZieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTE2KCVlZHgpCitMKGFsaWduZWRfMTZfMTAwYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTEwMCglZWR4KQorTChhbGlnbmVkXzE2Xzg0Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTg0KCVlZHgpCitMKGFsaWduZWRfMTZfNjhieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNjgoJWVkeCkKK0woYWxpZ25lZF8xNl81MmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC01MiglZWR4KQorTChhbGlnbmVkXzE2XzM2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTM2KCVlZHgpCitMKGFsaWduZWRfMTZfMjBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMjAoJWVkeCkKK0woYWxpZ25lZF8xNl80Ynl0ZXMpOgorCW1vdmwJJWVheCwgLTQoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCUFMSUdOICg0KQorTChhbGlnbmVkXzE2XzEyMGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0xMjAoJWVkeCkKK0woYWxpZ25lZF8xNl8xMDRieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTA0KCVlZHgpCitMKGFsaWduZWRfMTZfODhieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtODgoJWVkeCkKK0woYWxpZ25lZF8xNl83MmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC03MiglZWR4KQorTChhbGlnbmVkXzE2XzU2Ynl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTU2KCVlZHgpCitMKGFsaWduZWRfMTZfNDBieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNDAoJWVkeCkKK0woYWxpZ25lZF8xNl8yNGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0yNCglZWR4KQorTChhbGlnbmVkXzE2XzhieXRlcyk6CisJbW92cQkleG1tMCwgLTgoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworCUFMSUdOICg0KQorTChhbGlnbmVkXzE2XzEyNGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0xMjQoJWVkeCkKK0woYWxpZ25lZF8xNl8xMDhieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtMTA4KCVlZHgpCitMKGFsaWduZWRfMTZfOTJieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtOTIoJWVkeCkKK0woYWxpZ25lZF8xNl83NmJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC03NiglZWR4KQorTChhbGlnbmVkXzE2XzYwYnl0ZXMpOgorCW1vdmRxYQkleG1tMCwgLTYwKCVlZHgpCitMKGFsaWduZWRfMTZfNDRieXRlcyk6CisJbW92ZHFhCSV4bW0wLCAtNDQoJWVkeCkKK0woYWxpZ25lZF8xNl8yOGJ5dGVzKToKKwltb3ZkcWEJJXhtbTAsIC0yOCglZWR4KQorTChhbGlnbmVkXzE2XzEyYnl0ZXMpOgorCW1vdnEJJXhtbTAsIC0xMiglZWR4KQorCW1vdmwJJWVheCwgLTQoJWVkeCkKKwlTRVRSVE5WQUwKKwlSRVRVUk4KKworRU5EIChzc2UyX21lbXNldDMyX2F0b20pCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvbWVtb3J5LmMgYi9saWJjdXRpbHMvbWVtb3J5LmMKaW5kZXggZWY2YzdlNi4uNjQ4NmI0NSAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL21lbW9yeS5jCisrKyBiL2xpYmN1dGlscy9tZW1vcnkuYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSA8Y3V0aWxzL21lbW9yeS5oPgogCisjaWYgIUhBVkVfTUVNU0VUMTYKIHZvaWQgYW5kcm9pZF9tZW1zZXQxNih1aW50MTZfdCogZHN0LCB1aW50MTZfdCB2YWx1ZSwgc2l6ZV90IHNpemUpCiB7CiAgICAgc2l6ZSA+Pj0gMTsKQEAgLTIzLDcgKzI0LDkgQEAKICAgICAgICAgKmRzdCsrID0gdmFsdWU7CiAgICAgfQogfQorI2VuZGlmCiAKKyNpZiAhSEFWRV9NRU1TRVQzMgogdm9pZCBhbmRyb2lkX21lbXNldDMyKHVpbnQzMl90KiBkc3QsIHVpbnQzMl90IHZhbHVlLCBzaXplX3Qgc2l6ZSkKIHsKICAgICBzaXplID4+PSAyOwpAQCAtMzEsNiArMzQsNyBAQAogICAgICAgICAqZHN0KysgPSB2YWx1ZTsKICAgICB9CiB9CisjZW5kaWYKIAogI2lmICFIQVZFX1NUUkxDUFkKIC8qCmRpZmYgLS1naXQgYS9saWJkaXNrY29uZmlnL0FuZHJvaWQubWsgYi9saWJkaXNrY29uZmlnL0FuZHJvaWQubWsKaW5kZXggMWQwZWNiNC4uYzg4Nzk1NSAxMDA2NDQKLS0tIGEvbGliZGlza2NvbmZpZy9BbmRyb2lkLm1rCisrKyBiL2xpYmRpc2tjb25maWcvQW5kcm9pZC5tawpAQCAtMywxNyArMywyNSBAQAogCiBpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQogCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKK2NvbW1vblNvdXJjZXMgOj0gXAogCWRpc2tjb25maWcuYyBcCiAJZGlza3V0aWxzLmMgXAogCXdyaXRlX2xzdC5jIFwKIAljb25maWdfbWJyLmMKIAoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVMgOj0gJChjb21tb25Tb3VyY2VzKQogTE9DQUxfTU9EVUxFIDo9IGxpYmRpc2tjb25maWcKIExPQ0FMX1NZU1RFTV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJsb2cgbGliYwotCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKK2lmZXEgKCQoSE9TVF9PUyksbGludXgpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNvbW1vblNvdXJjZXMpCitMT0NBTF9NT0RVTEUgOj0gbGliZGlza2NvbmZpZ19ob3N0CitMT0NBTF9TWVNURU1fU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMKK0xPQ0FMX0NGTEFHUyA6PSAtTzIgLWcgLVcgLVdhbGwgLVdlcnJvciAtRF9MQVJHRUZJTEU2NF9TT1VSQ0UKK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQorZW5kaWYgIyBIT1NUX09TID09IGxpbnV4CisKIGVuZGlmICAjICEgVEFSR0VUX1NJTVVMQVRPUgpkaWZmIC0tZ2l0IGEvbGlibG9nL2xvZ2Rfd3JpdGUuYyBiL2xpYmxvZy9sb2dkX3dyaXRlLmMKaW5kZXggOTkyM2JiYS4uYTBhNzUzYiAxMDA2NDQKLS0tIGEvbGlibG9nL2xvZ2Rfd3JpdGUuYworKysgYi9saWJsb2cvbG9nZF93cml0ZS5jCkBAIC01Niw3ICs1Niw3IEBACiAgKiB0aGUgc2ltdWxhdG9yIHJhdGhlciB0aGFuIGEgZGVza3RvcCB0b29sIGFuZCB3YW50IHRvIHVzZSB0aGUgZGV2aWNlLgogICovCiBzdGF0aWMgZW51bSB7Ci0gICAga0xvZ1VuaW5pdGlhbGl6ZWQsIGtMb2dOb3RBdmFpbGFibGUsIGtMb2dBdmFpbGFibGUgCisgICAga0xvZ1VuaW5pdGlhbGl6ZWQsIGtMb2dOb3RBdmFpbGFibGUsIGtMb2dBdmFpbGFibGUKIH0gZ19sb2dfc3RhdHVzID0ga0xvZ1VuaW5pdGlhbGl6ZWQ7CiBpbnQgX19hbmRyb2lkX2xvZ19kZXZfYXZhaWxhYmxlKHZvaWQpCiB7CkBAIC0xODksNyArMTg5LDcgQEAKIAogaW50IF9fYW5kcm9pZF9sb2dfdnByaW50KGludCBwcmlvLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKIHsKLSAgICBjaGFyIGJ1ZltMT0dfQlVGX1NJWkVdOyAgICAKKyAgICBjaGFyIGJ1ZltMT0dfQlVGX1NJWkVdOwogCiAgICAgdnNucHJpbnRmKGJ1ZiwgTE9HX0JVRl9TSVpFLCBmbXQsIGFwKTsKIApAQCAtMjIzLDEyICsyMjMsMjMgQEAKIHZvaWQgX19hbmRyb2lkX2xvZ19hc3NlcnQoY29uc3QgY2hhciAqY29uZCwgY29uc3QgY2hhciAqdGFnLAogCQkJICBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKLSAgICB2YV9saXN0IGFwOwotICAgIGNoYXIgYnVmW0xPR19CVUZfU0laRV07ICAgIAorICAgIGNoYXIgYnVmW0xPR19CVUZfU0laRV07CiAKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICB2c25wcmludGYoYnVmLCBMT0dfQlVGX1NJWkUsIGZtdCwgYXApOwotICAgIHZhX2VuZChhcCk7CisgICAgaWYgKGZtdCkgeworICAgICAgICB2YV9saXN0IGFwOworICAgICAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICAgICAgdnNucHJpbnRmKGJ1ZiwgTE9HX0JVRl9TSVpFLCBmbXQsIGFwKTsKKyAgICAgICAgdmFfZW5kKGFwKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBNc2cgbm90IHByb3ZpZGVkLCBsb2cgY29uZGl0aW9uLiAgTi5CLiBEbyBub3QgdXNlIGNvbmQgZGlyZWN0bHkgYXMKKyAgICAgICAgICogZm9ybWF0IHN0cmluZyBhcyBpdCBjb3VsZCBjb250YWluIHNwdXJpb3VzICclJyBzeW50YXggKGUuZy4KKyAgICAgICAgICogIiVkIiBpbiAiYmxvY2tzJWRldnMgPT0gMCIpLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGNvbmQpCisgICAgICAgICAgICBzbnByaW50ZihidWYsIExPR19CVUZfU0laRSwgIkFzc2VydGlvbiBmYWlsZWQ6ICVzIiwgY29uZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cmNweShidWYsICJVbnNwZWNpZmllZCBhc3NlcnRpb24gZmFpbGVkIik7CisgICAgfQogCiAgICAgX19hbmRyb2lkX2xvZ193cml0ZShBTkRST0lEX0xPR19GQVRBTCwgdGFnLCBidWYpOwogCmRpZmYgLS1naXQgYS9saWJuZXR1dGlscy9kaGNwX3V0aWxzLmMgYi9saWJuZXR1dGlscy9kaGNwX3V0aWxzLmMKaW5kZXggZGM3MWJhYi4uMDY0ZWIwYyAxMDA2NDQKLS0tIGEvbGlibmV0dXRpbHMvZGhjcF91dGlscy5jCisrKyBiL2xpYm5ldHV0aWxzL2RoY3BfdXRpbHMuYwpAQCAtMTE2LDYgKzExNiwxNCBAQAogICAgIH0KIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmlwYWRkcl90b19zdHJpbmcoaW5fYWRkcl90IGFkZHIpCit7CisgICAgc3RydWN0IGluX2FkZHIgaW5fYWRkcjsKKworICAgIGluX2FkZHIuc19hZGRyID0gYWRkcjsKKyAgICByZXR1cm4gaW5ldF9udG9hKGluX2FkZHIpOworfQorCiAvKgogICogU3RhcnQgdGhlIGRoY3AgY2xpZW50IGRhZW1vbiwgYW5kIHdhaXQgZm9yIGl0IHRvIGZpbmlzaAogICogY29uZmlndXJpbmcgdGhlIGludGVyZmFjZS4KQEAgLTE3Miw3ICsxODAsMTMgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBpZiAoc3RyY21wKHByb3BfdmFsdWUsICJvayIpID09IDApIHsKKyAgICAgICAgY2hhciBkbnNfcHJvcF9uYW1lW1BST1BFUlRZX0tFWV9NQVhdOwogICAgICAgICBmaWxsX2lwX2luZm8oaW50ZXJmYWNlLCBpcGFkZHIsIGdhdGV3YXksIG1hc2ssIGRuczEsIGRuczIsIHNlcnZlciwgbGVhc2UpOworICAgICAgICAvKiBjb3B5IHRoZSBkaGNwLlhYWC5kbnMgcHJvcGVydGllcyB0byBuZXQuWFhYLmRucyAqLworICAgICAgICBzbnByaW50ZihkbnNfcHJvcF9uYW1lLCBzaXplb2YoZG5zX3Byb3BfbmFtZSksICJuZXQuJXMuZG5zMSIsIGludGVyZmFjZSk7CisgICAgICAgIHByb3BlcnR5X3NldChkbnNfcHJvcF9uYW1lLCAqZG5zMSA/IGlwYWRkcl90b19zdHJpbmcoKmRuczEpIDogIiIpOworICAgICAgICBzbnByaW50ZihkbnNfcHJvcF9uYW1lLCBzaXplb2YoZG5zX3Byb3BfbmFtZSksICJuZXQuJXMuZG5zMiIsIGludGVyZmFjZSk7CisgICAgICAgIHByb3BlcnR5X3NldChkbnNfcHJvcF9uYW1lLCAqZG5zMiA/IGlwYWRkcl90b19zdHJpbmcoKmRuczIpIDogIiIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9IGVsc2UgewogICAgICAgICBzbnByaW50ZihlcnJtc2csIHNpemVvZihlcnJtc2cpLCAiREhDUCByZXN1bHQgd2FzICVzIiwgcHJvcF92YWx1ZSk7CkBAIC0yODYsNCArMzAwLDQgQEAKICAgICAgICAgc25wcmludGYoZXJybXNnLCBzaXplb2YoZXJybXNnKSwgIkRIQ1AgUmVuZXcgcmVzdWx0IHdhcyAlcyIsIHByb3BfdmFsdWUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2xpYm5ldHV0aWxzL2RoY3BjbGllbnQuYyBiL2xpYm5ldHV0aWxzL2RoY3BjbGllbnQuYwppbmRleCA2NzU1YmExLi5mZjAwNDMyIDEwMDY0NAotLS0gYS9saWJuZXR1dGlscy9kaGNwY2xpZW50LmMKKysrIGIvbGlibmV0dXRpbHMvZGhjcGNsaWVudC5jCkBAIC0zNiw4ICszNiw4IEBACiAKICNpbmNsdWRlIDxkaXJlbnQuaD4KIAorI2luY2x1ZGUgPG5ldHV0aWxzL2lmYy5oPgogI2luY2x1ZGUgImRoY3Btc2cuaCIKLSNpbmNsdWRlICJpZmNfdXRpbHMuaCIKICNpbmNsdWRlICJwYWNrZXQuaCIKIAogI2RlZmluZSBWRVJCT1NFIDIKQEAgLTg1LDE2ICs4NSwxMiBAQAogLy8gICAgZXhpdCgxKTsKIH0KIAotY29uc3QgY2hhciAqaXBhZGRyKHVpbnQzMl90IGFkZHIpCitjb25zdCBjaGFyICppcGFkZHIoaW5fYWRkcl90IGFkZHIpCiB7Ci0gICAgc3RhdGljIGNoYXIgYnVmWzMyXTsKKyAgICBzdHJ1Y3QgaW5fYWRkciBpbl9hZGRyOwogCi0gICAgc3ByaW50ZihidWYsIiVkLiVkLiVkLiVkIiwKLSAgICAgICAgICAgIGFkZHIgJiAyNTUsCi0gICAgICAgICAgICAoKGFkZHIgPj4gOCkgJiAyNTUpLAotICAgICAgICAgICAgKChhZGRyID4+IDE2KSAmIDI1NSksCi0gICAgICAgICAgICAoYWRkciA+PiAyNCkpOwotICAgIHJldHVybiBidWY7CisgICAgaW5fYWRkci5zX2FkZHIgPSBhZGRyOworICAgIHJldHVybiBpbmV0X250b2EoaW5fYWRkcik7CiB9CiAKIHR5cGVkZWYgc3RydWN0IGRoY3BfaW5mbyBkaGNwX2luZm87CkBAIC0xMjgsMzEgKzEyNCwxMSBAQAogICAgICpsZWFzZSA9IGxhc3RfZ29vZF9pbmZvLmxlYXNlOwogfQogCi1zdGF0aWMgaW50IGlmY19jb25maWd1cmUoY29uc3QgY2hhciAqaWZuYW1lLCBkaGNwX2luZm8gKmluZm8pCitzdGF0aWMgaW50IGRoY3BfY29uZmlndXJlKGNvbnN0IGNoYXIgKmlmbmFtZSwgZGhjcF9pbmZvICppbmZvKQogewotICAgIGNoYXIgZG5zX3Byb3BfbmFtZVtQUk9QRVJUWV9LRVlfTUFYXTsKLQotICAgIGlmIChpZmNfc2V0X2FkZHIoaWZuYW1lLCBpbmZvLT5pcGFkZHIpKSB7Ci0gICAgICAgIHByaW50ZXJyKCJmYWlsZWQgdG8gc2V0IGlwYWRkciAlczogJXNcbiIsIGlwYWRkcihpbmZvLT5pcGFkZHIpLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChpZmNfc2V0X21hc2soaWZuYW1lLCBpbmZvLT5uZXRtYXNrKSkgewotICAgICAgICBwcmludGVycigiZmFpbGVkIHRvIHNldCBuZXRtYXNrICVzOiAlc1xuIiwgaXBhZGRyKGluZm8tPm5ldG1hc2spLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChpZmNfY3JlYXRlX2RlZmF1bHRfcm91dGUoaWZuYW1lLCBpbmZvLT5nYXRld2F5KSkgewotICAgICAgICBwcmludGVycigiZmFpbGVkIHRvIHNldCBkZWZhdWx0IHJvdXRlICVzOiAlc1xuIiwgaXBhZGRyKGluZm8tPmdhdGV3YXkpLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc25wcmludGYoZG5zX3Byb3BfbmFtZSwgc2l6ZW9mKGRuc19wcm9wX25hbWUpLCAibmV0LiVzLmRuczEiLCBpZm5hbWUpOwotICAgIHByb3BlcnR5X3NldChkbnNfcHJvcF9uYW1lLCBpbmZvLT5kbnMxID8gaXBhZGRyKGluZm8tPmRuczEpIDogIiIpOwotICAgIHNucHJpbnRmKGRuc19wcm9wX25hbWUsIHNpemVvZihkbnNfcHJvcF9uYW1lKSwgIm5ldC4lcy5kbnMyIiwgaWZuYW1lKTsKLSAgICBwcm9wZXJ0eV9zZXQoZG5zX3Byb3BfbmFtZSwgaW5mby0+ZG5zMiA/IGlwYWRkcihpbmZvLT5kbnMyKSA6ICIiKTsKLQogICAgIGxhc3RfZ29vZF9pbmZvID0gKmluZm87Ci0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gaWZjX2NvbmZpZ3VyZShpZm5hbWUsIGluZm8tPmlwYWRkciwgaW5mby0+bmV0bWFzaywgaW5mby0+Z2F0ZXdheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5kbnMxLCBpbmZvLT5kbnMyKTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKmRoY3BfdHlwZV90b19uYW1lKHVpbnQzMl90IHR5cGUpCkBAIC00NDksNyArNDI1LDcgQEAKICAgICAgICAgICAgICAgICBwcmludGVycigidGltZWQgb3V0XG4iKTsKICAgICAgICAgICAgICAgICBpZiAoIGluZm8udHlwZSA9PSBESENQT0ZGRVIgKSB7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZXJyKCJubyBhY2tub3dsZWRnZW1lbnQgZnJvbSBESENQIHNlcnZlclxuY29uZmlndXJpbmcgJXMgd2l0aCBvZmZlcmVkIHBhcmFtZXRlcnNcbiIsIGlmbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpZmNfY29uZmlndXJlKGlmbmFtZSwgJmluZm8pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGhjcF9jb25maWd1cmUoaWZuYW1lLCAmaW5mbyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVycm5vID0gRVRJTUU7CiAgICAgICAgICAgICAgICAgY2xvc2Uocyk7CkBAIC01MzAsNyArNTA2LDcgQEAKICAgICAgICAgICAgIGlmIChpbmZvLnR5cGUgPT0gREhDUEFDSykgewogICAgICAgICAgICAgICAgIHByaW50ZXJyKCJjb25maWd1cmluZyAlc1xuIiwgaWZuYW1lKTsKICAgICAgICAgICAgICAgICBjbG9zZShzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaWZjX2NvbmZpZ3VyZShpZm5hbWUsICZpbmZvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGhjcF9jb25maWd1cmUoaWZuYW1lLCAmaW5mbyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZm8udHlwZSA9PSBESENQTkFLKSB7CiAgICAgICAgICAgICAgICAgcHJpbnRlcnIoImNvbmZpZ3VyYXRpb24gcmVxdWVzdCBkZW5pZWRcbiIpOwogICAgICAgICAgICAgICAgIGNsb3NlKHMpOwpkaWZmIC0tZ2l0IGEvbGlibmV0dXRpbHMvaWZjX3V0aWxzLmMgYi9saWJuZXR1dGlscy9pZmNfdXRpbHMuYwppbmRleCBiZGUzMzZmLi4wY2E1ZmU2IDEwMDY0NAotLS0gYS9saWJuZXR1dGlscy9pZmNfdXRpbHMuYworKysgYi9saWJuZXR1dGlscy9pZmNfdXRpbHMuYwpAQCAtMjcsOCArMjcsMTIgQEAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CiAjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2X3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogCiAjaWZkZWYgQU5EUk9JRApAQCAtNDMsOSArNDcsMTAgQEAKICNlbmRpZgogCiBzdGF0aWMgaW50IGlmY19jdGxfc29jayA9IC0xOworc3RhdGljIGludCBpZmNfY3RsX3NvY2s2ID0gLTE7CiB2b2lkIHByaW50ZXJyKGNoYXIgKmZtdCwgLi4uKTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmlwYWRkcl90b19zdHJpbmcodWludDMyX3QgYWRkcikKK3N0YXRpYyBjb25zdCBjaGFyICppcGFkZHJfdG9fc3RyaW5nKGluX2FkZHJfdCBhZGRyKQogewogICAgIHN0cnVjdCBpbl9hZGRyIGluX2FkZHI7CiAKQEAgLTY0LDYgKzY5LDE3IEBACiAgICAgcmV0dXJuIGlmY19jdGxfc29jayA8IDAgPyAtMSA6IDA7CiB9CiAKK2ludCBpZmNfaW5pdDYodm9pZCkKK3sKKyAgICBpZiAoaWZjX2N0bF9zb2NrNiA9PSAtMSkgeworICAgICAgICBpZmNfY3RsX3NvY2s2ID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKKyAgICAgICAgaWYgKGlmY19jdGxfc29jazYgPCAwKSB7CisgICAgICAgICAgICBwcmludGVycigic29ja2V0KCkgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaWZjX2N0bF9zb2NrNiA8IDAgPyAtMSA6IDA7Cit9CisKIHZvaWQgaWZjX2Nsb3NlKHZvaWQpCiB7CiAgICAgaWYgKGlmY19jdGxfc29jayAhPSAtMSkgewpAQCAtNzIsNiArODgsMTQgQEAKICAgICB9CiB9CiAKK3ZvaWQgaWZjX2Nsb3NlNih2b2lkKQoreworICAgIGlmIChpZmNfY3RsX3NvY2s2ICE9IC0xKSB7CisgICAgICAgICh2b2lkKWNsb3NlKGlmY19jdGxfc29jazYpOworICAgICAgICBpZmNfY3RsX3NvY2s2ID0gLTE7CisgICAgfQorfQorCiBzdGF0aWMgdm9pZCBpZmNfaW5pdF9pZnIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGlmcmVxICppZnIpCiB7CiAgICAgbWVtc2V0KGlmciwgMCwgc2l6ZW9mKHN0cnVjdCBpZnJlcSkpOwpAQCAtODgsNyArMTEyLDcgQEAKICAgICByID0gaW9jdGwoaWZjX2N0bF9zb2NrLCBTSU9DR0lGSFdBRERSLCAmaWZyKTsKICAgICBpZihyIDwgMCkgcmV0dXJuIC0xOwogCi0gICAgbWVtY3B5KHB0ciwgJmlmci5pZnJfaHdhZGRyLnNhX2RhdGEsIDYpOworICAgIG1lbWNweShwdHIsICZpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCBFVEhfQUxFTik7CiAgICAgcmV0dXJuIDA7ICAgIAogfQogCkBAIC0xNDMsNiArMTY3LDE3IEBACiAgICAgcmV0dXJuIGlvY3RsKGlmY19jdGxfc29jaywgU0lPQ1NJRkFERFIsICZpZnIpOwogfQogCitpbnQgaWZjX3NldF9od2FkZHIoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqcHRyKQoreworICAgIGludCByOworICAgIHN0cnVjdCBpZnJlcSBpZnI7CisgICAgaWZjX2luaXRfaWZyKG5hbWUsICZpZnIpOworCisgICAgaWZyLmlmcl9od2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgIG1lbWNweSgmaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgcHRyLCBFVEhfQUxFTik7CisgICAgcmV0dXJuIGlvY3RsKGlmY19jdGxfc29jaywgU0lPQ1NJRkhXQUREUiwgJmlmcik7Cit9CisKIGludCBpZmNfc2V0X21hc2soY29uc3QgY2hhciAqbmFtZSwgaW5fYWRkcl90IG1hc2spCiB7CiAgICAgc3RydWN0IGlmcmVxIGlmcjsKQEAgLTE4NSw0NSArMjIwLDgwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLQotaW50IGlmY19jcmVhdGVfZGVmYXVsdF9yb3V0ZShjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgYWRkcikKK2luX2FkZHJfdCBnZXRfaXB2NF9uZXRtYXNrKGludCBwcmVmaXhfbGVuZ3RoKQogewotICAgIHN0cnVjdCBydGVudHJ5IHJ0OworICAgIGluX2FkZHJfdCBtYXNrID0gMDsKIAotICAgIG1lbXNldCgmcnQsIDAsIHNpemVvZihydCkpOwotICAgIAotICAgIHJ0LnJ0X2RzdC5zYV9mYW1pbHkgPSBBRl9JTkVUOwotICAgIHJ0LnJ0X2ZsYWdzID0gUlRGX1VQIHwgUlRGX0dBVEVXQVk7Ci0gICAgcnQucnRfZGV2ID0gKHZvaWQqKSBuYW1lOwotICAgIGluaXRfc29ja2FkZHJfaW4oJnJ0LnJ0X2dlbm1hc2ssIDApOwotICAgIGluaXRfc29ja2FkZHJfaW4oJnJ0LnJ0X2dhdGV3YXksIGFkZHIpOwotICAgIAotICAgIHJldHVybiBpb2N0bChpZmNfY3RsX3NvY2ssIFNJT0NBRERSVCwgJnJ0KTsKKyAgICBtYXNrID0gfm1hc2sgPDwgKDMyIC0gcHJlZml4X2xlbmd0aCk7CisgICAgbWFzayA9IGh0b25sKG1hc2spOworCisgICAgcmV0dXJuIG1hc2s7CiB9CiAKLWludCBpZmNfYWRkX2hvc3Rfcm91dGUoY29uc3QgY2hhciAqbmFtZSwgaW5fYWRkcl90IGFkZHIpCitpbnQgaWZjX2FkZF9pcHY0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSwgc3RydWN0IGluX2FkZHIgZHN0LCBpbnQgcHJlZml4X2xlbmd0aCwKKyAgICAgIHN0cnVjdCBpbl9hZGRyIGd3KQogewogICAgIHN0cnVjdCBydGVudHJ5IHJ0OwogICAgIGludCByZXN1bHQ7CisgICAgaW5fYWRkcl90IG5ldG1hc2s7CiAKICAgICBtZW1zZXQoJnJ0LCAwLCBzaXplb2YocnQpKTsKLSAgICAKKwogICAgIHJ0LnJ0X2RzdC5zYV9mYW1pbHkgPSBBRl9JTkVUOwotICAgIHJ0LnJ0X2ZsYWdzID0gUlRGX1VQIHwgUlRGX0hPU1Q7Ci0gICAgcnQucnRfZGV2ID0gKHZvaWQqKSBuYW1lOwotICAgIGluaXRfc29ja2FkZHJfaW4oJnJ0LnJ0X2RzdCwgYWRkcik7Ci0gICAgaW5pdF9zb2NrYWRkcl9pbigmcnQucnRfZ2VubWFzaywgMCk7Ci0gICAgaW5pdF9zb2NrYWRkcl9pbigmcnQucnRfZ2F0ZXdheSwgMCk7Ci0gICAgCisgICAgcnQucnRfZGV2ID0gKHZvaWQqKSBpZm5hbWU7CisKKyAgICBuZXRtYXNrID0gZ2V0X2lwdjRfbmV0bWFzayhwcmVmaXhfbGVuZ3RoKTsKKyAgICBpbml0X3NvY2thZGRyX2luKCZydC5ydF9nZW5tYXNrLCBuZXRtYXNrKTsKKyAgICBpbml0X3NvY2thZGRyX2luKCZydC5ydF9kc3QsIGRzdC5zX2FkZHIpOworICAgIHJ0LnJ0X2ZsYWdzID0gUlRGX1VQOworCisgICAgaWYgKHByZWZpeF9sZW5ndGggPT0gMzIpIHsKKyAgICAgICAgcnQucnRfZmxhZ3MgfD0gUlRGX0hPU1Q7CisgICAgfQorCisgICAgaWYgKGd3LnNfYWRkciAhPSAwKSB7CisgICAgICAgIHJ0LnJ0X2ZsYWdzIHw9IFJURl9HQVRFV0FZOworICAgICAgICBpbml0X3NvY2thZGRyX2luKCZydC5ydF9nYXRld2F5LCBndy5zX2FkZHIpOworICAgIH0KKwogICAgIGlmY19pbml0KCk7CisKKyAgICBpZiAoaWZjX2N0bF9zb2NrIDwgMCkgeworICAgICAgICByZXR1cm4gLWVycm5vOworICAgIH0KKwogICAgIHJlc3VsdCA9IGlvY3RsKGlmY19jdGxfc29jaywgU0lPQ0FERFJULCAmcnQpOwotICAgIGlmIChyZXN1bHQgPCAwICYmIGVycm5vID09IEVFWElTVCkgewotICAgICAgICByZXN1bHQgPSAwOworICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFRVhJU1QpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSAtZXJybm87CisgICAgICAgIH0KICAgICB9CiAgICAgaWZjX2Nsb3NlKCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAoraW50IGlmY19jcmVhdGVfZGVmYXVsdF9yb3V0ZShjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgZ3cpCit7CisgICAgc3RydWN0IGluX2FkZHIgaW5fZHN0LCBpbl9ndzsKKworICAgIGluX2RzdC5zX2FkZHIgPSAwOworICAgIGluX2d3LnNfYWRkciA9IGd3OworCisgICAgcmV0dXJuIGlmY19hZGRfaXB2NF9yb3V0ZShuYW1lLCBpbl9kc3QsIDAsIGluX2d3KTsKK30KKworaW50IGlmY19hZGRfaG9zdF9yb3V0ZShjb25zdCBjaGFyICpuYW1lLCBpbl9hZGRyX3QgZHN0KQoreworICAgIHN0cnVjdCBpbl9hZGRyIGluX2RzdCwgaW5fZ3c7CisKKyAgICBpbl9kc3Quc19hZGRyID0gZHN0OworICAgIGluX2d3LnNfYWRkciA9IDA7CisKKyAgICByZXR1cm4gaWZjX2FkZF9pcHY0X3JvdXRlKG5hbWUsIGluX2RzdCwgMzIsIGluX2d3KTsKK30KKwogaW50IGlmY19lbmFibGUoY29uc3QgY2hhciAqaWZuYW1lKQogewogICAgIGludCByZXN1bHQ7CkBAIC00MjksMTAgKzQ5OSwxMTkgQEAKIAogICAgIGlmY19jbG9zZSgpOwogCi0gICAgc25wcmludGYoZG5zX3Byb3BfbmFtZSwgc2l6ZW9mKGRuc19wcm9wX25hbWUpLCAiZGhjcC4lcy5kbnMxIiwgaWZuYW1lKTsKKyAgICBzbnByaW50ZihkbnNfcHJvcF9uYW1lLCBzaXplb2YoZG5zX3Byb3BfbmFtZSksICJuZXQuJXMuZG5zMSIsIGlmbmFtZSk7CiAgICAgcHJvcGVydHlfc2V0KGRuc19wcm9wX25hbWUsIGRuczEgPyBpcGFkZHJfdG9fc3RyaW5nKGRuczEpIDogIiIpOwotICAgIHNucHJpbnRmKGRuc19wcm9wX25hbWUsIHNpemVvZihkbnNfcHJvcF9uYW1lKSwgImRoY3AuJXMuZG5zMiIsIGlmbmFtZSk7CisgICAgc25wcmludGYoZG5zX3Byb3BfbmFtZSwgc2l6ZW9mKGRuc19wcm9wX25hbWUpLCAibmV0LiVzLmRuczIiLCBpZm5hbWUpOwogICAgIHByb3BlcnR5X3NldChkbnNfcHJvcF9uYW1lLCBkbnMyID8gaXBhZGRyX3RvX3N0cmluZyhkbnMyKSA6ICIiKTsKIAogICAgIHJldHVybiAwOwogfQorCitpbnQgaWZjX2FkZF9pcHY2X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSwgc3RydWN0IGluNl9hZGRyIGRzdCwgaW50IHByZWZpeF9sZW5ndGgsCisgICAgICBzdHJ1Y3QgaW42X2FkZHIgZ3cpCit7CisgICAgc3RydWN0IGluNl9ydG1zZyBydG1zZzsKKyAgICBpbnQgcmVzdWx0OworICAgIGludCBpZmluZGV4OworCisgICAgbWVtc2V0KCZydG1zZywgMCwgc2l6ZW9mKHJ0bXNnKSk7CisKKyAgICBpZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoaWZuYW1lKTsKKyAgICBpZiAoaWZpbmRleCA9PSAwKSB7CisgICAgICAgIHByaW50ZXJyKCJpZl9uYW1ldG9pbmRleCgpIGZhaWxlZDogaW50ZXJmYWNlICVzXG4iLCBpZm5hbWUpOworICAgICAgICByZXR1cm4gLUVOWElPOworICAgIH0KKworICAgIHJ0bXNnLnJ0bXNnX2lmaW5kZXggPSBpZmluZGV4OworICAgIHJ0bXNnLnJ0bXNnX2RzdCA9IGRzdDsKKyAgICBydG1zZy5ydG1zZ19kc3RfbGVuID0gcHJlZml4X2xlbmd0aDsKKyAgICBydG1zZy5ydG1zZ19mbGFncyA9IFJURl9VUDsKKworICAgIGlmIChwcmVmaXhfbGVuZ3RoID09IDEyOCkgeworICAgICAgICBydG1zZy5ydG1zZ19mbGFncyB8PSBSVEZfSE9TVDsKKyAgICB9CisKKyAgICBpZiAobWVtY21wKCZndywgJmluNmFkZHJfYW55LCBzaXplb2YoaW42YWRkcl9hbnkpKSkgeworICAgICAgICBydG1zZy5ydG1zZ19mbGFncyB8PSBSVEZfR0FURVdBWTsKKyAgICAgICAgcnRtc2cucnRtc2dfZ2F0ZXdheSA9IGd3OworICAgIH0KKworICAgIGlmY19pbml0NigpOworCisgICAgaWYgKGlmY19jdGxfc29jazYgPCAwKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgcmVzdWx0ID0gaW9jdGwoaWZjX2N0bF9zb2NrNiwgU0lPQ0FERFJULCAmcnRtc2cpOworICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFRVhJU1QpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSAtZXJybm87CisgICAgICAgIH0KKyAgICB9CisgICAgaWZjX2Nsb3NlNigpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBpZmNfYWRkX3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSwgY29uc3QgY2hhciAqZHN0LCBpbnQgcHJlZml4X2xlbmd0aCwKKyAgICAgIGNvbnN0IGNoYXIgKmd3KQoreworICAgIGludCByZXQgPSAwOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBpcHY0X2RzdCwgaXB2NF9ndzsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGlwdjZfZHN0LCBpcHY2X2d3OworICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKmFkZHJfYWksICpnd19haTsKKworICAgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsgIC8qIEFsbG93IElQdjQgb3IgSVB2NiAqLworICAgIGhpbnRzLmFpX2ZsYWdzID0gQUlfTlVNRVJJQ0hPU1Q7CisKKyAgICByZXQgPSBnZXRhZGRyaW5mbyhkc3QsIE5VTEwsICZoaW50cywgJmFkZHJfYWkpOworCisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIHByaW50ZXJyKCJnZXRhZGRyaW5mbyBmYWlsZWQ6IGludmFsaWQgYWRkcmVzcyAlc1xuIiwgZHN0KTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGd3ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGFkZHJfYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUNikgeworICAgICAgICAgICAgZ3cgPSAiOjoiOworICAgICAgICB9IGVsc2UgaWYgKGFkZHJfYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisgICAgICAgICAgICBndyA9ICIwLjAuMC4wIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IGdldGFkZHJpbmZvKGd3LCBOVUxMLCAmaGludHMsICZnd19haSk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIHByaW50ZXJyKCJnZXRhZGRyaW5mbyBmYWlsZWQ6IGludmFsaWQgZ2F0ZXdheSAlc1xuIiwgZ3cpOworICAgICAgICBmcmVlYWRkcmluZm8oYWRkcl9haSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChhZGRyX2FpLT5haV9mYW1pbHkgIT0gZ3dfYWktPmFpX2ZhbWlseSkgeworICAgICAgICBwcmludGVycigiaWZjX2FkZF9yb3V0ZTogZGlmZmVyZW50IGFkZHJlc3MgZmFtaWxpZXM6ICVzIGFuZCAlc1xuIiwgZHN0LCBndyk7CisgICAgICAgIGZyZWVhZGRyaW5mbyhhZGRyX2FpKTsKKyAgICAgICAgZnJlZWFkZHJpbmZvKGd3X2FpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGFkZHJfYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUNikgeworICAgICAgICBtZW1jcHkoJmlwdjZfZHN0LCBhZGRyX2FpLT5haV9hZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworICAgICAgICBtZW1jcHkoJmlwdjZfZ3csIGd3X2FpLT5haV9hZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworICAgICAgICByZXQgPSBpZmNfYWRkX2lwdjZfcm91dGUoaWZuYW1lLCBpcHY2X2RzdC5zaW42X2FkZHIsIHByZWZpeF9sZW5ndGgsCisgICAgICAgICAgICAgIGlwdjZfZ3cuc2luNl9hZGRyKTsKKyAgICB9IGVsc2UgaWYgKGFkZHJfYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisgICAgICAgIG1lbWNweSgmaXB2NF9kc3QsIGFkZHJfYWktPmFpX2FkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKyAgICAgICAgbWVtY3B5KCZpcHY0X2d3LCBnd19haS0+YWlfYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworICAgICAgICByZXQgPSBpZmNfYWRkX2lwdjRfcm91dGUoaWZuYW1lLCBpcHY0X2RzdC5zaW5fYWRkciwgcHJlZml4X2xlbmd0aCwKKyAgICAgICAgICAgICAgaXB2NF9ndy5zaW5fYWRkcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRlcnIoImlmY19hZGRfcm91dGU6IGdldGFkZHJpbmZvIHJldHVybmVkIHVuIHN1cHBvcnRlZCBhZGRyZXNzIGZhbWlseSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGFkZHJfYWktPmFpX2ZhbWlseSk7CisgICAgICAgIHJldCA9IC1FQUZOT1NVUFBPUlQ7CisgICAgfQorCisgICAgZnJlZWFkZHJpbmZvKGFkZHJfYWkpOworICAgIGZyZWVhZGRyaW5mbyhnd19haSk7CisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2xpYm5ldHV0aWxzL2lmY191dGlscy5oIGIvbGlibmV0dXRpbHMvaWZjX3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Yjg3NDcuLjAwMDAwMDAKLS0tIGEvbGlibmV0dXRpbHMvaWZjX3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0lGQ19VVElMU19IXwotI2RlZmluZSBfSUZDX1VUSUxTX0hfCi0KLWludCBpZmNfaW5pdCh2b2lkKTsKLQotaW50IGlmY19nZXRfaWZpbmRleChjb25zdCBjaGFyICpuYW1lLCBpbnQgKmlmX2luZGV4cCk7Ci1pbnQgaWZjX2dldF9od2FkZHIoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcHRyKTsKLQotaW50IGlmY191cChjb25zdCBjaGFyICpuYW1lKTsKLWludCBpZmNfZG93bihjb25zdCBjaGFyICpuYW1lKTsKLQotaW50IGlmY19zZXRfYWRkcihjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBhZGRyKTsKLWludCBpZmNfc2V0X21hc2soY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbWFzayk7Ci0KLWludCBpZmNfY3JlYXRlX2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgYWRkcik7Ci0KLWludCBpZmNfZ2V0X2luZm8oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgKmFkZHIsIHVuc2lnbmVkICptYXNrLCB1bnNpZ25lZCAqZmxhZ3MpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9BbmRyb2lkLm1rIGIvbGlicGl4ZWxmbGluZ2VyL0FuZHJvaWQubWsKaW5kZXggNjQ5MWQyNC4uZWQyYWI1ZSAxMDA2NDQKLS0tIGEvbGlicGl4ZWxmbGluZ2VyL0FuZHJvaWQubWsKKysrIGIvbGlicGl4ZWxmbGluZ2VyL0FuZHJvaWQubWsKQEAgLTIsMTcgKzIsNiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKICMKLSMgQVJNdjYgc3BlY2lmaWMgb2JqZWN0cwotIwotCi1pZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCi1MT0NBTF9BU0ZMQUdTIDo9IC1tYXJjaD1hcm12NgotTE9DQUxfU1JDX0ZJTEVTIDo9IHJvdGF0ZTkwQ1dfNHg0XzE2djYuUwotTE9DQUxfTU9EVUxFIDo9IGxpYnBpeGVsZmxpbmdlcl9hcm12NgotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotZW5kaWYKLQotIwogIyBDL0MrKyBhbmQgQVJNdjUgb2JqZWN0cwogIwogCkBAIC03NywxMCArNjYsNiBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJoYXJkd2FyZV9sZWdhY3kKIExPQ0FMX0NGTEFHUyArPSAtRFdJVEhfTElCX0hBUkRXQVJFCiBlbmRpZgotCi1pZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCi1MT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnBpeGVsZmxpbmdlcl9hcm12NgotZW5kaWYKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIAogIwpAQCAtOTEsOSArNzYsNiBAQAogTE9DQUxfTU9EVUxFOj0gbGlicGl4ZWxmbGluZ2VyX3N0YXRpYwogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoUElYRUxGTElOR0VSX1NSQ19GSUxFUykKIExPQ0FMX0NGTEFHUyA6PSAkKFBJWEVMRkxJTkdFUl9DRkxBR1MpIAotaWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQotTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJwaXhlbGZsaW5nZXJfYXJtdjYKLWVuZGlmCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKIApkaWZmIC0tZ2l0IGEvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlci5jcHAgYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyLmNwcAppbmRleCBkMzcyMGMzLi40NzI2YTA4IDEwMDY0NAotLS0gYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyLmNwcAorKysgYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyLmNwcApAQCAtMzM0LDcgKzMzNCw3IEBACiAKIHZvaWQgQVJNQXNzZW1ibGVyOjpTVE0oaW50IGNjLCBpbnQgZGlyLAogICAgICAgICBpbnQgUm4sIGludCBXLCB1aW50MzJfdCByZWdfbGlzdCkKLXsgICAvLyAgICAgICAgICAgICAgICAgICAgRkEgRUEgRkQgRUQgICAgICBJQiBJQSBEQiBEQQoreyAgIC8vICAgICAgICAgICAgICAgICAgICBFRCBGRCBFQSBGQSAgICAgIElCIElBIERCIERBCiAgICAgY29uc3QgdWludDhfdCBQWzhdID0geyAwLCAxLCAwLCAxLCAgICAgIDEsIDAsIDEsIDAgfTsKICAgICBjb25zdCB1aW50OF90IFVbOF0gPSB7IDAsIDAsIDEsIDEsICAgICAgMSwgMSwgMCwgMCB9OwogICAgICptUEMrKyA9IChjYzw8MjgpIHwgKDQ8PDI1KSB8ICh1aW50MzJfdChQW2Rpcl0pPDwyNCkgfApAQCAtNDMzLDYgKzQzMywxNiBAQAogewogICAgICptUEMrKyA9IChjYzw8MjgpIHwgMHg2Q0YwMDcwIHwgKFJkPDwxMikgfCAoKHJvdGF0ZSA+PiAzKSA8PCAxMCkgfCBSbTsKIH0KKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIEJpdCBtYW5pcHVsYXRpb24gKEFSTXY3KyBvbmx5KS4uLgorI2VuZGlmCisKKy8vIEJpdCBtYW5pcHVsYXRpb24gKEFSTXY3KyBvbmx5KS4uLgordm9pZCBBUk1Bc3NlbWJsZXI6OlVCRlgoaW50IGNjLCBpbnQgUmQsIGludCBSbiwgaW50IGxzYiwgaW50IHdpZHRoKQoreworICAgICptUEMrKyA9IChjYzw8MjgpIHwgMHg3RTAwMDAwIHwgKCh3aWR0aC0xKTw8MTYpIHwgKFJkPDwxMikgfCAobHNiPDw3KSB8IDB4NTAgfCBSbjsKK30KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlci5oIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlci5oCmluZGV4IGE2NjdjYjUuLmU3ZjAzOGEgMTAwNjQ0Ci0tLSBhL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXIuaAorKysgYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyLmgKQEAgLTEyNCw2ICsxMjQsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBTTUxBVyhpbnQgY2MsIGludCB5LAogICAgICAgICAgICAgICAgIGludCBSZCwgaW50IFJtLCBpbnQgUnMsIGludCBSbik7CiAgICAgdmlydHVhbCB2b2lkIFVYVEIxNihpbnQgY2MsIGludCBSZCwgaW50IFJtLCBpbnQgcm90YXRlKTsKKyAgICB2aXJ0dWFsIHZvaWQgVUJGWChpbnQgY2MsIGludCBSZCwgaW50IFJuLCBpbnQgbHNiLCBpbnQgd2lkdGgpOwogCiBwcml2YXRlOgogICAgICAgICAgICAgICAgIEFSTUFzc2VtYmxlcihjb25zdCBBUk1Bc3NlbWJsZXImIHJocyk7CmRpZmYgLS1naXQgYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVySW50ZXJmYWNlLmggYi9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVySW50ZXJmYWNlLmgKaW5kZXggZmY2YWYyYS4uNzk2MzQyYSAxMDA2NDQKLS0tIGEvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlckludGVyZmFjZS5oCisrKyBiL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXJJbnRlcmZhY2UuaApAQCAtMjA2LDYgKzIwNiw5IEBACiAgICAgLy8gYnl0ZS9oYWxmIHdvcmQgZXh0cmFjdC4uLgogICAgIHZpcnR1YWwgdm9pZCBVWFRCMTYoaW50IGNjLCBpbnQgUmQsIGludCBSbSwgaW50IHJvdGF0ZSkgPSAwOwogCisgICAgLy8gYml0IG1hbmlwdWxhdGlvbi4uLgorICAgIHZpcnR1YWwgdm9pZCBVQkZYKGludCBjYywgaW50IFJkLCBpbnQgUm4sIGludCBsc2IsIGludCB3aWR0aCkgPSAwOworCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBjb252ZW5pZW5jZS4uLgogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyUHJveHkuY3BwIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlclByb3h5LmNwcAppbmRleCA3YzQyMmRiLi5jNTdkN2RhIDEwMDY0NAotLS0gYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvQVJNQXNzZW1ibGVyUHJveHkuY3BwCisrKyBiL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXJQcm94eS5jcHAKQEAgLTE5OSw1ICsxOTksOSBAQAogICAgIG1UYXJnZXQtPlVYVEIxNihjYywgUmQsIFJtLCByb3RhdGUpOwogfQogCit2b2lkIEFSTUFzc2VtYmxlclByb3h5OjpVQkZYKGludCBjYywgaW50IFJkLCBpbnQgUm4sIGludCBsc2IsIGludCB3aWR0aCkgeworICAgIG1UYXJnZXQtPlVCRlgoY2MsIFJkLCBSbiwgbHNiLCB3aWR0aCk7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9BUk1Bc3NlbWJsZXJQcm94eS5oIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlclByb3h5LmgKaW5kZXggOTEzNGNjZS4uOGM3ZjI3MCAxMDA2NDQKLS0tIGEvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlclByb3h5LmgKKysrIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL0FSTUFzc2VtYmxlclByb3h5LmgKQEAgLTExNSw2ICsxMTUsNyBAQAogICAgICAgICAgICAgICAgIGludCBSZCwgaW50IFJtLCBpbnQgUnMsIGludCBSbik7CiAKICAgICB2aXJ0dWFsIHZvaWQgVVhUQjE2KGludCBjYywgaW50IFJkLCBpbnQgUm0sIGludCByb3RhdGUpOworICAgIHZpcnR1YWwgdm9pZCBVQkZYKGludCBjYywgaW50IFJkLCBpbnQgUm4sIGludCBsc2IsIGludCB3aWR0aCk7CiAKIHByaXZhdGU6CiAgICAgQVJNQXNzZW1ibGVySW50ZXJmYWNlKiAgbVRhcmdldDsKZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9kaXNhc3NlbS5jIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL2Rpc2Fzc2VtLmMKaW5kZXggYzE3ZjNlYy4uYWViODAzNCAxMDA2NDQKLS0tIGEvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL2Rpc2Fzc2VtLmMKKysrIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL2Rpc2Fzc2VtLmMKQEAgLTgxLDYgKzgxLDggQEAKICAqIGcgLSAybmQgZnAgb3BlcmFuZCAocmVnaXN0ZXIpIChiaXRzIDE2LTE4KQogICogaCAtIDNyZCBmcCBvcGVyYW5kIChyZWdpc3Rlci9pbW1lZGlhdGUpIChiaXRzIDAtNCkKICAqIGogLSB4dGIgcm90YXRlIGxpdGVyYWwgKGJpdHMgMTAtMTEpCisgKiBpIC0gYmZ4IGxzYiBsaXRlcmFsIChiaXRzIDctMTEpCisgKiB3IC0gYmZ4IHdpZHRoIGxpdGVyYWwgKGJpdHMgMTYtMjApCiAgKiBiIC0gYnJhbmNoIGFkZHJlc3MKICAqIHQgLSB0aHVtYiBicmFuY2ggYWRkcmVzcyAoYml0cyAyNCwgMC0yMykKICAqIGsgLSBicmVha3BvaW50IGNvbW1lbnQgKGJpdHMgMC0zLCA4LTE5KQpAQCAtMTI0LDYgKzEyNiw3IEBACiAgICAgeyAweDBmZTAwMGYwLCAweDAwYTAwMDkwLCAidW1sYWwiLAkiU2RubXMiIH0sCiAgICAgeyAweDBmZTAwMGYwLCAweDAwZTAwMDkwLCAic21sYWwiLAkiU2RubXMiIH0sCiAgICAgeyAweDBmZmYwM2YwLCAweDA2Y2YwMDcwLCAidXh0YjE2IiwgImRtaiIgfSwKKyAgICB7IDB4MGZlMDAwNzAsIDB4MDdlMDAwNTAsICJ1YmZ4IiwgICAiZG1pdyIgfSwKICAgICB7IDB4MGQ3MDAwMDAsIDB4MDQyMDAwMDAsICJzdHJ0IiwJImRhVyIgfSwKICAgICB7IDB4MGQ3MDAwMDAsIDB4MDQzMDAwMDAsICJsZHJ0IiwJImRhVyIgfSwKICAgICB7IDB4MGQ3MDAwMDAsIDB4MDQ2MDAwMDAsICJzdHJidCIsCSJkYVciIH0sCkBAIC00MTIsNiArNDE1LDE0IEBACiAJCWNhc2UgJ2onOgogCQkJZGktPmRpX3ByaW50Zigicm9yICMlZCIsICgoaW5zbiA+PiAxMCkgJiAzKSA8PCAzKTsKIAkJCWJyZWFrOworICAgICAgICAvKiBpIC0gYmZ4IGxzYiBsaXRlcmFsIChiaXRzIDctMTEpICovCisgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgZGktPmRpX3ByaW50ZigiIyVkIiwgKGluc24gPj4gNykgJiAzMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogdyAtIGJmeCB3aWR0aCBsaXRlcmFsIChiaXRzIDE2LTIwKSAqLworICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICAgIGRpLT5kaV9wcmludGYoIiMlZCIsIDEgKyAoKGluc24gPj4gMTYpICYgMzEpKTsKKyAgICAgICAgICAgIGJyZWFrOwogCQkvKiBiIC0gYnJhbmNoIGFkZHJlc3MgKi8KIAkJY2FzZSAnYic6CiAJCQlicmFuY2ggPSAoKGluc24gPDwgMikgJiAweDAzZmZmZmZmKTsKZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9sb2FkX3N0b3JlLmNwcCBiL2xpYnBpeGVsZmxpbmdlci9jb2RlZmxpbmdlci9sb2FkX3N0b3JlLmNwcAppbmRleCA5M2M1ODI1Li5lZDIwYTAwIDEwMDY0NAotLS0gYS9saWJwaXhlbGZsaW5nZXIvY29kZWZsaW5nZXIvbG9hZF9zdG9yZS5jcHAKKysrIGIvbGlicGl4ZWxmbGluZ2VyL2NvZGVmbGluZ2VyL2xvYWRfc3RvcmUuY3BwCkBAIC0xOCw5ICsxOCwxMiBAQAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotCiAjaW5jbHVkZSAiY29kZWZsaW5nZXIvR0dMQXNzZW1ibGVyLmgiCiAKKyNpZmRlZiBfX0FSTV9BUkNIX18KKyNpbmNsdWRlIDxtYWNoaW5lL2NwdS1mZWF0dXJlcy5oPgorI2VuZGlmCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTEwLDYgKzExMywyMCBAQAogICAgIGFzc2VydChtYXNrTGVuPD04KTsKICAgICBhc3NlcnQoaCk7CiAgICAgCisjaWYgX19BUk1fQVJDSF9fID49IDcKKyAgICBjb25zdCBpbnQgbWFzayA9ICgxPDxtYXNrTGVuKS0xOworICAgIGlmICgoaCA9PSBiaXRzKSAmJiAhbCAmJiAocyAhPSBkLnJlZykpIHsKKyAgICAgICAgTU9WKEFMLCAwLCBkLnJlZywgcyk7ICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCA9IHBhY2tlZDsKKyAgICB9IGVsc2UgaWYgKChoID09IGJpdHMpICYmIGwpIHsKKyAgICAgICAgTU9WKEFMLCAwLCBkLnJlZywgcmVnX2ltbShzLCBMU1IsIGwpKTsgIC8vIGNvbXBvbmVudCA9IHBhY2tlZCA+PiBsOworICAgIH0gZWxzZSBpZiAoIWwgJiYgaXNWYWxpZEltbWVkaWF0ZShtYXNrKSkgeworICAgICAgICBBTkQoQUwsIDAsIGQucmVnLCBzLCBpbW0obWFzaykpOyAgICAgICAgLy8gY29tcG9uZW50ID0gcGFja2VkICYgbWFzazsKKyAgICB9IGVsc2UgaWYgKCFsICYmIGlzVmFsaWRJbW1lZGlhdGUofm1hc2spKSB7CisgICAgICAgIEJJQyhBTCwgMCwgZC5yZWcsIHMsIGltbSh+bWFzaykpOyAgICAgICAvLyBjb21wb25lbnQgPSBwYWNrZWQgJiBtYXNrOworICAgIH0gZWxzZSB7CisgICAgICAgIFVCRlgoQUwsIGQucmVnLCBzLCBsLCBtYXNrTGVuKTsgICAgICAgICAvLyBjb21wb25lbnQgPSAocGFja2VkICYgbWFzaykgPj4gbDsKKyAgICB9CisjZWxzZQogICAgIGlmIChoICE9IGJpdHMpIHsKICAgICAgICAgY29uc3QgaW50IG1hc2sgPSAoKDE8PG1hc2tMZW4pLTEpIDw8IGw7CiAgICAgICAgIGlmIChpc1ZhbGlkSW1tZWRpYXRlKG1hc2spKSB7CkBAIC0xMzIsNiArMTQ5LDcgQEAKICAgICBpZiAocyAhPSBkLnJlZykgewogICAgICAgICBNT1YoQUwsIDAsIGQucmVnLCBzKTsKICAgICB9CisjZW5kaWYKIAogICAgIGQucyA9IG1hc2tMZW47CiB9CmRpZmYgLS1naXQgYS9saWJwaXhlbGZsaW5nZXIvY29sMzJjYjE2YmxlbmQuUyBiL2xpYnBpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZC5TCmluZGV4IDE0NTBiZGUuLjE4MzEyNTUgMTAwNjQ0Ci0tLSBhL2xpYnBpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZC5TCisrKyBiL2xpYnBpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZC5TCkBAIC0xLDIwICsxLDE5IEBACiAvKiBsaWJzL3BpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZC5TCi0qKgotKiogKEMpIENPUFlSSUdIVCAyMDA5IEFSTSBMaW1pdGVkLgotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qKgotKi8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCiAgICAgLnRleHQKICAgICAuYWxpZ24KZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZF9uZW9uLlMgYi9saWJwaXhlbGZsaW5nZXIvY29sMzJjYjE2YmxlbmRfbmVvbi5TCmluZGV4IDE3YjBkMDEuLmNiZDU0ZDEgMTAwNjQ0Ci0tLSBhL2xpYnBpeGVsZmxpbmdlci9jb2wzMmNiMTZibGVuZF9uZW9uLlMKKysrIGIvbGlicGl4ZWxmbGluZ2VyL2NvbDMyY2IxNmJsZW5kX25lb24uUwpAQCAtMSwyMCArMSwyMCBAQAogLyogbGlicy9waXhlbGZsaW5nZXIvY29sMzJjYjE2YmxlbmRfbmVvbi5TCi0qKgotKiogKEMpIENPUFlSSUdIVCAyMDA5IEFSTSBMaW1pdGVkLgotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qKgotKi8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCiAKICAgICAudGV4dAogICAgIC5hbGlnbgpkaWZmIC0tZ2l0IGEvbGlicGl4ZWxmbGluZ2VyL3Jhc3Rlci5jcHAgYi9saWJwaXhlbGZsaW5nZXIvcmFzdGVyLmNwcAppbmRleCBkNzUxMjAyLi4zMmIyYTk3IDEwMDY0NAotLS0gYS9saWJwaXhlbGZsaW5nZXIvcmFzdGVyLmNwcAorKysgYi9saWJwaXhlbGZsaW5nZXIvcmFzdGVyLmNwcApAQCAtMTQzLDcgKzE0Myw3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1HR0xpbnQgZ2dsQml0Qmx0aShHR0xDb250ZXh0KiBjb24sIGludCB0bXUsIEdHTGludCBjcm9wWzRdLCBHR0xpbnQgd2hlcmVbNF0pCitHR0xpbnQgZ2dsQml0QmxpdChHR0xDb250ZXh0KiBjb24sIGludCB0bXUsIEdHTGludCBjcm9wWzRdLCBHR0xpbnQgd2hlcmVbNF0pCiB7CiAgICAgR0dMX0NPTlRFWFQoYywgKHZvaWQqKWNvbik7CiAKZGlmZiAtLWdpdCBhL2xpYnBpeGVsZmxpbmdlci9zY2FubGluZS5jcHAgYi9saWJwaXhlbGZsaW5nZXIvc2NhbmxpbmUuY3BwCmluZGV4IGEyZjQzZWIuLjkzMWQ2NDggMTAwNjQ0Ci0tLSBhL2xpYnBpeGVsZmxpbmdlci9zY2FubGluZS5jcHAKKysrIGIvbGlicGl4ZWxmbGluZ2VyL3NjYW5saW5lLmNwcApAQCAtMTUxOCwyNiArMTUxOCwzIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLWV4dGVybiAiQyIgdm9pZCBnZ2xfdGVzdF9jb2RlZ2VuKHVpbnQzMl90IG4sIHVpbnQzMl90IHAsIHVpbnQzMl90IHQwLCB1aW50MzJfdCB0MSkKLXsKLSNpZiBBTkRST0lEX0FSTV9DT0RFR0VOCi0gICAgR0dMQ29udGV4dCogYzsKLSAgICBnZ2xJbml0KCZjKTsKLSAgICBuZWVkc190IG5lZWRzOwotICAgIG5lZWRzLm4gPSBuOwotICAgIG5lZWRzLnAgPSBwOwotICAgIG5lZWRzLnRbMF0gPSB0MDsKLSAgICBuZWVkcy50WzFdID0gdDE7Ci0gICAgc3A8U2NhbmxpbmVBc3NlbWJseT4gYShuZXcgU2NhbmxpbmVBc3NlbWJseShuZWVkcywgQVNTRU1CTFlfU0NSQVRDSF9TSVpFKSk7Ci0gICAgR0dMQXNzZW1ibGVyIGFzc2VtYmxlciggbmV3IEFSTUFzc2VtYmxlcihhKSApOwotICAgIGludCBlcnIgPSBhc3NlbWJsZXIuc2NhbmxpbmUobmVlZHMsIChjb250ZXh0X3QqKWMpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBwcmludGYoImVycm9yICUwOHggKCVzKVxuIiwgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgfQotICAgIGdnbFVuaW5pdChjKTsKLSNlbHNlCi0gICAgcHJpbnRmKCJUaGlzIHRlc3QgcnVucyBvbmx5IG9uIEFSTVxuIik7Ci0jZW5kaWYKLX0KLQpkaWZmIC0tZ2l0IGEvbGlicGl4ZWxmbGluZ2VyL3Rlc3RzL2NvZGVnZW4vQW5kcm9pZC5tayBiL2xpYnBpeGVsZmxpbmdlci90ZXN0cy9jb2RlZ2VuL0FuZHJvaWQubWsKaW5kZXggMWJjNDIxNC4uYWEzMjBmYyAxMDA2NDQKLS0tIGEvbGlicGl4ZWxmbGluZ2VyL3Rlc3RzL2NvZGVnZW4vQW5kcm9pZC5taworKysgYi9saWJwaXhlbGZsaW5nZXIvdGVzdHMvY29kZWdlbi9BbmRyb2lkLm1rCkBAIC0yLDEyICsyLDE1IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTOj0gXAotCWNvZGVnZW4uY3BwCisJY29kZWdlbi5jcHAuYXJtCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmN1dGlscyBcCiAgICAgbGlicGl4ZWxmbGluZ2VyCiAKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCXN5c3RlbS9jb3JlL2xpYnBpeGVsZmxpbmdlcgorCiBMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1jb2RlZ2VuCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCmRpZmYgLS1naXQgYS9saWJwaXhlbGZsaW5nZXIvdGVzdHMvY29kZWdlbi9jb2RlZ2VuLmNwcCBiL2xpYnBpeGVsZmxpbmdlci90ZXN0cy9jb2RlZ2VuL2NvZGVnZW4uY3BwCmluZGV4IDE4NjU4ODguLjk0ZTI0ODEgMTAwNjQ0Ci0tLSBhL2xpYnBpeGVsZmxpbmdlci90ZXN0cy9jb2RlZ2VuL2NvZGVnZW4uY3BwCisrKyBiL2xpYnBpeGVsZmxpbmdlci90ZXN0cy9jb2RlZ2VuL2NvZGVnZW4uY3BwCkBAIC0xLDkgKzEsNTQgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCi1leHRlcm4gIkMiIHZvaWQgZ2dsX3Rlc3RfY29kZWdlbigKLSAgICAgICAgdWludDMyX3QgbiwgdWludDMyX3QgcCwgdWludDMyX3QgdDAsIHVpbnQzMl90IHQxKTsKKyNpbmNsdWRlICJwcml2YXRlL3BpeGVsZmxpbmdlci9nZ2xfY29udGV4dC5oIgogCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAic2NhbmxpbmUuaCIKKworI2luY2x1ZGUgImNvZGVmbGluZ2VyL0NvZGVDYWNoZS5oIgorI2luY2x1ZGUgImNvZGVmbGluZ2VyL0dHTEFzc2VtYmxlci5oIgorI2luY2x1ZGUgImNvZGVmbGluZ2VyL0FSTUFzc2VtYmxlci5oIgorCisjaWYgZGVmaW5lZChfX2FybV9fKQorIyAgIGRlZmluZSBBTkRST0lEX0FSTV9DT0RFR0VOICAxCisjZWxzZQorIyAgIGRlZmluZSBBTkRST0lEX0FSTV9DT0RFR0VOICAwCisjZW5kaWYKKworI2RlZmluZSBBU1NFTUJMWV9TQ1JBVENIX1NJWkUgICAyMDQ4CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBTY2FubGluZUFzc2VtYmx5IDogcHVibGljIEFzc2VtYmx5IHsKKyAgICBBc3NlbWJseUtleTxuZWVkc190PiBtS2V5OworcHVibGljOgorICAgIFNjYW5saW5lQXNzZW1ibHkobmVlZHNfdCBuZWVkcywgc2l6ZV90IHNpemUpCisgICAgICAgIDogQXNzZW1ibHkoc2l6ZSksIG1LZXkobmVlZHMpIHsgfQorICAgIGNvbnN0IEFzc2VtYmx5S2V5PG5lZWRzX3Q+JiBrZXkoKSBjb25zdCB7IHJldHVybiBtS2V5OyB9Cit9OworCitzdGF0aWMgdm9pZCBnZ2xfdGVzdF9jb2RlZ2VuKHVpbnQzMl90IG4sIHVpbnQzMl90IHAsIHVpbnQzMl90IHQwLCB1aW50MzJfdCB0MSkKK3sKKyNpZiBBTkRST0lEX0FSTV9DT0RFR0VOCisgICAgR0dMQ29udGV4dCogYzsKKyAgICBnZ2xJbml0KCZjKTsKKyAgICBuZWVkc190IG5lZWRzOworICAgIG5lZWRzLm4gPSBuOworICAgIG5lZWRzLnAgPSBwOworICAgIG5lZWRzLnRbMF0gPSB0MDsKKyAgICBuZWVkcy50WzFdID0gdDE7CisgICAgc3A8U2NhbmxpbmVBc3NlbWJseT4gYShuZXcgU2NhbmxpbmVBc3NlbWJseShuZWVkcywgQVNTRU1CTFlfU0NSQVRDSF9TSVpFKSk7CisgICAgR0dMQXNzZW1ibGVyIGFzc2VtYmxlciggbmV3IEFSTUFzc2VtYmxlcihhKSApOworICAgIGludCBlcnIgPSBhc3NlbWJsZXIuc2NhbmxpbmUobmVlZHMsIChjb250ZXh0X3QqKWMpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICBwcmludGYoImVycm9yICUwOHggKCVzKVxuIiwgZXJyLCBzdHJlcnJvcigtZXJyKSk7CisgICAgfQorICAgIGdnbFVuaW5pdChjKTsKKyNlbHNlCisgICAgcHJpbnRmKCJUaGlzIHRlc3QgcnVucyBvbmx5IG9uIEFSTVxuIik7CisjZW5kaWYKK30KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQogewpkaWZmIC0tZ2l0IGEvbGlic3lzdXRpbHMvc3JjL05ldGxpbmtFdmVudC5jcHAgYi9saWJzeXN1dGlscy9zcmMvTmV0bGlua0V2ZW50LmNwcAppbmRleCBjMmJhNjQ3Li44NmMxZjQyIDEwMDY0NAotLS0gYS9saWJzeXN1dGlscy9zcmMvTmV0bGlua0V2ZW50LmNwcAorKysgYi9saWJzeXN1dGlscy9zcmMvTmV0bGlua0V2ZW50LmNwcApAQCAtOTMsMTMgKzkzLDExIEBACiB9CiAKIGNvbnN0IGNoYXIgKk5ldGxpbmtFdmVudDo6ZmluZFBhcmFtKGNvbnN0IGNoYXIgKnBhcmFtTmFtZSkgewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE5MX1BBUkFNU19NQVg7IGkrKykgewotICAgICAgICBpZiAoIW1QYXJhbXNbaV0pCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKCFzdHJuY21wKG1QYXJhbXNbaV0sIHBhcmFtTmFtZSwgc3RybGVuKHBhcmFtTmFtZSkpKQotICAgICAgICAgICAgcmV0dXJuICZtUGFyYW1zW2ldW3N0cmxlbihwYXJhbU5hbWUpICsgMV07CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihwYXJhbU5hbWUpOworICAgIGZvciAoaW50IGkgPSAwOyBtUGFyYW1zW2ldICYmIGkgPCBOTF9QQVJBTVNfTUFYOyArK2kpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcHRyID0gbVBhcmFtc1tpXSArIGxlbjsKKyAgICAgICAgaWYgKCFzdHJuY21wKG1QYXJhbXNbaV0sIHBhcmFtTmFtZSwgbGVuKSAmJiAqcHRyID09ICc9JykKKyAgICAgICAgICAgIHJldHVybiArK3B0cjsKICAgICB9CiAKICAgICBTTE9HRSgiTmV0bGlua0V2ZW50OjpGaW5kUGFyYW0oKTogUGFyYW1ldGVyICclcycgbm90IGZvdW5kIiwgcGFyYW1OYW1lKTsKZGlmZiAtLWdpdCBhL2xpYnN5c3V0aWxzL3NyYy9Tb2NrZXRDbGllbnQuY3BwIGIvbGlic3lzdXRpbHMvc3JjL1NvY2tldENsaWVudC5jcHAKaW5kZXggOGU1ZjE1NC4uOTBjYTUyZSAxMDA2NDQKLS0tIGEvbGlic3lzdXRpbHMvc3JjL1NvY2tldENsaWVudC5jcHAKKysrIGIvbGlic3lzdXRpbHMvc3JjL1NvY2tldENsaWVudC5jcHAKQEAgLTE1LDggKzE1LDEwIEBACiAgICAgICAgICwgbVBpZCgtMSkKICAgICAgICAgLCBtVWlkKC0xKQogICAgICAgICAsIG1HaWQoLTEpCisgICAgICAgICwgbVJlZkNvdW50KDEpCiB7CiAgICAgcHRocmVhZF9tdXRleF9pbml0KCZtV3JpdGVNdXRleCwgTlVMTCk7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZtUmVmQ291bnRNdXRleCwgTlVMTCk7CiAKICAgICBzdHJ1Y3QgdWNyZWQgY3JlZHM7CiAgICAgc29ja2xlbl90IHN6Q3JlZHMgPSBzaXplb2YoY3JlZHMpOwpAQCAtMzIsMTQgKzM0LDI0IEBACiAKIGludCBTb2NrZXRDbGllbnQ6OnNlbmRNc2coaW50IGNvZGUsIGNvbnN0IGNoYXIgKm1zZywgYm9vbCBhZGRFcnJubykgewogICAgIGNoYXIgKmJ1ZjsKKyAgICBjb25zdCBjaGFyKiBhcmc7CisgICAgY29uc3QgY2hhciogZm10OworICAgIGNoYXIgdG1wWzFdOworICAgIGludCAgbGVuOwogCiAgICAgaWYgKGFkZEVycm5vKSB7Ci0gICAgICAgIGJ1ZiA9IChjaGFyICopIGFsbG9jYShzdHJsZW4obXNnKSArIHN0cmxlbihzdHJlcnJvcihlcnJubykpICsgOCk7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJS4zZCAlcyAoJXMpIiwgY29kZSwgbXNnLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBmbXQgPSAiJS4zZCAlcyAoJXMpIjsKKyAgICAgICAgYXJnID0gc3RyZXJyb3IoZXJybm8pOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZiA9IChjaGFyICopIGFsbG9jYShzdHJsZW4obXNnKSArIHN0cmxlbigiWFhYICIpKTsKLSAgICAgICAgc3ByaW50ZihidWYsICIlLjNkICVzIiwgY29kZSwgbXNnKTsKKyAgICAgICAgZm10ID0gIiUuM2QgJXMiOworICAgICAgICBhcmcgPSBOVUxMOwogICAgIH0KKyAgICAvKiBNZWFzdXJlIGxlbmd0aCBvZiByZXF1aXJlZCBidWZmZXIgKi8KKyAgICBsZW4gPSBzbnByaW50Zih0bXAsIHNpemVvZiB0bXAsIGZtdCwgY29kZSwgbXNnLCBhcmcpOworICAgIC8qIEFsbG9jYXRlIGluIHRoZSBzdGFjaywgdGhlbiB3cml0ZSB0byBpdCAqLworICAgIGJ1ZiA9IChjaGFyKilhbGxvY2EobGVuKzEpOworICAgIHNucHJpbnRmKGJ1ZiwgbGVuKzEsIGZtdCwgY29kZSwgbXNnLCBhcmcpOworICAgIC8qIFNlbmQgdGhlIHplcm8tdGVybWluYXRlZCBtZXNzYWdlICovCiAgICAgcmV0dXJuIHNlbmRNc2coYnVmKTsKIH0KIApAQCAtNTAsMjUgKzYyLDY1IEBACiAgICAgfQogCiAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSBpbmNsdWRpbmcgbnVsbCBjaGFyYWN0ZXIKKyAgICBpZiAoc2VuZERhdGEobXNnLCBzdHJsZW4obXNnKSArIDEpICE9IDApIHsKKyAgICAgICAgU0xPR1coIlVuYWJsZSB0byBzZW5kIG1zZyAnJXMnIiwgbXNnKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IFNvY2tldENsaWVudDo6c2VuZERhdGEoY29uc3Qgdm9pZCogZGF0YSwgaW50IGxlbikgewogICAgIGludCByYyA9IDA7Ci0gICAgY29uc3QgY2hhciAqcCA9IG1zZzsKLSAgICBpbnQgYnJ0dyA9IHN0cmxlbihtc2cpICsgMTsKKyAgICBjb25zdCBjaGFyICpwID0gKGNvbnN0IGNoYXIqKSBkYXRhOworICAgIGludCBicnR3ID0gbGVuOworCisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbVdyaXRlTXV0ZXgpOwotICAgIHdoaWxlKGJydHcpIHsKLSAgICAgICAgaWYgKChyYyA9IHdyaXRlKG1Tb2NrZXQscCwgYnJ0dykpIDwgMCkgewotICAgICAgICAgICAgU0xPR1coIlVuYWJsZSB0byBzZW5kIG1zZyAnJXMnICglcykiLCBtc2csIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbVdyaXRlTXV0ZXgpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UgaWYgKCFyYykgeworICAgIHdoaWxlIChicnR3ID4gMCkgeworICAgICAgICByYyA9IHdyaXRlKG1Tb2NrZXQsIHAsIGJydHcpOworICAgICAgICBpZiAocmMgPiAwKSB7CisgICAgICAgICAgICBwICs9IHJjOworICAgICAgICAgICAgYnJ0dyAtPSByYzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJjIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtV3JpdGVNdXRleCk7CisgICAgICAgIGlmIChyYyA9PSAwKSB7CiAgICAgICAgICAgICBTTE9HVygiMCBsZW5ndGggd3JpdGUgOigiKTsKICAgICAgICAgICAgIGVycm5vID0gRUlPOwotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1Xcml0ZU11dGV4KTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNMT0dXKCJ3cml0ZSBlcnJvciAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgfQotICAgICAgICBwICs9IHJjOwotICAgICAgICBicnR3IC09IHJjOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtV3JpdGVNdXRleCk7CiAgICAgcmV0dXJuIDA7CiB9CisKK3ZvaWQgU29ja2V0Q2xpZW50OjppbmNSZWYoKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtUmVmQ291bnRNdXRleCk7CisgICAgbVJlZkNvdW50Kys7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1SZWZDb3VudE11dGV4KTsKK30KKworYm9vbCBTb2NrZXRDbGllbnQ6OmRlY1JlZigpIHsKKyAgICBib29sIGRlbGV0ZVNlbGYgPSBmYWxzZTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1SZWZDb3VudE11dGV4KTsKKyAgICBtUmVmQ291bnQtLTsKKyAgICBpZiAobVJlZkNvdW50ID09IDApIHsKKyAgICAgICAgZGVsZXRlU2VsZiA9IHRydWU7CisgICAgfSBlbHNlIGlmIChtUmVmQ291bnQgPCAwKSB7CisgICAgICAgIFNMT0dFKCJTb2NrZXRDbGllbnQgcmVmY291bnQgd2VudCBuZWdhdGl2ZSEiKTsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1SZWZDb3VudE11dGV4KTsKKyAgICBpZiAoZGVsZXRlU2VsZikgeworICAgICAgICBkZWxldGUgdGhpczsKKyAgICB9CisgICAgcmV0dXJuIGRlbGV0ZVNlbGY7Cit9CmRpZmYgLS1naXQgYS9saWJzeXN1dGlscy9zcmMvU29ja2V0TGlzdGVuZXIuY3BwIGIvbGlic3lzdXRpbHMvc3JjL1NvY2tldExpc3RlbmVyLmNwcAppbmRleCAxYmMwNmRiLi42OWVkNzllIDEwMDY0NAotLS0gYS9saWJzeXN1dGlscy9zcmMvU29ja2V0TGlzdGVuZXIuY3BwCisrKyBiL2xpYnN5c3V0aWxzL3NyYy9Tb2NrZXRMaXN0ZW5lci5jcHAKQEAgLTU0LDggKzU0LDggQEAKICAgICAgICAgY2xvc2UobUN0cmxQaXBlWzFdKTsKICAgICB9CiAgICAgU29ja2V0Q2xpZW50Q29sbGVjdGlvbjo6aXRlcmF0b3IgaXQ7Ci0gICAgZm9yIChpdCA9IG1DbGllbnRzLT5iZWdpbigpOyBpdCAhPSBtQ2xpZW50cy0+ZW5kKCk7ICsraXQpIHsKLSAgICAgICAgZGVsZXRlICgqaXQpOworICAgIGZvciAoaXQgPSBtQ2xpZW50cy0+YmVnaW4oKTsgaXQgIT0gbUNsaWVudHMtPmVuZCgpOykgeworICAgICAgICAoKml0KS0+ZGVjUmVmKCk7CiAgICAgICAgIGl0ID0gbUNsaWVudHMtPmVyYXNlKGl0KTsKICAgICB9CiAgICAgZGVsZXRlIG1DbGllbnRzOwpAQCAtOTYsOCArOTYsMTAgQEAKIAogaW50IFNvY2tldExpc3RlbmVyOjpzdG9wTGlzdGVuZXIoKSB7CiAgICAgY2hhciBjID0gMDsKKyAgICBpbnQgIHJjOwogCi0gICAgaWYgKHdyaXRlKG1DdHJsUGlwZVsxXSwgJmMsIDEpICE9IDEpIHsKKyAgICByYyA9IFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShtQ3RybFBpcGVbMV0sICZjLCAxKSk7CisgICAgaWYgKHJjICE9IDEpIHsKICAgICAgICAgU0xPR0UoIkVycm9yIHdyaXRpbmcgdG8gY29udHJvbCBwaXBlICglcykiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTE4LDcgKzEyMCw3IEBACiAgICAgfQogCiAgICAgU29ja2V0Q2xpZW50Q29sbGVjdGlvbjo6aXRlcmF0b3IgaXQ7Ci0gICAgZm9yIChpdCA9IG1DbGllbnRzLT5iZWdpbigpOyBpdCAhPSBtQ2xpZW50cy0+ZW5kKCk7ICsraXQpIHsKKyAgICBmb3IgKGl0ID0gbUNsaWVudHMtPmJlZ2luKCk7IGl0ICE9IG1DbGllbnRzLT5lbmQoKTspIHsKICAgICAgICAgZGVsZXRlICgqaXQpOwogICAgICAgICBpdCA9IG1DbGllbnRzLT5lcmFzZShpdCk7CiAgICAgfQpAQCAtMTM1LDExICsxMzcsMTMgQEAKIAogdm9pZCBTb2NrZXRMaXN0ZW5lcjo6cnVuTGlzdGVuZXIoKSB7CiAKKyAgICBTb2NrZXRDbGllbnRDb2xsZWN0aW9uICpwZW5kaW5nTGlzdCA9IG5ldyBTb2NrZXRDbGllbnRDb2xsZWN0aW9uKCk7CisKICAgICB3aGlsZSgxKSB7CiAgICAgICAgIFNvY2tldENsaWVudENvbGxlY3Rpb246Oml0ZXJhdG9yIGl0OwogICAgICAgICBmZF9zZXQgcmVhZF9mZHM7CiAgICAgICAgIGludCByYyA9IDA7Ci0gICAgICAgIGludCBtYXggPSAwOworICAgICAgICBpbnQgbWF4ID0gLTE7CiAKICAgICAgICAgRkRfWkVSTygmcmVhZF9mZHMpOwogCkBAIC0xNTQsMTMgKzE1OCwxNiBAQAogCiAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbUNsaWVudHNMb2NrKTsKICAgICAgICAgZm9yIChpdCA9IG1DbGllbnRzLT5iZWdpbigpOyBpdCAhPSBtQ2xpZW50cy0+ZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgIEZEX1NFVCgoKml0KS0+Z2V0U29ja2V0KCksICZyZWFkX2Zkcyk7Ci0gICAgICAgICAgICBpZiAoKCppdCktPmdldFNvY2tldCgpID4gbWF4KQotICAgICAgICAgICAgICAgIG1heCA9ICgqaXQpLT5nZXRTb2NrZXQoKTsKKyAgICAgICAgICAgIGludCBmZCA9ICgqaXQpLT5nZXRTb2NrZXQoKTsKKyAgICAgICAgICAgIEZEX1NFVChmZCwgJnJlYWRfZmRzKTsKKyAgICAgICAgICAgIGlmIChmZCA+IG1heCkKKyAgICAgICAgICAgICAgICBtYXggPSBmZDsKICAgICAgICAgfQogICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUNsaWVudHNMb2NrKTsKIAogICAgICAgICBpZiAoKHJjID0gc2VsZWN0KG1heCArIDEsICZyZWFkX2ZkcywgTlVMTCwgTlVMTCwgTlVMTCkpIDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgU0xPR0UoInNlbGVjdCBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICBzbGVlcCgxKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTcxLDEwICsxNzgsMTQgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBpZiAobUxpc3RlbiAmJiBGRF9JU1NFVChtU29jaywgJnJlYWRfZmRzKSkgewogICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyIGFkZHI7Ci0gICAgICAgICAgICBzb2NrbGVuX3QgYWxlbiA9IHNpemVvZihhZGRyKTsKKyAgICAgICAgICAgIHNvY2tsZW5fdCBhbGVuOwogICAgICAgICAgICAgaW50IGM7CiAKLSAgICAgICAgICAgIGlmICgoYyA9IGFjY2VwdChtU29jaywgJmFkZHIsICZhbGVuKSkgPCAwKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgYWxlbiA9IHNpemVvZihhZGRyKTsKKyAgICAgICAgICAgICAgICBjID0gYWNjZXB0KG1Tb2NrLCAmYWRkciwgJmFsZW4pOworICAgICAgICAgICAgfSB3aGlsZSAoYyA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworICAgICAgICAgICAgaWYgKGMgPCAwKSB7CiAgICAgICAgICAgICAgICAgU0xPR0UoImFjY2VwdCBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICAgICAgc2xlZXAoMSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xODQsMjcgKzE5NSw0NSBAQAogICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1DbGllbnRzTG9jayk7CiAgICAgICAgIH0KIAotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1DbGllbnRzTG9jayk7Ci0gICAgICAgICAgICBmb3IgKGl0ID0gbUNsaWVudHMtPmJlZ2luKCk7IGl0ICE9IG1DbGllbnRzLT5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgICAgIGludCBmZCA9ICgqaXQpLT5nZXRTb2NrZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoRkRfSVNTRVQoZmQsICZyZWFkX2ZkcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1DbGllbnRzTG9jayk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghb25EYXRhQXZhaWxhYmxlKCppdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbUNsaWVudHNMb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAqaXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdCA9IG1DbGllbnRzLT5lcmFzZShpdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUNsaWVudHNMb2NrKTsKKyAgICAgICAgLyogQWRkIGFsbCBhY3RpdmUgY2xpZW50cyB0byB0aGUgcGVuZGluZyBsaXN0IGZpcnN0ICovCisgICAgICAgIHBlbmRpbmdMaXN0LT5jbGVhcigpOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1DbGllbnRzTG9jayk7CisgICAgICAgIGZvciAoaXQgPSBtQ2xpZW50cy0+YmVnaW4oKTsgaXQgIT0gbUNsaWVudHMtPmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpbnQgZmQgPSAoKml0KS0+Z2V0U29ja2V0KCk7CisgICAgICAgICAgICBpZiAoRkRfSVNTRVQoZmQsICZyZWFkX2ZkcykpIHsKKyAgICAgICAgICAgICAgICBwZW5kaW5nTGlzdC0+cHVzaF9iYWNrKCppdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1DbGllbnRzTG9jayk7CisKKyAgICAgICAgLyogUHJvY2VzcyB0aGUgcGVuZGluZyBsaXN0LCBzaW5jZSBpdCBpcyBvd25lZCBieSB0aGUgdGhyZWFkLAorICAgICAgICAgKiB0aGVyZSBpcyBubyBuZWVkIHRvIGxvY2sgaXQgKi8KKyAgICAgICAgd2hpbGUgKCFwZW5kaW5nTGlzdC0+ZW1wdHkoKSkgeworICAgICAgICAgICAgLyogUG9wIHRoZSBmaXJzdCBpdGVtIGZyb20gdGhlIGxpc3QgKi8KKyAgICAgICAgICAgIGl0ID0gcGVuZGluZ0xpc3QtPmJlZ2luKCk7CisgICAgICAgICAgICBTb2NrZXRDbGllbnQqIGMgPSAqaXQ7CisgICAgICAgICAgICBwZW5kaW5nTGlzdC0+ZXJhc2UoaXQpOworICAgICAgICAgICAgLyogUHJvY2VzcyBpdCwgaWYgZmFsc2UgaXMgcmV0dXJuZWQsIHJlbW92ZSBhbmQgZGVzdHJveSBpdCAqLworICAgICAgICAgICAgaWYgKCFvbkRhdGFBdmFpbGFibGUoYykpIHsKKyAgICAgICAgICAgICAgICAvKiBSZW1vdmUgdGhlIGNsaWVudCBmcm9tIG91ciBhcnJheSAqLworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbUNsaWVudHNMb2NrKTsKKyAgICAgICAgICAgICAgICBmb3IgKGl0ID0gbUNsaWVudHMtPmJlZ2luKCk7IGl0ICE9IG1DbGllbnRzLT5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKml0ID09IGMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRzLT5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGRF9DTFIoZmQsICZyZWFkX2Zkcyk7Ci0gICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbUNsaWVudHNMb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtQ2xpZW50c0xvY2spOworICAgICAgICAgICAgICAgIC8qIERlc3Ryb3kgdGhlIGNsaWVudCAqLworICAgICAgICAgICAgICAgIGludCBzb2NrZXQgPSBjLT5nZXRTb2NrZXQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYy0+ZGVjUmVmKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogJ2MnIGlzIGRlbGV0ZWQgbWVtb3J5IGF0IHRoaXMgcG9pbnQuCisgICAgICAgICAgICAgICAgICAgIGNsb3NlKHNvY2tldCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1DbGllbnRzTG9jayk7Ci0gICAgICAgIH0gd2hpbGUgKDApOworICAgICAgICB9CiAgICAgfQorICAgIGRlbGV0ZSBwZW5kaW5nTGlzdDsKIH0KIAogdm9pZCBTb2NrZXRMaXN0ZW5lcjo6c2VuZEJyb2FkY2FzdChpbnQgY29kZSwgY29uc3QgY2hhciAqbXNnLCBib29sIGFkZEVycm5vKSB7CmRpZmYgLS1naXQgYS9ta3NoL0FuZHJvaWQubWsgYi9ta3NoL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzYjg2MwotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvQW5kcm9pZC5tawpAQCAtMCwwICsxLDY0IEBACisjIENvcHlyaWdodCDCqSAyMDEwCisjCVRob3JzdGVuIEdsYXNlciA8dC5nbGFzZXJAdGFyZW50LmRlPgorIyBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgbWtzaC4KKworTE9DQUxfUEFUSDo9CQkkKGNhbGwgbXktZGlyKQorCisKKyMgL3N5c3RlbS9ldGMvbWtzaHJjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEU6PQkJbWtzaHJjCitMT0NBTF9NT0RVTEVfVEFHUzo9CXNoZWxsX21rc2gKK0xPQ0FMX01PRFVMRV9DTEFTUzo9CUVUQworTE9DQUxfTU9EVUxFX1BBVEg6PQkkKFRBUkdFVF9PVVQpL2V0YworTE9DQUxfU1JDX0ZJTEVTOj0JJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKKworIyAvc3lzdGVtL2Jpbi9ta3NoCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEU6PQkJbWtzaAorTE9DQUxfTU9EVUxFX1RBR1M6PQlzaGVsbF9ta3NoCisKKyMgbWtzaCBzb3VyY2UgZmlsZXMKK0xPQ0FMX1NSQ19GSUxFUzo9CXNyYy9sYWxsb2MuYyBzcmMvZWRpdC5jIHNyYy9ldmFsLmMgc3JjL2V4ZWMuYyBcCisJCQlzcmMvZXhwci5jIHNyYy9mdW5jcy5jIHNyYy9oaXN0cmFwLmMgc3JjL2pvYnMuYyBcCisJCQlzcmMvbGV4LmMgc3JjL21haW4uYyBzcmMvbWlzYy5jIHNyYy9zaGYuYyBcCisJCQlzcmMvc3luLmMgc3JjL3RyZWUuYyBzcmMvdmFyLmMKKworTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVM6PSBsaWJjCisKK0xPQ0FMX0NfSU5DTFVERVM6PQkkKExPQ0FMX1BBVEgpL3NyYworIyBhZGRpdGlvbmFsIGZsYWdzIGZpcnN0LCB0aGVuIGZyb20gTWFrZWZyYWcuaW5jOiBDRkxBR1MsIENQUEZMQUdTCitMT0NBTF9DRkxBR1M6PQkJLURNS1NIX0RFRkFVTFRfRVhFQ1NIRUxMPVwiL3N5c3RlbS9iaW4vc2hcIiBcCisJCQktRE1LU0hfREVGQVVMVF9UTVBESVI9XCIvc3FsaXRlX3N0bXRfam91cm5hbHNcIiBcCisJCQktRE1LU0hSQ19QQVRIPVwiL3N5c3RlbS9ldGMvbWtzaHJjXCIgXAorCQkJLWZ3cmFwdiBcCisJCQktRE1LU0hfQVNTVU1FX1VURjg9MCAtRE1LU0hfTk9QV05BTSBcCisJCQktRF9HTlVfU09VUkNFIFwKKwkJCS1ESEFWRV9BVFRSSUJVVEVfQk9VTkRFRD0wIC1ESEFWRV9BVFRSSUJVVEVfRk9STUFUPTEgXAorCQkJLURIQVZFX0FUVFJJQlVURV9OT05OVUxMPTEgLURIQVZFX0FUVFJJQlVURV9OT1JFVFVSTj0xIFwKKwkJCS1ESEFWRV9BVFRSSUJVVEVfVU5VU0VEPTEgLURIQVZFX0FUVFJJQlVURV9VU0VEPTEgXAorCQkJLURIQVZFX1NZU19QQVJBTV9IPTEgLURIQVZFX1NZU19NS0RFVl9IPTAgXAorCQkJLURIQVZFX1NZU19NTUFOX0g9MSAtREhBVkVfU1lTX1NZU01BQ1JPU19IPTEgXAorCQkJLURIQVZFX0dSUF9IPTEgLURIQVZFX0xJQkdFTl9IPTEgLURIQVZFX0xJQlVUSUxfSD0wIFwKKwkJCS1ESEFWRV9QQVRIU19IPTEgLURIQVZFX1NUREJPT0xfSD0xIC1ESEFWRV9TVERJTlRfSD0xIFwKKwkJCS1ESEFWRV9TVFJJTkdTX0g9MSAtREhBVkVfVUxJTUlUX0g9MCAtREhBVkVfVkFMVUVTX0g9MCBcCisJCQktREhBVkVfQ0FOX0lOVFRZUEVTPTEgLURIQVZFX0NBTl9VQ0JJTlRTPTEgXAorCQkJLURIQVZFX0NBTl9JTlQ4VFlQRT0xIC1ESEFWRV9DQU5fVUNCSU5UOD0xIFwKKwkJCS1ESEFWRV9STElNX1Q9MSAtREhBVkVfU0lHX1Q9MSAtREhBVkVfU1lTX1NJR05BTUU9MSBcCisJCQktREhBVkVfU1lTX1NJR0xJU1Q9MSAtREhBVkVfU1RSU0lHTkFMPTAgXAorCQkJLURIQVZFX0dFVFJVU0FHRT0xIC1ESEFWRV9LSUxMUEc9MSAtREhBVkVfTUtOT0Q9MCBcCisJCQktREhBVkVfTUtTVEVNUD0xIC1ESEFWRV9OSUNFPTEgLURIQVZFX1JFVk9LRT0wIFwKKwkJCS1ESEFWRV9TRVRMT0NBTEVfQ1RZUEU9MCAtREhBVkVfTEFOR0lORk9fQ09ERVNFVD0wIFwKKwkJCS1ESEFWRV9TRVRNT0RFPTEgLURIQVZFX1NFVFJFU1VHSUQ9MSBcCisJCQktREhBVkVfU0VUR1JPVVBTPTEgLURIQVZFX1NUUkNBU0VTVFI9MSBcCisJCQktREhBVkVfU1RSTENQWT0xIC1ESEFWRV9GTE9DS19ERUNMPTEgXAorCQkJLURIQVZFX1JFVk9LRV9ERUNMPTEgLURIQVZFX1NZU19TSUdMSVNUX0RFQ0w9MSBcCisJCQktREhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZPTAKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9ta3NoL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFIGIvbWtzaC9NT0RVTEVfTElDRU5TRV9CU0RfTElLRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9NT0RVTEVfTElDRU5TRV9CU0RfTElLRQpkaWZmIC0tZ2l0IGEvbWtzaC9OT1RJQ0UgYi9ta3NoL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTAwNjFmCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9OT1RJQ0UKQEAgLTAsMCArMSwyMSBAQAorbWtzaCBpcyBjb3ZlcmVkIGJ5IFRoZSBNaXJPUyBMaWNlbmNlOgorCisvKi0KKyAqIENvcHlyaWdodCDCqSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVu4oCQCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkIOKAnEFTIElT4oCdIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb27igJlzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCmRpZmYgLS1naXQgYS9ta3NoL21rbWYuc2ggYi9ta3NoL21rbWYuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkMDQzMgotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvbWttZi5zaApAQCAtMCwwICsxLDEyNCBAQAorIyBDb3B5cmlnaHQgwqkgMjAxMAorIwlUaG9yc3RlbiBHbGFzZXIgPHQuZ2xhc2VyQHRhcmVudC5kZT4KKyMgVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIG1rc2guCisjLQorIyBIZWxwZXIgc2NyaXB0IHRvIGxldCBzcmMvQnVpbGQuc2ggZ2VuZXJhdGUgTWFrZWZyYWcuaW5jCisjIHdoaWNoIHdlIGluIHR1cm4gdXNlIGluIHRoZSBtYW51YWwgY3JlYXRpb24gb2YgQW5kcm9pZC5taworIworIyBUaGlzIHNjcmlwdCBpcyBzdXBwb3NlZCB0byBiZSBydW4gZnJvbS9pbnNpZGUgQU9TUCBieSB0aGUKKyMgcG9ydGVyIG9mIG1rc2ggdG8gQW5kcm9pZCAoYW5kIG9ubHkgbWFudWFsbHkpLgorCitjZCAiJChkaXJuYW1lICIkMCIpIgorc3JjZGlyPSQocHdkKQorcm0gLXJmIHRtcAorbWtkaXIgdG1wCitjZCAuLi8uLi8uLgorYW9zcGRpcj0kKHB3ZCkKK2NkICRzcmNkaXIvdG1wCisKK2FkZHZhcigpIHsKKwlfdm49JDE7IHNoaWZ0CisKKwlldmFsICRfdm49XCJcJCRfdm4gJyQqIicKK30KKworQ0ZMQUdTPQorQ1BQRkxBR1M9CitMREZMQUdTPQorTElCUz0KKworIyBUaGUgZGVmaW5pdGlvbnMgYmVsb3cgd2VyZSBnZW5lcmF0ZWQgYnkgZXhhbWluaW5nIHRoZQorIyBvdXRwdXQgb2YgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorIyBtYWtlIHNob3djb21tYW5kcyBvdXQvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9zeXN0ZW0vYmluL21rc2ggMj4mMSB8IHRlZSBsb2cKKyMKKyMgVGhleSBhcmUgb25seSB1c2VkIHRvIGxldCBCdWlsZC5zaCBmaW5kIHRoZSBjb21waWxlciwgaGVhZGVyCisjIGZpbGVzLCBsaW5rZXIgYW5kIGxpYnJhcmllcyB0byBnZW5lcmF0ZSBNYWtlZnJhZy5pbmMgKHNpbWlsYXIKKyMgdG8gd2hhdCBHTlUgYXV0b3Rvb2xz4oCZIGNvbmZpZ3VyZSBzY3JpcHRzIGRvKSwgYW5kIG5ldmVyIHVzZWQKKyMgZHVyaW5nIHRoZSByZWFsIGJ1aWxkIHByb2Nlc3MuIFdlIG5lZWQgdGhpcyB0byBwb3J0IG1rc2ggdG8KKyMgdGhlIEFuZHJvaWQgcGxhdGZvcm0gYW5kIGl0IGlzIGNydWNpYWwgdGhlc2UgYXJlIGFzIGNsb3NlIGFzCisjIHBvc3NpYmxlIHRvIHRoZSB2YWx1ZXMgdXNlZCBsYXRlci4gKFlvdSBhbHNvIG11c3QgZXhhbXBsZSB0aGUKKyMgcmVzdWx0cyBnYXRoZXJlZCBmcm9tIE1ha2VmcmFnLmluYyB0byBzZWUgdGhleSBhcmUgdGhlIHNhbWUKKyMgYWNyb3NzIGFsbCBBbmRyb2lkIHBsYXRmb3Jtcywgb3IgYWRkIGFwcHJvcHJpYXRlIGlmZGVmcy4pCisjIFNpbmNlIHdlIG5vIGxvbmdlciB1c2UgdGhlIE5ESywgdGhlIEFPU1AgaGFzIHRvIGhhdmUgYmVlbgorIyBidWlsdCBiZWZvcmUgdXNpbmcgdGhpcyBzY3JpcHQgKHRhcmdldHRpbmcgZ2VuZXJpYy9lbXVsYXRvcikuCisKK0NDPSRhb3NwZGlyL3ByZWJ1aWx0L2xpbnV4LXg4Ni90b29sY2hhaW4vYXJtLWVhYmktNC40LjAvYmluL2FybS1lYWJpLWdjYworYWRkdmFyIENQUEZMQUdTIC1JJGFvc3BkaXIvc3lzdGVtL2NvcmUvaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9oYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL3N5c3RlbS9jb3JlL2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvaGFyZHdhcmUvbGliaGFyZHdhcmUvaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9oYXJkd2FyZS9saWJoYXJkd2FyZV9sZWdhY3kvaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9oYXJkd2FyZS9yaWwvaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9kYWx2aWsvbGlibmF0aXZlaGVscGVyL2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvZnJhbWV3b3Jrcy9iYXNlL29wZW5nbC9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL2V4dGVybmFsL3NraWEvaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9vdXQvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9vYmovaW5jbHVkZSBcCisgICAgLUkkYW9zcGRpci9iaW9uaWMvbGliYy9hcmNoLWFybS9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL2Jpb25pYy9saWJjL2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKKyAgICAtSSRhb3NwZGlyL2Jpb25pYy9saWJjL2tlcm5lbC9jb21tb24gXAorICAgIC1JJGFvc3BkaXIvYmlvbmljL2xpYmMva2VybmVsL2FyY2gtYXJtIFwKKyAgICAtSSRhb3NwZGlyL2Jpb25pYy9saWJtL2luY2x1ZGUgXAorICAgIC1JJGFvc3BkaXIvYmlvbmljL2xpYm0vaW5jbHVkZS9hcmNoL2FybSBcCisgICAgLUkkYW9zcGRpci9iaW9uaWMvbGlidGhyZWFkX2RiL2luY2x1ZGUgXAorICAgIC1EX19BUk1fQVJDSF81X18gLURfX0FSTV9BUkNIXzVUX18gLURfX0FSTV9BUkNIXzVFX18gLURfX0FSTV9BUkNIXzVURV9fIFwKKyAgICAtSSRhb3NwZGlyL3N5c3RlbS9jb3JlL2luY2x1ZGUvYXJjaC9saW51eC1hcm0vIFwKKyAgICAtaW5jbHVkZSAkYW9zcGRpci9zeXN0ZW0vY29yZS9pbmNsdWRlL2FyY2gvbGludXgtYXJtL0FuZHJvaWRDb25maWcuaCBcCisgICAgLURBTkRST0lEIC1ETkRFQlVHIC1VREVCVUcKK2FkZHZhciBDRkxBR1MgLWZuby1leGNlcHRpb25zIC1Xbm8tbXVsdGljaGFyIC1tc29mdC1mbG9hdCAtZnBpYyBcCisgICAgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZnVud2luZC10YWJsZXMgLWZzdGFjay1wcm90ZWN0b3IgLWZuby1zaG9ydC1lbnVtcyBcCisgICAgLW1hcmNoPWFybXY1dGUgLW10dW5lPXhzY2FsZSAtbXRodW1iLWludGVyd29yayAtZm1lc3NhZ2UtbGVuZ3RoPTAgXAorICAgIC1XIC1XYWxsIC1Xbm8tdW51c2VkIC1XaW5pdC1zZWxmIC1XcG9pbnRlci1hcml0aCAtV2Vycm9yPXJldHVybi10eXBlIFwKKyAgICAtV2Vycm9yPW5vbi12aXJ0dWFsLWR0b3IgLVdlcnJvcj1hZGRyZXNzIC1XZXJyb3I9c2VxdWVuY2UtcG9pbnQgXAorICAgIC1Xc3RyaWN0LWFsaWFzaW5nPTIgLWZpbmxpbmUtZnVuY3Rpb25zIC1mbm8taW5saW5lLWZ1bmN0aW9ucy1jYWxsZWQtb25jZSBcCisgICAgLWZnY3NlLWFmdGVyLXJlbG9hZCAtZnJlcnVuLWNzZS1hZnRlci1sb29wIC1mcmVuYW1lLXJlZ2lzdGVycyAtbXRodW1iIFwKKyAgICAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZpbmxpbmUtbGltaXQ9NjQKK2FkZHZhciBMREZMQUdTIC1ub3N0ZGxpYiAtQmR5bmFtaWMgLVdsLC1ULCRhb3NwZGlyL2J1aWxkL2NvcmUvYXJtZWxmLnggXAorICAgIC1XbCwtZHluYW1pYy1saW5rZXIsL3N5c3RlbS9iaW4vbGlua2VyIC1XbCwtLWdjLXNlY3Rpb25zIFwKKyAgICAtV2wsLXosbm9jb3B5cmVsb2MgLVdsLC0tbm8tdW5kZWZpbmVkIFwKKyAgICAkYW9zcGRpci9vdXQvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9vYmovbGliL2NydGJlZ2luX2R5bmFtaWMubworYWRkdmFyIExJQlMgLUwkYW9zcGRpci9vdXQvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9vYmovbGliIFwKKyAgICAtV2wsLXJwYXRoLWxpbms9JGFvc3BkaXIvb3V0L3RhcmdldC9wcm9kdWN0L2dlbmVyaWMvb2JqL2xpYiAtbGMgXAorICAgICRhb3NwZGlyL3ByZWJ1aWx0L2xpbnV4LXg4Ni90b29sY2hhaW4vYXJtLWVhYmktNC40LjAvYmluLy4uL2xpYi9nY2MvYXJtLWVhYmkvNC40LjAvaW50ZXJ3b3JrL2xpYmdjYy5hIFwKKyAgICAkYW9zcGRpci9vdXQvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9vYmovbGliL2NydGVuZF9hbmRyb2lkLm8KKworCisjIyMgT3ZlcnJpZGUgZmxhZ3MKKyMgV2UgZG9u4oCZdCBldmVuICpzdXBwb3J0KiBVVEYtOCBieSBkZWZhdWx0IOKYuQorYWRkdmFyIENQUEZMQUdTIC1ETUtTSF9BU1NVTUVfVVRGOD0wCisjIE5vIGdldHB3bmFtKCkgY2FsbHMgKGFmZmVjdHMgImNkIH51c2VybmFtZS8iIG9ubHkpCithZGR2YXIgQ1BQRkxBR1MgLURNS1NIX05PUFdOQU0KKyMgQ29tcGlsZSBhbiBleHRyYSBzbWFsbCBta3NoIChvcHRpb25hbCkKKyNhZGR2YXIgQ1BQRkxBR1MgLURNS1NIX1NNQUxMCisjIExlYXZlIG91dCB0aGUgdWxpbWl0IGJ1aWx0aW4KKyNhZGR2YXIgQ1BQRkxBR1MgLURNS1NIX05PX0xJTUlUUworCisjIFNldCB0YXJnZXQgcGxhdGZvcm0KK1RBUkdFVF9PUz1MaW51eAorIyBCdWlsZGluZyB3aXRoIC1zdGQ9Yzk5IG9yIC1zdGQ9Z251OTkgY2xhc2hlcyB3aXRoIEJpb25pYyBoZWFkZXJzCitIQVZFX0NBTl9TVERHOTk9MAorSEFWRV9DQU5fU1REQzk5PTAKK2V4cG9ydCBIQVZFX0NBTl9TVERHOTkgSEFWRV9DQU5fU1REQzk5CisKKyMgQW5kcm9pZC14ODYgZG9lcyBub3QgaGF2ZSBoZWxwZXIgZnVuY3Rpb25zIGZvciBQcm9Qb2xpY2UgU1NQCisjIGFuZCBBT1NQIGFkZHMgdGhlIGZsYWdzIGJ5IGl0c2VsZiAoc2FtZSBmb3Igd2FybmluZyBmbGFncykKK0hBVkVfQ0FOX0ZOT1NUUklDVEFMSUFTSU5HPTAKK0hBVkVfQ0FOX0ZTVEFDS1BST1RFQ1RPUkFMTD0wCitIQVZFX0NBTl9XQUxMPTAKK2V4cG9ydCBIQVZFX0NBTl9GTk9TVFJJQ1RBTElBU0lORyBIQVZFX0NBTl9GU1RBQ0tQUk9URUNUT1JBTEwgSEFWRV9DQU5fV0FMTAorCisjIGRpc2FibGUgdGhlIG1rbm9kKDgpIGJ1aWx0LWluIHRvIGdldCByaWQgb2YgbmVlZGluZyBzZXRtb2RlLmMKK0hBVkVfTUtOT0Q9MDsgZXhwb3J0IEhBVkVfTUtOT0QKKworIyBldmVuIHRoZSBpZGVhIG9mIHBlcnNpc3RlbnQgaGlzdG9yeSBvbiBhIHBob25lIGlzIGZ1bm55CitIQVZFX1BFUlNJU1RFTlRfSElTVE9SWT0wOyBleHBvcnQgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKKworIyAuLi4gYW5kIHJ1biBpdCEKK2V4cG9ydCBDQyBDUFBGTEFHUyBDRkxBR1MgTERGTEFHUyBMSUJTIFRBUkdFVF9PUworc2ggLi4vc3JjL0J1aWxkLnNoIC1NCitydj0kPwordGVzdCB4MCA9IHgiJHJ2IiAmJiBtdiAtZiBNYWtlZnJhZy5pbmMgLi4vCitjZCAuLgorcm0gLXJmIHRtcAorZXhpdCAkcnYKZGlmZiAtLWdpdCBhL21rc2gvbWtzaHJjIGIvbWtzaC9ta3NocmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRhNWVhNgotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvbWtzaHJjCkBAIC0wLDAgKzEsMjkgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEwCisjCVRob3JzdGVuIEdsYXNlciA8dC5nbGFzZXJAdGFyZW50LmRlPgorIyBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgbWtzaC4KKyMtCisjIE1pbmltYWwgL3N5c3RlbS9ldGMvbWtzaHJjIGZvciBBbmRyb2lkCisKKzogJHtURVJNOj12dDEwMH0gJHtIT01FOj0vZGF0YX0gJHtNS1NIOj0vc3lzdGVtL2Jpbi9zaH0gJHtIT1NUTkFNRTo9YW5kcm9pZH0KKzogJHtTSEVMTDo9JE1LU0h9ICR7VVNFUjo9JCh0eXBlc2V0IHg9JChpZCk7IHg9JHt4IypcKH07IHByaW50IC1yIC0tICR7eCUlXCkqfSl9CitpZiAoKCBVU0VSX0lEICkpOyB0aGVuIFBTMT0nJCc7IGVsc2UgUFMxPScjJzsgZmkKK2Z1bmN0aW9uIHByZWNtZCB7CisJdHlwZXNldCBlPSQ/CisKKwkoKCBlICkpICYmIHByaW50IC1uICIkZXwiCit9CitQUzE9JyQocHJlY21kKSRVU0VSQCRIT1NUTkFNRToke1BXRDotP30gJyIkUFMxICIKK2V4cG9ydCBIT01FIEhPU1ROQU1FIE1LU0ggUFMxIFNIRUxMIFRFUk0gVVNFUgorYWxpYXMgbD0nbHMnCithbGlhcyBsYT0nbCAtYScKK2FsaWFzIGxsPSdsIC1sJworYWxpYXMgbG89J2wgLWEgLWwnCisKK2ZvciBwIGluIH4vLmJpbjsgZG8KKwlbWyAtZCAkcC8uIF1dIHx8IGNvbnRpbnVlCisJW1sgOiRQQVRIOiA9ICo6JHA6KiBdXSB8fCBQQVRIPSRwOiRQQVRICitkb25lCisKK3Vuc2V0IHAKKworOiBwbGFjZSBjdXN0b21pc2F0aW9ucyBhYm92ZSB0aGlzIGxpbmUKZGlmZiAtLWdpdCBhL21rc2gvc3JjLzAwLU5PVEUudHh0IGIvbWtzaC9zcmMvMDAtTk9URS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUxZDU0MQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjLzAwLU5PVEUudHh0CkBAIC0wLDAgKzEsMjIgQEAKK1RoaXMgaXMgbWtzaCBmcm9tIEFub25DVlMgb24gMjAxMC0wOC0yNCB3aXRoIHRoZQorZm9sbG93aW5nIGZpbGVzIHJlbW92ZWQ6CivigKIgTWFrZWZpbGUKKyAgKG5vdCBwYXJ0IG9mIHJlZ3VsYXIgbWtzaCByZWxlYXNlcyBhbnl3YXkpCivigKIgZG90Lm1rc2hyYworICAobm90IG5lZWRlZCwgd2UgdXNlIG91ciBvd24gZm9yIEFuZHJvaWQpCivigKIgbWtzaC4xCisgIChtYW5wYWdlOyBhbHNvIGF2YWlsYWJsZSBmcm9tIHRoZSB3ZWIpCivigKIgc2V0bW9kZS5jCisgIChub3QgbmVlZGVkLCB3ZSBkb27igJl0IHVzZSB0aGUgbWtub2QgYnVpbHRpbikKK+KAoiBzdHJsY3B5LmMKKyAgKG5vdCBuZWVkZWQsIGJpb25pYyBwcm92aWRlcyB0aGlzKQorCitUaGUgbWFudWFsIHBhZ2UgY2FuIGJlIGRvd25sb2FkZWQgYXMgUERGIChJU08gQTQgcGFwZXIpIGZyb20KK2h0dHBzOi8vd3d3Lm1pcmJzZC5vcmcvTWlyT1MvZGlzdC9taXIvbWtzaC9ta3NoLnBkZiBvciByZWFkCitvbmxpbmUgYXQgaHR0cHM6Ly93d3cubWlyYnNkLm9yZy9tYW4xL21rc2ggKEhUTUwpLgorCitUaGUgZm9sbG93aW5nIGNoYW5nZXMgYXJlIGRvbmUgdG8gY29kZSBpbiB0aGlzIHN1YmRpcmVjdG9yeQorYXQgdGhlIG1vbWVudDoKK+KAoiBjaGVjay50IG1haW4uc2g6IHJlbW92ZSB0aGUgJ3N0b3AnIGFsaWFzIHRvICdraWxsIC1TVE9QJworICBzaW5jZSBBbmRyb2lkIGhhcyBhIGJ1aWx0IGluIHN0b3AgY29tbWFuZCB0aGF0IHRoZSBhbGlhcworICBvdmVycmlkZXMsIGNhdXNpbmcgcHJvYmxlbXMgd2l0aCB0ZXN0aW5nIHRvb2xzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvQnVpbGQuc2ggYi9ta3NoL3NyYy9CdWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOThiMWNhCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvQnVpbGQuc2gKQEAgLTAsMCArMSwxNjAwIEBACisjIS9iaW4vc2gKK3NyY3ZlcnNpb249JyRNaXJPUzogc3JjL2Jpbi9ta3NoL0J1aWxkLnNoLHYgMS40NTkgMjAxMC8wOC8yNCAxNTo0NjowNiB0ZyBFeHAgJCcKKyMtCisjIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorIwlUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisjCisjIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworIyBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyMgaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisjIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorIyBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorIworIyBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyMgdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisjIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorIyBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyMgZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisjIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorIyBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyMgb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyMtCisjIFBlb3BsZSBhbmFseXNpbmcgdGhlIG91dHB1dCBtdXN0IHdoaXRlbGlzdCBjb25mdGVzdC5jIGZvciBhbnkga2luZAorIyBvZiBjb21waWxlciB3YXJuaW5nIGNoZWNrcyAobWlydG9jb25mIGlzIGJ5IGRlc2lnbiBub3QgcXVpZXQpLgorIworIyBFbnZpcm9ubWVudCB1c2VkOglDQyBDRkxBR1MgQ1BQRkxBR1MgTERGTEFHUyBMSUJTIE5PV0FSTiBOUk9GRgorIwkJCVRBUkdFVF9PUyBUQVJHRVRfT1NSRVYKKyMgRmVhdHVyZSBzZWxlY3RvcnM6CVVTRV9QUklOVEZfQlVJTFRJTgorIyBDUFBGTEFHUyByZWNvZ25pc2VkOglNS1NIX0FTU1VNRV9VVEY4IE1LU0hfQklOU0hSRURVQ0VEIE1LU0hfQ0xTX1NUUklORworIwkJCU1LU0hfQ09OU0VSVkFUSVZFX0ZEUyBNS1NIX01JRE5JR0hUQlNEMDFBU0hfQ09NUEFUCisjCQkJTUtTSF9OT1BXTkFNIE1LU0hfTk9fTElNSVRTIE1LU0hfU01BTEwgTUtTSF9TX05PVkkKKyMJCQlNS1NIX1VORU1QTE9ZRUQgTUtTSF9ERUZBVUxUX0VYRUNTSEVMTCBNS1NIUkNfUEFUSAorIwkJCU1LU0hfREVGQVVMVF9UTVBESVIgTUtTSF9DTFJUT0VPTF9TVFJJTkcgTUtTSF9BNFBCCisKK0xDX0FMTD1DCitleHBvcnQgTENfQUxMCisKK3YoKSB7CisJJGUgIiQqIgorCWV2YWwgIiRAIgorfQorCit2digpIHsKKwlfYz0kMQorCXNoaWZ0CisJJGUgIlwkICQqIiAyPiYxCisJZXZhbCAiJEAiID52di5vdXQgMj4mMQorCXNlZCAicwdeByR7X2N9IAciIDx2di5vdXQKK30KKwordnEoKSB7CisJZXZhbCAiJEAiCit9CisKK3JtZigpIHsKKwlmb3IgX2YgaW4gIiRAIjsgZG8KKwkJY2FzZSAke19mfSBpbgorCQlta3NoLjEpIDs7CisJCSopIHJtIC1mICIke19mfSIgOzsKKwkJZXNhYworCWRvbmUKK30KKworaWYgdGVzdCAtZCAvdXNyL3hwZzQvYmluLy4gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJIyBTb2xhcmlzOiBzb21lIG9mIHRoZSB0b29scyBoYXZlIHdlaXJkIGJlaGF2aW91ciwgdXNlIHBvcnRhYmxlIG9uZXMKKwlQQVRIPS91c3IveHBnNC9iaW46JFBBVEgKKwlleHBvcnQgUEFUSAorZmkKKworaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTit4fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCWVtdWxhdGUgc2gKKwlOVUxMQ01EPToKK2ZpCisKK2FsbHU9UVdFUlRZVUlPUEFTREZHSEpLTFpYQ1ZCTk0KK2FsbGw9cXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm0KK2FsbG49MDEyMzQ1Njc4OQorYWxscz1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworbmw9JworJwordGNmbj1ubworYmk9Cit1aT0KK2FvPQorZng9CittZT1gYmFzZW5hbWUgIiQwImAKK29yaWdfQ0ZMQUdTPSRDRkxBR1MKK3BoYXNlPXgKK29sZGlzaF9lZD1zdGRvdXQtZWQsbm8tc3RkZXJyLWVkCisKK2lmIHRlc3QgLXQgMTsgdGhlbgorCWJpPScbWzFtJworCXVpPScbWzRtJworCWFvPScbWzBtJworZmkKKwordXBwZXIoKSB7CisJZWNobyA6IiRAIiB8IHNlZCAncy9eOi8vJyB8IHRyICRhbGxsICRhbGx1Cit9CisKKyMgY2xlYW4gdXAgYWZ0ZXIgYWNfdGVzdHJ1bigpCithY190ZXN0ZG9uZSgpIHsKKwlldmFsIEhBVkVfJGZ1PSRmdgorCWZyPW5vCisJdGVzdCAwID0gJGZ2IHx8IGZyPXllcworCSRlICIkYmk9PT4gJGZkLi4uJGFvICR1aSRmciRhbyRmeCIKKwlmeD0KK30KKworIyBhY19jYWNoZSBsYWJlbDogc2V0cyBmLCBmdSwgZnY/PTAKK2FjX2NhY2hlKCkgeworCWY9JDEKKwlmdT1gdXBwZXIgJGZgCisJZXZhbCBmdj1cJEhBVkVfJGZ1CisJY2FzZSAkZnYgaW4KKwkwfDEpCisJCWZ4PScgKGNhY2hlZCknCisJCXJldHVybiAwCisJCTs7CisJZXNhYworCWZ2PTAKKwlyZXR1cm4gMQorfQorCisjIGFjX3Rlc3Rpbml0IGxhYmVsIFshXSBjaGVja2lmWyFdMCBbc2V0bGFiZWxpZmNoZWNraXNbIV0wXSB1c2Vyb3V0cHV0CisjIHJldHVybnMgMSBpZiB2YWx1ZSB3YXMgY2FjaGVkL2ltcGxpZWQsIDAgb3RoZXJ3aXNlOiBjYWxsIGFjX3Rlc3Rkb25lCithY190ZXN0aW5pdCgpIHsKKwlpZiBhY19jYWNoZSAkMTsgdGhlbgorCQl0ZXN0IHgiJDIiID0geCIhIiAmJiBzaGlmdAorCQl0ZXN0IHgiJDIiID0geCIiIHx8IHNoaWZ0CisJCWZkPSR7My0kZn0KKwkJYWNfdGVzdGRvbmUKKwkJcmV0dXJuIDEKKwlmaQorCWZjPTAKKwlpZiB0ZXN0IHgiJDIiID0geCIiOyB0aGVuCisJCWZ0PTEKKwllbHNlCisJCWlmIHRlc3QgeCIkMiIgPSB4IiEiOyB0aGVuCisJCQlmYz0xCisJCQlzaGlmdAorCQlmaQorCQlldmFsIGZ0PVwkSEFWRV9gdXBwZXIgJDJgCisJCXNoaWZ0CisJZmkKKwlmZD0kezMtJGZ9CisJaWYgdGVzdCAkZmMgPSAiJGZ0IjsgdGhlbgorCQlmdj0kMgorCQlmeD0nIChpbXBsaWVkKScKKwkJYWNfdGVzdGRvbmUKKwkJcmV0dXJuIDEKKwlmaQorCSRlIC4uLiAkZmQKKwlyZXR1cm4gMAorfQorCisjIHBpcGUgLmMgfCBhY190ZXN0W25dIFshXSBsYWJlbCBbIV0gY2hlY2tpZlshXTAgW3NldGxhYmVsaWZjaGVja2lzWyFdMF0gdXNlcm91dHB1dAorYWNfdGVzdG4oKSB7CisJaWYgdGVzdCB4IiQxIiA9IHgiISI7IHRoZW4KKwkJZnI9MQorCQlzaGlmdAorCWVsc2UKKwkJZnI9MAorCWZpCisJYWNfdGVzdGluaXQgIiRAIiB8fCByZXR1cm4KKwljYXQgPmNvbmZ0ZXN0LmMKKwl2diAnXScgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOIGNvbmZ0ZXN0LmMgJExJQlMgJGNjcHIiCisJdGVzdCAkdGNmbiA9IG5vICYmIHRlc3QgLWYgYS5vdXQgJiYgdGNmbj1hLm91dAorCXRlc3QgJHRjZm4gPSBubyAmJiB0ZXN0IC1mIGEuZXhlICYmIHRjZm49YS5leGUKKwl0ZXN0ICR0Y2ZuID0gbm8gJiYgdGVzdCAtZiBjb25mdGVzdCAmJiB0Y2ZuPWNvbmZ0ZXN0CisJaWYgdGVzdCAtZiAkdGNmbjsgdGhlbgorCQl0ZXN0IDEgPSAkZnIgfHwgZnY9MQorCWVsc2UKKwkJdGVzdCAwID0gJGZyIHx8IGZ2PTEKKwlmaQorCXZzY2FuPQorCWlmIHRlc3QgJHBoYXNlID0gdTsgdGhlbgorCQl0ZXN0ICRjdCA9IGdjYyAmJiB2c2Nhbj0ndW5yZWNvZ25pW3N6XWVkJworCQl0ZXN0ICRjdCA9IGhwY2MgJiYgdnNjYW49J3Vuc3VwcG9ydGVkJworCQl0ZXN0ICRjdCA9IHBjYyAmJiB2c2Nhbj0ndW5zdXBwb3J0ZWQnCisJCXRlc3QgJGN0ID0gc3VucHJvICYmIHZzY2FuPSctZSBpZ25vcmVkIC1lIHR1cm5lZC5vZmYnCisJZmkKKwl0ZXN0IC1uICIkdnNjYW4iICYmIGdyZXAgJHZzY2FuIHZ2Lm91dCA+L2Rldi9udWxsIDI+JjEgJiYgZnY9JGZyCisJcm1mIGNvbmZ0ZXN0LmMgY29uZnRlc3QubyAke3RjZm59KiB2di5vdXQKKwlhY190ZXN0ZG9uZQorfQorCisjIGFjX2lmY3BwIGNwcGV4cHIgWyFdIGxhYmVsIFshXSBjaGVja2lmWyFdMCBbc2V0bGFiZWxpZmNoZWNraXNbIV0wXSB1c2Vyb3V0cHV0CithY19pZmNwcCgpIHsKKwlleHByPSQxOyBzaGlmdAorCWFjX3Rlc3RuICIkQCIgPDwtRU9GCisJCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgKKwkJIyRleHByCisJCSAgICAwCisJCSNlbHNlCisJCS8qIGZvcmNlIGEgZmFpbHVyZTogZXhwciBpcyBmYWxzZSAqLworCQkgICAgdGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkKKwkJI2VuZGlmCisJCSAgICApOyB9CitFT0YKKwl0ZXN0IHgiJDEiID0geCIhIiAmJiBzaGlmdAorCWY9JDEKKwlmdT1gdXBwZXIgJGZgCisJZXZhbCBmdj1cJEhBVkVfJGZ1CisJdGVzdCB4IiRmdiIgPSB4IjEiCit9CisKK2FjX2NwcGZsYWdzKCkgeworCXRlc3QgeCIkMSIgPSB4IiIgfHwgZnU9JDEKKwlmdj0kMgorCXRlc3QgeCIkMiIgPSB4IiIgJiYgZXZhbCBmdj1cJEhBVkVfJGZ1CisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfJGZ1PSRmdiIKK30KKworYWNfdGVzdCgpIHsKKwlhY190ZXN0biAiJEAiCisJYWNfY3BwZmxhZ3MKK30KKworIyBhY19mbGFncyBbLV0gYWRkIHZhcm5hbWUgZmxhZ3MgW3RleHRdCithY19mbGFncygpIHsKKwlpZiB0ZXN0IHgiJDEiID0geCItIjsgdGhlbgorCQlzaGlmdAorCQloZj0xCisJZWxzZQorCQloZj0wCisJZmkKKwlmYT0kMQorCXZuPSQyCisJZj0kMworCWZ0PSQ0CisJdGVzdCB4IiRmdCIgPSB4IiIgJiYgZnQ9ImlmICRmIGNhbiBiZSB1c2VkIgorCXNhdmVfQ0ZMQUdTPSRDRkxBR1MKKwlDRkxBR1M9IiRDRkxBR1MgJGYiCisJaWYgdGVzdCAxID0gJGhmOyB0aGVuCisJCWFjX3Rlc3RuIGNhbl8kdm4gJycgIiRmdCIKKwllbHNlCisJCWFjX3Rlc3RuIGNhbl8kdm4gJycgIiRmdCIgPDwtJ0VPRicKKwkJCS8qIGV2aWwgYXBvJ3N0cm9waCBpbiBjb21tZW50IHRlc3QgKi8KKwkJCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgwKTsgfQorCQlFT0YKKwlmaQorCWV2YWwgZnY9XCRIQVZFX0NBTl9gdXBwZXIgJHZuYAorCXRlc3QgMTEgPSAkZmEkZnYgfHwgQ0ZMQUdTPSRzYXZlX0NGTEFHUworfQorCisjIGFjX2hlYWRlciBbIV0gaGVhZGVyIFtwcmVyZXEgLi4uXQorYWNfaGVhZGVyKCkgeworCWlmIHRlc3QgeCIkMSIgPSB4IiEiOyB0aGVuCisJCW5hPTEKKwkJc2hpZnQKKwllbHNlCisJCW5hPTAKKwlmaQorCWhmPSQxOyBzaGlmdAorCWh2PWBlY2hvICIkaGYiIHwgdHIgLWQgJ1wwMTJcMDE1JyB8IHRyIC1jICRhbGxsJGFsbHUkYWxsbiAkYWxsc2AKKwlmb3IgaQorCWRvCisJCWVjaG8gIiNpbmNsdWRlIDwkaT4iID4+eAorCWRvbmUKKwllY2hvICIjaW5jbHVkZSA8JGhmPiIgPj54CisJZWNobyAnaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9JyA+PngKKwlhY190ZXN0biAiJGh2IiAiIiAiPCRoZj4iIDx4CisJcm1mIHgKKwl0ZXN0IDEgPSAkbmEgfHwgYWNfY3BwZmxhZ3MKK30KKworYWRkc3JjcygpIHsKKwlpZiB0ZXN0IHgiJDEiID0geCIhIjsgdGhlbgorCQlmcj0wCisJCXNoaWZ0CisJZWxzZQorCQlmcj0xCisJZmkKKwlldmFsIGk9XCQkMQorCXRlc3QgJGZyID0gIiRpIiAmJiBjYXNlICIgJFNSQ1MgIiBpbgorCSpcICQyXCAqKQk7OworCSopCQlTUkNTPSIkU1JDUyAkMiIgOzsKKwllc2FjCit9CisKKworaWYgdGVzdCAtZCBta3NoIHx8IHRlc3QgLWQgbWtzaC5leGU7IHRoZW4KKwllY2hvICIkbWU6IEVycm9yOiAuL21rc2ggaXMgYSBkaXJlY3RvcnkhIiA+JjIKKwlleGl0IDEKK2ZpCitybWYgYS5leGUqIGEub3V0KiBjb25mdGVzdC5jICpjb3JlIGxmdCBta3NoKiBubyAqLmJjICoubGwgKi5vIFwKKyAgICBSZWJ1aWxkLnNoIHNpZ25hbWVzLmluYyB0ZXN0LnNoIHggdnYub3V0CisKK2N1cmRpcj1gcHdkYCBzcmNkaXI9YGRpcm5hbWUgIiQwImAgY2hlY2tfY2F0ZWdvcmllcz0KK3Rlc3QgLW4gIiRkaXJuYW1lIiB8fCBkaXJuYW1lPS4KK2RzdHZlcnNpb249YHNlZCAtbiAnL2RlZmluZSBNS1NIX1ZFUlNJT04vcy9eLioiXCguKlwpIi4qJC9cMS9wJyAkc3JjZGlyL3NoLmhgCisKK2U9ZWNobworcj0wCitlcT0wCitwbT0wCitjbT1ub3JtYWwKK29wdGZsYWdzPS1zdGQtY29tcGlsZS1vcHRzCitsYXN0PQorCitmb3IgaQorZG8KKwljYXNlICRsYXN0OiRpIGluCisJYzpjb21iaW5lfGM6ZHJhZ29uZWdnfGM6bGx2bSkKKwkJY209JGkKKwkJbGFzdD0KKwkJOzsKKwljOiopCisJCWVjaG8gIiRtZTogVW5rbm93biBvcHRpb24gLWMgJyRpJyEiID4mMgorCQlleGl0IDEKKwkJOzsKKwlvOiopCisJCW9wdGZsYWdzPSRpCisJCWxhc3Q9CisJCTs7CisJOi1jKQorCQlsYXN0PWMKKwkJOzsKKwk6LWNvbWJpbmUpCisJCWNtPWNvbWJpbmUKKwkJZWNobyAiJG1lOiBXYXJuaW5nOiAnJGknIGlzIGRlcHJlY2F0ZWQsIHVzZSAnLWMgY29tYmluZScgaW5zdGVhZCEiID4mMgorCQk7OworCTotZykKKwkJIyBjaGVja2VyLCBkZWJ1ZywgdmFsZ3JpbmQgYnVpbGQKKwkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRERFQlVHIgorCQlDRkxBR1M9IiRDRkxBR1MgLWczIC1mbm8tYnVpbHRpbiIKKwkJOzsKKwk6LWopCisJCXBtPTEKKwkJOzsKKwk6LWxsdm0pCisJCWNtPWxsdm0KKwkJb3B0ZmxhZ3M9LXN0ZC1jb21waWxlLW9wdHMKKwkJZWNobyAiJG1lOiBXYXJuaW5nOiAnJGknIGlzIGRlcHJlY2F0ZWQsIHVzZSAnLWMgbGx2bSAtTycgaW5zdGVhZCEiID4mMgorCQk7OworCTotbGx2bT0qKQorCQljbT1sbHZtCisJCW9wdGZsYWdzPWBlY2hvICJ4JGkiIHwgc2VkICdzL154LWxsdm09Ly8nYAorCQllY2hvICIkbWU6IFdhcm5pbmc6ICckaScgaXMgZGVwcmVjYXRlZCwgdXNlICctYyBsbHZtIC1vICRsbHZtJyBpbnN0ZWFkISIgPiYyCisJCTs7CisJOi1NKQorCQljbT1tYWtlZmlsZQorCQk7OworCTotTykKKwkJb3B0ZmxhZ3M9LXN0ZC1jb21waWxlLW9wdHMKKwkJOzsKKwk6LW8pCisJCWxhc3Q9bworCQk7OworCTotUSkKKwkJZXE9MQorCQk7OworCTotcikKKwkJcj0xCisJCTs7CisJOi12KQorCQllY2hvICJCdWlsZC5zaCAkc3JjdmVyc2lvbiIKKwkJZWNobyAiZm9yIG1rc2ggJGRzdHZlcnNpb24iCisJCWV4aXQgMAorCQk7OworCToqKQorCQllY2hvICIkbWU6IFVua25vd24gb3B0aW9uICckaSchIiA+JjIKKwkJZXhpdCAxCisJCTs7CisJKikKKwkJZWNobyAiJG1lOiBVbmtub3duIG9wdGlvbiAtJyRsYXN0JyAnJGknISIgPiYyCisJCWV4aXQgMQorCQk7OworCWVzYWMKK2RvbmUKK2lmIHRlc3QgLW4gIiRsYXN0IjsgdGhlbgorCWVjaG8gIiRtZTogT3B0aW9uIC0nJGxhc3QnIG5vdCBmb2xsb3dlZCBieSBhcmd1bWVudCEiID4mMgorCWV4aXQgMQorZmkKKworU1JDUz0ibGFsbG9jLmMgZWRpdC5jIGV2YWwuYyBleGVjLmMgZXhwci5jIGZ1bmNzLmMgaGlzdHJhcC5jIgorU1JDUz0iJFNSQ1Mgam9icy5jIGxleC5jIG1haW4uYyBtaXNjLmMgc2hmLmMgc3luLmMgdHJlZS5jIHZhci5jIgorCitpZiB0ZXN0IHgiJHNyY2RpciIgPSB4Ii4iOyB0aGVuCisJQ1BQRkxBR1M9Ii1JLiAkQ1BQRkxBR1MiCitlbHNlCisJQ1BQRkxBR1M9Ii1JLiAtSSckc3JjZGlyJyAkQ1BQRkxBR1MiCitmaQorCit0ZXN0IHgiJFRBUkdFVF9PUyIgPSB4IiIgJiYgVEFSR0VUX09TPWB1bmFtZSAtcyAyPi9kZXYvbnVsbCB8fCB1bmFtZWAKK29zd2Fybj0KK2NjcGM9LVdjLAorY2NwbD0tV2wsCit0c3RzPQorY2Nwcj0nfHwgZm9yIF9mIGluICR7dGNmbn0qOyBkbyB0ZXN0IHgiJHtfZn0iID0geCJta3NoLjEiIHx8IHJtIC1mICIke19mfSI7IGRvbmUnCisKKyMgQ29uZmlndXJhdGlvbiBkZXBlbmRpbmcgb24gT1MgcmV2aXNpb24sIG9uIE9TZXMgdGhhdCBuZWVkIHRoZW0KK2Nhc2UgJFRBUkdFVF9PUyBpbgorUU5YKQorCXRlc3QgeCIkVEFSR0VUX09TUkVWIiA9IHgiIiAmJiBUQVJHRVRfT1NSRVY9YHVuYW1lIC1yYAorCTs7Citlc2FjCisKKyMgQ29uZmlndXJhdGlvbiBkZXBlbmRpbmcgb24gT1MgbmFtZQorY2FzZSAkVEFSR0VUX09TIGluCitBSVgpCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9BTExfU09VUkNFIgorCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQorCTs7CitCZU9TKQorCW9zd2Fybj0nIGFuZCB3aWxsIGN1cnJlbnRseSBub3Qgd29yaycKKwk7OworQlNEL09TKQorCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQorCTs7CitDWUdXSU4qKQorCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQorCTs7CitEYXJ3aW4pCisJOzsKK0RyYWdvbkZseSkKKwk7OworRnJlZUJTRCkKKwk7OworR05VKQorCSMgZGVmaW5lIE5PX1BBVEhfTUFYIHRvIHVzZSBIdXJkLW9ubHkgZnVuY3Rpb25zCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9HTlVfU09VUkNFIC1ETk9fUEFUSF9NQVgiCisJOzsKK0dOVS9rRnJlZUJTRCkKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0dOVV9TT1VSQ0UiCisJOzsKK0hhaWt1KQorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURNS1NIX0FTU1VNRV9VVEY4IgorCTs7CitIUC1VWCkKKwk7OworSW50ZXJpeCkKKwljY3BjPSctWCAnCisJY2NwbD0nLVkgJworCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfQUxMX1NPVVJDRSIKKwk6ICR7TElCUz0nLWxjcnlwdCd9CisJOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9CisJOzsKK0lSSVgqKQorCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQorCTs7CitMaW51eCkKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0dOVV9TT1VSQ0UiCisJOiAke0hBVkVfUkVWT0tFPTB9CisJOzsKK01pZG5pZ2h0QlNEKQorCTs7CitNaW5peCkKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1ETUtTSF9VTkVNUExPWUVEIC1ETUtTSF9DT05TRVJWQVRJVkVfRkRTIgorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURfUE9TSVhfU09VUkNFIC1EX1BPU0lYXzFfU09VUkNFPTIgLURfTUlOSVgiCisJb2xkaXNoX2VkPW5vLXN0ZGVyci1lZAkJIyAvdXNyL2Jpbi9lZCghKSBpcyBicm9rZW4KKwk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KKwk7OworTWlyQlNEKQorCTs7CitOZXRCU0QpCisJOzsKK09wZW5CU0QpCisJOiAke0hBVkVfU0VUTE9DQUxFX0NUWVBFPTB9CisJOzsKK09TRjEpCisJSEFWRV9TSUdfVD0wCSMgaW5jb21wYXRpYmxlCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9PU0ZfU09VUkNFIC1EX1BPU0lYX0NfU09VUkNFPTIwMDExMkwiCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9YT1BFTl9TT1VSQ0U9NjAwIC1EX1hPUEVOX1NPVVJDRV9FWFRFTkRFRCIKKwk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KKwk7OworUGxhbjkpCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9QT1NJWF9TT1VSQ0UgLURfTElNSVRTX0VYVEVOU0lPTiIKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0JTRF9FWFRFTlNJT04gLURfU1VTVjJfU09VUkNFIgorCW9zd2Fybj0nIGFuZCB3aWxsIGN1cnJlbnRseSBub3Qgd29yaycKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1ETUtTSF9BU1NVTUVfVVRGOCAtRE1LU0hfVU5FTVBMT1lFRCIKKwk7OworUFczMiopCisJSEFWRV9TSUdfVD0wCSMgaW5jb21wYXRpYmxlCisJb3N3YXJuPScgYW5kIHdpbGwgY3VycmVudGx5IG5vdCB3b3JrJworCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQorCTs7CitRTlgpCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9fTk9fRVhUX1FOWCIKKwljYXNlICRUQVJHRVRfT1NSRVYgaW4KKwlbMDEyMzQ1XS4qfDYuWzAxMjNdLip8Ni40LlswMV0pCisJCW9sZGlzaF9lZD1uby1zdGRlcnItZWQJCSMgb2xkaXNoIC9iaW4vZWQgaXMgYnJva2VuCisJCTs7CisJZXNhYworCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQorCTs7CitTdW5PUykKKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1EX0JTRF9TT1VSQ0UgLURfX0VYVEVOU0lPTlNfXyIKKwk7Oworc3lsbGFibGUpCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9HTlVfU09VUkNFIgorCW9zd2Fybj0nIGFuZCB3aWxsIGN1cnJlbnRseSBub3Qgd29yaycKKwk7OworVUxUUklYKQorCTogJHtDQz1jYyAtWVBPU0lYfQorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURzc2l6ZV90PWludCIKKwk6ICR7SEFWRV9TRVRMT0NBTEVfQ1RZUEU9MH0KKwk7OworVVdJTiopCisJY2NwYz0nLVljLCcKKwljY3BsPSctWWwsJworCXRzdHM9IiAzPD4vZGV2L3R0eSIKKwlvc3dhcm49IjsgaXQgd2lsbCBjb21waWxlLCBidXQgdGhlIHRhcmdldCIKKwlvc3dhcm49IiRvc3dhcm4ke25sfXBsYXRmb3JtIGl0c2VsZiBpcyB2ZXJ5IGZsYWtleS91bnJlbGlhYmxlIgorCTogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQorCTs7CisqKQorCW9zd2Fybj0nOyBpdCBtYXkgb3IgbWF5IG5vdCB3b3JrJworCTs7Citlc2FjCisKKzogJHtDQz1jY30gJHtOUk9GRj1ucm9mZn0KK3Rlc3QgMCA9ICRyICYmIGVjaG8gfCAkTlJPRkYgLXYgMj4mMSB8IGdyZXAgR05VID4vZGV2L251bGwgMj4mMSAmJiBcCisgICAgTlJPRkY9IiROUk9GRiAtYyIKKworIyB0aGlzIGFpZHMgbWUgaW4gdHJhY2luZyBGVEJGU2VuIHdpdGhvdXQgYWNjZXNzIHRvIHRoZSBidWlsZGQKKyRlICJIaSBmcm9tJGFvICRiaSRzcmN2ZXJzaW9uJGFvIG9uOiIKK2Nhc2UgJFRBUkdFVF9PUyBpbgorRGFyd2luKQorCXZ2ICd8JyAiaHdwcmVmcyBtYWNoaW5lX3R5cGUgb3NfdHlwZSBvc19jbGFzcyA+JjIiCisJdnYgJ3wnICJ1bmFtZSAtYSA+JjIiCisJOzsKK0lSSVgqKQorCXZ2ICd8JyAidW5hbWUgLWEgPiYyIgorCXZ2ICd8JyAiaGludiAtdiA+JjIiCisJOzsKK09TRjEpCisJdnYgJ3wnICJ1bmFtZSAtYSA+JjIiCisJdnYgJ3wnICIvdXNyL3NiaW4vc2l6ZXIgLXYgPiYyIgorCTs7CisqKQorCXZ2ICd8JyAidW5hbWUgLWEgPiYyIgorCTs7Citlc2FjCit0ZXN0IC16ICIkb3N3YXJuIiB8fCBlY2hvID4mMiAiCitXYXJuaW5nOiBta3NoIGhhcyBub3QgeWV0IGJlZW4gcG9ydGVkIHRvIG9yIHRlc3RlZCBvbiB5b3VyCitvcGVyYXRpbmcgc3lzdGVtICckVEFSR0VUX09TJyRvc3dhcm4uIElmIHlvdSBjYW4gcHJvdmlkZQorYSBzaGVsbCBhY2NvdW50IHRvIHRoZSBkZXZlbG9wZXIsIHRoaXMgbWF5IGltcHJvdmU7IHBsZWFzZQorZHJvcCB1cyBhIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBub3RpY2Ugb3IgZXZlbiBzZW5kIGluIGRpZmZzLgorIgorJGUgIiRiaSRtZTogQnVpbGRpbmcgdGhlIE1pckJTRCBLb3JuIFNoZWxsJGFvICR1aSRkc3R2ZXJzaW9uJGFvIgorCisjCisjIEJlZ2luIG9mIG1pcnRvY29uZiBjaGVja3MKKyMKKyRlICRiaSRtZTogU2Nhbm5pbmcgZm9yIGZ1bmN0aW9ucy4uLiBwbGVhc2UgaWdub3JlIGFueSBlcnJvcnMuJGFvCisKKyMKKyMgQ29tcGlsZXI6IHdoaWNoIG9uZT8KKyMKKyMgbm90ZXM6CisjIC0gSUNDIGRlZmluZXMgX19HTlVDX18gdG9vCisjIC0gR0NDIGRlZmluZXMgX19ocHV4IHRvbworIyAtIExMVk0rY2xhbmcgZGVmaW5lcyBfX0dOVUNfXyB0b28KKyMgLSBud2NjIGRlZmluZXMgX19HTlVDX18gdG9vCitDUFA9IiRDQyAtRSIKKyRlIC4uLiB3aGljaCBjb21waWxlciBzZWVtcyB0byBiZSB1c2VkCitjYXQgPmNvbmZ0ZXN0LmMgPDwnRU9GJworI2lmIGRlZmluZWQoX19JQ0MpIHx8IGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKK2N0PWljYworI2VsaWYgZGVmaW5lZChfX3hsQ19fKSB8fCBkZWZpbmVkKF9fSUJNQ19fKQorY3Q9eGxjCisjZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0MpCitjdD1zdW5wcm8KKyNlbGlmIGRlZmluZWQoX19BQ0tfXykKK2N0PWFjaworI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCitjdD1iY2MKKyNlbGlmIGRlZmluZWQoX19XQVRDT01DX18pCitjdD13YXRjb20KKyNlbGlmIGRlZmluZWQoX19NV0VSS1NfXykKK2N0PW1ldHJvd2Vya3MKKyNlbGlmIGRlZmluZWQoX19IUF9jYykKK2N0PWhwY2MKKyNlbGlmIGRlZmluZWQoX19ERUNDKSB8fCAoZGVmaW5lZChfX29zZl9fKSAmJiAhZGVmaW5lZChfX0dOVUNfXykpCitjdD1kZWMKKyNlbGlmIGRlZmluZWQoX19QR0kpCitjdD1wZ2kKKyNlbGlmIGRlZmluZWQoX19ETUNfXykKK2N0PWRtYworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKK2N0PW1zYworI2VsaWYgZGVmaW5lZChfX0FEU1BCTEFDS0ZJTl9fKSB8fCBkZWZpbmVkKF9fQURTUFRTX18pIHx8IGRlZmluZWQoX19BRFNQMjEwMDBfXykKK2N0PWFkc3AKKyNlbGlmIGRlZmluZWQoX19JQVJfU1lTVEVNU19JQ0NfXykKK2N0PWlhcgorI2VsaWYgZGVmaW5lZChTRENDKQorY3Q9c2RjYworI2VsaWYgZGVmaW5lZChfX1BDQ19fKQorY3Q9cGNjCisjZWxpZiBkZWZpbmVkKF9fVGVuRFJBX18pCitjdD10ZW5kcmEKKyNlbGlmIGRlZmluZWQoX19USU5ZQ19fKQorY3Q9dGNjCisjZWxpZiBkZWZpbmVkKF9fbGx2bV9fKSAmJiBkZWZpbmVkKF9fY2xhbmdfXykKK2N0PWNsYW5nCisjZWxpZiBkZWZpbmVkKF9fTldDQ19fKQorY3Q9bndjYworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKK2N0PWdjYworI2VsaWYgZGVmaW5lZChfQ09NUElMRVJfVkVSU0lPTikKK2N0PW1pcHNwcm8KKyNlbGlmIGRlZmluZWQoX19zZ2kpCitjdD1taXBzcHJvCisjZWxpZiBkZWZpbmVkKF9faHB1eCkgfHwgZGVmaW5lZChfX2hwdWEpCitjdD1ocGNjCisjZWxpZiBkZWZpbmVkKF9fdWx0cml4KQorY3Q9dWNvZGUKKyNlbHNlCitjdD11bmtub3duCisjZW5kaWYKK0VPRgorY3Q9dW5rbm93bgordnYgJ10nICIkQ1BQICRDRkxBR1MgJENQUEZMQUdTICROT1dBUk4gY29uZnRlc3QuYyB8IGdyZXAgY3Q9IHwgdHIgLWQgXFxcXDAxNSA+eCIKK3NlZCAncy9eL1sgLycgeAorZXZhbCBgY2F0IHhgCitybWYgeCB2di5vdXQKK2VjaG8gJ2ludCBtYWluKHZvaWQpIHsgcmV0dXJuICgwKTsgfScgPmNvbmZ0ZXN0LmMKK2Nhc2UgJGN0IGluCithY2spCisJIyB3b3JrIGFyb3VuZCAidGhlIGZhbW91cyBBQ0sgY29uc3QgYnVnIgorCUNQUEZMQUdTPSItRGNvbnN0PSAkQ1BQRkxBR1MiCisJOzsKK2Fkc3ApCisJZWNobyA+JjIgJ1dhcm5pbmc6IEFuYWxvZyBEZXZpY2VzIEMrKyBjb21waWxlciBmb3IgQmxhY2tmaW4sIFRpZ2VyU0hBUkMKKyAgICBhbmQgU0hBUkMgKDIxMDAwKSBEU1BzIGRldGVjdGVkLiBUaGlzIGNvbXBpbGVyIGhhcyBub3QgeWV0CisgICAgYmVlbiB0ZXN0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBta3NoLiBDb250aW51ZSBhdCB5b3VyCisgICAgb3duIHJpc2ssIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLicKKwk7OworYmNjKQorCWVjaG8gPiYyICJXYXJuaW5nOiBCb3JsYW5kIEMrKyBCdWlsZGVyIGRldGVjdGVkLiBUaGlzIGNvbXBpbGVyIG1pZ2h0CisgICAgcHJvZHVjZSBicm9rZW4gZXhlY3V0YWJsZXMuIENvbnRpbnVlIGF0IHlvdXIgb3duIHJpc2ssCisgICAgcGxlYXNlIHJlcG9ydCBzdWNjZXNzL2ZhaWx1cmUgdG8gdGhlIGRldmVsb3BlcnMuIgorCTs7CitjbGFuZykKKwkjIGRvZXMgbm90IHdvcmsgd2l0aCBjdXJyZW50ICJjY2MiIGNvbXBpbGVyIGRyaXZlcgorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLXZlcnNpb24iCisJIyB0aGlzIHdvcmtzLCBmb3Igbm93CisJdnYgJ3wnICIke0NMQU5HLWNsYW5nfSAtdmVyc2lvbiIKKwkjIGVuc3VyZSBjb21waWxlciBhbmQgbGlua2VyIGFyZSBpbiBzeW5jIHVubGVzcyBvdmVycmlkZGVuCisJY2FzZSAkQ0NDX0NDOiRDQ0NfTEQgaW4KKwk6KikJOzsKKwkqOikJQ0NDX0xEPSRDQ0NfQ0M7IGV4cG9ydCBDQ0NfTEQgOzsKKwllc2FjCisJOzsKK2RlYykKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC1WIgorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gLVdsLC1WIGNvbmZ0ZXN0LmMgJExJQlMiCisJOzsKK2RtYykKKwllY2hvID4mMiAiV2FybmluZzogRGlnaXRhbCBNYXJzIENvbXBpbGVyIGRldGVjdGVkLiBXaGVuIHJ1bm5pbmcgdW5kZXIiCisJZWNobyA+JjIgIiAgICBVV0lOLCBta3NoIHRlbmRzIHRvIGJlIHVuc3RhYmxlIGR1ZSB0byB0aGUgbGltaXRhdGlvbnMiCisJZWNobyA+JjIgIiAgICBvZiB0aGlzIHBsYXRmb3JtLiBDb250aW51ZSBhdCB5b3VyIG93biByaXNrLCIKKwllY2hvID4mMiAiICAgIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLiIKKwk7OworZ2NjKQorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gLXYgY29uZnRlc3QuYyAkTElCUyIKKwl2diAnfCcgJ2VjaG8gYCRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIFwKKwkgICAgLWR1bXBtYWNoaW5lYCBnY2NgJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gXAorCSAgICAkTElCUyAtZHVtcHZlcnNpb25gJworCTs7CitocGNjKQorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gLVYgY29uZnRlc3QuYyAkTElCUyIKKwk7OworaWFyKQorCWVjaG8gPiYyICdXYXJuaW5nOiBJQVIgU3lzdGVtcyAoaHR0cDovL3d3dy5pYXIuY29tKSBjb21waWxlciBmb3IgZW1iZWRkZWQKKyAgICBzeXN0ZW1zIGRldGVjdGVkLiBUaGlzIHVuc3VwcG9ydGVkIGNvbXBpbGVyIGhhcyBub3QgeWV0CisgICAgYmVlbiB0ZXN0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBta3NoLiBDb250aW51ZSBhdCB5b3VyCisgICAgb3duIHJpc2ssIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIHRoZSBkZXZlbG9wZXJzLicKKwk7OworaWNjKQorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLVYiCisJOzsKK21ldHJvd2Vya3MpCisJZWNobyA+JjIgJ1dhcm5pbmc6IE1ldHJvd2Vya3MgQyBjb21waWxlciBkZXRlY3RlZC4gVGhpcyBoYXMgbm90IHlldAorICAgIGJlZW4gdGVzdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbWtzaC4gQ29udGludWUgYXQgeW91cgorICAgIG93biByaXNrLCBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byB0aGUgZGV2ZWxvcGVycy4nCisJOzsKK21pcHNwcm8pCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtdmVyc2lvbiIKKwk7OworbXNjKQorCWNjcHI9CQkjIGVycm9ybGV2ZWxzIGFyZSBub3QgcmVsaWFibGUKKwljYXNlICRUQVJHRVRfT1MgaW4KKwlJbnRlcml4KQorCQlpZiBbWyAtbiAkQzg5X0NPTVBJTEVSIF1dOyB0aGVuCisJCQlDODlfQ09NUElMRVI9YG50cGF0aDJwb3NpeCAtYyAiJEM4OV9DT01QSUxFUiJgCisJCWVsc2UKKwkJCUM4OV9DT01QSUxFUj1DTC5FWEUKKwkJZmkKKwkJaWYgW1sgLW4gJEM4OV9MSU5LRVIgXV07IHRoZW4KKwkJCUM4OV9MSU5LRVI9YG50cGF0aDJwb3NpeCAtYyAiJEM4OV9MSU5LRVIiYAorCQllbHNlCisJCQlDODlfTElOS0VSPUxJTksuRVhFCisJCWZpCisJCXZ2ICd8JyAiJEM4OV9DT01QSUxFUiAvSEVMUCA+JjIiCisJCXZ2ICd8JyAiJEM4OV9MSU5LRVIgL0xJTksgPiYyIgorCQk7OworCWVzYWMKKwk7OworbndjYykKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC12ZXJzaW9uIgorCTs7CitwY2MpCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtdiIKKwk7OworcGdpKQorCWVjaG8gPiYyICdXYXJuaW5nOiBQR0kgZGV0ZWN0ZWQuIFRoaXMgdW5rbm93biBjb21waWxlciBoYXMgbm90IHlldAorICAgIGJlZW4gdGVzdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbWtzaC4gQ29udGludWUgYXQgeW91cgorICAgIG93biByaXNrLCBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byB0aGUgZGV2ZWxvcGVycy4nCisJOzsKK3NkY2MpCisJZWNobyA+JjIgJ1dhcm5pbmc6IHNkY2MgKGh0dHA6Ly9zZGNjLnNvdXJjZWZvcmdlLm5ldCksIHRoZSBzbWFsbCBkZXZpY2VzCisgICAgQyBjb21waWxlciBmb3IgZW1iZWRkZWQgc3lzdGVtcyBkZXRlY3RlZC4gVGhpcyBoYXMgbm90IHlldAorICAgIGJlZW4gdGVzdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbWtzaC4gQ29udGludWUgYXQgeW91cgorICAgIG93biByaXNrLCBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byB0aGUgZGV2ZWxvcGVycy4nCisJOzsKK3N1bnBybykKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOIC1WIGNvbmZ0ZXN0LmMgJExJQlMiCisJOzsKK3RjYykKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC12IgorCTs7Cit0ZW5kcmEpCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAkTElCUyAtViAyPiYxIHwgXAorCSAgICBmZ3JlcCAtaSAtZSB2ZXJzaW9uIC1lIHJlbGVhc2UiCisJOzsKK3Vjb2RlKQorCXZ2ICd8JyAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICROT1dBUk4gJExJQlMgLVYiCisJdnYgJ3wnICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgJE5PV0FSTiAtV2wsLVYgY29uZnRlc3QuYyAkTElCUyIKKwk7Oword2F0Y29tKQorCWVjaG8gPiYyICdXYXJuaW5nOiBXYXRjb20gQyBDb21waWxlciBkZXRlY3RlZC4gVGhpcyBjb21waWxlciBoYXMgbm90IHlldAorICAgIGJlZW4gdGVzdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbWtzaC4gQ29udGludWUgYXQgeW91cgorICAgIG93biByaXNrLCBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byB0aGUgZGV2ZWxvcGVycy4nCisJOzsKK3hsYykKKwl2diAnfCcgIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyAkTk9XQVJOICRMSUJTIC1xdmVyc2lvbj12ZXJib3NlIgorCXZ2ICd8JyAibGQgLVYiCisJOzsKKyopCisJY3Q9dW5rbm93bgorCTs7Citlc2FjCitjYXNlICRjbSBpbgorZHJhZ29uZWdnfGxsdm0pCisJdnYgJ3wnICJsbGMgLXZlcnNpb24iCisJOzsKK2VzYWMKKyRlICIkYmk9PT4gd2hpY2ggY29tcGlsZXIgc2VlbXMgdG8gYmUgdXNlZC4uLiRhbyAkdWkkY3QkYW8iCitybWYgY29uZnRlc3QuYyBjb25mdGVzdC5vIGNvbmZ0ZXN0IGEub3V0KiBhLmV4ZSogdnYub3V0CisKKyMKKyMgQ29tcGlsZXI6IHdvcmtzIGFzLWlzLCB3aXRoIC1Xbm8tZXJyb3IgYW5kIC1XZXJyb3IKKyMKK3NhdmVfTk9XQVJOPSROT1dBUk4KK05PV0FSTj0KK0RPV0FSTj0KK2FjX2ZsYWdzIDAgY29tcGlsZXJfd29ya3MgJycgJ2lmIHRoZSBjb21waWxlciB3b3JrcycKK3Rlc3QgMSA9ICRIQVZFX0NBTl9DT01QSUxFUl9XT1JLUyB8fCBleGl0IDEKK0hBVkVfQ09NUElMRVJfS05PV049MAordGVzdCAkY3QgPSB1bmtub3duIHx8IEhBVkVfQ09NUElMRVJfS05PV049MQoraWYgYWNfaWZjcHAgJ2lmIDAnIGNvbXBpbGVyX2ZhaWxzICcnIFwKKyAgICAnaWYgdGhlIGNvbXBpbGVyIGRvZXMgbm90IGZhaWwgY29ycmVjdGx5JzsgdGhlbgorCXNhdmVfQ0ZMQUdTPSRDRkxBR1MKKwk6ICR7SEFWRV9DQU5fREVMRVhFPXh9CisJaWYgdGVzdCAkY3QgPSBkbWM7IHRoZW4KKwkJQ0ZMQUdTPSIkQ0ZMQUdTICR7Y2NwbH0vREVMRVhFQ1VUQUJMRSIKKwkJYWNfdGVzdG4gY2FuX2RlbGV4ZSBjb21waWxlcl9mYWlscyAwICdmb3IgdGhlIC9ERUxFWEVDVVRBQkxFIGxpbmtlciBvcHRpb24nIDw8LUVPRgorCQkJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9CisJCUVPRgorCWVsaWYgdGVzdCAkY3QgPSBkZWM7IHRoZW4KKwkJQ0ZMQUdTPSIkQ0ZMQUdTICR7Y2NwbH0tbm9uX3NoYXJlZCIKKwkJYWNfdGVzdG4gY2FuX2RlbGV4ZSBjb21waWxlcl9mYWlscyAwICdmb3IgdGhlIC1ub25fc2hhcmVkIGxpbmtlciBvcHRpb24nIDw8LUVPRgorCQkJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9CisJCUVPRgorCWVsc2UKKwkJZXhpdCAxCisJZmkKKwl0ZXN0IDEgPSAkSEFWRV9DQU5fREVMRVhFIHx8IENGTEFHUz0kc2F2ZV9DRkxBR1MKKwlhY190ZXN0biBjb21waWxlcl9zdGlsbF9mYWlscyAnJyAnaWYgdGhlIGNvbXBpbGVyIHN0aWxsIGRvZXMgbm90IGZhaWwgY29ycmVjdGx5JyA8PC1FT0YKKwlFT0YKKwl0ZXN0IDEgPSAkSEFWRV9DT01QSUxFUl9TVElMTF9GQUlMUyAmJiBleGl0IDEKK2ZpCitpZiBhY19pZmNwcCAnaWZkZWYgX19USU5ZQ19fJyBjb3VsZGJlX3RjYyAnIScgY29tcGlsZXJfa25vd24gMCBcCisgICAgJ2lmIHRoaXMgY291bGQgYmUgdGNjJzsgdGhlbgorCWN0PXRjYworCUNQUD0nY3BwIC1EX19USU5ZQ19fJworZmkKKworaWYgdGVzdCAkY3QgPSBzdW5wcm87IHRoZW4KKwl0ZXN0IHgiJHNhdmVfTk9XQVJOIiA9IHgiIiAmJiBzYXZlX05PV0FSTj0nLWVycndhcm49JW5vbmUnCisJYWNfZmxhZ3MgMCBlcnJ3YXJubm9uZSAiJHNhdmVfTk9XQVJOIgorCXRlc3QgMSA9ICRIQVZFX0NBTl9FUlJXQVJOTk9ORSB8fCBzYXZlX05PV0FSTj0KKwlhY19mbGFncyAwIGVycndhcm5hbGwgIi1lcnJ3YXJuPSVhbGwiCisJdGVzdCAxID0gJEhBVkVfQ0FOX0VSUldBUk5BTEwgJiYgRE9XQVJOPSItZXJyd2Fybj0lYWxsIgorZWxpZiB0ZXN0ICRjdCA9IGhwY2M7IHRoZW4KKwlzYXZlX05PV0FSTj0KKwlET1dBUk49K1dlCitlbGlmIHRlc3QgJGN0ID0gbWlwc3BybzsgdGhlbgorCXNhdmVfTk9XQVJOPQorCURPV0FSTj0iLWRpYWdfZXJyb3IgMS0xMDAwMCIKK2VsaWYgdGVzdCAkY3QgPSBtc2M7IHRoZW4KKwlzYXZlX05PV0FSTj0iJHtjY3BjfS93IgorCURPV0FSTj0iJHtjY3BjfS9XWCIKK2VsaWYgdGVzdCAkY3QgPSBkbWM7IHRoZW4KKwlzYXZlX05PV0FSTj0iJHtjY3BjfS13IgorCURPV0FSTj0iJHtjY3BjfS13eCIKK2VsaWYgdGVzdCAkY3QgPSBiY2M7IHRoZW4KKwlzYXZlX05PV0FSTj0iJHtjY3BjfS13IgorCURPV0FSTj0iJHtjY3BjfS13ISIKK2VsaWYgdGVzdCAkY3QgPSBkZWM7IHRoZW4KKwk6IC1tc2dfKiBmbGFncyBub3QgdXNlZCB5ZXQsIG9yIGlzIC13MiBjb3JyZWN0PworZWxpZiB0ZXN0ICRjdCA9IHhsYzsgdGhlbgorCXNhdmVfTk9XQVJOPS1xZmxhZz1pOmUKKwlET1dBUk49LXFmbGFnPWk6aQorZWxpZiB0ZXN0ICRjdCA9IHRlbmRyYTsgdGhlbgorCXNhdmVfTk9XQVJOPS13CitlbGlmIHRlc3QgJGN0ID0gdWNvZGU7IHRoZW4KKwlzYXZlX05PV0FSTj0KKwlET1dBUk49LXcyCitlbHNlCisJdGVzdCB4IiRzYXZlX05PV0FSTiIgPSB4IiIgJiYgc2F2ZV9OT1dBUk49LVduby1lcnJvcgorCWFjX2ZsYWdzIDAgd25vZXJyb3IgIiRzYXZlX05PV0FSTiIKKwl0ZXN0IDEgPSAkSEFWRV9DQU5fV05PRVJST1IgfHwgc2F2ZV9OT1dBUk49CisJYWNfZmxhZ3MgMCB3ZXJyb3IgLVdlcnJvcgorCXRlc3QgMSA9ICRIQVZFX0NBTl9XRVJST1IgJiYgRE9XQVJOPS1XZXJyb3IKK2ZpCisKK3Rlc3QgJGN0ID0gaWNjICYmIERPV0FSTj0iJERPV0FSTiAtd2QxNDE5IgorTk9XQVJOPSRzYXZlX05PV0FSTgorCisjCisjIENvbXBpbGVyOiBleHRyYSBmbGFncyAoLU8yIC1mKiAtVyogZXRjLikKKyMKK2k9YGVjaG8gOiIkb3JpZ19DRkxBR1MiIHwgc2VkICdzL146Ly8nIHwgdHIgLWMgLWQgJGFsbGwkYWxsdSRhbGxuYAorIyBvcHRpbWlzYXRpb246IG9ubHkgaWYgb3JpZ19DRkxBR1MgaXMgZW1wdHkKK3Rlc3QgeCIkaSIgPSB4IiIgJiYgaWYgdGVzdCAkY3QgPSBzdW5wcm87IHRoZW4KKwljYXQgPnggPDwtJ0VPRicKKwkJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9CisJCSNkZWZpbmUgX19JRFNUUklOR19DT05DQVQobCxwKQlfX0xJTlRFRF9fICMjIGwgIyMgXyAjIyBwCisJCSNkZWZpbmUgX19JRFNUUklOR19FWFBBTkQobCxwKQlfX0lEU1RSSU5HX0NPTkNBVChsLHApCisJCSNkZWZpbmUgcGFkCQkJdm9pZCBfX0lEU1RSSU5HX0VYUEFORChfX0xJTkVfXyx4KSh2b2lkKSB7IH0KKwlFT0YKKwl5ZXMgcGFkIHwgaGVhZCAtbiAyNTYgPj54CisJYWNfZmxhZ3MgLSAxIG90d28gLXhPMiA8eAorCXJtZiB4CitlbGlmIHRlc3QgJGN0ID0gaHBjYzsgdGhlbgorCXBoYXNlPXUKKwlhY19mbGFncyAxIG90d28gK08yCisJcGhhc2U9eAorZWxpZiB0ZXN0ICRjdCA9IHhsYzsgdGhlbgorCWFjX2ZsYWdzIDEgb3RocmVlICItTzMgLXFzdHJpY3QiCisJdGVzdCAxID0gJEhBVkVfQ0FOX09USFJFRSB8fCBhY19mbGFncyAxIG90d28gLU8yCitlbGlmIHRlc3QgJGN0ID0gdGNjIHx8IHRlc3QgJGN0ID0gdGVuZHJhOyB0aGVuCisJOiBubyBzcGVjaWFsIG9wdGltaXNhdGlvbgorZWxzZQorCWFjX2ZsYWdzIDEgb3R3byAtTzIKKwl0ZXN0IDEgPSAkSEFWRV9DQU5fT1RXTyB8fCBhY19mbGFncyAxIG9wdGltaXNlIC1PCitmaQorIyBvdGhlciBmbGFnczoganVzdCBhZGQgdGhlbSBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQKK2k9MAoraWYgdGVzdCAkY3QgPSBnY2M7IHRoZW4KKwkjIFRoZSBmb2xsb3dpbmcgdGVzdHMgcnVuIHdpdGggLVdlcnJvciAoZ2NjIG9ubHkpIGlmIHBvc3NpYmxlCisJTk9XQVJOPSRET1dBUk47IHBoYXNlPXUKKwlhY19mbGFncyAxIGZub3N0cmljdGFsaWFzaW5nIC1mbm8tc3RyaWN0LWFsaWFzaW5nCisJYWNfZmxhZ3MgMSBmc3RhY2twcm90ZWN0b3JhbGwgLWZzdGFjay1wcm90ZWN0b3ItYWxsCisJYWNfZmxhZ3MgMSBmd3JhcHYgLWZ3cmFwdgorCXRlc3QgJGNtID0gY29tYmluZSAmJiBhY19mbGFncyAwIGNvbWJpbmUgXAorCSAgICAnLWZ3aG9sZS1wcm9ncmFtIC0tY29tYmluZScgXAorCSAgICAnaWYgZ2NjIHN1cHBvcnRzIC1md2hvbGUtcHJvZ3JhbSAtLWNvbWJpbmUnCisJaT0xCitlbGlmIHRlc3QgJGN0ID0gaWNjOyB0aGVuCisJYWNfZmxhZ3MgMSBmbm9idWlsdGluc2V0bW9kZSAtZm5vLWJ1aWx0aW4tc2V0bW9kZQorCWFjX2ZsYWdzIDEgZm5vc3RyaWN0YWxpYXNpbmcgLWZuby1zdHJpY3QtYWxpYXNpbmcKKwlhY19mbGFncyAxIGZzdGFja3NlY3VyaXR5Y2hlY2sgLWZzdGFjay1zZWN1cml0eS1jaGVjaworCWk9MQorZWxpZiB0ZXN0ICRjdCA9IHN1bnBybzsgdGhlbgorCXBoYXNlPXUKKwlhY19mbGFncyAxIHYgLXYKKwlhY19mbGFncyAxIHhjOTkgLXhjOTkgJ2ZvciBzdXBwb3J0IG9mIElTTyBDOTknCisJYWNfZmxhZ3MgMSBpcG8gLXhpcG8gJ2ZvciBjcm9zcy1tb2R1bGUgb3B0aW1pc2F0aW9uJworCXBoYXNlPXgKK2VsaWYgdGVzdCAkY3QgPSBocGNjOyB0aGVuCisJcGhhc2U9dQorCWFjX2ZsYWdzIDEgYWdjYyAtQWdjYyAnZm9yIHN1cHBvcnQgb2YgR0NDIGV4dGVuc2lvbnMnCisJYWNfZmxhZ3MgMSBhYzk5IC1BQzk5ICdmb3Igc3VwcG9ydCBvZiBJU08gQzk5JworCXBoYXNlPXgKK2VsaWYgdGVzdCAkY3QgPSBkZWM7IHRoZW4KKwlhY19mbGFncyAwIHZlcmIgLXZlcmJvc2UKKwlhY19mbGFncyAxIHJvZGF0YSAtcmVhZG9ubHlfc3RyaW5ncworZWxpZiB0ZXN0ICRjdCA9IGRtYzsgdGhlbgorCWFjX2ZsYWdzIDEgZGVjbCAiJHtjY3BjfS1yIiAnZm9yIHN0cmljdCBwcm90b3R5cGUgY2hlY2tzJworCWFjX2ZsYWdzIDEgc2NoayAiJHtjY3BjfS1zIiAnZm9yIHN0YWNrIG92ZXJmbG93IGNoZWNraW5nJworZWxpZiB0ZXN0ICRjdCA9IGJjYzsgdGhlbgorCWFjX2ZsYWdzIDEgc3RycG9vbCAiJHtjY3BjfS1kIiAnaWYgc3RyaW5nIHBvb2xpbmcgY2FuIGJlIGVuYWJsZWQnCitlbGlmIHRlc3QgJGN0ID0gbWlwc3BybzsgdGhlbgorCWFjX2ZsYWdzIDEgeGM5OSAtYzk5ICdmb3Igc3VwcG9ydCBvZiBJU08gQzk5JworCWFjX2ZsYWdzIDEgZnVsbHdhcm4gLWZ1bGx3YXJuICdmb3IgcmVtYXJrIG91dHB1dCBzdXBwb3J0JworZWxpZiB0ZXN0ICRjdCA9IG1zYzsgdGhlbgorCWFjX2ZsYWdzIDEgc3RycG9vbCAiJHtjY3BjfS9HRiIgJ2lmIHN0cmluZyBwb29saW5nIGNhbiBiZSBlbmFibGVkJworCWVjaG8gJ2ludCBtYWluKHZvaWQpIHsgY2hhciB0ZXN0WzY0XSA9ICIiOyByZXR1cm4gKCp0ZXN0KTsgfScgPngKKwlhY19mbGFncyAtIDEgc3RhY2tvbiAiJHtjY3BjfS9HWiIgJ2lmIHN0YWNrIGNoZWNrcyBjYW4gYmUgZW5hYmxlZCcgPHgKKwlhY19mbGFncyAtIDEgc3Rja2FsbCAiJHtjY3BjfS9HZSIgJ3N0YWNrIGNoZWNrcyBmb3IgYWxsIGZ1bmN0aW9ucycgPHgKKwlhY19mbGFncyAtIDEgc2VjdWNoayAiJHtjY3BjfS9HUyIgJ2ZvciBjb21waWxlciBzZWN1cml0eSBjaGVja3MnIDx4CisJcm1mIHgKKwlhY19mbGFncyAxIHdhbGwgIiR7Y2NwY30vV2FsbCIgJ3RvIGVuYWJsZSBhbGwgd2FybmluZ3MnCisJYWNfZmxhZ3MgMSB3cDY0ICIke2NjcGN9L1dwNjQiICd0byBlbmFibGUgNjQtYml0IHdhcm5pbmdzJworZWxpZiB0ZXN0ICRjdCA9IHhsYzsgdGhlbgorCWFjX2ZsYWdzIDEgeDk5IC1xbGFuZ2x2bD1leHRjOTkKKwl0ZXN0IDEgPSAkSEFWRV9DQU5fWDk5IHx8IGFjX2ZsYWdzIDEgYzk5IC1xbGFuZ2x2bD1zdGRjOTkKKwlhY19mbGFncyAxIHJvZGF0YSAiLXFybyAtcXJvY29uc3QgLXFyb3B0ciIKKwlhY19mbGFncyAxIHJ0Y2hlY2sgLXFjaGVjaz1hbGwKKwlhY19mbGFncyAxIHJ0Y2hrYyAtcWV4dGNoaworCWFjX2ZsYWdzIDEgd2Zvcm1hdCAiLXFmb3JtYXQ9YWxsIC1xZm9ybWF0PW5vemxuIgorCSNhY19mbGFncyAxIHdwNjQgLXF3YXJuNjQJIyB0b28gdmVyYm9zZSBmb3Igbm93CitlbGlmIHRlc3QgJGN0ID0gdGVuZHJhOyB0aGVuCisJYWNfZmxhZ3MgMCB5c3lzdGVtIC1Zc3lzdGVtCisJdGVzdCAxID0gJEhBVkVfQ0FOX1lTWVNURU0gJiYgQ1BQRkxBR1M9Ii1Zc3lzdGVtICRDUFBGTEFHUyIKKwlhY19mbGFncyAxIGV4dGFuc2kgLVhhCitlbGlmIHRlc3QgJGN0ID0gdGNjOyB0aGVuCisJYWNfZmxhZ3MgMSBib3VuZHNjaGsgLWIKK2VsaWYgdGVzdCAkY3QgPSBjbGFuZzsgdGhlbgorCWk9MQorZWxpZiB0ZXN0ICRjdCA9IG53Y2M7IHRoZW4KKwlpPTEKKwkjYnJva2VuIyBhY19mbGFncyAxIHNzcCAtc3RhY2twcm90ZWN0CitmaQorIyBmbGFncyBjb21tb24gdG8gYSBzdWJzZXQgb2YgY29tcGlsZXJzIChydW4gd2l0aCAtV2Vycm9yIG9uIGdjYykKK2lmIHRlc3QgMSA9ICRpOyB0aGVuCisJYWNfZmxhZ3MgMSBzdGRnOTkgLXN0ZD1nbnU5OSAnZm9yIHN1cHBvcnQgb2YgSVNPIEM5OSArIEdDQyBleHRlbnNpb25zJworCXRlc3QgMSA9ICRIQVZFX0NBTl9TVERHOTkgfHwgXAorCSAgICBhY19mbGFncyAxIHN0ZGM5OSAtc3RkPWM5OSAnZm9yIHN1cHBvcnQgb2YgSVNPIEM5OScKKwlhY19mbGFncyAxIHdhbGwgLVdhbGwKK2ZpCitwaGFzZT14CisKKyMgVGhlIGZvbGxvd2luZyB0ZXN0cyBydW4gd2l0aCAtV2Vycm9yIG9yIHNpbWlsYXIgKGFsbCBjb21waWxlcnMpIGlmIHBvc3NpYmxlCitOT1dBUk49JERPV0FSTgordGVzdCAkY3QgPSBwY2MgJiYgcGhhc2U9dQorCisjCisjIENvbXBpbGVyOiBjaGVjayBmb3Igc3R1ZmYgdGhhdCBvbmx5IGdlbmVyYXRlcyB3YXJuaW5ncworIworYWNfdGVzdCBhdHRyaWJ1dGVfYm91bmRlZCAnJyAnZm9yIF9fYXR0cmlidXRlX18oKGJvdW5kZWQpKScgPDwtJ0VPRicKKwkjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMikKKwkvKiBmb3JjZSBhIGZhaWx1cmU6IGdjYyAxLjQyIGhhcyBhIGZhbHNlIHBvc2l0aXZlIGhlcmUgKi8KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAodGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkpOyB9CisJI2Vsc2UKKwkjaW5jbHVkZSA8c3RyaW5nLmg+CisJI3VuZGVmIF9fYXR0cmlidXRlX18KKwlpbnQgeGNvcHkoY29uc3Qgdm9pZCAqLCB2b2lkICosIHNpemVfdCkKKwkgICAgX19hdHRyaWJ1dGVfXygoYm91bmRlZCAoYnVmZmVyLCAxLCAzKSkpCisJICAgIF9fYXR0cmlidXRlX18oKGJvdW5kZWQgKGJ1ZmZlciwgMiwgMykpKTsKKwlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pIHsgcmV0dXJuICh4Y29weShhdlswXSwgYXZbLS1hY10sIDEpKTsgfQorCWludCB4Y29weShjb25zdCB2b2lkICpzLCB2b2lkICpkLCBzaXplX3QgbikgeworCQltZW1tb3ZlKGQsIHMsIG4pOyByZXR1cm4gKChpbnQpbik7CisJfQorCSNlbmRpZgorRU9GCithY190ZXN0IGF0dHJpYnV0ZV9mb3JtYXQgJycgJ2ZvciBfX2F0dHJpYnV0ZV9fKChmb3JtYXQpKScgPDwtJ0VPRicKKwkjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMikKKwkvKiBmb3JjZSBhIGZhaWx1cmU6IGdjYyAxLjQyIGhhcyBhIGZhbHNlIHBvc2l0aXZlIGhlcmUgKi8KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAodGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkpOyB9CisJI2Vsc2UKKwkjaW5jbHVkZSA8c3RkaW8uaD4KKwkjdW5kZWYgX19hdHRyaWJ1dGVfXworCSN1bmRlZiBwcmludGYKKwlleHRlcm4gaW50IHByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKwkgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CisJaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpIHsgcmV0dXJuIChwcmludGYoIiVzJWQiLCAqYXYsIGFjKSk7IH0KKwkjZW5kaWYKK0VPRgorYWNfdGVzdCBhdHRyaWJ1dGVfbm9ubnVsbCAnJyAnZm9yIF9fYXR0cmlidXRlX18oKG5vbm51bGwpKScgPDwtJ0VPRicKKwkjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMikKKwkvKiBmb3JjZSBhIGZhaWx1cmU6IGdjYyAxLjQyIGhhcyBhIGZhbHNlIHBvc2l0aXZlIGhlcmUgKi8KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAodGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkpOyB9CisJI2Vsc2UKKwlpbnQgZm9vKGNoYXIgKnMxLCBjaGFyICpzMikgX19hdHRyaWJ1dGVfXygobm9ubnVsbCkpOworCWludCBiYXIoY2hhciAqczEsIGNoYXIgKnMyKSBfX2F0dHJpYnV0ZV9fKChub25udWxsICgxLCAyKSkpOworCWludCBiYXooY2hhciAqcykgX19hdHRyaWJ1dGVfXygobm9ubnVsbCAoMSkpKTsKKwlpbnQgZm9vKGNoYXIgKnMxLCBjaGFyICpzMikgeyByZXR1cm4gKGJhcihzMiwgczEpKTsgfQorCWludCBiYXIoY2hhciAqczEsIGNoYXIgKnMyKSB7IHJldHVybiAoYmF6KHMxKSAtIGJheihzMikpOyB9CisJaW50IGJheihjaGFyICpzKSB7IHJldHVybiAoKnMpOyB9CisJaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpIHsgcmV0dXJuIChhYyA9PSBmb28oYXZbMF0sIGF2W2FjLTFdKSk7IH0KKwkjZW5kaWYKK0VPRgorYWNfdGVzdCBhdHRyaWJ1dGVfbm9yZXR1cm4gJycgJ2ZvciBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpJyA8PC0nRU9GJworCSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPCAyKQorCS8qIGZvcmNlIGEgZmFpbHVyZTogZ2NjIDEuNDIgaGFzIGEgZmFsc2UgcG9zaXRpdmUgaGVyZSAqLworCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICh0aGlzd2lsbG5ldmVyYmVkZWZpbmVkSWhvcGUoKSk7IH0KKwkjZWxzZQorCSNpbmNsdWRlIDxzdGRsaWIuaD4KKwkjdW5kZWYgX19hdHRyaWJ1dGVfXworCXZvaWQgZm5vcmQodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKwlpbnQgbWFpbih2b2lkKSB7IGZub3JkKCk7IH0KKwl2b2lkIGZub3JkKHZvaWQpIHsgZXhpdCgwKTsgfQorCSNlbmRpZgorRU9GCithY190ZXN0IGF0dHJpYnV0ZV91bnVzZWQgJycgJ2ZvciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKScgPDwtJ0VPRicKKwkjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDwgMikKKwkvKiBmb3JjZSBhIGZhaWx1cmU6IGdjYyAxLjQyIGhhcyBhIGZhbHNlIHBvc2l0aXZlIGhlcmUgKi8KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAodGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkpOyB9CisJI2Vsc2UKKwlpbnQgbWFpbihpbnQgYWMgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIGNoYXIgKiphdgorCSAgICBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkgeyByZXR1cm4gKDApOyB9CisJI2VuZGlmCitFT0YKK2FjX3Rlc3QgYXR0cmlidXRlX3VzZWQgJycgJ2ZvciBfX2F0dHJpYnV0ZV9fKCh1c2VkKSknIDw8LSdFT0YnCisJI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA8IDIpCisJLyogZm9yY2UgYSBmYWlsdXJlOiBnY2MgMS40MiBoYXMgYSBmYWxzZSBwb3NpdGl2ZSBoZXJlICovCisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKHRoaXN3aWxsbmV2ZXJiZWRlZmluZWRJaG9wZSgpKTsgfQorCSNlbHNlCisJc3RhdGljIGNvbnN0IGNoYXIgZm5vcmRbXSBfX2F0dHJpYnV0ZV9fKCh1c2VkKSkgPSAiNDIiOworCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgwKTsgfQorCSNlbmRpZgorRU9GCisKKyMgRW5kIG9mIHRlc3RzIHJ1biB3aXRoIC1XZXJyb3IKK05PV0FSTj0kc2F2ZV9OT1dBUk4KK3BoYXNlPXgKKworIworIyBta3NoOiBmbGF2b3VycyAoZnVsbC9zbWFsbCBta3NoLCBvbWl0IGNlcnRhaW4gc3R1ZmYpCisjCitpZiBhY19pZmNwcCAnaWZkZWYgTUtTSF9TTUFMTCcgaXNzZXRfTUtTSF9TTUFMTCAnJyBcCisgICAgImlmIGEgcmVkdWNlZC1mZWF0dXJlIG1rc2ggaXMgcmVxdWVzdGVkIjsgdGhlbgorCSNYWFggdGhpcyBzdWNrczsgZml4IGl0IGZvciAqYWxsKiBjb21waWxlcnMKKwljYXNlICRjdCBpbgorCWNsYW5nfGljY3xud2NjKQorCQlhY19mbGFncyAxIGZub2lubGluZSAtZm5vLWlubGluZQorCQk7OworCWdjYykKKwkJTk9XQVJOPSRET1dBUk47IHBoYXNlPXUKKwkJYWNfZmxhZ3MgMSBmbm9pbmxpbmUgLWZuby1pbmxpbmUKKwkJTk9XQVJOPSRzYXZlX05PV0FSTjsgcGhhc2U9eAorCQk7OworCXN1bnBybykKKwkJYWNfZmxhZ3MgMSBmbm9pbmxpbmUgLXhpbmxpbmU9CisJCTs7CisJeGxjKQorCQlhY19mbGFncyAxIGZub2lubGluZSAtcW5vaW5saW5lCisJCTs7CisJZXNhYworCisJOiAke0hBVkVfTUtOT0Q9MH0KKwk6ICR7SEFWRV9OSUNFPTB9CisJOiAke0hBVkVfUkVWT0tFPTB9CisJOiAke0hBVkVfUEVSU0lTVEVOVF9ISVNUT1JZPTB9CisJY2hlY2tfY2F0ZWdvcmllcz0kY2hlY2tfY2F0ZWdvcmllcyxzbWtzaAorCUhBVkVfSVNTRVRfTUtTSF9DT05TRVJWQVRJVkVfRkRTPTEJIyBmcm9tIHNoLmgKK2ZpCithY19pZmNwcCAnaWZkZWYgTUtTSF9CSU5TSFJFRFVDRUQnIGlzc2V0X01LU0hfQklOU0hSRURVQ0VEICcnIFwKKyAgICAiaWYgYSByZWR1Y2VkLWZlYXR1cmUgc2ggaXMgcmVxdWVzdGVkIiAmJiBcCisgICAgY2hlY2tfY2F0ZWdvcmllcz0kY2hlY2tfY2F0ZWdvcmllcyxiaW5zaAorYWNfaWZjcHAgJ2lmZGVmIE1LU0hfVU5FTVBMT1lFRCcgaXNzZXRfTUtTSF9VTkVNUExPWUVEICcnIFwKKyAgICAiaWYgbWtzaCB3aWxsIGJlIGJ1aWx0IHdpdGhvdXQgam9iIGNvbnRyb2wiICYmIFwKKyAgICBjaGVja19jYXRlZ29yaWVzPSRjaGVja19jYXRlZ29yaWVzLGFyZ2UKK2FjX2lmY3BwICdpZmRlZiBNS1NIX0FTU1VNRV9VVEY4JyBpc3NldF9NS1NIX0FTU1VNRV9VVEY4ICcnIFwKKyAgICAnaWYgdGhlIGRlZmF1bHQgVVRGLTggbW9kZSBpcyBzcGVjaWZpZWQnICYmIDogJHtIQVZFX1NFVExPQ0FMRV9DVFlQRT0wfQorYWNfaWZjcHAgJ2lmZGVmIE1LU0hfQ09OU0VSVkFUSVZFX0ZEUycgaXNzZXRfTUtTSF9DT05TRVJWQVRJVkVfRkRTICcnIFwKKyAgICAnaWYgdHJhZGl0aW9uYWwvY29uc2VydmF0aXZlIGZkIHVzZSBpcyByZXF1ZXN0ZWQnICYmIFwKKyAgICBjaGVja19jYXRlZ29yaWVzPSRjaGVja19jYXRlZ29yaWVzLGNvbnZmZHMKKworIworIyBFbnZpcm9ubWVudDogaGVhZGVycworIworYWNfaGVhZGVyIHN5cy9wYXJhbS5oCithY19oZWFkZXIgc3lzL21rZGV2Lmggc3lzL3R5cGVzLmgKK2FjX2hlYWRlciBzeXMvbW1hbi5oIHN5cy90eXBlcy5oCithY19oZWFkZXIgc3lzL3N5c21hY3Jvcy5oCithY19oZWFkZXIgZ3JwLmggc3lzL3R5cGVzLmgKK2FjX2hlYWRlciBsaWJnZW4uaAorYWNfaGVhZGVyIGxpYnV0aWwuaCBzeXMvdHlwZXMuaAorYWNfaGVhZGVyIHBhdGhzLmgKK2FjX2hlYWRlciBzdGRib29sLmgKK2FjX2hlYWRlciBzdGRpbnQuaCBzdGRhcmcuaAorYWNfaGVhZGVyIHN0cmluZ3MuaCBzeXMvdHlwZXMuaAorYWNfaGVhZGVyIHVsaW1pdC5oIHN5cy90eXBlcy5oCithY19oZWFkZXIgdmFsdWVzLmgKKworIworIyBFbnZpcm9ubWVudDogZGVmaW5pdGlvbnMKKyMKK2VjaG8gJyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKy8qIGNoZWNrIHRoYXQgb2ZmX3QgY2FuIHJlcHJlc2VudCAyXjYzLTEgY29ycmVjdGx5LCB0aHggRlNGICovCisjZGVmaW5lIExBUkdFX09GRl9UICgoKG9mZl90KTEgPDwgNjIpIC0gMSArICgob2ZmX3QpMSA8PCA2MikpCitpbnQgb2ZmX3RfaXNfbGFyZ2VbKExBUkdFX09GRl9UICUgMjE0NzQ4MzYyOSA9PSA3MjEgJiYKKyAgICBMQVJHRV9PRkZfVCAlIDIxNDc0ODM2NDcgPT0gMSkgPyAxIDogLTFdOworaW50IG1haW4odm9pZCkgeyByZXR1cm4gKDApOyB9JyA+bGZ0LmMKK2FjX3Rlc3RuIGNhbl9sZnMgJycgImZvciBsYXJnZSBmaWxlIHN1cHBvcnQiIDxsZnQuYworc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgLURfRklMRV9PRkZTRVRfQklUUz02NCIKK2FjX3Rlc3RuIGNhbl9sZnNfc3VzICchJyBjYW5fbGZzIDAgIi4uLiB3aXRoIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiIDxsZnQuYworaWYgdGVzdCAwID0gJEhBVkVfQ0FOX0xGU19TVVM7IHRoZW4KKwlDUFBGTEFHUz0iJHNhdmVfQ1BQRkxBR1MgLURfTEFSR0VfRklMRVM9MSIKKwlhY190ZXN0biBjYW5fbGZzX2FpeCAnIScgY2FuX2xmcyAwICIuLi4gd2l0aCAtRF9MQVJHRV9GSUxFUz0xIiA8bGZ0LmMKKwl0ZXN0IDEgPSAkSEFWRV9DQU5fTEZTX0FJWCB8fCBDUFBGTEFHUz0kc2F2ZV9DUFBGTEFHUworZmkKK3JtZiBsZnQqCSMgZW5kIG9mIGxhcmdlIGZpbGUgc3VwcG9ydCB0ZXN0CisKKyMKKyMgRW52aXJvbm1lbnQ6IHR5cGVzCisjCithY190ZXN0IGNhbl9pbnR0eXBlcyAnIScgc3RkaW50X2ggMSAiZm9yIHN0YW5kYXJkIDMyLWJpdCBpbnRlZ2VyIHR5cGVzIiA8PC0nRU9GJworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8c3RkZGVmLmg+CisJaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpIHsgcmV0dXJuICgodWludDMyX3QpKHB0cmRpZmZfdCkqYXYgKyAoaW50MzJfdClhYyk7IH0KK0VPRgorYWNfdGVzdCBjYW5fdWNiaW50cyAnIScgY2FuX2ludHR5cGVzIDEgImZvciBVQ0IgMzItYml0IGludGVnZXIgdHlwZXMiIDw8LSdFT0YnCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDxzdGRkZWYuaD4KKwlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikgeyByZXR1cm4gKCh1X2ludDMyX3QpKHB0cmRpZmZfdCkqYXYgKyAoaW50MzJfdClhYyk7IH0KK0VPRgorYWNfdGVzdCBjYW5faW50OHR5cGUgJyEnIHN0ZGludF9oIDEgImZvciBzdGFuZGFyZCA4LWJpdCBpbnRlZ2VyIHR5cGUiIDw8LSdFT0YnCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDxzdGRkZWYuaD4KKwlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikgeyByZXR1cm4gKCh1aW50OF90KShwdHJkaWZmX3QpYXZbYWNdKTsgfQorRU9GCithY190ZXN0IGNhbl91Y2JpbnQ4ICchJyBjYW5faW50OHR5cGUgMSAiZm9yIFVDQiA4LWJpdCBpbnRlZ2VyIHR5cGUiIDw8LSdFT0YnCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDxzdGRkZWYuaD4KKwlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikgeyByZXR1cm4gKCh1X2ludDhfdCkocHRyZGlmZl90KWF2W2FjXSk7IH0KK0VPRgorCithY190ZXN0IHJsaW1fdCA8PC0nRU9GJworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKwkjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgoaW50KShybGltX3QpMCk7IH0KK0VPRgorCisjIG9ubHkgdGVzdG46IGFkZGVkIGxhdGVyIGJlbG93CithY190ZXN0biBzaWdfdCA8PC0nRU9GJworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8c2lnbmFsLmg+CisJI2luY2x1ZGUgPHN0ZGRlZi5oPgorCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgoaW50KShwdHJkaWZmX3QpKHNpZ190KWtpbGwoMCwwKSk7IH0KK0VPRgorCithY190ZXN0biBzaWdoYW5kbGVyX3QgJyEnIHNpZ190IDAgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHNpZ25hbC5oPgorCSNpbmNsdWRlIDxzdGRkZWYuaD4KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKGludCkocHRyZGlmZl90KShzaWdoYW5kbGVyX3Qpa2lsbCgwLDApKTsgfQorRU9GCitpZiB0ZXN0IDEgPSAkSEFWRV9TSUdIQU5ETEVSX1Q7IHRoZW4KKwlDUFBGTEFHUz0iJENQUEZMQUdTIC1Ec2lnX3Q9c2lnaGFuZGxlcl90IgorCUhBVkVfU0lHX1Q9MQorZmkKKworYWNfdGVzdG4gX19zaWdoYW5kbGVyX3QgJyEnIHNpZ190IDAgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHNpZ25hbC5oPgorCSNpbmNsdWRlIDxzdGRkZWYuaD4KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKGludCkocHRyZGlmZl90KShfX3NpZ2hhbmRsZXJfdClraWxsKDAsMCkpOyB9CitFT0YKK2lmIHRlc3QgMSA9ICRIQVZFX19fU0lHSEFORExFUl9UOyB0aGVuCisJQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRHNpZ190PV9fc2lnaGFuZGxlcl90IgorCUhBVkVfU0lHX1Q9MQorZmkKKwordGVzdCAxID0gJEhBVkVfU0lHX1QgfHwgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRHNpZ190PW5vc2lnX3QiCithY19jcHBmbGFncyBTSUdfVAorCisjCisjIEVudmlyb25tZW50OiBzaWduYWxzCisjCit0ZXN0IHgiTmV0QlNEIiA9IHgiJFRBUkdFVF9PUyIgJiYgJGUgSWdub3JlIHRoZSBjb21wYXRpYmlsaXR5IHdhcm5pbmcuCisKK2ZvciB3aGF0IGluIG5hbWUgbGlzdDsgZG8KKwl1d2hhdD1gdXBwZXIgJHdoYXRgCisJYWNfdGVzdG4gc3lzX3NpZyR3aGF0ICcnICJ0aGUgc3lzX3NpZyR7d2hhdH1bXSBhcnJheSIgPDwtRU9GCisJCWV4dGVybiBjb25zdCBjaGFyICpjb25zdCBzeXNfc2lnJHt3aGF0fVtdOworCQlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoc3lzX3NpZyR7d2hhdH1bMF1bMF0pOyB9CisJRU9GCisJYWNfdGVzdG4gX3N5c19zaWckd2hhdCAnIScgc3lzX3NpZyR3aGF0IDAgInRoZSBfc3lzX3NpZyR7d2hhdH1bXSBhcnJheSIgPDwtRU9GCisJCWV4dGVybiBjb25zdCBjaGFyICpjb25zdCBfc3lzX3NpZyR7d2hhdH1bXTsKKwkJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKF9zeXNfc2lnJHt3aGF0fVswXVswXSk7IH0KKwlFT0YKKwlpZiBldmFsICJ0ZXN0IDEgPSBcJEhBVkVfX1NZU19TSUckdXdoYXQiOyB0aGVuCisJCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLURzeXNfc2lnJHdoYXQ9X3N5c19zaWckd2hhdCIKKwkJZXZhbCAiSEFWRV9TWVNfU0lHJHV3aGF0PTEiCisJZmkKKwlhY19jcHBmbGFncyBTWVNfU0lHJHV3aGF0Citkb25lCisKK2FjX3Rlc3Qgc3Ryc2lnbmFsICchJyBzeXNfc2lnbGlzdCAwIDw8LSdFT0YnCisJI2luY2x1ZGUgPHN0cmluZy5oPgorCSNpbmNsdWRlIDxzaWduYWwuaD4KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoc3Ryc2lnbmFsKDEpWzBdKTsgfQorRU9GCisKKyMKKyMgRW52aXJvbm1lbnQ6IGxpYnJhcnkgZnVuY3Rpb25zCisjCithY190ZXN0biBmbG9ja19leCAnJyAnZmxvY2sgYW5kIG1tYXAnIDw8LSdFT0YnCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDxzeXMvZmlsZS5oPgorCSNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCSNpbmNsdWRlIDxmY250bC5oPgorCSNpbmNsdWRlIDxzdGRsaWIuaD4KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKHZvaWQgKiltbWFwKE5VTEwsIChzaXplX3QpZmxvY2soMCwgTE9DS19FWCksCisJICAgIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIDAsIChvZmZfdCkwKSA9PSAodm9pZCAqKU5VTEwgPyAxIDoKKwkgICAgbXVubWFwKE5VTEwsIDApKTsgfQorRU9GCisKK2FjX3Rlc3QgZ2V0cnVzYWdlIDw8LSdFT0YnCisJI2RlZmluZSBNS1NIX0lOQ0xVREVTX09OTFkKKwkjaW5jbHVkZSAic2guaCIKKwlpbnQgbWFpbih2b2lkKSB7CisJCXN0cnVjdCBydXNhZ2UgcnU7CisJCXJldHVybiAoZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmcnUpICsKKwkJICAgIGdldHJ1c2FnZShSVVNBR0VfQ0hJTERSRU4sICZydSkpOworCX0KK0VPRgorCithY190ZXN0IGtpbGxwZyA8PC0nRU9GJworCSNpbmNsdWRlIDxzaWduYWwuaD4KKwlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pIHsgcmV0dXJuIChhdlswXVtraWxscGcoMTIzLCBhYyldKTsgfQorRU9GCisKK2FjX3Rlc3QgbWtub2QgJycgJ2lmIHRvIHVzZSBta25vZCgpLCBtYWtlZGV2KCkgYW5kIGZyaWVuZHMnIDw8LSdFT0YnCisJI2RlZmluZSBNS1NIX0lOQ0xVREVTX09OTFkKKwkjaW5jbHVkZSAic2guaCIKKwlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pIHsKKwkJZGV2X3QgZHY7CisJCWR2ID0gbWFrZWRldigodW5zaWduZWQgaW50KWFjLCAodW5zaWduZWQgaW50KWF2WzBdWzBdKTsKKwkJcmV0dXJuIChta25vZChhdlswXSwgKG1vZGVfdCkwLCBkdikgPyAoaW50KW1ham9yKGR2KSA6CisJCSAgICAoaW50KW1pbm9yKGR2KSk7CisJfQorRU9GCisKK2FjX3Rlc3QgbWtzdGVtcCA8PC0nRU9GJworCSNpbmNsdWRlIDxzdGRsaWIuaD4KKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50IG1haW4odm9pZCkgeyBjaGFyIHRtcGxbXSA9ICJYIjsgcmV0dXJuIChta3N0ZW1wKHRtcGwpKTsgfQorRU9GCisKK2FjX3Rlc3QgbmljZSA8PC0nRU9GJworCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAobmljZSg0KSk7IH0KK0VPRgorCithY190ZXN0IHJldm9rZSA8PC0nRU9GJworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaWYgSEFWRV9MSUJVVElMX0gKKwkjaW5jbHVkZSA8bGlidXRpbC5oPgorCSNlbmRpZgorCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQgbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pIHsgcmV0dXJuIChhYyArIHJldm9rZShhdlswXSkpOyB9CitFT0YKKworYWNfdGVzdCBzZXRsb2NhbGVfY3R5cGUgJycgJ3NldGxvY2FsZShMQ19DVFlQRSwgIiIpJyA8PC0nRU9GJworCSNpbmNsdWRlIDxsb2NhbGUuaD4KKwkjaW5jbHVkZSA8c3RkZGVmLmg+CisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKChpbnQpKHB0cmRpZmZfdCkodm9pZCAqKXNldGxvY2FsZShMQ19DVFlQRSwgIiIpKTsgfQorRU9GCisKK2FjX3Rlc3QgbGFuZ2luZm9fY29kZXNldCBzZXRsb2NhbGVfY3R5cGUgMCAnbmxfbGFuZ2luZm8oQ09ERVNFVCknIDw8LSdFT0YnCisJI2luY2x1ZGUgPGxhbmdpbmZvLmg+CisJI2luY2x1ZGUgPHN0ZGRlZi5oPgorCWludCBtYWluKHZvaWQpIHsgcmV0dXJuICgoaW50KShwdHJkaWZmX3QpKHZvaWQgKilubF9sYW5naW5mbyhDT0RFU0VUKSk7IH0KK0VPRgorCithY190ZXN0IHNldG1vZGUgbWtub2QgMSA8PC0nRU9GJworCS8qIFhYWCBpbWFrZSBzdHlsZSAqLworCS8qIFhYWCBjb25kaXRpb25zIGNvcnJlY3Q/ICovCisJI2lmIGRlZmluZWQoX19NU1ZDUlRfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorCS8qIGZvcmNlIGEgZmFpbHVyZTogV2luMzIgc2V0bW9kZSgpIGlzIG5vdCB3aGF0IHdlIHdhbnQuLi4gKi8KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAodGhpc3dpbGxuZXZlcmJlZGVmaW5lZElob3BlKCkpOyB9CisJI2Vsc2UKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkgeyByZXR1cm4gKGdldG1vZGUoc2V0bW9kZShhdlswXSksCisJICAgIChtb2RlX3QpYWMpKTsgfQorCSNlbmRpZgorRU9GCisKK2FjX3Rlc3Qgc2V0cmVzdWdpZCA8PC0nRU9GJworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50IG1haW4odm9pZCkgeyBzZXRyZXN1aWQoMCwwLDApOyByZXR1cm4gKHNldHJlc2dpZCgwLDAsMCkpOyB9CitFT0YKKworYWNfdGVzdCBzZXRncm91cHMgc2V0cmVzdWdpZCAwIDw8LSdFT0YnCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpZiBIQVZFX0dSUF9ICisJI2luY2x1ZGUgPGdycC5oPgorCSNlbmRpZgorCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQgbWFpbih2b2lkKSB7IGdpZF90IGdpZCA9IDA7IHJldHVybiAoc2V0Z3JvdXBzKDAsICZnaWQpKTsgfQorRU9GCisKK2FjX3Rlc3Qgc3RyY2FzZXN0ciA8PC0nRU9GJworCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkjaW5jbHVkZSA8c3RkZGVmLmg+CisJI2luY2x1ZGUgPHN0cmluZy5oPgorCSNpZiBIQVZFX1NUUklOR1NfSAorCSNpbmNsdWRlIDxzdHJpbmdzLmg+CisJI2VuZGlmCisJaW50IG1haW4oaW50IGFjLCBjaGFyICphdltdKSB7CisJCXJldHVybiAoKGludCkocHRyZGlmZl90KSh2b2lkICopc3RyY2FzZXN0cigqYXYsIGF2W2FjXSkpOworCX0KK0VPRgorCithY190ZXN0IHN0cmxjcHkgPDwtJ0VPRicKKwkjaW5jbHVkZSA8c3RyaW5nLmg+CisJaW50IG1haW4oaW50IGFjLCBjaGFyICphdltdKSB7IHJldHVybiAoc3RybGNweSgqYXYsIGF2WzFdLAorCSAgICAoc2l6ZV90KWFjKSk7IH0KK0VPRgorCisjCisjIGNoZWNrIGhlYWRlcnMgZm9yIGRlY2xhcmF0aW9ucworIworc2F2ZV9DQz0kQ0M7IHNhdmVfTERGTEFHUz0kTERGTEFHUzsgc2F2ZV9MSUJTPSRMSUJTCitDQz0iJENDIC1jIC1vICR0Y2ZuIjsgTERGTEFHUz07IExJQlM9CithY190ZXN0ICchJyBmbG9ja19kZWNsIGZsb2NrX2V4IDEgJ2lmIGZsb2NrKCkgZG9lcyBub3QgbmVlZCB0byBiZSBkZWNsYXJlZCcgPDwtJ0VPRicKKwkjZGVmaW5lIE1LU0hfSU5DTFVERVNfT05MWQorCSNpbmNsdWRlICJzaC5oIgorCWxvbmcgZmxvY2sodm9pZCk7CQkvKiB0aGlzIGNsYXNoZXMgaWYgZGVmaW5lZCBiZWZvcmUgKi8KKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoKGludClmbG9jaygpKTsgfQorRU9GCithY190ZXN0ICchJyByZXZva2VfZGVjbCByZXZva2UgMSAnaWYgcmV2b2tlKCkgZG9lcyBub3QgbmVlZCB0byBiZSBkZWNsYXJlZCcgPDwtJ0VPRicKKwkjZGVmaW5lIE1LU0hfSU5DTFVERVNfT05MWQorCSNpbmNsdWRlICJzaC5oIgorCWxvbmcgcmV2b2tlKHZvaWQpOwkJLyogdGhpcyBjbGFzaGVzIGlmIGRlZmluZWQgYmVmb3JlICovCisJaW50IG1haW4odm9pZCkgeyByZXR1cm4gKChpbnQpcmV2b2tlKCkpOyB9CitFT0YKK2FjX3Rlc3Qgc3lzX3NpZ2xpc3RfZGVjbCBzeXNfc2lnbGlzdCAxICdpZiBzeXNfc2lnbGlzdFtdIGRvZXMgbm90IG5lZWQgdG8gYmUgZGVjbGFyZWQnIDw8LSdFT0YnCisJI2RlZmluZSBNS1NIX0lOQ0xVREVTX09OTFkKKwkjaW5jbHVkZSAic2guaCIKKwlpbnQgbWFpbih2b2lkKSB7IHJldHVybiAoc3lzX3NpZ2xpc3RbMF1bMF0pOyB9CitFT0YKK0NDPSRzYXZlX0NDOyBMREZMQUdTPSRzYXZlX0xERkxBR1M7IExJQlM9JHNhdmVfTElCUworCisjCisjIG90aGVyIGNoZWNrcworIworZmQ9J2lmIHRvIHVzZSBwZXJzaXN0ZW50IGhpc3RvcnknCithY19jYWNoZSBQRVJTSVNURU5UX0hJU1RPUlkgfHwgdGVzdCAwID0gJEhBVkVfRkxPQ0tfRVggfHwgZnY9MQordGVzdCAxID0gJGZ2IHx8IGNoZWNrX2NhdGVnb3JpZXM9JGNoZWNrX2NhdGVnb3JpZXMsbm8taGlzdGZpbGUKK2FjX3Rlc3Rkb25lCithY19jcHBmbGFncworCisjCisjIENvbXBpbGVyOiBQcmFlcHJvY2Vzc29yIChvbmx5IGlmIG5lZWRlZCkKKyMKK3Rlc3QgMCA9ICRIQVZFX1NZU19TSUdOQU1FICYmIGlmIGFjX3Rlc3Rpbml0IGNwcF9kZCAnJyBcCisgICAgJ2NoZWNraW5nIGlmIHRoZSBDIFByZXByb2Nlc3NvciBzdXBwb3J0cyAtZEQnOyB0aGVuCisJZWNobyAnI2RlZmluZSBmb28gYmFyJyA+Y29uZnRlc3QuYworCXZ2ICddJyAiJENQUCAkQ0ZMQUdTICRDUFBGTEFHUyAkTk9XQVJOIC1kRCBjb25mdGVzdC5jID54IgorCWdyZXAgJyNkZWZpbmUgZm9vIGJhcicgeCA+L2Rldi9udWxsIDI+JjEgJiYgZnY9MQorCXJtZiBjb25mdGVzdC5jIHggdnYub3V0CisJYWNfdGVzdGRvbmUKK2ZpCisKKyMKKyMgRW5kIG9mIG1pcnRvY29uZiBjaGVja3MKKyMKKyRlIC4uLiBkb25lLgorCisjIFNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgaGF2ZSBhbmNpZW50IHZlcnNpb25zIG9mIGVkKDEpIHdyaXRpbmcKKyMgdGhlIGNoYXJhY3RlciBjb3VudCB0byBzdGFuZGFyZCBvdXRwdXQ7IGNvcGUgZm9yIHRoYXQKK2VjaG8gd3EgPngKK2VkIHggPHggMj4vZGV2L251bGwgfCBncmVwIDMgPi9kZXYvbnVsbCAyPiYxICYmIFwKKyAgICBjaGVja19jYXRlZ29yaWVzPSRjaGVja19jYXRlZ29yaWVzLCRvbGRpc2hfZWQKK3JtZiB4IHZ2Lm91dAorCitpZiB0ZXN0IDAgPSAkSEFWRV9TWVNfU0lHTkFNRTsgdGhlbgorCWlmIHRlc3QgMSA9ICRIQVZFX0NQUF9ERDsgdGhlbgorCQkkZSBHZW5lcmF0aW5nIGxpc3Qgb2Ygc2lnbmFsIG5hbWVzLi4uCisJZWxzZQorCQkkZSBObyBsaXN0IG9mIHNpZ25hbCBuYW1lcyBhdmFpbGFibGUgdmlhIGNwcC4gRmFsbGluZyBiYWNrLi4uCisJZmkKKwlzaWdzZWVuPToKKwllY2hvICcjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZuZGVmIE5TSUcKKyNpZiBkZWZpbmVkKF9OU0lHKQorI2RlZmluZSBOU0lHIF9OU0lHCisjZWxpZiBkZWZpbmVkKFNJR01BWCkKKyNkZWZpbmUgTlNJRyAoU0lHTUFYKzEpCisjZW5kaWYKKyNlbmRpZgorbWtzaF9jZmc6IE5TSUcnID5jb25mdGVzdC5jCisJTlNJRz1gdnEgIiRDUFAgJENGTEFHUyAkQ1BQRkxBR1MgJE5PV0FSTiBjb25mdGVzdC5jIiB8IFwKKwkgICAgZ3JlcCBta3NoX2NmZzogfCBzZWQgJ3MvXm1rc2hfY2ZnOlsJIF0qXChbMC05eCAoKSstXSpcKS4qJC9cMS8nYAorCWNhc2UgJE5TSUcgaW4KKwkqW1wgXChcKSstXSopIE5TSUc9YGF3ayAiQkVHSU4geyBwcmludCAkTlNJRyB9ImAgOzsKKwllc2FjCisJcHJpbnRmPXByaW50ZgorCShwcmludGYgaGFsbG8pID4vZGV2L251bGwgMj4mMSB8fCBwcmludGY9ZWNobworCXRlc3QgJHByaW50ZiA9IGVjaG8gfHwgTlNJRz1gcHJpbnRmICVkICIkTlNJRyIgMj4vZGV2L251bGxgCisJJHByaW50ZiAiTlNJRz0kTlNJRyAuLi4gIgorCXNpZ3M9IkFCUlQgQUxSTSBCVVMgQ0hMRCBDTEQgQ09OVCBESUwgRU1UIEZQRSBIVVAgSUxMIElORk8gSU5UIElPIElPVCIKKwlzaWdzPSIkc2lncyBLSUxMIExPU1QgUElQRSBQUk9GIFBXUiBRVUlUIFJFU1YgU0FLIFNFR1YgU1RPUCBTWVMgVEVSTSIKKwlzaWdzPSIkc2lncyBUUkFQIFRTVFAgVFRJTiBUVE9VIFVSRyBVU1IxIFVTUjIgVlRBTFJNIFdJTkNIIFhDUFUgWEZTWiIKKwl0ZXN0IDEgPSAkSEFWRV9DUFBfREQgJiYgdGVzdCAkTlNJRyAtZ3QgMSAmJiBzaWdzPSIkc2lncyAiYHZxIFwKKwkgICAgIiRDUFAgJENGTEFHUyAkQ1BQRkxBR1MgJE5PV0FSTiAtZEQgY29uZnRlc3QuYyIgfCBcCisJICAgIGdyZXAgJ1sJIF1TSUdbQS1aMC05XSpbCSBdJyB8IFwKKwkgICAgc2VkICdzL15cKC4qWwkgXVNJR1wpXChbQS1aMC05XSpcKVwoWwkgXS4qXCkkL1wyLycgfCBzb3J0YAorCXRlc3QgJE5TSUcgLWd0IDEgfHwgc2lncz0KKwlmb3IgbmFtZSBpbiAkc2lnczsgZG8KKwkJZWNobyAnI2luY2x1ZGUgPHNpZ25hbC5oPicgPmNvbmZ0ZXN0LmMKKwkJZWNobyBta3NoX2NmZzogU0lHJG5hbWUgPj5jb25mdGVzdC5jCisJCXZxICIkQ1BQICRDRkxBR1MgJENQUEZMQUdTICROT1dBUk4gY29uZnRlc3QuYyIgfCBcCisJCSAgICBncmVwIG1rc2hfY2ZnOiB8IFwKKwkJICAgIHNlZCAncy9ebWtzaF9jZmc6WwkgXSpcKFswLTl4XSpcKS4qJC9cMTonJG5hbWUvCisJZG9uZSB8IGdyZXAgLXYgJ146JyB8IHdoaWxlIElGUz06IHJlYWQgbnIgbmFtZTsgZG8KKwkJdGVzdCAkcHJpbnRmID0gZWNobyB8fCBucj1gcHJpbnRmICVkICIkbnIiIDI+L2Rldi9udWxsYAorCQl0ZXN0ICRuciAtZ3QgMCAmJiB0ZXN0ICRuciAtbGUgJE5TSUcgfHwgY29udGludWUKKwkJY2FzZSAkc2lnc2VlbiBpbgorCQkqOiRucjoqKSA7OworCQkqKQllY2hvICIJCXsgXCIkbmFtZVwiLCAkbnIgfSwiCisJCQlzaWdzZWVuPSRzaWdzZWVuJG5yOgorCQkJJHByaW50ZiAiJG5hbWU9JG5yICIgPiYyCisJCQk7OworCQllc2FjCisJZG9uZSAyPiYxID5zaWduYW1lcy5pbmMKKwlybWYgY29uZnRlc3QuYworCSRlIGRvbmUuCitmaQorCithZGRzcmNzICchJyBIQVZFX1NFVE1PREUgc2V0bW9kZS5jCithZGRzcmNzICchJyBIQVZFX1NUUkxDUFkgc3RybGNweS5jCithZGRzcmNzIFVTRV9QUklOVEZfQlVJTFRJTiBwcmludGYuYwordGVzdCAxID0gIiRVU0VfUFJJTlRGX0JVSUxUSU4iICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURNS1NIX1BSSU5URl9CVUlMVElOIgordGVzdCAwID0gIiRIQVZFX1NFVE1PREUiICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0NPTkZJR19IIC1EQ09ORklHX0hfRklMRU5BTUU9XFxcInNoLmhcXFwiIgordGVzdCAxID0gIiRIQVZFX0NBTl9WRVJCIiAmJiBDRkxBR1M9IiRDRkxBR1MgLXZlcmJvc2UiCisKKyRlICRiaSRtZTogRmluaXNoZWQgY29uZmlndXJhdGlvbiB0ZXN0aW5nLCBub3cgcHJvZHVjaW5nIG91dHB1dC4kYW8KKworZmlsZXM9CitvYmpzPQorc3A9CitjYXNlICRjdXJkaXIgaW4KKypcICopCWVjaG8gIiMhLi9ta3NoIiA+dGVzdC5zaCA7OworKikJZWNobyAiIyEkY3VyZGlyL21rc2giID50ZXN0LnNoIDs7Citlc2FjCitjYXQgPj50ZXN0LnNoIDw8LUVPRgorCUxDX0FMTD1DIFBBVEg9JyRQQVRIJzsgZXhwb3J0IExDX0FMTCBQQVRICisJdGVzdCAtbiAiXCRLU0hfVkVSU0lPTiIgfHwgZXhpdCAxCisJY2hlY2tfY2F0ZWdvcmllcz0kY2hlY2tfY2F0ZWdvcmllcworCXByaW50IFRlc3RpbmcgbWtzaCBmb3IgY29uZm9ybWFuY2U6CisJZmdyZXAgTWlyT1M6ICckc3JjZGlyL2NoZWNrLnQnCisJZmdyZXAgTUlSQlNEICckc3JjZGlyL2NoZWNrLnQnCisJcHJpbnQgIlRoaXMgc2hlbGwgaXMgYWN0dWFsbHk6XFxuXFx0XCRLU0hfVkVSU0lPTiIKKwlwcmludCAndGVzdC5zaCBidWlsdCBmb3IgbWtzaCAkZHN0dmVyc2lvbicKKwljc3RyPSdcJG9zID0gZGVmaW5lZCBcJF5PID8gXCReTyA6ICJ1bmtub3duIjsnCisJY3N0cj0iXCRjc3RyIidwcmludCBcJG9zIC4gIiwgUGVybCB2ZXJzaW9uICIgLiBcJF07JworCWZvciBwZXJsaSBpbiBcJFBFUkwgcGVybDUgcGVybCBubzsgZG8KKwkJW1sgXCRwZXJsaSA9IG5vIF1dICYmIGV4aXQgMQorCQlwZXJsb3M9XCQoXCRwZXJsaSAtZSAiXCRjc3RyIikgMj4mLSB8fCBjb250aW51ZQorCQlwcmludCAiUGVybCBpbnRlcnByZXRlciAnXCRwZXJsaScgcnVubmluZyBvbiAnXCRwZXJsb3MnIgorCQlbWyAtbiBcJHBlcmxvcyBdXSAmJiBicmVhaworCWRvbmUKKwlleGVjIFwkcGVybGkgJyRzcmNkaXIvY2hlY2sucGwnIC1zICckc3JjZGlyL2NoZWNrLnQnIC1wICckY3VyZGlyL21rc2gnIFwke2NoZWNrX2NhdGVnb3JpZXM6Ky1DfSBcJHtjaGVja19jYXRlZ29yaWVzIyx9IFwkKiR0c3RzCitFT0YKK2NobW9kIDc1NSB0ZXN0LnNoCit0ZXN0ICRIQVZFX0NBTl9DT01CSU5FJGNtID0gMGNvbWJpbmUgJiYgY209bm9ybWFsCitpZiB0ZXN0ICRjbSA9IGxsdm07IHRoZW4KKwllbWl0YmM9Ii1lbWl0LWxsdm0gLWMiCitlbGlmIHRlc3QgJGNtID0gZHJhZ29uZWdnOyB0aGVuCisJZW1pdGJjPSItUyAtZmx0byIKK2Vsc2UKKwllbWl0YmM9LWMKK2ZpCitlY2hvIHNldCAteCA+UmVidWlsZC5zaAorZm9yIGZpbGUgaW4gJFNSQ1M7IGRvCisJb3A9YGVjaG8geCIkZmlsZSIgfCBzZWQgJ3MvXnhcKC4qXClcLmMkL1wxLi8nYAorCXRlc3QgLWYgJGZpbGUgfHwgZmlsZT0kc3JjZGlyLyRmaWxlCisJZmlsZXM9IiRmaWxlcyRzcCRmaWxlIgorCXNwPScgJworCWVjaG8gIiRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkZW1pdGJjICRmaWxlIHx8IGV4aXQgMSIgPj5SZWJ1aWxkLnNoCisJaWYgdGVzdCAkY20gPSBkcmFnb25lZ2c7IHRoZW4KKwkJZWNobyAibXYgJHtvcH1zICR7b3B9bGwiID4+UmVidWlsZC5zaAorCQllY2hvICJsbHZtLWFzICR7b3B9bGwgfHwgZXhpdCAxIiA+PlJlYnVpbGQuc2gKKwkJb2Jqcz0iJG9ianMkc3Ake29wfWJjIgorCWVsc2UKKwkJb2Jqcz0iJG9ianMkc3Ake29wfW8iCisJZmkKK2RvbmUKK2Nhc2UgJGNtIGluCitkcmFnb25lZ2d8bGx2bSkKKwllY2hvICJybSAtZiBta3NoLnMiID4+UmVidWlsZC5zaAorCWVjaG8gImxsdm0tbGluayAtbyAtICRvYmpzIHwgb3B0ICRvcHRmbGFncyB8IGxsYyAtbyBta3NoLnMiID4+UmVidWlsZC5zaAorCWxvYmpzPW1rc2gucworCTs7CisqKQorCWxvYmpzPSRvYmpzCisJOzsKK2VzYWMKK2Nhc2UgJHRjZm4gaW4KK2EuZXhlKQlta3NoZXhlPW1rc2guZXhlIDs7CisqKQlta3NoZXhlPW1rc2ggOzsKK2VzYWMKK2VjaG8gdGNmbj0kbWtzaGV4ZSA+PlJlYnVpbGQuc2gKK2VjaG8gIiRDQyAkQ0ZMQUdTICRMREZMQUdTIC1vIFwkdGNmbiAkbG9ianMgJExJQlMgJGNjcHIiID4+UmVidWlsZC5zaAorZWNobyAndGVzdCAtZiAkdGNmbiB8fCBleGl0IDE7IHNpemUgJHRjZm4nID4+UmVidWlsZC5zaAoraWYgdGVzdCAkY20gPSBtYWtlZmlsZTsgdGhlbgorCWV4dHJhcz0nZW1hY3Nmbi5oIHNoLmggc2hfZmxhZ3MuaCB2YXJfc3BlYy5oJworCXRlc3QgMCA9ICRIQVZFX1NZU19TSUdOQU1FICYmIGV4dHJhcz0iJGV4dHJhcyBzaWduYW1lcy5pbmMiCisJY2F0ID5NYWtlZnJhZy5pbmMgPDxFT0YKKyMgTWFrZWZpbGUgZnJhZ21lbnQgZm9yIGJ1aWxkaW5nIG1rc2ggJGRzdHZlcnNpb24KKworUFJPRz0JCSRta3NoZXhlCitNQU49CQlta3NoLjEKK1NSQ1M9CQkkU1JDUworU1JDU19GUD0JJGZpbGVzCitPQkpTX0JQPQkkb2JqcworSU5EU1JDUz0JJGV4dHJhcworTk9OU1JDU19JTlNUPQlkb3QubWtzaHJjIFwkKE1BTikKK05PTlNSQ1NfTk9JTlNUPQlCdWlsZC5zaCBNYWtlZmlsZSBSZWJ1aWxkLnNoIGNoZWNrLnBsIGNoZWNrLnQgdGVzdC5zaAorQ0M9CQkkQ0MKK0NGTEFHUz0JCSRDRkxBR1MKK0NQUEZMQUdTPQkkQ1BQRkxBR1MKK0xERkxBR1M9CSRMREZMQUdTCitMSUJTPQkJJExJQlMKKworIyBub3QgQlNEIG1ha2Ugb25seToKKyNWUEFUSD0JCSRzcmNkaXIKKyNhbGw6IFwkKFBST0cpCisjXCQoUFJPRyk6IFwkKE9CSlNfQlApCisjCVwkKENDKSBcJChDRkxBR1MpIFwkKExERkxBR1MpIC1vIFwkQCBcJChPQkpTX0JQKSBcJChMSUJTKQorI1wkKE9CSlNfQlApOiBcJChTUkNTX0ZQKSBcJChOT05TUkNTKQorIy5jLm86CisjCVwkKENDKSBcJChDRkxBR1MpIFwkKENQUEZMQUdTKSAtYyBcJDwKKworIyBmb3IgYWxsIG1ha2UgdmFyaWFudHM6CisjUkVHUkVTU19GTEFHUz0JLXYKKyNyZWdyZXNzOgorIwkuL3Rlc3Quc2ggXCQoUkVHUkVTU19GTEFHUykKKworIyBmb3IgQlNEIG1ha2Ugb25seToKKyMuUEFUSDogJHNyY2RpcgorIy5pbmNsdWRlIDxic2QucHJvZy5taz4KK0VPRgorCSRlCisJJGUgR2VuZXJhdGVkIE1ha2VmcmFnLmluYyBzdWNjZXNzZnVsbHkuCisJZXhpdCAwCitmaQoraWYgdGVzdCAkY20gPSBjb21iaW5lOyB0aGVuCisJb2Jqcz0iLW8gJG1rc2hleGUiCisJZm9yIGZpbGUgaW4gJFNSQ1M7IGRvCisJCXRlc3QgLWYgJGZpbGUgfHwgZmlsZT0kc3JjZGlyLyRmaWxlCisJCW9ianM9IiRvYmpzICRmaWxlIgorCWRvbmUKKwllbWl0YmM9Ii1md2hvbGUtcHJvZ3JhbSAtLWNvbWJpbmUiCisJdiAiJENDICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTICRlbWl0YmMgJG9ianMgJExJQlMgJGNjcHIiCitlbGlmIHRlc3QgMSA9ICRwbTsgdGhlbgorCWZvciBmaWxlIGluICRTUkNTOyBkbworCQl0ZXN0IC1mICRmaWxlIHx8IGZpbGU9JHNyY2Rpci8kZmlsZQorCQl2ICIkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJGVtaXRiYyAkZmlsZSIgJgorCWRvbmUKKwl3YWl0CitlbHNlCisJZm9yIGZpbGUgaW4gJFNSQ1M7IGRvCisJCXRlc3QgJGNtID0gZHJhZ29uZWdnICYmIFwKKwkJICAgIG9wPWBlY2hvIHgiJGZpbGUiIHwgc2VkICdzL154XCguKlwpXC5jJC9cMS4vJ2AKKwkJdGVzdCAtZiAkZmlsZSB8fCBmaWxlPSRzcmNkaXIvJGZpbGUKKwkJdiAiJENDICRDRkxBR1MgJENQUEZMQUdTICRlbWl0YmMgJGZpbGUiIHx8IGV4aXQgMQorCQlpZiB0ZXN0ICRjbSA9IGRyYWdvbmVnZzsgdGhlbgorCQkJdiAibXYgJHtvcH1zICR7b3B9bGwiCisJCQl2ICJsbHZtLWFzICR7b3B9bGwiIHx8IGV4aXQgMQorCQlmaQorCWRvbmUKK2ZpCitjYXNlICRjbSBpbgorZHJhZ29uZWdnfGxsdm0pCisJcm1mIG1rc2gucworCXYgImxsdm0tbGluayAtbyAtICRvYmpzIHwgb3B0ICRvcHRmbGFncyB8IGxsYyAtbyBta3NoLnMiCisJOzsKK2VzYWMKK3RjZm49JG1rc2hleGUKK3Rlc3QgJGNtID0gY29tYmluZSB8fCB2ICIkQ0MgJENGTEFHUyAkTERGTEFHUyAtbyAkdGNmbiAkbG9ianMgJExJQlMgJGNjcHIiCit0ZXN0IC1mICR0Y2ZuIHx8IGV4aXQgMQordGVzdCAxID0gJHIgfHwgdiAiJE5ST0ZGIC1tZG9jIDwnJHNyY2Rpci9ta3NoLjEnID5ta3NoLmNhdDEiIHx8IFwKKyAgICBybWYgbWtzaC5jYXQxCit0ZXN0IDAgPSAkZXEgJiYgdiBzaXplICR0Y2ZuCitpPWluc3RhbGwKK3Rlc3QgLWYgL3Vzci91Y2IvJGkgJiYgaT0vdXNyL3VjYi8kaQordGVzdCAxID0gJGVxICYmIGU9OgorJGUKKyRlIEluc3RhbGxpbmcgdGhlIHNoZWxsOgorJGUgIiMgJGkgLWMgLXMgLW8gcm9vdCAtZyBiaW4gLW0gNTU1IG1rc2ggL2Jpbi9ta3NoIgorJGUgIiMgZ3JlcCAteCAvYmluL21rc2ggL2V0Yy9zaGVsbHMgPi9kZXYvbnVsbCB8fCBlY2hvIC9iaW4vbWtzaCA+Pi9ldGMvc2hlbGxzIgorJGUgIiMgJGkgLWMgLW8gcm9vdCAtZyBiaW4gLW0gNDQ0IGRvdC5ta3NocmMgL3Vzci9zaGFyZS9kb2MvbWtzaC9leGFtcGxlcy8iCiskZQorJGUgSW5zdGFsbGluZyB0aGUgbWFudWFsOgoraWYgdGVzdCAtZiBta3NoLmNhdDE7IHRoZW4KKwkkZSAiIyAkaSAtYyAtbyByb290IC1nIGJpbiAtbSA0NDQgbWtzaC5jYXQxIiBcCisJICAgICIvdXNyL3NoYXJlL21hbi9jYXQxL21rc2guMCIKKwkkZSBvcgorZmkKKyRlICIjICRpIC1jIC1vIHJvb3QgLWcgYmluIC1tIDQ0NCBta3NoLjEgL3Vzci9zaGFyZS9tYW4vbWFuMS9ta3NoLjEiCiskZQorJGUgUnVuIHRoZSByZWdyZXNzaW9uIHRlc3Qgc3VpdGU6IC4vdGVzdC5zaAorJGUgUGxlYXNlIGFsc28gcmVhZCB0aGUgc2FtcGxlIGZpbGUgZG90Lm1rc2hyYyBhbmQgdGhlIGZpbmUgbWFudWFsLgorZXhpdCAwCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9jaGVjay5wbCBiL21rc2gvc3JjL2NoZWNrLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OTNlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9jaGVjay5wbApAQCAtMCwwICsxLDEyNDEgQEAKKyMgJE1pck9TOiBzcmMvYmluL21rc2gvY2hlY2sucGwsdiAxLjIzIDIwMDkvMDYvMTAgMTg6MTI6NDMgdGcgUmVsICQKKyMgJE9wZW5CU0Q6IHRoLHYgMS4xMyAyMDA2LzA1LzE4IDIxOjI3OjIzIG1pb2QgRXhwICQKKyMtCisjIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOQorIwlUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisjCisjIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworIyBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyMgaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisjIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorIyBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorIworIyBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyMgdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisjIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorIyBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyMgZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisjIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorIyBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyMgb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyMtCisjIEV4YW1wbGUgdGVzdDoKKyMJCW5hbWU6IGEtdGVzdAorIwkJZGVzY3JpcHRpb246CisjCQkJYSB0ZXN0IHRvIHNob3cgaG93IHRlc3RzIGFyZSBkb25lCisjCQlhcmd1bWVudHM6ICEteCEtZiEKKyMJCXN0ZGluOgorIwkJCWVjaG8gLW4gKgorIwkJCWZhbHNlCisjCQlleHBlY3RlZC1zdGRvdXQ6ICEKKyMJCQkqCisjCQlleHBlY3RlZC1zdGRlcnI6CisjCQkJKyBlY2hvIC1uICoKKyMJCQkrIGZhbHNlCisjCQlleHBlY3RlZC1leGl0OiAxCisjCQktLS0KKyMJVGhpcyBydW5zIHRoZSB0ZXN0LXByb2dyYW0gKGVnLCBta3NoKSB3aXRoIHRoZSBhcmd1bWVudHMgLXggYW5kIC1mLAorIwlzdGFuZGFyZCBpbnB1dCBpcyBhIGZpbGUgY29udGFpbmluZyAiZWNobyBoaSpcbmZhbHNlXG4iLiBUaGUgcHJvZ3JhbQorIwlpcyBleHBlY3RlZCB0byBwcm9kdWNlICJoaSoiIChubyB0cmFpbGluZyBuZXdsaW5lKSBvbiBzdGFuZGFyZCBvdXRwdXQsCisjCSIrIGVjaG8gaGkqXG4rZmFsc2VcbiIgb24gc3RhbmRhcmQgZXJyb3IsIGFuZCBhbiBleGl0IGNvZGUgb2YgMS4KKyMKKyMKKyMgRm9ybWF0IG9mIHRlc3QgZmlsZXM6CisjIC0gYmxhbmsgbGluZXMgYW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggIyBhcmUgaWdub3JlZAorIyAtIGEgdGVzdCBmaWxlIGNvbnRhaW5zIGEgc2VyaWVzIG9mIHRlc3RzCisjIC0gYSB0ZXN0IGlzIGEgc2VyaWVzIG9mIHRhZzp2YWx1ZSBwYWlycyBlbmRlZCB3aXRoIGEgIi0tLSIgbGluZQorIyAgIChsZWFkaW5nL3RyYWlsaW5nIHNwYWNlcyBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgZmlyc3QgbGluZSBvZiB2YWx1ZSkKKyMgLSB0ZXN0IHRhZ3MgYXJlOgorIwlUYWcJCQlGbGFnCURlc2NyaXB0aW9uCisjCS0tLS0tCQkJLS0tLQktLS0tLS0tLS0tLQorIwluYW1lCQkJcglUaGUgbmFtZSBvZiB0aGUgdGVzdDsgc2hvdWxkIGJlIHVuaXF1ZQorIwlkZXNjcmlwdGlvbgkJbQlXaGF0IHRlc3QgZG9lcworIwlhcmd1bWVudHMJCU0JQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHByb2dyYW07CisjCQkJCQlkZWZhdWx0IGlzIG5vIGFyZ3VtZW50cy4KKyMJc2NyaXB0CQkJbQlWYWx1ZSBpcyB3cml0dGVuIHRvIGEgZmlsZSB3aGljaAorIwkJCQkJaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9ncmFtCisjCQkJCQkoYWZ0ZXIgdGhlIGFyZ3VtZW50cyBhcmd1bWVudHMpCisjCXN0ZGluCQkJbQlWYWx1ZSBpcyB3cml0dGVuIHRvIGEgZmlsZSB3aGljaCBpcworIwkJCQkJdXNlZCBhcyBzdGFuZGFyZC1pbnB1dCBmb3IgdGhlIHByb2dyYW07CisjCQkJCQlkZWZhdWx0IGlzIHRvIHVzZSAvZGV2L251bGwuCisjCXBlcmwtc2V0dXAJCW0JVmFsdWUgaXMgYSBwZXJsIHNjcmlwdCB3aGljaCBpcyBleGVjdXRlZAorIwkJCQkJanVzdCBiZWZvcmUgdGhlIHRlc3QgaXMgcnVuLiBUcnkgdG8KKyMJCQkJCWF2b2lkIHVzaW5nIHRoaXMuLi4KKyMJcGVybC1jbGVhbnVwCQltCVZhbHVlIGlzIGEgcGVybCBzY3JpcHQgd2hpY2ggaXMgZXhlY3V0ZWQKKyMJCQkJCWp1c3QgYWZ0ZXIgdGhlIHRlc3QgaXMgcnVuLiBUcnkgdG8KKyMJCQkJCWF2b2lkIHVzaW5nIHRoaXMuLi4KKyMJZW52LXNldHVwCQlNCVZhbHVlIGlzIGEgbGlzdCBvZiBOQU1FPVZBTFVFIGVsZW1lbnRzCisjCQkJCQl3aGljaCBhcmUgcHV0IGluIHRoZSBlbnZpcm9ubWVudCBiZWZvcmUKKyMJCQkJCXRoZSB0ZXN0IGlzIHJ1bi4gSWYgdGhlID1WQUxVRSBpcworIwkJCQkJbWlzc2luZywgTkFNRSBpcyByZW1vdmVkIGZyb20gdGhlCisjCQkJCQllbnZpcm9ubWVudC4gUHJvZ3JhbXMgYXJlIHJ1biB3aXRoCisjCQkJCQl0aGUgZm9sbG93aW5nIG1pbmltYWwgZW52aXJvbm1lbnQ6CisjCQkJCQkgICAgSE9NRSwgTERfTElCUkFSWV9QQVRILCBMT0NQQVRILAorIwkJCQkJICAgIExPR05BTUUsIFBBVEgsIFNIRUxMLCBVU0VSCisjCQkJCQkodmFsdWVzIHRha2VuIGZyb20gdGhlIGVudmlyb25tZW50IG9mCisjCQkJCQl0aGUgdGVzdCBoYXJuZXNzKS4KKyMJCQkJCUVOViBpcyBzZXQgdG8gL25vbmV4aXN0YW50LgorIwkJCQkJX19wcm9nbmFtZSBpcyBzZXQgdG8gdGhlIC1wIGFyZ3VtZW50LgorIwkJCQkJX19wZXJsbmFtZSBpcyBzZXQgdG8gJF5YIChwZXJsZXhlKS4KKyMJZmlsZS1zZXR1cAkJbXBzCVVzZWQgdG8gY3JlYXRlIGZpbGVzLCBkaXJlY3RvcmllcworIwkJCQkJYW5kIHN5bWxpbmtzLiBGaXJzdCB3b3JkIGlzIGVpdGhlcgorIwkJCQkJZmlsZSwgZGlyIG9yIHN5bWxpbms7IHNlY29uZCB3b3JkIGlzCisjCQkJCQlwZXJtaXNzaW9uczsgdGhpcyBpcyBmb2xsb3dlZCBieSBhCisjCQkJCQlxdW90ZWQgd29yZCB0aGF0IGlzIHRoZSBuYW1lIG9mIHRoZQorIwkJCQkJZmlsZTsgdGhlIGVuZC1xdW90ZSBzaG91bGQgYmUgZm9sbG93ZWQKKyMJCQkJCWJ5IGEgbmV3bGluZSwgdGhlbiB0aGUgZmlsZSBkYXRhCisjCQkJCQkoaWYgYW55KS4gVGhlIGZpcnN0IHdvcmQgbWF5IGJlCisjCQkJCQlwcmVjZWRlZCBieSBhICEgdG8gc3RyaXAgdGhlIHRyYWlsaW5nCisjCQkJCQluZXdsaW5lIGluIGEgc3ltbGluay4KKyMJZmlsZS1yZXN1bHQJCW1wcwlVc2VkIHRvIHZlcmlmeSBhIGZpbGUsIHN5bWxpbmsgb3IKKyMJCQkJCWRpcmVjdG9yeSBpcyBjcmVhdGVkIGNvcnJlY3RseS4KKyMJCQkJCVRoZSBmaXJzdCB3b3JkIGlzIGVpdGhlcgorIwkJCQkJZmlsZSwgZGlyIG9yIHN5bWxpbms7IHNlY29uZCB3b3JkIGlzCisjCQkJCQlleHBlY3RlZCBwZXJtaXNzaW9uczsgdGhpcmQgd29yZAorIwkJCQkJaXMgdXNlci1pZDsgZm91cnRoIGlzIGdyb3VwLWlkOworIwkJCQkJZmlmdGggaXMgImV4YWN0IiBvciAicGF0dGVybiIKKyMJCQkJCWluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBjb250ZW50cworIwkJCQkJd2hpY2ggZm9sbG93IGlzIHRvIGJlIG1hdGNoZWQgZXhhY3RseQorIwkJCQkJb3IgaWYgaXQgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24uCisjCQkJCQlUaGUgZmlmdGggYXJndW1lbnQgaXMgdGhlIHF1b3RlZCBuYW1lCisjCQkJCQlvZiB0aGUgZmlsZSB0aGF0IHNob3VsZCBiZSBjcmVhdGVkLgorIwkJCQkJVGhlIGVuZC1xdW90ZSBzaG91bGQgYmUgZm9sbG93ZWQKKyMJCQkJCWJ5IGEgbmV3bGluZSwgdGhlbiB0aGUgZmlsZSBkYXRhCisjCQkJCQkoaWYgYW55KS4gVGhlIGZpcnN0IHdvcmQgbWF5IGJlCisjCQkJCQlwcmVjZWRlZCBieSBhICEgdG8gc3RyaXAgdGhlIHRyYWlsaW5nCisjCQkJCQluZXdsaW5lIGluIHRoZSBmaWxlIGNvbnRlbnRzLgorIwkJCQkJVGhlIHBlcm1pc3Npb25zLCB1c2VyIGFuZCBncm91cCBmaWVsZHMKKyMJCQkJCW1heSBiZSAqIG1lYW5pbmcgYWNjZXB0IGFueSB2YWx1ZS4KKyMJdGltZS1saW1pdAkJCVRpbWUgbGltaXQgLSB0aGUgcHJvZ3JhbSBpcyBzZW50IGEKKyMJCQkJCVNJR0tJTEwgTiBzZWNvbmRzLiBEZWZhdWx0IGlzIG5vCisjCQkJCQlsaW1pdC4KKyMJZXhwZWN0ZWQtZmFpbAkJCSd5ZXMnIGlmIHRoZSB0ZXN0IGlzIGV4cGVjdGVkIHRvIGZhaWwuCisjCWV4cGVjdGVkLWV4aXQJCQlleHBlY3RlZCBleGl0IGNvZGUuIENhbiBiZSBhIG51bWJlciwKKyMJCQkJCW9yIGEgQyBleHByZXNzaW9uIHVzaW5nIHRoZSB2YXJpYWJsZXMKKyMJCQkJCWUsIHMgYW5kIHcgKGV4aXQgY29kZSwgdGVybWluYXRpb24KKyMJCQkJCXNpZ25hbCwgYW5kIHN0YXR1cyBjb2RlKS4KKyMJZXhwZWN0ZWQtc3Rkb3V0CQltCVdoYXQgdGhlIHRlc3Qgc2hvdWxkIGdlbmVyYXRlIG9uIHN0ZG91dDsKKyMJCQkJCWRlZmF1bHQgaXMgdG8gZXhwZWN0IG5vIG91dHB1dC4KKyMJZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm4JbQlBIHBlcmwgcGF0dGVybiB3aGljaCBtYXRjaGVzIHRoZQorIwkJCQkJZXhwZWN0ZWQgb3V0cHV0LgorIwlleHBlY3RlZC1zdGRlcnIJCW0JV2hhdCB0aGUgdGVzdCBzaG91bGQgZ2VuZXJhdGUgb24gc3RkZXJyOworIwkJCQkJZGVmYXVsdCBpcyB0byBleHBlY3Qgbm8gb3V0cHV0LgorIwlleHBlY3RlZC1zdGRlcnItcGF0dGVybgltCUEgcGVybCBwYXR0ZXJuIHdoaWNoIG1hdGNoZXMgdGhlCisjCQkJCQlleHBlY3RlZCBzdGFuZGFyZCBlcnJvci4KKyMJY2F0ZWdvcnkJCW0JU3BlY2lmeSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mCisjCQkJCQknY2F0ZWdvcmllcycgb2YgcHJvZ3JhbSB0aGF0IHRoZSB0ZXN0CisjCQkJCQlpcyB0byBiZSBydW4gZm9yLiBBIGNhdGVnb3J5IGNhbiBiZQorIwkJCQkJbmVnYXRlZCBieSBwcmVmaXhpbmcgdGhlIG5hbWUgd2l0aCBhICEuCisjCQkJCQlUaGUgaWRlYSBpcyB0aGF0IHNvbWUgdGVzdHMgaW4gYQorIwkJCQkJdGVzdCBzdWl0ZSBtYXkgYXBwbHkgdG8gYSBwYXJ0aWN1bGFyCisjCQkJCQlwcm9ncmFtIHZlcnNpb24gYW5kIHNob3VsZG4ndCBiZSBydW4KKyMJCQkJCW9uIG90aGVyIHZlcnNpb25zLiBUaGUgY2F0ZWdvcnkocykgb2YKKyMJCQkJCXRoZSBwcm9ncmFtIGJlaW5nIHRlc3RlZCBjYW4gYmUKKyMJCQkJCXNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorIwkJCQkJT25lIGNhdGVnb3J5IG9zOlhYWCBpcyBwcmVkZWZpbmVkCisjCQkJCQkoWFhYIGlzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG5hbWUsCisjCQkJCQllZywgbGludXgsIGRlY19vc2YpLgorIyBGbGFnIG1lYW5pbmdzOgorIwlyCXRhZyBpcyByZXF1aXJlZCAoZWcsIGEgdGVzdCBtdXN0IGhhdmUgYSBuYW1lIHRhZykuCisjCW0JdmFsdWUgY2FuIGJlIG11bHRpcGxlIGxpbmVzLiBMaW5lcyBtdXN0IGJlIHByZWZpeGVkIHdpdGgKKyMJCWEgdGFiLiBJZiB0aGUgdmFsdWUgcGFydCBvZiB0aGUgaW5pdGlhbCB0YWc6dmFsdWUgbGluZSBpcworIwkJCS0gZW1wdHk6IHRoZSBpbml0aWFsIGJsYW5rIGxpbmUgaXMgc3RyaXBwZWQuCisjCQkJLSBhIGxvbmUgITogdGhlIGxhc3QgbmV3bGluZSBpbiB0aGUgdmFsdWUgaXMgc3RyaXBwZWQ7CisjCU0JdmFsdWUgY2FuIGJlIG11bHRpcGxlIGxpbmVzIChwcmVmaXhlZCBieSBhIHRhYikgYW5kIGNvbnNpc3RzCisjCQlvZiBtdWx0aXBsZSBmaWVsZHMsIGRlbGltaXRlZCBieSBhIGZpZWxkIHNlcGFyYXRvciBjaGFyYWN0ZXIuCisjCQlUaGUgdmFsdWUgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGggdGhlIGYtcy1jLgorIwlwCXRhZyB0YWtlcyBwYXJhbWV0ZXJzICh1c2VkIHdpdGggbSkuCisjCXMJdGFnIGNhbiBiZSB1c2VkIHNldmVyYWwgdGltZXMuCisKK3VzZSBQT1NJWCBxdyhFSU5UUik7Cit1c2UgR2V0b3B0OjpTdGQ7Cit1c2UgQ29uZmlnOworCiskb3MgPSBkZWZpbmVkICReTyA/ICReTyA6ICd1bmtub3duJzsKKworKCRwcm9nID0gJDApID1+IHMjLiovIyM7CisKKyRVc2FnZSA9IDw8RU9GIDsKK1VzYWdlOiAkcHJvZyBbLXMgdGVzdC1zZXRdIFstQyBjYXRlZ29yeV0gWy1wIHByb2ddIFstdl0gWy1lIGU9dl0gbmFtZSAuLi4KKwktcCBwCVVzZSBwIGFzIHRoZSBwcm9ncmFtIHRvIHRlc3QKKwktQyBjCVNwZWNpZnkgdGhlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGNhdGVnb3JpZXMgdGhlIHByb2dyYW0KKwkJYmVsb25ncyB0byAoc2VlIGNhdGVnb3J5IGZpZWxkKS4KKwktcyBzCVJlYWQgdGVzdHMgZnJvbSBmaWxlIHM7IGlmIHMgaXMgYSBkaXJlY3RvcnksIGl0IGlzIHJlY3Vyc2l2ZWx5CisJCXNjYW5lZCBmb3IgdGVzdCBmaWxlcyAod2hpY2ggZW5kIGluIC50KS4KKwktdCB0CVVzZSB0IGFzIGRlZmF1bHQgdGltZSBsaW1pdCBmb3IgdGVzdHMgKGRlZmF1bHQgaXMgdW5saW1pdGVkKQorCS1QCXByb2dyYW0gKC1wKSBzdHJpbmcgaGFzIG11bHRpcGxlIHdvcmRzLCBhbmQgdGhlIHByb2dyYW0gaXMgaW4KKwkJdGhlIHBhdGggKGtsdWRnZSBvcHRpb24pCisJLXYJVmVyYm9zZSBtb2RlOiBwcmludCByZWFzb24gdGVzdCBmYWlsZWQuCisJLWUgZT12CVNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZSB0byB2IGZvciBhbGwgdGVzdHMKKwkJKGlmIG5vID12IGlzIGdpdmVuLCB0aGUgY3VycmVudCB2YWx1ZSBpcyB1c2VkKQorCQlPbmx5IG9uZSAtZSBvcHRpb24gY2FuIGJlIGdpdmVuIGF0IHRoZSBtb21lbnQsIHNhZGx5LgorCW5hbWUJc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0KHMpIHRvIHJ1bjsgaWYgbm9uZSBhcmUKKwkJc3BlY2lmaWVkLCBhbGwgdGVzdHMgYXJlIHJ1bi4KK0VPRgorCisjIFNlZSBjb21tZW50IGFib3ZlIGZvciBmbGFnIG1lYW5pbmdzCisldGVzdF9maWVsZHMgPSAoCisJJ25hbWUnLAkJCQkncicsCisJJ2Rlc2NyaXB0aW9uJywJCQknbScsCisJJ2FyZ3VtZW50cycsCQkJJ00nLAorCSdzY3JpcHQnLAkJCSdtJywKKwknc3RkaW4nLAkJCSdtJywKKwkncGVybC1zZXR1cCcsCQkJJ20nLAorCSdwZXJsLWNsZWFudXAnLAkJCSdtJywKKwknZW52LXNldHVwJywJCQknTScsCisJJ2ZpbGUtc2V0dXAnLAkJCSdtcHMnLAorCSdmaWxlLXJlc3VsdCcsCQkJJ21wcycsCisJJ3RpbWUtbGltaXQnLAkJCScnLAorCSdleHBlY3RlZC1mYWlsJywJCScnLAorCSdleHBlY3RlZC1leGl0JywJCScnLAorCSdleHBlY3RlZC1zdGRvdXQnLAkJJ20nLAorCSdleHBlY3RlZC1zdGRvdXQtcGF0dGVybicsCSdtJywKKwknZXhwZWN0ZWQtc3RkZXJyJywJCSdtJywKKwknZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm4nLAknbScsCisJJ2NhdGVnb3J5JywJCQknbScsCisJKTsKKyMgRmlsbGVkIGluIGJ5IHJlYWRfdGVzdCgpCislaW50ZXJuYWxfdGVzdF9maWVsZHMgPSAoCisJJzpmdWxsLW5hbWUnLCAxLAkJIyBmaWxlOm5hbWUKKwknOmxvbmctbmFtZScsIDEsCQkjIGRpci9maWxlOmxpbmVubzpuYW1lCisJKTsKKworIyBDYXRlZ29yaWVzIG9mIHRoZSBwcm9ncmFtIHVuZGVyIHRlc3QuIFByb3ZpZGUgdGhlIGN1cnJlbnQKKyMgb3MgYnkgZGVmYXVsdC4KKyVjYXRlZ29yaWVzID0gKAorCSJvczokb3MiLCAnMScKKwkpOworCiskdGVtcHMgPSAiL3RtcC9ydHMkJCI7CiskdGVtcGkgPSAiL3RtcC9ydGkkJCI7CiskdGVtcG8gPSAiL3RtcC9ydG8kJCI7CiskdGVtcGUgPSAiL3RtcC9ydGUkJCI7CiskdGVtcGRpciA9ICIvdG1wL3J0ZCQkIjsKKworJG5mYWlsZWQgPSAwOworJG54ZmFpbGVkID0gMDsKKyRucGFzc2VkID0gMDsKKyRueHBhc3NlZCA9IDA7CisKKyVrbm93bl90ZXN0cyA9ICgpOworCitpZiAoIWdldG9wdHMoJ0M6cDpQczp0OnZlOicpKSB7CisgICAgcHJpbnQgU1RERVJSICRVc2FnZTsKKyAgICBleGl0IDE7Cit9CisKK2RpZSAiJHByb2c6IG5vIHByb2dyYW0gc3BlY2lmaWVkICh1c2UgLXApXG4iIGlmICFkZWZpbmVkICRvcHRfcDsKK2RpZSAiJHByb2c6IG5vIHRlc3Qgc2V0IHNwZWNpZmllZCAodXNlIC1zKVxuIiBpZiAhZGVmaW5lZCAkb3B0X3M7CiskdGVzdF9wcm9nID0gJG9wdF9wOworJHZlcmJvc2UgPSBkZWZpbmVkICRvcHRfdiAmJiAkb3B0X3Y7CiskdGVzdF9zZXQgPSAkb3B0X3M7CitpZiAoZGVmaW5lZCAkb3B0X3QpIHsKKyAgICBkaWUgIiRwcm9nOiBiYWQgLXQgYXJndW1lbnQgKHNob3VsZCBiZSBudW1iZXIgPiAwKTogJG9wdF90XG4iCisJaWYgJG9wdF90ICF+IC9eXGQrJC8gfHwgJG9wdF90IDw9IDA7CisgICAgJGRlZmF1bHRfdGltZV9saW1pdCA9ICRvcHRfdDsKK30KKyRwcm9ncmFtX2tsdWRnZSA9IGRlZmluZWQgJG9wdF9QID8gJG9wdF9QIDogMDsKKworaWYgKGRlZmluZWQgJG9wdF9DKSB7CisgICAgZm9yZWFjaCAkYyAoc3BsaXQoJywnLCAkb3B0X0MpKSB7CisJJGMgPX4gcy9ccysvLzsKKwlkaWUgIiRwcm9nOiBjYXRlZ29yaWVzIGNhbid0IGJlIG5lZ2F0ZWQgb24gdGhlIGNvbW1hbmQgbGluZVxuIgorCSAgICBpZiAoJGMgPX4gL14hLyk7CisJJGNhdGVnb3JpZXN7JGN9ID0gMTsKKyAgICB9Cit9CisKKyMgTm90ZSB3aGljaCB0ZXN0cyBhcmUgdG8gYmUgcnVuLgorJWRvX3Rlc3QgPSAoKTsKK2dyZXAoJGRvX3Rlc3R7JF99ID0gMSwgQEFSR1YpOworJGFsbF90ZXN0cyA9IEBBUkdWID09IDA7CisKKyMgU2V0IHVwIGEgdmVyeSBtaW5pbWFsIGVudmlyb25tZW50CislbmV3X2VudiA9ICgpOworZm9yZWFjaCAkZW52ICgoJ0hPTUUnLCAnTERfTElCUkFSWV9QQVRIJywgJ0xPQ1BBVEgnLCAnTE9HTkFNRScsCisgICdQQVRIJywgJ1NIRUxMJywgJ1VTRVInKSkgeworICAgICRuZXdfZW52eyRlbnZ9ID0gJEVOVnskZW52fSBpZiBkZWZpbmVkICRFTlZ7JGVudn07Cit9CiskbmV3X2VudnsnRU5WJ30gPSAnL25vbmV4aXN0YW50JzsKK2lmICgoJG9zIGVxICdWTVMnKSB8fCAoJENvbmZpZ3twZXJscGF0aH0gPX4gbS8kQ29uZmlne19leGV9JC9pKSkgeworCSRuZXdfZW52eydfX3BlcmxuYW1lJ30gPSAkQ29uZmlne3BlcmxwYXRofTsKK30gZWxzZSB7CisJJG5ld19lbnZ7J19fcGVybG5hbWUnfSA9ICRDb25maWd7cGVybHBhdGh9IC4gJENvbmZpZ3tfZXhlfTsKK30KK2lmIChkZWZpbmVkICRvcHRfZSkgeworICAgICMgWFhYIG5lZWQgYSB3YXkgdG8gYWxsb3cgbWFueSAtZSBhcmd1bWVudHMuLi4KKyAgICBpZiAoJG9wdF9lID1+IC9eKFthLXpBLVpfXVx3KikofD0oLiopKSQvKSB7CisJJG5ld19lbnZ7JDF9ID0gJDIgZXEgJycgPyAkRU5WeyQxfSA6ICQzOworICAgIH0gZWxzZSB7CisJZGllICIkMDogYmFkIC1lIGFyZ3VtZW50OiAkb3B0X2VcbiI7CisgICAgfQorfQorJW9sZF9lbnYgPSAlRU5WOworCitkaWUgIiRwcm9nOiBjb3VsZG4ndCBtYWtlIGRpcmVjdG9yeSAkdGVtcGRpciAtICQhXG4iIGlmICFta2RpcigkdGVtcGRpciwgMDc3Nyk7CisKK2Nob3AoJHB3ZCA9IGBwd2QgMj4vZGV2L251bGxgKTsKK2RpZSAiJHByb2c6IGNvdWxkbid0IGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4iIGlmICRwd2QgZXEgJyc7CitkaWUgIiRwcm9nOiBjb3VsZG4ndCBjZCB0byAkcHdkIC0gJCFcbiIgaWYgIWNoZGlyKCRwd2QpOworCitpZiAoISRwcm9ncmFtX2tsdWRnZSkgeworICAgICR0ZXN0X3Byb2cgPSAiJHB3ZC8kdGVzdF9wcm9nIiBpZiBzdWJzdHIoJHRlc3RfcHJvZywgMCwgMSkgbmUgJy8nOworICAgIGRpZSAiJHByb2c6ICR0ZXN0X3Byb2cgaXMgbm90IGV4ZWN1dGFibGUgLSBieWVcbiIKKwlpZiAoISAteCAkdGVzdF9wcm9nICYmICRvcyBuZSAnb3MyJyk7Cit9CisKK0B0cmFwX3NpZ3MgPSAoJ1RFUk0nLCAnUVVJVCcsICdJTlQnLCAnUElQRScsICdIVVAnKTsKK0BTSUd7QHRyYXBfc2lnc30gPSAoJ2NsZWFudXBfZXhpdCcpIHggQHRyYXBfc2lnczsKKyRjaGlsZF9raWxsX29rID0gMDsKKyRTSUd7J0FMUk0nfSA9ICdjYXRjaF9zaWdhbHJtJzsKKworJHwgPSAxOworCitpZiAoLWQgJHRlc3Rfc2V0KSB7CisgICAgJGZpbGVfcHJlZml4X3NraXAgPSBsZW5ndGgoJHRlc3Rfc2V0KSArIDE7CisgICAgJHJldCA9ICZwcm9jZXNzX3Rlc3RfZGlyKCR0ZXN0X3NldCk7Cit9IGVsc2UgeworICAgICRmaWxlX3ByZWZpeF9za2lwID0gMDsKKyAgICAkcmV0ID0gJnByb2Nlc3NfdGVzdF9maWxlKCR0ZXN0X3NldCk7Cit9CismY2xlYW51cF9leGl0KCkgaWYgIWRlZmluZWQgJHJldDsKKworJHRvdF9mYWlsZWQgPSAkbmZhaWxlZCArICRueGZhaWxlZDsKKyR0b3RfcGFzc2VkID0gJG5wYXNzZWQgKyAkbnhwYXNzZWQ7CitpZiAoJHRvdF9mYWlsZWQgfHwgJHRvdF9wYXNzZWQpIHsKKyAgICBwcmludCAiVG90YWwgZmFpbGVkOiAkdG90X2ZhaWxlZCI7CisgICAgcHJpbnQgIiAoJG54ZmFpbGVkIHVuZXhwZWN0ZWQpIiBpZiAkbnhmYWlsZWQ7CisgICAgcHJpbnQgIiAoYXMgZXhwZWN0ZWQpIiBpZiAkbmZhaWxlZCAmJiAhJG54ZmFpbGVkOworICAgIHByaW50ICJcblRvdGFsIHBhc3NlZDogJHRvdF9wYXNzZWQiOworICAgIHByaW50ICIgKCRueHBhc3NlZCB1bmV4cGVjdGVkKSIgaWYgJG54cGFzc2VkOworICAgIHByaW50ICJcbiI7Cit9CisKKyZjbGVhbnVwX2V4aXQoJ29rJyk7CisKK3N1YgorY2xlYW51cF9leGl0Cit7CisgICAgbG9jYWwoJHNpZywgJGV4aXRjb2RlKSA9ICgnJywgMSk7CisKKyAgICBpZiAoJF9bMF0gZXEgJ29rJykgeworCSRleGl0Y29kZSA9IDA7CisgICAgfSBlbHNpZiAoJF9bMF0gbmUgJycpIHsKKwkkc2lnID0gJF9bMF07CisgICAgfQorCisgICAgdW5saW5rKCR0ZW1waSwgJHRlbXBvLCAkdGVtcGUsICR0ZW1wcyk7CisgICAgJnNjcnViX2RpcigkdGVtcGRpcikgaWYgZGVmaW5lZCAkdGVtcGRpcjsKKyAgICBybWRpcigkdGVtcGRpcikgaWYgZGVmaW5lZCAkdGVtcGRpcjsKKworICAgIGlmICgkc2lnKSB7CisJJFNJR3skc2lnfSA9ICdERUZBVUxUJzsKKwlraWxsICRzaWcsICQkOworCXJldHVybjsKKyAgICB9CisgICAgZXhpdCAkZXhpdGNvZGU7Cit9CisKK3N1YgorY2F0Y2hfc2lnYWxybQoreworICAgICRTSUd7J0FMUk0nfSA9ICdjYXRjaF9zaWdhbHJtJzsKKyAgICBraWxsKDksICRjaGlsZF9waWQpIGlmICRjaGlsZF9raWxsX29rOworICAgICRjaGlsZF9raWxsZWQgPSAxOworfQorCitzdWIKK3Byb2Nlc3NfdGVzdF9kaXIKK3sKKyAgICBsb2NhbCgkZGlyKSA9IEBfOworICAgIGxvY2FsKCRyZXQsICRmaWxlKTsKKyAgICBsb2NhbChAdG9kbykgPSAoKTsKKworICAgIGlmICghb3BlbmRpcihESVIsICRkaXIpKSB7CisJcHJpbnQgU1RERVJSICIkcHJvZzogY2FuJ3Qgb3BlbiBkaXJlY3RvcnkgJGRpciAtICQhXG4iOworCXJldHVybiB1bmRlZjsKKyAgICB9CisgICAgd2hpbGUgKGRlZmluZWQgKCRmaWxlID0gcmVhZGRpcihESVIpKSkgeworCXB1c2goQHRvZG8sICRmaWxlKSBpZiAkZmlsZSA9fiAvXlteLl0uKlwudCQvOworICAgIH0KKyAgICBjbG9zZWRpcihESVIpOworCisgICAgZm9yZWFjaCAkZmlsZSAoQHRvZG8pIHsKKwkkZmlsZSA9ICIkZGlyLyRmaWxlIjsKKwlpZiAoLWQgJGZpbGUpIHsKKwkgICAgJHJldCA9ICZwcm9jZXNzX3Rlc3RfZGlyKCRmaWxlKTsKKwl9IGVsc2lmICgtZiBfKSB7CisJICAgICRyZXQgPSAmcHJvY2Vzc190ZXN0X2ZpbGUoJGZpbGUpOworCX0KKwlsYXN0IGlmICFkZWZpbmVkICRyZXQ7CisgICAgfQorCisgICAgcmV0dXJuICRyZXQ7Cit9CisKK3N1YgorcHJvY2Vzc190ZXN0X2ZpbGUKK3sKKyAgICBsb2NhbCgkZmlsZSkgPSBAXzsKKyAgICBsb2NhbCgkcmV0KTsKKworICAgIGlmICghb3BlbihJTiwgJGZpbGUpKSB7CisJcHJpbnQgU1RERVJSICIkcHJvZzogY2FuJ3Qgb3BlbiAkZmlsZSAtICQhXG4iOworCXJldHVybiB1bmRlZjsKKyAgICB9CisgICAgYmlubW9kZShJTik7CisgICAgd2hpbGUgKDEpIHsKKwkkcmV0ID0gJnJlYWRfdGVzdCgkZmlsZSwgSU4sICp0ZXN0KTsKKwlsYXN0IGlmICFkZWZpbmVkICRyZXQgfHwgISRyZXQ7CisJbmV4dCBpZiAhJGFsbF90ZXN0cyAmJiAhJGRvX3Rlc3R7JHRlc3R7J25hbWUnfX07CisJbmV4dCBpZiAhJmNhdGVnb3J5X2NoZWNrKCp0ZXN0KTsKKwkkcmV0ID0gJnJ1bl90ZXN0KCp0ZXN0KTsKKwlsYXN0IGlmICFkZWZpbmVkICRyZXQ7CisgICAgfQorICAgIGNsb3NlKElOKTsKKworICAgIHJldHVybiAkcmV0OworfQorCitzdWIKK3J1bl90ZXN0Cit7CisgICAgbG9jYWwoKnRlc3QpID0gQF87CisgICAgbG9jYWwoJG5hbWUpID0gJHRlc3R7JzpmdWxsLW5hbWUnfTsKKworICAgIGlmIChkZWZpbmVkICR0ZXN0eydzdGRpbid9KSB7CisJcmV0dXJuIHVuZGVmIGlmICEmd3JpdGVfZmlsZSgkdGVtcGksICR0ZXN0eydzdGRpbid9KTsKKwkkaWZpbGUgPSAkdGVtcGk7CisgICAgfSBlbHNlIHsKKwkkaWZpbGUgPSAnL2Rldi9udWxsJzsKKyAgICB9CisKKyAgICBpZiAoZGVmaW5lZCAkdGVzdHsnc2NyaXB0J30pIHsKKwlyZXR1cm4gdW5kZWYgaWYgISZ3cml0ZV9maWxlKCR0ZW1wcywgJHRlc3R7J3NjcmlwdCd9KTsKKyAgICB9CisKKyAgICByZXR1cm4gdW5kZWYgaWYgISZzY3J1Yl9kaXIoJHRlbXBkaXIpOworCisgICAgaWYgKCFjaGRpcigkdGVtcGRpcikpIHsKKwlwcmludCBTVERFUlIgIiRwcm9nOiBjb3VsZG4ndCBjZCB0byAkdGVtcGRpciAtICQhXG4iOworCXJldHVybiB1bmRlZjsKKyAgICB9CisKKyAgICBpZiAoZGVmaW5lZCAkdGVzdHsnZmlsZS1zZXR1cCd9KSB7CisJbG9jYWwoJGkpOworCWxvY2FsKCR0eXBlLCAkcGVybSwgJHJlc3QsICRjLCAkbGVuLCAkbmFtZSk7CisKKwlmb3IgKCRpID0gMDsgJGkgPCAkdGVzdHsnZmlsZS1zZXR1cCd9OyAkaSsrKSB7CisJICAgICR2YWwgPSAkdGVzdHsiZmlsZS1zZXR1cDokaSJ9OworCisJICAgICMgZm9ybWF0IGlzOiB0eXBlIHBlcm0gIm5hbWUiCisJICAgICgkdHlwZSwgJHBlcm0sICRyZXN0KSA9CisJCXNwbGl0KCcgJywgJHZhbCwgMyk7CisJICAgICRjID0gc3Vic3RyKCRyZXN0LCAwLCAxKTsKKwkgICAgJGxlbiA9IGluZGV4KCRyZXN0LCAkYywgMSkgLSAxOworCSAgICAkbmFtZSA9IHN1YnN0cigkcmVzdCwgMSwgJGxlbik7CisJICAgICRyZXN0ID0gc3Vic3RyKCRyZXN0LCAyICsgJGxlbik7CisJICAgICRwZXJtID0gb2N0KCRwZXJtKSBpZiAkcGVybSA9fiAvXlxkKyQvOworCSAgICBpZiAoJHR5cGUgZXEgJ2ZpbGUnKSB7CisJCXJldHVybiB1bmRlZiBpZiAhJndyaXRlX2ZpbGUoJG5hbWUsICRyZXN0KTsKKwkJaWYgKCFjaG1vZCgkcGVybSwgJG5hbWUpKSB7CisJCSAgICBwcmludCBTVERFUlIKKwkJICAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogY2FuJ3QgY2htb2QgJHBlcm0gJG5hbWUgLSAkIVxuIjsKKwkJICAgIHJldHVybiB1bmRlZjsKKwkJfQorCSAgICB9IGVsc2lmICgkdHlwZSBlcSAnZGlyJykgeworCQlpZiAoIW1rZGlyKCRuYW1lLCAkcGVybSkpIHsKKwkJICAgIHByaW50IFNUREVSUgorCQkgICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBjYW4ndCBta2RpciAkcGVybSAkbmFtZSAtICQhXG4iOworCQkgICAgcmV0dXJuIHVuZGVmOworCQl9CisJICAgIH0gZWxzaWYgKCR0eXBlIGVxICdzeW1saW5rJykgeworCQlsb2NhbCgkb3VtYXNrKSA9IHVtYXNrKCRwZXJtKTsKKwkJbG9jYWwoJHJldCkgPSBzeW1saW5rKCRyZXN0LCAkbmFtZSk7CisJCXVtYXNrKCRvdW1hc2spOworCQlpZiAoISRyZXQpIHsKKwkJICAgIHByaW50IFNUREVSUgorCSAgICAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogY291bGRuJ3QgY3JlYXRlIHN5bWxpbmsgJG5hbWUgLSAkIVxuIjsKKwkJICAgIHJldHVybiB1bmRlZjsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAgIGlmIChkZWZpbmVkICR0ZXN0eydwZXJsLXNldHVwJ30pIHsKKwlldmFsICR0ZXN0eydwZXJsLXNldHVwJ307CisJaWYgKCRAIG5lICcnKSB7CisJICAgIHByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogZXJyb3IgcnVubmluZyBwZXJsLXNldHVwIC0gJEBcbiI7CisJICAgIHJldHVybiB1bmRlZjsKKwl9CisgICAgfQorCisgICAgJHBpZCA9IGZvcms7CisgICAgaWYgKCFkZWZpbmVkICRwaWQpIHsKKwlwcmludCBTVERFUlIgIiRwcm9nOiBjYW4ndCBmb3JrIC0gJCFcbiI7CisJcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICBpZiAoISRwaWQpIHsKKwlAU0lHe0B0cmFwX3NpZ3N9ID0gKCdERUZBVUxUJykgeCBAdHJhcF9zaWdzOworCSRTSUd7J0FMUk0nfSA9ICdERUZBVUxUJzsKKwlpZiAoZGVmaW5lZCAkdGVzdHsnZW52LXNldHVwJ30pIHsKKwkgICAgbG9jYWwoJHZhciwgJHZhbCwgJGkpOworCisJICAgIGZvcmVhY2ggJHZhciAoc3BsaXQoc3Vic3RyKCR0ZXN0eydlbnYtc2V0dXAnfSwgMCwgMSksCisJCSR0ZXN0eydlbnYtc2V0dXAnfSkpCisJICAgIHsKKwkJJGkgPSBpbmRleCgkdmFyLCAnPScpOworCQluZXh0IGlmICRpID09IDAgfHwgJHZhciBlcSAnJzsKKwkJaWYgKCRpIDwgMCkgeworCQkgICAgZGVsZXRlICRuZXdfZW52eyR2YXJ9OworCQl9IGVsc2UgeworCQkgICAgJG5ld19lbnZ7c3Vic3RyKCR2YXIsIDAsICRpKX0gPSBzdWJzdHIoJHZhciwgJGkgKyAxKTsKKwkJfQorCSAgICB9CisJfQorCWlmICghb3BlbihTVERJTiwgIjwgJGlmaWxlIikpIHsKKwkJcHJpbnQgU1RERVJSICIkcHJvZzogY291bGRuJ3Qgb3BlbiAkaWZpbGUgaW4gY2hpbGQgLSAkIVxuIjsKKwkJa2lsbCgnVEVSTScsICQkKTsKKwl9CisJYmlubW9kZShTVERJTik7CisJaWYgKCFvcGVuKFNURE9VVCwgIj4gJHRlbXBvIikpIHsKKwkJcHJpbnQgU1RERVJSICIkcHJvZzogY291bGRuJ3Qgb3BlbiAkdGVtcG8gaW4gY2hpbGQgLSAkIVxuIjsKKwkJa2lsbCgnVEVSTScsICQkKTsKKwl9CisJYmlubW9kZShTVERPVVQpOworCWlmICghb3BlbihTVERFUlIsICI+ICR0ZW1wZSIpKSB7CisJCXByaW50IFNURE9VVCAiJHByb2c6IGNvdWxkbid0IG9wZW4gJHRlbXBlIGluIGNoaWxkIC0gJCFcbiI7CisJCWtpbGwoJ1RFUk0nLCAkJCk7CisJfQorCWJpbm1vZGUoU1RERVJSKTsKKwlpZiAoJHByb2dyYW1fa2x1ZGdlKSB7CisJICAgIEBhcmd2ID0gc3BsaXQoJyAnLCAkdGVzdF9wcm9nKTsKKwl9IGVsc2UgeworCSAgICBAYXJndiA9ICgkdGVzdF9wcm9nKTsKKwl9CisJaWYgKGRlZmluZWQgJHRlc3R7J2FyZ3VtZW50cyd9KSB7CisJCXB1c2goQGFyZ3YsCisJCSAgICAgc3BsaXQoc3Vic3RyKCR0ZXN0eydhcmd1bWVudHMnfSwgMCwgMSksCisJCQkgICBzdWJzdHIoJHRlc3R7J2FyZ3VtZW50cyd9LCAxKSkpOworCX0KKwlwdXNoKEBhcmd2LCAkdGVtcHMpIGlmIGRlZmluZWQgJHRlc3R7J3NjcmlwdCd9OworCisJI1hYWCByZWFscGF0aGlzZSwgdXNlIHdoaWNoL3doZW5jZSAtcCwgb3Igc3RoLiBsaWtlIHRoYXQKKwkjWFhYIGlmICEkcHJvZ3JhbV9rbHVkZ2UsIHdlIGdldCBieSB3aXRoIG5vdCBkb2luZyBpdCBmb3Igbm93IHRobworCSRuZXdfZW52eydfX3Byb2duYW1lJ30gPSAkYXJndlswXTsKKworCSMgVGhlIGZvbGxvd2luZyBkb2Vzbid0IHdvcmsgd2l0aCBwZXJsNS4uLiAgTmVlZCB0byBkbyBpdCBleHBsaWNpdGx5IC0geXVjay4KKwkjJUVOViA9ICVuZXdfZW52OworCWZvcmVhY2ggJGsgKGtleXMoJUVOVikpIHsKKwkgICAgZGVsZXRlICRFTlZ7JGt9OworCX0KKwkkRU5WeyRrfSA9ICR2IHdoaWxlICgkaywkdikgPSBlYWNoICVuZXdfZW52OworCisJZXhlYyB7ICRhcmd2WzBdIH0gQGFyZ3Y7CisJcHJpbnQgU1RERVJSICIkcHJvZzogY291bGRuJ3QgZXhlY3V0ZSAkdGVzdF9wcm9nIC0gJCFcbiI7CisJa2lsbCgnVEVSTScsICQkKTsKKwlleGl0KDk1KTsKKyAgICB9CisgICAgJGNoaWxkX3BpZCA9ICRwaWQ7CisgICAgJGNoaWxkX2tpbGxlZCA9IDA7CisgICAgJGNoaWxkX2tpbGxfb2sgPSAxOworICAgIGFsYXJtKCR0ZXN0eyd0aW1lLWxpbWl0J30pIGlmIGRlZmluZWQgJHRlc3R7J3RpbWUtbGltaXQnfTsKKyAgICB3aGlsZSAoMSkgeworCSR4cGlkID0gd2FpdHBpZCgkcGlkLCAwKTsKKwkkY2hpbGRfa2lsbF9vayA9IDA7CisJaWYgKCR4cGlkIDwgMCkgeworCSAgICBuZXh0IGlmICQhID09IEVJTlRSOworCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiBlcnJvciB3YWl0aW5nIGZvciBjaGlsZCAtICQhXG4iOworCSAgICByZXR1cm4gdW5kZWY7CisJfQorCWxhc3Q7CisgICAgfQorICAgICRzdGF0dXMgPSAkPzsKKyAgICBhbGFybSgwKSBpZiBkZWZpbmVkICR0ZXN0eyd0aW1lLWxpbWl0J307CisKKyAgICAkZmFpbGVkID0gMDsKKyAgICAkd2h5ID0gJyc7CisKKyAgICBpZiAoJGNoaWxkX2tpbGxlZCkgeworCSRmYWlsZWQgPSAxOworCSR3aHkgLj0gIlx0dGVzdCB0aW1lZCBvdXQgKGxpbWl0IG9mICR0ZXN0eyd0aW1lLWxpbWl0J30gc2Vjb25kcylcbiI7CisgICAgfQorCisgICAgJHJldCA9ICZldmFsX2V4aXQoJHRlc3R7J2xvbmctbmFtZSd9LCAkc3RhdHVzLCAkdGVzdHsnZXhwZWN0ZWQtZXhpdCd9KTsKKyAgICByZXR1cm4gdW5kZWYgaWYgIWRlZmluZWQgJHJldDsKKyAgICBpZiAoISRyZXQpIHsKKwlsb2NhbCgkZXhwbCk7CisKKwkkZmFpbGVkID0gMTsKKwlpZiAoKCRzdGF0dXMgJiAweGZmKSA9PSAweDdmKSB7CisJICAgICRleHBsID0gInN0b3BwZWQiOworCX0gZWxzaWYgKCgkc3RhdHVzICYgMHhmZikpIHsKKwkgICAgJGV4cGwgPSAic2lnbmFsICIgLiAoJHN0YXR1cyAmIDB4N2YpOworCX0gZWxzZSB7CisJICAgICRleHBsID0gImV4aXQtY29kZSAiIC4gKCgkc3RhdHVzID4+IDgpICYgMHhmZik7CisJfQorCSR3aHkgLj0KKwkiXHR1bmV4cGVjdGVkIGV4aXQgc3RhdHVzICRzdGF0dXMgKCRleHBsKSwgZXhwZWN0ZWQgJHRlc3R7J2V4cGVjdGVkLWV4aXQnfVxuIjsKKyAgICB9CisKKyAgICAkdG1wID0gJmNoZWNrX291dHB1dCgkdGVzdHsnbG9uZy1uYW1lJ30sICR0ZW1wbywgJ3N0ZG91dCcsCisJCSR0ZXN0eydleHBlY3RlZC1zdGRvdXQnfSwgJHRlc3R7J2V4cGVjdGVkLXN0ZG91dC1wYXR0ZXJuJ30pOworICAgIHJldHVybiB1bmRlZiBpZiAhZGVmaW5lZCAkdG1wOworICAgIGlmICgkdG1wIG5lICcnKSB7CisJJGZhaWxlZCA9IDE7CisJJHdoeSAuPSAkdG1wOworICAgIH0KKworICAgICR0bXAgPSAmY2hlY2tfb3V0cHV0KCR0ZXN0eydsb25nLW5hbWUnfSwgJHRlbXBlLCAnc3RkZXJyJywKKwkJJHRlc3R7J2V4cGVjdGVkLXN0ZGVycid9LCAkdGVzdHsnZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm4nfSk7CisgICAgcmV0dXJuIHVuZGVmIGlmICFkZWZpbmVkICR0bXA7CisgICAgaWYgKCR0bXAgbmUgJycpIHsKKwkkZmFpbGVkID0gMTsKKwkkd2h5IC49ICR0bXA7CisgICAgfQorCisgICAgJHRtcCA9ICZjaGVja19maWxlX3Jlc3VsdCgqdGVzdCk7CisgICAgcmV0dXJuIHVuZGVmIGlmICFkZWZpbmVkICR0bXA7CisgICAgaWYgKCR0bXAgbmUgJycpIHsKKwkkZmFpbGVkID0gMTsKKwkkd2h5IC49ICR0bXA7CisgICAgfQorCisgICAgaWYgKGRlZmluZWQgJHRlc3R7J3BlcmwtY2xlYW51cCd9KSB7CisJZXZhbCAkdGVzdHsncGVybC1jbGVhbnVwJ307CisJaWYgKCRAIG5lICcnKSB7CisJICAgIHByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogZXJyb3IgcnVubmluZyBwZXJsLWNsZWFudXAgLSAkQFxuIjsKKwkgICAgcmV0dXJuIHVuZGVmOworCX0KKyAgICB9CisKKyAgICBpZiAoIWNoZGlyKCRwd2QpKSB7CisJcHJpbnQgU1RERVJSICIkcHJvZzogY291bGRuJ3QgY2QgdG8gJHB3ZCAtICQhXG4iOworCXJldHVybiB1bmRlZjsKKyAgICB9CisKKyAgICBpZiAoJGZhaWxlZCkgeworCWlmICghJHRlc3R7J2V4cGVjdGVkLWZhaWwnfSkgeworCSAgICBwcmludCAiRkFJTCAkbmFtZVxuIjsKKwkgICAgJG54ZmFpbGVkKys7CisJfSBlbHNlIHsKKwkgICAgcHJpbnQgImZhaWwgJG5hbWUgKGFzIGV4cGVjdGVkKVxuIjsKKwkgICAgJG5mYWlsZWQrKzsKKwl9CisJJHdoeSA9ICJcdERlc2NyaXB0aW9uIgorCQkuICZ3cmFwX2xpbmVzKCR0ZXN0eydkZXNjcmlwdGlvbid9LCAiIChtaXNzaW5nKVxuIikKKwkJLiAkd2h5OworICAgIH0gZWxzaWYgKCR0ZXN0eydleHBlY3RlZC1mYWlsJ30pIHsKKwlwcmludCAiUEFTUyAkbmFtZSAodW5leHBlY3RlZGx5KVxuIjsKKwkkbnhwYXNzZWQrKzsKKyAgICB9IGVsc2UgeworCXByaW50ICJwYXNzICRuYW1lXG4iOworCSRucGFzc2VkKys7CisgICAgfQorICAgIHByaW50ICR3aHkgaWYgJHZlcmJvc2U7CisgICAgcmV0dXJuIDA7Cit9CisKK3N1YgorY2F0ZWdvcnlfY2hlY2sKK3sKKyAgICBsb2NhbCgqdGVzdCkgPSBAXzsKKyAgICBsb2NhbCgkYyk7CisKKyAgICByZXR1cm4gMSBpZiAoIWRlZmluZWQgJHRlc3R7J2NhdGVnb3J5J30pOworICAgIGxvY2FsKCRvaykgPSAwOworICAgIGZvcmVhY2ggJGMgKHNwbGl0KCcsJywgJHRlc3R7J2NhdGVnb3J5J30pKSB7CisJJGMgPX4gcy9ccysvLzsKKwlpZiAoJGMgPX4gL14hLykgeworCSAgICAkYyA9ICQnOworCSAgICByZXR1cm4gMCBpZiAoZGVmaW5lZCAkY2F0ZWdvcmllc3skY30pOworCSAgICAkb2sgPSAxOworCX0gZWxzZSB7CisJICAgICRvayA9IDEgaWYgKGRlZmluZWQgJGNhdGVnb3JpZXN7JGN9KTsKKwl9CisgICAgfQorICAgIHJldHVybiAkb2s7Cit9CisKK3N1Ygorc2NydWJfZGlyCit7CisgICAgbG9jYWwoJGRpcikgPSBAXzsKKyAgICBsb2NhbChAdG9kbykgPSAoKTsKKyAgICBsb2NhbCgkZmlsZSk7CisKKyAgICBpZiAoIW9wZW5kaXIoRElSLCAkZGlyKSkgeworCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IG9wZW4gZGlyZWN0b3J5ICRkaXIgLSAkIVxuIjsKKwlyZXR1cm4gdW5kZWY7CisgICAgfQorICAgIHdoaWxlIChkZWZpbmVkICgkZmlsZSA9IHJlYWRkaXIoRElSKSkpIHsKKwlwdXNoKEB0b2RvLCAkZmlsZSkgaWYgJGZpbGUgbmUgJy4nICYmICRmaWxlIG5lICcuLic7CisgICAgfQorICAgIGNsb3NlZGlyKERJUik7CisgICAgZm9yZWFjaCAkZmlsZSAoQHRvZG8pIHsKKwkkZmlsZSA9ICIkZGlyLyRmaWxlIjsKKwlpZiAoLWQgJGZpbGUpIHsKKwkgICAgcmV0dXJuIHVuZGVmIGlmICEmc2NydWJfZGlyKCRmaWxlKTsKKwkgICAgaWYgKCFybWRpcigkZmlsZSkpIHsKKwkJcHJpbnQgU1RERVJSICIkcHJvZzogY291bGRuJ3Qgcm1kaXIgJGZpbGUgLSAkIVxuIjsKKwkJcmV0dXJuIHVuZGVmOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaWYgKCF1bmxpbmsoJGZpbGUpKSB7CisJCXByaW50IFNUREVSUiAiJHByb2c6IGNvdWxkbid0IHVubGluayAkZmlsZSAtICQhXG4iOworCQlyZXR1cm4gdW5kZWY7CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdWIKK3dyaXRlX2ZpbGUKK3sKKyAgICBsb2NhbCgkZmlsZSwgJHN0cikgPSBAXzsKKworICAgIGlmICghb3BlbihURU1QLCAiPiAkZmlsZSIpKSB7CisJcHJpbnQgU1RERVJSICIkcHJvZzogY2FuJ3Qgb3BlbiAkZmlsZSAtICQhXG4iOworCXJldHVybiB1bmRlZjsKKyAgICB9CisgICAgYmlubW9kZShURU1QKTsKKyAgICBwcmludCBURU1QICRzdHI7CisgICAgaWYgKCFjbG9zZShURU1QKSkgeworCXByaW50IFNUREVSUiAiJHByb2c6IGVycm9yIHdyaXRpbmcgJGZpbGUgLSAkIVxuIjsKKwlyZXR1cm4gdW5kZWY7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdWIKK2NoZWNrX291dHB1dAoreworICAgIGxvY2FsKCRuYW1lLCAkZmlsZSwgJHdoYXQsICRleHBlY3QsICRleHBlY3RfcGF0KSA9IEBfOworICAgIGxvY2FsKCRnb3QpID0gJyc7CisgICAgbG9jYWwoJHdoeSkgPSAnJzsKKyAgICBsb2NhbCgkcmV0KTsKKworICAgIGlmICghb3BlbihURU1QLCAiPCAkZmlsZSIpKSB7CisJcHJpbnQgU1RERVJSICIkcHJvZzokbmFtZSgkd2hhdCk6IGNvdWxkbid0IG9wZW4gJGZpbGUgYWZ0ZXIgcnVubmluZyBwcm9ncmFtIC0gJCFcbiI7CisJcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICBiaW5tb2RlKFRFTVApOworICAgIHdoaWxlICg8VEVNUD4pIHsKKwkkZ290IC49ICRfOworICAgIH0KKyAgICBjbG9zZShURU1QKTsKKyAgICByZXR1cm4gY29tcGFyZV9vdXRwdXQoJG5hbWUsICR3aGF0LCAkZXhwZWN0LCAkZXhwZWN0X3BhdCwgJGdvdCk7Cit9CisKK3N1YgorY29tcGFyZV9vdXRwdXQKK3sKKyAgICBsb2NhbCgkbmFtZSwgJHdoYXQsICRleHBlY3QsICRleHBlY3RfcGF0LCAkZ290KSA9IEBfOworICAgIGxvY2FsKCR3aHkpID0gJyc7CisKKyAgICBpZiAoZGVmaW5lZCAkZXhwZWN0X3BhdCkgeworCSRfID0gJGdvdDsKKwkkcmV0ID0gZXZhbCAiJGV4cGVjdF9wYXQiOworCWlmICgkQCBuZSAnJykgeworCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiRuYW1lKCR3aGF0KTogZXJyb3IgZXZhbHVhdGluZyAkd2hhdCBwYXR0ZXJuOiAkZXhwZWN0X3BhdCAtICRAXG4iOworCSAgICByZXR1cm4gdW5kZWY7CisJfQorCWlmICghJHJldCkgeworCSAgICAkd2h5ID0gIlx0dW5leHBlY3RlZCAkd2hhdCAtIHdhbnRlZCBwYXR0ZXJuIjsKKwkgICAgJHdoeSAuPSAmd3JhcF9saW5lcygkZXhwZWN0X3BhdCk7CisJICAgICR3aHkgLj0gIlx0Z290IjsKKwkgICAgJHdoeSAuPSAmd3JhcF9saW5lcygkZ290KTsKKwl9CisgICAgfSBlbHNlIHsKKwkkZXhwZWN0ID0gJycgaWYgIWRlZmluZWQgJGV4cGVjdDsKKwlpZiAoJGdvdCBuZSAkZXhwZWN0KSB7CisJICAgICR3aHkgLj0gIlx0dW5leHBlY3RlZCAkd2hhdCAtICIgLiAmZmlyc3RfZGlmZigkZXhwZWN0LCAkZ290KSAuICJcbiI7CisJICAgICR3aHkgLj0gIlx0d2FudGVkIjsKKwkgICAgJHdoeSAuPSAmd3JhcF9saW5lcygkZXhwZWN0KTsKKwkgICAgJHdoeSAuPSAiXHRnb3QiOworCSAgICAkd2h5IC49ICZ3cmFwX2xpbmVzKCRnb3QpOworCX0KKyAgICB9CisgICAgcmV0dXJuICR3aHk7Cit9CisKK3N1Ygord3JhcF9saW5lcworeworICAgIGxvY2FsKCRzdHIsICRlbXB0eSkgPSBAXzsKKyAgICBsb2NhbCgkbm9ubCkgPSBzdWJzdHIoJHN0ciwgLTEsIDEpIG5lICJcbiI7CisKKyAgICByZXR1cm4gKGRlZmluZWQgJGVtcHR5ID8gJGVtcHR5IDogIiBub3RoaW5nXG4iKSBpZiAkc3RyIGVxICcnOworICAgIHN1YnN0cigkc3RyLCAwLCAwKSA9ICI6XG4iOworICAgICRzdHIgPX4gcy9cbi9cblx0XHQvZzsKKyAgICBpZiAoJG5vbmwpIHsKKwkkc3RyIC49ICJcblx0W2luY29tcGxldGUgbGFzdCBsaW5lXVxuIjsKKyAgICB9IGVsc2UgeworCWNob3AoJHN0cik7CisJY2hvcCgkc3RyKTsKKyAgICB9CisgICAgcmV0dXJuICRzdHI7Cit9CisKK3N1YgorZmlyc3RfZGlmZgoreworICAgIGxvY2FsKCRleHAsICRnb3QpID0gQF87CisgICAgbG9jYWwoJGxpbmVubywgJGNoYXIpID0gKDEsIDEpOworICAgIGxvY2FsKCRpLCAkZXhwX2xlbiwgJGdvdF9sZW4pOworICAgIGxvY2FsKCRjZSwgJGNnKTsKKworICAgICRleHBfbGVuID0gbGVuZ3RoKCRleHApOworICAgICRnb3RfbGVuID0gbGVuZ3RoKCRnb3QpOworICAgIGlmICgkZXhwX2xlbiAhPSAkZ290X2xlbikgeworCWlmICgkZXhwX2xlbiA8ICRnb3RfbGVuKSB7CisJICAgIGlmIChzdWJzdHIoJGdvdCwgMCwgJGV4cF9sZW4pIGVxICRleHApIHsKKwkJcmV0dXJuICJnb3QgdG9vIG11Y2ggb3V0cHV0IjsKKwkgICAgfQorCX0gZWxzaWYgKHN1YnN0cigkZXhwLCAwLCAkZ290X2xlbikgZXEgJGdvdCkgeworCSAgICByZXR1cm4gImdvdCB0b28gbGl0dGxlIG91dHB1dCI7CisJfQorICAgIH0KKyAgICBmb3IgKCRpID0gMDsgJGkgPCAkZXhwX2xlbjsgJGkrKykgeworCSRjZSA9IHN1YnN0cigkZXhwLCAkaSwgMSk7CisJJGNnID0gc3Vic3RyKCRnb3QsICRpLCAxKTsKKwlsYXN0IGlmICRjZSBuZSAkY2c7CisJJGNoYXIrKzsKKwlpZiAoJGNlIGVxICJcbiIpIHsKKwkgICAgJGxpbmVubysrOworCSAgICAkY2hhciA9IDE7CisJfQorICAgIH0KKyAgICByZXR1cm4gImZpcnN0IGRpZmZlcmVuY2U6IGxpbmUgJGxpbmVubywgY2hhciAkY2hhciAod2FudGVkICciCisJLiAmZm9ybWF0X2NoYXIoJGNlKSAuICInLCBnb3QgJyIKKwkuICZmb3JtYXRfY2hhcigkY2cpIC4gIiciOworfQorCitzdWIKK2Zvcm1hdF9jaGFyCit7CisgICAgbG9jYWwoJGNoLCAkcyk7CisKKyAgICAkY2ggPSBvcmQoJF9bMF0pOworICAgIGlmICgkY2ggPT0gMTApIHsKKwlyZXR1cm4gJ1xuJzsKKyAgICB9IGVsc2lmICgkY2ggPT0gMTMpIHsKKwlyZXR1cm4gJ1xyJzsKKyAgICB9IGVsc2lmICgkY2ggPT0gOCkgeworCXJldHVybiAnXGInOworICAgIH0gZWxzaWYgKCRjaCA9PSA5KSB7CisJcmV0dXJuICdcdCc7CisgICAgfSBlbHNpZiAoJGNoID4gMTI3KSB7CisJJGNoIC09IDEyNzsKKwkkcyA9ICJNLSI7CisgICAgfSBlbHNlIHsKKwkkcyA9ICcnOworICAgIH0KKyAgICBpZiAoJGNoIDwgMzIpIHsKKwkkcyAuPSAnXic7CisJJGNoICs9IG9yZCgnQCcpOworICAgIH0gZWxzaWYgKCRjaCA9PSAxMjcpIHsKKwlyZXR1cm4gJHMgLiAiXj8iOworICAgIH0KKyAgICByZXR1cm4gJHMgLiBzcHJpbnRmKCIlYyIsICRjaCk7Cit9CisKK3N1YgorZXZhbF9leGl0Cit7CisgICAgbG9jYWwoJG5hbWUsICRzdGF0dXMsICRleHBlY3QpID0gQF87CisgICAgbG9jYWwoJGV4cHIpOworICAgIGxvY2FsKCR3LCAkZSwgJHMpID0gKCRzdGF0dXMsICgkc3RhdHVzID4+IDgpICYgMHhmZiwgJHN0YXR1cyAmIDB4N2YpOworCisgICAgJGUgPSAtMTAwMCBpZiAkc3RhdHVzICYgMHhmZjsKKyAgICAkcyA9IC0xMDAwIGlmICRzID09IDB4N2Y7CisgICAgaWYgKCFkZWZpbmVkICRleHBlY3QpIHsKKwkkZXhwciA9ICckdyA9PSAwJzsKKyAgICB9IGVsc2lmICgkZXhwZWN0ID1+IC9eKHwtKVxkKyQvKSB7CisJJGV4cHIgPSAiXCRlID09ICRleHBlY3QiOworICAgIH0gZWxzZSB7CisJJGV4cHIgPSAkZXhwZWN0OworCSRleHByID1+IHMvXGIoW3dzZV0pXGIvXCQkMS9nOworCSRleHByID1+IHMvXGIoU0lHW0EtWjAtOV0rKVxiLyYkMS9nOworICAgIH0KKyAgICAkdyA9IGV2YWwgJGV4cHI7CisgICAgaWYgKCRAIG5lICcnKSB7CisJcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBiYWQgZXhwZWN0ZWQtZXhpdCBleHByZXNzaW9uOiAkZXhwZWN0ICgkQClcbiI7CisJcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICByZXR1cm4gJHc7Cit9CisKK3N1YgorcmVhZF90ZXN0Cit7CisgICAgbG9jYWwoJGZpbGUsICRpbiwgKnRlc3QpID0gQF87CisgICAgbG9jYWwoJGZpZWxkLCAkdmFsLCAkZmxhZ3MsICRkb19jaG9wLCAkbmVlZF9yZWRvLCAkc3RhcnRfbGluZW5vKTsKKyAgICBsb2NhbCglY250LCAkc2ZpZWxkKTsKKworICAgICV0ZXN0ID0gKCk7CisgICAgJWNudCA9ICgpOworICAgIHdoaWxlICg8JGluPikgeworCW5leHQgaWYgL15ccyokLzsKKwluZXh0IGlmIC9eICojLzsKKwlsYXN0IGlmIC9eXHMqLS0tXHMqJC87CisJJHN0YXJ0X2xpbmVubyA9ICQuIGlmICFkZWZpbmVkICRzdGFydF9saW5lbm87CisJaWYgKCEvXihbLVx3XSspOlxzKih8XFN8XFMuKlxTKVxzKiQvKSB7CisJICAgIHByaW50IFNUREVSUiAiJHByb2c6JGZpbGU6JC46IHVucmVjb2duaXNlZCBsaW5lXG4iOworCSAgICByZXR1cm4gdW5kZWY7CisJfQorCSgkZmllbGQsICR2YWwpID0gKCQxLCAkMik7CisJJHNmaWVsZCA9ICRmaWVsZDsKKwkkZmxhZ3MgPSAkdGVzdF9maWVsZHN7JGZpZWxkfTsKKwlpZiAoIWRlZmluZWQgJGZsYWdzKSB7CisJICAgIHByaW50IFNUREVSUiAiJHByb2c6JGZpbGU6JC46IHVucmVjb2duaXNlZCBmaWVsZCBcIiRmaWVsZFwiXG4iOworCSAgICByZXR1cm4gdW5kZWY7CisJfQorCWlmICgkZmxhZ3MgPX4gL3MvKSB7CisJICAgIGxvY2FsKCRjbnQpID0gJGNudHskZmllbGR9Kys7CisJICAgICR0ZXN0eyRmaWVsZH0gPSAkY250eyRmaWVsZH07CisJICAgICRjbnQgPSAwIGlmICRjbnQgZXEgJyc7CisJICAgICRzZmllbGQgLj0gIjokY250IjsKKwl9IGVsc2lmIChkZWZpbmVkICR0ZXN0eyRmaWVsZH0pIHsKKwkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokZmlsZTokLjogbXVsdGlwbGUgXCIkZmllbGRcIiBmaWVsZHNcbiI7CisJICAgIHJldHVybiB1bmRlZjsKKwl9CisJJGRvX2Nob3AgPSAkZmxhZ3MgIX4gL20vOworCSRuZWVkX3JlZG8gPSAwOworCWlmICgkdmFsIGVxICcnIHx8ICR2YWwgZXEgJyEnIHx8ICRmbGFncyA9fiAvcC8pIHsKKwkgICAgaWYgKCRmbGFncyA9fiAvW01tXS8pIHsKKwkJaWYgKCRmbGFncyA9fiAvcC8pIHsKKwkJICAgIGlmICgkdmFsID1+IC9eIS8pIHsKKwkJCSRkb19jaG9wID0gMTsKKwkJCSR2YWwgPSAkJzsKKwkJICAgIH0gZWxzZSB7CisJCQkkZG9fY2hvcCA9IDA7CisJCSAgICB9CisJCSAgICBpZiAoJHZhbCBlcSAnJykgeworCQkJcHJpbnQgU1RERVJSCisJCSIkcHJvZzokZmlsZTokLjogbm8gcGFyYW1ldGVycyBnaXZlbiBmb3IgZmllbGQgXCIkZmllbGRcIlxuIjsKKwkJCXJldHVybiB1bmRlZjsKKwkJICAgIH0KKwkJfSBlbHNlIHsKKwkJICAgIGlmICgkdmFsIGVxICchJykgeworCQkJJGRvX2Nob3AgPSAxOworCQkgICAgfQorCQkgICAgJHZhbCA9ICcnOworCQl9CisJCXdoaWxlICg8JGluPikgeworCQkgICAgbGFzdCBpZiAhL15cdC87CisJCSAgICAkdmFsIC49ICQnOworCQl9CisJCWNob3AgJHZhbCBpZiAkZG9fY2hvcDsKKwkJJGRvX2Nob3AgPSAxOworCQkkbmVlZF9yZWRvID0gMTsKKworCQkjIFN5bnRheCBjaGVjayBvbiBmaWVsZHMgdGhhdCBjYW4gc2V2ZXJhbCBpbnN0YW5jZXMKKwkJIyAoY2FuIGdpdmUgdXNlZnVsIGxpbmUgbnVtYmVycyB0aGlzIHdheSkKKworCQlpZiAoJGZpZWxkIGVxICdmaWxlLXNldHVwJykgeworCQkgICAgbG9jYWwoJHR5cGUsICRwZXJtLCAkcmVzdCwgJGMsICRsZW4sICRuYW1lKTsKKworCQkgICAgIyBmb3JtYXQgaXM6IHR5cGUgcGVybSAibmFtZSIKKwkJICAgIGlmICgkdmFsICF+IC9eWyBcdF0qKFxTKylbIFx0XSsoXFMrKVsgXHRdKyhbXiBcdF0uKikvKSB7CisJCQlwcmludCBTVERFUlIKKwkJICAgICIkcHJvZzokZmlsZTokLjogYmFkIHBhcmFtZXRlciBsaW5lIGZvciBmaWxlLXNldHVwIGZpZWxkXG4iOworCQkJcmV0dXJuIHVuZGVmOworCQkgICAgfQorCQkgICAgKCR0eXBlLCAkcGVybSwgJHJlc3QpID0gKCQxLCAkMiwgJDMpOworCQkgICAgaWYgKCR0eXBlICF+IC9eKGZpbGV8ZGlyfHN5bWxpbmspJC8pIHsKKwkJCXByaW50IFNUREVSUgorCQkgICAgIiRwcm9nOiRmaWxlOiQuOiBiYWQgZmlsZSB0eXBlIGZvciBmaWxlLXNldHVwOiAkdHlwZVxuIjsKKwkJCXJldHVybiB1bmRlZjsKKwkJICAgIH0KKwkJICAgIGlmICgkcGVybSAhfiAvXlxkKyQvKSB7CisJCQlwcmludCBTVERFUlIKKwkJICAgICIkcHJvZzokZmlsZTokLjogYmFkIHBlcm1pc3Npb25zIGZvciBmaWxlLXNldHVwOiAkdHlwZVxuIjsKKwkJCXJldHVybiB1bmRlZjsKKwkJICAgIH0KKwkJICAgICRjID0gc3Vic3RyKCRyZXN0LCAwLCAxKTsKKwkJICAgIGlmICgoJGxlbiA9IGluZGV4KCRyZXN0LCAkYywgMSkgLSAxKSA8PSAwKSB7CisJCQlwcmludCBTVERFUlIKKyAgICAiJHByb2c6JGZpbGU6JC46IG1pc3NpbmcgZW5kIHF1b3RlIGZvciBmaWxlIG5hbWUgaW4gZmlsZS1zZXR1cDogJHJlc3RcbiI7CisJCQlyZXR1cm4gdW5kZWY7CisJCSAgICB9CisJCSAgICAkbmFtZSA9IHN1YnN0cigkcmVzdCwgMSwgJGxlbik7CisJCSAgICBpZiAoJG5hbWUgPX4gL15cLy8gfHwgJG5hbWUgPX4gLyhefFwvKVwuXC4oXC98JCkvKSB7CisJCQkjIE5vdGU6IHRoaXMgaXMgbm90IGEgc2VjdXJpdHkgdGhpbmcgLSBqdXN0IGEgc2FuaXR5CisJCQkjIGNoZWNrIC0gYSB0ZXN0IGNhbiBzdGlsbCB1c2Ugc3ltbGlua3MgdG8gZ2V0IGF0IGZpbGVzCisJCQkjIG91dHNpZGUgdGhlIHRlc3QgZGlyZWN0b3J5LgorCQkJcHJpbnQgU1RERVJSCisiJHByb2c6JGZpbGU6JC46IGZpbGUgbmFtZSBpbiBmaWxlLXNldHVwIGlzIGFic29sdXRlIG9yIGNvbnRhaW5zIC4uOiAkbmFtZVxuIjsKKwkJCXJldHVybiB1bmRlZjsKKwkJICAgIH0KKwkJfQorCQlpZiAoJGZpZWxkIGVxICdmaWxlLXJlc3VsdCcpIHsKKwkJICAgIGxvY2FsKCR0eXBlLCAkcGVybSwgJHVpZCwgJGdpZCwgJG1hdGNoVHlwZSwKKwkJCSAgJHJlc3QsICRjLCAkbGVuLCAkbmFtZSk7CisKKwkJICAgICMgZm9ybWF0IGlzOiB0eXBlIHBlcm0gdWlkIGdpZCBtYXRjaFR5cGUgIm5hbWUiCisJCSAgICBpZiAoJHZhbCAhfiAvXlxzKihcUyspXHMrKFxTKylccysoXFMrKVxzKyhcUyspXHMrKFxTKylccysoXFMuKikvKSB7CisJCQlwcmludCBTVERFUlIKKwkJICAgICIkcHJvZzokZmlsZTokLjogYmFkIHBhcmFtZXRlciBsaW5lIGZvciBmaWxlLXJlc3VsdCBmaWVsZFxuIjsKKwkJCXJldHVybiB1bmRlZjsKKwkJICAgIH0KKwkJICAgICgkdHlwZSwgJHBlcm0sICR1aWQsICRnaWQsICRtYXRjaFR5cGUsICRyZXN0KQorCQkJPSAoJDEsICQyLCAkMywgJDQsICQ1LCAkNik7CisJCSAgICBpZiAoJHR5cGUgIX4gL14oZmlsZXxkaXJ8c3ltbGluaykkLykgeworCQkJcHJpbnQgU1RERVJSCisJCSAgICAiJHByb2c6JGZpbGU6JC46IGJhZCBmaWxlIHR5cGUgZm9yIGZpbGUtcmVzdWx0OiAkdHlwZVxuIjsKKwkJCXJldHVybiB1bmRlZjsKKwkJICAgIH0KKwkJICAgIGlmICgkcGVybSAhfiAvXlxkKyQvICYmICRwZXJtIG5lICcqJykgeworCQkJcHJpbnQgU1RERVJSCisJCSAgICAiJHByb2c6JGZpbGU6JC46IGJhZCBwZXJtaXNzaW9ucyBmb3IgZmlsZS1yZXN1bHQ6ICRwZXJtXG4iOworCQkJcmV0dXJuIHVuZGVmOworCQkgICAgfQorCQkgICAgaWYgKCR1aWQgIX4gL15cZCskLyAmJiAkdWlkIG5lICcqJykgeworCQkJcHJpbnQgU1RERVJSCisJCSAgICAiJHByb2c6JGZpbGU6JC46IGJhZCB1c2VyLWlkIGZvciBmaWxlLXJlc3VsdDogJHVpZFxuIjsKKwkJCXJldHVybiB1bmRlZjsKKwkJICAgIH0KKwkJICAgIGlmICgkZ2lkICF+IC9eXGQrJC8gJiYgJGdpZCBuZSAnKicpIHsKKwkJCXByaW50IFNUREVSUgorCQkgICAgIiRwcm9nOiRmaWxlOiQuOiBiYWQgZ3JvdXAtaWQgZm9yIGZpbGUtcmVzdWx0OiAkZ2lkXG4iOworCQkJcmV0dXJuIHVuZGVmOworCQkgICAgfQorCQkgICAgaWYgKCRtYXRjaFR5cGUgIX4gL14oZXhhY3R8cGF0dGVybikkLykgeworCQkJcHJpbnQgU1RERVJSCisJCSIkcHJvZzokZmlsZTokLjogYmFkIG1hdGNoIHR5cGUgZm9yIGZpbGUtcmVzdWx0OiAkbWF0Y2hUeXBlXG4iOworCQkJcmV0dXJuIHVuZGVmOworCQkgICAgfQorCQkgICAgJGMgPSBzdWJzdHIoJHJlc3QsIDAsIDEpOworCQkgICAgaWYgKCgkbGVuID0gaW5kZXgoJHJlc3QsICRjLCAxKSAtIDEpIDw9IDApIHsKKwkJCXByaW50IFNUREVSUgorICAgICIkcHJvZzokZmlsZTokLjogbWlzc2luZyBlbmQgcXVvdGUgZm9yIGZpbGUgbmFtZSBpbiBmaWxlLXJlc3VsdDogJHJlc3RcbiI7CisJCQlyZXR1cm4gdW5kZWY7CisJCSAgICB9CisJCSAgICAkbmFtZSA9IHN1YnN0cigkcmVzdCwgMSwgJGxlbik7CisJCSAgICBpZiAoJG5hbWUgPX4gL15cLy8gfHwgJG5hbWUgPX4gLyhefFwvKVwuXC4oXC98JCkvKSB7CisJCQkjIE5vdGU6IHRoaXMgaXMgbm90IGEgc2VjdXJpdHkgdGhpbmcgLSBqdXN0IGEgc2FuaXR5CisJCQkjIGNoZWNrIC0gYSB0ZXN0IGNhbiBzdGlsbCB1c2Ugc3ltbGlua3MgdG8gZ2V0IGF0IGZpbGVzCisJCQkjIG91dHNpZGUgdGhlIHRlc3QgZGlyZWN0b3J5LgorCQkJcHJpbnQgU1RERVJSCisiJHByb2c6JGZpbGU6JC46IGZpbGUgbmFtZSBpbiBmaWxlLXJlc3VsdCBpcyBhYnNvbHV0ZSBvciBjb250YWlucyAuLjogJG5hbWVcbiI7CisJCQlyZXR1cm4gdW5kZWY7CisJCSAgICB9CisJCX0KKwkgICAgfSBlbHNpZiAoJHZhbCBlcSAnJykgeworCQlwcmludCBTVERFUlIKKwkJICAgICIkcHJvZzokZmlsZTokLjogbm8gdmFsdWUgZ2l2ZW4gZm9yIGZpZWxkIFwiJGZpZWxkXCJcbiI7CisJCXJldHVybiB1bmRlZjsKKwkgICAgfQorCX0KKwkkdmFsIC49ICJcbiIgaWYgISRkb19jaG9wOworCSR0ZXN0eyRzZmllbGR9ID0gJHZhbDsKKwlyZWRvIGlmICRuZWVkX3JlZG87CisgICAgfQorICAgIGlmICgkXyBlcSAnJykgeworCWlmICgldGVzdCkgeworCSAgICBwcmludCBTVERFUlIKKwkgICAgICAiJHByb2c6JGZpbGU6JHN0YXJ0X2xpbmVubzogZW5kLW9mLWZpbGUgd2hpbGUgcmVhZGluZyB0ZXN0XG4iOworCSAgICByZXR1cm4gdW5kZWY7CisJfQorCXJldHVybiAwOworICAgIH0KKworICAgIHdoaWxlICgoJGZpZWxkLCAkdmFsKSA9IGVhY2ggJXRlc3RfZmllbGRzKSB7CisJaWYgKCR2YWwgPX4gL3IvICYmICFkZWZpbmVkICR0ZXN0eyRmaWVsZH0pIHsKKwkgICAgcHJpbnQgU1RERVJSCisJICAgICAgIiRwcm9nOiRmaWxlOiRzdGFydF9saW5lbm86IHJlcXVpcmVkIGZpZWxkIFwiJGZpZWxkXCIgbWlzc2luZ1xuIjsKKwkgICAgcmV0dXJuIHVuZGVmOworCX0KKyAgICB9CisKKyAgICAkdGVzdHsnOmZ1bGwtbmFtZSd9ID0gc3Vic3RyKCRmaWxlLCAkZmlsZV9wcmVmaXhfc2tpcCkgLiAiOiR0ZXN0eyduYW1lJ30iOworICAgICR0ZXN0eyc6bG9uZy1uYW1lJ30gPSAiJGZpbGU6JHN0YXJ0X2xpbmVubzokdGVzdHsnbmFtZSd9IjsKKworICAgICMgU3ludGF4IGNoZWNrIG9uIHNwZWNpZmljIGZpZWxkcworICAgIGlmIChkZWZpbmVkICR0ZXN0eydleHBlY3RlZC1mYWlsJ30pIHsKKwlpZiAoJHRlc3R7J2V4cGVjdGVkLWZhaWwnfSAhfiAvXih5ZXN8bm8pJC8pIHsKKwkgICAgcHJpbnQgU1RERVJSCisJICAgICAgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGJhZCB2YWx1ZSBmb3IgZXhwZWN0ZWQtZmFpbCBmaWVsZFxuIjsKKwkgICAgcmV0dXJuIHVuZGVmOworCX0KKwkkdGVzdHsnZXhwZWN0ZWQtZmFpbCd9ID0gJDEgZXEgJ3llcyc7CisgICAgfSBlbHNlIHsKKwkkdGVzdHsnZXhwZWN0ZWQtZmFpbCd9ID0gMDsKKyAgICB9CisgICAgaWYgKGRlZmluZWQgJHRlc3R7J2FyZ3VtZW50cyd9KSB7CisJbG9jYWwoJGZpcnN0YykgPSBzdWJzdHIoJHRlc3R7J2FyZ3VtZW50cyd9LCAwLCAxKTsKKworCWlmIChzdWJzdHIoJHRlc3R7J2FyZ3VtZW50cyd9LCAtMSwgMSkgbmUgJGZpcnN0YykgeworCSAgICBwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGFyZ3VtZW50cyBmaWVsZCBkb2Vzbid0IHN0YXJ0IGFuZCBlbmQgd2l0aCB0aGUgc2FtZSBjaGFyYWN0ZXJcbiI7CisJICAgIHJldHVybiB1bmRlZjsKKwl9CisgICAgfQorICAgIGlmIChkZWZpbmVkICR0ZXN0eydlbnYtc2V0dXAnfSkgeworCWxvY2FsKCRmaXJzdGMpID0gc3Vic3RyKCR0ZXN0eydlbnYtc2V0dXAnfSwgMCwgMSk7CisKKwlpZiAoc3Vic3RyKCR0ZXN0eydlbnYtc2V0dXAnfSwgLTEsIDEpIG5lICRmaXJzdGMpIHsKKwkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBlbnYtc2V0dXAgZmllbGQgZG9lc24ndCBzdGFydCBhbmQgZW5kIHdpdGggdGhlIHNhbWUgY2hhcmFjdGVyXG4iOworCSAgICByZXR1cm4gdW5kZWY7CisJfQorICAgIH0KKyAgICBpZiAoZGVmaW5lZCAkdGVzdHsnZXhwZWN0ZWQtZXhpdCd9KSB7CisJbG9jYWwoJHZhbCkgPSAkdGVzdHsnZXhwZWN0ZWQtZXhpdCd9OworCisJaWYgKCR2YWwgPX4gL14ofC0pXGQrJC8pIHsKKwkgICAgaWYgKCR2YWwgPCAwIHx8ICR2YWwgPiAyNTUpIHsKKwkJcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBleHBlY3RlZC1leGl0IHZhbHVlICR2YWwgbm90IGluIDAuLjI1NVxuIjsKKwkJcmV0dXJuIHVuZGVmOworCSAgICB9CisJfSBlbHNpZiAoJHZhbCAhfiAvXihbXHM8PistPSolXC8mfCEoKV18XGJbd3NlXVxifFxiU0lHW0EtWjAtOV0rXGIpKyQvKSB7CisJICAgIHByaW50IFNUREVSUiAiJHByb2c6JHRlc3R7Jzpsb25nLW5hbWUnfTogYmFkIGV4cGVjdGVkLWV4aXQgZXhwcmVzc2lvbjogJHZhbFxuIjsKKwkgICAgcmV0dXJuIHVuZGVmOworCX0KKyAgICB9IGVsc2UgeworCSR0ZXN0eydleHBlY3RlZC1leGl0J30gPSAwOworICAgIH0KKyAgICBpZiAoZGVmaW5lZCAkdGVzdHsnZXhwZWN0ZWQtc3Rkb3V0J30KKwkmJiBkZWZpbmVkICR0ZXN0eydleHBlY3RlZC1zdGRvdXQtcGF0dGVybid9KQorICAgIHsKKwlwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGNhbid0IHVzZSBib3RoIGV4cGVjdGVkLXN0ZG91dCBhbmQgZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm5cbiI7CisJcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICBpZiAoZGVmaW5lZCAkdGVzdHsnZXhwZWN0ZWQtc3RkZXJyJ30KKwkmJiBkZWZpbmVkICR0ZXN0eydleHBlY3RlZC1zdGRlcnItcGF0dGVybid9KQorICAgIHsKKwlwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGNhbid0IHVzZSBib3RoIGV4cGVjdGVkLXN0ZGVyciBhbmQgZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm5cbiI7CisJcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICBpZiAoZGVmaW5lZCAkdGVzdHsndGltZS1saW1pdCd9KSB7CisJaWYgKCR0ZXN0eyd0aW1lLWxpbWl0J30gIX4gL15cZCskLyB8fCAkdGVzdHsndGltZS1saW1pdCd9ID09IDApIHsKKwkgICAgcHJpbnQgU1RERVJSCisJICAgICAgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IGJhZCB2YWx1ZSBmb3IgdGltZS1saW1pdCBmaWVsZFxuIjsKKwkgICAgcmV0dXJuIHVuZGVmOworCX0KKyAgICB9IGVsc2lmIChkZWZpbmVkICRkZWZhdWx0X3RpbWVfbGltaXQpIHsKKwkkdGVzdHsndGltZS1saW1pdCd9ID0gJGRlZmF1bHRfdGltZV9saW1pdDsKKyAgICB9CisKKyAgICBpZiAoZGVmaW5lZCAka25vd25fdGVzdHN7JHRlc3R7J25hbWUnfX0pIHsKKwlwcmludCBTVERFUlIgIiRwcm9nOiR0ZXN0eyc6bG9uZy1uYW1lJ306IHdhcm5pbmc6IGR1cGxpY2F0ZSB0ZXN0IG5hbWUgJHt0ZXN0eyduYW1lJ319XG4iOworICAgIH0KKyAgICAka25vd25fdGVzdHN7JHRlc3R7J25hbWUnfX0gPSAxOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N1YgordHR5X21zZworeworICAgIGxvY2FsKCRtc2cpID0gQF87CisKKyAgICBvcGVuKFRUWSwgIj4gL2Rldi90dHkiKSB8fCByZXR1cm4gMDsKKyAgICBwcmludCBUVFkgJG1zZzsKKyAgICBjbG9zZShUVFkpOworICAgIHJldHVybiAxOworfQorCitzdWIKK25ldmVyX2NhbGxlZF9mdW5jcworeworCXJldHVybiAwOworCSZ0dHlfbXNnKCJoaVxuIik7CisJJm5ldmVyX2NhbGxlZF9mdW5jcygpOworCSZjYXRjaF9zaWdhbHJtKCk7CisJJG9sZF9lbnZ7J2Zvbyd9ID0gJ2Jhcic7CisJJGludGVybmFsX3Rlc3RfZmllbGRzeydmb28nfSA9ICdiYXInOworfQorCitzdWIKK2NoZWNrX2ZpbGVfcmVzdWx0Cit7CisgICAgbG9jYWwoKnRlc3QpID0gQF87CisKKyAgICByZXR1cm4gJycgaWYgKCFkZWZpbmVkICR0ZXN0eydmaWxlLXJlc3VsdCd9KTsKKworICAgIGxvY2FsKCR3aHkpID0gJyc7CisgICAgbG9jYWwoJGkpOworICAgIGxvY2FsKCR0eXBlLCAkcGVybSwgJHVpZCwgJGdpZCwgJHJlc3QsICRjLCAkbGVuLCAkbmFtZSk7CisgICAgbG9jYWwoQHN0YnVmKTsKKworICAgIGZvciAoJGkgPSAwOyAkaSA8ICR0ZXN0eydmaWxlLXJlc3VsdCd9OyAkaSsrKSB7CisJJHZhbCA9ICR0ZXN0eyJmaWxlLXJlc3VsdDokaSJ9OworCisJIyBmb3JtYXQgaXM6IHR5cGUgcGVybSAibmFtZSIKKwkoJHR5cGUsICRwZXJtLCAkdWlkLCAkZ2lkLCAkbWF0Y2hUeXBlLCAkcmVzdCkgPQorCSAgICBzcGxpdCgnICcsICR2YWwsIDYpOworCSRjID0gc3Vic3RyKCRyZXN0LCAwLCAxKTsKKwkkbGVuID0gaW5kZXgoJHJlc3QsICRjLCAxKSAtIDE7CisJJG5hbWUgPSBzdWJzdHIoJHJlc3QsIDEsICRsZW4pOworCSRyZXN0ID0gc3Vic3RyKCRyZXN0LCAyICsgJGxlbik7CisJJHBlcm0gPSBvY3QoJHBlcm0pIGlmICRwZXJtID1+IC9eXGQrJC87CisKKwlAc3RidWYgPSBsc3RhdCgkbmFtZSk7CisJaWYgKCFAc3RidWYpIHsKKwkgICAgJHdoeSAuPSAiXHRleHBlY3RlZCAkdHlwZSBcIiRuYW1lXCIgbm90IGNyZWF0ZWRcbiI7CisJICAgIG5leHQ7CisJfQorCWlmICgkcGVybSBuZSAnKicgJiYgKCRzdGJ1ZlsyXSAmIDA3Nzc3KSAhPSAkcGVybSkgeworCSAgICAkd2h5IC49ICJcdCR0eXBlIFwiJG5hbWVcIiBoYXMgdW5leHBlY3RlZCBwZXJtaXNzaW9uc1xuIjsKKwkgICAgJHdoeSAuPSBzcHJpbnRmKCJcdFx0ZXhwZWN0ZWQgMCVvLCBmb3VuZCAwJW9cbiIsCisJCSAgICAkcGVybSwgJHN0YnVmWzJdICYgMDc3NzcpOworCX0KKwlpZiAoJHVpZCBuZSAnKicgJiYgJHN0YnVmWzRdICE9ICR1aWQpIHsKKwkgICAgJHdoeSAuPSAiXHQkdHlwZSBcIiRuYW1lXCIgaGFzIHVuZXhwZWN0ZWQgdXNlci1pZFxuIjsKKwkgICAgJHdoeSAuPSBzcHJpbnRmKCJcdFx0ZXhwZWN0ZWQgJWQsIGZvdW5kICVkXG4iLAorCQkgICAgJHVpZCwgJHN0YnVmWzRdKTsKKwl9CisJaWYgKCRnaWQgbmUgJyonICYmICRzdGJ1Zls1XSAhPSAkZ2lkKSB7CisJICAgICR3aHkgLj0gIlx0JHR5cGUgXCIkbmFtZVwiIGhhcyB1bmV4cGVjdGVkIGdyb3VwLWlkXG4iOworCSAgICAkd2h5IC49IHNwcmludGYoIlx0XHRleHBlY3RlZCAlZCwgZm91bmQgJWRcbiIsCisJCSAgICAkZ2lkLCAkc3RidWZbNV0pOworCX0KKworCWlmICgkdHlwZSBlcSAnZmlsZScpIHsKKwkgICAgaWYgKC1sIF8gfHwgISAtZiBfKSB7CisJCSR3aHkgLj0gIlx0JHR5cGUgXCIkbmFtZVwiIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZVxuIjsKKwkgICAgfSBlbHNlIHsKKwkJbG9jYWwgJHRtcCA9ICZjaGVja19vdXRwdXQoJHRlc3R7J2xvbmctbmFtZSd9LCAkbmFtZSwKKwkJCSAgICAiJHR5cGUgY29udGVudHMgaW4gXCIkbmFtZVwiIiwKKwkJCSAgICAkbWF0Y2hUeXBlIGVxICdleGFjdCcgPyAkcmVzdCA6IHVuZGVmCisJCQkgICAgJG1hdGNoVHlwZSBlcSAncGF0dGVybicgPyAkcmVzdCA6IHVuZGVmKTsKKwkJcmV0dXJuIHVuZGVmIGlmICghZGVmaW5lZCAkdG1wKTsKKwkJJHdoeSAuPSAkdG1wOworCSAgICB9CisJfSBlbHNpZiAoJHR5cGUgZXEgJ2RpcicpIHsKKwkgICAgaWYgKCRyZXN0ICF+IC9eXHMqJC8pIHsKKwkJcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBmaWxlLXJlc3VsdCB0ZXN0IGZvciBkaXJlY3RvcnkgJG5hbWUgc2hvdWxkIG5vdCBoYXZlIGNvbnRlbnQgc3BlY2lmaWVkXG4iOworCQlyZXR1cm4gdW5kZWY7CisJICAgIH0KKwkgICAgaWYgKC1sIF8gfHwgISAtZCBfKSB7CisJCSR3aHkgLj0gIlx0JHR5cGUgXCIkbmFtZVwiIGlzIG5vdCBhIGRpcmVjdG9yeVxuIjsKKwkgICAgfQorCX0gZWxzaWYgKCR0eXBlIGVxICdzeW1saW5rJykgeworCSAgICBpZiAoIS1sIF8pIHsKKwkJJHdoeSAuPSAiXHQkdHlwZSBcIiRuYW1lXCIgaXMgbm90IGEgc3ltbGlua1xuIjsKKwkgICAgfSBlbHNlIHsKKwkJbG9jYWwgJGNvbnRlbnQgPSByZWFkbGluaygkbmFtZSk7CisJCWlmICghZGVmaW5lZCAkY29udGVudCkgeworCQkgICAgcHJpbnQgU1RERVJSICIkcHJvZzokdGVzdHsnOmxvbmctbmFtZSd9OiBmaWxlLXJlc3VsdCB0ZXN0IGZvciAkdHlwZSAkbmFtZSBmYWlsZWQgLSBjb3VsZCBub3QgcmVhZGxpbmsgLSAkIVxuIjsKKwkJICAgIHJldHVybiB1bmRlZjsKKwkJfQorCQlsb2NhbCAkdG1wID0gJmNvbXBhcmVfb3V0cHV0KCR0ZXN0eydsb25nLW5hbWUnfSwKKwkJCSAgICAiJHR5cGUgY29udGVudHMgaW4gXCIkbmFtZVwiIiwKKwkJCSAgICAkbWF0Y2hUeXBlIGVxICdleGFjdCcgPyAkcmVzdCA6IHVuZGVmCisJCQkgICAgJG1hdGNoVHlwZSBlcSAncGF0dGVybicgPyAkcmVzdCA6IHVuZGVmKTsKKwkJcmV0dXJuIHVuZGVmIGlmICghZGVmaW5lZCAkdG1wKTsKKwkJJHdoeSAuPSAkdG1wOworCSAgICB9CisJfQorICAgIH0KKworICAgIHJldHVybiAkd2h5OworfQorCitzdWIKK0hFTFBfTUVTU0FHRQoreworICAgIHByaW50IFNUREVSUiAkVXNhZ2U7CisgICAgZXhpdCAwOworfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvY2hlY2sudCBiL21rc2gvc3JjL2NoZWNrLnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlOGNhZgotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL2NoZWNrLnQKQEAgLTAsMCArMSw3NDQzIEBACisjICRNaXJPUzogc3JjL2Jpbi9ta3NoL2NoZWNrLnQsdiAxLjM4OCAyMDEwLzA4LzI0IDE1OjQ3OjQ0IHRnIEV4cCAkCisjICRPcGVuQlNEOiBia3NsLW5sLnQsdiAxLjIgMjAwMS8wMS8yOCAyMzowNDo1NiBuaWtsYXMgRXhwICQKKyMgJE9wZW5CU0Q6IGhpc3RvcnkudCx2IDEuNSAyMDAxLzAxLzI4IDIzOjA0OjU2IG5pa2xhcyBFeHAgJAorIyAkT3BlbkJTRDogcmVhZC50LHYgMS4zIDIwMDMvMDMvMTAgMDM6NDg6MTYgZGF2aWQgRXhwICQKKyMtCisjIENvcHlyaWdodCDCqSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisjCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyMKKyMgUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisjIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorIyBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1buKAkAorIyBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyMgbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyMKKyMgVGhpcyB3b3JrIGlzIHByb3ZpZGVkIOKAnEFTIElT4oCdIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworIyB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyMgaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisjIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorIyBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyMgb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisjIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorIyBvZiBzYWlkIHBlcnNvbuKAmXMgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisjLQorIyBZb3UgbWF5IGFsc28gd2FudCB0byB0ZXN0IElGUyB3aXRoIHRoZSBzY3JpcHQgYXQKKyMgaHR0cDovL3d3dy5yZXNlYXJjaC5hdHQuY29tL35nc2YvcHVibGljL2lmcy5zaAorCitleHBlY3RlZC1zdGRvdXQ6CisJQCgjKU1JUkJTRCBLU0ggUjM5IDIwMTAvMDgvMjQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHZlcnNpb24gb2Ygc2hlbGwuCitzdGRpbjoKKwllY2hvICRLU0hfVkVSU0lPTgorbmFtZTogS1NIX1ZFUlNJT04KKy0tLQorbmFtZTogc2VsZnRlc3QtMQorZGVzY3JpcHRpb246CisJUmVncmVzc2lvbiB0ZXN0IHNlbGYtdGVzdGluZworc3RkaW46CisJZWNobyAke2ZvbzotYmF6fQorZXhwZWN0ZWQtc3Rkb3V0OgorCWJhegorLS0tCituYW1lOiBzZWxmdGVzdC0yCitkZXNjcmlwdGlvbjoKKwlSZWdyZXNzaW9uIHRlc3Qgc2VsZi10ZXN0aW5nCitlbnYtc2V0dXA6ICFmb289YmFyIQorc3RkaW46CisJZWNobyAke2ZvbzotYmF6fQorZXhwZWN0ZWQtc3Rkb3V0OgorCWJhcgorLS0tCituYW1lOiBzZWxmdGVzdC0zCitkZXNjcmlwdGlvbjoKKwlSZWdyZXNzaW9uIHRlc3Qgc2VsZi10ZXN0aW5nCitlbnYtc2V0dXA6ICFFTlY9Zm5vcmQhCitzdGRpbjoKKwllY2hvICI8JEVOVj4iCitleHBlY3RlZC1zdGRvdXQ6CisJPGZub3JkPgorLS0tCituYW1lOiBzZWxmdGVzdC1lbnYKK2Rlc2NyaXB0aW9uOgorCUp1c3Qgb3V0cHV0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0IChhbHdheXMgZmFpbHMpCitjYXRlZ29yeTogZGlzYWJsZWQKK3N0ZGluOgorCXNldAorLS0tCituYW1lOiBhbGlhcy0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHJlY3Vyc2lvbiBpcyBkZXRlY3RlZC9hdm9pZGVkIGluIGFsaWFzZXMuCitzdGRpbjoKKwlhbGlhcyBmb29CYXI9Zm9vQmFyCisJZm9vQmFyCisJZXhpdCAwCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvZm9vQmFyLipub3QgZm91bmQuKi8KKy0tLQorbmFtZTogYWxpYXMtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCByZWN1cnNpb24gaXMgZGV0ZWN0ZWQvYXZvaWRlZCBpbiBhbGlhc2VzLgorc3RkaW46CisJYWxpYXMgZm9vQmFyPWJhckZvbworCWFsaWFzIGJhckZvbz1mb29CYXIKKwlmb29CYXIKKwliYXJGb28KKwlleGl0IDAKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9mb29CYXIuKm5vdCBmb3VuZC4qXG4uKmJhckZvby4qbm90IGZvdW5kLworLS0tCituYW1lOiBhbGlhcy0zCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHJlY3Vyc2lvbiBpcyBkZXRlY3RlZC9hdm9pZGVkIGluIGFsaWFzZXMuCitzdGRpbjoKKwlhbGlhcyBFY2hvPSdlY2hvICcKKwlhbGlhcyBmb29CYXI9YmFyRm9vCisJYWxpYXMgYmFyRm9vPWZvb0JhcgorCUVjaG8gZm9vQmFyCisJdW5hbGlhcyBiYXJGb28KKwlFY2hvIGZvb0JhcgorZXhwZWN0ZWQtc3Rkb3V0OgorCWZvb0JhcgorCWJhckZvbworLS0tCituYW1lOiBhbGlhcy00CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGFsaWFzIGV4cGFuc2lvbiBpc24ndCBkb25lIG9uIGtleXdvcmRzIChpbiBrZXl3b3JkCisJcG9zdGl0aW9ucykuCitzdGRpbjoKKwlhbGlhcyBFY2hvPSdlY2hvICcKKwlhbGlhcyB3aGlsZT1XaGlsZQorCXdoaWxlIGZhbHNlOyBkbyBlY2hvIGhpIDsgZG9uZQorCUVjaG8gd2hpbGUKK2V4cGVjdGVkLXN0ZG91dDoKKwlXaGlsZQorLS0tCituYW1lOiBhbGlhcy01CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGFsaWFzIGV4cGFuc2lvbiBkb25lIGFmdGVyIGFsaWFzIHdpdGggdHJhaWxpbmcgc3BhY2UuCitzdGRpbjoKKwlhbGlhcyBFY2hvPSdlY2hvICcKKwlhbGlhcyBmb289J2JhciBzdHVmZiAnCisJYWxpYXMgYmFyPSdCYXIxIEJhcjIgJworCWFsaWFzIHN0dWZmPSdTdHVmZicKKwlhbGlhcyBibGFoPSdCbGFoJworCUVjaG8gZm9vIGJsYWgKK2V4cGVjdGVkLXN0ZG91dDoKKwlCYXIxIEJhcjIgU3R1ZmYgQmxhaAorLS0tCituYW1lOiBhbGlhcy02CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGFsaWFzIGV4cGFuc2lvbiBkb25lIGFmdGVyIGFsaWFzIHdpdGggdHJhaWxpbmcgc3BhY2UuCitzdGRpbjoKKwlhbGlhcyBFY2hvPSdlY2hvICcKKwlhbGlhcyBmb289J2JhciBiYXInCisJYWxpYXMgYmFyPSdCYXIgJworCWFsaWFzIGJsYWg9QmxhaAorCUVjaG8gZm9vIGJsYWgKK2V4cGVjdGVkLXN0ZG91dDoKKwlCYXIgQmFyIEJsYWgKKy0tLQorbmFtZTogYWxpYXMtNworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBhbGlhcyBleHBhbnNpb24gZG9uZSBhZnRlciBhbGlhcyB3aXRoIHRyYWlsaW5nIHNwYWNlCisJYWZ0ZXIgYSBrZXl3b3JkLgorc3RkaW46CisJYWxpYXMgWD0nY2FzZSAnCisJYWxpYXMgWT1aCisJWCBZIGluICdZJykgZWNobyBpcyB5IDs7IFopIGVjaG8gaXMgeiA7IGVzYWMKK2V4cGVjdGVkLXN0ZG91dDoKKwlpcyB6CistLS0KK25hbWU6IGFsaWFzLTgKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgbmV3bGluZXMgaW4gYW4gYWxpYXMgZG9uJ3QgY2F1c2UgdGhlIGNvbW1hbmQgdG8gYmUgbG9zdC4KK3N0ZGluOgorCWFsaWFzIGZvbz0nCisJCisJCisJZWNobyBoaQorCQorCQorCQorCWVjaG8gdGhlcmUKKwkKKwkKKwknCisJZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwl0aGVyZQorLS0tCituYW1lOiBhbGlhcy05CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHJlY3Vyc2lvbiBpcyBkZXRlY3RlZC9hdm9pZGVkIGluIGFsaWFzZXMuCisJVGhpcyBjaGVjayBmYWlscyBmb3Igc2xvdyBtYWNoaW5lcyBvciBDeWd3aW4sIHJhaXNlCisJdGhlIHRpbWUtbGltaXQgY2xhdXNlIChlLmcuIHRvIDcpIGlmIHRoaXMgb2NjdXJzLgordGltZS1saW1pdDogMworc3RkaW46CisJZWNobyAtbiA+dGYKKwlhbGlhcyBscz1scworCWxzCisJZWNobyAkKGxzKQorCWV4aXQgMAorZXhwZWN0ZWQtc3Rkb3V0OgorCXRmCisJdGYKKy0tLQorbmFtZTogYWxpYXMtMTAKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgcmVjdXJzaW9uIGlzIGRldGVjdGVkL2F2b2lkZWQgaW4gYWxpYXNlcy4KKwlSZWdyZXNzaW9uLCBpbnRyb2R1Y2VkIGR1cmluZyBhbiBvbGQgYnVnZml4Lgorc3RkaW46CisJYWxpYXMgZm9vPSdwcmludCBoZWxsbyAnCisJYWxpYXMgYmFyPSdmb28gd29ybGQnCisJZWNobyAkKGJhcikKK2V4cGVjdGVkLXN0ZG91dDoKKwloZWxsbyB3b3JsZAorLS0tCituYW1lOiBhcml0aC1sYXp5LTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgb25seSBvbmUgc2lkZSBvZiB0ZXJuYXJ5IG9wZXJhdG9yIGlzIGV2YWx1YXRlZAorc3RkaW46CisJeD1pKz0yCisJeT1qKz0yCisJdHlwZXNldCAtaSBpPTEgaj0xCisJZWNobyAkKCgxID8gMjAgOiAoeCs9MikpKQorCWVjaG8gJGksJHgKKwllY2hvICQoKDAgPyAoeSs9MikgOiAzMCkpCisJZWNobyAkaiwkeQorZXhwZWN0ZWQtc3Rkb3V0OgorCTIwCisJMSxpKz0yCisJMzAKKwkxLGorPTIKKy0tLQorbmFtZTogYXJpdGgtbGF6eS0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGFzc2lnbm1lbnRzIG5vdCBkb25lIG9uIG5vbi1ldmFsdWF0ZWQgc2lkZSBvZiB0ZXJuYXJ5CisJb3BlcmF0b3IKK3N0ZGluOgorCXg9aSs9MgorCXk9ais9MgorCXR5cGVzZXQgLWkgaT0xIGo9MQorCWVjaG8gJCgoMSA/IDIwIDogKHgrPTIpKSkKKwllY2hvICRpLCR4CisJZWNobyAkKCgwID8gKHkrPTIpIDogMzApKQorCWVjaG8gJGksJHkKK2V4cGVjdGVkLXN0ZG91dDoKKwkyMAorCTEsaSs9MgorCTMwCisJMSxqKz0yCistLS0KK25hbWU6IGFyaXRoLWxhenktMworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBhc3NpZ25tZW50cyBub3QgZG9uZSBvbiBub24tZXZhbHVhdGVkIHNpZGUgb2YgdGVybmFyeQorCW9wZXJhdG9yIGFuZCB0aGlzIGNvbnN0cnVjdCBpcyBwYXJzZWQgY29ycmVjdGx5IChEZWJpYW4gIzQ0NTY1MSkKK3N0ZGluOgorCXg9NAorCXk9JCgoMCA/IHg9MSA6IDIpKQorCWVjaG8gPSAkeCAkeSA9CitleHBlY3RlZC1zdGRvdXQ6CisJPSA0IDIgPQorLS0tCituYW1lOiBhcml0aC10ZXJuYXJ5LXByZWMtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgcHJlY2VkZW5jZSBvZiB0ZXJuYXJ5IG9wZXJhdG9yIHZzIGFzc2lnbm1lbnQKK3N0ZGluOgorCXR5cGVzZXQgLWkgeD0yCisJeT0kKCgxID8gMjAgOiB4Kz0yKSkKK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLy4qOi4qMSBcPyAyMCA6IHhcKz0yLipsdmFsdWUuKlxuJC8KKy0tLQorbmFtZTogYXJpdGgtdGVybmFyeS1wcmVjLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHByZWNlZGVuY2Ugb2YgdGVybmFyeSBvcGVyYXRvciB2cyBhc3NpZ25tZW50CitzdGRpbjoKKwl0eXBlc2V0IC1pIHg9MgorCWVjaG8gJCgoMCA/IHgrPTIgOiAyMCkpCitleHBlY3RlZC1zdGRvdXQ6CisJMjAKKy0tLQorbmFtZTogYXJpdGgtZGl2LWFzc29jLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGFzc29jaWF0aXZpdHkgb2YgZGl2aXNpb24gb3BlcmF0b3IKK3N0ZGluOgorCWVjaG8gJCgoMjAgLyAyIC8gMikpCitleHBlY3RlZC1zdGRvdXQ6CisJNQorLS0tCituYW1lOiBhcml0aC1hc3NvcC1hc3NvYy0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBhc3NvY2lhdGl2aXR5IG9mIGFzc2lnbm1lbnQtb3BlcmF0b3Igb3BlcmF0b3IKK3N0ZGluOgorCXR5cGVzZXQgLWkgaT0xIGo9MiBrPTMKKwllY2hvICQoKGkgKz0gaiArPSBrKSkKKwllY2hvICRpLCRqLCRrCitleHBlY3RlZC1zdGRvdXQ6CisJNgorCTYsNSwzCistLS0KK25hbWU6IGFyaXRoLXVuc2lnbmVkLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIHVuc2lnbmVkIGFyaXRobWV0aWNzIHdvcmsKK3N0ZGluOgorCSMgc2lnbmVkIHZzIHVuc2lnbmVkCisJZWNobyB4MSAkKCgtMSkpICQoKCMtMSkpCisJIyBjYWxjdWxhdGluZworCXR5cGVzZXQgLWkgdnMKKwl0eXBlc2V0IC1VaSB2dQorCXZzPTQxMjM0NTY3ODk7IHZ1PTQxMjM0NTY3ODkKKwllY2hvIHgyICR2cyAkdnUKKwkoKCB2cyAlPSAyMTQ3NDgzNjQ3ICkpCisJKCggdnUgJT0gMjE0NzQ4MzY0NyApKQorCWVjaG8geDMgJHZzICR2dQorCXZzPTQxMjM0NTY3ODk7IHZ1PTQxMjM0NTY3ODkKKwkoKCAjIHZzICU9IDIxNDc0ODM2NDcgKSkKKwkoKCAjIHZ1ICU9IDIxNDc0ODM2NDcgKSkKKwllY2hvIHg0ICR2cyAkdnUKKwkjIG1ha2Ugc3VyZSB0aGUgY2FsY3VsYXRpb24gZG9lcyBub3QgY2hhbmdlIHVuc2lnbmVkIGZsYWcKKwl2cz00MTIzNDU2Nzg5OyB2dT00MTIzNDU2Nzg5CisJZWNobyB4NSAkdnMgJHZ1CisJIyBzaG9ydCBmb3JtCisJZWNobyB4NiAkKCgjIHZzICUgMjE0NzQ4MzY0NykpICQoKCMgdnUgJSAyMTQ3NDgzNjQ3KSkKKwkjIGFycmF5IHJlZnMKKwlzZXQgLUEgdmEKKwl2YVsxOTc1OTczMTQyXT1yaWdodAorCXZhWzQxMjM0NTY3ODldPXdyb25nCisJZWNobyB4NyAke3ZhWyM0MTIzNDU2Nzg5JTIxNDc0ODM2NDddfQorZXhwZWN0ZWQtc3Rkb3V0OgorCXgxIC0xIDQyOTQ5NjcyOTUKKwl4MiAtMTcxNTEwNTA3IDQxMjM0NTY3ODkKKwl4MyAtMTcxNTEwNTA3IDQxMjM0NTY3ODkKKwl4NCAxOTc1OTczMTQyIDE5NzU5NzMxNDIKKwl4NSAtMTcxNTEwNTA3IDQxMjM0NTY3ODkKKwl4NiAxOTc1OTczMTQyIDE5NzU5NzMxNDIKKwl4NyByaWdodAorLS0tCituYW1lOiBhcml0aC1saW1pdDMyLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIGFyaXRobWV0aWNzIGFyZSAzMiBiaXQKK3N0ZGluOgorCSMgc2lnbmVkIHZzIHVuc2lnbmVkCisJZWNobyB4MSAkKCgtMSkpICQoKCMtMSkpCisJIyBjYWxjdWxhdGluZworCXR5cGVzZXQgLWkgdnMKKwl0eXBlc2V0IC1VaSB2dQorCXZzPTIxNDc0ODM2NDc7IHZ1PTIxNDc0ODM2NDcKKwllY2hvIHgyICR2cyAkdnUKKwlsZXQgdnMrKyB2dSsrCisJZWNobyB4MyAkdnMgJHZ1CisJdnM9NDI5NDk2NzI5NTsgdnU9NDI5NDk2NzI5NQorCWVjaG8geDQgJHZzICR2dQorCWxldCB2cysrIHZ1KysKKwllY2hvIHg1ICR2cyAkdnUKKwlsZXQgdnMrKyB2dSsrCisJZWNobyB4NiAkdnMgJHZ1CitleHBlY3RlZC1zdGRvdXQ6CisJeDEgLTEgNDI5NDk2NzI5NQorCXgyIDIxNDc0ODM2NDcgMjE0NzQ4MzY0NworCXgzIC0yMTQ3NDgzNjQ4IDIxNDc0ODM2NDgKKwl4NCAtMSA0Mjk0OTY3Mjk1CisJeDUgMCAwCisJeDYgMSAxCistLS0KK25hbWU6IGJrc2wtbmwtaWduLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgbm90IGNvbGxhc3BlZCBhZnRlciAjCitzdGRpbjoKKwllY2hvIGhpICN0aGVyZSBcCisJZWNobyBmb2xrcworZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJZm9sa3MKKy0tLQorbmFtZTogYmtzbC1ubC1pZ24tMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBub3QgY29sbGFzcGVkIGluc2lkZSBzaW5nbGUgcXVvdGVzCitzdGRpbjoKKwllY2hvICdoaSBcCisJdGhlcmUnCisJZWNobyBmb2xrcworZXhwZWN0ZWQtc3Rkb3V0OgorCWhpIFwKKwl0aGVyZQorCWZvbGtzCistLS0KK25hbWU6IGJrc2wtbmwtaWduLTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgbm90IGNvbGxhc3BlZCBpbnNpZGUgc2luZ2xlIHF1b3Rlcworc3RkaW46CisJY2F0IDw8IFxFT0YKKwloaSBcCisJdGhlcmUKKwlFT0YKK2V4cGVjdGVkLXN0ZG91dDoKKwloaSBcCisJdGhlcmUKKy0tLQorbmFtZTogYmtzbC1ubC1pZ24tNAorZGVzY3JpcHRpb246CisJQ2hlY2sgaW50ZXJhY3Rpb24gb2YgYWxpYXNlcywgc2luZ2xlIHF1b3RlcyBhbmQgaGVyZS1kb2N1bWVudHMKKwl3aXRoIGJhY2tzbGFzaC1uZXdsaW5lCisJKGRvbid0IGtub3cgd2hhdCBQT1NJWCBoYXMgdG8gc2F5IGFib3V0IHRoaXMpCitzdGRpbjoKKwlhPTIKKwlhbGlhcyB4PSdlY2hvIGhpCisJY2F0IDw8ICJFT0YiCisJZm9vXAorCWJhcgorCXNvbWUnCisJeAorCW1vcmVcCisJc3R1ZmYkYQorCUVPRgorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJZm9vXAorCWJhcgorCXNvbWUKKwltb3JlXAorCXN0dWZmJGEKKy0tLQorbmFtZTogYmtzbC1ubC1pZ24tNQorZGVzY3JpcHRpb246CisJQ2hlY2sgd2hhdCBoYXBwZW5zIHdpdGggYmFja3NsYXNoIGF0IGVuZCBvZiBpbnB1dAorCSh0aGUgb2xkIEJvdXJuZSBzaGVsbCB0cmFzaGVzIHRoZW07IHNvIGRvIHdlKQorc3RkaW46ICEKKwllY2hvIGBlY2hvIGZvb1xcYGJhcgorCWVjaG8gaGlcCitleHBlY3RlZC1zdGRvdXQ6CisJZm9vYmFyCisJaGkKKy0tLQorIworIyBQbGFjZXMgXG5ld2xpbmUgc2hvdWxkIGJlIGNvbGxhcHNlZAorIworbmFtZTogYmtzbC1ubC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhc3BlZCBiZWZvcmUsIGluIHRoZSBtaWRkbGUgb2YsIGFuZAorCWFmdGVyIHdvcmRzCitzdGRpbjoKKwkgCSAJXAorCQkJIGVjaG8gaGlcCisJVGhlcmUsIFwKKwlmb2xrcworZXhwZWN0ZWQtc3Rkb3V0OgorCWhpVGhlcmUsIGZvbGtzCistLS0KK25hbWU6IGJrc2wtbmwtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBjb2xsYXNwZWQgaW4gJCBzZXF1ZW5jZXMKKwkoa3NoOTMgZmFpbHMgdGhpcykKK3N0ZGluOgorCWE9MTIKKwlhYj0xOQorCWVjaG8gJFwKKwlhCisJZWNobyAkYVwKKwliCisJZWNobyAkXAorCXthfQorCWVjaG8gJHthXAorCWJ9CisJZWNobyAke2FiXAorCX0KK2V4cGVjdGVkLXN0ZG91dDoKKwkxMgorCTE5CisJMTIKKwkxOQorCTE5CistLS0KK25hbWU6IGJrc2wtbmwtMworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBjb2xsYXNwZWQgaW4gJCguLikgYW5kIGAuLi5gIHNlcXVlbmNlcworCShrc2g5MyBmYWlscyB0aGlzKQorc3RkaW46CisJZWNobyAkXAorCShlY2hvIGZvb2JhcjEpCisJZWNobyAkKFwKKwllY2hvIGZvb2JhcjIpCisJZWNobyAkKGVjaG8gZm9vXAorCWJhcjMpCisJZWNobyAkKGVjaG8gZm9vYmFyNFwKKwkpCisJZWNobyBgCisJZWNobyBzdHVmZjFgCisJZWNobyBgZWNobyBzdFwKKwl1ZmYyYAorZXhwZWN0ZWQtc3Rkb3V0OgorCWZvb2JhcjEKKwlmb29iYXIyCisJZm9vYmFyMworCWZvb2JhcjQKKwlzdHVmZjEKKwlzdHVmZjIKKy0tLQorbmFtZTogYmtzbC1ubC00CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhc3BlZCBpbiAkKCguLikpIHNlcXVlbmNlcworCShrc2g5MyBmYWlscyB0aGlzKQorc3RkaW46CisJZWNobyAkXAorCSgoMSsyKSkKKwllY2hvICQoXAorCSgxKzIrMykpCisJZWNobyAkKChcCisJMSsyKzMrNCkpCisJZWNobyAkKCgxK1wKKwkyKzMrNCs1KSkKKwllY2hvICQoKDErMiszKzQrNSs2KVwKKwkpCitleHBlY3RlZC1zdGRvdXQ6CisJMworCTYKKwkxMAorCTE1CisJMjEKKy0tLQorbmFtZTogYmtzbC1ubC01CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGlzIGNvbGxhc3BlZCBpbiBkb3VibGUgcXVvdGVkIHN0cmluZ3MKK3N0ZGluOgorCWVjaG8gIlwKKwloaSIKKwllY2hvICJmb29cCisJYmFyIgorCWVjaG8gImZvbGtzXAorCSIKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCWZvb2JhcgorCWZvbGtzCistLS0KK25hbWU6IGJrc2wtbmwtNgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBjb2xsYXNwZWQgaW4gaGVyZSBkb2N1bWVudCBkZWxpbWl0ZXJzCisJKGtzaDkzIGZhaWxzIHNlY29uZCBwYXJ0IG9mIHRoaXMpCitzdGRpbjoKKwlhPTEyCisJY2F0IDw8IEVPXAorCUYKKwlhPSRhCisJZm9vXAorCWJhcgorCUVPRgorCWNhdCA8PCBFX09fRgorCWZvbworCUVfT19cCisJRgorCWVjaG8gZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCWE9MTIKKwlmb29iYXIKKwlmb28KKwlkb25lCistLS0KK25hbWU6IGJrc2wtbmwtNworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBjb2xsYXNwZWQgaW4gZG91YmxlLXF1b3RlZCBoZXJlLWRvY3VtZW50CisJZGVsaW1pdGVyLgorc3RkaW46CisJYT0xMgorCWNhdCA8PCAiRU9cCisJRiIKKwlhPSRhCisJZm9vXAorCWJhcgorCUVPRgorCWVjaG8gZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCWE9JGEKKwlmb29cCisJYmFyCisJZG9uZQorLS0tCituYW1lOiBia3NsLW5sLTgKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgY29sbGFzcGVkIGluIHZhcmlvdXMgMisgY2hhcmFjdGVyIHRva2VucworCWRlbGltaXRlci4KKwkoa3NoOTMgZmFpbHMgdGhpcykKK3N0ZGluOgorCWVjaG8gaGkgJlwKKwkmIGVjaG8gdGhlcmUKKwllY2hvIGZvbyB8XAorCXwgZWNobyBiYXIKKwljYXQgPFwKKwk8IEVPRgorCXN0dWZmCisJRU9GCisJY2F0IDxcCisJPFwKKwktIEVPRgorCQltb3JlIHN0dWZmCisJRU9GCisJY2F0IDw8XAorCUVPRgorCWFiY2RlZgorCUVPRgorCWVjaG8gaGkgPlwKKwk+IC9kZXYvbnVsbAorCWVjaG8gJD8KKwlpPTEKKwljYXNlICRpIGluCisJKFwKKwl4fFwKKwkxXAorCSkgZWNobyBoaTtcCisJOworCSgqKSBlY2hvIG9vcHMKKwllc2FjCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwl0aGVyZQorCWZvbworCXN0dWZmCisJbW9yZSBzdHVmZgorCWFiY2RlZgorCTAKKwloaQorLS0tCituYW1lOiBia3NsLW5sLTkKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgXCBhdCB0aGUgZW5kIG9mIGFuIGFsaWFzIGlzIGNvbGxhcHNlZCB3aGVuIGZvbGxvd2VkCisJYnkgYSBuZXdsaW5lCisJKGRvbid0IGtub3cgd2hhdCBQT1NJWCBoYXMgdG8gc2F5IGFib3V0IHRoaXMpCitzdGRpbjoKKwlhbGlhcyB4PSdlY2hvIGhpXCcKKwl4CisJZWNobyB0aGVyZQorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpZWNobyB0aGVyZQorLS0tCituYW1lOiBia3NsLW5sLTEwCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGluIGEga2V5d29yZCBpcyBjb2xsYXBzZWQKK3N0ZGluOgorCWlcCisJZiB0cnVlOyB0aGVuXAorCSBlY2hvIHBhc3M7IGVsXAorCXNlIGVjaG8gZmFpbDsgZmkKK2V4cGVjdGVkLXN0ZG91dDoKKwlwYXNzCistLS0KKyMKKyMgUGxhY2VzIFxuZXdsaW5lIHNob3VsZCBiZSBjb2xsYXBzZWQgKGtzaCBleHRlbnNpb25zKQorIworbmFtZTogYmtzbC1ubC1rc2gtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBjb2xsYXBzZWQgaW4gZXh0ZW5kZWQgZ2xvYmJpbmcKKwkoa3NoOTMgZmFpbHMgdGhpcykKK3N0ZGluOgorCXh4eD1mb28KKwljYXNlICR4eHggaW4KKwkoZipcCisJKFwKKwlvXAorCSlcCisJKSBlY2hvIG9rIDs7CisJKikgZWNobyBiYWQKKwllc2FjCitleHBlY3RlZC1zdGRvdXQ6CisJb2sKKy0tLQorbmFtZTogYmtzbC1ubC1rc2gtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcbmV3bGluZSBpcyBjb2xsYXBzZWQgaW4gKCguLi4pKSBleHByZXNzaW9ucworCShrc2g5MyBmYWlscyB0aGlzKQorc3RkaW46CisJaT0xCisJKFwKKwkoXAorCWk9aSsyXAorCSlcCisJKQorCWVjaG8gJGkKK2V4cGVjdGVkLXN0ZG91dDoKKwkzCistLS0KK25hbWU6IGJyZWFrLTEKK2Rlc2NyaXB0aW9uOgorCVNlZSBpZiBicmVhayBicmVha3Mgb3V0IG9mIGxvb3BzCitzdGRpbjoKKwlmb3IgaSBpbiBhIGIgYzsgZG8gZWNobyAkaTsgYnJlYWs7IGVjaG8gYmFkLSRpOyBkb25lCisJZWNobyBlbmQtMQorCWZvciBpIGluIGEgYiBjOyBkbyBlY2hvICRpOyBicmVhayAxOyBlY2hvIGJhZC0kaTsgZG9uZQorCWVjaG8gZW5kLTIKKwlmb3IgaSBpbiBhIGIgYzsgZG8KKwkgICAgZm9yIGogaW4geCB5IHo7IGRvCisJCWVjaG8gJGk6JGoKKwkJYnJlYWsKKwkJZWNobyBiYWQtJGkKKwkgICAgZG9uZQorCSAgICBlY2hvIGVuZC0kaQorCWRvbmUKKwllY2hvIGVuZC0zCitleHBlY3RlZC1zdGRvdXQ6CisJYQorCWVuZC0xCisJYQorCWVuZC0yCisJYTp4CisJZW5kLWEKKwliOngKKwllbmQtYgorCWM6eAorCWVuZC1jCisJZW5kLTMKKy0tLQorbmFtZTogYnJlYWstMgorZGVzY3JpcHRpb246CisJU2VlIGlmIGJyZWFrIGJyZWFrcyBvdXQgb2YgbmVzdGVkIGxvb3BzCitzdGRpbjoKKwlmb3IgaSBpbiBhIGIgYzsgZG8KKwkgICAgZm9yIGogaW4geCB5IHo7IGRvCisJCWVjaG8gJGk6JGoKKwkJYnJlYWsgMgorCQllY2hvIGJhZC0kaQorCSAgICBkb25lCisJICAgIGVjaG8gZW5kLSRpCisJZG9uZQorCWVjaG8gZW5kCitleHBlY3RlZC1zdGRvdXQ6CisJYTp4CisJZW5kCistLS0KK25hbWU6IGJyZWFrLTMKK2Rlc2NyaXB0aW9uOgorCVdoYXQgaWYgYnJlYWsgdXNlZCBvdXRzaWRlIG9mIGFueSBsb29wcworCShrc2g4OCxrc2g5MyBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlcyBoZXJlKQorc3RkaW46CisJYnJlYWsKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8uKmJyZWFrLiovCistLS0KK25hbWU6IGJyZWFrLTQKK2Rlc2NyaXB0aW9uOgorCVdoYXQgaWYgYnJlYWsgTiB1c2VkIHdoZW4gb25seSBOLTEgbG9vcHMKKwkoa3NoODgsa3NoOTMgZG9uJ3QgcHJpbnQgZXJyb3IgbWVzc2FnZXMgaGVyZSkKK3N0ZGluOgorCWZvciBpIGluIGEgYiBjOyBkbyBlY2hvICRpOyBicmVhayAyOyBlY2hvIGJhZC0kaTsgZG9uZQorCWVjaG8gZW5kCitleHBlY3RlZC1zdGRvdXQ6CisJYQorCWVuZAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLy4qYnJlYWsuKi8KKy0tLQorbmFtZTogYnJlYWstNQorZGVzY3JpcHRpb246CisJRXJyb3IgaWYgYnJlYWsgYXJndW1lbnQgaXNuJ3QgYSBudW1iZXIKK3N0ZGluOgorCWZvciBpIGluIGEgYiBjOyBkbyBlY2hvICRpOyBicmVhayBhYmM7IGVjaG8gbW9yZS0kaTsgZG9uZQorCWVjaG8gZW5kCitleHBlY3RlZC1zdGRvdXQ6CisJYQorZXhwZWN0ZWQtZXhpdDogZSAhPSAwCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvLipicmVhay4qLworLS0tCituYW1lOiBjb250aW51ZS0xCitkZXNjcmlwdGlvbjoKKwlTZWUgaWYgY29udGludWUgY29udGludWVzIGxvb3BzCitzdGRpbjoKKwlmb3IgaSBpbiBhIGIgYzsgZG8gZWNobyAkaTsgY29udGludWU7IGVjaG8gYmFkLSRpIDsgZG9uZQorCWVjaG8gZW5kLTEKKwlmb3IgaSBpbiBhIGIgYzsgZG8gZWNobyAkaTsgY29udGludWUgMTsgZWNobyBiYWQtJGk7IGRvbmUKKwllY2hvIGVuZC0yCisJZm9yIGkgaW4gYSBiIGM7IGRvCisJICAgIGZvciBqIGluIHggeSB6OyBkbworCQllY2hvICRpOiRqCisJCWNvbnRpbnVlCisJCWVjaG8gYmFkLSRpLSRqCisJICAgIGRvbmUKKwkgICAgZWNobyBlbmQtJGkKKwlkb25lCisJZWNobyBlbmQtMworZXhwZWN0ZWQtc3Rkb3V0OgorCWEKKwliCisJYworCWVuZC0xCisJYQorCWIKKwljCisJZW5kLTIKKwlhOngKKwlhOnkKKwlhOnoKKwllbmQtYQorCWI6eAorCWI6eQorCWI6egorCWVuZC1iCisJYzp4CisJYzp5CisJYzp6CisJZW5kLWMKKwllbmQtMworLS0tCituYW1lOiBjb250aW51ZS0yCitkZXNjcmlwdGlvbjoKKwlTZWUgaWYgY29udGludWUgYnJlYWtzIG91dCBvZiBuZXN0ZWQgbG9vcHMKK3N0ZGluOgorCWZvciBpIGluIGEgYiBjOyBkbworCSAgICBmb3IgaiBpbiB4IHkgejsgZG8KKwkJZWNobyAkaTokagorCQljb250aW51ZSAyCisJCWVjaG8gYmFkLSRpLSRqCisJICAgIGRvbmUKKwkgICAgZWNobyBlbmQtJGkKKwlkb25lCisJZWNobyBlbmQKK2V4cGVjdGVkLXN0ZG91dDoKKwlhOngKKwliOngKKwljOngKKwllbmQKKy0tLQorbmFtZTogY29udGludWUtMworZGVzY3JpcHRpb246CisJV2hhdCBpZiBjb250aW51ZSB1c2VkIG91dHNpZGUgb2YgYW55IGxvb3BzCisJKGtzaDg4LGtzaDkzIGRvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGhlcmUpCitzdGRpbjoKKwljb250aW51ZQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLy4qY29udGludWUuKi8KKy0tLQorbmFtZTogY29udGludWUtNAorZGVzY3JpcHRpb246CisJV2hhdCBpZiBjb250aW51ZSBOIHVzZWQgd2hlbiBvbmx5IE4tMSBsb29wcworCShrc2g4OCxrc2g5MyBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlcyBoZXJlKQorc3RkaW46CisJZm9yIGkgaW4gYSBiIGM7IGRvIGVjaG8gJGk7IGNvbnRpbnVlIDI7IGVjaG8gYmFkLSRpOyBkb25lCisJZWNobyBlbmQKK2V4cGVjdGVkLXN0ZG91dDoKKwlhCisJYgorCWMKKwllbmQKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8uKmNvbnRpbnVlLiovCistLS0KK25hbWU6IGNvbnRpbnVlLTUKK2Rlc2NyaXB0aW9uOgorCUVycm9yIGlmIGNvbnRpbnVlIGFyZ3VtZW50IGlzbid0IGEgbnVtYmVyCitzdGRpbjoKKwlmb3IgaSBpbiBhIGIgYzsgZG8gZWNobyAkaTsgY29udGludWUgYWJjOyBlY2hvIG1vcmUtJGk7IGRvbmUKKwllY2hvIGVuZAorZXhwZWN0ZWQtc3Rkb3V0OgorCWEKK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLy4qY29udGludWUuKi8KKy0tLQorbmFtZTogY2QtaGlzdG9yeQorZGVzY3JpcHRpb246CisJVGVzdCBzb21lb25lJ3MgQ0QgaGlzdG9yeSBwYWNrYWdlICh1c2VzIGFycmF5cykKK3N0ZGluOgorCSMgZ28gdG8ga25vd24gcGxhY2UgYmVmb3JlIGRvaW5nIGFueXRoaW5nCisJY2QgLworCQorCWFsaWFzIGNkPV9jZAorCWZ1bmN0aW9uIF9jZAorCXsKKwkJdHlwZXNldCAtaSBjZGxlbiBpCisJCXR5cGVzZXQgdAorCQorCQlpZiBbICQjIC1lcSAwIF0KKwkJdGhlbgorCQkJc2V0IC0tICRIT01FCisJCWZpCisJCisJCWlmIFsgIiRDREhJU1RGSUxFIiAtYSAtciAiJENESElTVEZJTEUiIF0gIyBpZiBkaXJlY3RvcnkgaGlzdG9yeSBleGlzdHMKKwkJdGhlbgorCQkJdHlwZXNldCBDREhJU1QKKwkJCWk9LTEKKwkJCXdoaWxlIHJlYWQgLXIgdAkJCSMgcmVhZCBkaXJlY3RvcnkgaGlzdG9yeSBmaWxlCisJCQlkbworCQkJCUNESElTVFtpPWkrMV09JHQKKwkJCWRvbmUgPCRDREhJU1RGSUxFCisJCWZpCisJCisJCWlmIFsgIiR7Q0RISVNUWzBdfSIgIT0gIiRQV0QiIC1hICIkUFdEIiAhPSAiIiBdCisJCXRoZW4KKwkJCV9jZGlucwkJCQkjIGluc2VydCAkUFdEIGludG8gY2QgaGlzdG9yeQorCQlmaQorCQorCQljZGxlbj0keyNDREhJU1RbKl19CQkJIyBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGlzdG9yeQorCQorCQljYXNlICIkQCIgaW4KKwkJLSkJCQkJCSMgY2QgdG8gbmV3IGRpcgorCQkJaWYgWyAiJE9MRFBXRCIgPSAiIiBdICYmICgoY2RsZW4+MSkpCisJCQl0aGVuCisJCQkJJ3ByaW50JyAke0NESElTVFsxXX0KKwkJCQknY2QnICR7Q0RISVNUWzFdfQorCQkJCV9wd2QKKwkJCWVsc2UKKwkJCQknY2QnICRACisJCQkJX3B3ZAorCQkJZmkKKwkJCTs7CisJCS1sKQkJCQkJIyBwcmludCBkaXJlY3RvcnkgbGlzdAorCQkJdHlwZXNldCAtUjMgbnVtCisJCQkoKGk9Y2RsZW4pKQorCQkJd2hpbGUgKCgoaT1pLTEpPj0wKSkKKwkJCWRvCisJCQkJbnVtPSRpCisJCQkJJ3ByaW50JyAiJG51bSAke0NESElTVFtpXX0iCisJCQlkb25lCisJCQlyZXR1cm4KKwkJCTs7CisJCS1bMC05XXwtWzAtOV1bMC05XSkJCQkjIGNkIHRvIGRpciBpbiBsaXN0CisJCQlpZiAoKChpPSR7MSMtfSk8Y2RsZW4pKQorCQkJdGhlbgorCQkJCSdwcmludCcgJHtDREhJU1RbaV19CisJCQkJJ2NkJyAke0NESElTVFtpXX0KKwkJCQlfcHdkCisJCQllbHNlCisJCQkJJ2NkJyAkQAorCQkJCV9wd2QKKwkJCWZpCisJCQk7OworCQktKikJCQkJCSMgY2QgdG8gbWF0Y2hlZCBkaXIgaW4gbGlzdAorCQkJdD0kezEjLX0KKwkJCWk9MQorCQkJd2hpbGUgKChpPGNkbGVuKSkKKwkJCWRvCisJCQkJY2FzZSAke0NESElTVFtpXX0gaW4KKwkJCQkqJHQqKQorCQkJCQkncHJpbnQnICR7Q0RISVNUW2ldfQorCQkJCQknY2QnICR7Q0RISVNUW2ldfQorCQkJCQlfcHdkCisJCQkJCWJyZWFrCisJCQkJCTs7CisJCQkJZXNhYworCQkJCSgoaT1pKzEpKQorCQkJZG9uZQorCQkJaWYgKChpPj1jZGxlbikpCisJCQl0aGVuCisJCQkJJ2NkJyAkQAorCQkJCV9wd2QKKwkJCWZpCisJCQk7OworCQkqKQkJCQkJIyBjZCB0byBuZXcgZGlyCisJCQknY2QnICRACisJCQlfcHdkCisJCQk7OworCQllc2FjCisJCisJCV9jZGlucwkJCQkJIyBpbnNlcnQgJFBXRCBpbnRvIGNkIGhpc3RvcnkKKwkKKwkJaWYgWyAiJENESElTVEZJTEUiIF0KKwkJdGhlbgorCQkJY2RsZW49JHsjQ0RISVNUWypdfQkJIyBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGlzdG9yeQorCQorCQkJaT0wCisJCQl3aGlsZSAoKGk8Y2RsZW4pKQorCQkJZG8KKwkJCQkncHJpbnQnIC1yICR7Q0RISVNUW2ldfQkjIHVwZGF0ZSBkaXJlY3RvcnkgaGlzdG9yeQorCQkJCSgoaT1pKzEpKQorCQkJZG9uZSA+JENESElTVEZJTEUKKwkJZmkKKwl9CisJCisJZnVuY3Rpb24gX2NkaW5zCQkJCQkjIGluc2VydCAkUFdEIGludG8gY2QgaGlzdG9yeQorCXsJCQkJCQkjIG1lYW50IHRvIGJlIGNhbGxlZCBvbmx5IGJ5IF9jZAorCQl0eXBlc2V0IC1pIGkKKwkKKwkJKChpPTApKQorCQl3aGlsZSAoKGk8JHsjQ0RISVNUWypdfSkpCQkjIHNlZSBpZiBkaXIgaXMgYWxyZWFkeSBpbiBsaXN0CisJCWRvCisJCQlpZiBbICIke0NESElTVFskaV19IiA9ICIkUFdEIiBdCisJCQl0aGVuCisJCQkJYnJlYWsKKwkJCWZpCisJCQkoKGk9aSsxKSkKKwkJZG9uZQorCQorCQlpZiAoKGk+MjIpKQkJCQkjIGxpbWl0IG1heCBzaXplIG9mIGxpc3QKKwkJdGhlbgorCQkJaT0yMgorCQlmaQorCQorCQl3aGlsZSAoKChpPWktMSk+PTApKQkJCSMgYnVtcCBvbGQgZGlycyBpbiBsaXN0CisJCWRvCisJCQlDREhJU1RbaSsxXT0ke0NESElTVFtpXX0KKwkJZG9uZQorCQorCQlDREhJU1RbMF09JFBXRAkJCQkjIGluc2VydCBuZXcgZGlyZWN0b3J5IGluIGxpc3QKKwl9CisJCisJCisJZnVuY3Rpb24gX3B3ZAorCXsKKwkJaWYgWyAtbiAiJEVDRCIgXQorCQl0aGVuCisJCQlwd2QgMT4mNgorCQlmaQorCX0KKwkjIFN0YXJ0IG9mIHRlc3QKKwljZCAvdG1wCisJY2QgL2JpbgorCWNkIC9ldGMKKwljZCAtCisJY2QgLTIKKwljZCAtbAorZXhwZWN0ZWQtc3Rkb3V0OgorCS9iaW4KKwkvdG1wCisJICAzIC8KKwkgIDIgL2V0YworCSAgMSAvYmluCisJICAwIC90bXAKKy0tLQorbmFtZTogZW52LXByb21wdAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBwcm9tcHQgbm90IHByaW50ZWQgd2hlbiBwcm9jZXNzaW5nIEVOVgorZW52LXNldHVwOiAhRU5WPS4vZm9vIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgImZvbyIKKwlYWFg9XworCVBTMT1YCisJZmFsc2UgJiYgZWNobyBobW1tCithcmd1bWVudHM6ICEtaSEKK3N0ZGluOgorCWVjaG8gaGkke1hYWH10aGVyZQorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpX3RoZXJlCitleHBlY3RlZC1zdGRlcnI6ICEKKwlYWAorLS0tCituYW1lOiBleHBhbmQtdWdseQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB3ZWlyZCAke2ZvbytiYXJ9IGNvbnN0cnVjdHMgYXJlIHBhcnNlZCBjb3JyZWN0bHkKK3N0ZGluOgorCShlY2hvIDEgJHtJRlMrJ30nen0pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMQorCShlY2hvIDIgIiR7SUZTKyd9J3p9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyCisJKGVjaG8gMyAiZm9vICR7SUZTKydiYXJ9IGJheiIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMworCShlY2hvIC1uICc0ICc7IHByaW50ZiAnJXNcbicgImZvbyAke0lGUysiYiAgIGMifSBiYXoiKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDQKKwkoZWNobyAtbiAnNSAnOyBwcmludGYgJyVzXG4nICJmb28gJHtJRlMrYiAgIGN9IGJheiIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gNQorCShlY2hvIDYgJHtJRlMrIn0ien0pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gNgorCShlY2hvIDcgIiR7SUZTKyJ9Inp9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiA3CisJKGVjaG8gOCAiJHtJRlMrXCJ9XCJ6fSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gOAorCShlY2hvIDkgIiR7SUZTK1wiXH1cInp9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiA5CisJKGVjaG8gMTAgZm9vICR7SUZTKydiYXJ9IGJheid9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDEwCisJKGVjaG8gMTEgIiQoZWNobyAiJHtJRlMrJ30nen0iKSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTEKKwkoZWNobyAxMiAiJChlY2hvICR7SUZTKyd9J3p9KSIpIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMTIKKwkoZWNobyAxMyAke0lGUytcfXp9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDEzCisJKGVjaG8gMTQgIiR7SUZTK1x9en0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDE0CisJdT14OyAoZWNobyAtbiAnMTUgJzsgcHJpbnRmICc8JXM+ICcgImZvbyAke0lGUythImIkdXsgeyJ7e1x9Yn0gYyAke0lGUytke319IGJhciIgJHtJRlMtZXt9fSBiYXo7IGVjaG8gLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxNQorCWw9dDsgKGVjaG8gMTYgJHtJRlMraGBlY2hvIC1uIGkgJHtJRlMrJGx9aGBlcmV9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDE2CisJbD10OyAoZWNobyAxNyAke0lGUytoJChlY2hvIC1uIGkgJHtJRlMrJGx9aCllcmV9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDE3CisJbD10OyAoZWNobyAxOCAiJHtJRlMraGBlY2hvIC1uIGkgJHtJRlMrJGx9aGBlcmV9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAxOAorCWw9dDsgKGVjaG8gMTkgIiR7SUZTK2gkKGVjaG8gLW4gaSAke0lGUyskbH1oKWVyZX0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDE5CisJbD10OyAoZWNobyAyMCAke0lGUytoYGVjaG8gLW4gaSAiJHtJRlMrJGx9ImhgZXJlfSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyMAorCWw9dDsgKGVjaG8gMjEgJHtJRlMraCQoZWNobyAtbiBpICIke0lGUyskbH0iaCllcmV9KSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDIxCisJbD10OyAoZWNobyAyMiAiJHtJRlMraGBlY2hvIC1uIGkgIiR7SUZTKyRsfSJoYGVyZX0iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDIyCisJbD10OyAoZWNobyAyMyAiJHtJRlMraCQoZWNobyAtbiBpICIke0lGUyskbH0iaCllcmV9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyMworCWtleT12YWx1ZTsgKGVjaG8gLW4gJzI0ICc7IHByaW50ZiAnJXNcbicgIiR7SUZTKycka2V5J30iKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDI0CisJa2V5PXZhbHVlOyAoZWNobyAtbiAnMjUgJzsgcHJpbnRmICclc1xuJyAiJHtJRlMrIicka2V5JyJ9IikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyNQkjIGtzaDkzOiDigJwnJGtleSfigJ0KKwlrZXk9dmFsdWU7IChlY2hvIC1uICcyNiAnOyBwcmludGYgJyVzXG4nICR7SUZTKycka2V5J30pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMjYKKwlrZXk9dmFsdWU7IChlY2hvIC1uICcyNyAnOyBwcmludGYgJyVzXG4nICR7SUZTKyInJGtleScifSkgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAyNworCShlY2hvIC1uICcyOCAnOyBwcmludGYgJyVzXG4nICIke0lGUysiJyJ4IH4geCd9J3giJ30ieH0iICMnKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDI4CisJdT14OyAoZWNobyAtbiAnMjkgJzsgcHJpbnRmICc8JXM+ICcgZm9vICR7SUZTK2EiYiR1eyB7Insge1x9Yn0gYyAke0lGUytke319IGJhciAke0lGUy1le319IGJhejsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDI5CisJKGVjaG8gLW4gJzMwICc7IHByaW50ZiAnPCVzPiAnICR7SUZTK2ZvbyAnYlwKKwlhcicgYmF6fTsgZWNobyAuKSAyPiYtIHx8IChlY2hvIGZhaWxlZCBpbiAzMDsgZWNobyBmYWlsZWQgaW4gMzEpCisJKGVjaG8gLW4gJzMyICc7IHByaW50ZiAnPCVzPiAnICR7SUZTK2ZvbyAiYlwKKwlhciIgYmF6fTsgZWNobyAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDMyCisJKGVjaG8gLW4gJzMzICc7IHByaW50ZiAnPCVzPiAnICIke0lGUytmb28gJ2JcCisJYXInIGJhen0iOyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMzMKKwkoZWNobyAtbiAnMzQgJzsgcHJpbnRmICc8JXM+ICcgIiR7SUZTK2ZvbyAiYlwKKwlhciIgYmF6fSI7IGVjaG8gLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzNAorCShlY2hvIC1uICczNSAnOyBwcmludGYgJzwlcz4gJyAke3Y9YVwgYn0geCAke3Y9Y1wgZH07IGVjaG8gLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiAzNQorCShlY2hvIC1uICczNiAnOyBwcmludGYgJzwlcz4gJyAiJHt2PWFcIGJ9IiB4ICIke3Y9Y1wgZH0iOyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMzYKKwkoZWNobyAtbiAnMzcgJzsgcHJpbnRmICc8JXM+ICcgJHt2LWFcIGJ9IHggJHt2LWNcIGR9OyBlY2hvIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMzcKKwkoZWNobyAzOCAke0lGUyt4J2EneX0gLyAiJHtJRlMreCdhJ3l9IiAuKSAyPiYtIHx8IGVjaG8gZmFpbGVkIGluIDM4CisJZm9vPSJ4J2EneSI7IChlY2hvIDM5ICR7Zm9vJSonYScqfSAvICIke2ZvbyUqJ2EnKn0iIC4pIDI+Ji0gfHwgZWNobyBmYWlsZWQgaW4gMzkKKwlmb289ImEgYiBjIjsgKGVjaG8gLW4gJzQwICc7IHByaW50ZiAnPCVzPiAnICIke2ZvbyNhfSI7IGVjaG8gLikgMj4mLSB8fCBlY2hvIGZhaWxlZCBpbiA0MAorZXhwZWN0ZWQtc3Rkb3V0OgorCTEgfXoKKwkyICcnen0KKwkzIGZvbyAnYmFyIGJhegorCTQgZm9vIGIgICBjIGJhegorCTUgZm9vIGIgICBjIGJhegorCTYgfXoKKwk3IH16CisJOCAiInp9CisJOSAifSJ6CisJMTAgZm9vIGJhcn0gYmF6CisJMTEgJyd6fQorCTEyIH16CisJMTMgfXoKKwkxNCB9egorCTE1IDxmb28gYWJ4eyB7e3t9YiBjIGR7fSBiYXI+IDx9PiA8YmF6PiAuCisJMTYgaGkgdGhlcmUKKwkxNyBoaSB0aGVyZQorCTE4IGhpIHRoZXJlCisJMTkgaGkgdGhlcmUKKwkyMCBoaSB0aGVyZQorCTIxIGhpIHRoZXJlCisJMjIgaGkgdGhlcmUKKwkyMyBoaSB0aGVyZQorCTI0ICd2YWx1ZScKKwkyNSAndmFsdWUnCisJMjYgJGtleQorCTI3ICd2YWx1ZScKKwkyOCAneCB+IHgnJ3h9Inh9IiAjCisJMjkgPGZvbz4gPGFieHsge3s+IDx7fWI+IDxjPiA8ZHt9PiA8YmFyPiA8fT4gPGJhej4gLgorCTMwIDxmb28+IDxiXAorCWFyPiA8YmF6PiAuCisJMzIgPGZvbz4gPGJhcj4gPGJhej4gLgorCTMzIDxmb28gJ2JhcicgYmF6PiAuCisJMzQgPGZvbyBiYXIgYmF6PiAuCisJMzUgPGE+IDxiPiA8eD4gPGE+IDxiPiAuCisJMzYgPGFcIGI+IDx4PiA8YVwgYj4gLgorCTM3IDxhIGI+IDx4PiA8YyBkPiAuCisJMzggeGF5IC8geCdhJ3kgLgorCTM5IHgnIC8geCcgLgorCTQwIDwgYiBjPiAuCistLS0KK25hbWU6IGV4cGFuZC11bmdsb2ItZGJscQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCByZWd1bGFyICIke2ZvbytiYXJ9IiBjb25zdHJ1Y3RzIGFyZSBwYXJzZWQgY29ycmVjdGx5CitzdGRpbjoKKwl1PXgKKwl0bF9ub3JtKCkgeworCQl2PSQyCisJCXRlc3QgeCIkdiIgPSB4Ii0iICYmIHVuc2V0IHYKKwkJKGVjaG8gIiQxIHBsdXMgbm9ybSBmb28gJHt2KydiYXInfSBiYXoiKQorCQkoZWNobyAiJDEgZGFzaCBub3JtIGZvbyAke3YtJ2Jhcid9IGJheiIpCisJCShlY2hvICIkMSBlcWFsIG5vcm0gZm9vICR7dj0nYmFyJ30gYmF6IikKKwkJKGVjaG8gIiQxIHFzdG4gbm9ybSBmb28gJHt2PydiYXInfSBiYXoiKSAyPiYtIHx8IFwKKwkJICAgIGVjaG8gIiQxIHFzdG4gbm9ybSAtPiBlcnJvciIKKwkJKGVjaG8gIiQxIFBMVVMgbm9ybSBmb28gJHt2OisnYmFyJ30gYmF6IikKKwkJKGVjaG8gIiQxIERBU0ggbm9ybSBmb28gJHt2Oi0nYmFyJ30gYmF6IikKKwkJKGVjaG8gIiQxIEVRQUwgbm9ybSBmb28gJHt2Oj0nYmFyJ30gYmF6IikKKwkJKGVjaG8gIiQxIFFTVE4gbm9ybSBmb28gJHt2Oj8nYmFyJ30gYmF6IikgMj4mLSB8fCBcCisJCSAgICBlY2hvICIkMSBRU1ROIG5vcm0gLT4gZXJyb3IiCisJfQorCXRsX3BhcmVuKCkgeworCQl2PSQyCisJCXRlc3QgeCIkdiIgPSB4Ii0iICYmIHVuc2V0IHYKKwkJKGVjaG8gIiQxIHBsdXMgcGFybiBmb28gJHt2KyhiYXIpfSBiYXoiKQorCQkoZWNobyAiJDEgZGFzaCBwYXJuIGZvbyAke3YtKGJhcil9IGJheiIpCisJCShlY2hvICIkMSBlcWFsIHBhcm4gZm9vICR7dj0oYmFyKX0gYmF6IikKKwkJKGVjaG8gIiQxIHFzdG4gcGFybiBmb28gJHt2PyhiYXIpfSBiYXoiKSAyPiYtIHx8IFwKKwkJICAgIGVjaG8gIiQxIHFzdG4gcGFybiAtPiBlcnJvciIKKwkJKGVjaG8gIiQxIFBMVVMgcGFybiBmb28gJHt2OisoYmFyKX0gYmF6IikKKwkJKGVjaG8gIiQxIERBU0ggcGFybiBmb28gJHt2Oi0oYmFyKX0gYmF6IikKKwkJKGVjaG8gIiQxIEVRQUwgcGFybiBmb28gJHt2Oj0oYmFyKX0gYmF6IikKKwkJKGVjaG8gIiQxIFFTVE4gcGFybiBmb28gJHt2Oj8oYmFyKX0gYmF6IikgMj4mLSB8fCBcCisJCSAgICBlY2hvICIkMSBRU1ROIHBhcm4gLT4gZXJyb3IiCisJfQorCXRsX2JyYWNlKCkgeworCQl2PSQyCisJCXRlc3QgeCIkdiIgPSB4Ii0iICYmIHVuc2V0IHYKKwkJKGVjaG8gIiQxIHBsdXMgYnJhYyBmb28gJHt2K2EkdXt7e1x9Yn0gYyAke3YrZHt9fSBiYXoiKQorCQkoZWNobyAiJDEgZGFzaCBicmFjIGZvbyAke3YtYSR1e3t7XH1ifSBjICR7di1ke319IGJheiIpCisJCShlY2hvICIkMSBlcWFsIGJyYWMgZm9vICR7dj1hJHV7e3tcfWJ9IGMgJHt2PWR7fX0gYmF6IikKKwkJKGVjaG8gIiQxIHFzdG4gYnJhYyBmb28gJHt2P2EkdXt7e1x9Yn0gYyAke3Y/ZHt9fSBiYXoiKSAyPiYtIHx8IFwKKwkJICAgIGVjaG8gIiQxIHFzdG4gYnJhYyAtPiBlcnJvciIKKwkJKGVjaG8gIiQxIFBMVVMgYnJhYyBmb28gJHt2OithJHV7e3tcfWJ9IGMgJHt2Oitke319IGJheiIpCisJCShlY2hvICIkMSBEQVNIIGJyYWMgZm9vICR7djotYSR1e3t7XH1ifSBjICR7djotZHt9fSBiYXoiKQorCQkoZWNobyAiJDEgRVFBTCBicmFjIGZvbyAke3Y6PWEkdXt7e1x9Yn0gYyAke3Y6PWR7fX0gYmF6IikKKwkJKGVjaG8gIiQxIFFTVE4gYnJhYyBmb28gJHt2Oj9hJHV7e3tcfWJ9IGMgJHt2Oj9ke319IGJheiIpIDI+Ji0gfHwgXAorCQkgICAgZWNobyAiJDEgUVNUTiBicmFjIC0+IGVycm9yIgorCX0KKwl0bF9ub3JtIDEgLQorCXRsX25vcm0gMiAnJworCXRsX25vcm0gMyB4CisJdGxfcGFyZW4gNCAtCisJdGxfcGFyZW4gNSAnJworCXRsX3BhcmVuIDYgeAorCXRsX2JyYWNlIDcgLQorCXRsX2JyYWNlIDggJycKKwl0bF9icmFjZSA5IHgKK2V4cGVjdGVkLXN0ZG91dDoKKwkxIHBsdXMgbm9ybSBmb28gIGJhegorCTEgZGFzaCBub3JtIGZvbyAnYmFyJyBiYXoKKwkxIGVxYWwgbm9ybSBmb28gJ2JhcicgYmF6CisJMSBxc3RuIG5vcm0gLT4gZXJyb3IKKwkxIFBMVVMgbm9ybSBmb28gIGJhegorCTEgREFTSCBub3JtIGZvbyAnYmFyJyBiYXoKKwkxIEVRQUwgbm9ybSBmb28gJ2JhcicgYmF6CisJMSBRU1ROIG5vcm0gLT4gZXJyb3IKKwkyIHBsdXMgbm9ybSBmb28gJ2JhcicgYmF6CisJMiBkYXNoIG5vcm0gZm9vICBiYXoKKwkyIGVxYWwgbm9ybSBmb28gIGJhegorCTIgcXN0biBub3JtIGZvbyAgYmF6CisJMiBQTFVTIG5vcm0gZm9vICBiYXoKKwkyIERBU0ggbm9ybSBmb28gJ2JhcicgYmF6CisJMiBFUUFMIG5vcm0gZm9vICdiYXInIGJhegorCTIgUVNUTiBub3JtIC0+IGVycm9yCisJMyBwbHVzIG5vcm0gZm9vICdiYXInIGJhegorCTMgZGFzaCBub3JtIGZvbyB4IGJhegorCTMgZXFhbCBub3JtIGZvbyB4IGJhegorCTMgcXN0biBub3JtIGZvbyB4IGJhegorCTMgUExVUyBub3JtIGZvbyAnYmFyJyBiYXoKKwkzIERBU0ggbm9ybSBmb28geCBiYXoKKwkzIEVRQUwgbm9ybSBmb28geCBiYXoKKwkzIFFTVE4gbm9ybSBmb28geCBiYXoKKwk0IHBsdXMgcGFybiBmb28gIGJhegorCTQgZGFzaCBwYXJuIGZvbyAoYmFyKSBiYXoKKwk0IGVxYWwgcGFybiBmb28gKGJhcikgYmF6CisJNCBxc3RuIHBhcm4gLT4gZXJyb3IKKwk0IFBMVVMgcGFybiBmb28gIGJhegorCTQgREFTSCBwYXJuIGZvbyAoYmFyKSBiYXoKKwk0IEVRQUwgcGFybiBmb28gKGJhcikgYmF6CisJNCBRU1ROIHBhcm4gLT4gZXJyb3IKKwk1IHBsdXMgcGFybiBmb28gKGJhcikgYmF6CisJNSBkYXNoIHBhcm4gZm9vICBiYXoKKwk1IGVxYWwgcGFybiBmb28gIGJhegorCTUgcXN0biBwYXJuIGZvbyAgYmF6CisJNSBQTFVTIHBhcm4gZm9vICBiYXoKKwk1IERBU0ggcGFybiBmb28gKGJhcikgYmF6CisJNSBFUUFMIHBhcm4gZm9vIChiYXIpIGJhegorCTUgUVNUTiBwYXJuIC0+IGVycm9yCisJNiBwbHVzIHBhcm4gZm9vIChiYXIpIGJhegorCTYgZGFzaCBwYXJuIGZvbyB4IGJhegorCTYgZXFhbCBwYXJuIGZvbyB4IGJhegorCTYgcXN0biBwYXJuIGZvbyB4IGJhegorCTYgUExVUyBwYXJuIGZvbyAoYmFyKSBiYXoKKwk2IERBU0ggcGFybiBmb28geCBiYXoKKwk2IEVRQUwgcGFybiBmb28geCBiYXoKKwk2IFFTVE4gcGFybiBmb28geCBiYXoKKwk3IHBsdXMgYnJhYyBmb28gIGMgfSBiYXoKKwk3IGRhc2ggYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKKwk3IGVxYWwgYnJhYyBmb28gYXh7e3t9YiBjIGF4e3t7fWJ9IGJhegorCTcgcXN0biBicmFjIC0+IGVycm9yCisJNyBQTFVTIGJyYWMgZm9vICBjIH0gYmF6CisJNyBEQVNIIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6CisJNyBFUUFMIGJyYWMgZm9vIGF4e3t7fWIgYyBheHt7e31ifSBiYXoKKwk3IFFTVE4gYnJhYyAtPiBlcnJvcgorCTggcGx1cyBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegorCTggZGFzaCBicmFjIGZvbyAgYyB9IGJhegorCTggZXFhbCBicmFjIGZvbyAgYyB9IGJhegorCTggcXN0biBicmFjIGZvbyAgYyB9IGJhegorCTggUExVUyBicmFjIGZvbyAgYyB9IGJhegorCTggREFTSCBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegorCTggRVFBTCBicmFjIGZvbyBheHt7e31iIGMgYXh7e3t9Yn0gYmF6CisJOCBRU1ROIGJyYWMgLT4gZXJyb3IKKwk5IHBsdXMgYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKKwk5IGRhc2ggYnJhYyBmb28geCBjIHh9IGJhegorCTkgZXFhbCBicmFjIGZvbyB4IGMgeH0gYmF6CisJOSBxc3RuIGJyYWMgZm9vIHggYyB4fSBiYXoKKwk5IFBMVVMgYnJhYyBmb28gYXh7e3t9YiBjIGR7fSBiYXoKKwk5IERBU0ggYnJhYyBmb28geCBjIHh9IGJhegorCTkgRVFBTCBicmFjIGZvbyB4IGMgeH0gYmF6CisJOSBRU1ROIGJyYWMgZm9vIHggYyB4fSBiYXoKKy0tLQorbmFtZTogZXhwYW5kLXVuZ2xvYi11bnEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgcmVndWxhciAke2ZvbytiYXJ9IGNvbnN0cnVjdHMgYXJlIHBhcnNlZCBjb3JyZWN0bHkKK3N0ZGluOgorCXU9eAorCXRsX25vcm0oKSB7CisJCXY9JDIKKwkJdGVzdCB4IiR2IiA9IHgiLSIgJiYgdW5zZXQgdgorCQkoZWNobyAkMSBwbHVzIG5vcm0gZm9vICR7disnYmFyJ30gYmF6KQorCQkoZWNobyAkMSBkYXNoIG5vcm0gZm9vICR7di0nYmFyJ30gYmF6KQorCQkoZWNobyAkMSBlcWFsIG5vcm0gZm9vICR7dj0nYmFyJ30gYmF6KQorCQkoZWNobyAkMSBxc3RuIG5vcm0gZm9vICR7dj8nYmFyJ30gYmF6KSAyPiYtIHx8IFwKKwkJICAgIGVjaG8gIiQxIHFzdG4gbm9ybSAtPiBlcnJvciIKKwkJKGVjaG8gJDEgUExVUyBub3JtIGZvbyAke3Y6KydiYXInfSBiYXopCisJCShlY2hvICQxIERBU0ggbm9ybSBmb28gJHt2Oi0nYmFyJ30gYmF6KQorCQkoZWNobyAkMSBFUUFMIG5vcm0gZm9vICR7djo9J2Jhcid9IGJheikKKwkJKGVjaG8gJDEgUVNUTiBub3JtIGZvbyAke3Y6PydiYXInfSBiYXopIDI+Ji0gfHwgXAorCQkgICAgZWNobyAiJDEgUVNUTiBub3JtIC0+IGVycm9yIgorCX0KKwl0bF9wYXJlbigpIHsKKwkJdj0kMgorCQl0ZXN0IHgiJHYiID0geCItIiAmJiB1bnNldCB2CisJCShlY2hvICQxIHBsdXMgcGFybiBmb28gJHt2K1woYmFyJyknfSBiYXopCisJCShlY2hvICQxIGRhc2ggcGFybiBmb28gJHt2LVwoYmFyJyknfSBiYXopCisJCShlY2hvICQxIGVxYWwgcGFybiBmb28gJHt2PVwoYmFyJyknfSBiYXopCisJCShlY2hvICQxIHFzdG4gcGFybiBmb28gJHt2P1woYmFyJyknfSBiYXopIDI+Ji0gfHwgXAorCQkgICAgZWNobyAiJDEgcXN0biBwYXJuIC0+IGVycm9yIgorCQkoZWNobyAkMSBQTFVTIHBhcm4gZm9vICR7djorXChiYXInKSd9IGJheikKKwkJKGVjaG8gJDEgREFTSCBwYXJuIGZvbyAke3Y6LVwoYmFyJyknfSBiYXopCisJCShlY2hvICQxIEVRQUwgcGFybiBmb28gJHt2Oj1cKGJhcicpJ30gYmF6KQorCQkoZWNobyAkMSBRU1ROIHBhcm4gZm9vICR7djo/XChiYXInKSd9IGJheikgMj4mLSB8fCBcCisJCSAgICBlY2hvICIkMSBRU1ROIHBhcm4gLT4gZXJyb3IiCisJfQorCXRsX2JyYWNlKCkgeworCQl2PSQyCisJCXRlc3QgeCIkdiIgPSB4Ii0iICYmIHVuc2V0IHYKKwkJKGVjaG8gJDEgcGx1cyBicmFjIGZvbyAke3YrYSR1e3t7XH1ifSBjICR7ditke319IGJheikKKwkJKGVjaG8gJDEgZGFzaCBicmFjIGZvbyAke3YtYSR1e3t7XH1ifSBjICR7di1ke319IGJheikKKwkJKGVjaG8gJDEgZXFhbCBicmFjIGZvbyAke3Y9YSR1e3t7XH1ifSBjICR7dj1ke319IGJheikKKwkJKGVjaG8gJDEgcXN0biBicmFjIGZvbyAke3Y/YSR1e3t7XH1ifSBjICR7dj9ke319IGJheikgMj4mLSB8fCBcCisJCSAgICBlY2hvICIkMSBxc3RuIGJyYWMgLT4gZXJyb3IiCisJCShlY2hvICQxIFBMVVMgYnJhYyBmb28gJHt2OithJHV7e3tcfWJ9IGMgJHt2Oitke319IGJheikKKwkJKGVjaG8gJDEgREFTSCBicmFjIGZvbyAke3Y6LWEkdXt7e1x9Yn0gYyAke3Y6LWR7fX0gYmF6KQorCQkoZWNobyAkMSBFUUFMIGJyYWMgZm9vICR7djo9YSR1e3t7XH1ifSBjICR7djo9ZHt9fSBiYXopCisJCShlY2hvICQxIFFTVE4gYnJhYyBmb28gJHt2Oj9hJHV7e3tcfWJ9IGMgJHt2Oj9ke319IGJheikgMj4mLSB8fCBcCisJCSAgICBlY2hvICIkMSBRU1ROIGJyYWMgLT4gZXJyb3IiCisJfQorCXRsX25vcm0gMSAtCisJdGxfbm9ybSAyICcnCisJdGxfbm9ybSAzIHgKKwl0bF9wYXJlbiA0IC0KKwl0bF9wYXJlbiA1ICcnCisJdGxfcGFyZW4gNiB4CisJdGxfYnJhY2UgNyAtCisJdGxfYnJhY2UgOCAnJworCXRsX2JyYWNlIDkgeAorZXhwZWN0ZWQtc3Rkb3V0OgorCTEgcGx1cyBub3JtIGZvbyBiYXoKKwkxIGRhc2ggbm9ybSBmb28gYmFyIGJhegorCTEgZXFhbCBub3JtIGZvbyBiYXIgYmF6CisJMSBxc3RuIG5vcm0gLT4gZXJyb3IKKwkxIFBMVVMgbm9ybSBmb28gYmF6CisJMSBEQVNIIG5vcm0gZm9vIGJhciBiYXoKKwkxIEVRQUwgbm9ybSBmb28gYmFyIGJhegorCTEgUVNUTiBub3JtIC0+IGVycm9yCisJMiBwbHVzIG5vcm0gZm9vIGJhciBiYXoKKwkyIGRhc2ggbm9ybSBmb28gYmF6CisJMiBlcWFsIG5vcm0gZm9vIGJhegorCTIgcXN0biBub3JtIGZvbyBiYXoKKwkyIFBMVVMgbm9ybSBmb28gYmF6CisJMiBEQVNIIG5vcm0gZm9vIGJhciBiYXoKKwkyIEVRQUwgbm9ybSBmb28gYmFyIGJhegorCTIgUVNUTiBub3JtIC0+IGVycm9yCisJMyBwbHVzIG5vcm0gZm9vIGJhciBiYXoKKwkzIGRhc2ggbm9ybSBmb28geCBiYXoKKwkzIGVxYWwgbm9ybSBmb28geCBiYXoKKwkzIHFzdG4gbm9ybSBmb28geCBiYXoKKwkzIFBMVVMgbm9ybSBmb28gYmFyIGJhegorCTMgREFTSCBub3JtIGZvbyB4IGJhegorCTMgRVFBTCBub3JtIGZvbyB4IGJhegorCTMgUVNUTiBub3JtIGZvbyB4IGJhegorCTQgcGx1cyBwYXJuIGZvbyBiYXoKKwk0IGRhc2ggcGFybiBmb28gKGJhcikgYmF6CisJNCBlcWFsIHBhcm4gZm9vIChiYXIpIGJhegorCTQgcXN0biBwYXJuIC0+IGVycm9yCisJNCBQTFVTIHBhcm4gZm9vIGJhegorCTQgREFTSCBwYXJuIGZvbyAoYmFyKSBiYXoKKwk0IEVRQUwgcGFybiBmb28gKGJhcikgYmF6CisJNCBRU1ROIHBhcm4gLT4gZXJyb3IKKwk1IHBsdXMgcGFybiBmb28gKGJhcikgYmF6CisJNSBkYXNoIHBhcm4gZm9vIGJhegorCTUgZXFhbCBwYXJuIGZvbyBiYXoKKwk1IHFzdG4gcGFybiBmb28gYmF6CisJNSBQTFVTIHBhcm4gZm9vIGJhegorCTUgREFTSCBwYXJuIGZvbyAoYmFyKSBiYXoKKwk1IEVRQUwgcGFybiBmb28gKGJhcikgYmF6CisJNSBRU1ROIHBhcm4gLT4gZXJyb3IKKwk2IHBsdXMgcGFybiBmb28gKGJhcikgYmF6CisJNiBkYXNoIHBhcm4gZm9vIHggYmF6CisJNiBlcWFsIHBhcm4gZm9vIHggYmF6CisJNiBxc3RuIHBhcm4gZm9vIHggYmF6CisJNiBQTFVTIHBhcm4gZm9vIChiYXIpIGJhegorCTYgREFTSCBwYXJuIGZvbyB4IGJhegorCTYgRVFBTCBwYXJuIGZvbyB4IGJhegorCTYgUVNUTiBwYXJuIGZvbyB4IGJhegorCTcgcGx1cyBicmFjIGZvbyBjIH0gYmF6CisJNyBkYXNoIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6CisJNyBlcWFsIGJyYWMgZm9vIGF4e3t7fWIgYyBheHt7e31ifSBiYXoKKwk3IHFzdG4gYnJhYyAtPiBlcnJvcgorCTcgUExVUyBicmFjIGZvbyBjIH0gYmF6CisJNyBEQVNIIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6CisJNyBFUUFMIGJyYWMgZm9vIGF4e3t7fWIgYyBheHt7e31ifSBiYXoKKwk3IFFTVE4gYnJhYyAtPiBlcnJvcgorCTggcGx1cyBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegorCTggZGFzaCBicmFjIGZvbyBjIH0gYmF6CisJOCBlcWFsIGJyYWMgZm9vIGMgfSBiYXoKKwk4IHFzdG4gYnJhYyBmb28gYyB9IGJhegorCTggUExVUyBicmFjIGZvbyBjIH0gYmF6CisJOCBEQVNIIGJyYWMgZm9vIGF4e3t7fWIgYyBke30gYmF6CisJOCBFUUFMIGJyYWMgZm9vIGF4e3t7fWIgYyBheHt7e31ifSBiYXoKKwk4IFFTVE4gYnJhYyAtPiBlcnJvcgorCTkgcGx1cyBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegorCTkgZGFzaCBicmFjIGZvbyB4IGMgeH0gYmF6CisJOSBlcWFsIGJyYWMgZm9vIHggYyB4fSBiYXoKKwk5IHFzdG4gYnJhYyBmb28geCBjIHh9IGJhegorCTkgUExVUyBicmFjIGZvbyBheHt7e31iIGMgZHt9IGJhegorCTkgREFTSCBicmFjIGZvbyB4IGMgeH0gYmF6CisJOSBFUUFMIGJyYWMgZm9vIHggYyB4fSBiYXoKKwk5IFFTVE4gYnJhYyBmb28geCBjIHh9IGJhegorLS0tCituYW1lOiBlZ2xvYi1iYWQtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBnbG9iYmluZyBpc24ndCBkb25lIHdoZW4gZ2xvYiBoYXMgc3ludGF4IGVycm9yCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjeCIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmN6IgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImJiYyIKK3N0ZGluOgorCWVjaG8gIShbKikqCisJZWNobyArKGF8YlspKgorZXhwZWN0ZWQtc3Rkb3V0OgorCSEoWyopKgorCSsoYXxiWykqCistLS0KK25hbWU6IGVnbG9iLWJhZC0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGdsb2JiaW5nIGlzbid0IGRvbmUgd2hlbiBnbG9iIGhhcyBzeW50YXggZXJyb3IKKwkoQVQmVCBrc2ggZmFpbHMgdGhpcyB0ZXN0KQorZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiY3giCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjeiIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJiYmMiCitzdGRpbjoKKwllY2hvIFthKihdKil6CitleHBlY3RlZC1zdGRvdXQ6CisJW2EqKF0qKXoKKy0tLQorbmFtZTogZWdsb2ItaW5maW5pdGUtcGx1cworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBzaGVsbCBkb2Vzbid0IGdvIGludG8gaW5maW5pdGUgbG9vcCBleHBhbmRpbmcgKyguLi4pCisJZXhwcmVzc2lvbnMuCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjIgordGltZS1saW1pdDogMworc3RkaW46CisJZWNobyArKCljCisJZWNobyArKCl4CisJZWNobyArKCopYworCWVjaG8gKygqKXgKK2V4cGVjdGVkLXN0ZG91dDoKKwkrKCljCisJKygpeAorCWFiYworCSsoKil4CistLS0KK25hbWU6IGVnbG9iLXN1YnN0LTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgZWdsb2JiaW5nIGlzbid0IGRvbmUgb24gc3Vic3RpdHV0aW9uIHJlc3VsdHMKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmMiCitzdGRpbjoKKwl4PSdAKCopJworCWVjaG8gJHgKK2V4cGVjdGVkLXN0ZG91dDoKKwlAKCopCistLS0KK25hbWU6IGVnbG9iLW5vbWF0Y2gtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB0aGUgcGF0dGVybiBkb2Vzbid0IG1hdGNoCitzdGRpbjoKKwllY2hvIDE6IG5vLWZpbGUrKGF8YilzdHVmZgorCWVjaG8gMjogbm8tZmlsZSsoYSooYyl8YilzdHVmZgorCWVjaG8gMzogbm8tZmlsZSsoKCgoYykpKXxiKXN0dWZmCitleHBlY3RlZC1zdGRvdXQ6CisJMTogbm8tZmlsZSsoYXxiKXN0dWZmCisJMjogbm8tZmlsZSsoYSooYyl8YilzdHVmZgorCTM6IG5vLWZpbGUrKCgoKGMpKSl8YilzdHVmZgorLS0tCituYW1lOiBlZ2xvYi1tYXRjaC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHRoZSBwYXR0ZXJuIG1hdGNoZXMgY29ycmVjdGx5CitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWJkIgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImFjZCIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmFjIgorc3RkaW46CisJZWNobyAxOiBhKyhifGMpZAorCWVjaG8gMjogYSEoQChifEIpKWQKKwllY2hvIDM6ICooYShifGMpKQkJIyAoLi4ufC4uLikgY2FuIGJlIHVzZWQgd2l0aGluIFgoLi4pCisJZWNobyA0OiBhW2IqKGZvb3xiYXIpXWQJCSMgcGF0dGVybnMgbm90IHNwZWNpYWwgaW5zaWRlIFsuLi5dCitleHBlY3RlZC1zdGRvdXQ6CisJMTogYWJkIGFjZAorCTI6IGFjZAorCTM6IGFiYWMKKwk0OiBhYmQKKy0tLQorbmFtZTogZWdsb2ItY2FzZS0xCitkZXNjcmlwdGlvbjoKKwlTaW1wbGUgbmVnYXRpb24gdGVzdHMKK3N0ZGluOgorCWNhc2UgZm9vIGluICEoZm9vfGJhcikpIGVjaG8geWVzOzsgKikgZWNobyBubzs7IGVzYWMKKwljYXNlIGJhciBpbiAhKGZvb3xiYXIpKSBlY2hvIHllczs7ICopIGVjaG8gbm87OyBlc2FjCitleHBlY3RlZC1zdGRvdXQ6CisJbm8KKwlubworLS0tCituYW1lOiBlZ2xvYi1jYXNlLTIKK2Rlc2NyaXB0aW9uOgorCVNpbXBsZSBrbGVlbmUgdGVzdHMKK3N0ZGluOgorCWNhc2UgZm9vIGluICooYXxiWykpIGVjaG8geWVzOzsgKikgZWNobyBubzs7IGVzYWMKKwljYXNlIGZvbyBpbiAqKGF8YlspfGYqKSBlY2hvIHllczs7ICopIGVjaG8gbm87OyBlc2FjCisJY2FzZSAnKihhfGJbKScgaW4gKihhfGJbKSkgZWNobyB5ZXM7OyAqKSBlY2hvIG5vOzsgZXNhYworZXhwZWN0ZWQtc3Rkb3V0OgorCW5vCisJeWVzCisJeWVzCistLS0KK25hbWU6IGVnbG9iLXRyaW0tMQorZGVzY3JpcHRpb246CisJRWdsb2JiaW5nIGluIHRyaW0gZXhwcmVzc2lvbnMuLi4KKwkoQVQmVCBrc2ggZmFpbHMgdGhpcyAtIGRvY3Mgc2F5ICMgbWF0Y2hlcyBzaG9ydGVzdCBzdHJpbmcsICMjIG1hdGNoZXMKKwlsb25nZXN0Li4uKQorc3RkaW46CisJeD1hYmNkZWYKKwllY2hvIDE6ICR7eCNhfGFiY30KKwllY2hvIDI6ICR7eCMjYXxhYmN9CisJZWNobyAzOiAke3glZGVmfGZ9CisJZWNobyA0OiAke3glJWZ8ZGVmfQorZXhwZWN0ZWQtc3Rkb3V0OgorCTE6IGJjZGVmCisJMjogZGVmCisJMzogYWJjZGUKKwk0OiBhYmMKKy0tLQorbmFtZTogZWdsb2ItdHJpbS0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayBlZ2xvYmJpbmcgd29ya3MgaW4gdHJpbXMuLi4KK3N0ZGluOgorCXg9YWJjZGVmCisJZWNobyAxOiAke3gjKihhfGIpY2R9CisJZWNobyAyOiAiJHt4IyooYXxiKWNkfSIKKwllY2hvIDM6ICR7eCMiKihhfGIpY2QifQorCWVjaG8gNDogJHt4I2EoYnxjKX0KK2V4cGVjdGVkLXN0ZG91dDoKKwkxOiBlZgorCTI6IGVmCisJMzogYWJjZGVmCisJNDogY2RlZgorLS0tCituYW1lOiBlZ2xvYi1zdWJzdHJwbC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBlZ2xvYmJpbmcgd29ya3MgaW4gc3Vic3RzLi4uIGFuZCB0aGV5IHdvcmsgYXQgYWxsCitzdGRpbjoKKwlbWyAtbiAkQkFTSF9WRVJTSU9OIF1dICYmIHNob3B0IC1zIGV4dGdsb2IKKwl4PTEyMjIzMjFfYWIvY2RlX2IvY18xMjIxCisJeT14eXoKKwllY2hvIDE6ICR7eC8yfQorCWVjaG8gMjogJHt4Ly8yfQorCWVjaG8gMzogJHt4LysoMil9CisJZWNobyA0OiAke3gvLysoMil9CisJZWNobyA1OiAke3gvMi80fQorCWVjaG8gNjogJHt4Ly8yLzR9CisJZWNobyA3OiAke3gvKygyKS80fQorCWVjaG8gODogJHt4Ly8rKDIpLzR9CisJZWNobyA5OiAke3gvYi9jL2UvZn0KKwllY2hvIDEwOiAke3gvYlwvYy9lL2Z9CisJZWNobyAxMTogJHt4L2JcL2MvZVwvZn0KKwllY2hvIDEyOiAke3gvYlwvYy9lXFwvZn0KKwllY2hvIDEzOiAke3gvYlxcL2MvZVxcL2Z9CisJZWNobyAxNDogJHt4Ly9iL2MvZS9mfQorCWVjaG8gMTU6ICR7eC8vYlwvYy9lL2Z9CisJZWNobyAxNjogJHt4Ly9iXC9jL2VcL2Z9CisJZWNobyAxNzogJHt4Ly9iXC9jL2VcXC9mfQorCWVjaG8gMTg6ICR7eC8vYlxcL2MvZVxcL2Z9CisJZWNobyAxOTogJHt4L2JcLypcL2MveH0KKwllY2hvIDIwOiAke3gvXC8vLn0KKwllY2hvIDIxOiAke3gvL1wvLy59CisJZWNobyAyMjogJHt4Ly8vLn0KKwllY2hvIDIzOiAke3gvLyMxLzl9CisJZWNobyAyNDogJHt4Ly8lMS85fQorCWVjaG8gMjU6ICR7eC8vXCUxLzl9CisJZWNobyAyNjogJHt4Ly9cXCUxLzl9CisJZWNobyAyNzogJHt4Ly9cYS85fQorCWVjaG8gMjg6ICR7eC8vXFxhLzl9CisJZWNobyAyOTogJHt4LzIvJHl9CitleHBlY3RlZC1zdGRvdXQ6CisJMTogMTIyMzIxX2FiL2NkZV9iL2NfMTIyMQorCTI6IDEzMV9hYi9jZGVfYi9jXzExCisJMzogMTMyMV9hYi9jZGVfYi9jXzEyMjEKKwk0OiAxMzFfYWIvY2RlX2IvY18xMQorCTU6IDE0MjIzMjFfYWIvY2RlX2IvY18xMjIxCisJNjogMTQ0NDM0MV9hYi9jZGVfYi9jXzE0NDEKKwk3OiAxNDMyMV9hYi9jZGVfYi9jXzEyMjEKKwk4OiAxNDM0MV9hYi9jZGVfYi9jXzE0MQorCTk6IDEyMjIzMjFfYWMvZS9mL2NkZV9iL2NfMTIyMQorCTEwOiAxMjIyMzIxX2FlL2ZkZV9iL2NfMTIyMQorCTExOiAxMjIyMzIxX2FlL2ZkZV9iL2NfMTIyMQorCTEyOiAxMjIyMzIxX2FlXC9mZGVfYi9jXzEyMjEKKwkxMzogMTIyMjMyMV9hYi9jZGVfYi9jXzEyMjEKKwkxNDogMTIyMjMyMV9hYy9lL2YvY2RlX2MvZS9mL2NfMTIyMQorCTE1OiAxMjIyMzIxX2FlL2ZkZV9lL2ZfMTIyMQorCTE2OiAxMjIyMzIxX2FlL2ZkZV9lL2ZfMTIyMQorCTE3OiAxMjIyMzIxX2FlXC9mZGVfZVwvZl8xMjIxCisJMTg6IDEyMjIzMjFfYWIvY2RlX2IvY18xMjIxCisJMTk6IDEyMjIzMjFfYXhfMTIyMQorCTIwOiAxMjIyMzIxX2FiLmNkZV9iL2NfMTIyMQorCTIxOiAxMjIyMzIxX2FiLmNkZV9iLmNfMTIyMQorCTIyOiAxMjIyMzIxX2FiL2NkZV9iL2NfMTIyMQorCTIzOiA5MjIyMzIxX2FiL2NkZV9iL2NfMTIyMQorCTI0OiAxMjIyMzIxX2FiL2NkZV9iL2NfMTIyOQorCTI1OiAxMjIyMzIxX2FiL2NkZV9iL2NfMTIyOQorCTI2OiAxMjIyMzIxX2FiL2NkZV9iL2NfMTIyMQorCTI3OiAxMjIyMzIxXzliL2NkZV9iL2NfMTIyMQorCTI4OiAxMjIyMzIxXzliL2NkZV9iL2NfMTIyMQorCTI5OiAxeHl6MjIzMjFfYWIvY2RlX2IvY18xMjIxCistLS0KK25hbWU6IGVnbG9iLXN1YnN0cnBsLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGFuY2hvcmVkIHN1YnN0cmluZyByZXBsYWNlbWVudCB3b3JrcywgY29ybmVyIGNhc2VzCitzdGRpbjoKKwlmb289MTIzCisJZWNobyAxOiAke2Zvby8jL3h9CisJZWNobyAyOiAke2Zvby8lL3h9CisJZWNobyAzOiAke2Zvby8jL30KKwllY2hvIDQ6ICR7Zm9vLyN9CisJZWNobyA1OiAke2Zvby8lL30KKwllY2hvIDY6ICR7Zm9vLyV9CitleHBlY3RlZC1zdGRvdXQ6CisJMTogeDEyMworCTI6IDEyM3gKKwkzOiAxMjMKKwk0OiAxMjMKKwk1OiAxMjMKKwk2OiAxMjMKKy0tLQorbmFtZTogZWdsb2Itc3Vic3RycGwtM2EKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHN1YnN0cmluZyByZXBsYWNlbWVudCB3b3JrcyB3aXRoIHZhcmlhYmxlcyBhbmQgc2xhc2hlcywgdG9vCitzdGRpbjoKKwlwZng9L2hvbWUvdXNlcgorCXdkPS9ob21lL3VzZXIvdG1wCisJZWNobyAiJHt3ZC8jJHBmeC9+fSIKKwllY2hvICIke3dkLyNcJHBmeC9+fSIKKwllY2hvICIke3dkLyMiJHBmeCIvfn0iCisJZWNobyAiJHt3ZC8jJyRwZngnL359IgorCWVjaG8gIiR7d2QvIyJcJHBmeCIvfn0iCisJZWNobyAiJHt3ZC8jJ1wkcGZ4Jy9+fSIKK2V4cGVjdGVkLXN0ZG91dDoKKwl+L3RtcAorCS9ob21lL3VzZXIvdG1wCisJfi90bXAKKwkvaG9tZS91c2VyL3RtcAorCS9ob21lL3VzZXIvdG1wCisJL2hvbWUvdXNlci90bXAKKy0tLQorbmFtZTogZWdsb2Itc3Vic3RycGwtM2IKK2Rlc2NyaXB0aW9uOgorCU1vcmUgb2YgdGhpcywgYmFzaCBmYWlscyBpdCAoYmFzaDQgcGFzc2VzKQorc3RkaW46CisJcGZ4PS9ob21lL3VzZXIKKwl3ZD0vaG9tZS91c2VyL3RtcAorCWVjaG8gIiR7d2QvIyQoZWNobyAvaG9tZS91c2VyKS9+fSIKKwllY2hvICIke3dkLyMiJChlY2hvIC9ob21lL3VzZXIpIi9+fSIKKwllY2hvICIke3dkLyMnJChlY2hvIC9ob21lL3VzZXIpJy9+fSIKK2V4cGVjdGVkLXN0ZG91dDoKKwl+L3RtcAorCX4vdG1wCisJL2hvbWUvdXNlci90bXAKKy0tLQorbmFtZTogZWdsb2Itc3Vic3RycGwtM2MKK2Rlc2NyaXB0aW9uOgorCUV2ZW4gbW9yZSB3ZWlyZCBjYXNlcworc3RkaW46CisJcGZ4PS9ob21lL3VzZXIKKwl3ZD0nJHBmeC90bXAnCisJZWNobyAxOiAke3dkLyMkcGZ4L359CisJZWNobyAyOiAke3dkLyNcJHBmeC9+fQorCWVjaG8gMzogJHt3ZC8jIiRwZngiL359CisJZWNobyA0OiAke3dkLyMnJHBmeCcvfn0KKwllY2hvIDU6ICR7d2QvIyJcJHBmeCIvfn0KKwllY2hvIDY6ICR7d2QvIydcJHBmeCcvfn0KKwl0cz0nYS9iYS9iJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApJworCXRwPWEvYgorCXRyPWMvZAorCVtbIC1uICRCQVNIX1ZFUlNJT04gXV0gJiYgc2hvcHQgLXMgZXh0Z2xvYgorCWVjaG8gNzogJHt0cy9hXC9iLyR0cn0KKwllY2hvIDg6ICR7dHMvYVwvYi9cJHRyfQorCWVjaG8gOTogJHt0cy8kdHAvJHRyfQorCWVjaG8gMTA6ICR7dHMvXCR0cC8kdHJ9CisJZWNobyAxMTogJHt0cy9cXCR0cC8kdHJ9CisJZWNobyAxMjogJHt0cy8kdHAvYy9kfQorCWVjaG8gMTM6ICR7dHMvJHRwL2NcL2R9CisJZWNobyAxNDogJHt0cy8kdHAvY1xcL2R9CisJZWNobyAxNTogJHt0cy8rKGFcL2IpLyR0cn0KKwllY2hvIDE2OiAke3RzLysoYVwvYikvXCR0cn0KKwllY2hvIDE3OiAke3RzLysoJHRwKS8kdHJ9CisJZWNobyAxODogJHt0cy8rKCR0cCkvYy9kfQorCWVjaG8gMTk6ICR7dHMvKygkdHApL2NcL2R9CisJZWNobyAyNTogJHt0cy8vYVwvYi8kdHJ9CisJZWNobyAyNjogJHt0cy8vYVwvYi9cJHRyfQorCWVjaG8gMjc6ICR7dHMvLyR0cC8kdHJ9CisJZWNobyAyODogJHt0cy8vJHRwL2MvZH0KKwllY2hvIDI5OiAke3RzLy8kdHAvY1wvZH0KKwllY2hvIDMwOiAke3RzLy8rKGFcL2IpLyR0cn0KKwllY2hvIDMxOiAke3RzLy8rKGFcL2IpL1wkdHJ9CisJZWNobyAzMjogJHt0cy8vKygkdHApLyR0cn0KKwllY2hvIDMzOiAke3RzLy8rKCR0cCkvYy9kfQorCWVjaG8gMzQ6ICR7dHMvLysoJHRwKS9jXC9kfQorCXRwPSIrKCR0cCkiCisJZWNobyA0MDogJHt0cy8kdHAvJHRyfQorCWVjaG8gNDE6ICR7dHMvLyR0cC8kdHJ9CitleHBlY3RlZC1zdGRvdXQ6CisJMTogJHBmeC90bXAKKwkyOiB+L3RtcAorCTM6ICRwZngvdG1wCisJNDogfi90bXAKKwk1OiB+L3RtcAorCTY6IH4vdG1wCisJNzogYy9kYS9iJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisJODogJHRyYS9iJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisJOTogYy9kYS9iJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisJMTA6IGEvYmEvYmMvZCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorCTExOiBjL2RhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKwkxMjogYy9kYS9iJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisJMTM6IGMvZGEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorCTE0OiBjXC9kYS9iJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisJMTU6IGMvZCR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorCTE2OiAkdHIkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKwkxNzogYy9kJHRwJHRwX2EvYiR0cF8qKGEvYilfKigkdHApCisJMTg6IGMvZCR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorCTE5OiBjL2QkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKwkyNTogYy9kYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCisJMjY6ICR0ciR0ciR0cCR0cF8kdHIkdHBfKigkdHIpXyooJHRwKQorCTI3OiBjL2RjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKKwkyODogYy9kYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCisJMjk6IGMvZGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQorCTMwOiBjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKKwkzMTogJHRyJHRwJHRwXyR0ciR0cF8qKCR0cilfKigkdHApCisJMzI6IGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQorCTMzOiBjL2QkdHAkdHBfYy9kJHRwXyooYy9kKV8qKCR0cCkKKwkzNDogYy9kJHRwJHRwX2MvZCR0cF8qKGMvZClfKigkdHApCisJNDA6IGEvYmEvYiR0cCR0cF9hL2IkdHBfKihhL2IpXyooJHRwKQorCTQxOiBhL2JhL2IkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKyMJVGhpcyBpcyB3aGF0IEdOVSBiYXNoIGRvZXM6CisjCTQwOiBjL2QkdHAkdHBfYS9iJHRwXyooYS9iKV8qKCR0cCkKKyMJNDE6IGMvZCR0cCR0cF9jL2QkdHBfKihjL2QpXyooJHRwKQorLS0tCituYW1lOiBlZ2xvYi11dGY4LTEKK2Rlc2NyaXB0aW9uOgorCVVURi04IG1vZGUgZGlmZmVyZW5jZXMgZm9yIGVnbG9iYmluZworc3RkaW46CisJcz1ibMO2ZAorCXNldCArVQorCXByaW50IDE6ICR7cyU/Pz99IC4KKwlwcmludCAyOiAke3MvYj8/P2QveH0gLgorCXNldCAtVQorCXByaW50IDM6ICR7cyU/Pz99IC4KKwlwcmludCA0OiAke3MvYj8/ZC94fSAuCisJeD1uw7YKKwlwcmludCA1OiAke3glP30gJHt4JSU/fSAuCisJeD3DpGgKKwlwcmludCA2OiAke3gjP30gJHt4IyM/fSAuCisJeD2BggorCXByaW50IDc6ICR7eCU/fSAke3glJT99IC4KKwl4PW3DpIAKKwlwcmludCA4OiAke3glP30gJHt4JSU/fSAuCisJeD3kvZUKKwlwcmludCA5OiAke3glP30gJHt4JSU/fSAuCitleHBlY3RlZC1zdGRvdXQ6CisJMTogYmwgLgorCTI6IHggLgorCTM6IGIgLgorCTQ6IHggLgorCTU6IG4gbiAuCisJNjogaCBoIC4KKwk3OiCBIIEgLgorCTg6IG3DpCBtw6QgLgorCTk6IC4KKy0tLQorbmFtZTogZ2xvYi1iYWQtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBnbG9iYmluZyBpc24ndCBkb25lIHdoZW4gZ2xvYiBoYXMgc3ludGF4IGVycm9yCitmaWxlLXNldHVwOiBkaXIgNzU1ICJbeCIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJbeC9mb28iCitzdGRpbjoKKwllY2hvIFsqCisJZWNobyAqW3gKKwllY2hvIFt4LyoKK2V4cGVjdGVkLXN0ZG91dDoKKwlbKgorCSpbeAorCVt4L2ZvbworLS0tCituYW1lOiBnbG9iLWJhZC0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHN5bWJvbGljIGxpbmtzIGFyZW4ndCBzdGF0KCknZAorZmlsZS1zZXR1cDogZGlyIDc1NSAiZGlyIgorZmlsZS1zZXR1cDogc3ltbGluayA2NDQgImRpci9hYmMiCisJbm9uLWV4aXN0ZW50LWZpbGUKK3N0ZGluOgorCWVjaG8gZCovKgorCWVjaG8gZCovYWJjCitleHBlY3RlZC1zdGRvdXQ6CisJZGlyL2FiYworCWRpci9hYmMKKy0tLQorbmFtZTogZ2xvYi1yYW5nZS0xCitkZXNjcmlwdGlvbjoKKwlUZXN0IHJhbmdlIG1hdGNoaW5nCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiLmJjIgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiYyIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJiYmMiCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiY2JjIgorZmlsZS1zZXR1cDogZmlsZSA2NDQgIi1iYyIKK3N0ZGluOgorCWVjaG8gW2FiLV0qCisJZWNobyBbLWFiXSoKKwllY2hvIFshLWFiXSoKKwllY2hvIFshYWJdKgorCWVjaG8gW11hYl0qCitleHBlY3RlZC1zdGRvdXQ6CisJLWJjIGFiYyBiYmMKKwktYmMgYWJjIGJiYworCWNiYworCS1iYyBjYmMKKwlhYmMgYmJjCistLS0KK25hbWU6IGdsb2ItcmFuZ2UtMgorZGVzY3JpcHRpb246CisJVGVzdCByYW5nZSBtYXRjaGluZworCShBVCZUIGtzaCBmYWlscyB0aGlzOyBQT1NJWCBzYXlzIGludmFsaWQpCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjIgorc3RkaW46CisJZWNobyBbYS0tXSoKK2V4cGVjdGVkLXN0ZG91dDoKKwlbYS0tXSoKKy0tLQorbmFtZTogZ2xvYi1yYW5nZS0zCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGdsb2JiaW5nIG1hdGNoZXMgdGhlIHJpZ2h0IHRoaW5ncy4uLgorIyBicmVha3Mgb24gTWFjIE9TWCAoSEZTKyBub24tc3RhbmRhcmQgVW5pY29kZSBjYW5vbmljYWwgZGVjb21wb3NpdGlvbikKK2NhdGVnb3J5OiAhb3M6ZGFyd2luCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYcJjIgorc3RkaW46CisJZWNobyBhW8Et2l0qCitleHBlY3RlZC1zdGRvdXQ6CisJYcJjCistLS0KK25hbWU6IGdsb2ItcmFuZ2UtNAorZGVzY3JpcHRpb246CisJUmVzdWx0cyB1bnNwZWNpZmllZCBhY2NvcmRpbmcgdG8gUE9TSVgKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICIuYmMiCitzdGRpbjoKKwllY2hvIFthLl0qCitleHBlY3RlZC1zdGRvdXQ6CisJW2EuXSoKKy0tLQorbmFtZTogZ2xvYi1yYW5nZS01CitkZXNjcmlwdGlvbjoKKwlSZXN1bHRzIHVuc3BlY2lmaWVkIGFjY29yZGluZyB0byBQT1NJWAorCShBVCZUIGtzaCB0cmVhdHMgdGhpcyBsaWtlIFthLWNjLWVdKikKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmMiCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYmJjIgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImNiYyIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJkYmMiCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiZWJjIgorZmlsZS1zZXR1cDogZmlsZSA2NDQgIi1iYyIKK3N0ZGluOgorCWVjaG8gW2EtYy1lXSoKK2V4cGVjdGVkLXN0ZG91dDoKKwktYmMgYWJjIGJiYyBjYmMgZWJjCistLS0KK25hbWU6IGhlcmVkb2MtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgb3JkZXJpbmcvY29udGVudCBvZiByZWR1bmRlbnQgaGVyZSBkb2N1bWVudHMuCitzdGRpbjoKKwljYXQgPDwgRU9GMSA8PCBFT0YyCisJaGkKKwlFT0YxCisJdGhlcmUKKwlFT0YyCitleHBlY3RlZC1zdGRvdXQ6CisJdGhlcmUKKy0tLQorbmFtZTogaGVyZWRvYy0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayBxdW90ZWQgaGVyZS1kb2MgaXMgcHJvdGVjdGVkLgorc3RkaW46CisJYT1mb28KKwljYXQgPDwgJ0VPRicKKwloaVwKKwl0aGVyZSRhCisJc3R1ZmYKKwlFT1wKKwlGCisJRU9GCitleHBlY3RlZC1zdGRvdXQ6CisJaGlcCisJdGhlcmUkYQorCXN0dWZmCisJRU9cCisJRgorLS0tCituYW1lOiBoZXJlZG9jLTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgbmV3bGluZSBpc24ndCBuZWVkZWQgYWZ0ZXIgaGVyZWRvYy1kZWxpbWl0ZXIgbWFya2VyLgorc3RkaW46ICEKKwljYXQgPDwgRU9GCisJaGkKKwl0aGVyZQorCUVPRgorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJdGhlcmUKKy0tLQorbmFtZTogaGVyZWRvYy00CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGFuIGVycm9yIG9jY3VycyBpZiB0aGUgaGVyZWRvYy1kZWxpbWl0ZXIgaXMgbWlzc2luZy4KK3N0ZGluOiAhCisJY2F0IDw8IEVPRgorCWhpCisJdGhlcmUKK2V4cGVjdGVkLWV4aXQ6IGUgPiAwCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjogLy4qLworLS0tCituYW1lOiBoZXJlZG9jLTUKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYmFja3NsYXNoIHF1b3RlcyBhICQsIGAgYW5kIFwgYW5kIGtpbGxzIGEgXG5ld2xpbmUKK3N0ZGluOgorCWE9QkFECisJYj1vaworCWNhdCA8PCBFT0YKKwloXCR7YX1pCisJaFxcJHtifWkKKwl0aFxgZWNobyBub3QtcnVuXGBlcmUKKwl0aFxcYGVjaG8gaXMtcnVuYGVyZQorCWZvbFxca3MKKwltb3JlXFwKKwlsYXN0IFwKKwlsaW5lCisJRU9GCitleHBlY3RlZC1zdGRvdXQ6CisJaCR7YX1pCisJaFxva2kKKwl0aGBlY2hvIG5vdC1ydW5gZXJlCisJdGhcaXMtcnVuZXJlCisJZm9sXGtzCisJbW9yZVwKKwlsYXN0IGxpbmUKKy0tLQorbmFtZTogaGVyZWRvYy02CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IFxuZXdsaW5lIGluIGluaXRpYWwgaGVyZS1kZWxpbSB3b3JkIGRvZXNuJ3QgaW1wbHkKKwlhIHF1b3RlZCBoZXJlLWRvYy4KK3N0ZGluOgorCWE9aQorCWNhdCA8PCBFT1wKKwlGCisJaCRhCisJdGhlcmUKKwlFT0YKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCXRoZXJlCistLS0KK25hbWU6IGhlcmVkb2MtNworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBkb3VibGUgcXVvdGVkICQgZXhwcmVzc2lvbnMgaW4gaGVyZSBkZWxpbWl0ZXJzIGFyZQorCW5vdCBleHBhbmRlZCBhbmQgbWF0Y2ggdGhlIGRlbGltaXRlci4KKwlQT1NJWCBzYXlzIG9ubHkgcXVvdGUgcmVtb3ZhbCBpcyBhcHBsaWVkIHRvIHRoZSBkZWxpbWl0ZXIuCitzdGRpbjoKKwlhPWIKKwljYXQgPDwgIkUkYSIKKwloaQorCWgkYQorCWhiCisJRSRhCisJZWNobyBkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwloJGEKKwloYgorCWRvbmUKKy0tLQorbmFtZTogaGVyZWRvYy04CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGRvdWJsZSBxdW90ZWQgZXNjYXBlZCAkIGV4cHJlc3Npb25zIGluIGhlcmUKKwlkZWxpbWl0ZXJzIGFyZSBub3QgZXhwYW5kZWQgYW5kIG1hdGNoIHRoZSBkZWxpbWl0ZXIuCisJUE9TSVggc2F5cyBvbmx5IHF1b3RlIHJlbW92YWwgaXMgYXBwbGllZCB0byB0aGUgZGVsaW1pdGVyCisJKFwgY291bnRzIGFzIGEgcXVvdGUpLgorc3RkaW46CisJYT1iCisJY2F0IDw8ICJFXCRhIgorCWhpCisJaCRhCisJaFwkYQorCWhiCisJaFxiCisJRSRhCisJZWNobyBkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwloJGEKKwloXCRhCisJaGIKKwloXGIKKwlkb25lCistLS0KK25hbWU6IGhlcmVkb2MtOWEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgaGVyZSBzdHJpbmdzIHdvcmsuCitzdGRpbjoKKwliYXI9ImJhcgorCQliYXoiCisJdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8Zm9vCisJIiRfX3Byb2duYW1lIiAtYyAidHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8Zm9vIgorCXRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IG5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtIDw8PCIkYmFyIgorCXRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IG5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtIDw8PCckYmFyJworCXRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IG5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtIDw8PFwkYmFyCisJdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG0gPDw8LWZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCXNiYgorCXNiYgorCW9uZQorCQlvbm0KKwkkb25lCisJJG9uZQorCS1zYmIKKy0tLQorbmFtZTogaGVyZWRvYy05YgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBhIGNvcm5lciBjYXNlIG9mIGhlcmUgc3RyaW5ncyB3b3JrcyBsaWtlIGJhc2gKK3N0ZGluOgorCWZub3JkPTQyCisJYmFyPSJiYXIKKwkJIFwkZm5vcmQgYmF6IgorCXRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IG5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtIDw8PCRiYXIKK2V4cGVjdGVkLXN0ZG91dDoKKwlvbmUgJHNhYmVxIG9ubQorY2F0ZWdvcnk6IGJhc2gKKy0tLQorbmFtZTogaGVyZWRvYy05YworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBhIGNvcm5lciBjYXNlIG9mIGhlcmUgc3RyaW5ncyB3b3JrcyBsaWtlIGtzaDkzLCB6c2gKK3N0ZGluOgorCWZub3JkPTQyCisJYmFyPSJiYXIKKwkJIFwkZm5vcmQgYmF6IgorCXRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IG5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtIDw8PCRiYXIKK2V4cGVjdGVkLXN0ZG91dDoKKwlvbmUKKwkJICRzYWJlcSBvbm0KKy0tLQorbmFtZTogaGVyZWRvYy05ZAorZGVzY3JpcHRpb246CisJQ2hlY2sgYW5vdGhlciBjb3JuZXIgY2FzZSBvZiBoZXJlIHN0cmluZ3MKK3N0ZGluOgorCXRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IG5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtIDw8PCBiYXIKK2V4cGVjdGVkLXN0ZG91dDoKKwlvbmUKKy0tLQorbmFtZTogaGVyZWRvYy1xdW90aW5nLXVuc3Vic3QKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGZvciBjb3JyZWN0IGhhbmRsaW5nIG9mIHF1b3RlZCBjaGFyYWN0ZXJzIGluCisJaGVyZSBkb2N1bWVudHMgd2l0aG91dCBzdWJzdGl0dXRpb24gKG1hcmtlciBpcyBxdW90ZWQpLgorc3RkaW46CisJZm9vPWJhcgorCWNhdCA8PC0nRU9GJworCQl4ICIgXCIgXCBcXCAkIFwkIGBlY2hvIGJhemAgXGBlY2hvIGJhelxgICRmb28gXCRmb28geAorCUVPRgorZXhwZWN0ZWQtc3Rkb3V0OgorCXggIiBcIiBcIFxcICQgXCQgYGVjaG8gYmF6YCBcYGVjaG8gYmF6XGAgJGZvbyBcJGZvbyB4CistLS0KK25hbWU6IGhlcmVkb2MtcXVvdGluZy1zdWJzdAorZGVzY3JpcHRpb246CisJQ2hlY2sgZm9yIGNvcnJlY3QgaGFuZGxpbmcgb2YgcXVvdGVkIGNoYXJhY3RlcnMgaW4KKwloZXJlIGRvY3VtZW50cyB3aXRoIHN1YnN0aXR1dGlvbiAobWFya2VyIGlzIG5vdCBxdW90ZWQpLgorc3RkaW46CisJZm9vPWJhcgorCWNhdCA8PC1FT0YKKwkJeCAiIFwiIFwgXFwgJCBcJCBgZWNobyBiYXpgIFxgZWNobyBiYXpcYCAkZm9vIFwkZm9vIHgKKwlFT0YKK2V4cGVjdGVkLXN0ZG91dDoKKwl4ICIgXCIgXCBcICQgJCBiYXogYGVjaG8gYmF6YCBiYXIgJGZvbyB4CistLS0KK25hbWU6IGhlcmVkb2MtdG1wZmlsZS0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGhlcmVkb2MgdGVtcCBmaWxlcyBhcmVuJ3QgcmVtb3ZlZCB0b28gc29vbiBvciB0b28gbGF0ZS4KKwlIZXJlZG9jIGluIHNpbXBsZSBjb21tYW5kLgorc3RkaW46CisJVE1QRElSPSRQV0QKKwlldmFsICcKKwkJY2F0IDw8LSBFT0YKKwkJaGkKKwkJRU9GCisJCWZvciBpIGluIGEgYiA7IGRvCisJCQljYXQgPDwtIEVPRgorCQkJbW9yZQorCQkJRU9GCisJCWRvbmUKKwkgICAgJyAmCisJc2xlZXAgMQorCWVjaG8gTGVmdCBvdmVyczogKgorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJbW9yZQorCW1vcmUKKwlMZWZ0IG92ZXJzOiAqCistLS0KK25hbWU6IGhlcmVkb2MtdG1wZmlsZS0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGhlcmVkb2MgdGVtcCBmaWxlcyBhcmVuJ3QgcmVtb3ZlZCB0b28gc29vbiBvciB0b28gbGF0ZS4KKwlIZXJlZG9jIGluIGZ1bmN0aW9uLCBtdWx0aXBsZSBjYWxscyB0byBmdW5jdGlvbi4KK3N0ZGluOgorCVRNUERJUj0kUFdECisJZXZhbCAnCisJCWZvbygpIHsKKwkJCWNhdCA8PC0gRU9GCisJCQloaQorCQkJRU9GCisJCX0KKwkJZm9vCisJCWZvbworCSAgICAnICYKKwlzbGVlcCAxCisJZWNobyBMZWZ0IG92ZXJzOiAqCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwloaQorCUxlZnQgb3ZlcnM6ICoKKy0tLQorbmFtZTogaGVyZWRvYy10bXBmaWxlLTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgaGVyZWRvYyB0ZW1wIGZpbGVzIGFyZW4ndCByZW1vdmVkIHRvbyBzb29uIG9yIHRvbyBsYXRlLgorCUhlcmVkb2MgaW4gZnVuY3Rpb24gaW4gbG9vcCwgbXVsdGlwbGUgY2FsbHMgdG8gZnVuY3Rpb24uCitzdGRpbjoKKwlUTVBESVI9JFBXRAorCWV2YWwgJworCQlmb28oKSB7CisJCQljYXQgPDwtIEVPRgorCQkJaGkKKwkJCUVPRgorCQl9CisJCWZvciBpIGluIGEgYjsgZG8KKwkJCWZvbworCQkJZm9vKCkgeworCQkJCWNhdCA8PC0gRU9GCisJCQkJZm9sa3MgJGkKKwkJCQlFT0YKKwkJCX0KKwkJZG9uZQorCQlmb28KKwkgICAgJyAmCisJc2xlZXAgMQorCWVjaG8gTGVmdCBvdmVyczogKgorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJZm9sa3MgYgorCWZvbGtzIGIKKwlMZWZ0IG92ZXJzOiAqCistLS0KK25hbWU6IGhlcmVkb2MtdG1wZmlsZS00CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGhlcmVkb2MgdGVtcCBmaWxlcyBhcmVuJ3QgcmVtb3ZlZCB0b28gc29vbiBvciB0b28gbGF0ZS4KKwlCYWNrZ3JvdW5kZWQgc2ltcGxlIGNvbW1hbmQgd2l0aCBoZXJlIGRvYworc3RkaW46CisJVE1QRElSPSRQV0QKKwlldmFsICcKKwkJY2F0IDw8LSBFT0YgJgorCQloaQorCQlFT0YKKwkgICAgJyAmCisJc2xlZXAgMQorCWVjaG8gTGVmdCBvdmVyczogKgorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJTGVmdCBvdmVyczogKgorLS0tCituYW1lOiBoZXJlZG9jLXRtcGZpbGUtNQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBoZXJlZG9jIHRlbXAgZmlsZXMgYXJlbid0IHJlbW92ZWQgdG9vIHNvb24gb3IgdG9vIGxhdGUuCisJQmFja2dyb3VuZGVkIHN1YnNoZWxsIGNvbW1hbmQgd2l0aCBoZXJlIGRvYworc3RkaW46CisJVE1QRElSPSRQV0QKKwlldmFsICcKKwkgICAgICAoCisJCXNsZWVwIDEJIyBzbyBwYXJlbnQgZXhpdHMKKwkJZWNobyBBCisJCWNhdCA8PC0gRU9GCisJCWhpCisJCUVPRgorCQllY2hvIEIKKwkgICAgICApICYKKwkgICAgJyAmCisJc2xlZXAgMgorCWVjaG8gTGVmdCBvdmVyczogKgorZXhwZWN0ZWQtc3Rkb3V0OgorCUEKKwloaQorCUIKKwlMZWZ0IG92ZXJzOiAqCistLS0KK25hbWU6IGhlcmVkb2MtdG1wZmlsZS02CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGhlcmVkb2MgdGVtcCBmaWxlcyBhcmVuJ3QgcmVtb3ZlZCB0b28gc29vbiBvciB0b28gbGF0ZS4KKwlIZXJlZG9jIGluIHBpcGVsaW5lLgorc3RkaW46CisJVE1QRElSPSRQV0QKKwlldmFsICcKKwkJY2F0IDw8LSBFT0YgfCBzZWQgInMvaGkvSEkvIgorCQloaQorCQlFT0YKKwkgICAgJyAmCisJc2xlZXAgMQorCWVjaG8gTGVmdCBvdmVyczogKgorZXhwZWN0ZWQtc3Rkb3V0OgorCUhJCisJTGVmdCBvdmVyczogKgorLS0tCituYW1lOiBoZXJlZG9jLXRtcGZpbGUtNworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBoZXJlZG9jIHRlbXAgZmlsZXMgYXJlbid0IHJlbW92ZWQgdG9vIHNvb24gb3IgdG9vIGxhdGUuCisJSGVyZWRvYyBpbiBiYWNrZ3JvdW5kZWQgcGlwZWxpbmUuCitzdGRpbjoKKwlUTVBESVI9JFBXRAorCWV2YWwgJworCQljYXQgPDwtIEVPRiB8IHNlZCAncy9oaS9ISS8nICYKKwkJaGkKKwkJRU9GCisJICAgICcgJgorCXNsZWVwIDEKKwllY2hvIExlZnQgb3ZlcnM6ICoKK2V4cGVjdGVkLXN0ZG91dDoKKwlISQorCUxlZnQgb3ZlcnM6ICoKKy0tLQorbmFtZTogaGVyZWRvYy10bXBmaWxlLTgKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgaGVyZWRvYyB0ZW1wIGZpbGVzIGFyZW4ndCByZW1vdmVkIHRvbyBzb29uIG9yIHRvbworCWxhdGUuIEhlcmVkb2MgaW4gZnVuY3Rpb24sIGJhY2tncm91bmRlZCBjYWxsIHRvIGZ1bmN0aW9uLgorCVRoaXMgY2hlY2sgY2FuIGZhaWwgb24gc2xvdyBtYWNoaW5lcyAoPDEwMCBNSHopLCBvciBDeWd3aW4sCisJdGhhdCdzIG5vcm1hbC4KK3N0ZGluOgorCVRNUERJUj0kUFdECisJIyBCYWNrZ3JvdW5kIGV2YWwgc28gbWFpbiBzaGVsbCBkb2Vzbid0IGRvIHBhcnNpbmcKKwlldmFsICcKKwkJZm9vKCkgeworCQkJY2F0IDw8LSBFT0YKKwkJCWhpCisJCQlFT0YKKwkJfQorCQlmb28KKwkJIyBzbGVlcCBzbyBldmFsIGNhbiBkaWUKKwkJKHNsZWVwIDE7IGZvbykgJgorCQkoc2xlZXAgMTsgZm9vKSAmCisJCWZvbworCSAgICAnICYKKwlzbGVlcCAyCisJZWNobyBMZWZ0IG92ZXJzOiAqCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwloaQorCWhpCisJaGkKKwlMZWZ0IG92ZXJzOiAqCistLS0KK25hbWU6IGhpc3RvcnktYmFzaWMKK2Rlc2NyaXB0aW9uOgorCVNlZSBpZiB3ZSBjYW4gdGVzdCBoaXN0b3J5IGF0IGFsbAorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBoaQorCWZjIC1sCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKwkxCWVjaG8gaGkKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCokLworLS0tCituYW1lOiBoaXN0b3J5LWR1cHMKK2Rlc2NyaXB0aW9uOgorCVZlcmlmeSBkdXBsaWNhdGVzIGFuZCBzcGFjZXMgYXJlIG5vdCBlbnRlcmVkCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGhpCisJIGVjaG8geW8KKwllY2hvIGhpCisJZmMgLWwKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCXlvCisJaGkKKwkxCWVjaG8gaGkKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCokLworLS0tCituYW1lOiBoaXN0b3J5LXVubGluaworZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgYnJva2VuIEhJU1RGSUxFcyBkbyBub3QgY2F1c2UgdHJvdWJsZQorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9Zm9vL2hpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK2ZpbGUtc2V0dXA6IGRpciA3NTUgImZvbyIKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJmb28vaGlzdC5maWxlIgorCXNvbWV0ZXh0Cit0aW1lLWxpbWl0OiA1CitwZXJsLXNldHVwOiBjaG1vZCgwNTU1LCAiZm9vIik7CitzdGRpbjoKKwllY2hvIGhpCisJZmMgLWwKKwljaG1vZCAwNzU1IGZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJMQllY2hvIGhpCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvKC4qY2Fubm90IHVubGluayBISVNURklMRS4qXG4pP1gqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1lLW1pbnVzLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIG1vcmUgcmVjZW50IGNvbW1hbmQgaXMgZXhlY3V0ZWQKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gaGkKKwllY2hvIHRoZXJlCisJZmMgLWUgLQorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJdGhlcmUKKwl0aGVyZQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKmVjaG8gdGhlcmVcblgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1lLW1pbnVzLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgcmVwZWF0ZWQgY29tbWFuZCBpcyBwcmludGVkIGJlZm9yZSBjb21tYW5kCisJaXMgcmUtZXhlY3V0ZWQuCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwlleGVjIDI+JjEKKwllY2hvIGhpCisJZWNobyB0aGVyZQorCWZjIC1lIC0KK2V4cGVjdGVkLXN0ZG91dC1wYXR0ZXJuOgorCS9YKmhpXG5YKnRoZXJlXG5YKmVjaG8gdGhlcmVcbnRoZXJlXG5YKi8KK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCokLworLS0tCituYW1lOiBoaXN0b3J5LWUtbWludXMtMworZGVzY3JpcHRpb246CisJZmMgLWUgLSBmYWlscyB3aGVuIHRoZXJlIGlzIG5vIGhpc3RvcnkKKwkoa3NoOTMgaGFzIGEgYnVnIHRoYXQgY2F1c2VzIHRoaXMgdG8gZmFpbCkKKwkoa3NoODggbG9vcHMgb24gdGhpcykKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWZjIC1lIC0KKwllY2hvIG9rCitleHBlY3RlZC1zdGRvdXQ6CisJb2sKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCouKjouKmhpc3RvcnkuKlxuWCokLworLS0tCituYW1lOiBoaXN0b3J5LWUtbWludXMtNAorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgImZjIC1lIC0iIGNvbW1hbmQgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0LgorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBhYmMKKwlmYyAtZSAtIHwgKHJlYWQgeDsgZWNobyAiQSAkeCIpCisJZWNobyBvaworZXhwZWN0ZWQtc3Rkb3V0OgorCWFiYworCUEgYWJjCisJb2sKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCplY2hvIGFiY1xuWCovCistLS0KK25hbWU6IGhpc3RvcnktZS1taW51cy01CitkZXNjcmlwdGlvbjoKKwlmYyBpcyByZXBsYWNlZCBpbiBoaXN0b3J5IGJ5IG5ldyBjb21tYW5kLgorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBhYmMgZGVmCisJZWNobyBnaGkgamtsCisJOgorCWZjIC1lIC0gZWNobworCWZjIC1sIDIgNQorZXhwZWN0ZWQtc3Rkb3V0OgorCWFiYyBkZWYKKwlnaGkgamtsCisJZ2hpIGprbAorCTIJZWNobyBnaGkgamtsCisJMwk6CisJNAllY2hvIGdoaSBqa2wKKwk1CWZjIC1sIDIgNQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKmVjaG8gZ2hpIGprbFxuWCokLworLS0tCituYW1lOiBoaXN0b3J5LWxpc3QtMQorZGVzY3JpcHRpb246CisJTGlzdCBsaXN0cyBjb3JyZWN0IHJhbmdlCisJKGtzaDg4IGZhaWxzICdjYXVzZSBpdCBsaXN0cyB0aGUgZmMgY29tbWFuZCkKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gbGluZSAxCisJZWNobyBsaW5lIDIKKwllY2hvIGxpbmUgMworCWZjIC1sIC0tIC0yCitleHBlY3RlZC1zdGRvdXQ6CisJbGluZSAxCisJbGluZSAyCisJbGluZSAzCisJMgllY2hvIGxpbmUgMgorCTMJZWNobyBsaW5lIDMKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCokLworLS0tCituYW1lOiBoaXN0b3J5LWxpc3QtMgorZGVzY3JpcHRpb246CisJTGlzdHMgb2xkZXN0IGhpc3RvcnkgaWYgZ2l2ZW4gcHJlLWhpc3RvcmljIG51bWJlcgorCShrc2g5MyBoYXMgYSBidWcgdGhhdCBjYXVzZXMgdGhpcyB0byBmYWlsKQorCShrc2g4OCBmYWlscyAnY2F1c2UgaXQgbGlzdHMgdGhlIGZjIGNvbW1hbmQpCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGxpbmUgMQorCWVjaG8gbGluZSAyCisJZWNobyBsaW5lIDMKKwlmYyAtbCAtLSAtNDAKK2V4cGVjdGVkLXN0ZG91dDoKKwlsaW5lIDEKKwlsaW5lIDIKKwlsaW5lIDMKKwkxCWVjaG8gbGluZSAxCisJMgllY2hvIGxpbmUgMgorCTMJZWNobyBsaW5lIDMKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCokLworLS0tCituYW1lOiBoaXN0b3J5LWxpc3QtMworZGVzY3JpcHRpb246CisJQ2FuIGdpdmUgbnVtYmVyICdvcHRpb25zJyB0byBmYworYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBsaW5lIDEKKwllY2hvIGxpbmUgMgorCWVjaG8gbGluZSAzCisJZWNobyBsaW5lIDQKKwlmYyAtbCAtMyAtMgorZXhwZWN0ZWQtc3Rkb3V0OgorCWxpbmUgMQorCWxpbmUgMgorCWxpbmUgMworCWxpbmUgNAorCTIJZWNobyBsaW5lIDIKKwkzCWVjaG8gbGluZSAzCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1saXN0LTQKK2Rlc2NyaXB0aW9uOgorCS0xIHJlZmVycyB0byBwcmV2aW91cyBjb21tYW5kCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGxpbmUgMQorCWVjaG8gbGluZSAyCisJZWNobyBsaW5lIDMKKwllY2hvIGxpbmUgNAorCWZjIC1sIC0xIC0xCitleHBlY3RlZC1zdGRvdXQ6CisJbGluZSAxCisJbGluZSAyCisJbGluZSAzCisJbGluZSA0CisJNAllY2hvIGxpbmUgNAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKiQvCistLS0KK25hbWU6IGhpc3RvcnktbGlzdC01CitkZXNjcmlwdGlvbjoKKwlMaXN0IGNvbW1hbmQgc3RheXMgaW4gaGlzdG9yeQorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBsaW5lIDEKKwllY2hvIGxpbmUgMgorCWVjaG8gbGluZSAzCisJZWNobyBsaW5lIDQKKwlmYyAtbCAtMSAtMQorCWZjIC1sIC0yIC0xCitleHBlY3RlZC1zdGRvdXQ6CisJbGluZSAxCisJbGluZSAyCisJbGluZSAzCisJbGluZSA0CisJNAllY2hvIGxpbmUgNAorCTQJZWNobyBsaW5lIDQKKwk1CWZjIC1sIC0xIC0xCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1saXN0LTYKK2Rlc2NyaXB0aW9uOgorCUhJU1RTSVpFIGxpbWl0cyBhYm91dCBvZiBoaXN0b3J5IGtlcHQuCisJKGtzaDg4IGZhaWxzICdjYXVzZSBpdCBsaXN0cyB0aGUgZmMgY29tbWFuZCkKK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSFISVNUU0laRT0zIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBsaW5lIDEKKwllY2hvIGxpbmUgMgorCWVjaG8gbGluZSAzCisJZWNobyBsaW5lIDQKKwllY2hvIGxpbmUgNQorCWZjIC1sCitleHBlY3RlZC1zdGRvdXQ6CisJbGluZSAxCisJbGluZSAyCisJbGluZSAzCisJbGluZSA0CisJbGluZSA1CisJNAllY2hvIGxpbmUgNAorCTUJZWNobyBsaW5lIDUKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCokLworLS0tCituYW1lOiBoaXN0b3J5LWxpc3QtNworZGVzY3JpcHRpb246CisJZmMgYWxsb3dzIHRvbyBvbGQvbmV3IGVycm9ycyBpbiByYW5nZSBzcGVjaWZpY2F0aW9uCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhSElTVFNJWkU9MyEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gbGluZSAxCisJZWNobyBsaW5lIDIKKwllY2hvIGxpbmUgMworCWVjaG8gbGluZSA0CisJZWNobyBsaW5lIDUKKwlmYyAtbCAxIDMwCitleHBlY3RlZC1zdGRvdXQ6CisJbGluZSAxCisJbGluZSAyCisJbGluZSAzCisJbGluZSA0CisJbGluZSA1CisJNAllY2hvIGxpbmUgNAorCTUJZWNobyBsaW5lIDUKKwk2CWZjIC1sIDEgMzAKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCokLworLS0tCituYW1lOiBoaXN0b3J5LWxpc3Qtci0xCitkZXNjcmlwdGlvbjoKKwl0ZXN0IC1yIGZsYWcgaW4gaGlzdG9yeQorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBsaW5lIDEKKwllY2hvIGxpbmUgMgorCWVjaG8gbGluZSAzCisJZWNobyBsaW5lIDQKKwllY2hvIGxpbmUgNQorCWZjIC1sIC1yIDIgNAorZXhwZWN0ZWQtc3Rkb3V0OgorCWxpbmUgMQorCWxpbmUgMgorCWxpbmUgMworCWxpbmUgNAorCWxpbmUgNQorCTQJZWNobyBsaW5lIDQKKwkzCWVjaG8gbGluZSAzCisJMgllY2hvIGxpbmUgMgorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKiQvCistLS0KK25hbWU6IGhpc3RvcnktbGlzdC1yLTIKK2Rlc2NyaXB0aW9uOgorCUlmIGZpcnN0IGlzIG5ld2VyIHRoYW4gbGFzdCwgLXIgaXMgaW1wbGllZC4KK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gbGluZSAxCisJZWNobyBsaW5lIDIKKwllY2hvIGxpbmUgMworCWVjaG8gbGluZSA0CisJZWNobyBsaW5lIDUKKwlmYyAtbCA0IDIKK2V4cGVjdGVkLXN0ZG91dDoKKwlsaW5lIDEKKwlsaW5lIDIKKwlsaW5lIDMKKwlsaW5lIDQKKwlsaW5lIDUKKwk0CWVjaG8gbGluZSA0CisJMwllY2hvIGxpbmUgMworCTIJZWNobyBsaW5lIDIKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCokLworLS0tCituYW1lOiBoaXN0b3J5LWxpc3Qtci0zCitkZXNjcmlwdGlvbjoKKwlJZiBmaXJzdCBpcyBuZXdlciB0aGFuIGxhc3QsIC1yIGlzIGNhbmNlbGxlZC4KK2FyZ3VtZW50czogIS1pIQorZW52LXNldHVwOiAhRU5WPS4vRW52IUhJU1RGSUxFPWhpc3QuZmlsZSEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWVjaG8gbGluZSAxCisJZWNobyBsaW5lIDIKKwllY2hvIGxpbmUgMworCWVjaG8gbGluZSA0CisJZWNobyBsaW5lIDUKKwlmYyAtbCAtciA0IDIKK2V4cGVjdGVkLXN0ZG91dDoKKwlsaW5lIDEKKwlsaW5lIDIKKwlsaW5lIDMKKwlsaW5lIDQKKwlsaW5lIDUKKwkyCWVjaG8gbGluZSAyCisJMwllY2hvIGxpbmUgMworCTQJZWNobyBsaW5lIDQKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCokLworLS0tCituYW1lOiBoaXN0b3J5LXN1YnN0LTEKK2Rlc2NyaXB0aW9uOgorCUJhc2ljIHN1YnN0aXR1dGlvbgorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBhYmMgZGVmCisJZWNobyBnaGkgamtsCisJZmMgLWUgLSBhYmM9QUIgJ2VjaG8gYScKK2V4cGVjdGVkLXN0ZG91dDoKKwlhYmMgZGVmCisJZ2hpIGprbAorCUFCIGRlZgorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKmVjaG8gQUIgZGVmXG5YKiQvCistLS0KK25hbWU6IGhpc3Rvcnktc3Vic3QtMgorZGVzY3JpcHRpb246CisJRG9lcyBzdWJzdCBmaW5kIHByZXZpb3VzIGNvbW1hbmQ/Cithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGFiYyBkZWYKKwllY2hvIGdoaSBqa2wKKwlmYyAtZSAtIGprbD1YWVpRUlQgJ2VjaG8gZycKK2V4cGVjdGVkLXN0ZG91dDoKKwlhYmMgZGVmCisJZ2hpIGprbAorCWdoaSBYWVpRUlQKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCplY2hvIGdoaSBYWVpRUlRcblgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1zdWJzdC0zCitkZXNjcmlwdGlvbjoKKwlEb2VzIHN1YnN0IGZpbmQgcHJldmlvdXMgY29tbWFuZCB3aGVuIG5vIGFyZ3VtZW50cyBnaXZlbgorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBhYmMgZGVmCisJZWNobyBnaGkgamtsCisJZmMgLWUgLSBqa2w9WFlaUVJUCitleHBlY3RlZC1zdGRvdXQ6CisJYWJjIGRlZgorCWdoaSBqa2wKKwlnaGkgWFlaUVJUCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqZWNobyBnaGkgWFlaUVJUXG5YKiQvCistLS0KK25hbWU6IGhpc3Rvcnktc3Vic3QtNAorZGVzY3JpcHRpb246CisJR2xvYmFsIHN1YnN0aXR1dGlvbnMgd29yaworCShrc2g4OCBhbmQga3NoOTMgZG8gbm90IGhhdmUgLWcgb3B0aW9uKQorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBhYmMgZGVmIGFzamogc2Fkamhhc2RqaCBhc2RqaGFzZAorCWZjIC1lIC0gLWcgYT1Gb29CQVIKK2V4cGVjdGVkLXN0ZG91dDoKKwlhYmMgZGVmIGFzamogc2Fkamhhc2RqaCBhc2RqaGFzZAorCUZvb0JBUmJjIGRlZiBGb29CQVJzamogc0Zvb0JBUmRqaEZvb0JBUnNkamggRm9vQkFSc2RqaEZvb0JBUnNkCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqZWNobyBGb29CQVJiYyBkZWYgRm9vQkFSc2pqIHNGb29CQVJkamhGb29CQVJzZGpoIEZvb0JBUnNkamhGb29CQVJzZFxuWCokLworLS0tCituYW1lOiBoaXN0b3J5LXN1YnN0LTUKK2Rlc2NyaXB0aW9uOgorCU1ha2Ugc3VyZSBzZWFyY2hlcyBkb24ndCBmaW5kIGN1cnJlbnQgKGZjKSBjb21tYW5kCisJKGtzaDg4L2tzaDkzIGRvbid0IGhhdmUgdGhlID8gcHJlZml4IHRoaW5nIHNvIHRoZXkgZmFpbCB0aGlzIHRlc3QpCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGFiYyBkZWYKKwllY2hvIGdoaSBqa2wKKwlmYyAtZSAtIGFiYz1BQiBcP2FiYworZXhwZWN0ZWQtc3Rkb3V0OgorCWFiYyBkZWYKKwlnaGkgamtsCisJQUIgZGVmCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqZWNobyBBQiBkZWZcblgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1lZC0xLW9sZAorZGVzY3JpcHRpb246CisJQmFzaWMgKGVkKSBlZGl0aW5nIHdvcmtzIChhc3N1bWVzIHlvdSBoYXZlIGdlbmVyaWMgZWQgZWRpdG9yCisJdGhhdCBwcmludHMgbm8gcHJvbXB0cykuIFRoaXMgaXMgZm9yIG9sZGlzaCBlZCgxKSB3aGljaCB3cml0ZQorCXRoZSBjaGFyYWN0ZXIgY291bnQgdG8gc3Rkb3V0LgorY2F0ZWdvcnk6IHN0ZG91dC1lZAorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBhYmMgZGVmCisJZmMgZWNobworCXMvYWJjL0ZPT0JBUi8KKwl3CisJcQorZXhwZWN0ZWQtc3Rkb3V0OgorCWFiYyBkZWYKKwkxMworCTE2CisJRk9PQkFSIGRlZgorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL15YKmVjaG8gRk9PQkFSIGRlZlxuWCokLworLS0tCituYW1lOiBoaXN0b3J5LWVkLTItb2xkCitkZXNjcmlwdGlvbjoKKwlDb3JyZWN0IGNvbW1hbmQgaXMgZWRpdGVkIHdoZW4gbnVtYmVyIGdpdmVuCitjYXRlZ29yeTogc3Rkb3V0LWVkCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGxpbmUgMQorCWVjaG8gbGluZSAyIGlzIGhlcmUKKwllY2hvIGxpbmUgMworCWVjaG8gbGluZSA0CisJZmMgMgorCXMvaXMgaGVyZS9pcyBjaGFuZ2VkLworCXcKKwlxCitleHBlY3RlZC1zdGRvdXQ6CisJbGluZSAxCisJbGluZSAyIGlzIGhlcmUKKwlsaW5lIDMKKwlsaW5lIDQKKwkyMAorCTIzCisJbGluZSAyIGlzIGNoYW5nZWQKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCplY2hvIGxpbmUgMiBpcyBjaGFuZ2VkXG5YKiQvCistLS0KK25hbWU6IGhpc3RvcnktZWQtMy1vbGQKK2Rlc2NyaXB0aW9uOgorCU5ld2x5IGNyZWF0ZWQgbXVsdGkgbGluZSBjb21tYW5kcyBzaG93IHVwIGFzIHNpbmdsZSBjb21tYW5kCisJaW4gaGlzdG9yeS4KKwkoTk9URTogYWRqdXN0ZWQgZm9yIENPTVBMRVggSElTVE9SWSBjb21waWxlIHRpbWUgb3B0aW9uKQorCShrc2g4OCBmYWlscyAnY2F1c2UgaXQgbGlzdHMgdGhlIGZjIGNvbW1hbmQpCitjYXRlZ29yeTogc3Rkb3V0LWVkCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwllY2hvIGFiYyBkZWYKKwlmYyBlY2hvCisJcy9hYmMvRk9PQkFSLworCSRhCisJZWNobyBhIG5ldyBsaW5lCisJLgorCXcKKwlxCisJZmMgLWwKK2V4cGVjdGVkLXN0ZG91dDoKKwlhYmMgZGVmCisJMTMKKwkzMgorCUZPT0JBUiBkZWYKKwlhIG5ldyBsaW5lCisJMQllY2hvIGFiYyBkZWYKKwkyCWVjaG8gRk9PQkFSIGRlZgorCTMJZWNobyBhIG5ldyBsaW5lCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqZWNobyBGT09CQVIgZGVmXG5lY2hvIGEgbmV3IGxpbmVcblgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1lZC0xCitkZXNjcmlwdGlvbjoKKwlCYXNpYyAoZWQpIGVkaXRpbmcgd29ya3MgKGFzc3VtZXMgeW91IGhhdmUgZ2VuZXJpYyBlZCBlZGl0b3IKKwl0aGF0IHByaW50cyBubyBwcm9tcHRzKS4gVGhpcyBpcyBmb3IgbmV3aXNoIGVkKDEpIGFuZCBzdGRlcnIuCitjYXRlZ29yeTogIW5vLXN0ZGVyci1lZAorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBhYmMgZGVmCisJZmMgZWNobworCXMvYWJjL0ZPT0JBUi8KKwl3CisJcQorZXhwZWN0ZWQtc3Rkb3V0OgorCWFiYyBkZWYKKwlGT09CQVIgZGVmCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqMTNcbjE2XG5lY2hvIEZPT0JBUiBkZWZcblgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1lZC0yCitkZXNjcmlwdGlvbjoKKwlDb3JyZWN0IGNvbW1hbmQgaXMgZWRpdGVkIHdoZW4gbnVtYmVyIGdpdmVuCitjYXRlZ29yeTogIW5vLXN0ZGVyci1lZAorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBsaW5lIDEKKwllY2hvIGxpbmUgMiBpcyBoZXJlCisJZWNobyBsaW5lIDMKKwllY2hvIGxpbmUgNAorCWZjIDIKKwlzL2lzIGhlcmUvaXMgY2hhbmdlZC8KKwl3CisJcQorZXhwZWN0ZWQtc3Rkb3V0OgorCWxpbmUgMQorCWxpbmUgMiBpcyBoZXJlCisJbGluZSAzCisJbGluZSA0CisJbGluZSAyIGlzIGNoYW5nZWQKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCoyMFxuMjNcbmVjaG8gbGluZSAyIGlzIGNoYW5nZWRcblgqJC8KKy0tLQorbmFtZTogaGlzdG9yeS1lZC0zCitkZXNjcmlwdGlvbjoKKwlOZXdseSBjcmVhdGVkIG11bHRpIGxpbmUgY29tbWFuZHMgc2hvdyB1cCBhcyBzaW5nbGUgY29tbWFuZAorCWluIGhpc3RvcnkuCitjYXRlZ29yeTogIW5vLXN0ZGVyci1lZAorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFFTlY9Li9FbnYhSElTVEZJTEU9aGlzdC5maWxlIQorZmlsZS1zZXR1cDogZmlsZSA2NDQgIkVudiIKKwlQUzE9WAorc3RkaW46CisJZWNobyBhYmMgZGVmCisJZmMgZWNobworCXMvYWJjL0ZPT0JBUi8KKwkkYQorCWVjaG8gYSBuZXcgbGluZQorCS4KKwl3CisJcQorCWZjIC1sCitleHBlY3RlZC1zdGRvdXQ6CisJYWJjIGRlZgorCUZPT0JBUiBkZWYKKwlhIG5ldyBsaW5lCisJMQllY2hvIGFiYyBkZWYKKwkyCWVjaG8gRk9PQkFSIGRlZgorCTMJZWNobyBhIG5ldyBsaW5lCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvXlgqMTNcbjMyXG5lY2hvIEZPT0JBUiBkZWZcbmVjaG8gYSBuZXcgbGluZVxuWCokLworLS0tCituYW1lOiBJRlMtc3BhY2UtMQorZGVzY3JpcHRpb246CisJU2ltcGxlIHRlc3QsIGRlZmF1bHQgSUZTCitzdGRpbjoKKwlzaG93YXJncygpIHsgZm9yIGk7IGRvIGVjaG8gLW4gIiA8JGk+IjsgZG9uZTsgZWNobzsgfQorCXNldCAtLSBBIEIgQworCXNob3dhcmdzIDEgJCoKKwlzaG93YXJncyAyICIkKiIKKwlzaG93YXJncyAzICRACisJc2hvd2FyZ3MgNCAiJEAiCitleHBlY3RlZC1zdGRvdXQ6CisJIDwxPiA8QT4gPEI+IDxDPgorCSA8Mj4gPEEgQiBDPgorCSA8Mz4gPEE+IDxCPiA8Qz4KKwkgPDQ+IDxBPiA8Qj4gPEM+CistLS0KK25hbWU6IElGUy1jb2xvbi0xCitkZXNjcmlwdGlvbjoKKwlTaW1wbGUgdGVzdCwgSUZTPToKK3N0ZGluOgorCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9CisJSUZTPToKKwlzZXQgLS0gQSBCIEMKKwlzaG93YXJncyAxICQqCisJc2hvd2FyZ3MgMiAiJCoiCisJc2hvd2FyZ3MgMyAkQAorCXNob3dhcmdzIDQgIiRAIgorZXhwZWN0ZWQtc3Rkb3V0OgorCSA8MT4gPEE+IDxCPiA8Qz4KKwkgPDI+IDxBOkI6Qz4KKwkgPDM+IDxBPiA8Qj4gPEM+CisJIDw0PiA8QT4gPEI+IDxDPgorLS0tCituYW1lOiBJRlMtbnVsbC0xCitkZXNjcmlwdGlvbjoKKwlTaW1wbGUgdGVzdCwgSUZTPSIiCitzdGRpbjoKKwlzaG93YXJncygpIHsgZm9yIGk7IGRvIGVjaG8gLW4gIiA8JGk+IjsgZG9uZTsgZWNobzsgfQorCUlGUz0iIgorCXNldCAtLSBBIEIgQworCXNob3dhcmdzIDEgJCoKKwlzaG93YXJncyAyICIkKiIKKwlzaG93YXJncyAzICRACisJc2hvd2FyZ3MgNCAiJEAiCitleHBlY3RlZC1zdGRvdXQ6CisJIDwxPiA8QSBCIEM+CisJIDwyPiA8QUJDPgorCSA8Mz4gPEEgQiBDPgorCSA8ND4gPEEgQiBDPgorLS0tCituYW1lOiBJRlMtc3BhY2UtY29sb24tMQorZGVzY3JpcHRpb246CisJU2ltcGxlIHRlc3QsIElGUz08d2hpdGUtc3BhY2U+Ogorc3RkaW46CisJc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KKwlJRlM9IiRJRlM6IgorCXNldCAtLQorCXNob3dhcmdzIDEgJCoKKwlzaG93YXJncyAyICIkKiIKKwlzaG93YXJncyAzICRACisJc2hvd2FyZ3MgNCAiJEAiCisJc2hvd2FyZ3MgNSA6ICIkQCIKK2V4cGVjdGVkLXN0ZG91dDoKKwkgPDE+CisJIDwyPiA8PgorCSA8Mz4KKwkgPDQ+CisJIDw1PiA8Oj4KKy0tLQorbmFtZTogSUZTLXNwYWNlLWNvbG9uLTIKK2Rlc2NyaXB0aW9uOgorCVNpbXBsZSB0ZXN0LCBJRlM9PHdoaXRlLXNwYWNlPjoKKwlBVCZUIGtzaCBmYWlscyB0aGlzLCBQT1NJWCBzYXlzIHRoZSB0ZXN0IGlzIGNvcnJlY3QuCitzdGRpbjoKKwlzaG93YXJncygpIHsgZm9yIGk7IGRvIGVjaG8gLW4gIiA8JGk+IjsgZG9uZTsgZWNobzsgfQorCUlGUz0iJElGUzoiCisJc2V0IC0tCisJc2hvd2FyZ3MgOiIkQCIKK2V4cGVjdGVkLXN0ZG91dDoKKwkgPDo+CistLS0KK25hbWU6IElGUy1zcGFjZS1jb2xvbi0zCitkZXNjcmlwdGlvbjoKKwlTaW1wbGUgdGVzdCwgSUZTPTx3aGl0ZS1zcGFjZT46CisJcGRrc2ggZmFpbHMgYm90aCBvZiB0aGVzZSB0ZXN0cworCW5vdCBzdXJlIHdoZXRoZXIgIzIgaXMgY29ycmVjdAorc3RkaW46CisJc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KKwlJRlM9IiRJRlM6IgorCXg9CisJc2V0IC0tCisJc2hvd2FyZ3MgIiR4JEAiIDEKKwlzaG93YXJncyAiJEAkeCIgMgorZXhwZWN0ZWQtZmFpbDogeWVzCitleHBlY3RlZC1zdGRvdXQ6CisJIDw+IDwxPgorCSA8PiA8Mj4KKy0tLQorbmFtZTogSUZTLXNwYWNlLWNvbG9uLTQKK2Rlc2NyaXB0aW9uOgorCVNpbXBsZSB0ZXN0LCBJRlM9PHdoaXRlLXNwYWNlPjoKK3N0ZGluOgorCXNob3dhcmdzKCkgeyBmb3IgaTsgZG8gZWNobyAtbiAiIDwkaT4iOyBkb25lOyBlY2hvOyB9CisJSUZTPSIkSUZTOiIKKwlzZXQgLS0KKwlzaG93YXJncyAiJEAkQCIKK2V4cGVjdGVkLXN0ZG91dDoKKwkKKy0tLQorbmFtZTogSUZTLXNwYWNlLWNvbG9uLTUKK2Rlc2NyaXB0aW9uOgorCVNpbXBsZSB0ZXN0LCBJRlM9PHdoaXRlLXNwYWNlPjoKKwlEb24ndCBrbm93IHdoYXQgUE9TSVggdGhpbmtzIG9mIHRoaXMuICBBVCZUIGtzaCBkb2VzIG5vdCBkbyB0aGlzLgorc3RkaW46CisJc2hvd2FyZ3MoKSB7IGZvciBpOyBkbyBlY2hvIC1uICIgPCRpPiI7IGRvbmU7IGVjaG87IH0KKwlJRlM9IiRJRlM6IgorCXNldCAtLQorCXNob3dhcmdzICIke0A6LX0iCitleHBlY3RlZC1zdGRvdXQ6CisJIDw+CistLS0KK25hbWU6IElGUy1zdWJzdC0xCitkZXNjcmlwdGlvbjoKKwlTaW1wbGUgdGVzdCwgSUZTPTx3aGl0ZS1zcGFjZT46CitzdGRpbjoKKwlzaG93YXJncygpIHsgZm9yIGk7IGRvIGVjaG8gLW4gIiA8JGk+IjsgZG9uZTsgZWNobzsgfQorCUlGUz0iJElGUzoiCisJeD0iOmI6IDoiCisJZWNobyAtbiAnMTonOyBmb3IgaSBpbiAkeCA7IGRvIGVjaG8gLW4gIiBbJGldIiA7IGRvbmUgOyBlY2hvCisJZWNobyAtbiAnMjonOyBmb3IgaSBpbiA6Yjo6IDsgZG8gZWNobyAtbiAiIFskaV0iIDsgZG9uZSA7IGVjaG8KKwlzaG93YXJncyAzICR4CisJc2hvd2FyZ3MgNCA6Yjo6CisJeD0iYTpiOiIKKwllY2hvIC1uICc1Oic7IGZvciBpIGluICR4IDsgZG8gZWNobyAtbiAiIFskaV0iIDsgZG9uZSA7IGVjaG8KKwlzaG93YXJncyA2ICR4CisJeD0iYTo6YyIKKwllY2hvIC1uICc3Oic7IGZvciBpIGluICR4IDsgZG8gZWNobyAtbiAiIFskaV0iIDsgZG9uZSA7IGVjaG8KKwlzaG93YXJncyA4ICR4CisJZWNobyAtbiAnOTonOyBmb3IgaSBpbiAke0ZPTy1gZWNobyAtbiBoOmlgdGg6ZXJlfSA7IGRvIGVjaG8gLW4gIiBbJGldIiA7IGRvbmUgOyBlY2hvCisJc2hvd2FyZ3MgMTAgJHtGT08tYGVjaG8gLW4gaDppYHRoOmVyZX0KKwlzaG93YXJncyAxMSAiJHtGT08tYGVjaG8gLW4gaDppYHRoOmVyZX0iCisJeD0iIEEgOiAgQjo6RCIKKwllY2hvIC1uICcxMjonOyBmb3IgaSBpbiAkeCA7IGRvIGVjaG8gLW4gIiBbJGldIiA7IGRvbmUgOyBlY2hvCisJc2hvd2FyZ3MgMTMgJHgKK2V4cGVjdGVkLXN0ZG91dDoKKwkxOiBbXSBbYl0gW10KKwkyOiBbOmI6Ol0KKwkgPDM+IDw+IDxiPiA8PgorCSA8ND4gPDpiOjo+CisJNTogW2FdIFtiXQorCSA8Nj4gPGE+IDxiPgorCTc6IFthXSBbXSBbY10KKwkgPDg+IDxhPiA8PiA8Yz4KKwk5OiBbaF0gW2l0aF0gW2VyZV0KKwkgPDEwPiA8aD4gPGl0aD4gPGVyZT4KKwkgPDExPiA8aDppdGg6ZXJlPgorCTEyOiBbQV0gW0JdIFtdIFtEXQorCSA8MTM+IDxBPiA8Qj4gPD4gPEQ+CistLS0KK25hbWU6IGludGVnZXItYmFzZS1lcnItMQorZGVzY3JpcHRpb246CisJQ2FuJ3QgaGF2ZSAwIGJhc2UgKGNhdXNlcyBzaGVsbCB0byBleGl0KQorZXhwZWN0ZWQtZXhpdDogZSAhPSAwCitzdGRpbjoKKwl0eXBlc2V0IC1pIGkKKwlpPTMKKwlpPTAjNAorCWVjaG8gJGkKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eLio6LiowIzQuKlxuJC8KKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLWVyci0yCitkZXNjcmlwdGlvbjoKKwlDYW4ndCBoYXZlIG11bHRpcGxlIGJhc2VzIGluIGEgJ2NvbnN0YW50JyAoY2F1c2VzIHNoZWxsIHRvIGV4aXQpCisJKGtzaDg4IGZhaWxzIHRoaXMgdGVzdCkKK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorc3RkaW46CisJdHlwZXNldCAtaSBpCisJaT0zCisJaT0yIzExMCMxMQorCWVjaG8gJGkKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eLio6LioyIzExMCMxMS4qXG4kLworLS0tCituYW1lOiBpbnRlZ2VyLWJhc2UtZXJyLTMKK2Rlc2NyaXB0aW9uOgorCVN5bnRheCBlcnJvcnMgaW4gZXhwcmVzc2lvbnMgYW5kIGVmZmVjdHMgb24gYmFzZXMKKwkoaW50ZXJhY3RpdmUgc28gZXJyb3JzIGRvbid0IGNhdXNlIGV4aXRzKQorCShrc2g4OCBmYWlscyB0aGlzIHRlc3QgLSBzaGVsbCBleGl0cywgZXZlbiB3aXRoIC1pKQorYXJndW1lbnRzOiAhLWkhCitzdGRpbjoKKwlQUzE9ICMgbWluaW1pc2UgcHJvbXB0IGhhc3NsZXMKKwl0eXBlc2V0IC1pNCBhPTEwCisJdHlwZXNldCAtaSBhPTIrCisJZWNobyAkYQorCXR5cGVzZXQgLWk0IGE9MTAKKwl0eXBlc2V0IC1pMiBhPTIrCisJZWNobyAkYQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL14oWyNcJF0gKT8uKjouKjIrLipcbi4qOi4qMisuKlxuJC8KK2V4cGVjdGVkLXN0ZG91dDoKKwk0IzIyCisJNCMyMgorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2UtZXJyLTQKK2Rlc2NyaXB0aW9uOgorCUFyZSBpbnZhbGlkIGRpZ2l0cyAoYWNjb3JkaW5nIHRvIGJhc2UpIGVycm9ycz8KKwkoa3NoOTMgZmFpbHMgdGhpcyB0ZXN0KQorZXhwZWN0ZWQtZXhpdDogZSAhPSAwCitzdGRpbjoKKwl0eXBlc2V0IC1pIGk7CisJaT0zIzQKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eKFsjXCRdICk/Lio6LiozIzQuKlxuJC8KKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLTEKK2Rlc2NyaXB0aW9uOgorCU1pc3NpbmcgbnVtYmVyIGFmdGVyIGJhc2UgaXMgdHJlYXRlZCBhcyAwLgorc3RkaW46CisJdHlwZXNldCAtaSBpCisJaT0zCisJaT0yIworCWVjaG8gJGkKK2V4cGVjdGVkLXN0ZG91dDoKKwkwCistLS0KK25hbWU6IGludGVnZXItYmFzZS0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayAnc3RpY2t5bmVzcycgb2YgYmFzZSBpbiB2YXJpb3VzIHNpdHVhdGlvbnMKK3N0ZGluOgorCXR5cGVzZXQgLWkgaT04CisJZWNobyAkaQorCWVjaG8gLS0tLS0tLS0tLSBBCisJdHlwZXNldCAtaTQgaj04CisJZWNobyAkagorCWVjaG8gLS0tLS0tLS0tLSBCCisJdHlwZXNldCAtaSBrPTgKKwl0eXBlc2V0IC1pNCBrPTgKKwllY2hvICRrCisJZWNobyAtLS0tLS0tLS0tIEMKKwl0eXBlc2V0IC1pNCBsCisJbD0zIzEwCisJZWNobyAkbAorCWVjaG8gLS0tLS0tLS0tLSBECisJdHlwZXNldCAtaSBtCisJbT0zIzEwCisJZWNobyAkbQorCWVjaG8gLS0tLS0tLS0tLSBFCisJbj0yIzExCisJdHlwZXNldCAtaSBuCisJZWNobyAkbgorCW49MTAKKwllY2hvICRuCisJZWNobyAtLS0tLS0tLS0tIEYKKwl0eXBlc2V0IC1pOCBvPTEyCisJdHlwZXNldCAtaTQgbworCWVjaG8gJG8KKwllY2hvIC0tLS0tLS0tLS0gRworCXR5cGVzZXQgLWkgcAorCWxldCBwPTgjMTIKKwllY2hvICRwCitleHBlY3RlZC1zdGRvdXQ6CisJOAorCS0tLS0tLS0tLS0gQQorCTQjMjAKKwktLS0tLS0tLS0tIEIKKwk0IzIwCisJLS0tLS0tLS0tLSBDCisJNCMzCisJLS0tLS0tLS0tLSBECisJMyMxMAorCS0tLS0tLS0tLS0gRQorCTIjMTEKKwkyIzEwMTAKKwktLS0tLS0tLS0tIEYKKwk0IzMwCisJLS0tLS0tLS0tLSBHCisJOCMxMgorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2UtMworZGVzY3JpcHRpb246CisJTW9yZSBiYXNlIHBhcnNpbmcgKGhtbSBkb2Vzbid0IHRlc3QgbXVjaC4uKQorc3RkaW46CisJdHlwZXNldCAtaSBhYQorCWFhPTErMTIjMTArMgorCWVjaG8gJGFhCisJdHlwZXNldCAtaSBiYgorCWJiPTErJGFhCisJZWNobyAkYmIKKwl0eXBlc2V0IC1pIGJiCisJYmI9JGFhCisJZWNobyAkYmIKKwl0eXBlc2V0IC1pIGNjCisJY2M9JGFhCisJZWNobyAkY2MKK2V4cGVjdGVkLXN0ZG91dDoKKwkxNQorCTE2CisJMTUKKwkxNQorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2UtNAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB0aGluZ3Mgbm90IGRlY2xhcmVkIGFzIGludGVnZXJzIGFyZSBub3QgbWFkZSBpbnRlZ2VycywKKwlhbHNvLCBjaGVjayBpZiBiYXNlIGlzIG5vdCByZXNldCBieSAtaSB3aXRoIG5vIGFyZ3VtZW50cy4KKwkoa3NoOTMgZmFpbHMgLSBwcmludHMgMTAjMjAgLSBnbyBmaWd1cmUpCitzdGRpbjoKKwl4eD0yMAorCWxldCB4eD0xMAorCXR5cGVzZXQgLWkgfCBncmVwICdeeHg9JworCXR5cGVzZXQgLWk0IGE9MTAKKwl0eXBlc2V0IC1pIGE9MjAKKwllY2hvICRhCitleHBlY3RlZC1zdGRvdXQ6CisJNCMxMTAKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLTUKK2Rlc2NyaXB0aW9uOgorCU1vcmUgYmFzZSBzdHVmZgorc3RkaW46CisJdHlwZXNldCAtaTQgYT0zIzEwCisJZWNobyAkYQorCWVjaG8gLS0KKwl0eXBlc2V0IC1pIGo9MworCWo9J34zJworCWVjaG8gJGoKKwllY2hvIC0tCisJdHlwZXNldCAtaSBrPTEKKwl4W2s9aysxXT0zCisJZWNobyAkaworCWVjaG8gLS0KKwl0eXBlc2V0IC1pIGwKKwlmb3IgbCBpbiAxIDIrMyA0OyBkbyBlY2hvICRsOyBkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJNCMzCisJLS0KKwktNAorCS0tCisJMgorCS0tCisJMQorCTUKKwk0CistLS0KK25hbWU6IGludGVnZXItYmFzZS02CitkZXNjcmlwdGlvbjoKKwlFdmVuIG1vcmUgYmFzZSBzdHVmZgorCShrc2g5MyBmYWlscyB0aGlzIHRlc3QgLSBwcmludHMgMCkKK3N0ZGluOgorCXR5cGVzZXQgLWk3IGkKKwlpPQorCWVjaG8gJGkKK2V4cGVjdGVkLXN0ZG91dDoKKwk3IzAKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLTcKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgbm9uLWludGVnZXIgcGFyYW1ldGVycyBkb24ndCBnZXQgYmFzZXMgYXNzaWduZWQKK3N0ZGluOgorCWVjaG8gJCgoIHp6ID0gOCMxMDAgKSkKKwllY2hvICR6egorZXhwZWN0ZWQtc3Rkb3V0OgorCTY0CisJNjQKKy0tLQorbmFtZTogbGluZW5vLXN0ZGluCitkZXNjcmlwdGlvbjoKKwlTZWUgaWYgJExJTkVOTyBpcyB1cGRhdGVkIGFuZCBjYW4gYmUgbW9kaWZpZWQuCitzdGRpbjoKKwllY2hvIEEgJExJTkVOTworCWVjaG8gQiAkTElORU5PCisJTElORU5PPTIwCisJZWNobyBDICRMSU5FTk8KK2V4cGVjdGVkLXN0ZG91dDoKKwlBIDEKKwlCIDIKKwlDIDIwCistLS0KK25hbWU6IGxpbmVuby1pbmMKK2Rlc2NyaXB0aW9uOgorCVNlZSBpZiAkTElORU5PIGlzIHNldCBmb3IgLidkIGZpbGVzLgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImRvdGZpbGUiCisJZWNobyBkb3QgQSAkTElORU5PCisJZWNobyBkb3QgQiAkTElORU5PCisJTElORU5PPTIwCisJZWNobyBkb3QgQyAkTElORU5PCitzdGRpbjoKKwllY2hvIEEgJExJTkVOTworCWVjaG8gQiAkTElORU5PCisJLiAuL2RvdGZpbGUKK2V4cGVjdGVkLXN0ZG91dDoKKwlBIDEKKwlCIDIKKwlkb3QgQSAxCisJZG90IEIgMgorCWRvdCBDIDIwCistLS0KK25hbWU6IGxpbmVuby1mdW5jCitkZXNjcmlwdGlvbjoKKwlTZWUgaWYgJExJTkVOTyBpcyBzZXQgZm9yIGNvbW1hbmRzIGluIGEgZnVuY3Rpb24uCitzdGRpbjoKKwllY2hvIEEgJExJTkVOTworCWVjaG8gQiAkTElORU5PCisJYmFyKCkgeworCSAgICBlY2hvIGZ1bmMgQSAkTElORU5PCisJICAgIGVjaG8gZnVuYyBCICRMSU5FTk8KKwl9CisJYmFyCisJZWNobyBDICRMSU5FTk8KK2V4cGVjdGVkLXN0ZG91dDoKKwlBIDEKKwlCIDIKKwlmdW5jIEEgNAorCWZ1bmMgQiA1CisJQyA4CistLS0KK25hbWU6IGxpbmVuby11bnNldAorZGVzY3JpcHRpb246CisJU2VlIGlmIHVuc2V0dGluZyBMSU5FTk8gbWFrZXMgaXQgbm9uLW1hZ2ljLgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImRvdGZpbGUiCisJZWNobyBkb3QgQSAkTElORU5PCisJZWNobyBkb3QgQiAkTElORU5PCitzdGRpbjoKKwl1bnNldCBMSU5FTk8KKwllY2hvIEEgJExJTkVOTworCWVjaG8gQiAkTElORU5PCisJYmFyKCkgeworCSAgICBlY2hvIGZ1bmMgQSAkTElORU5PCisJICAgIGVjaG8gZnVuYyBCICRMSU5FTk8KKwl9CisJYmFyCisJLiAuL2RvdGZpbGUKKwllY2hvIEMgJExJTkVOTworZXhwZWN0ZWQtc3Rkb3V0OgorCUEKKwlCCisJZnVuYyBBCisJZnVuYyBCCisJZG90IEEKKwlkb3QgQgorCUMKKy0tLQorbmFtZTogbGluZW5vLXVuc2V0LXVzZQorZGVzY3JpcHRpb246CisJU2VlIGlmIHVuc2V0dGluZyBMSU5FTk8gbWFrZXMgaXQgbm9uLW1hZ2ljIGV2ZW4KKwl3aGVuIGl0IGlzIHJlLXVzZWQuCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiZG90ZmlsZSIKKwllY2hvIGRvdCBBICRMSU5FTk8KKwllY2hvIGRvdCBCICRMSU5FTk8KK3N0ZGluOgorCXVuc2V0IExJTkVOTworCUxJTkVOTz0zCisJZWNobyBBICRMSU5FTk8KKwllY2hvIEIgJExJTkVOTworCWJhcigpIHsKKwkgICAgZWNobyBmdW5jIEEgJExJTkVOTworCSAgICBlY2hvIGZ1bmMgQiAkTElORU5PCisJfQorCWJhcgorCS4gLi9kb3RmaWxlCisJZWNobyBDICRMSU5FTk8KK2V4cGVjdGVkLXN0ZG91dDoKKwlBIDMKKwlCIDMKKwlmdW5jIEEgMworCWZ1bmMgQiAzCisJZG90IEEgMworCWRvdCBCIDMKKwlDIDMKKy0tLQorbmFtZTogbGluZW5vLXRyYXAKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIExJTkVOTyBpcyB0cmFja2VkIGluIHRyYXBzCitzdGRpbjoKKwlmYWlsKCkgeworCQllY2hvICJsaW5lIDwkMT4iCisJCWV4aXQgMQorCX0KKwl0cmFwICdmYWlsICRMSU5FTk8nIElOVCBFUlIKKwlmYWxzZQorZXhwZWN0ZWQtc3Rkb3V0OgorCWxpbmUgPDY+CitleHBlY3RlZC1leGl0OiAxCistLS0KK25hbWU6IHJlYWQtSUZTLTEKK2Rlc2NyaXB0aW9uOgorCVNpbXBsZSB0ZXN0LCBkZWZhdWx0IElGUworc3RkaW46CisJZWNobyAiQSBCICIgPiBJTgorCXVuc2V0IHggeSB6CisJcmVhZCB4IHkgeiA8IElOCisJZWNobyAxOiAieFskeF0geVskeV0gelskel0iCisJZWNobyAxYTogJHt6LXogbm90IHNldH0KKwlyZWFkIHggPCBJTgorCWVjaG8gMjogInhbJHhdIgorZXhwZWN0ZWQtc3Rkb3V0OgorCTE6IHhbQV0geVtCXSB6W10KKwkxYToKKwkyOiB4W0EgQl0KKy0tLQorbmFtZTogcmVhZC1rc2gtMQorZGVzY3JpcHRpb246CisJSWYgbm8gdmFyIHNwZWNpZmllZCwgUkVQTFkgaXMgdXNlZAorc3RkaW46CisJZWNobyAiYWJjIiA+IElOCisJcmVhZCA8IElOCisJZWNobyAiWyRSRVBMWV0iOworZXhwZWN0ZWQtc3Rkb3V0OgorCVthYmNdCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMQorZGVzY3JpcHRpb246CisJTGV4IGFycmF5IGNvZGUgaGFkIHByb2JsZW1zIHdpdGggdGhpcy4KK3N0ZGluOgorCWVjaG8gZm9vWworCW49YmFyCisJZWNobyAiaGlbICRuIF09MSIKK2V4cGVjdGVkLXN0ZG91dDoKKwlmb29bCisJaGlbIGJhciBdPTEKKy0tLQorbmFtZTogcmVncmVzc2lvbi0yCitkZXNjcmlwdGlvbjoKKwlXaGVuIFBBVEggaXMgc2V0IGJlZm9yZSBydW5uaW5nIGEgY29tbWFuZCwgdGhlIG5ldyBwYXRoIGlzCisJbm90IHVzZWQgaW4gZG9pbmcgdGhlIHBhdGggc2VhcmNoCisJCSQgZWNobyBlY2hvIGhpID4gL3RtcC9xIDsgY2htb2QgYStyeCAvdG1wL3EKKwkJJCBQQVRIPS90bXAgcQorCQlxOiBub3QgZm91bmQKKwkJJAorCWluIGNvbWV4ZWMoKSB0aGUgdHdvIGxpbmVzCisJCXdoaWxlICgqdnAgIT0gTlVMTCkKKwkJCSh2b2lkKSB0eXBlc2V0KCp2cCsrLCB4eHgsIDApOworCW5lZWQgdG8gYmUgbW92ZWQgb3V0IG9mIHRoZSBzd2l0Y2ggdG8gYmVmb3JlIGZpbmRjb20oKSBpcworCWNhbGxlZCAtIEkgZG9uJ3Qga25vdyB3aGF0IHRoaXMgd2lsbCBicmVhay4KK3N0ZGluOgorCTogJHtQV0Q6LWBwd2QgMj4gL2Rldi9udWxsYH0KKwk6ICR7UFdEOj8iUFdEIG5vdCBzZXQgLSBjYW4ndCBkbyB0ZXN0In0KKwlta2RpciBZCisJY2F0ID4gWS94eHhzY3JpcHQgPDwgRU9GCisJIyEvYmluL3NoCisJIyBOZWVkIHRvIHJlc3RvcmUgcGF0aCBzbyBlY2hvIGNhbiBiZSBmb3VuZCAoc29tZSBzaGVsbHMgZG9uJ3QgaGF2ZQorCSMgaXQgYXMgYSBidWlsdC1pbikKKwlQQVRIPVwkT0xEUEFUSAorCWVjaG8gaGkKKwlleGl0IDAKKwlFT0YKKwljaG1vZCBhK3J4IFkveHh4c2NyaXB0CisJZXhwb3J0IE9MRFBBVEg9IiRQQVRIIgorCVBBVEg9JFBXRC9ZIHh4eHNjcmlwdAorCWV4aXQgJD8KK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorLS0tCituYW1lOiByZWdyZXNzaW9uLTYKK2Rlc2NyaXB0aW9uOgorCVBhcnNpbmcgb2YgJCguLikgZXhwcmVzc2lvbnMgaXMgbm9uLW9wdGltYWwuICBJdCBpcworCWltcG9zc2libGUgdG8gaGF2ZSBhbnkgcGFyZW50aGVzZXMgaW5zaWRlIHRoZSBleHByZXNzaW9uLgorCUkuZS4sCisJCSQga3NoIC1jICdlY2hvICQoZWNobyBcKCApJworCQlubyBjbG9zaW5nIHF1b3RlCisJCSQga3NoIC1jICdlY2hvICQoZWNobyAiKCIgKScKKwkJbm8gY2xvc2luZyBxdW90ZQorCQkkCisJVGhlIHNvbHV0aW9uIGlzIHRvIGhhY2sgdGhlIHBhcnNpbmcgY2xvZGUgaW4gbGV4LmMsIHRoZQorCXF1ZXN0aW9uIGlzIGhvdyB0byBoYWNrIGl0OiBzaG91bGQgYW55IHBhcmVudGhlc2VzIGJlCisJZXNjYXBlZCBieSBhIGJhY2tzbGFzaCwgb3Igc2hvdWxkIHJlY3Vyc2l2ZSBwYXJzaW5nIGJlIGRvbmUKKwkoc28gcXVvdGVzIGNvdWxkIGFsc28gYmUgdXNlZCB0byBoaWRlIGhlbSkuICBUaGUgZm9ybWVyIGlzCisJZWFzaWVyLCB0aGUgbGF0ZXIgYmV0dGVyLi4uCitzdGRpbjoKKwllY2hvICQoZWNobyBcKCkKK2V4cGVjdGVkLXN0ZG91dDoKKwkoCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tOQorZGVzY3JpcHRpb246CisJQ29udGludWUgaW4gYSBmb3IgbG9vcCBkb2VzIG5vdCB3b3JrIHJpZ2h0OgorCQlmb3IgaSBpbiBhIGIgYyA7IGRvCisJCQlpZiBbICRpID0gYiBdIDsgdGhlbgorCQkJCWNvbnRpbnVlCisJCQlmaQorCQkJZWNobyAkaQorCQlkb25lCisJUHJpbnRzIGEgZm9yZXZlci4uLgorc3RkaW46CisJZmlyc3Q9eWVzCisJZm9yIGkgaW4gYSBiIGMgOyBkbworCQlpZiBbICRpID0gYiBdIDsgdGhlbgorCQkJaWYgWyAkZmlyc3QgPSBubyBdIDsgdGhlbgorCQkJCWVjaG8gJ2NvbnRpbnVlIGluIGZvciBsb29wIGJyb2tlbicKKwkJCQlicmVhawkjIGhvcGUgYnJlYWsgaXNuJ3QgYnJva2VuIHRvbyA6LSkKKwkJCWZpCisJCQlmaXJzdD1ubworCQkJY29udGludWUKKwkJZmkKKwlkb25lCisJZWNobyBieWUKK2V4cGVjdGVkLXN0ZG91dDoKKwlieWUKKy0tLQorbmFtZTogcmVncmVzc2lvbi0xMAorZGVzY3JpcHRpb246CisJVGhlIGZvbGxvd2luZzoKKwkJc2V0IC0tIGBmYWxzZWAKKwkJZWNobyAkPworCXNob3VsZCBwcmludCAwIGFjY29yZGluZyB0byBQT1NJWCAoZGFzaCwgYmFzaCwga3NoOTMsIHBvc2gpCisJYnV0IG5vdCAwIGFjY29yZGluZyB0byB0aGUgZ2V0b3B0KDEpIG1hbnVhbCBwYWdlLCBrc2g4OCwgYW5kCisJQm91cm5lIHNoIChzdWNoIGFzIC9iaW4vc2ggb24gU29sYXJpcykuCisJSW4gbWtzaCBSMzliLCB3ZSBob25vdXIgUE9TSVggZXhjZXB0IHdoZW4gLW8gc2ggaXMgc2V0Lgorc3RkaW46CisJc2hvd2YoKSB7CisJCVtbIC1vIHBvc2l4IF1dOyBGUE9TSVg9JCgoMS0kPykpCisJCVtbIC1vIHNoIF1dOyBGU0g9JCgoMS0kPykpCisJCWVjaG8gLW4gIkZQT1NJWD0kRlBPU0lYIEZTSD0kRlNIICIKKwl9CisJc2V0ICtvIHBvc2l4ICtvIHNoCisJc2hvd2YKKwlzZXQgLS0gYGZhbHNlYAorCWVjaG8gcnY9JD8KKwlzZXQgLW8gc2gKKwlzaG93ZgorCXNldCAtLSBgZmFsc2VgCisJZWNobyBydj0kPworCXNldCAtbyBwb3NpeAorCXNob3dmCisJc2V0IC0tIGBmYWxzZWAKKwllY2hvIHJ2PSQ/CitleHBlY3RlZC1zdGRvdXQ6CisJRlBPU0lYPTAgRlNIPTAgcnY9MAorCUZQT1NJWD0wIEZTSD0xIHJ2PTEKKwlGUE9TSVg9MSBGU0g9MCBydj0wCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMTEKK2Rlc2NyaXB0aW9uOgorCVRoZSBmb2xsb3dpbmc6CisJCXg9L2Zvby9iYXIvYmxhaAorCQllY2hvICR7eCMjKi99CisJc2hvdWxkIGVjaG8gYmxhaCBidXQgb24gc29tZSBtYWNoaW5lcyBlY2hvcyAvZm9vL2Jhci9ibGFoLgorc3RkaW46CisJeD0vZm9vL2Jhci9ibGFoCisJZWNobyAke3gjIyovfQorZXhwZWN0ZWQtc3Rkb3V0OgorCWJsYWgKKy0tLQorbmFtZTogcmVncmVzc2lvbi0xMgorZGVzY3JpcHRpb246CisJQm90aCBvZiB0aGUgZm9sbG93aW5nIGVjaG9zIHByb2R1Y2UgdGhlIHNhbWUgb3V0cHV0IHVuZGVyIHNoL2tzaC5hdHQ6CisJCSMhL2Jpbi9zaAorCQl4PSJmb28JYmFyIgorCQllY2hvICJgZWNobyBcIiR4XCJgIgorCQllY2hvICJgZWNobyAiJHgiYCIKKwlwZGtzaCBwcm9kdWNlcyBkaWZmZXJlbnQgb3V0cHV0IGZvciB0aGUgZm9ybWVyIChmb28gaW5zdGVhZCBvZiBmb29cdGJhcikKK3N0ZGluOgorCXg9ImZvbwliYXIiCisJZWNobyAiYGVjaG8gXCIkeFwiYCIKKwllY2hvICJgZWNobyAiJHgiYCIKK2V4cGVjdGVkLXN0ZG91dDoKKwlmb28JYmFyCisJZm9vCWJhcgorLS0tCituYW1lOiByZWdyZXNzaW9uLTEzCitkZXNjcmlwdGlvbjoKKwlUaGUgZm9sbG93aW5nIGNvbW1hbmQgaGFuZ3MgZm9yZXZlcjoKKwkJJCAoOiA7IGNhdCAvZXRjL3Rlcm1jYXApIHwgc2xlZXAgMgorCVRoaXMgaXMgYmVjYXVzZSB0aGUgc2hlbGwgZm9ya3MgYSBzaGVsbCB0byBydW4gdGhlICguLikgY29tbWFuZAorCWFuZCB0aGlzIHNoZWxsIGhhcyB0aGUgcGlwZSBvcGVuLiAgV2hlbiB0aGUgc2xlZXAgZGllcywgdGhlIGNhdAorCWRvZXNuJ3QgZ2V0IGEgU0lHUElQRSAnY2F1c2UgYSBwcm9jZXNzIChpZSwgdGhlIHNlY29uZCBzaGVsbCkKKwlzdGlsbCBoYXMgdGhlIHBpcGUgb3Blbi4KKwkKKwlOT1RFOiB0aGlzIHRlc3QgcHJvdm9rZXMgYSBiaXphcnJlIGJ1ZyBpbiBrc2g5MyAoc2hlbGwgc3RhcnRzIHJlYWRpbmcKKwkgICAgICBjb21tYW5kcyBmcm9tIC9ldGMvdGVybWNhcC4uKQordGltZS1saW1pdDogMTAKK3N0ZGluOgorCWVjaG8gQSBsaW5lIG9mIHRleHQgdGhhdCB3aWxsIGJlIGR1cGxpY2F0ZWQgcXVpdGUgYSBudW1iZXIgb2YgdGltZXMuPiB0MQorCWNhdCB0MSB0MSB0MSB0MSAgdDEgdDEgdDEgdDEgIHQxIHQxIHQxIHQxICB0MSB0MSB0MSB0MSAgPiB0MgorCWNhdCB0MiB0MiB0MiB0MiAgdDIgdDIgdDIgdDIgIHQyIHQyIHQyIHQyICB0MiB0MiB0MiB0MiAgPiB0MQorCWNhdCB0MSB0MSB0MSB0MSA+IHQyCisJKDogOyBjYXQgdDIgMj4mLSkgfCBzbGVlcCAxCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMTQKK2Rlc2NyaXB0aW9uOgorCVRoZSBjb21tYW5kCisJCSQgKGZvb2JhcikgMj4gL2Rldi9udWxsCisJZ2VuZXJhdGVzIG5vIG91dHB1dCB1bmRlciAvYmluL3NoLCBidXQgcGRrc2ggcHJvZHVjZXMgdGhlIGVycm9yCisJCWZvb2Jhcjogbm90IGZvdW5kCisJQWxzbywgdGhlIGNvbW1hbmQKKwkJJCBmb29iYXIgMj4gL2Rldi9udWxsCisJZ2VuZXJhdGVzIGFuIGVycm9yIHVuZGVyIC9iaW4vc2ggYW5kIHBka3NoLCBidXQgQVQmVCBrc2g4OCBwcm9kdWNlcworCW5vIGVycm9yIChyZWRpcmVjdGVkIHRvIC9kZXYvbnVsbCkuCitzdGRpbjoKKwkoeW91L3Nob3VsZC9ub3Qvc2VlL3RoaXMvZXJyb3IvMSkgMj4gL2Rldi9udWxsCisJeW91L3Nob3VsZC9ub3Qvc2VlL3RoaXMvZXJyb3IvMiAyPiAvZGV2L251bGwKKwl0cnVlCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMTUKK2Rlc2NyaXB0aW9uOgorCVRoZSBjb21tYW5kCisJCSQgd2hlbmNlIGZvb2JhcgorCWdlbmVyYXRlcyBhIGJsYW5rIGxpbmUgdW5kZXIgcGRrc2ggYW5kIHNldHMgdGhlIGV4aXQgc3RhdHVzIHRvIDAuCisJQVQmVCBrc2g4OCBnZW5lcmF0ZXMgbm8gb3V0cHV0IGFuZCBzZXRzIHRoZSBleGl0IHN0YXR1cyB0byAxLiAgQWxzbywKKwl0aGUgY29tbWFuZAorCQkkIHdoZW5jZSBmb29iYXIgY2F0CisJZ2VuZXJhdGVzIG5vIG91dHB1dCB1bmRlciBBVCZUIGtzaDg4IChwZGtzaCBnZW5lcmF0ZXMgYSBibGFuayBsaW5lCisJYW5kIC9iaW4vY2F0KS4KK3N0ZGluOgorCXdoZW5jZSBkb2VzL25vdC9leGlzdCA+IC9kZXYvbnVsbAorCWVjaG8gMTogJD8KKwllY2hvIDI6ICQod2hlbmNlIGRvZXMvbm90L2V4aXN0IHwgd2MgLWwpCisJZWNobyAzOiAkKHdoZW5jZSBkb2VzL25vdC9leGlzdCBjYXQgfCB3YyAtbCkKK2V4cGVjdGVkLXN0ZG91dDoKKwkxOiAxCisJMjogMAorCTM6IDAKKy0tLQorbmFtZTogcmVncmVzc2lvbi0xNgorZGVzY3JpcHRpb246CisJJHt2YXIlJWV4cHJ9IHNlZW1zIHRvIGJlIGJyb2tlbiBpbiBtYW55IHBsYWNlcy4gIE9uIHRoZSBtaXBzCisJdGhlIGNvbW1hbmRzCisJCSQgcmVhZCBsaW5lIDwgL2V0Yy9wYXNzd2QKKwkJJCBlY2hvICRsaW5lCisJCXJvb3Q6MDoxOi4uLgorCQkkIGVjaG8gJHtsaW5lJSU6Kn0KKwkJcm9vdAorCQkkIGVjaG8gJGxpbmUKKwkJcm9vdAorCQkkCisJY2hhbmdlIHRoZSB2YWx1ZSBvZiBsaW5lLiAgT24gc3VuNHMgJiBwYXMsIHRoZSBlY2hvICR7bGluZSUlOip9IGRvZXNuJ3QKKwl3b3JrLiAgSGF2ZW4ndCBjaGVja2VkIGVsc2V3aGVyZS4uLgorc2NyaXB0OgorCXJlYWQgeAorCXk9JHgKKwllY2hvICR7eCUlOip9CisJZWNobyAkeAorc3RkaW46CisJcm9vdDphc2RqaGFzZGFzamhzOjA6MTpSb290Oi86L2Jpbi9zaAorZXhwZWN0ZWQtc3Rkb3V0OgorCXJvb3QKKwlyb290OmFzZGpoYXNkYXNqaHM6MDoxOlJvb3Q6LzovYmluL3NoCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMTcKK2Rlc2NyaXB0aW9uOgorCVRoZSBjb21tYW5kCisJCS4gL2Zvby9iYXIKKwlzaG91bGQgc2V0IHRoZSBleGl0IHN0YXR1cyB0byBub24temVybyAoc2ggYW5kIEFUJlQga3NoODggZG8pLgorCVhYWCBkb3RpbmcgYSBub24gZXhpc3RlbnQgZmlsZSBpcyBhIGZhdGFsIGVycm9yIGZvciBhIHNjcmlwdAorc3RkaW46CisJLiBkb2VzL25vdC9leGlzdAorZXhwZWN0ZWQtZXhpdDogZSAhPSAwCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjogLy4/LworLS0tCituYW1lOiByZWdyZXNzaW9uLTE5CitkZXNjcmlwdGlvbjoKKwlCb3RoIG9mIHRoZSBmb2xsb3dpbmcgZWNob3Mgc2hvdWxkIHByb2R1Y2UgdGhlIHNhbWUgdGhpbmcsIGJ1dCBkb24ndDoKKwkJJCB4PWZvby9iYXIKKwkJJCBlY2hvICR7eCUvKn0KKwkJZm9vCisJCSQgZWNobyAiJHt4JS8qfSIKKwkJZm9vL2Jhcgorc3RkaW46CisJeD1mb28vYmFyCisJZWNobyAiJHt4JS8qfSIKK2V4cGVjdGVkLXN0ZG91dDoKKwlmb28KKy0tLQorbmFtZTogcmVncmVzc2lvbi0yMQorZGVzY3JpcHRpb246CisJYmFja3NsYXNoIGRvZXMgbm90IHdvcmsgYXMgZXhwZWN0ZWQgaW4gY2FzZSBsYWJlbHM6CisJJCB4PScteCcKKwkkIGNhc2UgJHggaW4KKwktXD8pIGVjaG8gaGkKKwllc2FjCisJaGkKKwkkIHg9Jy0/JworCSQgY2FzZSAkeCBpbgorCS1cXD8pIGVjaG8gaGkKKwllc2FjCisJaGkKKwkkCitzdGRpbjoKKwljYXNlIC14IGluCisJLVw/KQllY2hvIGZhaWwKKwllc2FjCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMjIKK2Rlc2NyaXB0aW9uOgorCVF1b3RpbmcgYmFja3F1b3RlcyBpbnNpZGUgYmFja3F1b3RlcyBkb2Vzbid0IHdvcms6CisJJCBlY2hvIGBlY2hvIGhpIFxgZWNobyB0aGVyZVxgIGZvbGtzYAorCWFza3MgZm9yIG1vcmUgaW5mby4gIHNoIGFuZCBBVCZUIGtzaDg4IGJvdGggZWNobworCWhpIHRoZXJlIGZvbGtzCitzdGRpbjoKKwllY2hvIGBlY2hvIGhpIFxgZWNobyB0aGVyZVxgIGZvbGtzYAorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpIHRoZXJlIGZvbGtzCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMjMKK2Rlc2NyaXB0aW9uOgorCSkpIGlzIG5vdCB0cmVhdGVkIGBjb3JyZWN0bHknOgorCSAgICAkIChlY2hvIGhpIDsgKGVjaG8gdGhlcmUgOyBlY2hvIGZvbGtzKSkKKwkgICAgbWlzc2luZyAoKAorCSAgICAkCisJaW5zdGVhZCBvZiAoYXMgc2ggYW5kIGtzaC5hdHQpCisJICAgICQgKGVjaG8gaGkgOyAoZWNobyB0aGVyZSA7IGVjaG8gZm9sa3MpKQorCSAgICBoaQorCSAgICB0aGVyZQorCSAgICBmb2xrcworCSAgICAkCitzdGRpbjoKKwkoIDogOyAoIDogOyBlY2hvIGhpKSkKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorLS0tCituYW1lOiByZWdyZXNzaW9uLTI1CitkZXNjcmlwdGlvbjoKKwlDaGVjayByZWFkaW5nIHN0ZGluIGluIGEgd2hpbGUgbG9vcC4gIFRoZSByZWFkIHNob3VsZCBvbmx5IHJlYWQKKwlhIHNpbmdsZSBsaW5lLCBub3QgYSB3aG9sZSBzdGRpbyBidWZmZXI7IHRoZSBjYXQgc2hvdWxkIGdldAorCXRoZSByZXN0Lgorc3RkaW46CisJKGVjaG8gYTsgZWNobyBiKSB8IHdoaWxlIHJlYWQgeCA7IGRvCisJICAgIGVjaG8gJHgKKwkgICAgY2F0ID4gL2Rldi9udWxsCisJZG9uZQorZXhwZWN0ZWQtc3Rkb3V0OgorCWEKKy0tLQorbmFtZTogcmVncmVzc2lvbi0yNgorZGVzY3JpcHRpb246CisJQ2hlY2sgcmVhZGluZyBzdGRpbiBpbiBhIHdoaWxlIGxvb3AuICBUaGUgcmVhZCBzaG91bGQgcmVhZCBib3RoCisJbGluZXMsIG5vdCBqdXN0IHRoZSBmaXJzdC4KK3NjcmlwdDoKKwlhPQorCXdoaWxlIFsgIiRhIiAhPSB4eHggXSA7IGRvCisJICAgIGxhc3Q9JHgKKwkgICAgcmVhZCB4CisJICAgIGNhdCAvZGV2L251bGwgfCBzZWQgJ3MveC95LycKKwkgICAgYT14JGEKKwlkb25lCisJZWNobyAkbGFzdAorc3RkaW46CisJYQorCWIKK2V4cGVjdGVkLXN0ZG91dDoKKwliCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMjcKK2Rlc2NyaXB0aW9uOgorCVRoZSBjb21tYW5kCisJCS4gL2RvZXMvbm90L2V4aXN0CisJc2hvdWxkIGNhdXNlIGEgc2NyaXB0IHRvIGV4aXQuCitzdGRpbjoKKwkuIGRvZXMvbm90L2V4aXN0CisJZWNobyBoaQorZXhwZWN0ZWQtZXhpdDogZSAhPSAwCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjogL2RvZXNcL25vdFwvZXhpc3QvCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMjgKK2Rlc2NyaXB0aW9uOgorCXZhcmlhYmxlIGFzc2lnbmVtZW50cyBub3QgZGV0ZWN0ZWQgd2VsbAorc3RkaW46CisJYS54PTEgZWNobyBoaQorZXhwZWN0ZWQtZXhpdDogZSAhPSAwCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjogL2FcLng9MS8KKy0tLQorbmFtZTogcmVncmVzc2lvbi0yOQorZGVzY3JpcHRpb246CisJYWxpYXMgZXhwYW5zaW9uIGRpZmZlcmVudCBmcm9tIEFUJlQga3NoODgKK3N0ZGluOgorCWFsaWFzIGE9J2ZvciAnIGI9J2kgaW4nCisJYSBiIGhpIDsgZG8gZWNobyAkaSA7IGRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorLS0tCituYW1lOiByZWdyZXNzaW9uLTMwCitkZXNjcmlwdGlvbjoKKwlzdHJhbmdlIGNoYXJhY3RlcnMgYWxsb3dlZCBpbnNpZGUgJHsuLi59CitzdGRpbjoKKwllY2hvICR7YXtifX0KK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC8uPy8KKy0tLQorbmFtZTogcmVncmVzc2lvbi0zMQorZGVzY3JpcHRpb246CisJRG9lcyByZWFkIGhhbmRsZSBwYXJ0aWFsIGxpbmVzIGNvcnJlY3RseQorc2NyaXB0OgorCWE9IHJldD0KKwl3aGlsZSBbICIkYSIgIT0geHh4IF0gOyBkbworCSAgICByZWFkIHggeSB6CisJICAgIHJldD0kPworCSAgICBhPXgkYQorCWRvbmUKKwllY2hvICJbJHhdIgorCWVjaG8gJHJldAorc3RkaW46ICEKKwlhIEEgYUEKKwliIEIgQmIKKwljCitleHBlY3RlZC1zdGRvdXQ6CisJW2NdCisJMQorLS0tCituYW1lOiByZWdyZXNzaW9uLTMyCitkZXNjcmlwdGlvbjoKKwlEb2VzIHJlYWQgc2V0IHZhcmlhYmxlcyB0byBudWxsIGF0IGVvZj8KK3NjcmlwdDoKKwlhPQorCXdoaWxlIFsgIiRhIiAhPSB4eHggXSA7IGRvCisJICAgIHJlYWQgeCB5IHoKKwkgICAgYT14JGEKKwlkb25lCisJZWNobyAxOiAke3gteCBub3Qgc2V0fSAke3kteSBub3Qgc2V0fSAke3oteiBub3Qgc2V0fQorCWVjaG8gMjogJHt4Oit4IG5vdCBudWxsfSAke3k6K3kgbm90IG51bGx9ICR7ejoreiBub3QgbnVsbH0KK3N0ZGluOgorCWEgQSBBYQorCWIgQiBCYgorZXhwZWN0ZWQtc3Rkb3V0OgorCTE6CisJMjoKKy0tLQorbmFtZTogcmVncmVzc2lvbi0zMworZGVzY3JpcHRpb246CisJRG9lcyB1bWFzayBwcmludCBhIGxlYWRpbmcgMCB3aGVuIHVtYXNrIGlzIDMgZGlnaXRzPworc3RkaW46CisJdW1hc2sgMjIyCisJdW1hc2sKK2V4cGVjdGVkLXN0ZG91dDoKKwkwMjIyCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMzUKK2Rlc2NyaXB0aW9uOgorCVRlbXBvcnkgZmlsZXMgdXNlZCBmb3IgaGVyZS1kb2NzIGluIGZ1bmN0aW9ucyBnZXQgdHJhc2hlZCBhZnRlcgorCXRoZSBmdW5jdGlvbiBpcyBwYXJzZWQgKGJlZm9yZSBpdCBpcyBleGVjdXRlZCkKK3N0ZGluOgorCWYxKCkgeworCQljYXQgPDwtIEVPRgorCQkJRjEKKwkJRU9GCisJCWYyKCkgeworCQkJY2F0IDw8LSBFT0YKKwkJCQlGMgorCQkJRU9GCisJCX0KKwl9CisJZjEKKwlmMgorCXVuc2V0IC1mIGYxCisJZjIKK2V4cGVjdGVkLXN0ZG91dDoKKwlGMQorCUYyCisJRjIKKy0tLQorbmFtZTogcmVncmVzc2lvbi0zNgorZGVzY3JpcHRpb246CisJQ29tbWFuZCBzdWJzdGl0dXRpb24gYnJlYWtzIHJlYWRpbmcgaW4gd2hpbGUgbG9vcAorCSh0ZXN0IGZyb20gPHNqZ0B2b2lkLnplbi5vei5hdT4pCitzdGRpbjoKKwkoZWNobyBhYmNkZWY7IGVjaG87IGVjaG8gMTIzKSB8CisJICAgIHdoaWxlIHJlYWQgbGluZQorCSAgICBkbworCSAgICAgICMgdGhlIGZvbGxvd2luZyBsaW5lIGJyZWFrcyBpdAorCSAgICAgIGM9YGVjaG8gJGxpbmUgfCB3YyAtY2AKKwkgICAgICBlY2hvICRjCisJICAgIGRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwk3CisJMQorCTQKKy0tLQorbmFtZTogcmVncmVzc2lvbi0zNworZGVzY3JpcHRpb246CisJTWFjaGluZXMgd2l0aCBicm9rZW4gdGltZXMoKSAocmVwb3J0ZWQgYnkgPHNqZ0B2b2lkLnplbi5vei5hdT4pCisJdGltZSBkb2VzIG5vdCByZXBvcnQgY29ycmVjdCByZWFsIHRpbWUKK3N0ZGluOgorCXRpbWUgc2xlZXAgMQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46ICEvXlxzKjBcLjBbXHNcZF0rcmVhbHxeXHMqcmVhbFtcc10rMCtcLjAvCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMzgKK2Rlc2NyaXB0aW9uOgorCXNldCAtZSBkb2Vzbid0IGlnbm9yZSBleGl0IGNvZGVzIGZvciBpZi93aGlsZS91bnRpbC8mJi98fC8hLgorYXJndW1lbnRzOiAhLWUhCitzdGRpbjoKKwlpZiBmYWxzZTsgdGhlbiBlY2hvIGhpIDsgZmkKKwlmYWxzZSB8fCB0cnVlCisJZmFsc2UgJiYgdHJ1ZQorCXdoaWxlIGZhbHNlOyBkbyBlY2hvIGhpOyBkb25lCisJZWNobyBvaworZXhwZWN0ZWQtc3Rkb3V0OgorCW9rCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tMzkKK2Rlc2NyaXB0aW9uOgorCXNldCAtZTogZXJyb3JzIGluIGNvbW1hbmQgc3Vic3RpdHV0aW9ucyBhcmVuJ3QgaWdub3JlZAorCU5vdCBjbGVhciBpZiB0aGV5IHNob3VsZCBiZSBvciBub3QuLi4gYmFzaCBwYXNzZXMgaGVyZQorCXRoaXMgbWF5IGFjdHVhbGx5IGJlIHJlcXVpcmVkIGZvciBtYWtlLCBzbyBjaGFuZ2VkIHRoZQorCXRlc3QgdG8gbWFrZSB0aGlzIGFuIG1rc2ggZmVhdHVyZSwgbm90IGEgYnVnCithcmd1bWVudHM6ICEtZSEKK3N0ZGluOgorCWVjaG8gYGZhbHNlOyBlY2hvIGhpYAorI2V4cGVjdGVkLWZhaWw6IHllcworI2V4cGVjdGVkLXN0ZG91dDoKKyMJaGkKK2V4cGVjdGVkLXN0ZG91dDoKKwkKKy0tLQorbmFtZTogcmVncmVzc2lvbi00MAorZGVzY3JpcHRpb246CisJVGhpcyB1c2VkIHRvIGNhdXNlIGEgY29yZSBkdW1wCitlbnYtc2V0dXA6ICFSQU5ET009MTIhCitzdGRpbjoKKwllY2hvIGhpCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKy0tLQorbmFtZTogcmVncmVzc2lvbi00MQorZGVzY3JpcHRpb246CisJZm9vIHNob3VsZCBiZSBzZXQgdG8gYmFyIChzaG91bGQgbm90IGJlIGVtcHR5KQorc3RkaW46CisJZm9vPWAKKwllY2hvIGJhcmAKKwllY2hvICIoJGZvbykiCitleHBlY3RlZC1zdGRvdXQ6CisJKGJhcikKKy0tLQorbmFtZTogcmVncmVzc2lvbi00MgorZGVzY3JpcHRpb246CisJQ2FuJ3QgdXNlIGNvbW1hbmQgbGluZSBhc3NpZ25tZW50cyB0byBhc3NpZ24gcmVhZG9ubHkgcGFyYW1ldGVycy4KK3N0ZGluOgorCWZvbz1iYXIKKwlyZWFkb25seSBmb28KKwlmb289c3R1ZmYgZW52IHwgZ3JlcCAnXmZvbycKK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLy4qcmVhZCAqb25seS4qLworLS0tCituYW1lOiByZWdyZXNzaW9uLTQzCitkZXNjcmlwdGlvbjoKKwlDYW4gc3Vic2hlbGxzIGJlIHByZWZpeGVkIGJ5IHJlZGlyZWN0aW9ucyAoaGlzdG9yaWNhbCBzaGVsbHMgYWxsb3cKKwl0aGlzKQorc3RkaW46CisJPCAvZGV2L251bGwgKHNlZCAncy9eL1gvJykKKy0tLQorbmFtZTogcmVncmVzc2lvbi00NQorZGVzY3JpcHRpb246CisJUGFyYW1ldGVyIGFzc2lnbm1lbnRzIHdpdGggW10gcmVjb2duaXNlZCBjb3JyZWN0bHkKK3N0ZGluOgorCUZPTz0qWzEyXQorCUJBUj1hYmNbCisJTU9SRT1bYWJjXQorCUpVTks9YVtiYworCWVjaG8gIjwkRk9PPiIKKwllY2hvICI8JEJBUj4iCisJZWNobyAiPCRNT1JFPiIKKwllY2hvICI8JEpVTks+IgorZXhwZWN0ZWQtc3Rkb3V0OgorCTwqWzEyXT4KKwk8YWJjWz4KKwk8W2FiY10+CisJPGFbYmM+CistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNDYKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYWxpYXMgZXhwYW5zaW9uIHdvcmtzIGluIGNvbW1hbmQgc3Vic3RpdHV0aW9ucyBhbmQKKwlhdCB0aGUgZW5kIG9mIGZpbGUuCitzdGRpbjoKKwlhbGlhcyB4PSdlY2hvIGhpJworCUZPTz0iYHhgICIKKwllY2hvICJbJEZPT10iCisJeAorZXhwZWN0ZWQtc3Rkb3V0OgorCVtoaSBdCisJaGkKKy0tLQorbmFtZTogcmVncmVzc2lvbi00NworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBhbGlhc2VzIGFyZSBmdWxseSByZWFkLgorc3RkaW46CisJYWxpYXMgeD0nZWNobyBoaTsKKwllY2hvIHRoZXJlJworCXgKKwllY2hvIGRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorCXRoZXJlCisJZG9uZQorLS0tCituYW1lOiByZWdyZXNzaW9uLTQ4CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IChoZXJlIGRvYykgdGVtcCBmaWxlcyBhcmUgbm90IGxlZnQgYmVoaW5kIGFmdGVyIGFuIGV4ZWMuCitzdGRpbjoKKwlta2RpciBmb28gfHwgZXhpdCAxCisJVE1QRElSPSRQV0QvZm9vICIkX19wcm9nbmFtZSIgPDwtICdFT0YnCisJCXgoKSB7CisJCQlzZWQgJ3MvXi9YIC8nIDw8IEVfT19GCisJCQloaQorCQkJdGhlcmUKKwkJCWZvbGtzCisJCQlFX09fRgorCQkJZWNobyAiZG9uZSAoJD8pIgorCQl9CisJCWVjaG89ZWNobzsgWyAteCAvYmluL2VjaG8gXSAmJiBlY2hvPS9iaW4vZWNobworCQlleGVjICRlY2hvIHN1YnRlc3QtMSBoaQorCUVPRgorCWVjaG8gc3VidGVzdC0xIGZvby8qCisJVE1QRElSPSRQV0QvZm9vICIkX19wcm9nbmFtZSIgPDwtICdFT0YnCisJCWVjaG89ZWNobzsgWyAteCAvYmluL2VjaG8gXSAmJiBlY2hvPS9iaW4vZWNobworCQlzZWQgJ3MvXi9YIC8nIDw8IEVfT19GOyBleGVjICRlY2hvIHN1YnRlc3QtMiBoaQorCQlhCisJCWZldworCQlsaW5lcworCQlFX09fRgorCUVPRgorCWVjaG8gc3VidGVzdC0yIGZvby8qCitleHBlY3RlZC1zdGRvdXQ6CisJc3VidGVzdC0xIGhpCisJc3VidGVzdC0xIGZvby8qCisJWCBhCisJWCBmZXcKKwlYIGxpbmVzCisJc3VidGVzdC0yIGhpCisJc3VidGVzdC0yIGZvby8qCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNDkKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdW5zZXQgcGFyYW1zIHdpdGggYXR0cmlidXRlcyBhcmUgcmVwb3J0ZWQgYnkgc2V0LCB0aG9zZQorCXNhbnMgYXR0cmlidXRlcyBhcmUgbm90Lgorc3RkaW46CisJdW5zZXQgRk9PIEJBUgorCWVjaG8gWCRGT08KKwlleHBvcnQgQkFSCisJdHlwZXNldCAtaSBCTEFICisJc2V0IHwgZ3JlcCBGT08KKwlzZXQgfCBncmVwIEJBUgorCXNldCB8IGdyZXAgQkxBSAorZXhwZWN0ZWQtc3Rkb3V0OgorCVgKKwlCQVIKKwlCTEFICistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNTAKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgYWxpYXNlcyBkbyBub3QgdXNlIGNvbnRpbnVhdGlvbiBwcm9tcHQgYWZ0ZXIgdHJhaWxpbmcKKwlzZW1pLWNvbG9uLgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImVudiIKKwlQUzE9WQorCVBTMj1YCitlbnYtc2V0dXA6ICFFTlY9Li9lbnYhCithcmd1bWVudHM6ICEtaSEKK3N0ZGluOgorCWFsaWFzIGZvbz0nZWNobyBoaSA7ICcKKwlmb28KKwlmb28gZWNobyB0aGVyZQorZXhwZWN0ZWQtc3Rkb3V0OgorCWhpCisJaGkKKwl0aGVyZQorZXhwZWN0ZWQtc3RkZXJyOiAhCisJWVlZWQorLS0tCituYW1lOiByZWdyZXNzaW9uLTUxCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHNldCBhbGxvd3MgYm90aCArbyBhbmQgLW8gb3B0aW9ucyBvbiBzYW1lIGNvbW1hbmQgbGluZS4KK3N0ZGluOgorCXNldCBhIGIgYworCXNldCAtbyBub2dsb2IgK28gYWxsZXhwb3J0CisJZWNobyBBOiAkKiwgKgorZXhwZWN0ZWQtc3Rkb3V0OgorCUE6IGEgYiBjLCAqCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgZ2xvYmJpbmcgd29ya3MgaW4gcGlwZWxpbmVkIGNvbW1hbmRzCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiZW52IgorCVBTMT1QCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiYWJjIgorCXN0dWZmCitlbnYtc2V0dXA6ICFFTlY9Li9lbnYhCithcmd1bWVudHM6ICEtaSEKK3N0ZGluOgorCXNlZCAncy9eL1ggLycgPCBhYioKKwllY2hvIG1hcmsgMQorCXNlZCAncy9eL1ggLycgPCBhYiogfCBzZWQgJ3MvXi9ZIC8nCisJZWNobyBtYXJrIDIKK2V4cGVjdGVkLXN0ZG91dDoKKwlYIHN0dWZmCisJbWFyayAxCisJWSBYIHN0dWZmCisJbWFyayAyCitleHBlY3RlZC1zdGRlcnI6ICEKKwlQUFBQUAorLS0tCituYW1lOiByZWdyZXNzaW9uLTUzCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGdldG9wdHMgd29ya3MgaW4gZnVuY3Rpb25zCitzdGRpbjoKKwliZnVuYygpIHsKKwkgICAgZWNobyBiZnVuYzogZW50ZXIgIihhcmdzOiAkKjsgT1BUSU5EPSRPUFRJTkQpIgorCSAgICB3aGlsZSBnZXRvcHRzIEIgb2M7IGRvCisJCWNhc2UgJG9jIGluCisJCSAgKEIpCisJCSAgICBlY2hvIGJmdW5jOiBCIG9wdGlvbgorCQkgICAgOzsKKwkJICAoKikKKwkJICAgIGVjaG8gYmZ1bmM6IG9kZCBvcHRpb24gIigkb2MpIgorCQkgICAgOzsKKwkJZXNhYworCSAgICBkb25lCisJICAgIGVjaG8gYmZ1bmM6IGxlYXZlCisJfQorCQorCWZ1bmN0aW9uIGtmdW5jIHsKKwkgICAgZWNobyBrZnVuYzogZW50ZXIgIihhcmdzOiAkKjsgT1BUSU5EPSRPUFRJTkQpIgorCSAgICB3aGlsZSBnZXRvcHRzIEsgb2M7IGRvCisJCWNhc2UgJG9jIGluCisJCSAgKEspCisJCSAgICBlY2hvIGtmdW5jOiBLIG9wdGlvbgorCQkgICAgOzsKKwkJICAoKikKKwkJICAgIGVjaG8gYmZ1bmM6IG9kZCBvcHRpb24gIigkb2MpIgorCQkgICAgOzsKKwkJZXNhYworCSAgICBkb25lCisJICAgIGVjaG8ga2Z1bmM6IGxlYXZlCisJfQorCQorCXNldCAtLSAtZiAtYiAtayAtbAorCWVjaG8gImxpbmUgMTogT1BUSU5EPSRPUFRJTkQiCisJZ2V0b3B0cyBrYmZsIG9wdGMKKwllY2hvICJsaW5lIDI6IHJldD0kPywgb3B0Yz0kb3B0YywgT1BUSU5EPSRPUFRJTkQiCisJYmZ1bmMgLUJCQiBibGFoCisJZWNobyAibGluZSAzOiBPUFRJTkQ9JE9QVElORCIKKwlnZXRvcHRzIGtiZmwgb3B0YworCWVjaG8gImxpbmUgNDogcmV0PSQ/LCBvcHRjPSRvcHRjLCBPUFRJTkQ9JE9QVElORCIKKwlrZnVuYyAtS0tLIGJsYWgKKwllY2hvICJsaW5lIDU6IE9QVElORD0kT1BUSU5EIgorCWdldG9wdHMga2JmbCBvcHRjCisJZWNobyAibGluZSA2OiByZXQ9JD8sIG9wdGM9JG9wdGMsIE9QVElORD0kT1BUSU5EIgorCWVjaG8KKwkKKwlPUFRJTkQ9MQorCXNldCAtLSAtZmJrbAorCWVjaG8gImxpbmUgMTA6IE9QVElORD0kT1BUSU5EIgorCWdldG9wdHMga2JmbCBvcHRjCisJZWNobyAibGluZSAyMDogcmV0PSQ/LCBvcHRjPSRvcHRjLCBPUFRJTkQ9JE9QVElORCIKKwliZnVuYyAtQkJCIGJsYWgKKwllY2hvICJsaW5lIDMwOiBPUFRJTkQ9JE9QVElORCIKKwlnZXRvcHRzIGtiZmwgb3B0YworCWVjaG8gImxpbmUgNDA6IHJldD0kPywgb3B0Yz0kb3B0YywgT1BUSU5EPSRPUFRJTkQiCisJa2Z1bmMgLUtLSyBibGFoCisJZWNobyAibGluZSA1MDogT1BUSU5EPSRPUFRJTkQiCisJZ2V0b3B0cyBrYmZsIG9wdGMKKwllY2hvICJsaW5lIDYwOiByZXQ9JD8sIG9wdGM9JG9wdGMsIE9QVElORD0kT1BUSU5EIgorZXhwZWN0ZWQtc3Rkb3V0OgorCWxpbmUgMTogT1BUSU5EPTEKKwlsaW5lIDI6IHJldD0wLCBvcHRjPWYsIE9QVElORD0yCisJYmZ1bmM6IGVudGVyIChhcmdzOiAtQkJCIGJsYWg7IE9QVElORD0yKQorCWJmdW5jOiBCIG9wdGlvbgorCWJmdW5jOiBCIG9wdGlvbgorCWJmdW5jOiBsZWF2ZQorCWxpbmUgMzogT1BUSU5EPTIKKwlsaW5lIDQ6IHJldD0wLCBvcHRjPWIsIE9QVElORD0zCisJa2Z1bmM6IGVudGVyIChhcmdzOiAtS0tLIGJsYWg7IE9QVElORD0xKQorCWtmdW5jOiBLIG9wdGlvbgorCWtmdW5jOiBLIG9wdGlvbgorCWtmdW5jOiBLIG9wdGlvbgorCWtmdW5jOiBsZWF2ZQorCWxpbmUgNTogT1BUSU5EPTMKKwlsaW5lIDY6IHJldD0wLCBvcHRjPWssIE9QVElORD00CisJCisJbGluZSAxMDogT1BUSU5EPTEKKwlsaW5lIDIwOiByZXQ9MCwgb3B0Yz1mLCBPUFRJTkQ9MgorCWJmdW5jOiBlbnRlciAoYXJnczogLUJCQiBibGFoOyBPUFRJTkQ9MikKKwliZnVuYzogQiBvcHRpb24KKwliZnVuYzogQiBvcHRpb24KKwliZnVuYzogbGVhdmUKKwlsaW5lIDMwOiBPUFRJTkQ9MgorCWxpbmUgNDA6IHJldD0xLCBvcHRjPT8sIE9QVElORD0yCisJa2Z1bmM6IGVudGVyIChhcmdzOiAtS0tLIGJsYWg7IE9QVElORD0xKQorCWtmdW5jOiBLIG9wdGlvbgorCWtmdW5jOiBLIG9wdGlvbgorCWtmdW5jOiBLIG9wdGlvbgorCWtmdW5jOiBsZWF2ZQorCWxpbmUgNTA6IE9QVElORD0yCisJbGluZSA2MDogcmV0PTEsIG9wdGM9PywgT1BUSU5EPTIKKy0tLQorbmFtZTogcmVncmVzc2lvbi01NAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCA7IGlzIG5vdCByZXF1aXJlZCBiZWZvcmUgdGhlIHRoZW4gaW4gaWYgKCggLi4uICkpIHRoZW4gLi4uCitzdGRpbjoKKwlpZiAoKCAxICkpIHRoZW4KKwkgICAgZWNobyBvayBkcGFyZW4KKwlmaQorCWlmIFtbIC1uIDEgXV0gdGhlbgorCSAgICBlY2hvIG9rIGRicmFja2V0cworCWZpCitleHBlY3RlZC1zdGRvdXQ6CisJb2sgZHBhcmVuCisJb2sgZGJyYWNrZXRzCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNTUKK2Rlc2NyaXB0aW9uOgorCUNoZWNrICR7Zm9vOiViYXJ9IGlzIGFsbG93ZWQgKGtzaDg4IGFsbG93cyBpdC4uLikKK3N0ZGluOgorCXg9Zm9vWGJhclhibGFoCisJZWNobyAxICR7eCVYKn0KKwllY2hvIDIgJHt4OiVYKn0KKwllY2hvIDMgJHt4JSVYKn0KKwllY2hvIDQgJHt4OiUlWCp9CisJZWNobyA1ICR7eCMqWH0KKwllY2hvIDYgJHt4OiMqWH0KKwllY2hvIDcgJHt4IyMqWH0KKwllY2hvIDggJHt4OiMjKlh9CitleHBlY3RlZC1zdGRvdXQ6CisJMSBmb29YYmFyCisJMiBmb29YYmFyCisJMyBmb28KKwk0IGZvbworCTUgYmFyWGJsYWgKKwk2IGJhclhibGFoCisJNyBibGFoCisJOCBibGFoCistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNTcKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIHR5cGVzZXQgb3V0cHV0IGlzIGNvcnJlY3QgZm9yCisJdW5pbml0aWFsaXNlZCBhcnJheSBlbGVtZW50cy4KK3N0ZGluOgorCXR5cGVzZXQgLWkgeHh4WzRdCisJZWNobyBBCisJdHlwZXNldCAtaSB8IGdyZXAgeHh4IHwgc2VkICdzL14vICAgIC8nCisJZWNobyBCCisJdHlwZXNldCB8IGdyZXAgeHh4IHwgc2VkICdzL14vICAgIC8nCisJCisJeHh4WzFdPTIrNQorCWVjaG8gTQorCXR5cGVzZXQgLWkgfCBncmVwIHh4eCB8IHNlZCAncy9eLyAgICAvJworCWVjaG8gTgorCXR5cGVzZXQgfCBncmVwIHh4eCB8IHNlZCAncy9eLyAgICAvJworZXhwZWN0ZWQtc3Rkb3V0OgorCUEKKwkgICAgeHh4CisJQgorCSAgICB0eXBlc2V0IC1pIHh4eAorCU0KKwkgICAgeHh4WzFdPTcKKwlOCisJICAgIHR5cGVzZXQgLWkgeHh4CistLS0KK25hbWU6IHJlZ3Jlc3Npb24tNTgKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIHRyYXAgZXhpdCBpcyBvayAoZXhpdCBub3QgbWlzdGFrZW4gZm9yIHNpZ25hbCBuYW1lKQorc3RkaW46CisJdHJhcCAnZWNobyBoaScgZXhpdAorCXRyYXAgZXhpdCAxCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKy0tLQorbmFtZTogcmVncmVzc2lvbi01OQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgJHsjYXJyYXlbKl19IGlzIGNhbGN1bGF0ZWQgY29ycmVjdGx5Lgorc3RkaW46CisJYVsxMl09aGkKKwlhWzhdPXRoZXJlCisJZWNobyAkeyNhWypdfQorZXhwZWN0ZWQtc3Rkb3V0OgorCTIKKy0tLQorbmFtZTogcmVncmVzc2lvbi02MAorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgZGVmYXVsdCBleGl0IHN0YXR1cyBpcyBwcmV2aW91cyBjb21tYW5kCitzdGRpbjoKKwkodHJ1ZTsgZXhpdCkKKwllY2hvIEEgJD8KKwkoZmFsc2U7IGV4aXQpCisJZWNobyBCICQ/CisJKCAoZXhpdCAxMDMpIDsgZXhpdCkKKwllY2hvIEMgJD8KK2V4cGVjdGVkLXN0ZG91dDoKKwlBIDAKKwlCIDEKKwlDIDEwMworLS0tCituYW1lOiByZWdyZXNzaW9uLTYxCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBFWElUIHRyYXAgaXMgZXhlY3V0ZWQgZm9yIHN1YiBzaGVsbHMuCitzdGRpbjoKKwl0cmFwICdlY2hvIHBhcmVudCBleGl0JyBFWElUCisJZWNobyBzdGFydAorCShlY2hvIEE7IGVjaG8gQSBsYXN0KQorCWVjaG8gQgorCShlY2hvIEM7IHRyYXAgJ2VjaG8gc3ViIGV4aXQnIEVYSVQ7IGVjaG8gQyBsYXN0KQorCWVjaG8gcGFyZW50IGxhc3QKK2V4cGVjdGVkLXN0ZG91dDoKKwlzdGFydAorCUEKKwlBIGxhc3QKKwlCCisJQworCUMgbGFzdAorCXN1YiBleGl0CisJcGFyZW50IGxhc3QKKwlwYXJlbnQgZXhpdAorLS0tCituYW1lOiByZWdyZXNzaW9uLTYyCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiB0ZXN0IC1udC8tb3Qgc3VjY2VlZHMgaWYgc2Vjb25kKGZpcnN0KSBmaWxlIGlzIG1pc3NpbmcuCitzdGRpbjoKKwl0b3VjaCBhCisJdGVzdCBhIC1udCBiICYmIGVjaG8gbnQgT0sgfHwgZWNobyBudCBCQUQKKwl0ZXN0IGIgLW90IGEgJiYgZWNobyBvdCBPSyB8fCBlY2hvIG90IEJBRAorZXhwZWN0ZWQtc3Rkb3V0OgorCW50IE9LCisJb3QgT0sKKy0tLQorbmFtZTogcmVncmVzc2lvbi02MworZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgdHlwZXNldCwgZXhwb3J0LCBhbmQgcmVhZG9ubHkgd29yaworc3RkaW46CisJeworCQllY2hvIEZOT1JELTAKKwkJRk5PUkRfQT0xCisJCUZOT1JEX0I9MgorCQlGTk9SRF9DPTMKKwkJRk5PUkRfRD00CisJCUZOT1JEX0U9NQorCQlGTk9SRF9GPTYKKwkJRk5PUkRfRz03CisJCUZOT1JEX0g9OAorCQlpbnRlZ2VyIEZOT1JEX0UgRk5PUkRfRiBGTk9SRF9HIEZOT1JEX0gKKwkJZXhwb3J0IEZOT1JEX0MgRk5PUkRfRCBGTk9SRF9HIEZOT1JEX0gKKwkJcmVhZG9ubHkgRk5PUkRfQiBGTk9SRF9EIEZOT1JEX0YgRk5PUkRfSAorCQllY2hvIEZOT1JELTEKKwkJZXhwb3J0CisJCWVjaG8gRk5PUkQtMgorCQlleHBvcnQgLXAKKwkJZWNobyBGTk9SRC0zCisJCXJlYWRvbmx5CisJCWVjaG8gRk5PUkQtNAorCQlyZWFkb25seSAtcAorCQllY2hvIEZOT1JELTUKKwkJdHlwZXNldAorCQllY2hvIEZOT1JELTYKKwkJdHlwZXNldCAtcAorCQllY2hvIEZOT1JELTcKKwkJdHlwZXNldCAtCisJCWVjaG8gRk5PUkQtOAorCX0gfCBmZ3JlcCBGTk9SRAorZXhwZWN0ZWQtc3Rkb3V0OgorCUZOT1JELTAKKwlGTk9SRC0xCisJRk5PUkRfQworCUZOT1JEX0QKKwlGTk9SRF9HCisJRk5PUkRfSAorCUZOT1JELTIKKwlleHBvcnQgRk5PUkRfQz0zCisJZXhwb3J0IEZOT1JEX0Q9NAorCWV4cG9ydCBGTk9SRF9HPTcKKwlleHBvcnQgRk5PUkRfSD04CisJRk5PUkQtMworCUZOT1JEX0IKKwlGTk9SRF9ECisJRk5PUkRfRgorCUZOT1JEX0gKKwlGTk9SRC00CisJcmVhZG9ubHkgRk5PUkRfQj0yCisJcmVhZG9ubHkgRk5PUkRfRD00CisJcmVhZG9ubHkgRk5PUkRfRj02CisJcmVhZG9ubHkgRk5PUkRfSD04CisJRk5PUkQtNQorCXR5cGVzZXQgRk5PUkRfQQorCXR5cGVzZXQgLXIgRk5PUkRfQgorCXR5cGVzZXQgLXggRk5PUkRfQworCXR5cGVzZXQgLXggLXIgRk5PUkRfRAorCXR5cGVzZXQgLWkgRk5PUkRfRQorCXR5cGVzZXQgLWkgLXIgRk5PUkRfRgorCXR5cGVzZXQgLWkgLXggRk5PUkRfRworCXR5cGVzZXQgLWkgLXggLXIgRk5PUkRfSAorCUZOT1JELTYKKwl0eXBlc2V0IEZOT1JEX0E9MQorCXR5cGVzZXQgLXIgRk5PUkRfQj0yCisJdHlwZXNldCAteCBGTk9SRF9DPTMKKwl0eXBlc2V0IC14IC1yIEZOT1JEX0Q9NAorCXR5cGVzZXQgLWkgRk5PUkRfRT01CisJdHlwZXNldCAtaSAtciBGTk9SRF9GPTYKKwl0eXBlc2V0IC1pIC14IEZOT1JEX0c9NworCXR5cGVzZXQgLWkgLXggLXIgRk5PUkRfSD04CisJRk5PUkQtNworCUZOT1JEX0E9MQorCUZOT1JEX0I9MgorCUZOT1JEX0M9MworCUZOT1JEX0Q9NAorCUZOT1JEX0U9NQorCUZOT1JEX0Y9NgorCUZOT1JEX0c9NworCUZOT1JEX0g9OAorCUZOT1JELTgKKy0tLQorbmFtZTogcmVncmVzc2lvbi02NAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB3ZSBjYW4gcmVkZWZpbmUgZnVuY3Rpb25zIGNhbGxpbmcgdGltZSBidWlsdGluCitzdGRpbjoKKwl0KCkgeworCQl0aW1lID4vZGV2L251bGwKKwl9CisJdCAyPi9kZXYvbnVsbAorCXQoKSB7CisJCXRpbWUKKwl9CistLS0KK25hbWU6IHN5bnRheC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGxvbmUgYW1wZXJzYW5kIGlzIGEgc3ludGF4IGVycm9yCitzdGRpbjoKKwkgJgorZXhwZWN0ZWQtZXhpdDogZSAhPSAwCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvc3ludGF4IGVycm9yLworLS0tCituYW1lOiB4eHgtcXVvdGVkLW5ld2xpbmUtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcPG5ld2xpbmU+IHdvcmtzIGluc2lkZSBvZiAke30KK3N0ZGluOgorCWFiYz0yCisJZWNobyAke2FiXAorCWN9CitleHBlY3RlZC1zdGRvdXQ6CisJMgorLS0tCituYW1lOiB4eHgtcXVvdGVkLW5ld2xpbmUtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcPG5ld2xpbmU+IHdvcmtzIGF0IHRoZSBzdGFydCBvZiBhIGhlcmUgZG9jdW1lbnQKK3N0ZGluOgorCWNhdCA8PCBFT1wKKwlGCisJaGkKKwlFT0YKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorLS0tCituYW1lOiB4eHgtcXVvdGVkLW5ld2xpbmUtMworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBcPG5ld2xpbmU+IHdvcmtzIGF0IHRoZSBlbmQgb2YgYSBoZXJlIGRvY3VtZW50CitzdGRpbjoKKwljYXQgPDwgRU9GCisJaGkKKwlFT1wKKwlGCitleHBlY3RlZC1zdGRvdXQ6CisJaGkKKy0tLQorbmFtZTogeHh4LW11bHRpLWFzc2lnbm1lbnQtY21kCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IGFzc2lnbm1lbnRzIGluIGEgY29tbWFuZCBhZmZlY3Qgc3Vic2VxdWVudCBhc3NpZ25tZW50cworCWluIHRoZSBzYW1lIGNvbW1hbmQKK3N0ZGluOgorCUZPTz1hYmMKKwlGT089MTIzIEJBUj0kRk9PCisJZWNobyAkQkFSCitleHBlY3RlZC1zdGRvdXQ6CisJMTIzCistLS0KK25hbWU6IHh4eC1tdWx0aS1hc3NpZ25tZW50LXBvc2l4LWNtZAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB0aGUgYmVoYXZpb3VyIGZvciBtdWx0aXBsZSBhc3NpZ25tZW50cyB3aXRoIGEKKwljb21tYW5kIG5hbWUgbWF0Y2hlcyBQT1NJWC4gU2VlOgorCWh0dHA6Ly90aHJlYWQuZ21hbmUub3JnL2dtYW5lLmNvbXAuc3RhbmRhcmRzLnBvc2l4LmF1c3Rpbi5nZW5lcmFsLzE5MjUKK3N0ZGluOgorCVg9YSBZPWI7IFg9JFkgWT0kWCAiJF9fcHJvZ25hbWUiIC1jICdlY2hvIDEgJFggJFkgLic7IGVjaG8gMiAkWCAkWSAuCisJdW5zZXQgWCBZIFoKKwlYPWEgWT0ke1g9Yn0gWj0kWCAiJF9fcHJvZ25hbWUiIC1jICdlY2hvIDMgJFogLicKKwl1bnNldCBYIFkgWgorCVg9YSBZPSR7WD1ifSBaPSRYOyBlY2hvIDQgJFogLgorZXhwZWN0ZWQtc3Rkb3V0OgorCTEgYiBhIC4KKwkyIGEgYiAuCisJMyBiIC4KKwk0IGEgLgorLS0tCituYW1lOiB4eHgtbXVsdGktYXNzaWdubWVudC1wb3NpeC1ub2NtZAorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB0aGUgYmVoYXZpb3VyIGZvciBtdWx0aXBsZSBhc3NpZ25tZW50cyB3aXRoIG5vCisJY29tbWFuZCBuYW1lIG1hdGNoZXMgUE9TSVggKERlYmlhbiAjMzM0MTgyKS4gU2VlOgorCWh0dHA6Ly90aHJlYWQuZ21hbmUub3JnL2dtYW5lLmNvbXAuc3RhbmRhcmRzLnBvc2l4LmF1c3Rpbi5nZW5lcmFsLzE5MjUKK3N0ZGluOgorCVg9YSBZPWI7IFg9JFkgWT0kWDsgZWNobyAxICRYICRZIC4KK2V4cGVjdGVkLXN0ZG91dDoKKwkxIGIgYiAuCistLS0KK25hbWU6IHh4eC1tdWx0aS1hc3NpZ25tZW50LXBvc2l4LXN1YmFzc2lnbgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB0aGUgYmVoYXZpb3VyIGZvciBtdWx0aXBsZSBhc3NpZ25tZW50cyBtYXRjaGVzIFBPU0lYOgorCS0gVGhlIGFzc2lnbm1lbnQgd29yZHMgc2hhbGwgYmUgZXhwYW5kZWQgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uCisJICBlbnZpcm9ubWVudC4KKwktIFRoZSBhc3NpZ25tZW50cyBoYXBwZW4gaW4gdGhlIHRlbXBvcmFyeSBleGVjdXRpb24gZW52aXJvbm1lbnQuCitzdGRpbjoKKwl1bnNldCBYIFkgWgorCVo9YSBZPSR7WDo9Yn0gc2ggLWMgJ2VjaG8gKyRYKyArJFkrICskWisnCisJZWNobyAvJFgvCisJIyBOb3cgZm9yIHRoZSBzcGVjaWFsIGNhc2U6CisJdW5zZXQgWCBZIFoKKwlYPSBZPSR7WDo9Yn0gc2ggLWMgJ2VjaG8gKyRYKyArJFkrJworCWVjaG8gLyRYLworZXhwZWN0ZWQtc3Rkb3V0OgorCSsrICtiKyArYSsKKwkvYi8KKwkrKyArYisKKwkvYi8KKy0tLQorbmFtZTogeHh4LWV4ZWMtZW52aXJvbm1lbnQtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdG8gc2VlIGlmIGV4ZWMgc2V0cyBpdCdzIGVudmlyb25tZW50IGNvcnJlY3RseQorc3RkaW46CisJRk9PPWJhciBleGVjIGVudgorZXhwZWN0ZWQtc3Rkb3V0LXBhdHRlcm46CisJLyhefC4qXG4pRk9PPWJhclxuLworLS0tCituYW1lOiB4eHgtZXhlYy1lbnZpcm9ubWVudC0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0byBtYWtlIHN1cmUgZXhlYyBkb2Vzbid0IGNoYW5nZSBlbnZpcm9ubWVudCBpZiBhIHByb2dyYW0KKwlpc24ndCBleGVjLWVkCitzdGRpbjoKKwlzb3J0cHJvZz0kKHdoZW5jZSAtcCBzb3J0KSB8fCBzb3J0cHJvZz1jYXQKKwllbnYgfCAkc29ydHByb2cgfCBncmVwIC12ICdeUkFORE9NPScgPmJhcjEKKwlGT089YmFyIGV4ZWM7IGVudiB8ICRzb3J0cHJvZyB8IGdyZXAgLXYgJ15SQU5ET009JyA+YmFyMgorCWNtcCAtcyBiYXIxIGJhcjIKKy0tLQorbmFtZTogZXhlYy1mdW5jdGlvbi1lbnZpcm9ubWVudC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBhc3NpZ25tZW50cyBpbiBmdW5jdGlvbiBjYWxscyBhbmQgd2hldGhlciB0aGV5IGFmZmVjdAorCXRoZSBjdXJyZW50IGV4ZWN1dGlvbiBlbnZpcm9ubWVudCAoa3NoOTMsIFNVU3Y0KQorc3RkaW46CisJZigpIHsgYT0yOyB9OyBnKCkgeyBiPTM7IGVjaG8geSRjLTsgfTsgYT0xIGY7IGI9MjsgYz0xIGcKKwllY2hvIHgkYS0kYi0geiRjLQorZXhwZWN0ZWQtc3Rkb3V0OgorCXkxLQorCXgyLTMtIHoxLQorLS0tCituYW1lOiB4eHgtd2hhdC1kby15b3UtY2FsbC10aGlzLTEKK3N0ZGluOgorCWVjaG8gIiR7Zm9vOi0iYSJ9KiIKK2V4cGVjdGVkLXN0ZG91dDoKKwlhKgorLS0tCituYW1lOiB4eHgtcHJlZml4LXN0cmlwLTEKK3N0ZGluOgorCWZvbz0nYSBjZGVmJworCWVjaG8gJHtmb28jYSBjfQorZXhwZWN0ZWQtc3Rkb3V0OgorCWRlZgorLS0tCituYW1lOiB4eHgtcHJlZml4LXN0cmlwLTIKK3N0ZGluOgorCXNldCBhIGMKKwl4PSdhIGNkZWYnCisJZWNobyAke3gjJCp9CitleHBlY3RlZC1zdGRvdXQ6CisJZGVmCistLS0KK25hbWU6IHh4eC12YXJpYWJsZS1zeW50YXgtMQorc3RkaW46CisJZWNobyAkezp9CitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvYmFkIHN1YnN0aXR1dGlvbi8KK2V4cGVjdGVkLWV4aXQ6IDEKKy0tLQorbmFtZTogeHh4LXZhcmlhYmxlLXN5bnRheC0yCitzdGRpbjoKKwlzZXQgMAorCWVjaG8gJHsqOjB9CitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvYmFkIHN1YnN0aXR1dGlvbi8KK2V4cGVjdGVkLWV4aXQ6IDEKKy0tLQorbmFtZTogeHh4LXZhcmlhYmxlLXN5bnRheC0zCitzdGRpbjoKKwlzZXQgLUEgZm9vIDAKKwllY2hvICR7Zm9vWypdOjB9CitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvYmFkIHN1YnN0aXR1dGlvbi8KK2V4cGVjdGVkLWV4aXQ6IDEKKy0tLQorbmFtZTogeHh4LXN1YnN0aXR1dGlvbi1ldmFsLW9yZGVyCitkZXNjcmlwdGlvbjoKKwlDaGVjayBvcmRlciBvZiBldmFsdWF0aW9uIG9mIGV4cHJlc3Npb25zCitzdGRpbjoKKwlpPTEgeD0geT0KKwlzZXQgLUEgQSBhYmMgZGVmIEdISSBqIEcgaworCWVjaG8gJHtBW3g9KGkrPTEpXSMke0FbeT0oaSs9MildfX0KKwllY2hvICR4ICR5CitleHBlY3RlZC1zdGRvdXQ6CisJSEkKKwkyIDQKKy0tLQorbmFtZTogeHh4LXNldC1vcHRpb24tMQorZGVzY3JpcHRpb246CisJQ2hlY2sgb3B0aW9uIHBhcnNpbmcgaW4gc2V0CitzdGRpbjoKKwlzZXQgLXZzQSBmb28gLS0gQSAxIDMgMgorCWVjaG8gJHtmb29bKl19CitleHBlY3RlZC1zdGRlcnI6CisJZWNobyAke2Zvb1sqXX0KK2V4cGVjdGVkLXN0ZG91dDoKKwkxIDIgMyBBCistLS0KK25hbWU6IHh4eC1leGVjLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgZXhlYyBleGl0cyBmb3IgYnVpbHQtaW5zCithcmd1bWVudHM6ICEtaSEKK3N0ZGluOgorCWV4ZWMgZWNobyBoaQorCWVjaG8gc3RpbGwgaGVycmUKK2V4cGVjdGVkLXN0ZG91dDoKKwloaQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46IC8uKi8KKy0tLQorbmFtZTogeHh4LXdoaWxlLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2Ygd2hpbGUgbG9vcHMKKwlYWFggbmVlZCB0byBkbyBzYW1lIGZvciBmb3Ivc2VsZWN0L3VudGlsIGxvb3BzCitzdGRpbjoKKwlpPXgKKwl3aGlsZSBbICRpICE9IHh4eCBdIDsgZG8KKwkgICAgaT14JGkKKwkgICAgaWYgWyAkaSA9IHh4eCBdIDsgdGhlbgorCQlmYWxzZQorCQljb250aW51ZQorCSAgICBmaQorCWRvbmUKKwllY2hvIGxvb3AxPSQ/CisJCisJaT14CisJd2hpbGUgWyAkaSAhPSB4eHggXSA7IGRvCisJICAgIGk9eCRpCisJICAgIGlmIFsgJGkgPSB4eHggXSA7IHRoZW4KKwkJZmFsc2UKKwkJYnJlYWsKKwkgICAgZmkKKwlkb25lCisJZWNobyBsb29wMj0kPworCQorCWk9eAorCXdoaWxlIFsgJGkgIT0geHh4IF0gOyBkbworCSAgICBpPXgkaQorCSAgICBmYWxzZQorCWRvbmUKKwllY2hvIGxvb3AzPSQ/CitleHBlY3RlZC1zdGRvdXQ6CisJbG9vcDE9MAorCWxvb3AyPTAKKwlsb29wMz0xCistLS0KK25hbWU6IHh4eC1zdGF0dXMtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBibGFuayBsaW5lcyBkb24ndCBjbGVhciAkPworYXJndW1lbnRzOiAhLWkhCitzdGRpbjoKKwkoZXhpdCAxKQorCWVjaG8gJD8KKwkoZXhpdCAxKQorCQorCWVjaG8gJD8KKwl0cnVlCitleHBlY3RlZC1zdGRvdXQ6CisJMQorCTEKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvLiovCistLS0KK25hbWU6IHh4eC1zdGF0dXMtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCAkPyBpcyBwcmVzZXJ2ZWQgaW4gc3Vic2hlbGxzLCBpbmNsdWRlcywgdHJhcHMuCitzdGRpbjoKKwkoZXhpdCAxKQorCQorCWVjaG8gYmxhbms6ICQ/CisJCisJKGV4aXQgMikKKwkoZWNobyBzdWJzaGVsbDogJD8pCisJCisJZWNobyAnZWNobyBpbmNsdWRlOiAkPycgPiBmb28KKwkoZXhpdCAzKQorCS4gLi9mb28KKwkKKwl0cmFwICdlY2hvIHRyYXA6ICQ/JyBFUlIKKwkoZXhpdCA0KQorCWVjaG8gZXhpdDogJD8KK2V4cGVjdGVkLXN0ZG91dDoKKwlibGFuazogMQorCXN1YnNoZWxsOiAyCisJaW5jbHVkZTogMworCXRyYXA6IDQKKwlleGl0OiA0CistLS0KK25hbWU6IHh4eC1jbGVhbi1jaGFycy0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBNQUdJQyBjaGFyYWN0ZXIgaXMgc3R1ZmZlZCBjb3JyZWN0bHkKK3N0ZGluOgorCWVjaG8gYGVjaG8gW6NgCitleHBlY3RlZC1zdGRvdXQ6CisJW6MKKy0tLQorbmFtZTogeHh4LXBhcmFtLXN1YnN0LXFtYXJrLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHN1cHByZXNpb24gb2YgZXJyb3IgbWVzc2FnZSB3aXRoIG51bGwgc3RyaW5nLiAgQWNjb3JkaW5nIHRvCisJUE9TSVgsIGl0IHNob3VsZG4ndCBwcmludCB0aGUgZXJyb3IgYXMgJ3dvcmQnIGlzbid0IG9tbWl0dGVkLgorCWtzaDg4LzkzLCBTb2xhcmlzIC9iaW4vc2ggYW5kIC91c3IveHBnNC9iaW4vc2ggYWxsIHByaW50IHRoZSBlcnJvciwKKwl0aGF0J3Mgd2h5IHRoZSBjb25kaXRpb24gaXMgcmV2ZXJzZWQuCitzdGRpbjoKKwl1bnNldCBmb28KKwl4PQorCWVjaG8geCR7Zm9vPyR4fQorZXhwZWN0ZWQtZXhpdDogMQorIyBQT1NJWAorI2V4cGVjdGVkLWZhaWw6IHllcworI2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAhL25vdCBzZXQvCisjIGNvbW1vbiB1c2UKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOiAvcGFyYW1ldGVyIG51bGwgb3Igbm90IHNldC8KKy0tLQorbmFtZTogeHh4LXBhcmFtLV8tMQorIyBmYWlscyBkdWUgdG8gd2VpcmRuZXNzIG9mIGV4ZWN2IHN0dWZmCitjYXRlZ29yeTogIW9zOnV3aW4tbnQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGMgZmxhZyBpcyBzZXQuCithcmd1bWVudHM6ICEtYyFlY2hvICJbJC1dIiEKK2V4cGVjdGVkLXN0ZG91dC1wYXR0ZXJuOiAvXlxbLipjLipcXSQvCistLS0KK25hbWU6IHRpbGRlLWV4cGFuZC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aWxkZSBleHBhbnNpb24gYWZ0ZXIgZXF1YWwgc2lnbnMKK2Vudi1zZXR1cDogIUhPTUU9L3N3ZWV0IQorc3RkaW46CisJZWNobyAke0E9YT19fiBiPX4gYz1kfiB+CisJc2V0ICtvIGJyYWNlZXhwYW5kCisJZWNobyAke0E9YT19fiBiPX4gYz1kfiB+CitleHBlY3RlZC1zdGRvdXQ6CisJYT0vc3dlZXQgYj0vc3dlZXQgYz1kfiAvc3dlZXQKKwlhPX4gYj1+IGM9ZH4gL3N3ZWV0CistLS0KK25hbWU6IGV4aXQtZXJyLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHNvbWUgImV4aXQgb24gZXJyb3IiIGNvbmRpdGlvbnMKK3N0ZGluOgorCXNldCAtZXgKKwkvdXNyL2Jpbi9lbnYgZmFsc2UgJiYgZWNobyBzb21ldGhpbmcKKwllY2hvIEVORAorZXhwZWN0ZWQtc3Rkb3V0OgorCUVORAorZXhwZWN0ZWQtc3RkZXJyOgorCSsgL3Vzci9iaW4vZW52IGZhbHNlCisJKyBlY2hvIEVORAorLS0tCituYW1lOiBleGl0LWVyci0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzb21lICJleGl0IG9uIGVycm9yIiBlZGdlIGNvbmRpdGlvbnMgKFBPU0lYbHkpCitzdGRpbjoKKwlzZXQgLWV4CisJaWYgL3Vzci9iaW4vZW52IHRydWU7IHRoZW4KKwkJL3Vzci9iaW4vZW52IGZhbHNlICYmIGVjaG8gc29tZXRoaW5nCisJZmkKKwllY2hvIEVORAorZXhwZWN0ZWQtc3Rkb3V0OgorCUVORAorZXhwZWN0ZWQtc3RkZXJyOgorCSsgL3Vzci9iaW4vZW52IHRydWUKKwkrIC91c3IvYmluL2VudiBmYWxzZQorCSsgZWNobyBFTkQKKy0tLQorbmFtZTogZXhpdC1lcnItMworZGVzY3JpcHRpb246CisJcGRrc2ggcmVncmVzc2lvbiB3aGljaCBBVCZUIGtzaCBkb2VzIHJpZ2h0CisJVEZNIHNheXM6IFtzZXRdIC1lIHwgZXJyZXhpdAorCQlFeGl0IChhZnRlciBleGVjdXRpbmcgdGhlIEVSUiB0cmFwKSAuLi4KK3N0ZGluOgorCXRyYXAgJ2VjaG8gRVhJVCcgRVhJVAorCXRyYXAgJ2VjaG8gRVJSJyBFUlIKKwlzZXQgLWUKKwljZCAvWFhYWFggMj4vZGV2L251bGwKKwllY2hvIERPTkUKKwlleGl0IDAKK2V4cGVjdGVkLXN0ZG91dDoKKwlFUlIKKwlFWElUCitleHBlY3RlZC1leGl0OiBlICE9IDAKKy0tLQorbmFtZTogZXhpdC1lcnItNAorZGVzY3JpcHRpb246CisJInNldCAtZSIgdGVzdCBzdWl0ZSAoUE9TSVgpCitzdGRpbjoKKwlzZXQgLWUKKwllY2hvIHByZQorCWlmIHRydWUgOyB0aGVuCisJCWZhbHNlICYmIGVjaG8gZm9vCisJZmkKKwllY2hvIGJhcgorZXhwZWN0ZWQtc3Rkb3V0OgorCXByZQorCWJhcgorLS0tCituYW1lOiBleGl0LWVyci01CitkZXNjcmlwdGlvbjoKKwkic2V0IC1lIiB0ZXN0IHN1aXRlIChQT1NJWCkKK3N0ZGluOgorCXNldCAtZQorCWZvbygpIHsKKwkJd2hpbGUgWyAiJDEiIF07IGRvCisJCQlmb3IgRSBpbiAkeDsgZG8KKwkJCQlbICIkMSIgPSAiJEUiIF0gJiYgeyBzaGlmdCA7IGNvbnRpbnVlIDIgOyB9CisJCQlkb25lCisJCQl4PSIkeCAkMSIKKwkJCXNoaWZ0CisJCWRvbmUKKwkJZWNobyAkeAorCX0KKwllY2hvIHByZQorCWZvbyBhIGIgYiBjCisJZWNobyBwb3N0CitleHBlY3RlZC1zdGRvdXQ6CisJcHJlCisJYSBiIGMKKwlwb3N0CistLS0KK25hbWU6IGV4aXQtZXJyLTYKK2Rlc2NyaXB0aW9uOgorCSJzZXQgLWUiIHRlc3Qgc3VpdGUgKEJTRCBtYWtlKQorY2F0ZWdvcnk6IG9zOm1pcmJzZAorc3RkaW46CisJbWtkaXIgemQgemQvYSB6ZC9iCisJcHJpbnQgJ2FsbDpcblx0QGVjaG8gZWluc1xuXHRAZXhpdCA0MlxuJyA+emQvYS9NYWtlZmlsZQorCXByaW50ICdhbGw6XG5cdEBlY2hvIHp3ZWlcbicgPnpkL2IvTWFrZWZpbGUKKwl3ZD0kKHB3ZCkKKwlzZXQgLWUKKwlmb3IgZW50cnkgaW4gYSBiOyBkbyAoICBzZXQgLWU7ICBpZiBbWyAtZCAkd2QvemQvJGVudHJ5LmkzODYgXV07IHRoZW4gIF9uZXdkaXJfPSIkZW50cnkuaTM4NiI7ICBlbHNlICBfbmV3ZGlyXz0iJGVudHJ5IjsgIGZpOyAgaWYgW1sgLXogJF9USElTRElSXyBdXTsgdGhlbiAgX25leHRkaXJfPSIkX25ld2Rpcl8iOyAgZWxzZSAgX25leHRkaXJfPSIkX1RISVNESVJfLyRfbmV3ZGlyXyI7ICBmaTsgIF9tYWtlZmlsZV9zcGVjXz07ICBbWyAhIC1mICR3ZC96ZC8kX25ld2Rpcl8vTWFrZWZpbGUuYnNkLXdyYXBwZXIgXV0gIHx8IF9tYWtlZmlsZV9zcGVjXz0iLWYgTWFrZWZpbGUuYnNkLXdyYXBwZXIiOyAgc3Vic2tpcGRpcj07ICBmb3Igc2tpcGRpciBpbiA7IGRvICBzdWJlbnRyeT0ke3NraXBkaXIjJGVudHJ5fTsgIGlmIFtbICRzdWJlbnRyeSAhPSAkc2tpcGRpciBdXTsgdGhlbiAgaWYgW1sgLXogJHN1YmVudHJ5IF1dOyB0aGVuICBlY2hvICIoJF9uZXh0ZGlyXyBza2lwcGVkKSI7ICBicmVhazsgIGZpOyAgc3Vic2tpcGRpcj0iJHN1YnNraXBkaXIgJHtzdWJlbnRyeSMvfSI7ICBmaTsgIGRvbmU7ICBpZiBbWyAteiAkc2tpcGRpciB8fCAtbiAkc3ViZW50cnkgXV07IHRoZW4gIGVjaG8gIj09PT4gJF9uZXh0ZGlyXyI7ICBjZCAkd2QvemQvJF9uZXdkaXJfOyAgbWFrZSBTS0lQRElSPSIkc3Vic2tpcGRpciIgJF9tYWtlZmlsZV9zcGVjXyAgX1RISVNESVJfPSIkX25leHRkaXJfIiAgIGFsbDsgIGZpOyAgKSBkb25lIDI+JjEgfCBzZWQgInMhJHdkIVdEIWciCitleHBlY3RlZC1zdGRvdXQ6CisJPT09PiBhCisJZWlucworCSoqKiBFcnJvciBjb2RlIDQyCisJCisJU3RvcCBpbiBXRC96ZC9hIChsaW5lIDIgb2YgTWFrZWZpbGUpLgorLS0tCituYW1lOiBleGl0LWVub2VudC0xCitkZXNjcmlwdGlvbjoKKwlTVVN2NCBzYXlzIHRoYXQgdGhlIHNoZWxsIHNob3VsZCBleGl0IHdpdGggMTI2LzEyNyBpbiBzb21lIHNpdHVhdGlvbnMKK3N0ZGluOgorCWk9MAorCShlY2hvOyBlY2hvIDopID54CisJIiRfX3Byb2duYW1lIiAuL3ggPi9kZXYvbnVsbCAyPiYxOyByPSQ/OyBlY2hvICQoKGkrKykpICRyIC4KKwkiJF9fcHJvZ25hbWUiIC1jIC4veCA+L2Rldi9udWxsIDI+JjE7IHI9JD87IGVjaG8gJCgoaSsrKSkgJHIgLgorCWVjaG8gZXhpdCA0MiA+eAorCSIkX19wcm9nbmFtZSIgLi94ID4vZGV2L251bGwgMj4mMTsgcj0kPzsgZWNobyAkKChpKyspKSAkciAuCisJIiRfX3Byb2duYW1lIiAtYyAuL3ggPi9kZXYvbnVsbCAyPiYxOyByPSQ/OyBlY2hvICQoKGkrKykpICRyIC4KKwlybSAtZiB4CisJIiRfX3Byb2duYW1lIiAuL3ggPi9kZXYvbnVsbCAyPiYxOyByPSQ/OyBlY2hvICQoKGkrKykpICRyIC4KKwkiJF9fcHJvZ25hbWUiIC1jIC4veCA+L2Rldi9udWxsIDI+JjE7IHI9JD87IGVjaG8gJCgoaSsrKSkgJHIgLgorZXhwZWN0ZWQtc3Rkb3V0OgorCTAgMCAuCisJMSAxMjYgLgorCTIgNDIgLgorCTMgMTI2IC4KKwk0IDEyNyAuCisJNSAxMjcgLgorLS0tCituYW1lOiBleGl0LWV2YWwtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgZXZhbCB2cyBzdWJzdGl0dXRpb24gZXhpdCBjb2RlcyAoa3NoOTMgYWxpa2UpCitzdGRpbjoKKwlldmFsICQoZmFsc2UpCisJZWNobyBBICQ/CisJZXZhbCAnICQoZmFsc2UpJworCWVjaG8gQiAkPworCWV2YWwgIiAkKGZhbHNlKSIKKwllY2hvIEMgJD8KKwlldmFsICJldmFsICQoZmFsc2UpIgorCWVjaG8gRCAkPworCWV2YWwgJ2V2YWwgJyIkKGZhbHNlKSIKKwllY2hvIEUgJD8KKwlJRlM9IiRJRlM6IgorCWV2YWwgJChlY2hvIDo7IGZhbHNlKQorCWVjaG8gRiAkPworZXhwZWN0ZWQtc3Rkb3V0OgorCUEgMAorCUIgMQorCUMgMAorCUQgMAorCUUgMAorCUYgMAorLS0tCituYW1lOiB0ZXN0LXN0bHQtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB0ZXN0IGFsc28gY2FuIGhhbmRsZSBzdHJpbmcxIDwgc3RyaW5nMiBldGMuCitzdGRpbjoKKwl0ZXN0IDIwMDUvMTAvMDggJzwnIDIwMDUvMDgvMjEgJiYgZWNobyBqYSB8fCBlY2hvIG5laW4KKwl0ZXN0IDIwMDUvMDgvMjEgXDwgMjAwNS8xMC8wOCAmJiBlY2hvIGphIHx8IGVjaG8gbmVpbgorCXRlc3QgMjAwNS8xMC8wOCAnPicgMjAwNS8wOC8yMSAmJiBlY2hvIGphIHx8IGVjaG8gbmVpbgorCXRlc3QgMjAwNS8wOC8yMSBcPiAyMDA1LzEwLzA4ICYmIGVjaG8gamEgfHwgZWNobyBuZWluCitleHBlY3RlZC1zdGRvdXQ6CisJbmVpbgorCWphCisJamEKKwluZWluCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjogIS91bmV4cGVjdGVkIG9wLworLS0tCituYW1lOiB0ZXN0LXByZWNlZGVuY2UtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgYSB3ZWlyZCBwcmVjZWRlbmNlIGNhc2UgKGFuZCBQT1NJWCBlY2hvKQorc3RkaW46CisJdGVzdCBcKCAtZiA9IC1mIFwpCisJcnY9JD8KKwl0ZXN0IC1uICIkUE9TSF9WRVJTSU9OIiB8fCBzZXQgLW8gc2gKKwllY2hvIC1lICRydgorZXhwZWN0ZWQtc3Rkb3V0OgorCS1lIDAKKy0tLQorbmFtZTogdGVzdC1vcHRpb24tMQorZGVzY3JpcHRpb246CisJVGVzdCB0aGUgdGVzdCAtbyBvcGVyYXRvcgorc3RkaW46CisJcnVudGVzdCgpIHsKKwkJdGVzdCAtbyAkMTsgZWNobyAkPworCQlbIC1vICQxIF07IGVjaG8gJD8KKwkJW1sgLW8gJDEgXV07IGVjaG8gJD8KKwl9CisJaWZfdGVzdCgpIHsKKwkJdGVzdCAtbyAkMSAtbyAtbyAhJDE7IGVjaG8gJD8KKwkJWyAtbyAkMSAtbyAtbyAhJDEgXTsgZWNobyAkPworCQlbWyAtbyAkMSB8fCAtbyAhJDEgXV07IGVjaG8gJD8KKwkJdGVzdCAtbyA/JDE7IGVjaG8gJD8KKwl9CisJZWNobyAweSAkKGlmX3Rlc3QgdXRmOC1tb2RlKSA9CisJZWNobyAwbiAkKGlmX3Rlc3QgdXRmOC1oYWNrKSA9CisJZWNobyAxPSAkKHJ1bnRlc3QgdXRmOC1oYWNrKSA9CisJZWNobyAyPSAkKHJ1bnRlc3QgIXV0ZjgtaGFjaykgPQorCWVjaG8gMz0gJChydW50ZXN0ID91dGY4LWhhY2spID0KKwlzZXQgK1UKKwllY2hvIDErICQocnVudGVzdCB1dGY4LW1vZGUpID0KKwllY2hvIDIrICQocnVudGVzdCAhdXRmOC1tb2RlKSA9CisJZWNobyAzKyAkKHJ1bnRlc3QgP3V0ZjgtbW9kZSkgPQorCXNldCAtVQorCWVjaG8gMS0gJChydW50ZXN0IHV0ZjgtbW9kZSkgPQorCWVjaG8gMi0gJChydW50ZXN0ICF1dGY4LW1vZGUpID0KKwllY2hvIDMtICQocnVudGVzdCA/dXRmOC1tb2RlKSA9CisJZWNobyA9IHNob3J0IGZsYWdzID0KKwllY2hvIDB5ICQoaWZfdGVzdCAtVSkgPQorCWVjaG8gMHkgJChpZl90ZXN0ICtVKSA9CisJZWNobyAwbiAkKGlmX3Rlc3QgLV8pID0KKwllY2hvIDBuICQoaWZfdGVzdCAtVS0pID0KKwllY2hvIDE9ICQocnVudGVzdCAtXykgPQorCWVjaG8gMj0gJChydW50ZXN0ICEtXykgPQorCWVjaG8gMz0gJChydW50ZXN0ID8tXykgPQorCXNldCArVQorCWVjaG8gMSsgJChydW50ZXN0IC1VKSA9CisJZWNobyAyKyAkKHJ1bnRlc3QgIS1VKSA9CisJZWNobyAzKyAkKHJ1bnRlc3QgPy1VKSA9CisJZWNobyAxKyAkKHJ1bnRlc3QgK1UpID0KKwllY2hvIDIrICQocnVudGVzdCAhK1UpID0KKwllY2hvIDMrICQocnVudGVzdCA/K1UpID0KKwlzZXQgLVUKKwllY2hvIDEtICQocnVudGVzdCAtVSkgPQorCWVjaG8gMi0gJChydW50ZXN0ICEtVSkgPQorCWVjaG8gMy0gJChydW50ZXN0ID8tVSkgPQorCWVjaG8gMS0gJChydW50ZXN0ICtVKSA9CisJZWNobyAyLSAkKHJ1bnRlc3QgIStVKSA9CisJZWNobyAzLSAkKHJ1bnRlc3QgPytVKSA9CitleHBlY3RlZC1zdGRvdXQ6CisJMHkgMCAwIDAgMCA9CisJMG4gMSAxIDEgMSA9CisJMT0gMSAxIDEgPQorCTI9IDEgMSAxID0KKwkzPSAxIDEgMSA9CisJMSsgMSAxIDEgPQorCTIrIDAgMCAwID0KKwkzKyAwIDAgMCA9CisJMS0gMCAwIDAgPQorCTItIDEgMSAxID0KKwkzLSAwIDAgMCA9CisJPSBzaG9ydCBmbGFncyA9CisJMHkgMCAwIDAgMCA9CisJMHkgMCAwIDAgMCA9CisJMG4gMSAxIDEgMSA9CisJMG4gMSAxIDEgMSA9CisJMT0gMSAxIDEgPQorCTI9IDEgMSAxID0KKwkzPSAxIDEgMSA9CisJMSsgMSAxIDEgPQorCTIrIDAgMCAwID0KKwkzKyAwIDAgMCA9CisJMSsgMSAxIDEgPQorCTIrIDAgMCAwID0KKwkzKyAwIDAgMCA9CisJMS0gMCAwIDAgPQorCTItIDEgMSAxID0KKwkzLSAwIDAgMCA9CisJMS0gMCAwIDAgPQorCTItIDEgMSAxID0KKwkzLSAwIDAgMCA9CistLS0KK25hbWU6IG1rc2hyYy0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IH4vLm1rc2hyYyB3b3JrcyBjb3JyZWN0bHkuCisJUGFydCAxOiB2ZXJpZnkgdXNlciBlbnZpcm9ubWVudCBpcyBub3QgcmVhZCAoaW50ZXJuYWwpCitzdGRpbjoKKwllY2hvIHggJEZOT1JECitleHBlY3RlZC1zdGRvdXQ6CisJeAorLS0tCituYW1lOiBta3NocmMtMmEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgfi8ubWtzaHJjIHdvcmtzIGNvcnJlY3RseS4KKwlQYXJ0IDI6IHZlcmlmeSBta3NocmMgaXMgbm90IHJlYWQgKG5vbi1pbnRlcmFjdGl2ZSBzaGVsbHMpCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiLm1rc2hyYyIKKwlGTk9SRD00MgorZW52LXNldHVwOiAhSE9NRT0uIUVOVj0hCitzdGRpbjoKKwllY2hvIHggJEZOT1JECitleHBlY3RlZC1zdGRvdXQ6CisJeAorLS0tCituYW1lOiBta3NocmMtMmIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgfi8ubWtzaHJjIHdvcmtzIGNvcnJlY3RseS4KKwlQYXJ0IDI6IHZlcmlmeSBta3NocmMgY2FuIGJlIHJlYWQgKGludGVyYWN0aXZlIHNoZWxscykKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICIubWtzaHJjIgorCUZOT1JEPTQyCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUhPTUU9LiFFTlY9IVBTMT0hCitzdGRpbjoKKwllY2hvIHggJEZOT1JECitleHBlY3RlZC1zdGRvdXQ6CisJeCA0MgorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLygjICkqLworLS0tCituYW1lOiBta3NocmMtMworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB+Ly5ta3NocmMgd29ya3MgY29ycmVjdGx5LgorCVBhcnQgMzogdmVyaWZ5IG1rc2hyYyBjYW4gYmUgdHVybmVkIG9mZgorZmlsZS1zZXR1cDogZmlsZSA2NDQgIi5ta3NocmMiCisJRk5PUkQ9NDIKK2Vudi1zZXR1cDogIUhPTUU9LiFFTlY9bm9uZXhpc3RhbnQhCitzdGRpbjoKKwllY2hvIHggJEZOT1JECitleHBlY3RlZC1zdGRvdXQ6CisJeAorLS0tCituYW1lOiBzaC1tb2RlLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgc2ggbW9kZSB0dXJucyBicmFjZWV4cGFuZCBvZmYKKwlhbmQgdGhhdCB0aGF0IHdvcmtzIGNvcnJlY3RseQorc3RkaW46CisJc2V0IC1vIGJyYWNlZXhwYW5kCisJc2V0ICtvIHNoCisJW1sgJChzZXQgK28pID09ICpAKC1vIHNoKUAofCAqKSBdXSAmJiBlY2hvIHNoIHx8IGVjaG8gbm9zaAorCVtbICQoc2V0ICtvKSA9PSAqQCgtbyBicmFjZWV4cGFuZClAKHwgKikgXV0gJiYgZWNobyBicmV4IHx8IGVjaG8gbm9icmV4CisJZWNobyB7YSxiLGN9CisJc2V0ICtvIGJyYWNlZXhwYW5kCisJZWNobyB7YSxiLGN9CisJc2V0IC1vIGJyYWNlZXhwYW5kCisJZWNobyB7YSxiLGN9CisJc2V0IC1vIHNoCisJZWNobyB7YSxiLGN9CisJW1sgJChzZXQgK28pID09ICpAKC1vIHNoKUAofCAqKSBdXSAmJiBlY2hvIHNoIHx8IGVjaG8gbm9zaAorCVtbICQoc2V0ICtvKSA9PSAqQCgtbyBicmFjZWV4cGFuZClAKHwgKikgXV0gJiYgZWNobyBicmV4IHx8IGVjaG8gbm9icmV4CisJc2V0IC1vIGJyYWNlZXhwYW5kCisJZWNobyB7YSxiLGN9CisJW1sgJChzZXQgK28pID09ICpAKC1vIHNoKUAofCAqKSBdXSAmJiBlY2hvIHNoIHx8IGVjaG8gbm9zaAorCVtbICQoc2V0ICtvKSA9PSAqQCgtbyBicmFjZWV4cGFuZClAKHwgKikgXV0gJiYgZWNobyBicmV4IHx8IGVjaG8gbm9icmV4CitleHBlY3RlZC1zdGRvdXQ6CisJbm9zaAorCWJyZXgKKwlhIGIgYworCXthLGIsY30KKwlhIGIgYworCXthLGIsY30KKwlzaAorCW5vYnJleAorCWEgYiBjCisJc2gKKwlicmV4CistLS0KK25hbWU6IHNoLW1vZGUtMmEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgc2ggbW9kZSBpcyAqbm90KiBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvbgorY2F0ZWdvcnk6ICFiaW5zaAorc3RkaW46CisJbG4gLXMgIiRfX3Byb2duYW1lIiBrc2gKKwlsbiAtcyAiJF9fcHJvZ25hbWUiIHNoCisJbG4gLXMgIiRfX3Byb2duYW1lIiAuLy1rc2gKKwlsbiAtcyAiJF9fcHJvZ25hbWUiIC4vLXNoCisJZm9yIHNoZWxsIGluIHssLX17LGt9c2g7IGRvCisJCXByaW50IC0tICRzaGVsbCAkKC4vJHNoZWxsICtsIC1jIFwKKwkJICAgICdbWyAkKHNldCArbykgPT0gKkAoLW8gc2gpQCh8ICopIF1dICYmIGVjaG8gc2ggfHwgZWNobyBub3NoJykKKwlkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJc2ggbm9zaAorCWtzaCBub3NoCisJLXNoIG5vc2gKKwkta3NoIG5vc2gKKy0tLQorbmFtZTogc2gtbW9kZS0yYgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBzaCBtb2RlICppcyogYXV0b21hdGljYWxseSB0dXJuZWQgb24KK2NhdGVnb3J5OiBiaW5zaAorc3RkaW46CisJbG4gLXMgIiRfX3Byb2duYW1lIiBrc2gKKwlsbiAtcyAiJF9fcHJvZ25hbWUiIHNoCisJbG4gLXMgIiRfX3Byb2duYW1lIiAuLy1rc2gKKwlsbiAtcyAiJF9fcHJvZ25hbWUiIC4vLXNoCisJZm9yIHNoZWxsIGluIHssLX17LGt9c2g7IGRvCisJCXByaW50IC0tICRzaGVsbCAkKC4vJHNoZWxsICtsIC1jIFwKKwkJICAgICdbWyAkKHNldCArbykgPT0gKkAoLW8gc2gpQCh8ICopIF1dICYmIGVjaG8gc2ggfHwgZWNobyBub3NoJykKKwlkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJc2ggc2gKKwlrc2ggbm9zaAorCS1zaCBzaAorCS1rc2ggbm9zaAorLS0tCituYW1lOiBwaXBlbGluZS0xCitkZXNjcmlwdGlvbjoKKwlwZGtzaCBidWc6IGxhc3QgY29tbWFuZCBvZiBhIHBpcGVsaW5lIGlzIGV4ZWN1dGVkIGluIGEKKwlzdWJzaGVsbCAtIG1ha2Ugc3VyZSBpdCBzdGlsbCBpcywgc2NyaXB0cyBkZXBlbmQgb24gaXQKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJhYmN4IgorZmlsZS1zZXR1cDogZmlsZSA2NDQgImFiY3kiCitzdGRpbjoKKwllY2hvICoKKwllY2hvIGEgfCB3aGlsZSByZWFkIGQ7IGRvCisJCWVjaG8gJGQKKwkJZWNobyAkZCoKKwkJZWNobyAqCisJCXNldCAtbyBub2dsb2IKKwkJZWNobyAkZCoKKwkJZWNobyAqCisJZG9uZQorCWVjaG8gKgorZXhwZWN0ZWQtc3Rkb3V0OgorCWFiY3ggYWJjeQorCWEKKwlhYmN4IGFiY3kKKwlhYmN4IGFiY3kKKwlhKgorCSoKKwlhYmN4IGFiY3kKKy0tLQorbmFtZTogcGlwZWxpbmUtMgorZGVzY3JpcHRpb246CisJY2hlY2sgdGhhdCBjby1wcm9jZXNzZXMgd29yayB3aXRoIFRDT01zLCBUUElQRXMgYW5kIFRQQVJFTnMKK3N0ZGluOgorCSIkX19wcm9nbmFtZSIgLWMgJ2k9MTAwOyBlY2hvIGhpIHwmIHdoaWxlIHJlYWQgLXAgbGluZTsgZG8gZWNobyAiJCgoaSsrKSkgJGxpbmUiOyBkb25lJworCSIkX19wcm9nbmFtZSIgLWMgJ2k9MjAwOyBlY2hvIGhpIHwgY2F0IHwmIHdoaWxlIHJlYWQgLXAgbGluZTsgZG8gZWNobyAiJCgoaSsrKSkgJGxpbmUiOyBkb25lJworCSIkX19wcm9nbmFtZSIgLWMgJ2k9MzAwOyAoZWNobyBoaSB8IGNhdCkgfCYgd2hpbGUgcmVhZCAtcCBsaW5lOyBkbyBlY2hvICIkKChpKyspKSAkbGluZSI7IGRvbmUnCitleHBlY3RlZC1zdGRvdXQ6CisJMTAwIGhpCisJMjAwIGhpCisJMzAwIGhpCistLS0KK25hbWU6IHBlcnNpc3QtaGlzdG9yeS0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBwZXJzaXN0ZW50IGhpc3Rvcnkgc2F2aW5nIHdvcmtzCitjYXRlZ29yeTogIW5vLWhpc3RmaWxlCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiFISVNURklMRT1oaXN0LmZpbGUhCitmaWxlLXNldHVwOiBmaWxlIDY0NCAiRW52IgorCVBTMT1YCitzdGRpbjoKKwljYXQgaGlzdC5maWxlCitleHBlY3RlZC1zdGRvdXQtcGF0dGVybjoKKwkvY2F0IGhpc3QuZmlsZS8KK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS9eWCokLworLS0tCituYW1lOiB0eXBlc2V0LXBhZGRpbmctMQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgbGVmdC9yaWdodCBqdXN0aWZpY2F0aW9uIHdvcmtzIGFzIHBlciBURk0KK3N0ZGluOgorCXR5cGVzZXQgLUwxMCBsbj0waGFsbDAKKwl0eXBlc2V0IC1SMTAgcm49MGhhbGwwCisJdHlwZXNldCAtWkwxMCBsej0waGFsbDAKKwl0eXBlc2V0IC1aUjEwIHJ6PTBoYWxsMAorCXR5cGVzZXQgLVoxMCByeD0iIGhhbGxvICIKKwllY2hvICI8JGxuPiA8JHJuPiA8JGx6PiA8JHJ6PiA8JHJ4PiIKK2V4cGVjdGVkLXN0ZG91dDoKKwk8MGhhbGwwICAgID4gPCAgICAwaGFsbDA+IDxoYWxsMCAgICAgPiA8MDAwMDBoYWxsMD4gPDAwMDAgaGFsbG8+CistLS0KK25hbWU6IHR5cGVzZXQtcGFkZGluZy0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBiYXNlLSExMCBpbnRlZ2VycyBhcmUgcGFkZGVkIHJpZ2h0CitzdGRpbjoKKwl0eXBlc2V0IC1VdWkxNiAtTDkgbG49MTYjMQorCXR5cGVzZXQgLVV1aTE2IC1SOSBybj0xNiMxCisJdHlwZXNldCAtVXVpMTYgLVo5IHpuPTE2IzEKKwl0eXBlc2V0IC1MOSBscz0xNiMxCisJdHlwZXNldCAtUjkgcnM9MTYjMQorCXR5cGVzZXQgLVo5IHpzPTE2IzEKKwllY2hvICI8JGxuPiA8JHJuPiA8JHpuPiA8JGxzPiA8JHJzPiA8JHpzPiIKK2V4cGVjdGVkLXN0ZG91dDoKKwk8MTYjMSAgICAgPiA8ICAgICAxNiMxPiA8MTYjMDAwMDAxPiA8MTYjMSAgICAgPiA8ICAgICAxNiMxPiA8MDAwMDAxNiMxPgorLS0tCituYW1lOiB1dGY4Ym9tLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgdGhlIFVURi04IEJ5dGUgT3JkZXIgTWFyayBpcyBpZ25vcmVkIGFzIHRoZSBmaXJzdAorCW11bHRpYnl0ZSBjaGFyYWN0ZXIgb2YgdGhlIHNoZWxsIGlucHV0ICh3aXRoIC1jLCBmcm9tIHN0YW5kYXJkCisJaW5wdXQsIGFzIGZpbGUsIG9yIGFzIGV2YWwgYXJndW1lbnQpLCBidXQgbm93aGVyZSBlbHNlCisjIGJyZWFrcyBvbiBNYWMgT1NYIChIRlMrIG5vbi1zdGFuZGFyZCBVbmljb2RlIGNhbm9uaWNhbCBkZWNvbXBvc2l0aW9uKQorY2F0ZWdvcnk6ICFvczpkYXJ3aW4KK3N0ZGluOgorCW1rZGlyIGZvbworCXByaW50ICcjIS9iaW4vc2hcbmVjaG8gb2huZScgPmZvby9mbm9yZAorCXByaW50ICcjIS9iaW4vc2hcbmVjaG8gbWl0JyA+Zm9vL++7v2Zub3JkCisJcHJpbnQgJ++7v2Zub3JkXG5mbm9yZFxu77u/Zm5vcmRcbmZub3JkJyA+Zm9vL2JhcgorCXByaW50IGV2YWwgXCcn77u/Zm5vcmRcbmZub3JkXG7vu79mbm9yZFxuZm5vcmQnXCcgPmZvby96b28KKwlzZXQgLUEgYW56YWhsIC0tIGZvby8qCisJZWNobyBnb3QgJHsjYW56YWhsWypdfSBmaWxlcworCWNobW9kICt4IGZvby8qCisJZXhwb3J0IFBBVEg9JChwd2QpL2ZvbzokUEFUSAorCSIkX19wcm9nbmFtZSIgLWMgJ++7v2Zub3JkJworCWVjaG8gPQorCSIkX19wcm9nbmFtZSIgLWMgJ++7v2Zub3JkOyBmbm9yZDsg77u/Zm5vcmQ7IGZub3JkJworCWVjaG8gPQorCSIkX19wcm9nbmFtZSIgZm9vL2JhcgorCWVjaG8gPQorCSIkX19wcm9nbmFtZSIgPGZvby9iYXIKKwllY2hvID0KKwkiJF9fcHJvZ25hbWUiIGZvby96b28KKwllY2hvID0KKwkiJF9fcHJvZ25hbWUiIC1jICdlY2hvIO+7vzogJCjvu79mbm9yZCknCisJcm0gLXJmIGZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCWdvdCA0IGZpbGVzCisJb2huZQorCT0KKwlvaG5lCisJb2huZQorCW1pdAorCW9obmUKKwk9CisJb2huZQorCW9obmUKKwltaXQKKwlvaG5lCisJPQorCW9obmUKKwlvaG5lCisJbWl0CisJb2huZQorCT0KKwlvaG5lCisJb2huZQorCW1pdAorCW9obmUKKwk9CisJ77u/OiBtaXQKKy0tLQorbmFtZTogdXRmOGJvbS0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHdlIGNhbiBleGVjdXRlIEJPTS1zaGViYW5ncyAoZmFpbHVyZXMgbm90IGZhdGFsKQorCVhYWCBpZiB0aGUgT1MgY2FuIGFscmVhZHkgZXhlY3V0ZSB0aGVtLCB3ZSBsb3NlCisJbm90ZTogY3lnd2luIGV4ZWN2ZSgyKSBkb2Vzbid0IHJldHVybiB0byB1cyB3aXRoIEVOT0VYRUMsIHdlIGxvc2UKKwlub3RlOiBVbHRyaXggcGVybDUgdDQgcmV0dXJucyA2NTI4MCAoZXhpdC1jb2RlIDI1NSkgYW5kIG5vIHRleHQKK2NhdGVnb3J5OiAhb3M6Y3lnd2luLCFvczp1d2luLW50LCFvczp1bHRyaXgsIXNta3NoCitlbnYtc2V0dXA6ICFGT089QkFSIQorc3RkaW46CisJcHJpbnQgJyMhJyIkX19wcm9nbmFtZSInXG5wcmludCAiMSBhPSRFTlZ7Rk9PfSI7JyA+dDEKKwlwcmludCAn77u/IyEnIiRfX3Byb2duYW1lIidcbnByaW50ICIyIGE9JEVOVntGT099IjsnID50MgorCXByaW50ICcjISciJF9fcGVybG5hbWUiJ1xucHJpbnQgIjMgYT0kRU5We0ZPT31cbiI7JyA+dDMKKwlwcmludCAn77u/IyEnIiRfX3BlcmxuYW1lIidcbnByaW50ICI0IGE9JEVOVntGT099XG4iOycgPnQ0CisJY2htb2QgK3ggdD8KKwkuL3QxCisJLi90MgorCS4vdDMKKwkuL3Q0CitleHBlY3RlZC1zdGRvdXQ6CisJMSBhPS9ub25leGlzdGFudHtGT099CisJMiBhPS9ub25leGlzdGFudHtGT099CisJMyBhPUJBUgorCTQgYT1CQVIKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8oVW5yZWNvZ25pemVkIGNoYXJhY3RlciAuLi4uIGlnbm9yZWQgYXQgXC4udDQgbGluZSAxKSovCistLS0KK25hbWU6IHV0Zjhib20tMworZGVzY3JpcHRpb246CisJUmVhZGluZyB0aGUgVVRGLTggQk9NIHNob3VsZCBlbmFibGUgdGhlIHV0ZjgtbW9kZSBmbGFnCitzdGRpbjoKKwkiJF9fcHJvZ25hbWUiIC1jICc6OyBpZiBbWyAkLSA9ICpVKiBdXTsgdGhlbiBlY2hvIDEgb247IGVsc2UgZWNobyAxIG9mZjsgZmknCisJIiRfX3Byb2duYW1lIiAtYyAn77u/OjsgaWYgW1sgJC0gPSAqVSogXV07IHRoZW4gZWNobyAyIG9uOyBlbHNlIGVjaG8gMiBvZmY7IGZpJworZXhwZWN0ZWQtc3Rkb3V0OgorCTEgb2ZmCisJMiBvbgorLS0tCituYW1lOiB1dGY4b3B0LTFhCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHRoZSB1dGY4LW1vZGUgZmxhZyBpcyBub3Qgc2V0IGF0IG5vbi1pbnRlcmFjdGl2ZSBzdGFydHVwCitjYXRlZ29yeTogIW9zOmhwdXgKK2Vudi1zZXR1cDogIVBTMT0hUFMyPSFMQ19DVFlQRT1lbl9VUy5VVEYtOCEKK3N0ZGluOgorCWlmIFtbICQtID0gKlUqIF1dOyB0aGVuCisJCWVjaG8gaXMgc2V0CisJZWxzZQorCQllY2hvIGlzIG5vdCBzZXQKKwlmaQorZXhwZWN0ZWQtc3Rkb3V0OgorCWlzIG5vdCBzZXQKKy0tLQorbmFtZTogdXRmOG9wdC0xYgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB0aGUgdXRmOC1tb2RlIGZsYWcgaXMgbm90IHNldCBhdCBub24taW50ZXJhY3RpdmUgc3RhcnR1cAorY2F0ZWdvcnk6IG9zOmhwdXgKK2Vudi1zZXR1cDogIVBTMT0hUFMyPSFMQ19DVFlQRT1lbl9VUy51dGY4IQorc3RkaW46CisJaWYgW1sgJC0gPSAqVSogXV07IHRoZW4KKwkJZWNobyBpcyBzZXQKKwllbHNlCisJCWVjaG8gaXMgbm90IHNldAorCWZpCitleHBlY3RlZC1zdGRvdXQ6CisJaXMgbm90IHNldAorLS0tCituYW1lOiB1dGY4b3B0LTJhCitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHRoZSB1dGY4LW1vZGUgZmxhZyBpcyBzZXQgYXQgaW50ZXJhY3RpdmUgc3RhcnR1cC4KKwktRE1LU0hfQVNTVU1FX1VURjg9MCA9PiBleHBlY3RlZCBmYWlsdXJlLCBwbGVhc2UgaWdub3JlCisJLURNS1NIX0FTU1VNRV9VVEY4PTEgPT4gbm90IGV4cGVjdGVkLCBwbGVhc2UgaW52ZXN0aWdhdGUKKwktVU1LU0hfQVNTVU1FX1VURjggPT4gbm90IGV4cGVjdGVkLCBidXQgaWYgeW91ciBPUyBpcyBvbGQsCisJIHRyeSBwYXNzaW5nIEhBVkVfU0VUTE9DQUxFX0NUWVBFPTAgdG8gQnVpbGQuc2gKK2NhdGVnb3J5OiAhb3M6aHB1eAorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFQUzE9IVBTMj0hTENfQ1RZUEU9ZW5fVVMuVVRGLTghCitzdGRpbjoKKwlpZiBbWyAkLSA9ICpVKiBdXTsgdGhlbgorCQllY2hvIGlzIHNldAorCWVsc2UKKwkJZWNobyBpcyBub3Qgc2V0CisJZmkKK2V4cGVjdGVkLXN0ZG91dDoKKwlpcyBzZXQKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8oIyApKi8KKy0tLQorbmFtZTogdXRmOG9wdC0yYgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB0aGUgdXRmOC1tb2RlIGZsYWcgaXMgc2V0IGF0IGludGVyYWN0aXZlIHN0YXJ0dXAKKwlFeHBlY3RlZCBmYWlsdXJlIGlmIC1ETUtTSF9BU1NVTUVfVVRGOD0wCitjYXRlZ29yeTogb3M6aHB1eAorYXJndW1lbnRzOiAhLWkhCitlbnYtc2V0dXA6ICFQUzE9IVBTMj0hTENfQ1RZUEU9ZW5fVVMudXRmOCEKK3N0ZGluOgorCWlmIFtbICQtID0gKlUqIF1dOyB0aGVuCisJCWVjaG8gaXMgc2V0CisJZWxzZQorCQllY2hvIGlzIG5vdCBzZXQKKwlmaQorZXhwZWN0ZWQtc3Rkb3V0OgorCWlzIHNldAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLygjICkqLworLS0tCituYW1lOiB1dGY4b3B0LTMKK2Rlc2NyaXB0aW9uOgorCUVuc3VyZSDCsVUgb24gdGhlIGNvbW1hbmQgbGluZSBpcyBob25vdXJlZAorCSh0aGlzIHRlc3QgbWF5IHBhc3MgZmFsc2VseSBkZXBlbmRpbmcgb24gQ1BQRkxBR1MpCitzdGRpbjoKKwlleHBvcnQgaT0wCisJY29kZT0naWYgW1sgJC0gPSAqVSogXV07IHRoZW4gZWNobyAkaSBvbjsgZWxzZSBlY2hvICRpIG9mZjsgZmknCisJbGV0IGkrKzsgIiRfX3Byb2duYW1lIiAtVSAtYyAiJGNvZGUiCisJbGV0IGkrKzsgIiRfX3Byb2duYW1lIiArVSAtYyAiJGNvZGUiCisJbGV0IGkrKzsgIiRfX3Byb2duYW1lIiAtVSAtaWMgIiRjb2RlIgorCWxldCBpKys7ICIkX19wcm9nbmFtZSIgK1UgLWljICIkY29kZSIKKwllY2hvICQoKCsraSkpIGRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwkxIG9uCisJMiBvZmYKKwkzIG9uCisJNCBvZmYKKwk1IGRvbmUKKy0tLQorbmFtZTogYWxpYXNlcy0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBidWlsdC1pbiBzaGVsbCBhbGlhc2VzIGFyZSBva2F5CitjYXRlZ29yeTogIWFyZ2UKK3N0ZGluOgorCWFsaWFzCisJdHlwZXNldCAtZgorZXhwZWN0ZWQtc3Rkb3V0OgorCWF1dG9sb2FkPSd0eXBlc2V0IC1mdScKKwlmdW5jdGlvbnM9J3R5cGVzZXQgLWYnCisJaGFzaD0nYWxpYXMgLXQnCisJaGlzdG9yeT0nZmMgLWwnCisJaW50ZWdlcj0ndHlwZXNldCAtaScKKwlsb2NhbD10eXBlc2V0CisJbG9naW49J2V4ZWMgbG9naW4nCisJbmFtZXJlZj0ndHlwZXNldCAtbicKKwlub2h1cD0nbm9odXAgJworCXI9J2ZjIC1lIC0nCisJc291cmNlPSdQQVRIPSRQQVRIOi4gY29tbWFuZCAuJworCXN1c3BlbmQ9J2tpbGwgLVNUT1AgJCQnCisJdHlwZT0nd2hlbmNlIC12JworLS0tCituYW1lOiBhbGlhc2VzLTEtaGFydHo0CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBidWlsdC1pbiBzaGVsbCBhbGlhc2VzIGFyZSBva2F5CitjYXRlZ29yeTogYXJnZQorc3RkaW46CisJYWxpYXMKKwl0eXBlc2V0IC1mCitleHBlY3RlZC1zdGRvdXQ6CisJYXV0b2xvYWQ9J3R5cGVzZXQgLWZ1JworCWZ1bmN0aW9ucz0ndHlwZXNldCAtZicKKwloYXNoPSdhbGlhcyAtdCcKKwloaXN0b3J5PSdmYyAtbCcKKwlpbnRlZ2VyPSd0eXBlc2V0IC1pJworCWxvY2FsPXR5cGVzZXQKKwlsb2dpbj0nZXhlYyBsb2dpbicKKwluYW1lcmVmPSd0eXBlc2V0IC1uJworCW5vaHVwPSdub2h1cCAnCisJcj0nZmMgLWUgLScKKwlzb3VyY2U9J1BBVEg9JFBBVEg6LiBjb21tYW5kIC4nCisJdHlwZT0nd2hlbmNlIC12JworLS0tCituYW1lOiBhbGlhc2VzLTJhCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiDigJxzZXQgLW8gc2jigJ0gZGlzYWJsZXMgYnVpbHQtaW4gYWxpYXNlcyAoZXhjZXB0IGEgZmV3KQorY2F0ZWdvcnk6IGRpc2FibGVkCithcmd1bWVudHM6ICEtbyFzaCEKK3N0ZGluOgorCWFsaWFzCisJdHlwZXNldCAtZgorZXhwZWN0ZWQtc3Rkb3V0OgorCWludGVnZXI9J3R5cGVzZXQgLWknCisJbG9jYWw9dHlwZXNldAorLS0tCituYW1lOiBhbGlhc2VzLTNhCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBydW5uaW5nIGFzIHNoIGRpc2FibGVzIGJ1aWx0LWluIGFsaWFzZXMgKGV4Y2VwdCBhIGZldykKK2NhdGVnb3J5OiBkaXNhYmxlZAorYXJndW1lbnRzOiAhLW8hc2ghCitzdGRpbjoKKwljcCAiJF9fcHJvZ25hbWUiIHNoCisJLi9zaCAtYyAnYWxpYXM7IHR5cGVzZXQgLWYnCisJcm0gLWYgc2gKK2V4cGVjdGVkLXN0ZG91dDoKKwlpbnRlZ2VyPSd0eXBlc2V0IC1pJworCWxvY2FsPXR5cGVzZXQKKy0tLQorbmFtZTogYWxpYXNlcy0yYgorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYg4oCcc2V0IC1vIHNo4oCdIGRvZXMgbm90IGluZmx1ZW5jZSBidWlsdC1pbiBhbGlhc2VzCitjYXRlZ29yeTogIWFyZ2UKK2FyZ3VtZW50czogIS1vIXNoIQorc3RkaW46CisJYWxpYXMKKwl0eXBlc2V0IC1mCitleHBlY3RlZC1zdGRvdXQ6CisJYXV0b2xvYWQ9J3R5cGVzZXQgLWZ1JworCWZ1bmN0aW9ucz0ndHlwZXNldCAtZicKKwloYXNoPSdhbGlhcyAtdCcKKwloaXN0b3J5PSdmYyAtbCcKKwlpbnRlZ2VyPSd0eXBlc2V0IC1pJworCWxvY2FsPXR5cGVzZXQKKwlsb2dpbj0nZXhlYyBsb2dpbicKKwluYW1lcmVmPSd0eXBlc2V0IC1uJworCW5vaHVwPSdub2h1cCAnCisJcj0nZmMgLWUgLScKKwlzb3VyY2U9J1BBVEg9JFBBVEg6LiBjb21tYW5kIC4nCisJc3VzcGVuZD0na2lsbCAtU1RPUCAkJCcKKwl0eXBlPSd3aGVuY2UgLXYnCistLS0KK25hbWU6IGFsaWFzZXMtM2IKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIHJ1bm5pbmcgYXMgc2ggZG9lcyBub3QgaW5mbHVlbmNlIGJ1aWx0LWluIGFsaWFzZXMKK2NhdGVnb3J5OiAhYXJnZQorYXJndW1lbnRzOiAhLW8hc2ghCitzdGRpbjoKKwljcCAiJF9fcHJvZ25hbWUiIHNoCisJLi9zaCAtYyAnYWxpYXM7IHR5cGVzZXQgLWYnCisJcm0gLWYgc2gKK2V4cGVjdGVkLXN0ZG91dDoKKwlhdXRvbG9hZD0ndHlwZXNldCAtZnUnCisJZnVuY3Rpb25zPSd0eXBlc2V0IC1mJworCWhhc2g9J2FsaWFzIC10JworCWhpc3Rvcnk9J2ZjIC1sJworCWludGVnZXI9J3R5cGVzZXQgLWknCisJbG9jYWw9dHlwZXNldAorCWxvZ2luPSdleGVjIGxvZ2luJworCW5hbWVyZWY9J3R5cGVzZXQgLW4nCisJbm9odXA9J25vaHVwICcKKwlyPSdmYyAtZSAtJworCXNvdXJjZT0nUEFUSD0kUEFUSDouIGNvbW1hbmQgLicKKwlzdXNwZW5kPSdraWxsIC1TVE9QICQkJworCXR5cGU9J3doZW5jZSAtdicKKy0tLQorbmFtZTogYWxpYXNlcy0yYi1oYXJ0ejQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIOKAnHNldCAtbyBzaOKAnSBkb2VzIG5vdCBpbmZsdWVuY2UgYnVpbHQtaW4gYWxpYXNlcworY2F0ZWdvcnk6IGFyZ2UKK2FyZ3VtZW50czogIS1vIXNoIQorc3RkaW46CisJYWxpYXMKKwl0eXBlc2V0IC1mCitleHBlY3RlZC1zdGRvdXQ6CisJYXV0b2xvYWQ9J3R5cGVzZXQgLWZ1JworCWZ1bmN0aW9ucz0ndHlwZXNldCAtZicKKwloYXNoPSdhbGlhcyAtdCcKKwloaXN0b3J5PSdmYyAtbCcKKwlpbnRlZ2VyPSd0eXBlc2V0IC1pJworCWxvY2FsPXR5cGVzZXQKKwlsb2dpbj0nZXhlYyBsb2dpbicKKwluYW1lcmVmPSd0eXBlc2V0IC1uJworCW5vaHVwPSdub2h1cCAnCisJcj0nZmMgLWUgLScKKwlzb3VyY2U9J1BBVEg9JFBBVEg6LiBjb21tYW5kIC4nCisJdHlwZT0nd2hlbmNlIC12JworLS0tCituYW1lOiBhbGlhc2VzLTNiLWhhcnR6NAorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgcnVubmluZyBhcyBzaCBkb2VzIG5vdCBpbmZsdWVuY2UgYnVpbHQtaW4gYWxpYXNlcworY2F0ZWdvcnk6IGFyZ2UKK2FyZ3VtZW50czogIS1vIXNoIQorc3RkaW46CisJY3AgIiRfX3Byb2duYW1lIiBzaAorCS4vc2ggLWMgJ2FsaWFzOyB0eXBlc2V0IC1mJworCXJtIC1mIHNoCitleHBlY3RlZC1zdGRvdXQ6CisJYXV0b2xvYWQ9J3R5cGVzZXQgLWZ1JworCWZ1bmN0aW9ucz0ndHlwZXNldCAtZicKKwloYXNoPSdhbGlhcyAtdCcKKwloaXN0b3J5PSdmYyAtbCcKKwlpbnRlZ2VyPSd0eXBlc2V0IC1pJworCWxvY2FsPXR5cGVzZXQKKwlsb2dpbj0nZXhlYyBsb2dpbicKKwluYW1lcmVmPSd0eXBlc2V0IC1uJworCW5vaHVwPSdub2h1cCAnCisJcj0nZmMgLWUgLScKKwlzb3VyY2U9J1BBVEg9JFBBVEg6LiBjb21tYW5kIC4nCisJdHlwZT0nd2hlbmNlIC12JworLS0tCituYW1lOiBhbGlhc2VzLWZ1bmNkZWYtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgUE9TSVggZnVuY3Rpb25zIHRha2UgcHJlY2VkZW5jZXMgb3ZlciBhbGlhc2VzCitzdGRpbjoKKwlhbGlhcyBmb289J2VjaG8gbWFrcm8nCisJZm9vKCkgeworCQllY2hvIGZ1bmt0aW9uCisJfQorCWZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCWZ1bmt0aW9uCistLS0KK25hbWU6IGFsaWFzZXMtZnVuY2RlZi0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBQT1NJWCBmdW5jdGlvbnMgdGFrZSBwcmVjZWRlbmNlcyBvdmVyIGFsaWFzZXMKK3N0ZGluOgorCWFsaWFzIGZvbz0nZWNobyBtYWtybycKKwlmb28gKCkgeworCQllY2hvIGZ1bmt0aW9uCisJfQorCWZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCWZ1bmt0aW9uCistLS0KK25hbWU6IGFsaWFzZXMtZnVuY2RlZi0zCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBhbGlhc2VzIHRha2UgcHJlY2VkZW5jZXMgb3ZlciBLb3JuIGZ1bmN0aW9ucworc3RkaW46CisJYWxpYXMgZm9vPSdlY2hvIG1ha3JvJworCWZ1bmN0aW9uIGZvbyB7CisJCWVjaG8gZnVua3Rpb24KKwl9CisJZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJbWFrcm8KKy0tLQorbmFtZTogYXJyYXlzLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIEtvcm4gU2hlbGwgYXJyYXlzIHdvcmsgYXMgZXhwZWN0ZWQKK3N0ZGluOgorCXY9ImMgZCIKKwlzZXQgLUEgZm9vIC0tIGEgXCR2ICIkdiIgJyR2JyBiCisJZWNobyAiJHsjZm9vWypdfXwke2Zvb1swXX18JHtmb29bMV19fCR7Zm9vWzJdfXwke2Zvb1szXX18JHtmb29bNF19fCIKK2V4cGVjdGVkLXN0ZG91dDoKKwk1fGF8JHZ8YyBkfCR2fGJ8CistLS0KK25hbWU6IGFycmF5cy0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBiYXNoLXN0eWxlIGFycmF5cyB3b3JrIGFzIGV4cGVjdGVkCitjYXRlZ29yeTogIXNta3NoCitzdGRpbjoKKwl2PSJjIGQiCisJZm9vPShhIFwkdiAiJHYiICckdicgYikKKwllY2hvICIkeyNmb29bKl19fCR7Zm9vWzBdfXwke2Zvb1sxXX18JHtmb29bMl19fCR7Zm9vWzNdfXwke2Zvb1s0XX18IgorZXhwZWN0ZWQtc3Rkb3V0OgorCTV8YXwkdnxjIGR8JHZ8YnwKKy0tLQorbmFtZTogYXJyYXlzLTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIGFycmF5IGJvdW5kcyBhcmUgdWludDMyX3QKK3N0ZGluOgorCXNldCAtQSBmb28gYSBiIGMKKwlmb29bNDA5N109ZAorCWZvb1syMTQ3NDgzNjM3XT1lCisJZWNobyAke2Zvb1sqXX0KKwlmb29bLTFdPWYKKwllY2hvICR7Zm9vWzQyOTQ5NjcyOTVdfSBnICR7Zm9vWypdfQorZXhwZWN0ZWQtc3Rkb3V0OgorCWEgYiBjIGQgZQorCWYgZyBhIGIgYyBkIGUgZgorLS0tCituYW1lOiBhcnJheXMtNAorZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgS29ybiBTaGVsbCBhcnJheXMgd2l0aCBzcGVjaWZpZWQgaW5kaWNlcyB3b3JrIGFzIGV4cGVjdGVkCitjYXRlZ29yeTogIXNta3NoCitzdGRpbjoKKwl2PSJjIGQiCisJc2V0IC1BIGZvbyAtLSBbMV09XCR2IFsyXT0iJHYiIFs0XT0nJHYnIFswXT1hIFs1XT1iCisJZWNobyAiJHsjZm9vWypdfXwke2Zvb1swXX18JHtmb29bMV19fCR7Zm9vWzJdfXwke2Zvb1szXX18JHtmb29bNF19fCR7Zm9vWzVdfXwiCitleHBlY3RlZC1zdGRvdXQ6CisJNXxhfCR2fGMgZHx8JHZ8YnwKKy0tLQorbmFtZTogYXJyYXlzLTUKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIGJhc2gtc3R5bGUgYXJyYXlzIHdpdGggc3BlY2lmaWVkIGluZGljZXMgd29yayBhcyBleHBlY3RlZAorY2F0ZWdvcnk6ICFzbWtzaAorc3RkaW46CisJdj0iYyBkIgorCWZvbz0oWzFdPVwkdiBbMl09IiR2IiBbNF09JyR2JyBbMF09YSBbNV09YikKKwllY2hvICIkeyNmb29bKl19fCR7Zm9vWzBdfXwke2Zvb1sxXX18JHtmb29bMl19fCR7Zm9vWzNdfXwke2Zvb1s0XX18JHtmb29bNV19fCIKKwl4PShbMTI4XT1mb28gYmFyIGJheikKKwllY2hvIGs9ICR7IXhbKl19IC4KKwllY2hvIHY9ICR7eFsqXX0gLgorZXhwZWN0ZWQtc3Rkb3V0OgorCTV8YXwkdnxjIGR8fCR2fGJ8CisJaz0gMTI4IDEyOSAxMzAgLgorCXY9IGZvbyBiYXIgYmF6IC4KKy0tLQorbmFtZTogYXJyYXlzLTYKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIHdlIGNhbiBnZXQgdGhlIGFycmF5IGtleXMgKGluZGljZXMpIGZvciBpbmRleGVkIGFycmF5cywKKwlLb3JuIHNoZWxsIHN0eWxlCitzdGRpbjoKKwlvZigpIHsKKwkJaT0wCisJCWZvciB4IGluICIkQCI7IGRvCisJCQllY2hvIC1uICIkKChpKyspKTwkeD4iCisJCWRvbmUKKwkJZWNobworCX0KKwlmb29bMV09ZWlucworCXNldCB8IGdyZXAgJ15mb28nCisJZWNobyA9CisJZm9vWzBdPXp3ZWkKKwlmb29bNF09ZHJlaQorCXNldCB8IGdyZXAgJ15mb28nCisJZWNobyA9CisJZWNobyBhICQob2YgJHtmb29bKl19KSA9ICQob2YgJHtiYXJbKl19KSBhCisJZWNobyBiICQob2YgIiR7Zm9vWypdfSIpID0gJChvZiAiJHtiYXJbKl19IikgYgorCWVjaG8gYyAkKG9mICR7Zm9vW0BdfSkgPSAkKG9mICR7YmFyW0BdfSkgYworCWVjaG8gZCAkKG9mICIke2Zvb1tAXX0iKSA9ICQob2YgIiR7YmFyW0BdfSIpIGQKKwllY2hvIGUgJChvZiAkeyFmb29bKl19KSA9ICQob2YgJHshYmFyWypdfSkgZQorCWVjaG8gZiAkKG9mICIkeyFmb29bKl19IikgPSAkKG9mICIkeyFiYXJbKl19IikgZgorCWVjaG8gZyAkKG9mICR7IWZvb1tAXX0pID0gJChvZiAkeyFiYXJbQF19KSBnCisJZWNobyBoICQob2YgIiR7IWZvb1tAXX0iKSA9ICQob2YgIiR7IWJhcltAXX0iKSBoCitleHBlY3RlZC1zdGRvdXQ6CisJZm9vWzFdPWVpbnMKKwk9CisJZm9vWzBdPXp3ZWkKKwlmb29bMV09ZWlucworCWZvb1s0XT1kcmVpCisJPQorCWEgMDx6d2VpPjE8ZWlucz4yPGRyZWk+ID0gYQorCWIgMDx6d2VpIGVpbnMgZHJlaT4gPSAwPD4gYgorCWMgMDx6d2VpPjE8ZWlucz4yPGRyZWk+ID0gYworCWQgMDx6d2VpPjE8ZWlucz4yPGRyZWk+ID0gZAorCWUgMDwwPjE8MT4yPDQ+ID0gZQorCWYgMDwwIDEgND4gPSAwPD4gZgorCWcgMDwwPjE8MT4yPDQ+ID0gZworCWggMDwwPjE8MT4yPDQ+ID0gaAorLS0tCituYW1lOiBhcnJheXMtNworZGVzY3JpcHRpb246CisJQ2hlY2sgaWYgd2UgY2FuIGdldCB0aGUgYXJyYXkga2V5cyAoaW5kaWNlcykgZm9yIGluZGV4ZWQgYXJyYXlzLAorCUtvcm4gc2hlbGwgc3R5bGUsIGluIHNvbWUgY29ybmVyIGNhc2VzCitzdGRpbjoKKwllY2hvICFhcno6ICR7IWFyen0KKwllY2hvICFhcnpbMF06ICR7IWFyelswXX0KKwllY2hvICFhcnpbMV06ICR7IWFyelsxXX0KKwlhcno9Zm9vCisJZWNobyAhYXJ6OiAkeyFhcnp9CisJZWNobyAhYXJ6WzBdOiAkeyFhcnpbMF19CisJZWNobyAhYXJ6WzFdOiAkeyFhcnpbMV19CisJdW5zZXQgYXJ6CisJZWNobyAhYXJ6OiAkeyFhcnp9CisJZWNobyAhYXJ6WzBdOiAkeyFhcnpbMF19CisJZWNobyAhYXJ6WzFdOiAkeyFhcnpbMV19CitleHBlY3RlZC1zdGRvdXQ6CisJIWFyejogMAorCSFhcnpbMF06CisJIWFyelsxXToKKwkhYXJ6OiBhcnoKKwkhYXJ6WzBdOiAwCisJIWFyelsxXToKKwkhYXJ6OiAwCisJIWFyelswXToKKwkhYXJ6WzFdOgorLS0tCituYW1lOiBhcnJheXMtOAorZGVzY3JpcHRpb246CisJQ2hlY2sgc29tZSBiZWhhdmlvdXJhbCBydWxlcyBmb3IgYXJyYXlzLgorc3RkaW46CisJZm5hKCkgeworCQlzZXQgLUEgYWEgOQorCX0KKwlmbmIoKSB7CisJCXR5cGVzZXQgYWIKKwkJc2V0IC1BIGFiIDkKKwl9CisJZm5jKCkgeworCQl0eXBlc2V0IGFjCisJCXNldCAtQSBhYyA5MQorCQl1bnNldCBhYworCQlzZXQgLUEgYWMgOTIKKwl9CisJZm5kKCkgeworCQlzZXQgK0EgYWQgOQorCX0KKwlmbmUoKSB7CisJCXVuc2V0IGFlCisJCXNldCArQSBhZSA5CisJfQorCWZuZigpIHsKKwkJdW5zZXQgYWZbMF0KKwkJc2V0ICtBIGFmIDkKKwl9CisJZm5nKCkgeworCQl1bnNldCBhZ1sqXQorCQlzZXQgK0EgYWcgOQorCX0KKwlzZXQgLUEgYWEgMSAyCisJc2V0IC1BIGFiIDEgMgorCXNldCAtQSBhYyAxIDIKKwlzZXQgLUEgYWQgMSAyCisJc2V0IC1BIGFlIDEgMgorCXNldCAtQSBhZiAxIDIKKwlzZXQgLUEgYWcgMSAyCisJc2V0IC1BIGFoIDEgMgorCXR5cGVzZXQgLVozIGFhIGFiIGFjIGFkIGFlIGFmIGFnCisJcHJpbnQgMWEgJHthYVsqXX0gLgorCXByaW50IDFiICR7YWJbKl19IC4KKwlwcmludCAxYyAke2FjWypdfSAuCisJcHJpbnQgMWQgJHthZFsqXX0gLgorCXByaW50IDFlICR7YWVbKl19IC4KKwlwcmludCAxZiAke2FmWypdfSAuCisJcHJpbnQgMWcgJHthZ1sqXX0gLgorCXByaW50IDFoICR7YWhbKl19IC4KKwlmbmEKKwlmbmIKKwlmbmMKKwlmbmQKKwlmbmUKKwlmbmYKKwlmbmcKKwl0eXBlc2V0IC1aNSBhaFsqXQorCXByaW50IDJhICR7YWFbKl19IC4KKwlwcmludCAyYiAke2FiWypdfSAuCisJcHJpbnQgMmMgJHthY1sqXX0gLgorCXByaW50IDJkICR7YWRbKl19IC4KKwlwcmludCAyZSAke2FlWypdfSAuCisJcHJpbnQgMmYgJHthZlsqXX0gLgorCXByaW50IDJnICR7YWdbKl19IC4KKwlwcmludCAyaCAke2FoWypdfSAuCitleHBlY3RlZC1zdGRvdXQ6CisJMWEgMDAxIDAwMiAuCisJMWIgMDAxIDAwMiAuCisJMWMgMDAxIDAwMiAuCisJMWQgMDAxIDAwMiAuCisJMWUgMDAxIDAwMiAuCisJMWYgMDAxIDAwMiAuCisJMWcgMDAxIDAwMiAuCisJMWggMSAyIC4KKwkyYSA5IC4KKwkyYiAwMDEgMDAyIC4KKwkyYyA5MiAuCisJMmQgMDA5IDAwMiAuCisJMmUgOSAuCisJMmYgOSAwMDIgLgorCTJnIDAwOSAuCisJMmggMDAwMDEgMDAwMDIgLgorLS0tCituYW1lOiB2YXJleHBhbmQtc3Vic3RyLTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIGJhc2gtc3R5bGUgc3Vic3RyaW5nIGV4cGFuc2lvbiB3b3JrcworCXdoZW4gdXNpbmcgcG9zaXRpdmUgbnVtZXJpY3MKK3N0ZGluOgorCXg9YWJjZGVmZ2hpCisJdHlwZXNldCAtaSB5PTEyMzQ1Njc4OQorCXR5cGVzZXQgLWkgMTYgej0xMjM0NTY3ODkJIyAxNiM3NWJjZDE1CisJZWNobyBhIHQke3g6MjoyfSAke3k6MjozfSAke3o6MjozfSBhCisJZWNobyBiICR7eDo6M30gJHt5OjozfSAke3o6OjN9IGIKKwllY2hvIGMgJHt4OjI6fSAke3k6Mjp9ICR7ejoyOn0gYworCWVjaG8gZCAke3g6Mn0gJHt5OjJ9ICR7ejoyfSBkCisJZWNobyBlICR7eDoyOjZ9ICR7eToyOjZ9ICR7ejoyOjd9IGUKKwllY2hvIGYgJHt4OjI6N30gJHt5OjI6N30gJHt6OjI6OH0gZgorCWVjaG8gZyAke3g6Mjo4fSAke3k6Mjo4fSAke3o6Mjo5fSBnCitleHBlY3RlZC1zdGRvdXQ6CisJYSB0Y2QgMzQ1ICM3NSBhCisJYiBhYmMgMTIzIDE2IyBiCisJYyBjCisJZCBjZGVmZ2hpIDM0NTY3ODkgIzc1YmNkMTUgZAorCWUgY2RlZmdoIDM0NTY3OCAjNzViY2QxIGUKKwlmIGNkZWZnaGkgMzQ1Njc4OSAjNzViY2QxNSBmCisJZyBjZGVmZ2hpIDM0NTY3ODkgIzc1YmNkMTUgZworLS0tCituYW1lOiB2YXJleHBhbmQtc3Vic3RyLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIGJhc2gtc3R5bGUgc3Vic3RyaW5nIGV4cGFuc2lvbiB3b3JrcworCXdoZW4gdXNpbmcgbmVnYXRpdmUgbnVtZXJpY3Mgb3IgZXhwcmVzc2lvbnMKK3N0ZGluOgorCXg9YWJjZGVmZ2hpCisJdHlwZXNldCAtaSB5PTEyMzQ1Njc4OQorCXR5cGVzZXQgLWkgMTYgej0xMjM0NTY3ODkJIyAxNiM3NWJjZDE1CisJbj0yCisJZWNobyBhICR7eDokbjozfSAke3k6JG46M30gJHt6OiRuOjN9IGEKKwllY2hvIGIgJHt4OihuKTozfSAke3k6KG4pOjN9ICR7ejoobik6M30gYgorCWVjaG8gYyAke3g6KC0yKToxfSAke3k6KC0yKToxfSAke3o6KC0yKToxfSBjCisJZWNobyBkIHQke3g6IG46Mn0gJHt5OiBuOjN9ICR7ejogbjozfSBkCitleHBlY3RlZC1zdGRvdXQ6CisJYSBjZGUgMzQ1ICM3NSBhCisJYiBjZGUgMzQ1ICM3NSBiCisJYyBoIDggMSBjCisJZCB0Y2QgMzQ1ICM3NSBkCistLS0KK25hbWU6IHZhcmV4cGFuZC1zdWJzdHItMworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBzb21lIHRoaW5ncyB0aGF0IHdvcmsgaW4gYmFzaCBmYWlsLgorCVRoaXMgaXMgYnkgZGVzaWduLiBBbmQgdGhhdCBzb21lIHRoaW5ncyBmYWlsIGluIGJvdGguCitzdGRpbjoKKwlleHBvcnQgeD1hYmNkZWZnaGkgbj0yCisJIiRfX3Byb2duYW1lIiAtYyAnZWNobyB2JHt4OihuKX14JworCSIkX19wcm9nbmFtZSIgLWMgJ2VjaG8gdyR7eDogbn14JworCSIkX19wcm9nbmFtZSIgLWMgJ2VjaG8geCR7eDpufXgnCisJIiRfX3Byb2duYW1lIiAtYyAnZWNobyB5JHt4On14JworCSIkX19wcm9nbmFtZSIgLWMgJ2VjaG8geiR7eH14JworCSIkX19wcm9nbmFtZSIgLWMgJ3g9YWJjZGVmO3k9MTIzO2VjaG8gJHt4OiR7eToyOjF9OjJ9JyA+L2Rldi9udWxsIDI+JjE7IGVjaG8gJD8KK2V4cGVjdGVkLXN0ZG91dDoKKwl2Y2RlZmdoaXgKKwl3Y2RlZmdoaXgKKwl6YWJjZGVmZ2hpeAorCTEKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS94Om4uKmJhZCBzdWJzdGl0dXRpb24uKlxuLipiYWQgc3Vic3RpdHV0aW9uLworLS0tCituYW1lOiB2YXJleHBhbmQtc3Vic3RyLTQKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGNvcm5lciBjYXNlcyBmb3Igc3Vic3RyaW5nIGV4cGFuc2lvbgorc3RkaW46CisJeD1hYmNkZWZnaGkKKwlpbnRlZ2VyIHk9MgorCWVjaG8gYSAke3g6KHkgPT0gMSA/IDIgOiAzKTo0fSBhCitleHBlY3RlZC1zdGRvdXQ6CisJYSBkZWZnIGEKKy0tLQorbmFtZTogdmFyZXhwYW5kLXN1YnN0ci01QQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBzdWJzdHJpbmcgZXhwYW5zaW9ucyB3b3JrIG9uIGNoYXJhY3RlcnMKK3N0ZGluOgorCXNldCArVQorCXg9bcOkaAorCWVjaG8gYSAke3g6OjF9ICR7eDogLTF9IGEKKwllY2hvIGIgJHt4OjozfSAke3g6IC0zfSBiCisJZWNobyBjICR7eDoxOjJ9ICR7eDogLTM6Mn0gYworCWVjaG8gZCAkeyN4fSBkCitleHBlY3RlZC1zdGRvdXQ6CisJYSBtIGggYQorCWIgbcOkIMOkaCBiCisJYyDDpCDDpCBjCisJZCA0IGQKKy0tLQorbmFtZTogdmFyZXhwYW5kLXN1YnN0ci01VworZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCBzdWJzdHJpbmcgZXhwYW5zaW9ucyB3b3JrIG9uIGNoYXJhY3RlcnMKK3N0ZGluOgorCXNldCAtVQorCXg9bcOkaAorCWVjaG8gYSAke3g6OjF9ICR7eDogLTF9IGEKKwllY2hvIGIgJHt4OjoyfSAke3g6IC0yfSBiCisJZWNobyBjICR7eDoxOjF9ICR7eDogLTI6MX0gYworCWVjaG8gZCAkeyN4fSBkCitleHBlY3RlZC1zdGRvdXQ6CisJYSBtIGggYQorCWIgbcOkIMOkaCBiCisJYyDDpCDDpCBjCisJZCAzIGQKKy0tLQorbmFtZTogdmFyZXhwYW5kLXN1YnN0ci02CitkZXNjcmlwdGlvbjoKKwlDaGVjayB0aGF0IHN0cmluZyBzdWJzdGl0dXRpb24gd29ya3MgY29ycmVjdGx5CitzdGRpbjoKKwlmb289MQorCWJhcj0yCisJYmF6PXF3ZXJ0eXVpb3AKKwllY2hvIGEgJHtiYXo6IGZvbzogYmFyfQorCWVjaG8gYiAke2JhejogZm9vOiAkYmFyfQorCWVjaG8gYyAke2JhejogJGZvbzogYmFyfQorCWVjaG8gZCAke2JhejogJGZvbzogJGJhcn0KK2V4cGVjdGVkLXN0ZG91dDoKKwlhIHdlCisJYiB3ZQorCWMgd2UKKwlkIHdlCistLS0KK25hbWU6IHZhcmV4cGFuZC1udWxsLTEKK2Rlc2NyaXB0aW9uOgorCUVuc3VyZSBlbXB0eSBzdHJpbmdzIGV4cGFuZCBlbXB0aWx5CitzdGRpbjoKKwlwcmludCB4ICR7YX0gJHtifSB5CisJcHJpbnQgeiAke2EjP30gJHtiJT99IHcKKwlwcmludCB2ICR7YT19ICR7Yi9jL2R9IHUKK2V4cGVjdGVkLXN0ZG91dDoKKwl4IHkKKwl6IHcKKwl2IHUKKy0tLQorbmFtZTogdmFyZXhwYW5kLW51bGwtMgorZGVzY3JpcHRpb246CisJRW5zdXJlIGVtcHR5IHN0cmluZ3MsIHdoZW4gcXVvdGVkLCBhcmUgZXhwYW5kZWQgYXMgZW1wdHkgc3RyaW5ncworc3RkaW46CisJcHJpbnRmICc8JXM+ICcgMSAiJHthfSIgMiAiJHthIz99IiArICIke2IlP30iIDMgIiR7YT19IiArICIke2IvYy9kfSIKKwllY2hvIC4KK2V4cGVjdGVkLXN0ZG91dDoKKwk8MT4gPD4gPDI+IDw+IDwrPiA8PiA8Mz4gPD4gPCs+IDw+IC4KKy0tLQorbmFtZTogcHJpbnQtZnVubnktY2hhcnMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHByaW50IGJ1aWx0aW4ncyBjYXBhYmlsaXR5IHRvIG91dHB1dCBkZXNpZ25hdGVkIGNoYXJhY3RlcnMKK3N0ZGluOgorCXByaW50ICc8XDAxNDRcMDM0NFx4REJcdTAwREJcdTIwQUNcdURCXHg0MD4nCitleHBlY3RlZC1zdGRvdXQ6CisJPGTk28Ob4oKsw5tAPgorLS0tCituYW1lOiBwcmludC1ia3NsLWMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHByaW50IGJ1aWx0aW4ncyBcYyBlc2NhcGUKK3N0ZGluOgorCXByaW50ICdcY2EnOyBwcmludCBiCitleHBlY3RlZC1zdGRvdXQ6CisJYWIKKy0tLQorbmFtZTogcHJpbnQtbnVsLWNoYXJzCitkZXNjcmlwdGlvbjoKKwlDaGVjayBoYW5kbGluZyBvZiBOVUwgY2hhcmFjdGVycyBmb3IgcHJpbnQgYW5kIHJlYWQKKwlub3RlOiBzZWNvbmQgbGluZSBzaG91bGQgb3V0cHV0IOKAnDQgM+KAnSBidXQgd2UgY2Fubm90CisJaGFuZGxlIE5VTCBjaGFyYWN0ZXJzIGluIHN0cmluZ3MgeWV0CitzdGRpbjoKKwlwcmludCAkKCgkKHByaW50ICc8XDA+JyB8IHdjIC1jKSkpCisJeD0kKHByaW50ICc8XDA+JykKKwlwcmludCAkKCgkKHByaW50ICIkeCIgfCB3YyAtYykpKSAkeyN4fQorZXhwZWN0ZWQtc3Rkb3V0OgorCTQKKwkzIDIKKy0tLQorbmFtZTogcHJpbnQtZXNjYXBlcworZGVzY3JpcHRpb246CisJQ2hlY2sgYmFja3NsYXNoIGV4cGFuc2lvbiBieSB0aGUgcHJpbnQgYnVpbHRpbgorc3RkaW46CisJcHJpbnQgJ1wgXCFcIlwjXCRcJVwmJ1xcXCcnXChcKVwqXCtcLFwtXC5cL1wwXDFcMlwzXDRcNVw2XDdcOCcgXAorCSAgICAnXDlcOlw7XDxcPVw+XD9cQFxBXEJcQ1xEXEVcRlxHXEhcSVxKXEtcTFxNXE5cT1xQXFFcUlxTXFQnIFwKKwkgICAgJ1xVXFZcV1xYXFlcWlxbXFxcXVxeXF9cYFxhXGIgIFxkXGVcZlxnXGhcaVxqXGtcbFxtXG5cb1xwJyBcCisJICAgICdccVxyXHNcdFx1XHZcd1x4XHlcelx7XHxcfVx+JyAnXHUyMGFjZCcgJ1xVMjBhY2QnICdceDEyMycgXAorCSAgICAnXDB4JyAnXDAxMjMnICdcMDEyMzQnIHwgeworCQl0eXBlc2V0IC1VdWkxNiAtWjExIHBvcz0wCisJCXR5cGVzZXQgLVV1aTE2IC1aNSBodgorCQl0eXBlc2V0IC1pMSB3Yz0weDBBCisJCWRhc2M9CisJCW5sPSR7d2MjMSN9CisJCXdoaWxlIElGUz0gcmVhZCAtciBsaW5lOyBkbworCQkJbGluZT0kbGluZSRubAorCQkJd2hpbGUgW1sgLW4gJGxpbmUgXV07IGRvCisJCQkJaHY9MSMke2xpbmU6OjF9CisJCQkJaWYgKCggKHBvcyAmIDE1KSA9PSAwICkpOyB0aGVuCisJCQkJCSgoIHBvcyApKSAmJiBwcmludCAiJGRhc2N8IgorCQkJCQlwcmludCAtbiAiJHtwb3MjMTYjfSAgIgorCQkJCQlkYXNjPScgfCcKKwkJCQlmaQorCQkJCXByaW50IC1uICIke2h2IzE2I30gIgorCQkJCWlmICgoIChodiA8IDMyKSB8fCAoaHYgPiAxMjYpICkpOyB0aGVuCisJCQkJCWRhc2M9JGRhc2MuCisJCQkJZWxzZQorCQkJCQlkYXNjPSRkYXNjJHtsaW5lOjoxfQorCQkJCWZpCisJCQkJKCggKHBvcysrICYgMTUpID09IDcgKSkgJiYgcHJpbnQgLW4gLS0gJy0gJworCQkJCWxpbmU9JHtsaW5lOjF9CisJCQlkb25lCisJCWRvbmUKKwkJaWYgKCggKHBvcyAmIDE1KSAhPSAxICkpOyB0aGVuCisJCQl3aGlsZSAoKCBwb3MgJiAxNSApKTsgZG8KKwkJCQlwcmludCAtbiAnICAgJworCQkJCSgoIChwb3MrKyAmIDE1KSA9PSA3ICkpICYmIHByaW50IC1uIC0tICctICcKKwkJCWRvbmUKKwkJCXByaW50ICIkZGFzY3wiCisJCWZpCisJfQorZXhwZWN0ZWQtc3Rkb3V0OgorCTAwMDAwMDAwICA1QyAyMCA1QyAyMSA1QyAyMiA1QyAyMyAtIDVDIDI0IDVDIDI1IDVDIDI2IDVDIDI3ICB8XCBcIVwiXCNcJFwlXCZcJ3wKKwkwMDAwMDAxMCAgNUMgMjggNUMgMjkgNUMgMkEgNUMgMkIgLSA1QyAyQyA1QyAyRCA1QyAyRSA1QyAyRiAgfFwoXClcKlwrXCxcLVwuXC98CisJMDAwMDAwMjAgIDVDIDMxIDVDIDMyIDVDIDMzIDVDIDM0IC0gNUMgMzUgNUMgMzYgNUMgMzcgNUMgMzggIHxcMVwyXDNcNFw1XDZcN1w4fAorCTAwMDAwMDMwICAyMCA1QyAzOSA1QyAzQSA1QyAzQiA1QyAtIDNDIDVDIDNEIDVDIDNFIDVDIDNGIDVDICB8IFw5XDpcO1w8XD1cPlw/XHwKKwkwMDAwMDA0MCAgNDAgNUMgNDEgNUMgNDIgNUMgNDMgNUMgLSA0NCAxQiA1QyA0NiA1QyA0NyA1QyA0OCAgfEBcQVxCXENcRC5cRlxHXEh8CisJMDAwMDAwNTAgIDVDIDQ5IDVDIDRBIDVDIDRCIDVDIDRDIC0gNUMgNEQgNUMgNEUgNUMgNEYgNUMgNTAgIHxcSVxKXEtcTFxNXE5cT1xQfAorCTAwMDAwMDYwICA1QyA1MSA1QyA1MiA1QyA1MyA1QyA1NCAtIDIwIDVDIDU2IDVDIDU3IDVDIDU4IDVDICB8XFFcUlxTXFQgXFZcV1xYXHwKKwkwMDAwMDA3MCAgNTkgNUMgNUEgNUMgNUIgNUMgNUMgNUQgLSA1QyA1RSA1QyA1RiA1QyA2MCAwNyAwOCAgfFlcWlxbXF1cXlxfXGAuLnwKKwkwMDAwMDA4MCAgMjAgMjAgNUMgNjQgMUIgMEMgNUMgNjcgLSA1QyA2OCA1QyA2OSA1QyA2QSA1QyA2QiAgfCAgXGQuLlxnXGhcaVxqXGt8CisJMDAwMDAwOTAgIDVDIDZDIDVDIDZEIDBBIDVDIDZGIDVDIC0gNzAgMjAgNUMgNzEgMEQgNUMgNzMgMDkgIHxcbFxtLlxvXHAgXHEuXHMufAorCTAwMDAwMEEwICAwQiA1QyA3NyA1QyA3OSA1QyA3QSA1QyAtIDdCIDVDIDdDIDVDIDdEIDVDIDdFIDIwICB8Llx3XHlcelx7XHxcfVx+IHwKKwkwMDAwMDBCMCAgRTIgODIgQUMgNjQgMjAgRUYgQkYgQkQgLSAyMCAxMiAzMyAyMCA3OCAyMCA1MyAyMCAgfC4uLmQgLi4uIC4zIHggUyB8CisJMDAwMDAwQzAgIDUzIDM0IDBBICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgIHxTNC58CistLS0KK25hbWU6IGRvbGxhci1xdW90ZWQtc3RyaW5ncworZGVzY3JpcHRpb246CisJQ2hlY2sgYmFja3NsYXNoIGV4cGFuc2lvbiBieSAkJ+KApicgc3RyaW5ncworc3RkaW46CisJcHJpbnRmICclc1xuJyAkJ1wgXCFcIlwjXCRcJVwmXCdcKFwpXCpcK1wsXC1cLlwvIFwxXDJcM1w0XDVcNicgXAorCSAgICAkJ2FcMGInICQnYVwwMWInICQnXDdcOFw5XDpcO1w8XD1cPlw/XEBcQVxCXENcRFxFXEZcR1xIXEknIFwKKwkgICAgJCdcSlxLXExcTVxOXE9cUFxRXFJcU1xUXFUxXFZcV1xYXFlcWlxbXFxcXVxeXF9cYFxhXGJcZFxlJyBcCisJICAgICQnXGZcZ1xoXGlcalxrXGxcbVxuXG9ccFxxXHJcc1x0XHUxXHZcd1x4MVx5XHpce1x8XH1cfiAkeCcgXAorCSAgICAkJ1x1MjBhY2QnICQnXFUyMGFjZCcgJCdceDEyMycgJCdmblx4MHJkJyAkJ1wwMjM0JyAkJ1wyMzQnIFwKKwkgICAgJCdcMjM0NScgJCdcY2EnICQnXGMhJyAkJ1xjPycgJCdcY+KCrCcgJCdhXAorCWInIHwgeworCQl0eXBlc2V0IC1VdWkxNiAtWjExIHBvcz0wCisJCXR5cGVzZXQgLVV1aTE2IC1aNSBodgorCQl0eXBlc2V0IC1pMSB3Yz0weDBBCisJCWRhc2M9CisJCW5sPSR7d2MjMSN9CisJCXdoaWxlIElGUz0gcmVhZCAtciBsaW5lOyBkbworCQkJbGluZT0kbGluZSRubAorCQkJd2hpbGUgW1sgLW4gJGxpbmUgXV07IGRvCisJCQkJaHY9MSMke2xpbmU6OjF9CisJCQkJaWYgKCggKHBvcyAmIDE1KSA9PSAwICkpOyB0aGVuCisJCQkJCSgoIHBvcyApKSAmJiBwcmludCAiJGRhc2N8IgorCQkJCQlwcmludCAtbiAiJHtwb3MjMTYjfSAgIgorCQkJCQlkYXNjPScgfCcKKwkJCQlmaQorCQkJCXByaW50IC1uICIke2h2IzE2I30gIgorCQkJCWlmICgoIChodiA8IDMyKSB8fCAoaHYgPiAxMjYpICkpOyB0aGVuCisJCQkJCWRhc2M9JGRhc2MuCisJCQkJZWxzZQorCQkJCQlkYXNjPSRkYXNjJHtsaW5lOjoxfQorCQkJCWZpCisJCQkJKCggKHBvcysrICYgMTUpID09IDcgKSkgJiYgcHJpbnQgLW4gLS0gJy0gJworCQkJCWxpbmU9JHtsaW5lOjF9CisJCQlkb25lCisJCWRvbmUKKwkJaWYgKCggKHBvcyAmIDE1KSAhPSAxICkpOyB0aGVuCisJCQl3aGlsZSAoKCBwb3MgJiAxNSApKTsgZG8KKwkJCQlwcmludCAtbiAnICAgJworCQkJCSgoIChwb3MrKyAmIDE1KSA9PSA3ICkpICYmIHByaW50IC1uIC0tICctICcKKwkJCWRvbmUKKwkJCXByaW50ICIkZGFzY3wiCisJCWZpCisJfQorZXhwZWN0ZWQtc3Rkb3V0OgorCTAwMDAwMDAwICAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNyAtIDI4IDI5IDJBIDJCIDJDIDJEIDJFIDJGICB8ICEiIyQlJicoKSorLC0uL3wKKwkwMDAwMDAxMCAgMjAgMDEgMDIgMDMgMDQgMDUgMDYgMEEgLSA2MSAwQSA2MSAwMSA2MiAwQSAwNyAzOCAgfCAuLi4uLi4uYS5hLmIuLjh8CisJMDAwMDAwMjAgIDM5IDNBIDNCIDNDIDNEIDNFIDNGIDQwIC0gNDEgNDIgNDMgNDQgMUIgNDYgNDcgNDggIHw5Ojs8PT4/QEFCQ0QuRkdIfAorCTAwMDAwMDMwICA0OSAwQSA0QSA0QiA0QyA0RCA0RSA0RiAtIDUwIDUxIDUyIDUzIDU0IDAxIDU2IDU3ICB8SS5KS0xNTk9QUVJTVC5WV3wKKwkwMDAwMDA0MCAgNTggNTkgNUEgNUIgNUMgNUQgNUUgNUYgLSA2MCAwNyAwOCA2NCAxQiAwQSAwQyA2NyAgfFhZWltcXV5fYC4uZC4uLmd8CisJMDAwMDAwNTAgIDY4IDY5IDZBIDZCIDZDIDZEIDBBIDZGIC0gNzAgNzEgMEQgNzMgMDkgMDEgMEIgNzcgIHxoaWprbG0ub3BxLnMuLi53fAorCTAwMDAwMDYwICAwMSA3OSA3QSA3QiA3QyA3RCA3RSAyMCAtIDI0IDc4IDBBIEUyIDgyIEFDIDY0IDBBICB8Lnl6e3x9fiAkeC4uLi5kLnwKKwkwMDAwMDA3MCAgRUYgQkYgQkQgMEEgQzQgQTMgMEEgNjYgLSA2RSAwQSAxMyAzNCAwQSA5QyAwQSA5QyAgfC4uLi4uLi5mbi4uNC4uLi58CisJMDAwMDAwODAgIDM1IDBBIDAxIDBBIDAxIDBBIDdGIDBBIC0gMDIgODIgQUMgMEEgNjEgMEEgNjIgMEEgIHw1Li4uLi4uLi4uLi5hLmIufAorLS0tCituYW1lOiBkb2xsYXItcXVvdGVzLWluLWhlcmVkb2NzCitkZXNjcmlwdGlvbjoKKwlUaGV5IGFyZSwgaG93ZXZlciwgbm90IHBhcnNlZCBpbiBoZXJlIGRvY3VtZW50cworc3RkaW46CisJY2F0IDw8RU9GCisJCWRvbGxhciA9IHN0cmNocihzLCAnJCcpOwkvKiAnICovCisJRU9GCisJY2F0IDw8JCdhXHRiJworCWFcdGIKKwlhCWIKK2V4cGVjdGVkLXN0ZG91dDoKKwkJZG9sbGFyID0gc3RyY2hyKHMsICckJyk7CS8qICcgKi8KKwlhXHRiCistLS0KK25hbWU6IGRvbGxhci1xdW90ZXMtaW4taGVyZXN0cmluZ3MKK2Rlc2NyaXB0aW9uOgorCVRoZXkgYXJlLCBub3QgcGFyc2VkIGluIGhlcmUgc3RyaW5ncyBlaXRoZXIKK3N0ZGluOgorCWNhdCA8PDwiZG9sbGFyID0gc3RyY2hyKHMsICckJyk7CS8qICcgKi8iCisJY2F0IDw8PCdkb2xsYXIgPSBzdHJjaHIocywgJ1wnJyQnXCcnKTsJLyogJ1wnJyAqLycKKwl4PSJkb2xsYXIgPSBzdHJjaHIocywgJyQnKTsJLyogJyAqLyIKKwljYXQgPDw8IiR4IgorCWNhdCA8PDwkJ2FcRVswbVx0YicKK2V4cGVjdGVkLXN0ZG91dDoKKwlkb2xsYXIgPSBzdHJjaHIocywgJyQnKTsJLyogJyAqLworCWRvbGxhciA9IHN0cmNocihzLCAnJCcpOwkvKiAnICovCisJZG9sbGFyID0gc3RyY2hyKHMsICckJyk7CS8qICcgKi8KKwlhG1swbQliCistLS0KK25hbWU6IGRvdC1uZWVkcy1hcmd1bWVudAorZGVzY3JpcHRpb246CisJY2hlY2sgRGViaWFuICM0MTUxNjcgc29sdXRpb246ICcuJyB3aXRob3V0IGFyZ3VtZW50cyBzaG91bGQgZmFpbAorc3RkaW46CisJIiRfX3Byb2duYW1lIiAtYyAuCisJIiRfX3Byb2duYW1lIiAtYyBzb3VyY2UKK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJL1wuOiBtaXNzaW5nIGFyZ3VtZW50Lipcbi4qXC46IG1pc3NpbmcgYXJndW1lbnQvCistLS0KK25hbWU6IGFsaWFzLWZ1bmN0aW9uLW5vLWNvbmZsaWN0CitkZXNjcmlwdGlvbjoKKwltYWtlIGFsaWFzZXMgbm90IGNvbmZsaWN0IHdpdGggZnVuY3Rpb25zCisJbm90ZTogZm9yIGtzaC1saWtlIGZ1bmN0aW9ucywgdGhlIG9yZGVyIG9mIHByZWZlcmVuY2UgaXMKKwlkaWZmZXJlbnQ7IGJhc2ggb3V0cHV0cyBiYXogaW5zdGVhZCBvZiBiYXIgaW4gbGluZSAyIGJlbG93CitzdGRpbjoKKwlhbGlhcyBmb289J2VjaG8gYmFyJworCWZvbygpIHsKKwkJZWNobyBiYXoKKwl9CisJYWxpYXMga29ybj0nZWNobyBiYXInCisJZnVuY3Rpb24ga29ybiB7CisJCWVjaG8gYmF6CisJfQorCWZvbworCWtvcm4KKwl1bnNldCAtZiBmb28KKwlmb28gMj4mLSB8fCBlY2hvIHJhYgorZXhwZWN0ZWQtc3Rkb3V0OgorCWJhegorCWJhcgorCXJhYgorLS0tCituYW1lOiBiYXNoLWZ1bmN0aW9uLXBhcmVucworZGVzY3JpcHRpb246CisJZW5zdXJlIHRoZSBrZXl3b3JkIGZ1bmN0aW9uIGlzIGlnbm9yZWQgd2hlbiBwcmVjZWRpbmcKKwlQT1NJWCBzdHlsZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKGJhc2hpc20pCitzdGRpbjoKKwltaygpIHsKKwkJZWNobyAnIyEnIiRfX3Byb2duYW1lIgorCQllY2hvICIkMSB7IgorCQllY2hvICcJZWNobyAiYmFyPSdcJyckMCdcJ1wiCisJCWVjaG8gJ30nCisJCWVjaG8gJHsyOi1mb299CisJfQorCW1rICdmdW5jdGlvbiBmb28nID5mLWtvcm4KKwltayAnZm9vICgpJyA+Zi1kYXNoCisJbWsgJ2Z1bmN0aW9uIGZvbyAoKScgPmYtYmFzaAorCW1rICdmdW5jdGlvbiBzdG9wICgpJyBzdG9wID5mLXN0b3AKKwljaG1vZCAreCBmLSoKKwllY2hvICJrb3JuOiAkKC4vZi1rb3JuKSIKKwllY2hvICJkYXNoOiAkKC4vZi1kYXNoKSIKKwllY2hvICJiYXNoOiAkKC4vZi1iYXNoKSIKKwllY2hvICJzdG9wOiAkKC4vZi1zdG9wKSIKK2V4cGVjdGVkLXN0ZG91dDoKKwlrb3JuOiBiYXI9J2ZvbycKKwlkYXNoOiBiYXI9Jy4vZi1kYXNoJworCWJhc2g6IGJhcj0nLi9mLWJhc2gnCisJc3RvcDogYmFyPScuL2Ytc3RvcCcKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLW9uZS0xCitkZXNjcmlwdGlvbjoKKwljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgd29ya3MKK3N0ZGluOgorCXNldCAtVQorCXR5cGVzZXQgLVV1aTE2IGkwPTEj7yBpMT0xI+KCrAorCXR5cGVzZXQgLWkxIG8wYT02NAorCXR5cGVzZXQgLWkxIG8xYT0weDI2M0EKKwl0eXBlc2V0IC1VdWkxIG8wYj0weDdFCisJdHlwZXNldCAtVXVpMSBvMWI9MHhGREQwCisJaW50ZWdlciBweD0weENBRkUgJ3AwPTEjICcgcDE9MSPigKYgcGw9MSNmCisJZWNobyAiaW4gPCRpMD4gPCRpMT4iCisJZWNobyAib3V0IDwke28wYSMxI318JHtvMGIjMSN9PiA8JHtvMWEjMSN9fCR7bzFiIzEjfT4iCisJdHlwZXNldCAtVXVpMSBpMCBpMQorCWVjaG8gInBhc3MgPCRweD4gPCRwMD4gPCRwMT4gPCRwbD4gPCR7aTAjMSN9fCR7aTEjMSN9PiIKKwl0eXBlc2V0IC1VdWkxNiB0djE9MSN+IHR2Mj0xI38gdHYzPTEjgCB0djQ9MSOBIHR2NT0xI8AgdHY2PTEjwSB0djc9MSPCoCB0djg9MSPCgAorCWVjaG8gInNwZWNYIDwke3R2MSMxNiN9PiA8JHt0djIjMTYjfT4gPCR7dHYzIzE2I30+IDwke3R2NCMxNiN9PiA8JHt0djUjMTYjfT4gPCR7dHY2IzE2I30+IDwke3R2NyMxNiN9PiA8JHt0djgjMTYjfT4iCisJdHlwZXNldCAtaTEgdHYxIHR2MiB0djMgdHY0IHR2NSB0djYgdHY3IHR2OAorCWVjaG8gInNwZWNXIDwke3R2MSMxI30+IDwke3R2MiMxI30+IDwke3R2MyMxI30+IDwke3R2NCMxI30+IDwke3R2NSMxI30+IDwke3R2NiMxI30+IDwke3R2NyMxI30+IDwke3R2OCMxI30+IgorCXR5cGVzZXQgLWkxIHhzMT0weEVGN0YgeHMyPTB4RUY4MCB4czM9MHhGREQwCisJZWNobyAic3BlY1UgPCR7eHMxIzEjfT4gPCR7eHMyIzEjfT4gPCR7eHMzIzEjfT4iCitleHBlY3RlZC1zdGRvdXQ6CisJaW4gPDE2I0VGRUY+IDwxNiMyMEFDPgorCW91dCA8QHx+PiA84pi6fO+3kD4KKwlwYXNzIDwxNiNjYWZlPiA8MSMgPiA8MSPigKY+IDwxI2Y+IDzvfOKCrD4KKwlzcGVjWCA8N0U+IDw3Rj4gPEVGODA+IDxFRjgxPiA8RUZDMD4gPEVGQzE+IDxBMD4gPDgwPgorCXNwZWNXIDx+PiA8fz4gPIA+IDyBPiA8wD4gPME+IDzCoD4gPMKAPgorCXNwZWNVIDzuvb8+IDyAPiA877eQPgorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJhCitkZXNjcmlwdGlvbjoKKwljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgc3RvcHMgYXQgY29ycmVjdCBjaGFyYWN0ZXJzCitzdGRpbjoKKwlzZXQgLVUKKwlpbnRlZ2VyIHg9MSNmb28KKwllY2hvIC8keC8KK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8xI2ZvbzogdW5leHBlY3RlZCAnb28nLworZXhwZWN0ZWQtZXhpdDogZSAhPSAwCistLS0KK25hbWU6IGludGVnZXItYmFzZS1vbmUtMmIKK2Rlc2NyaXB0aW9uOgorCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSBzdG9wcyBhdCBjb3JyZWN0IGNoYXJhY3RlcnMKK3N0ZGluOgorCXNldCAtVQorCWludGVnZXIgeD0xI8CACisJZWNobyAvJHgvCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvMSPAgDogdW5leHBlY3RlZCAngCcvCitleHBlY3RlZC1leGl0OiBlICE9IDAKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yYzEKK2Rlc2NyaXB0aW9uOgorCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSBzdG9wcyBhdCBjb3JyZWN0IGNoYXJhY3RlcnMKK3N0ZGluOgorCXNldCAtVQorCWludGVnZXIgeD0xI+KApgorCWVjaG8gLyR4LworZXhwZWN0ZWQtc3Rkb3V0OgorCS8xI+KApi8KKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yYzIKK2Rlc2NyaXB0aW9uOgorCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSBzdG9wcyBhdCBjb3JyZWN0IGNoYXJhY3RlcnMKK3N0ZGluOgorCXNldCArVQorCWludGVnZXIgeD0xI+KApgorCWVjaG8gLyR4LworZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLzEj4oCmOiB1bmV4cGVjdGVkICeAJy8KK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJkMQorZGVzY3JpcHRpb246CisJY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIGhhbmRsZXMgb2N0ZXRzIG9rYXkKK3N0ZGluOgorCXNldCAtVQorCXR5cGVzZXQgLWkxNiB4PTEj/worCWVjaG8gLyR4LwkjIGludmFsaWQgdXRmLTgKK2V4cGVjdGVkLXN0ZG91dDoKKwkvMTYjZWZmZi8KKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yZDIKK2Rlc2NyaXB0aW9uOgorCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSBoYW5kbGVzIG9jdGV0cworc3RkaW46CisJc2V0IC1VCisJdHlwZXNldCAtaTE2IHg9MSPCCisJZWNobyAvJHgvCSMgaW52YWxpZCAyLWJ5dGUKK2V4cGVjdGVkLXN0ZG91dDoKKwkvMTYjZWZjMi8KKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yZDMKK2Rlc2NyaXB0aW9uOgorCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSBoYW5kbGVzIG9jdGV0cworc3RkaW46CisJc2V0IC1VCisJdHlwZXNldCAtaTE2IHg9MSPvCisJZWNobyAvJHgvCSMgaW52YWxpZCAyLWJ5dGUKK2V4cGVjdGVkLXN0ZG91dDoKKwkvMTYjZWZlZi8KKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLW9uZS0yZDQKK2Rlc2NyaXB0aW9uOgorCWNoZWNrIGlmIHRoZSB1c2Ugb2YgZmFrZSBpbnRlZ2VyIGJhc2UgMSBzdG9wcyBhdCBpbnZhbGlkIGlucHV0CitzdGRpbjoKKwlzZXQgLVUKKwl0eXBlc2V0IC1pMTYgeD0xI++/wAorCWVjaG8gLyR4LwkjIGludmFsaWQgMy1ieXRlCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvMSPvv8A6IHVuZXhwZWN0ZWQgJ78nLworZXhwZWN0ZWQtZXhpdDogZSAhPSAwCistLS0KK25hbWU6IGludGVnZXItYmFzZS1vbmUtMmQ1CitkZXNjcmlwdGlvbjoKKwljaGVjayBpZiB0aGUgdXNlIG9mIGZha2UgaW50ZWdlciBiYXNlIDEgc3RvcHMgYXQgaW52YWxpZCBpbnB1dAorc3RkaW46CisJc2V0IC1VCisJdHlwZXNldCAtaTE2IHg9MSPAgAorCWVjaG8gLyR4LwkjIG5vbi1taW5pbWFsaXN0aWMKK2V4cGVjdGVkLXN0ZGVyci1wYXR0ZXJuOgorCS8xI8CAOiB1bmV4cGVjdGVkICeAJy8KK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTJkNgorZGVzY3JpcHRpb246CisJY2hlY2sgaWYgdGhlIHVzZSBvZiBmYWtlIGludGVnZXIgYmFzZSAxIHN0b3BzIGF0IGludmFsaWQgaW5wdXQKK3N0ZGluOgorCXNldCAtVQorCXR5cGVzZXQgLWkxNiB4PTEj4ICACisJZWNobyAvJHgvCSMgbm9uLW1pbmltYWxpc3RpYworZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLzEj4ICAOiB1bmV4cGVjdGVkICeAJy8KK2V4cGVjdGVkLWV4aXQ6IGUgIT0gMAorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTNBCitkZXNjcmlwdGlvbjoKKwlzb21lIHNhbXBsZSBjb2RlIGZvciBoZXhkdW1waW5nCitzdGRpbjoKKwl7CisJCXByaW50ICdIZWxsbywgV29ybGQhXFxcbuOBk+OCk+OBq+OBoeOBr++8gScKKwkJdHlwZXNldCAtVXVpMTYgaT0weDEwMAorCQkjIGNoYW5nZSB0aGF0IHRvIDB4RkYgb25jZSB3ZSBjYW4gaGFuZGxlIGVtYmVkZGVkCisJCSMgTlVMIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyAvIGhlcmUgZG9jdW1lbnRzCisJCXdoaWxlICgoIGkrKyA8IDB4MUZGICkpOyBkbworCQkJcHJpbnQgLW4gIlx4JHtpIzE2IzF9IgorCQlkb25lCisJCXByaW50CisJfSB8IHsKKwkJdHlwZXNldCAtVXVpMTYgLVoxMSBwb3M9MAorCQl0eXBlc2V0IC1VdWkxNiAtWjUgaHYKKwkJdHlwZXNldCAtaTEgd2M9MHgwQQorCQlkYXNjPQorCQlubD0ke3djIzEjfQorCQl3aGlsZSBJRlM9IHJlYWQgLXIgbGluZTsgZG8KKwkJCWxpbmU9JGxpbmUkbmwKKwkJCXdoaWxlIFtbIC1uICRsaW5lIF1dOyBkbworCQkJCWh2PTEjJHtsaW5lOjoxfQorCQkJCWlmICgoIChwb3MgJiAxNSkgPT0gMCApKTsgdGhlbgorCQkJCQkoKCBwb3MgKSkgJiYgcHJpbnQgIiRkYXNjfCIKKwkJCQkJcHJpbnQgLW4gIiR7cG9zIzE2I30gICIKKwkJCQkJZGFzYz0nIHwnCisJCQkJZmkKKwkJCQlwcmludCAtbiAiJHtodiMxNiN9ICIKKwkJCQlpZiAoKCAoaHYgPCAzMikgfHwgKGh2ID4gMTI2KSApKTsgdGhlbgorCQkJCQlkYXNjPSRkYXNjLgorCQkJCWVsc2UKKwkJCQkJZGFzYz0kZGFzYyR7bGluZTo6MX0KKwkJCQlmaQorCQkJCSgoIChwb3MrKyAmIDE1KSA9PSA3ICkpICYmIHByaW50IC1uIC0tICctICcKKwkJCQlsaW5lPSR7bGluZToxfQorCQkJZG9uZQorCQlkb25lCisJCWlmICgoIChwb3MgJiAxNSkgIT0gMSApKTsgdGhlbgorCQkJd2hpbGUgKCggcG9zICYgMTUgKSk7IGRvCisJCQkJcHJpbnQgLW4gJyAgICcKKwkJCQkoKCAocG9zKysgJiAxNSkgPT0gNyApKSAmJiBwcmludCAtbiAtLSAnLSAnCisJCQlkb25lCisJCQlwcmludCAiJGRhc2N8IgorCQlmaQorCX0KK2V4cGVjdGVkLXN0ZG91dDoKKwkwMDAwMDAwMCAgNDggNjUgNkMgNkMgNkYgMkMgMjAgNTcgLSA2RiA3MiA2QyA2NCAyMSA1QyAwQSBFMyAgfEhlbGxvLCBXb3JsZCFcLi58CisJMDAwMDAwMTAgIDgxIDkzIEUzIDgyIDkzIEUzIDgxIEFCIC0gRTMgODEgQTEgRTMgODEgQUYgRUYgQkMgIHwuLi4uLi4uLi4uLi4uLi4ufAorCTAwMDAwMDIwICA4MSAwQSAwMSAwMiAwMyAwNCAwNSAwNiAtIDA3IDA4IDA5IDBBIDBCIDBDIDBEIDBFICB8Li4uLi4uLi4uLi4uLi4uLnwKKwkwMDAwMDAzMCAgMEYgMTAgMTEgMTIgMTMgMTQgMTUgMTYgLSAxNyAxOCAxOSAxQSAxQiAxQyAxRCAxRSAgfC4uLi4uLi4uLi4uLi4uLi58CisJMDAwMDAwNDAgIDFGIDIwIDIxIDIyIDIzIDI0IDI1IDI2IC0gMjcgMjggMjkgMkEgMkIgMkMgMkQgMkUgIHwuICEiIyQlJicoKSorLC0ufAorCTAwMDAwMDUwICAyRiAzMCAzMSAzMiAzMyAzNCAzNSAzNiAtIDM3IDM4IDM5IDNBIDNCIDNDIDNEIDNFICB8LzAxMjM0NTY3ODk6Ozw9PnwKKwkwMDAwMDA2MCAgM0YgNDAgNDEgNDIgNDMgNDQgNDUgNDYgLSA0NyA0OCA0OSA0QSA0QiA0QyA0RCA0RSAgfD9AQUJDREVGR0hJSktMTU58CisJMDAwMDAwNzAgIDRGIDUwIDUxIDUyIDUzIDU0IDU1IDU2IC0gNTcgNTggNTkgNUEgNUIgNUMgNUQgNUUgIHxPUFFSU1RVVldYWVpbXF1efAorCTAwMDAwMDgwICA1RiA2MCA2MSA2MiA2MyA2NCA2NSA2NiAtIDY3IDY4IDY5IDZBIDZCIDZDIDZEIDZFICB8X2BhYmNkZWZnaGlqa2xtbnwKKwkwMDAwMDA5MCAgNkYgNzAgNzEgNzIgNzMgNzQgNzUgNzYgLSA3NyA3OCA3OSA3QSA3QiA3QyA3RCA3RSAgfG9wcXJzdHV2d3h5ent8fX58CisJMDAwMDAwQTAgIDdGIDgwIDgxIDgyIDgzIDg0IDg1IDg2IC0gODcgODggODkgOEEgOEIgOEMgOEQgOEUgIHwuLi4uLi4uLi4uLi4uLi4ufAorCTAwMDAwMEIwICA4RiA5MCA5MSA5MiA5MyA5NCA5NSA5NiAtIDk3IDk4IDk5IDlBIDlCIDlDIDlEIDlFICB8Li4uLi4uLi4uLi4uLi4uLnwKKwkwMDAwMDBDMCAgOUYgQTAgQTEgQTIgQTMgQTQgQTUgQTYgLSBBNyBBOCBBOSBBQSBBQiBBQyBBRCBBRSAgfC4uLi4uLi4uLi4uLi4uLi58CisJMDAwMDAwRDAgIEFGIEIwIEIxIEIyIEIzIEI0IEI1IEI2IC0gQjcgQjggQjkgQkEgQkIgQkMgQkQgQkUgIHwuLi4uLi4uLi4uLi4uLi4ufAorCTAwMDAwMEUwICBCRiBDMCBDMSBDMiBDMyBDNCBDNSBDNiAtIEM3IEM4IEM5IENBIENCIENDIENEIENFICB8Li4uLi4uLi4uLi4uLi4uLnwKKwkwMDAwMDBGMCAgQ0YgRDAgRDEgRDIgRDMgRDQgRDUgRDYgLSBENyBEOCBEOSBEQSBEQiBEQyBERCBERSAgfC4uLi4uLi4uLi4uLi4uLi58CisJMDAwMDAxMDAgIERGIEUwIEUxIEUyIEUzIEU0IEU1IEU2IC0gRTcgRTggRTkgRUEgRUIgRUMgRUQgRUUgIHwuLi4uLi4uLi4uLi4uLi4ufAorCTAwMDAwMTEwICBFRiBGMCBGMSBGMiBGMyBGNCBGNSBGNiAtIEY3IEY4IEY5IEZBIEZCIEZDIEZEIEZFICB8Li4uLi4uLi4uLi4uLi4uLnwKKwkwMDAwMDEyMCAgRkYgMEEgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgfC4ufAorLS0tCituYW1lOiBpbnRlZ2VyLWJhc2Utb25lLTNXCitkZXNjcmlwdGlvbjoKKwlzb21lIHNhbXBsZSBjb2RlIGZvciBoZXhkdW1waW5nIFVuaWNvZGUKK3N0ZGluOgorCXNldCAtVQorCXsKKwkJcHJpbnQgJ0hlbGxvLCBXb3JsZCFcXFxu44GT44KT44Gr44Gh44Gv77yBJworCQl0eXBlc2V0IC1VdWkxNiBpPTB4MTAwCisJCSMgY2hhbmdlIHRoYXQgdG8gMHhGRiBvbmNlIHdlIGNhbiBoYW5kbGUgZW1iZWRkZWQKKwkJIyBOVUwgY2hhcmFjdGVycyBpbiBzdHJpbmdzIC8gaGVyZSBkb2N1bWVudHMKKwkJd2hpbGUgKCggaSsrIDwgMHgxRkYgKSk7IGRvCisJCQlwcmludCAtbiAiXHUke2kjMTYjMX0iCisJCWRvbmUKKwkJcHJpbnQKKwkJcHJpbnQgXFx4ZmYJCSMgaW52YWxpZCB1dGYtOAorCQlwcmludCBcXHhjMgkJIyBpbnZhbGlkIDItYnl0ZQorCQlwcmludCBcXHhlZlxceGJmXFx4YzAJIyBpbnZhbGlkIDMtYnl0ZQorCQlwcmludCBcXHhjMFxceDgwCSMgbm9uLW1pbmltYWxpc3RpYworCQlwcmludCBcXHhlMFxceDgwXFx4ODAJIyBub24tbWluaW1hbGlzdGljCisJCXByaW50ICfvv73vv77vv78nCSMgZW5kIG9mIHJhbmdlCisJfSB8IHsKKwkJdHlwZXNldCAtVXVpMTYgLVoxMSBwb3M9MAorCQl0eXBlc2V0IC1VdWkxNiAtWjcgaHYKKwkJdHlwZXNldCAtaTEgd2M9MHgwQQorCQl0eXBlc2V0IC1pIGxwb3MKKwkJZGFzYz0KKwkJbmw9JHt3YyMxI30KKwkJd2hpbGUgSUZTPSByZWFkIC1yIGxpbmU7IGRvCisJCQlsaW5lPSRsaW5lJG5sCisJCQlscG9zPTAKKwkJCXdoaWxlICgoIGxwb3MgPCAkeyNsaW5lfSApKTsgZG8KKwkJCQl3Yz0xIyR7bGluZToobHBvcysrKToxfQorCQkJCWlmICgoICh3YyA8IDMyKSB8fCBcCisJCQkJICAgICgod2MgPiAxMjYpICYmICh3YyA8IDE2MCkpICkpOyB0aGVuCisJCQkJCWRjaD0uCisJCQkJZWxpZiAoKCAod2MgJiAweEZGODApID09IDB4RUY4MCApKTsgdGhlbgorCQkJCQlkY2g977+9CisJCQkJZWxzZQorCQkJCQlkY2g9JHt3YyMxI30KKwkJCQlmaQorCQkJCWlmICgoIChwb3MgJiA3KSA9PSA3ICkpOyB0aGVuCisJCQkJCWRhc2M9JGRhc2MkZGNoCisJCQkJCWRjaD0KKwkJCQllbGlmICgoIChwb3MgJiA3KSA9PSAwICkpOyB0aGVuCisJCQkJCSgoIHBvcyApKSAmJiBwcmludCAiJGRhc2N8IgorCQkJCQlwcmludCAtbiAiJHtwb3MjMTYjfSAgIgorCQkJCQlkYXNjPScgfCcKKwkJCQlmaQorCQkJCWxldCBodj13YworCQkJCXByaW50IC1uICIke2h2IzE2I30gIgorCQkJCSgoIChwb3MrKyAmIDcpID09IDMgKSkgJiYgXAorCQkJCSAgICBwcmludCAtbiAtLSAnLSAnCisJCQkJZGFzYz0kZGFzYyRkY2gKKwkJCWRvbmUKKwkJZG9uZQorCQlpZiAoKCBwb3MgJiA3ICkpOyB0aGVuCisJCQl3aGlsZSAoKCBwb3MgJiA3ICkpOyBkbworCQkJCXByaW50IC1uICcgICAgICcKKwkJCQkoKCAocG9zKysgJiA3KSA9PSAzICkpICYmIHByaW50IC1uIC0tICctICcKKwkJCWRvbmUKKwkJCXByaW50ICIkZGFzY3wiCisJCWZpCisJfQorZXhwZWN0ZWQtc3Rkb3V0OgorCTAwMDAwMDAwICAwMDQ4IDAwNjUgMDA2QyAwMDZDIC0gMDA2RiAwMDJDIDAwMjAgMDA1NyAgfEhlbGxvLCBXfAorCTAwMDAwMDA4ICAwMDZGIDAwNzIgMDA2QyAwMDY0IC0gMDAyMSAwMDVDIDAwMEEgMzA1MyAgfG9ybGQhXC7jgZN8CisJMDAwMDAwMTAgIDMwOTMgMzA2QiAzMDYxIDMwNkYgLSBGRjAxIDAwMEEgMDAwMSAwMDAyICB844KT44Gr44Gh44Gv77yBLi4ufAorCTAwMDAwMDE4ICAwMDAzIDAwMDQgMDAwNSAwMDA2IC0gMDAwNyAwMDA4IDAwMDkgMDAwQSAgfC4uLi4uLi4ufAorCTAwMDAwMDIwICAwMDBCIDAwMEMgMDAwRCAwMDBFIC0gMDAwRiAwMDEwIDAwMTEgMDAxMiAgfC4uLi4uLi4ufAorCTAwMDAwMDI4ICAwMDEzIDAwMTQgMDAxNSAwMDE2IC0gMDAxNyAwMDE4IDAwMTkgMDAxQSAgfC4uLi4uLi4ufAorCTAwMDAwMDMwICAwMDFCIDAwMUMgMDAxRCAwMDFFIC0gMDAxRiAwMDIwIDAwMjEgMDAyMiAgfC4uLi4uICEifAorCTAwMDAwMDM4ICAwMDIzIDAwMjQgMDAyNSAwMDI2IC0gMDAyNyAwMDI4IDAwMjkgMDAyQSAgfCMkJSYnKCkqfAorCTAwMDAwMDQwICAwMDJCIDAwMkMgMDAyRCAwMDJFIC0gMDAyRiAwMDMwIDAwMzEgMDAzMiAgfCssLS4vMDEyfAorCTAwMDAwMDQ4ICAwMDMzIDAwMzQgMDAzNSAwMDM2IC0gMDAzNyAwMDM4IDAwMzkgMDAzQSAgfDM0NTY3ODk6fAorCTAwMDAwMDUwICAwMDNCIDAwM0MgMDAzRCAwMDNFIC0gMDAzRiAwMDQwIDAwNDEgMDA0MiAgfDs8PT4/QEFCfAorCTAwMDAwMDU4ICAwMDQzIDAwNDQgMDA0NSAwMDQ2IC0gMDA0NyAwMDQ4IDAwNDkgMDA0QSAgfENERUZHSElKfAorCTAwMDAwMDYwICAwMDRCIDAwNEMgMDA0RCAwMDRFIC0gMDA0RiAwMDUwIDAwNTEgMDA1MiAgfEtMTU5PUFFSfAorCTAwMDAwMDY4ICAwMDUzIDAwNTQgMDA1NSAwMDU2IC0gMDA1NyAwMDU4IDAwNTkgMDA1QSAgfFNUVVZXWFlafAorCTAwMDAwMDcwICAwMDVCIDAwNUMgMDA1RCAwMDVFIC0gMDA1RiAwMDYwIDAwNjEgMDA2MiAgfFtcXV5fYGFifAorCTAwMDAwMDc4ICAwMDYzIDAwNjQgMDA2NSAwMDY2IC0gMDA2NyAwMDY4IDAwNjkgMDA2QSAgfGNkZWZnaGlqfAorCTAwMDAwMDgwICAwMDZCIDAwNkMgMDA2RCAwMDZFIC0gMDA2RiAwMDcwIDAwNzEgMDA3MiAgfGtsbW5vcHFyfAorCTAwMDAwMDg4ICAwMDczIDAwNzQgMDA3NSAwMDc2IC0gMDA3NyAwMDc4IDAwNzkgMDA3QSAgfHN0dXZ3eHl6fAorCTAwMDAwMDkwICAwMDdCIDAwN0MgMDA3RCAwMDdFIC0gMDA3RiAwMDgwIDAwODEgMDA4MiAgfHt8fX4uLi4ufAorCTAwMDAwMDk4ICAwMDgzIDAwODQgMDA4NSAwMDg2IC0gMDA4NyAwMDg4IDAwODkgMDA4QSAgfC4uLi4uLi4ufAorCTAwMDAwMEEwICAwMDhCIDAwOEMgMDA4RCAwMDhFIC0gMDA4RiAwMDkwIDAwOTEgMDA5MiAgfC4uLi4uLi4ufAorCTAwMDAwMEE4ICAwMDkzIDAwOTQgMDA5NSAwMDk2IC0gMDA5NyAwMDk4IDAwOTkgMDA5QSAgfC4uLi4uLi4ufAorCTAwMDAwMEIwICAwMDlCIDAwOUMgMDA5RCAwMDlFIC0gMDA5RiAwMEEwIDAwQTEgMDBBMiAgfC4uLi4uwqDCocKifAorCTAwMDAwMEI4ICAwMEEzIDAwQTQgMDBBNSAwMEE2IC0gMDBBNyAwMEE4IDAwQTkgMDBBQSAgfMKjwqTCpcKmwqfCqMKpwqp8CisJMDAwMDAwQzAgIDAwQUIgMDBBQyAwMEFEIDAwQUUgLSAwMEFGIDAwQjAgMDBCMSAwMEIyICB8wqvCrMKtwq7Cr8KwwrHCsnwKKwkwMDAwMDBDOCAgMDBCMyAwMEI0IDAwQjUgMDBCNiAtIDAwQjcgMDBCOCAwMEI5IDAwQkEgIHzCs8K0wrXCtsK3wrjCucK6fAorCTAwMDAwMEQwICAwMEJCIDAwQkMgMDBCRCAwMEJFIC0gMDBCRiAwMEMwIDAwQzEgMDBDMiAgfMK7wrzCvcK+wr/DgMOBw4J8CisJMDAwMDAwRDggIDAwQzMgMDBDNCAwMEM1IDAwQzYgLSAwMEM3IDAwQzggMDBDOSAwMENBICB8w4PDhMOFw4bDh8OIw4nDinwKKwkwMDAwMDBFMCAgMDBDQiAwMENDIDAwQ0QgMDBDRSAtIDAwQ0YgMDBEMCAwMEQxIDAwRDIgIHzDi8OMw43DjsOPw5DDkcOSfAorCTAwMDAwMEU4ICAwMEQzIDAwRDQgMDBENSAwMEQ2IC0gMDBENyAwMEQ4IDAwRDkgMDBEQSAgfMOTw5TDlcOWw5fDmMOZw5p8CisJMDAwMDAwRjAgIDAwREIgMDBEQyAwMEREIDAwREUgLSAwMERGIDAwRTAgMDBFMSAwMEUyICB8w5vDnMOdw57Dn8Ogw6HDonwKKwkwMDAwMDBGOCAgMDBFMyAwMEU0IDAwRTUgMDBFNiAtIDAwRTcgMDBFOCAwMEU5IDAwRUEgIHzDo8Okw6XDpsOnw6jDqcOqfAorCTAwMDAwMTAwICAwMEVCIDAwRUMgMDBFRCAwMEVFIC0gMDBFRiAwMEYwIDAwRjEgMDBGMiAgfMOrw6zDrcOuw6/DsMOxw7J8CisJMDAwMDAxMDggIDAwRjMgMDBGNCAwMEY1IDAwRjYgLSAwMEY3IDAwRjggMDBGOSAwMEZBICB8w7PDtMO1w7bDt8O4w7nDunwKKwkwMDAwMDExMCAgMDBGQiAwMEZDIDAwRkQgMDBGRSAtIDAwRkYgMDAwQSBFRkZGIDAwMEEgIHzDu8O8w73DvsO/Lu+/vS58CisJMDAwMDAxMTggIEVGQzIgMDAwQSBFRkVGIEVGQkYgLSBFRkMwIDAwMEEgRUZDMCBFRjgwICB877+9Lu+/ve+/ve+/vS7vv73vv718CisJMDAwMDAxMjAgIDAwMEEgRUZFMCBFRjgwIEVGODAgLSAwMDBBIEZGRkQgRUZFRiBFRkJGICB8Lu+/ve+/ve+/vS7vv73vv73vv718CisJMDAwMDAxMjggIEVGQkUgRUZFRiBFRkJGIEVGQkYgLSAwMDBBICAgICAgICAgICAgICAgICB877+977+977+977+9LnwKKy0tLQorbmFtZTogaW50ZWdlci1iYXNlLW9uZS00CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBrc2g5My1zdHlsZSBiYXNlLW9uZSBpbnRlZ2VycyB3b3JrCitjYXRlZ29yeTogIXNta3NoCitzdGRpbjoKKwlzZXQgLVUKKwllY2hvIDEgJCgoJ2EnKSkKKwkoZWNobyAyZiAkKCgnYWEnKSkpIDI+JjEgfCBzZWQgInMvXlteJ10qJy8ycCAnLyIKKwllY2hvIDMgJCgoJ+KApicpKQorCXg9IidhJyIKKwllY2hvICI0IDwkeD4iCisJZWNobyA1ICQoKCR4KSkKKwllY2hvIDYgJCgoeCkpCitleHBlY3RlZC1zdGRvdXQ6CisJMSA5NworCTJwICdhYSc6IG11bHRpLWNoYXJhY3RlciBjaGFyYWN0ZXIgY29uc3RhbnQKKwkzIDgyMzAKKwk0IDwnYSc+CisJNSA5NworCTYgOTcKKy0tLQorbmFtZTogdWxpbWl0LTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIHdlIGNhbiB1c2UgYSBzcGVjaWZpYyBzeW50YXggaWRpb20gZm9yIHVsaW1pdAorc3RkaW46CisJaWYgISB4PSQodWxpbWl0IC1kKSB8fCBbWyAkeCA9IHVua25vd24gXV07IHRoZW4KKwkJI2VjaG8gZXhwZWN0ZWQgdG8gZmFpbCBvbiB0aGlzIE9TCisJCWVjaG8gb2theQorCWVsc2UKKwkJdWxpbWl0IC1kUyAkeCAmJiBlY2hvIG9rYXkKKwlmaQorZXhwZWN0ZWQtc3Rkb3V0OgorCW9rYXkKKy0tLQorbmFtZTogYmFzaGlvcC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBHTlUgYmFzaC1saWtlIEkvTyByZWRpcmVjdGlvbiB3b3JrcworCVBhcnQgMTogdGhpcyBpcyBhbHNvIHN1cHBvcnRlZCBieSBHTlUgYmFzaAorc3RkaW46CisJZXhlYyAzPiYxCisJZnVuY3Rpb24gdGhyZWVvdXQgeworCQllY2hvIHJhcworCQllY2hvIGR3YSA+JjIKKwkJZWNobyB0cmkgPiYzCisJfQorCXRocmVlb3V0ICY+Zm9vCisJZWNobyA9PT0KKwljYXQgZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJdHJpCisJPT09CisJcmFzCisJZHdhCistLS0KK25hbWU6IGJhc2hpb3AtMmEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIEdOVSBiYXNoLWxpa2UgSS9PIHJlZGlyZWN0aW9uIHdvcmtzCisJUGFydCAyOiB0aGlzIGlzICpub3QqIHN1cHBvcnRlZCBieSBHTlUgYmFzaAorc3RkaW46CisJZXhlYyAzPiYxCisJZnVuY3Rpb24gdGhyZWVvdXQgeworCQllY2hvIHJhcworCQllY2hvIGR3YSA+JjIKKwkJZWNobyB0cmkgPiYzCisJfQorCXRocmVlb3V0IDMmPmZvbworCWVjaG8gPT09CisJY2F0IGZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCXJhcworCT09PQorCWR3YQorCXRyaQorLS0tCituYW1lOiBiYXNoaW9wLTJiCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBHTlUgYmFzaC1saWtlIEkvTyByZWRpcmVjdGlvbiB3b3JrcworCVBhcnQgMjogdGhpcyBpcyAqbm90KiBzdXBwb3J0ZWQgYnkgR05VIGJhc2gKK3N0ZGluOgorCWV4ZWMgMz4mMQorCWZ1bmN0aW9uIHRocmVlb3V0IHsKKwkJZWNobyByYXMKKwkJZWNobyBkd2EgPiYyCisJCWVjaG8gdHJpID4mMworCX0KKwl0aHJlZW91dCAzPmZvbyAmPiYzCisJZWNobyA9PT0KKwljYXQgZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJPT09CisJcmFzCisJZHdhCisJdHJpCistLS0KK25hbWU6IGJhc2hpb3AtMmMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIGlmIEdOVSBiYXNoLWxpa2UgSS9PIHJlZGlyZWN0aW9uIHdvcmtzCisJUGFydCAyOiB0aGlzIGlzIHN1cHBvcnRlZCBieSBHTlUgYmFzaCA0IG9ubHkKK3N0ZGluOgorCWVjaG8gbWlyID5mb28KKwlzZXQgLW8gbm9jbG9iYmVyCisJZXhlYyAzPiYxCisJZnVuY3Rpb24gdGhyZWVvdXQgeworCQllY2hvIHJhcworCQllY2hvIGR3YSA+JjIKKwkJZWNobyB0cmkgPiYzCisJfQorCXRocmVlb3V0ICY+PmZvbworCWVjaG8gPT09CisJY2F0IGZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCXRyaQorCT09PQorCW1pcgorCXJhcworCWR3YQorLS0tCituYW1lOiBiYXNoaW9wLTNhCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBHTlUgYmFzaC1saWtlIEkvTyByZWRpcmVjdGlvbiBmYWlscyBjb3JyZWN0bHkKKwlQYXJ0IDE6IHRoaXMgaXMgYWxzbyBzdXBwb3J0ZWQgYnkgR05VIGJhc2gKK3N0ZGluOgorCWVjaG8gbWlyID5mb28KKwlzZXQgLW8gbm9jbG9iYmVyCisJZXhlYyAzPiYxCisJZnVuY3Rpb24gdGhyZWVvdXQgeworCQllY2hvIHJhcworCQllY2hvIGR3YSA+JjIKKwkJZWNobyB0cmkgPiYzCisJfQorCXRocmVlb3V0ICY+Zm9vCisJZWNobyA9PT0KKwljYXQgZm9vCitleHBlY3RlZC1zdGRvdXQ6CisJPT09CisJbWlyCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjogLy4qOiBjYW5ub3QgKGNyZWF0ZXxvdmVyd3JpdGUpIC4qLworLS0tCituYW1lOiBiYXNoaW9wLTNiCitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBHTlUgYmFzaC1saWtlIEkvTyByZWRpcmVjdGlvbiBmYWlscyBjb3JyZWN0bHkKKwlQYXJ0IDI6IHRoaXMgaXMgKm5vdCogc3VwcG9ydGVkIGJ5IEdOVSBiYXNoCitzdGRpbjoKKwllY2hvIG1pciA+Zm9vCisJc2V0IC1vIG5vY2xvYmJlcgorCWV4ZWMgMz4mMQorCWZ1bmN0aW9uIHRocmVlb3V0IHsKKwkJZWNobyByYXMKKwkJZWNobyBkd2EgPiYyCisJCWVjaG8gdHJpID4mMworCX0KKwl0aHJlZW91dCAmPnxmb28KKwllY2hvID09PQorCWNhdCBmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwl0cmkKKwk9PT0KKwlyYXMKKwlkd2EKKy0tLQorbmFtZTogYmFzaGlvcC00CitkZXNjcmlwdGlvbjoKKwlDaGVjayBpZiBHTlUgYmFzaC1saWtlIEkvTyByZWRpcmVjdGlvbiB3b3JrcworCVBhcnQgNDogdGhpcyBpcyBhbHNvIHN1cHBvcnRlZCBieSBHTlUgYmFzaCwKKwlidXQgZmFpbGVkIGluIHNvbWUgbWtzaCB2ZXJzaW9ucworc3RkaW46CisJZXhlYyAzPiYxCisJZnVuY3Rpb24gdGhyZWVvdXQgeworCQllY2hvIHJhcworCQllY2hvIGR3YSA+JjIKKwkJZWNobyB0cmkgPiYzCisJfQorCWZ1bmN0aW9uIGJsdWJiIHsKKwkJW1sgLWUgYmFyIF1dICYmIHRocmVlb3V0ICIkYmYiICY+Zm9vCisJfQorCWJsdWJiCisJZWNobyAtbiA+YmFyCisJYmx1YmIKKwllY2hvID09PQorCWNhdCBmb28KK2V4cGVjdGVkLXN0ZG91dDoKKwl0cmkKKwk9PT0KKwlyYXMKKwlkd2EKKy0tLQorbmFtZTogbWtzaGlvcC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBmb3Igc3VwcG9ydCBvZiBtb3JlIHRoYW4gOSBmaWxlIGRlc2NyaXB0b3JzCitjYXRlZ29yeTogIWNvbnZmZHMKK3N0ZGluOgorCXJlYWQgLXUxMCBmb28gMTA8PDwgYmFyCisJZWNobyB4JGZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCXhiYXIKKy0tLQorbmFtZTogbWtzaGlvcC0yCitkZXNjcmlwdGlvbjoKKwlDaGVjayBmb3Igc3VwcG9ydCBvZiBtb3JlIHRoYW4gOSBmaWxlIGRlc2NyaXB0b3JzCitjYXRlZ29yeTogIWNvbnZmZHMKK3N0ZGluOgorCWV4ZWMgMTI+Zm9vCisJcHJpbnQgLXUxMiBiYXIKKwllY2hvIGJheiA+JjEyCisJY2F0IGZvbworZXhwZWN0ZWQtc3Rkb3V0OgorCWJhcgorCWJhegorLS0tCituYW1lOiBva3NoLXNoY3Jhc2gKK2Rlc2NyaXB0aW9uOgorCXNyYy9yZWdyZXNzL2Jpbi9rc2gvc2hjcmFzaC5zaCx2IDEuMQorc3RkaW46CisJZGVwbGlicz0iLWx6IC1scG5nIC91c3IvbG9jYWwvbGliL2xpYmpwZWcubGEgLWx0aWZmIC1sbSAtbFgxMSAtbFhleHQgL3Vzci9sb2NhbC9saWIvbGliaWNvbnYubGEgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvcG9ydHMvZGV2ZWwvZ2V0dGV4dC93LWdldHRleHQtMC4xMC40MC9nZXR0ZXh0LTAuMTAuNDAvaW50bC8ubGlicyAvdXNyL2xvY2FsL2xpYi9saWJpbnRsLmxhIC91c3IvbG9jYWwvbGliL2xpYmdsaWIubGEgL3Vzci9sb2NhbC9saWIvbGliZ21vZHVsZS5sYSAtbGludGwgLWxtIC1sWDExIC1sWGV4dCAtTC91c3IvWDExUjYvbGliIC1sZ2xpYiAtbGdtb2R1bGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnZGsubGEgLWxpbnRsIC1sbSAtbFgxMSAtbFhleHQgLUwvdXNyL1gxMVI2L2xpYiAtbGdsaWIgLWxnbW9kdWxlIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ3RrLmxhIC1sdGlmZiAtbGpwZWcgLWx6IC1scG5nIC1sbSAtbFgxMSAtbFhleHQgLWxpbnRsIC1sZ2xpYiAtbGdtb2R1bGUgLWxnZGsgLWxndGsgLUwvdXNyL1gxMVI2L2xpYiAtbGdsaWIgLWxnbW9kdWxlIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ2RrX3BpeGJ1Zi5sYSAtbHogLWxwbmcgL3Vzci9sb2NhbC9saWIvbGliaWNvbnYubGEgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvcG9ydHMvZGV2ZWwvZ2V0dGV4dC93LWdldHRleHQtMC4xMC40MC9nZXR0ZXh0LTAuMTAuNDAvaW50bC8ubGlicyAvdXNyL2xvY2FsL2xpYi9saWJpbnRsLmxhIC91c3IvbG9jYWwvbGliL2xpYmdsaWIubGEgLWxtIC1sbSAvdXNyL2xvY2FsL2xpYi9saWJhdWRpb2ZpbGUubGEgLWxtIC1sbSAtbGF1ZGlvZmlsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmVzZC5sYSAtbG0gLWx6IC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ25vbWVzdXBwb3J0LmxhIC1sbSAtbHogLWxtIC1sZ2xpYiAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdub21lLmxhIC1sWDExIC1sWGV4dCAvdXNyL2xvY2FsL2xpYi9saWJpY29udi5sYSAtTC91c3IvbG9jYWwvbGliIC1ML3Vzci9wb3J0cy9kZXZlbC9nZXR0ZXh0L3ctZ2V0dGV4dC0wLjEwLjQwL2dldHRleHQtMC4xMC40MC9pbnRsLy5saWJzIC91c3IvbG9jYWwvbGliL2xpYmludGwubGEgL3Vzci9sb2NhbC9saWIvbGliZ21vZHVsZS5sYSAtbGludGwgLWxtIC1sWDExIC1sWGV4dCAtTC91c3IvWDExUjYvbGliIC1sZ2xpYiAtbGdtb2R1bGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnZGsubGEgLWxpbnRsIC1sbSAtbFgxMSAtbFhleHQgLUwvdXNyL1gxMVI2L2xpYiAtbGdsaWIgLWxnbW9kdWxlIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ3RrLmxhIC1sSUNFIC1sU00gLWx6IC1scG5nIC91c3IvbG9jYWwvbGliL2xpYnVuZ2lmLmxhIC91c3IvbG9jYWwvbGliL2xpYmpwZWcubGEgLWx0aWZmIC1sbSAtbHogLWxwbmcgL3Vzci9sb2NhbC9saWIvbGlidW5naWYubGEgLWx6IC91c3IvbG9jYWwvbGliL2xpYmpwZWcubGEgLWx0aWZmIC1ML3Vzci9sb2NhbC9saWIgLUwvdXNyL1gxMVI2L2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnZGtfaW1saWIubGEgLWxtIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliYXJ0X2xncGwubGEgLWxtIC1seiAtbG0gLWxYMTEgLWxYZXh0IC1saW50bCAtbGdsaWIgLWxnbW9kdWxlIC1sZ2RrIC1sZ3RrIC1sSUNFIC1sU00gLWxtIC1sWDExIC1sWGV4dCAtbGludGwgLWxnbGliIC1sZ21vZHVsZSAtbGdkayAtbGd0ayAtTC91c3IvWDExUjYvbGliIC1sbSAtbHogLWxwbmcgLWx1bmdpZiAtbHogLWxqcGVnIC1sdGlmZiAtbGpwZWcgLWxnZGtfaW1saWIgLWxnbGliIC1sbSAtbGF1ZGlvZmlsZSAtbG0gLWxhdWRpb2ZpbGUgLWxlc2QgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZXVpLmxhIC1seiAtbHogL3Vzci9sb2NhbC9saWIvbGlieG1sLmxhIC1seiAtbHogLWx6IC91c3IvbG9jYWwvbGliL2xpYnhtbC5sYSAtbG0gLWxYMTEgLWxYZXh0IC91c3IvbG9jYWwvbGliL2xpYmljb252LmxhIC1ML3Vzci9wb3J0cy9kZXZlbC9nZXR0ZXh0L3ctZ2V0dGV4dC0wLjEwLjQwL2dldHRleHQtMC4xMC40MC9pbnRsLy5saWJzIC91c3IvbG9jYWwvbGliL2xpYmludGwubGEgL3Vzci9sb2NhbC9saWIvbGliZ2xpYi5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbW9kdWxlLmxhIC1saW50bCAtbGdsaWIgLWxnbW9kdWxlIC91c3IvbG9jYWwvbGliL2xpYmdkay5sYSAvdXNyL2xvY2FsL2xpYi9saWJndGsubGEgLUwvdXNyL1gxMVI2L2xpYiAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdsYWRlLmxhIC1seiAtbHogLWx6IC91c3IvbG9jYWwvbGliL2xpYnhtbC5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbGliLmxhIC1sbSAtbG0gL3Vzci9sb2NhbC9saWIvbGliYXVkaW9maWxlLmxhIC1sbSAtbG0gLWxhdWRpb2ZpbGUgL3Vzci9sb2NhbC9saWIvbGliZXNkLmxhIC1sbSAtbHogL3Vzci9sb2NhbC9saWIvbGliZ25vbWVzdXBwb3J0LmxhIC1sbSAtbHogLWxtIC1sZ2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZS5sYSAtbFgxMSAtbFhleHQgL3Vzci9sb2NhbC9saWIvbGliaWNvbnYubGEgLUwvdXNyL3BvcnRzL2RldmVsL2dldHRleHQvdy1nZXR0ZXh0LTAuMTAuNDAvZ2V0dGV4dC0wLjEwLjQwL2ludGwvLmxpYnMgL3Vzci9sb2NhbC9saWIvbGliaW50bC5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbW9kdWxlLmxhIC1saW50bCAtbG0gLWxYMTEgLWxYZXh0IC1sZ2xpYiAtbGdtb2R1bGUgL3Vzci9sb2NhbC9saWIvbGliZ2RrLmxhIC1saW50bCAtbG0gLWxYMTEgLWxYZXh0IC1sZ2xpYiAtbGdtb2R1bGUgL3Vzci9sb2NhbC9saWIvbGliZ3RrLmxhIC1sSUNFIC1sU00gLWx6IC1scG5nIC91c3IvbG9jYWwvbGliL2xpYnVuZ2lmLmxhIC91c3IvbG9jYWwvbGliL2xpYmpwZWcubGEgLWx0aWZmIC1sbSAtbHogLWx6IC91c3IvbG9jYWwvbGliL2xpYmdka19pbWxpYi5sYSAvdXNyL2xvY2FsL2xpYi9saWJhcnRfbGdwbC5sYSAtbG0gLWx6IC1sbSAtbFgxMSAtbFhleHQgLWxpbnRsIC1sZ2xpYiAtbGdtb2R1bGUgLWxnZGsgLWxndGsgLWxtIC1sWDExIC1sWGV4dCAtbGludGwgLWxnbGliIC1sZ21vZHVsZSAtbGdkayAtbGd0ayAtbG0gLWx6IC1sdW5naWYgLWx6IC1sanBlZyAtbGpwZWcgLWxnZGtfaW1saWIgLWxnbGliIC1sbSAtbGF1ZGlvZmlsZSAtbG0gLWxhdWRpb2ZpbGUgLWxlc2QgL3Vzci9sb2NhbC9saWIvbGliZ25vbWV1aS5sYSAtTC91c3IvWDExUjYvbGliIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ2xhZGUtZ25vbWUubGEgL3Vzci9sb2NhbC9saWIvbGliZ2xpYi5sYSAtbG0gLWxtIC91c3IvbG9jYWwvbGliL2xpYmF1ZGlvZmlsZS5sYSAtbG0gLWxtIC1sYXVkaW9maWxlIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZXNkLmxhIC1sbSAtbHogLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJnbm9tZXN1cHBvcnQubGEgLWxtIC1seiAtbG0gLWxnbGliIC1ML3Vzci9sb2NhbC9saWIgL3Vzci9sb2NhbC9saWIvbGliZ25vbWUubGEgLWxYMTEgLWxYZXh0IC91c3IvbG9jYWwvbGliL2xpYmljb252LmxhIC1ML3Vzci9sb2NhbC9saWIgLUwvdXNyL3BvcnRzL2RldmVsL2dldHRleHQvdy1nZXR0ZXh0LTAuMTAuNDAvZ2V0dGV4dC0wLjEwLjQwL2ludGwvLmxpYnMgL3Vzci9sb2NhbC9saWIvbGliaW50bC5sYSAvdXNyL2xvY2FsL2xpYi9saWJnbW9kdWxlLmxhIC1saW50bCAtbG0gLWxYMTEgLWxYZXh0IC1ML3Vzci9YMTFSNi9saWIgLWxnbGliIC1sZ21vZHVsZSAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdkay5sYSAtbGludGwgLWxtIC1sWDExIC1sWGV4dCAtTC91c3IvWDExUjYvbGliIC1sZ2xpYiAtbGdtb2R1bGUgLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJndGsubGEgLWxJQ0UgLWxTTSAtbHogLWxwbmcgL3Vzci9sb2NhbC9saWIvbGlidW5naWYubGEgL3Vzci9sb2NhbC9saWIvbGlianBlZy5sYSAtbHRpZmYgLWxtIC1seiAtbHBuZyAvdXNyL2xvY2FsL2xpYi9saWJ1bmdpZi5sYSAtbHogL3Vzci9sb2NhbC9saWIvbGlianBlZy5sYSAtbHRpZmYgLUwvdXNyL2xvY2FsL2xpYiAtTC91c3IvWDExUjYvbGliIC91c3IvbG9jYWwvbGliL2xpYmdka19pbWxpYi5sYSAtbG0gLUwvdXNyL2xvY2FsL2xpYiAvdXNyL2xvY2FsL2xpYi9saWJhcnRfbGdwbC5sYSAtbG0gLWx6IC1sbSAtbFgxMSAtbFhleHQgLWxpbnRsIC1sZ2xpYiAtbGdtb2R1bGUgLWxnZGsgLWxndGsgLWxJQ0UgLWxTTSAtbG0gLWxYMTEgLWxYZXh0IC1saW50bCAtbGdsaWIgLWxnbW9kdWxlIC1sZ2RrIC1sZ3RrIC1ML3Vzci9YMTFSNi9saWIgLWxtIC1seiAtbHBuZyAtbHVuZ2lmIC1seiAtbGpwZWcgLWx0aWZmIC1sanBlZyAtbGdka19pbWxpYiAtbGdsaWIgLWxtIC1sYXVkaW9maWxlIC1sbSAtbGF1ZGlvZmlsZSAtbGVzZCAtTC91c3IvbG9jYWwvbGliIC91c3IvbG9jYWwvbGliL2xpYmdub21ldWkubGEgLUwvdXNyL1gxMVI2L2xpYiAtTC91c3IvbG9jYWwvbGliIgorCXNwZWNpYWxkZXBsaWJzPSItbGdub21ldWkgLWxhcnRfbGdwbCAtbGdka19pbWxpYiAtbHRpZmYgLWxqcGVnIC1sdW5naWYgLWxwbmcgLWx6IC1sU00gLWxJQ0UgLWxndGsgLWxnZGsgLWxnbW9kdWxlIC1saW50bCAtbFhleHQgLWxYMTEgLWxnbm9tZSAtbGdub21lc3VwcG9ydCAtbGVzZCAtbGF1ZGlvZmlsZSAtbG0gLWxnbGliIgorCWZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJCWNhc2UgJGRlcGxpYiBpbgorCQktTCopCisJCQluZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiCisJCQk7OworCQkqKQorCQkJY2FzZSAiICRzcGVjaWFsZGVwbGlicyAiIGluCisJCQkqIiAkZGVwbGliICIqKQorCQkJCW5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyI7OworCQkJZXNhYworCQkJOzsKKwkJZXNhYworCWRvbmUKKy0tLQorbmFtZTogb2tzaC12YXJmdW5jdGlvbi1tb2QxCitkZXNjcmlwdGlvbjoKKwkkT3BlbkJTRDogdmFyZnVuY3Rpb24uc2gsdiAxLjEgMjAwMy8xMi8xNSAwNToyODo0MCBvdHRvIEV4cCAkCisJQ2FsbGluZworCQlGT089YmFyIGYKKwl3aGVyZSBmIGlzIGEga3NoIHN0eWxlIGZ1bmN0aW9uLCBzaG91bGQgbm90IHNldCBGT08gaW4gdGhlIGN1cnJlbnQKKwllbnYuIElmIGYgaXMgYSBCb3VybmUgc3R5bGUgZnVuY3Rpb24sIEZPTyBzaG91bGQgYmUgc2V0LiBGdXJ0aGVybW9yZSwKKwl0aGUgZnVuY3Rpb24gc2hvdWxkIHJlY2VpdmUgYSBjb3JyZWN0IHZhbHVlIG9mIEZPTy4gSG93ZXZlciwgZGlmZmVyaW5nCisJZnJvbSBva3NoLCBzZXR0aW5nIEZPTyBpbiB0aGUgZnVuY3Rpb24gaXRzZWxmIG11c3QgY2hhbmdlIHRoZSB2YWx1ZSBpbgorCXNldHRpbmcgRk9PIGluIHRoZSBmdW5jdGlvbiBpdHNlbGYgc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIGluCisJZ2xvYmFsIGVudmlyb25tZW50LgorCUluc3BpcmVkIGJ5IFBSIDI0NTAuCitzdGRpbjoKKwlmdW5jdGlvbiBrIHsKKwkJaWYgWyB4JEZPTyAhPSB4YmFyIF07IHRoZW4KKwkJCWVjaG8gMQorCQkJcmV0dXJuIDEKKwkJZmkKKwkJeD0kKGVudiB8IGdyZXAgRk9PKQorCQlpZiBbICJ4JHgiICE9ICJ4Rk9PPWJhciIgXTsgdGhlbgorCQkJZWNobyAyCisJCQlyZXR1cm4gMTsKKwkJZmkKKwkJRk9PPWZvbworCQlyZXR1cm4gMAorCX0KKwliICgpIHsKKwkJaWYgWyB4JEZPTyAhPSB4YmFyIF07IHRoZW4KKwkJCWVjaG8gMworCQkJcmV0dXJuIDEKKwkJZmkKKwkJeD0kKGVudiB8IGdyZXAgRk9PKQorCQlpZiBbICJ4JHgiICE9ICJ4Rk9PPWJhciIgXTsgdGhlbgorCQkJZWNobyA0CisJCQlyZXR1cm4gMTsKKwkJZmkKKwkJRk9PPWZvbworCQlyZXR1cm4gMAorCX0KKwlGT089YmFyIGsKKwlpZiBbICQ/ICE9IDAgXTsgdGhlbgorCQlleGl0IDEKKwlmaQorCWlmIFsgeCRGT08gIT0geCBdOyB0aGVuCisJCWV4aXQgMQorCWZpCisJRk9PPWJhciBiCisJaWYgWyAkPyAhPSAwIF07IHRoZW4KKwkJZXhpdCAxCisJZmkKKwlpZiBbIHgkRk9PICE9IHhmb28gXTsgdGhlbgorCQlleGl0IDEKKwlmaQorCUZPTz1iYXJiYXIKKwlGT089YmFyIGsKKwlpZiBbICQ/ICE9IDAgXTsgdGhlbgorCQlleGl0IDEKKwlmaQorCWlmIFsgeCRGT08gIT0geGJhcmJhciBdOyB0aGVuCisJCWV4aXQgMQorCWZpCisJRk9PPWJhciBiCisJaWYgWyAkPyAhPSAwIF07IHRoZW4KKwkJZXhpdCAxCisJZmkKKwlpZiBbIHgkRk9PICE9IHhmb28gXTsgdGhlbgorCQlleGl0IDEKKwlmaQorLS0tCituYW1lOiBmZC1jbG9leGVjLTEKK2Rlc2NyaXB0aW9uOgorCVZlcmlmeSB0aGF0IGZpbGUgZGVzY3JpcHRvcnMgPiAyIGFyZSBwcml2YXRlIGZvciBLb3JuIHNoZWxscworZmlsZS1zZXR1cDogZmlsZSA2NDQgInRlc3Quc2giCisJcHJpbnQgLXUzIEZvd2wKK3N0ZGluOgorCWV4ZWMgMz4mMQorCSIkX19wcm9nbmFtZSIgdGVzdC5zaAorZXhwZWN0ZWQtZXhpdDogZSAhPSAwCitleHBlY3RlZC1zdGRlcnI6CisJdGVzdC5zaFsxXTogcHJpbnQ6IC11OiAzOiBiYWQgZmlsZSBkZXNjcmlwdG9yCistLS0KK25hbWU6IGZkLWNsb2V4ZWMtMgorZGVzY3JpcHRpb246CisJVmVyaWZ5IHRoYXQgZmlsZSBkZXNjcmlwdG9ycyA+IDIgYXJlIG5vdCBwcml2YXRlIGZvciBQT1NJWCBzaGVsbHMKKwlTZWUgRGViaWFuIEJ1ZyAjMTU0NTQwLCBDbG9zZXM6ICM0OTkxMzkKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJ0ZXN0LnNoIgorCXByaW50IC11MyBGb3dsCitzdGRpbjoKKwl0ZXN0IC1uICIkUE9TSF9WRVJTSU9OIiB8fCBzZXQgLW8gc2gKKwlleGVjIDM+JjEKKwkiJF9fcHJvZ25hbWUiIHRlc3Quc2gKK2V4cGVjdGVkLXN0ZG91dDoKKwlGb3dsCistLS0KK25hbWU6IGNvbXN1Yi0xCitkZXNjcmlwdGlvbjoKKwlDT01TVUIgYXJlIGN1cnJlbnRseSBwYXJzZWQgYnkgaGFja2luZyBsZXguYyBpbnN0ZWFkIG9mCisJcmVjdXJzaXZlbHkgKHNlZSByZWdyZXNzaW9uLTYpOiBtYXRjaGluZyBwYXJlbnRoZXPEk3MgYnVnCisJRmFpbHMgb246IHBka3NoIG1rc2ggYmFzaDIgYmFzaDMgenNoCisJUGFzc2VzIG9uOiBiYXNoNCBrc2g5MworZXhwZWN0ZWQtZmFpbDogeWVzCitzdGRpbjoKKwllY2hvICQoY2FzZSAxIGluICgxKSBlY2hvIHllczs7ICgyKSBlY2hvIG5vOzsgZXNhYykKKwllY2hvICQoY2FzZSAxIGluIDEpIGVjaG8geWVzOzsgMikgZWNobyBubzs7IGVzYWMpCitleHBlY3RlZC1zdGRvdXQ6CisJeWVzCisJeWVzCistLS0KK25hbWU6IGNvbXN1Yi0yCitkZXNjcmlwdGlvbjoKKwlSZWRIYXQgQlojNDk2NzkxIOKAkyBhbm90aGVyIGNhc2Ugb2YgbWlzc2luZyByZWN1cnNpb24KKwlpbiBwYXJzaW5nIENPTVNVQiBleHByZXNzaW9ucworCUZhaWxzIG9uOiBwZGtzaCBta3NoIGJhc2gyIGJhc2gzwrkgYmFzaDTCuSB6c2gKKwlQYXNzZXMgb246IGtzaDkzCisJ4pGgIGJhc2hbMzRdIHNlZW0gdG8gY2hva2Ugb24gY29tbWVudCBlbmRpbmcgd2l0aCBiYWNrc2xhc2gtbmV3bGluZQorZXhwZWN0ZWQtZmFpbDogeWVzCitzdGRpbjoKKwkjIGEgY29tbWVudCB3aXRoICIgJyBcCisJeD0kKAorCWVjaG8geWVzCisJIyBhIGNvbW1lbnQgd2l0aCAiICcgXAorCSkKKwllY2hvICR4CitleHBlY3RlZC1zdGRvdXQ6CisJeWVzCistLS0KK25hbWU6IHRlc3Qtc3RuemUtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB0aGUgc2hvcnQgZm9ybSBbICR4IF0gd29ya3MKK3N0ZGluOgorCWk9MAorCVsgLW4gJHggXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVsgJHggXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVsgLW4gIiR4IiBdCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJWyAiJHgiIF0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwl4PTAKKwlbIC1uICR4IF0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbICR4IF0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbIC1uICIkeCIgXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVsgIiR4IiBdCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJeD0nMSAtYSAxID0gMicKKwlbIC1uICR4IF0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbICR4IF0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbIC1uICIkeCIgXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVsgIiR4IiBdCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CitleHBlY3RlZC1zdGRvdXQ6CisJMSAwCisJMiAxCisJMyAxCisJNCAxCisJNSAwCisJNiAwCisJNyAwCisJOCAwCisJOSAxCisJMTAgMQorCTExIDAKKwkxMiAwCistLS0KK25hbWU6IHRlc3Qtc3RuemUtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCB0aGUgc2hvcnQgZm9ybSBbWyAkeCBdXSB3b3JrcyAoa3NoOTMgZXh0ZW5zaW9uKQorc3RkaW46CisJaT0wCisJW1sgLW4gJHggXV0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbWyAkeCBdXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVtbIC1uICIkeCIgXV0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbWyAiJHgiIF1dCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJeD0wCisJW1sgLW4gJHggXV0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbWyAkeCBdXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVtbIC1uICIkeCIgXV0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKKwlbWyAiJHgiIF1dCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJeD0nMSAtYSAxID0gMicKKwlbWyAtbiAkeCBdXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVtbICR4IF1dCisJcnY9JD87IGVjaG8gJCgoKytpKSkgJHJ2CisJW1sgLW4gIiR4IiBdXQorCXJ2PSQ/OyBlY2hvICQoKCsraSkpICRydgorCVtbICIkeCIgXV0KKwlydj0kPzsgZWNobyAkKCgrK2kpKSAkcnYKK2V4cGVjdGVkLXN0ZG91dDoKKwkxIDEKKwkyIDEKKwkzIDEKKwk0IDEKKwk1IDAKKwk2IDAKKwk3IDAKKwk4IDAKKwk5IDAKKwkxMCAwCisJMTEgMAorCTEyIDAKKy0tLQorbmFtZTogZXZlbnQtc3Vic3QtMWEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgJyEnIHN1YnN0aXR1dGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlIHdvcmtzCitjYXRlZ29yeTogIXNta3NoCitmaWxlLXNldHVwOiBmaWxlIDc1NSAiZmFsc2V0dG8iCisJIyEgL2Jpbi9zaAorCWVjaG8gbW9sdG8gYmVuZQorCWV4aXQgNDIKK2ZpbGUtc2V0dXA6IGZpbGUgNzU1ICIhZmFsc2UiCisJIyEgL2Jpbi9zaAorCWVjaG8gc2kKK2FyZ3VtZW50czogIS1pIQorc3RkaW46CisJZXhwb3J0IFBBVEg9LjokUEFUSAorCWZhbHNldHRvCisJZWNobyB5ZWFwCisJIWZhbHNlCitleHBlY3RlZC1leGl0OiA0MgorZXhwZWN0ZWQtc3Rkb3V0OgorCW1vbHRvIGJlbmUKKwl5ZWFwCisJbW9sdG8gYmVuZQorZXhwZWN0ZWQtc3RkZXJyLXBhdHRlcm46CisJLy4qLworLS0tCituYW1lOiBldmVudC1zdWJzdC0xYgorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhhdCAnIScgc3Vic3RpdHV0aW9uIGluIGludGVyYWN0aXZlIG1vZGUgd29ya3MKKwlldmVuIHdoZW4gYSBzcGFjZSBzZXBhcmF0ZXMgaXQgZnJvbSB0aGUgc2VhcmNoIGNvbW1hbmQsCisJd2hpY2ggaXMgbm90IHdoYXQgR05VIGJhc2ggcHJvdmlkZXMgYnV0IHJlcXVpcmVkIGZvciB0aGUKKwlvdGhlciByZWdyZXNzaW9uIHRlc3RzIGJlbG93IHRvIGNoZWNrCitjYXRlZ29yeTogIXNta3NoCitmaWxlLXNldHVwOiBmaWxlIDc1NSAiZmFsc2V0dG8iCisJIyEgL2Jpbi9zaAorCWVjaG8gbW9sdG8gYmVuZQorCWV4aXQgNDIKK2ZpbGUtc2V0dXA6IGZpbGUgNzU1ICIhIgorCSMhIC9iaW4vc2gKKwllY2hvIHNpCithcmd1bWVudHM6ICEtaSEKK3N0ZGluOgorCWV4cG9ydCBQQVRIPS46JFBBVEgKKwlmYWxzZXR0bworCWVjaG8geWVhcAorCSEgZmFsc2UKK2V4cGVjdGVkLWV4aXQ6IDQyCitleHBlY3RlZC1zdGRvdXQ6CisJbW9sdG8gYmVuZQorCXllYXAKKwltb2x0byBiZW5lCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvLiovCistLS0KK25hbWU6IGV2ZW50LXN1YnN0LTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgJyEnIHN1YnN0aXR1dGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlCisJZG9lcyBub3QgYnJlYWsgdGhpbmdzCitjYXRlZ29yeTogIXNta3NoCitmaWxlLXNldHVwOiBmaWxlIDc1NSAiZmFsc2V0dG8iCisJIyEgL2Jpbi9zaAorCWVjaG8gbW9sdG8gYmVuZQorCWV4aXQgNDIKK2ZpbGUtc2V0dXA6IGZpbGUgNzU1ICIhIgorCSMhIC9iaW4vc2gKKwllY2hvIHNpCithcmd1bWVudHM6ICEtaSEKK2Vudi1zZXR1cDogIUVOVj0uL0VudiEKK2ZpbGUtc2V0dXA6IGZpbGUgNjQ0ICJFbnYiCisJUFMxPVgKK3N0ZGluOgorCWV4cG9ydCBQQVRIPS46JFBBVEgKKwlmYWxzZXR0bworCWVjaG8geWVhcAorCSFmYWxzZQorCWVjaG8gbWVvdworCSEgZmFsc2UKKwllY2hvID0gJD8KKwlpZgorCSEgZmFsc2U7IHRoZW4gZWNobyBmb287IGVsc2UgZWNobyBiYXI7IGZpCitleHBlY3RlZC1zdGRvdXQ6CisJbW9sdG8gYmVuZQorCXllYXAKKwltb2x0byBiZW5lCisJbWVvdworCW1vbHRvIGJlbmUKKwk9IDQyCisJZm9vCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvLiovCistLS0KK25hbWU6IGV2ZW50LXN1YnN0LTMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgJyEnIHN1YnN0aXR1dGlvbiBpbiBub25pbnRlcmFjdGl2ZSBtb2RlIGlzIGlnbm9yZWQKK2NhdGVnb3J5OiAhc21rc2gKK2ZpbGUtc2V0dXA6IGZpbGUgNzU1ICJmYWxzZXR0byIKKwkjISAvYmluL3NoCisJZWNobyBtb2x0byBiZW5lCisJZXhpdCA0MgorZmlsZS1zZXR1cDogZmlsZSA3NTUgIiFmYWxzZSIKKwkjISAvYmluL3NoCisJZWNobyBzaQorc3RkaW46CisJZXhwb3J0IFBBVEg9LjokUEFUSAorCWZhbHNldHRvCisJZWNobyB5ZWFwCisJIWZhbHNlCisJZWNobyBtZW93CisJISBmYWxzZQorCWVjaG8gPSAkPworCWlmCisJISBmYWxzZTsgdGhlbiBlY2hvIGZvbzsgZWxzZSBlY2hvIGJhcjsgZmkKK2V4cGVjdGVkLXN0ZG91dDoKKwltb2x0byBiZW5lCisJeWVhcAorCXNpCisJbWVvdworCT0gMAorCWZvbworLS0tCituYW1lOiBub3Vuc2V0LTEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHRoYXQgInNldCAtdSIgbWF0Y2hlcyAoZnV0dXJlKSBTVVN2NCByZXF1aXJlbWVudAorc3RkaW46CisJKHNldCAtdQorCXRyeSgpIHsKKwkJbG9jYWwgdgorCQlldmFsIHY9XCQkMQorCQlpZiBbWyAtbiAkdiBdXTsgdGhlbgorCQkJZWNobyAkMT1uegorCQllbHNlCisJCQllY2hvICQxPXpmCisJCWZpCisJfQorCXg9eQorCShlY2hvICR4KQorCWVjaG8gPTEKKwkoZWNobyAkeSkKKwllY2hvID0yCisJKHRyeSB4KQorCWVjaG8gPTMKKwkodHJ5IHkpCisJZWNobyA9NAorCSh0cnkgMCkKKwllY2hvID01CisJKHRyeSAyKQorCWVjaG8gPTYKKwkodHJ5KQorCWVjaG8gPTcKKwkoZWNobyBhdD0kQCkKKwllY2hvID04CisJKGVjaG8gYXN0ZXJpc2s9JCopCisJZWNobyA9OQorCShlY2hvICQ/KQorCWVjaG8gPTEwCisJKGVjaG8gJCEpCisJZWNobyA9MTEKKwkoZWNobyAkLSkKKwllY2hvID0xMgorCSMoZWNobyAkXykKKwkjZWNobyA9MTMKKwkoZWNobyAkIykKKwllY2hvID0xNAorCShteXBpZD0kJDsgdHJ5IG15cGlkKQorCWVjaG8gPTE1CisJKSAyPiYxIHwgc2VkIC1lICdzL15bXl1dKl0vLycgLWUgJ3MvXlteOl0qOiAqLy8nCitleHBlY3RlZC1zdGRvdXQ6CisJeQorCT0xCisJeTogcGFyYW1ldGVyIG5vdCBzZXQKKwk9MgorCXg9bnoKKwk9MworCXk6IHBhcmFtZXRlciBub3Qgc2V0CisJPTQKKwkwPW56CisJPTUKKwkyOiBwYXJhbWV0ZXIgbm90IHNldAorCT02CisJMTogcGFyYW1ldGVyIG5vdCBzZXQKKwk9NworCWF0PQorCT04CisJYXN0ZXJpc2s9CisJPTkKKwkwCisJPTEwCisJITogcGFyYW1ldGVyIG5vdCBzZXQKKwk9MTEKKwl1c2gKKwk9MTIKKwkwCisJPTE0CisJbXlwaWQ9bnoKKwk9MTUKKy0tLQorbmFtZTogbmFtZXJlZi0xCitkZXNjcmlwdGlvbjoKKwlUZXN0c3VpdGUgZm9yIG5hbWVyZWYgKGJvdW5kIHZhcmlhYmxlcykKK3N0ZGluOgorCWJhcj1nbG9iYWwKKwl0eXBlc2V0IC1uIGlyMj1iYXIKKwl0eXBlc2V0IC1uIGluZD1pcjIKKwllY2hvICFpbmQ6ICR7IWluZH0KKwllY2hvIGluZDogJGluZAorCWVjaG8gIWlyMjogJHshaXIyfQorCWVjaG8gaXIyOiAkaXIyCisJdHlwZXNldCArbiBpbmQKKwllY2hvICFpbmQ6ICR7IWluZH0KKwllY2hvIGluZDogJGluZAorCXR5cGVzZXQgLW4gaXIyPWluZAorCWVjaG8gIWlyMjogJHshaXIyfQorCWVjaG8gaXIyOiAkaXIyCisJc2V0fGdyZXAgXmlyMnxzZWQgJ3MvXi9zMTogLycKKwl0eXBlc2V0fGdyZXAgJyBpcjInfHNlZCAtZSAncy9eL3MyOiAvJyAtZSAncy9uYW1lcmVmL3R5cGVzZXQgLW4vJworCXNldCAtQSBibHViIC0tIGUxIGUyIGUzCisJdHlwZXNldCAtbiBpbmQ9Ymx1YgorCXR5cGVzZXQgLW4gaXIyPWJsdWJbMl0KKwllY2hvICFpbmRbMV06ICR7IWluZFsxXX0KKwllY2hvICFpcjI6ICQhaXIyCisJZWNobyBpbmRbMV06ICR7aW5kWzFdfQorCWVjaG8gaXIyOiAkaXIyCitleHBlY3RlZC1zdGRvdXQ6CisJIWluZDogYmFyCisJaW5kOiBnbG9iYWwKKwkhaXIyOiBiYXIKKwlpcjI6IGdsb2JhbAorCSFpbmQ6IGluZAorCWluZDogaXIyCisJIWlyMjogaW5kCisJaXIyOiBpcjIKKwlzMTogaXIyPWluZAorCXMyOiB0eXBlc2V0IC1uIGlyMgorCSFpbmRbMV06IDEKKwkhaXIyOiBpcjIKKwlpbmRbMV06IGUyCisJaXIyOiBlMworLS0tCituYW1lOiBuYW1lcmVmLTJkYQorZGVzY3JpcHRpb246CisJVGVzdHN1aXRlIGZvciBuYW1lcmVmIChib3VuZCB2YXJpYWJsZXMpCisJRnVuY3Rpb25zLCBhcmd1bWVudCBnaXZlbiBkaXJlY3RseSwgYWZ0ZXIgbG9jYWwKK3N0ZGluOgorCWZ1bmN0aW9uIGZvbyB7CisJCXR5cGVzZXQgYmFyPWxva2FsIGJhej1hdWNoCisJCXR5cGVzZXQgLW4gdj1iYXIKKwkJZWNobyBlbnRlcmluZworCQllY2hvICF2OiAkeyF2fQorCQllY2hvICFiYXI6ICR7IWJhcn0KKwkJZWNobyAhYmF6OiAkeyFiYXp9CisJCWVjaG8gYmFyOiAkYmFyCisJCWVjaG8gdjogJHYKKwkJdj0xMjMKKwkJZWNobyBiYXI6ICRiYXIKKwkJZWNobyB2OiAkdgorCQllY2hvIGV4aXRpbmcKKwl9CisJYmFyPWdsb2JhbAorCWVjaG8gYmFyOiAkYmFyCisJZm9vIGJhcgorCWVjaG8gYmFyOiAkYmFyCitleHBlY3RlZC1zdGRvdXQ6CisJYmFyOiBnbG9iYWwKKwllbnRlcmluZworCSF2OiBiYXIKKwkhYmFyOiBiYXIKKwkhYmF6OiBiYXoKKwliYXI6IGxva2FsCisJdjogbG9rYWwKKwliYXI6IDEyMworCXY6IDEyMworCWV4aXRpbmcKKwliYXI6IGdsb2JhbAorLS0tCituYW1lOiBuYW1lcmVmLTMKK2Rlc2NyaXB0aW9uOgorCUFkdmFuY2VkIHRlc3RzdWl0ZSBmb3IgYm91bmQgdmFyaWFibGVzIChrc2g5MyBmYWlscyB0aGlzKQorc3RkaW46CisJdHlwZXNldCAtbiBmb289YmFyW2ldCisJc2V0IC1BIGJhciAtLSBiIGMgYQorCWZvciBpIGluIDAgMSAyIDM7IGRvCisJCXByaW50ICRpICRmb28gLgorCWRvbmUKK2V4cGVjdGVkLXN0ZG91dDoKKwkwIGIgLgorCTEgYyAuCisJMiBhIC4KKwkzIC4KKy0tLQorbmFtZTogYmV0dGVyLXBhcmVucy0xYQorZGVzY3JpcHRpb246CisJQ2hlY2sgc3VwcG9ydCBmb3IgKCjigKYpKSBhbmQgJCgo4oCmKSkgdnMgKOKApikgYW5kICQo4oCmKQorc3RkaW46CisJaWYgKCAoZWNobyBmdWJhcikgfCB0ciB1IHgpOyB0aGVuCisJCWVjaG8gamEKKwllbHNlCisJCWVjaG8gbmVpbgorCWZpCitleHBlY3RlZC1zdGRvdXQ6CisJZnhiYXIKKwlqYQorLS0tCituYW1lOiBiZXR0ZXItcGFyZW5zLTFiCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzdXBwb3J0IGZvciAoKOKApikpIGFuZCAkKCjigKYpKSB2cyAo4oCmKSBhbmQgJCjigKYpCitzdGRpbjoKKwllY2hvICQoIChlY2hvIGZ1YmFyKSB8IHRyIHUgeCkgJD8KK2V4cGVjdGVkLXN0ZG91dDoKKwlmeGJhciAwCistLS0KK25hbWU6IGJldHRlci1wYXJlbnMtMmEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHN1cHBvcnQgZm9yICgo4oCmKSkgYW5kICQoKOKApikpIHZzICjigKYpIGFuZCAkKOKApikKK3N0ZGluOgorCWlmICgoZWNobyBmdWJhcikgfCB0ciB1IHgpOyB0aGVuCisJCWVjaG8gamEKKwllbHNlCisJCWVjaG8gbmVpbgorCWZpCitleHBlY3RlZC1zdGRvdXQ6CisJZnhiYXIKKwlqYQorLS0tCituYW1lOiBiZXR0ZXItcGFyZW5zLTJiCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzdXBwb3J0IGZvciAoKOKApikpIGFuZCAkKCjigKYpKSB2cyAo4oCmKSBhbmQgJCjigKYpCitzdGRpbjoKKwllY2hvICQoKGVjaG8gZnViYXIpIHwgdHIgdSB4KSAkPworZXhwZWN0ZWQtc3Rkb3V0OgorCWZ4YmFyIDAKKy0tLQorbmFtZTogYmV0dGVyLXBhcmVucy0zYQorZGVzY3JpcHRpb246CisJQ2hlY2sgc3VwcG9ydCBmb3IgKCjigKYpKSBhbmQgJCgo4oCmKSkgdnMgKOKApikgYW5kICQo4oCmKQorc3RkaW46CisJaWYgKCAoZWNobyBmdWJhcikgfCAodHIgdSB4KSk7IHRoZW4KKwkJZWNobyBqYQorCWVsc2UKKwkJZWNobyBuZWluCisJZmkKK2V4cGVjdGVkLXN0ZG91dDoKKwlmeGJhcgorCWphCistLS0KK25hbWU6IGJldHRlci1wYXJlbnMtM2IKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHN1cHBvcnQgZm9yICgo4oCmKSkgYW5kICQoKOKApikpIHZzICjigKYpIGFuZCAkKOKApikKK3N0ZGluOgorCWVjaG8gJCggKGVjaG8gZnViYXIpIHwgKHRyIHUgeCkpICQ/CitleHBlY3RlZC1zdGRvdXQ6CisJZnhiYXIgMAorLS0tCituYW1lOiBiZXR0ZXItcGFyZW5zLTRhCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzdXBwb3J0IGZvciAoKOKApikpIGFuZCAkKCjigKYpKSB2cyAo4oCmKSBhbmQgJCjigKYpCitzdGRpbjoKKwlpZiAoKGVjaG8gZnViYXIpIHwgKHRyIHUgeCkpOyB0aGVuCisJCWVjaG8gamEKKwllbHNlCisJCWVjaG8gbmVpbgorCWZpCitleHBlY3RlZC1zdGRvdXQ6CisJZnhiYXIKKwlqYQorLS0tCituYW1lOiBiZXR0ZXItcGFyZW5zLTRiCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzdXBwb3J0IGZvciAoKOKApikpIGFuZCAkKCjigKYpKSB2cyAo4oCmKSBhbmQgJCjigKYpCitzdGRpbjoKKwllY2hvICQoKGVjaG8gZnViYXIpIHwgKHRyIHUgeCkpICQ/CitleHBlY3RlZC1zdGRvdXQ6CisJZnhiYXIgMAorLS0tCituYW1lOiBlY2hvLXRlc3QtMQorZGVzY3JpcHRpb246CisJVGVzdCB3aGF0IHRoZSBlY2hvIGJ1aWx0aW4gZG9lcyAobWtzaCkKK3N0ZGluOgorCWVjaG8gLW4gJ2Zvb1x4NDBiYXInCisJZWNobyAtZSAnXHRiYXonCitleHBlY3RlZC1zdGRvdXQ6CisJZm9vQGJhcgliYXoKKy0tLQorbmFtZTogZWNoby10ZXN0LTIKK2Rlc2NyaXB0aW9uOgorCVRlc3Qgd2hhdCB0aGUgZWNobyBidWlsdGluIGRvZXMgKFBPU0lYKQorCU5vdGU6IHRoaXMgZm9sbG93cyBEZWJpYW4gUG9saWN5IDEwLjQgd2hpY2ggbWFuZGF0ZXMKKwl0aGF0IC1uIHNoYWxsIGJlIHRyZWF0ZWQgYXMgYW4gb3B0aW9uLCBub3QgWFNJIHdoaWNoCisJbWFuZGF0ZXMgaXQgc2hhbGwgYmUgdHJlYXRlZCBhcyBzdHJpbmcgYnV0IGVzY2FwZXMKKwlzaGFsbCBiZSBleHBhbmRlZC4KK3N0ZGluOgorCXRlc3QgLW4gIiRQT1NIX1ZFUlNJT04iIHx8IHNldCAtbyBzaAorCWVjaG8gLW4gJ2Zvb1x4NDBiYXInCisJZWNobyAtZSAnXHRiYXonCitleHBlY3RlZC1zdGRvdXQ6CisJZm9vXHg0MGJhci1lIFx0YmF6CistLS0KK25hbWU6IHV0aWxpdGllcy1nZXRvcHRzLTEKK2Rlc2NyaXB0aW9uOgorCWdldG9wdHMgc2V0cyBPUFRJTkQgY29ycmVjdGx5IGZvciB1bnBhcnNlZCBvcHRpb24KK3N0ZGluOgorCXNldCAtLSAtYSAtYSAteAorCXdoaWxlIGdldG9wdHMgOmEgb3B0YzsgZG8KKwkgICAgZWNobyAiT1BUQVJHPSRPUFRBUkcsIE9QVElORD0kT1BUSU5ELCBvcHRjPSRvcHRjLiIKKwlkb25lCisJZWNobyBkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJT1BUQVJHPSwgT1BUSU5EPTIsIG9wdGM9YS4KKwlPUFRBUkc9LCBPUFRJTkQ9Mywgb3B0Yz1hLgorCU9QVEFSRz14LCBPUFRJTkQ9NCwgb3B0Yz0/LgorCWRvbmUKKy0tLQorbmFtZTogdXRpbGl0aWVzLWdldG9wdHMtMgorZGVzY3JpcHRpb246CisJQ2hlY2sgT1BUQVJHCitzdGRpbjoKKwlzZXQgLS0gLWEgTWFyeSAteAorCXdoaWxlIGdldG9wdHMgYTogb3B0YzsgZG8KKwkgICAgZWNobyAiT1BUQVJHPSRPUFRBUkcsIE9QVElORD0kT1BUSU5ELCBvcHRjPSRvcHRjLiIKKwlkb25lCisJZWNobyBkb25lCitleHBlY3RlZC1zdGRvdXQ6CisJT1BUQVJHPU1hcnksIE9QVElORD0zLCBvcHRjPWEuCisJT1BUQVJHPSwgT1BUSU5EPTQsIG9wdGM9Py4KKwlkb25lCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjogLy4qLXguKm9wdGlvbi8KKy0tLQorbmFtZTogd2Nzd2lkdGgtMQorZGVzY3JpcHRpb246CisJQ2hlY2sgdGhlIG5ldyB3Y3N3aWR0aCBmZWF0dXJlCitzdGRpbjoKKwlzPeS9lQorCXNldCArVQorCXByaW50IG9jdGV0czogJHsjc30gLgorCXByaW50IDgtYml0IHdpZHRoOiAkeyVzfSAuCisJc2V0IC1VCisJcHJpbnQgY2hhcmFjdGVyczogJHsjc30gLgorCXByaW50IGNvbHVtbnM6ICR7JXN9IC4KKwlzPe+/vQorCXNldCArVQorCXByaW50IG9jdGV0czogJHsjc30gLgorCXByaW50IDgtYml0IHdpZHRoOiAkeyVzfSAuCisJc2V0IC1VCisJcHJpbnQgY2hhcmFjdGVyczogJHsjc30gLgorCXByaW50IGNvbHVtbnM6ICR7JXN9IC4KK2V4cGVjdGVkLXN0ZG91dDoKKwlvY3RldHM6IDMgLgorCTgtYml0IHdpZHRoOiAtMSAuCisJY2hhcmFjdGVyczogMSAuCisJY29sdW1uczogMiAuCisJb2N0ZXRzOiAzIC4KKwk4LWJpdCB3aWR0aDogMyAuCisJY2hhcmFjdGVyczogMSAuCisJY29sdW1uczogMSAuCistLS0KK25hbWU6IHdjc3dpZHRoLTIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHNvbWUgY29ybmVyIGNhc2VzCitzdGRpbjoKKwlwcmludCAlICQlIC4KKwlzZXQgLVUKKwl4PSdhCWInCisJcHJpbnQgYyAkeyV4fSAuCisJc2V0ICtVCisJeD0nYQliJworCXByaW50IGQgJHsleH0gLgorZXhwZWN0ZWQtc3Rkb3V0OgorCSUgJCUgLgorCWMgLTEgLgorCWQgLTEgLgorLS0tCituYW1lOiB3Y3N3aWR0aC0zCitkZXNjcmlwdGlvbjoKKwlDaGVjayBzb21lIGNvcm5lciBjYXNlcworc3RkaW46CisJcHJpbnQgJHslfSAuCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvYmFkIHN1YnN0aXR1dGlvbi8KK2V4cGVjdGVkLWV4aXQ6IDEKKy0tLQorbmFtZTogd2Nzd2lkdGgtNGEKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHNvbWUgY29ybmVyIGNhc2VzCitzdGRpbjoKKwlwcmludCAkeyUqfSAuCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvYmFkIHN1YnN0aXR1dGlvbi8KK2V4cGVjdGVkLWV4aXQ6IDEKKy0tLQorbmFtZTogd2Nzd2lkdGgtNGIKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHNvbWUgY29ybmVyIGNhc2VzCitzdGRpbjoKKwlwcmludCAkeyVAfSAuCitleHBlY3RlZC1zdGRlcnItcGF0dGVybjoKKwkvYmFkIHN1YnN0aXR1dGlvbi8KK2V4cGVjdGVkLWV4aXQ6IDEKKy0tLQorbmFtZTogd2Nzd2lkdGgtNGMKK2Rlc2NyaXB0aW9uOgorCUNoZWNrIHNvbWUgY29ybmVyIGNhc2VzCitzdGRpbjoKKwk6CisJcHJpbnQgJHslP30gLgorZXhwZWN0ZWQtc3Rkb3V0OgorCTEgLgorLS0tCituYW1lOiByZWFscGF0aC0xCitkZXNjcmlwdGlvbjoKKwlDaGVjayBwcm9wZXIgcmV0dXJuIHZhbHVlcyBmb3IgcmVhbHBhdGgKK2NhdGVnb3J5OiBvczptaXJic2QKK3N0ZGluOgorCXdkPSQocmVhbHBhdGggLikKKwlta2RpciBkaXIKKwk6PmZpbGUKKwk6PmRpci9maWxlCisJbG4gLXMgZGlyIGxuZGlyCisJbG4gLXMgZmlsZSBsbmZpbGUKKwlsbiAtcyBuaXggbG5uaXgKKwlsbiAtcyAuIGxuc2VsZgorCWk9MAorCWNoaygpIHsKKwkJdHlwZXNldCB4IHkKKwkJeD0kKHJlYWxwYXRoICIkd2QvJDEiIDI+JjEpOyB5PSQ/CisJCXByaW50ICQoKCsraSkpICI/JDEiID0ke3gjIyokd2QvfSAhJHkKKwl9CisJY2hrIGRpcgorCWNoayBkaXIvCisJY2hrIGRpci9maWxlCisJY2hrIGRpci9uaXgKKwljaGsgZmlsZQorCWNoayBmaWxlLworCWNoayBmaWxlL2ZpbGUKKwljaGsgZmlsZS9uaXgKKwljaGsgbml4CisJY2hrIG5peC8KKwljaGsgbml4L2ZpbGUKKwljaGsgbml4L25peAorCWNoayBsbmRpcgorCWNoayBsbmRpci8KKwljaGsgbG5kaXIvZmlsZQorCWNoayBsbmRpci9uaXgKKwljaGsgbG5maWxlCisJY2hrIGxuZmlsZS8KKwljaGsgbG5maWxlL2ZpbGUKKwljaGsgbG5maWxlL25peAorCWNoayBsbm5peAorCWNoayBsbm5peC8KKwljaGsgbG5uaXgvZmlsZQorCWNoayBsbm5peC9uaXgKKwljaGsgbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmCisJcm0gbG5zZWxmCitleHBlY3RlZC1zdGRvdXQ6CisJMSA/ZGlyID1kaXIgITAKKwkyID9kaXIvID1kaXIgITAKKwkzID9kaXIvZmlsZSA9ZGlyL2ZpbGUgITAKKwk0ID9kaXIvbml4ID1kaXIvbml4ICEwCisJNSA/ZmlsZSA9ZmlsZSAhMAorCTYgP2ZpbGUvID1maWxlLzogTm90IGEgZGlyZWN0b3J5ICEyMAorCTcgP2ZpbGUvZmlsZSA9ZmlsZS9maWxlOiBOb3QgYSBkaXJlY3RvcnkgITIwCisJOCA/ZmlsZS9uaXggPWZpbGUvbml4OiBOb3QgYSBkaXJlY3RvcnkgITIwCisJOSA/bml4ID1uaXggITAKKwkxMCA/bml4LyA9bml4ICEwCisJMTEgP25peC9maWxlID1uaXgvZmlsZTogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSAhMgorCTEyID9uaXgvbml4ID1uaXgvbml4OiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICEyCisJMTMgP2xuZGlyID1kaXIgITAKKwkxNCA/bG5kaXIvID1kaXIgITAKKwkxNSA/bG5kaXIvZmlsZSA9ZGlyL2ZpbGUgITAKKwkxNiA/bG5kaXIvbml4ID1kaXIvbml4ICEwCisJMTcgP2xuZmlsZSA9ZmlsZSAhMAorCTE4ID9sbmZpbGUvID1sbmZpbGUvOiBOb3QgYSBkaXJlY3RvcnkgITIwCisJMTkgP2xuZmlsZS9maWxlID1sbmZpbGUvZmlsZTogTm90IGEgZGlyZWN0b3J5ICEyMAorCTIwID9sbmZpbGUvbml4ID1sbmZpbGUvbml4OiBOb3QgYSBkaXJlY3RvcnkgITIwCisJMjEgP2xubml4ID1uaXggITAKKwkyMiA/bG5uaXgvID1uaXggITAKKwkyMyA/bG5uaXgvZmlsZSA9bG5uaXgvZmlsZTogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSAhMgorCTI0ID9sbm5peC9uaXggPWxubml4L25peDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSAhMgorCTI1ID9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYgPWxuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZi9sbnNlbGYvbG5zZWxmL2xuc2VsZjogVG9vIG1hbnkgbGV2ZWxzIG9mIHN5bWJvbGljIGxpbmtzICE2MgorLS0tCmRpZmYgLS1naXQgYS9ta3NoL3NyYy9lZGl0LmMgYi9ta3NoL3NyYy9lZGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1ZGU3ZQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL2VkaXQuYwpAQCAtMCwwICsxLDUyNDkgQEAKKy8qCSRPcGVuQlNEOiBlZGl0LmMsdiAxLjM0IDIwMTAvMDUvMjAgMDE6MTM6MDcgZmdzY2ggRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBlZGl0LmgsdiAxLjggMjAwNS8wMy8yOCAyMToyODoyMiBkZXJhYWR0IEV4cCAkCSovCisvKgkkT3BlbkJTRDogZW1hY3MuYyx2IDEuNDIgMjAwOS8wNi8wMiAwNjo0Nzo0NyBoYWxleCBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IHZpLmMsdiAxLjI2IDIwMDkvMDYvMjkgMjI6NTA6MTkgbWFydHluYXMgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpbmNsdWRlICJzaC5oIgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9lZGl0LmMsdiAxLjE5NiAyMDEwLzA3LzI1IDExOjM1OjQwIHRnIEV4cCAkIik7CisKKy8qCisgKiBpbiBsYXRlciB2ZXJzaW9ucyB3ZSBtaWdodCB1c2UgbGlidGVybWNhcCBmb3IgdGhpcywgYnV0IHNpbmNlIGV4dGVybmFsCisgKiBkZXBlbmRlbmNpZXMgYXJlIHByb2JsZW1hdGljLCB0aGlzIGhhcyBub3QgeWV0IGJlZW4gZGVjaWRlZCBvbjsgYW5vdGhlcgorICogZ29vZCBzdHJpbmcgaXMgIlwwMzNjIiBleGNlcHQgb24gaGFyZHdhcmUgdGVybWluYWxzIGxpa2UgdGhlIERFQyBWVDQyMAorICogd2hpY2ggZG8gYSBmdWxsIHBvd2VyIGN5Y2xlIHRoZW4uLi4KKyAqLworI2lmbmRlZiBNS1NIX0NMU19TVFJJTkcKKyNkZWZpbmUgTUtTSF9DTFNfU1RSSU5HCQkiXDAzM1s7SFwwMzNbSiIKKyNlbmRpZgorI2lmbmRlZiBNS1NIX0NMUlRPRU9MX1NUUklORworI2RlZmluZSBNS1NIX0NMUlRPRU9MX1NUUklORwkiXDAzM1tLIgorI2VuZGlmCisKKy8qIHR0eSBkcml2ZXIgY2hhcmFjdGVycyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBlcmFzZTsKKwlpbnQga2lsbDsKKwlpbnQgd2VyYXNlOworCWludCBpbnRyOworCWludCBxdWl0OworCWludCBlb2Y7Cit9IFhfY2hhcnM7CisKK3N0YXRpYyBYX2NoYXJzIGVkY2hhcnM7CisKKy8qIHhfZmNfZ2xvYigpIGZsYWdzICovCisjZGVmaW5lIFhDRl9DT01NQU5ECUJJVCgwKQkvKiBEbyBjb21tYW5kIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgWENGX0ZJTEUJQklUKDEpCS8qIERvIGZpbGUgY29tcGxldGlvbiAqLworI2RlZmluZSBYQ0ZfRlVMTFBBVEgJQklUKDIpCS8qIGNvbW1hbmQgY29tcGxldGlvbjogc3RvcmUgZnVsbCBwYXRoICovCisjZGVmaW5lIFhDRl9DT01NQU5EX0ZJTEUgKFhDRl9DT01NQU5EfFhDRl9GSUxFKQorCitzdGF0aWMgY2hhciBlZGl0bW9kZTsKK3N0YXRpYyBpbnQgeHhfY29sczsJCQkvKiBmb3IgRW1hY3MgbW9kZSAqLworc3RhdGljIGludCBtb2RpZmllZDsJCQkvKiBidWZmZXIgaGFzIGJlZW4gIm1vZGlmaWVkIiAqLworc3RhdGljIGNoYXIgaG9sZGJ1ZltMSU5FXTsJCS8qIHBsYWNlIHRvIGhvbGQgbGFzdCBlZGl0IGJ1ZmZlciAqLworCitzdGF0aWMgaW50IHhfZ2V0Yyh2b2lkKTsKK3N0YXRpYyB2b2lkIHhfcHV0Y2YoaW50KTsKK3N0YXRpYyBib29sIHhfbW9kZShib29sKTsKK3N0YXRpYyBpbnQgeF9kb19jb21tZW50KGNoYXIgKiwgaW50LCBpbnQgKik7CitzdGF0aWMgdm9pZCB4X3ByaW50X2V4cGFuc2lvbnMoaW50LCBjaGFyICpjb25zdCAqLCBib29sKTsKK3N0YXRpYyBpbnQgeF9jZl9nbG9iKGludCwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50ICosIGludCAqLCBjaGFyICoqKiwKKyAgICBib29sICopOworc3RhdGljIGludCB4X2xvbmdlc3RfcHJlZml4KGludCwgY2hhciAqY29uc3QgKik7CitzdGF0aWMgaW50IHhfYmFzZW5hbWUoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworc3RhdGljIHZvaWQgeF9mcmVlX3dvcmRzKGludCwgY2hhciAqKik7CitzdGF0aWMgaW50IHhfZXNjYXBlKGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBpbnQgKCopKGNvbnN0IGNoYXIgKiwgc2l6ZV90KSk7CitzdGF0aWMgaW50IHhfZW1hY3MoY2hhciAqLCBzaXplX3QpOworc3RhdGljIHZvaWQgeF9pbml0X2VtYWNzKHZvaWQpOworc3RhdGljIHZvaWQgeF9pbml0X3Byb21wdCh2b2lkKTsKKyNpZiAhTUtTSF9TX05PVkkKK3N0YXRpYyBpbnQgeF92aShjaGFyICosIHNpemVfdCk7CisjZW5kaWYKKworI2RlZmluZSB4X2ZsdXNoKCkJc2hmX2ZsdXNoKHNobF9vdXQpCisjaWZkZWYgTUtTSF9TTUFMTAorI2RlZmluZSB4X3B1dGMoYykJeF9wdXRjZihjKQorI2Vsc2UKKyNkZWZpbmUgeF9wdXRjKGMpCXNoZl9wdXRjKChjKSwgc2hsX291dCkKKyNlbmRpZgorCitzdGF0aWMgaW50IHBhdGhfb3JkZXJfY21wKGNvbnN0IHZvaWQgKmFhLCBjb25zdCB2b2lkICpiYik7CitzdGF0aWMgY2hhciAqYWRkX2dsb2IoY29uc3QgY2hhciAqLCBpbnQpCisgICAgTUtTSF9BX05PTk5VTEwoKG5vbm51bGwgKDEpKSkKKyAgICBNS1NIX0FfQk9VTkRFRChzdHJpbmcsIDEsIDIpOworc3RhdGljIHZvaWQgZ2xvYl90YWJsZShjb25zdCBjaGFyICosIFhQdHJWICosIHN0cnVjdCB0YWJsZSAqKTsKK3N0YXRpYyB2b2lkIGdsb2JfcGF0aChpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKiwgWFB0clYgKiwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyBpbnQgeF9maWxlX2dsb2IoaW50LCBjb25zdCBjaGFyICosIGludCwgY2hhciAqKiopCisgICAgTUtTSF9BX05PTk5VTEwoKG5vbm51bGwgKDIpKSkKKyAgICBNS1NIX0FfQk9VTkRFRChzdHJpbmcsIDIsIDMpOworc3RhdGljIGludCB4X2NvbW1hbmRfZ2xvYihpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBjaGFyICoqKikKKyAgICBNS1NIX0FfTk9OTlVMTCgobm9ubnVsbCAoMikpKQorICAgIE1LU0hfQV9CT1VOREVEKHN0cmluZywgMiwgMyk7CitzdGF0aWMgaW50IHhfbG9jYXRlX3dvcmQoY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50ICosIGJvb2wgKik7CisKK3N0YXRpYyBpbnQgeF9lX2dldG1iYyhjaGFyICopOworc3RhdGljIGludCB4X2VfcmVidWlsZGxpbmUoY29uc3QgY2hhciAqKTsKKworLyogKysrIGdlbmVyaWMgZWRpdGluZyBmdW5jdGlvbnMgKysrICovCisKKy8qIENhbGxlZCBmcm9tIG1haW4gKi8KK3ZvaWQKK3hfaW5pdCh2b2lkKQoreworCS8qIHNldCB0byAtMiB0byBmb3JjZSBpbml0aWFsIGJpbmRpbmcgKi8KKwllZGNoYXJzLmVyYXNlID0gZWRjaGFycy5raWxsID0gZWRjaGFycy5pbnRyID0gZWRjaGFycy5xdWl0ID0KKwkgICAgZWRjaGFycy5lb2YgPSAtMjsKKwkvKiBkZWZhdWx0IHZhbHVlIGZvciBkZWZpY2llbnQgc3lzdGVtcyAqLworCWVkY2hhcnMud2VyYXNlID0gMDI3OwkvKiBeVyAqLworCXhfaW5pdF9lbWFjcygpOworfQorCisvKgorICogcmVhZCBhbiBlZGl0ZWQgY29tbWFuZCBsaW5lCisgKi8KK2ludAoreF9yZWFkKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpbnQgaTsKKworCXhfbW9kZSh0cnVlKTsKKwltb2RpZmllZCA9IDE7CisJaWYgKEZsYWcoRkVNQUNTKSB8fCBGbGFnKEZHTUFDUykpCisJCWkgPSB4X2VtYWNzKGJ1ZiwgbGVuKTsKKyNpZiAhTUtTSF9TX05PVkkKKwllbHNlIGlmIChGbGFnKEZWSSkpCisJCWkgPSB4X3ZpKGJ1ZiwgbGVuKTsKKyNlbmRpZgorCWVsc2UKKwkJaSA9IC0xOwkJLyogaW50ZXJuYWwgZXJyb3IgKi8KKwllZGl0bW9kZSA9IDA7CisJeF9tb2RlKGZhbHNlKTsKKwlyZXR1cm4gKGkpOworfQorCisvKiB0dHkgSS9PICovCisKK3N0YXRpYyBpbnQKK3hfZ2V0Yyh2b2lkKQoreworCWNoYXIgYzsKKwlpbnQgbjsKKworCXdoaWxlICgobiA9IGJsb2NraW5nX3JlYWQoU1RESU5fRklMRU5PLCAmYywgMSkpIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKwkJaWYgKHRyYXApIHsKKwkJCXhfbW9kZShmYWxzZSk7CisJCQlydW50cmFwcygwKTsKKyNpZmRlZiBTSUdXSU5DSAorCQkJaWYgKGdvdF93aW5jaCkgeworCQkJCWNoYW5nZV93aW5zeigpOworCQkJCWlmICh4X2NvbHMgIT0geHhfY29scyAmJiBlZGl0bW9kZSA9PSAxKSB7CisJCQkJCS8qIHJlZHJhdyBsaW5lIGluIEVtYWNzIG1vZGUgKi8KKwkJCQkJeHhfY29scyA9IHhfY29sczsKKwkJCQkJeF9lX3JlYnVpbGRsaW5lKE1LU0hfQ0xSVE9FT0xfU1RSSU5HKTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJCXhfbW9kZSh0cnVlKTsKKwkJfQorCXJldHVybiAoKG4gPT0gMSkgPyAoaW50KSh1bnNpZ25lZCBjaGFyKWMgOiAtMSk7Cit9CisKK3N0YXRpYyB2b2lkCit4X3B1dGNmKGludCBjKQoreworCXNoZl9wdXRjKGMsIHNobF9vdXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNaXNjIGNvbW1vbiBjb2RlIGZvciB2aS9lbWFjcyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIYW5kbGUgdGhlIGNvbW1lbnRpbmcvdW5jb21tZW50aW5nIG9mIGEgbGluZS4KKyAqIFJldHVybnM6CisgKgkxIGlmIGEgY2FycmlhZ2UgcmV0dXJuIGlzIGluZGljYXRlZCAoY29tbWVudCBhZGRlZCkKKyAqCTAgaWYgbm8gcmV0dXJuIChjb21tZW50IHJlbW92ZWQpCisgKgktMSBpZiB0aGVyZSBpcyBhbiBlcnJvciAobm90IGVub3VnaCByb29tIGZvciBjb21tZW50IGNoYXJzKQorICogSWYgc3VjY2Vzc2Z1bCwgKmxlbnAgY29udGFpbnMgdGhlIG5ldyBsZW5ndGguIE5vdGU6IGN1cnNvciBzaG91bGQgYmUKKyAqIG1vdmVkIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZSBhZnRlciAodW4pY29tbWVudGluZy4KKyAqLworc3RhdGljIGludAoreF9kb19jb21tZW50KGNoYXIgKmJ1ZiwgaW50IGJzaXplLCBpbnQgKmxlbnApCit7CisJaW50IGksIGosIGxlbiA9ICpsZW5wOworCisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gKDEpOyAvKiBzb21ld2hhdCBhcmJpdHJhcnkgLSBpdCdzIHdoYXQgQVQmVCBrc2ggZG9lcyAqLworCisJLyogQWxyZWFkeSBjb21tZW50ZWQ/ICovCisJaWYgKGJ1ZlswXSA9PSAnIycpIHsKKwkJYm9vbCBzYXdfbmwgPSBmYWxzZTsKKworCQlmb3IgKGogPSAwLCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisJCQlpZiAoIXNhd19ubCB8fCBidWZbaV0gIT0gJyMnKQorCQkJCWJ1ZltqKytdID0gYnVmW2ldOworCQkJc2F3X25sID0gYnVmW2ldID09ICdcbic7CisJCX0KKwkJKmxlbnAgPSBqOworCQlyZXR1cm4gKDApOworCX0gZWxzZSB7CisJCWludCBuID0gMTsKKworCQkvKiBTZWUgaWYgdGhlcmUncyByb29tIGZvciB0aGUgI3MgLSAxIHBlciBcbiAqLworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQlpZiAoYnVmW2ldID09ICdcbicpCisJCQkJbisrOworCQlpZiAobGVuICsgbiA+PSBic2l6ZSkKKwkJCXJldHVybiAoLTEpOworCQkvKiBOb3cgYWRkIHRoZW0uLi4gKi8KKwkJZm9yIChpID0gbGVuLCBqID0gbGVuICsgbjsgLS1pID49IDA7ICkgeworCQkJaWYgKGJ1ZltpXSA9PSAnXG4nKQorCQkJCWJ1ZlstLWpdID0gJyMnOworCQkJYnVmWy0tal0gPSBidWZbaV07CisJCX0KKwkJYnVmWzBdID0gJyMnOworCQkqbGVucCArPSBuOworCQlyZXR1cm4gKDEpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbW1vbiBmaWxlL2NvbW1hbmQgY29tcGxldGlvbiBjb2RlIGZvciB2aS9lbWFjcyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK3hfcHJpbnRfZXhwYW5zaW9ucyhpbnQgbndvcmRzLCBjaGFyICogY29uc3QgKndvcmRzLCBib29sIGlzX2NvbW1hbmQpCit7CisJYm9vbCB1c2VfY29weSA9IGZhbHNlOworCWludCBwcmVmaXhfbGVuOworCVhQdHJWIGwgPSB7IE5VTEwsIE5VTEwsIE5VTEwgfTsKKworCS8qIENoZWNrIGlmIGFsbCBtYXRjaGVzIGFyZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgKGluIHRoaXMKKwkgKiBjYXNlLCB3ZSB3YW50IHRvIG9taXQgdGhlIGRpcmVjdG9yeSBuYW1lKQorCSAqLworCWlmICghaXNfY29tbWFuZCAmJgorCSAgICAocHJlZml4X2xlbiA9IHhfbG9uZ2VzdF9wcmVmaXgobndvcmRzLCB3b3JkcykpID4gMCkgeworCQlpbnQgaTsKKworCQkvKiBTcGVjaWFsIGNhc2UgZm9yIDEgbWF0Y2ggKHByZWZpeCBpcyB3aG9sZSB3b3JkKSAqLworCQlpZiAobndvcmRzID09IDEpCisJCQlwcmVmaXhfbGVuID0geF9iYXNlbmFtZSh3b3Jkc1swXSwgTlVMTCk7CisJCS8qIEFueSAobm9uLXRyYWlsaW5nKSBzbGFzaGVzIGluIG5vbi1jb21tb24gd29yZCBzdWZmaXhlcz8gKi8KKwkJZm9yIChpID0gMDsgaSA8IG53b3JkczsgaSsrKQorCQkJaWYgKHhfYmFzZW5hbWUod29yZHNbaV0gKyBwcmVmaXhfbGVuLCBOVUxMKSA+CisJCQkgICAgcHJlZml4X2xlbikKKwkJCQlicmVhazsKKwkJLyogQWxsIGluIHNhbWUgZGlyZWN0b3J5PyAqLworCQlpZiAoaSA9PSBud29yZHMpIHsKKwkJCXdoaWxlIChwcmVmaXhfbGVuID4gMCAmJiB3b3Jkc1swXVtwcmVmaXhfbGVuIC0gMV0gIT0gJy8nKQorCQkJCXByZWZpeF9sZW4tLTsKKwkJCXVzZV9jb3B5ID0gdHJ1ZTsKKwkJCVhQaW5pdChsLCBud29yZHMgKyAxKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBud29yZHM7IGkrKykKKwkJCQlYUHB1dChsLCB3b3Jkc1tpXSArIHByZWZpeF9sZW4pOworCQkJWFBwdXQobCwgTlVMTCk7CisJCX0KKwl9CisJLyoKKwkgKiBFbnVtZXJhdGUgZXhwYW5zaW9ucworCSAqLworCXhfcHV0YygnXHInKTsKKwl4X3B1dGMoJ1xuJyk7CisJcHJfbGlzdCh1c2VfY29weSA/IChjaGFyICoqKVhQcHRydihsKSA6IHdvcmRzKTsKKworCWlmICh1c2VfY29weSkKKwkJWFBmcmVlKGwpOyAvKiBub3QgeF9mcmVlX3dvcmRzKCkgKi8KK30KKworLyoqCisgKiBEbyBmaWxlIGdsb2JiaW5nOgorICoJLSBhcHBlbmRzICogdG8gKGNvcHkgb2YpIHN0ciBpZiBubyBnbG9iYmluZyBjaGFycyBmb3VuZAorICoJLSBkb2VzIGV4cGFuc2lvbiwgY2hlY2tzIGZvciBubyBtYXRjaCwgZXRjLgorICoJLSBzZXRzICp3b3Jkc3AgdG8gYXJyYXkgb2YgbWF0Y2hpbmcgc3RyaW5ncworICoJLSByZXR1cm5zIG51bWJlciBvZiBtYXRjaGluZyBzdHJpbmdzCisgKi8KK3N0YXRpYyBpbnQKK3hfZmlsZV9nbG9iKGludCBmbGFncyBNS1NIX0FfVU5VU0VELCBjb25zdCBjaGFyICpzdHIsIGludCBzbGVuLCBjaGFyICoqKndvcmRzcCkKK3sKKwljaGFyICp0b2dsb2IsICoqd29yZHM7CisJaW50IG53b3JkcywgaSwgaWR4OworCWJvb2wgZXNjYXBpbmc7CisJWFB0clYgdzsKKwlzdHJ1Y3Qgc291cmNlICpzLCAqc29sZDsKKworCWlmIChzbGVuIDwgMCkKKwkJcmV0dXJuICgwKTsKKworCXRvZ2xvYiA9IGFkZF9nbG9iKHN0ciwgc2xlbik7CisKKwkvKiByZW1vdmUgYWxsIGVzY2FwaW5nIGJhY2t3YXJkIHNsYXNoZXMgKi8KKwllc2NhcGluZyA9IGZhbHNlOworCWZvciAoaSA9IDAsIGlkeCA9IDA7IHRvZ2xvYltpXTsgaSsrKSB7CisJCWlmICh0b2dsb2JbaV0gPT0gJ1xcJyAmJiAhZXNjYXBpbmcpIHsKKwkJCWVzY2FwaW5nID0gdHJ1ZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIHNwZWNpYWxseSBlc2NhcGUgZXNjYXBlZCBbIG9yICQgb3IgYCBmb3IgZ2xvYmJpbmcgKi8KKwkJaWYgKGVzY2FwaW5nICYmICh0b2dsb2JbaV0gPT0gJ1snIHx8CisJCSAgICB0b2dsb2JbaV0gPT0gJyQnIHx8IHRvZ2xvYltpXSA9PSAnYCcpKQorCQkJdG9nbG9iW2lkeCsrXSA9IFFDSEFSOworCisJCXRvZ2xvYltpZHhdID0gdG9nbG9iW2ldOworCQlpZHgrKzsKKwkJaWYgKGVzY2FwaW5nKQorCQkJZXNjYXBpbmcgPSBmYWxzZTsKKwl9CisJdG9nbG9iW2lkeF0gPSAnXDAnOworCisJLyoKKwkgKiBDb252ZXJ0ICJmb28qIiAodG9nbG9iKSB0byBhbiBhcnJheSBvZiBzdHJpbmdzICh3b3JkcykKKwkgKi8KKwlzb2xkID0gc291cmNlOworCXMgPSBwdXNocyhTV1NUUiwgQVRFTVApOworCXMtPnN0YXJ0ID0gcy0+c3RyID0gdG9nbG9iOworCXNvdXJjZSA9IHM7CisJaWYgKHl5bGV4KE9ORVdPUkQgfCBMUUNIQVIpICE9IExXT1JEKSB7CisJCXNvdXJjZSA9IHNvbGQ7CisJCWludGVybmFsX3dhcm5pbmdmKCJmaWxlZ2xvYjogc3Vic3RpdHV0ZSBlcnJvciIpOworCQlyZXR1cm4gKDApOworCX0KKwlzb3VyY2UgPSBzb2xkOworCVhQaW5pdCh3LCAzMik7CisJZXhwYW5kKHl5bHZhbC5jcCwgJncsIERPR0xPQiB8IERPVElMREUgfCBET01BUktESVJTKTsKKwlYUHB1dCh3LCBOVUxMKTsKKwl3b3JkcyA9IChjaGFyICoqKVhQY2xvc2Uodyk7CisKKwlmb3IgKG53b3JkcyA9IDA7IHdvcmRzW253b3Jkc107IG53b3JkcysrKQorCQk7CisJaWYgKG53b3JkcyA9PSAxKSB7CisJCXN0cnVjdCBzdGF0IHN0YXRiOworCisJCS8qIENoZWNrIGlmIGdsb2JiaW5nIGZhaWxlZCAocmV0dXJuZWQgZ2xvYiBwYXR0ZXJuKSwKKwkJICogYnV0IGJlIGNhcmVmdWwgKEUuZy4gdG9nbG9iID09ICJhYioiIHdoZW4gdGhlIGZpbGUKKwkJICogImFiKiIgZXhpc3RzIGlzIG5vdCBhbiBlcnJvcikuCisJCSAqIEFsc28sIGNoZWNrIGZvciBlbXB0eSByZXN1bHQgLSBoYXBwZW5zIGlmIHdlIHRyaWVkCisJCSAqIHRvIGdsb2Igc29tZXRoaW5nIHdoaWNoIGV2YWx1YXRlZCB0byBhbiBlbXB0eQorCQkgKiBzdHJpbmcgKGUuZy4sICIkRk9PIiB3aGVuIHRoZXJlIGlzIG5vIEZPTywgZXRjKS4KKwkJICovCisJCWlmICgoc3RyY21wKHdvcmRzWzBdLCB0b2dsb2IpID09IDAgJiYKKwkJICAgIHN0YXQod29yZHNbMF0sICZzdGF0YikgPCAwKSB8fAorCQkgICAgd29yZHNbMF1bMF0gPT0gJ1wwJykgeworCQkJeF9mcmVlX3dvcmRzKG53b3Jkcywgd29yZHMpOworCQkJd29yZHMgPSBOVUxMOworCQkJbndvcmRzID0gMDsKKwkJfQorCX0KKwlhZnJlZSh0b2dsb2IsIEFURU1QKTsKKworCWlmICgoKndvcmRzcCA9IG53b3JkcyA/IHdvcmRzIDogTlVMTCkgPT0gTlVMTCAmJiB3b3JkcyAhPSBOVUxMKQorCQl4X2ZyZWVfd29yZHMobndvcmRzLCB3b3Jkcyk7CisKKwlyZXR1cm4gKG53b3Jkcyk7Cit9CisKKy8qIERhdGEgc3RydWN0dXJlIHVzZWQgaW4geF9jb21tYW5kX2dsb2IoKSAqLworc3RydWN0IHBhdGhfb3JkZXJfaW5mbyB7CisJY2hhciAqd29yZDsKKwlpbnQgYmFzZTsKKwlpbnQgcGF0aF9vcmRlcjsKK307CisKKy8qIENvbXBhcmUgcm91dGluZSB1c2VkIGluIHhfY29tbWFuZF9nbG9iKCkgKi8KK3N0YXRpYyBpbnQKK3BhdGhfb3JkZXJfY21wKGNvbnN0IHZvaWQgKmFhLCBjb25zdCB2b2lkICpiYikKK3sKKwljb25zdCBzdHJ1Y3QgcGF0aF9vcmRlcl9pbmZvICphID0gKGNvbnN0IHN0cnVjdCBwYXRoX29yZGVyX2luZm8gKilhYTsKKwljb25zdCBzdHJ1Y3QgcGF0aF9vcmRlcl9pbmZvICpiID0gKGNvbnN0IHN0cnVjdCBwYXRoX29yZGVyX2luZm8gKiliYjsKKwlpbnQgdDsKKworCXQgPSBzdHJjbXAoYS0+d29yZCArIGEtPmJhc2UsIGItPndvcmQgKyBiLT5iYXNlKTsKKwlyZXR1cm4gKHQgPyB0IDogYS0+cGF0aF9vcmRlciAtIGItPnBhdGhfb3JkZXIpOworfQorCitzdGF0aWMgaW50Cit4X2NvbW1hbmRfZ2xvYihpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHNsZW4sIGNoYXIgKioqd29yZHNwKQoreworCWNoYXIgKnRvZ2xvYiwgKnBhdCwgKmZwYXRoOworCWludCBud29yZHM7CisJWFB0clYgdzsKKwlzdHJ1Y3QgYmxvY2sgKmw7CisKKwlpZiAoc2xlbiA8IDApCisJCXJldHVybiAoMCk7CisKKwl0b2dsb2IgPSBhZGRfZ2xvYihzdHIsIHNsZW4pOworCisJLyogQ29udmVydCAiZm9vKiIgKHRvZ2xvYikgdG8gYSBwYXR0ZXJuIGZvciBmdXR1cmUgdXNlICovCisJcGF0ID0gZXZhbHN0cih0b2dsb2IsIERPUEFUIHwgRE9USUxERSk7CisJYWZyZWUodG9nbG9iLCBBVEVNUCk7CisKKwlYUGluaXQodywgMzIpOworCisJZ2xvYl90YWJsZShwYXQsICZ3LCAma2V5d29yZHMpOworCWdsb2JfdGFibGUocGF0LCAmdywgJmFsaWFzZXMpOworCWdsb2JfdGFibGUocGF0LCAmdywgJmJ1aWx0aW5zKTsKKwlmb3IgKGwgPSBlLT5sb2M7IGw7IGwgPSBsLT5uZXh0KQorCQlnbG9iX3RhYmxlKHBhdCwgJncsICZsLT5mdW5zKTsKKworCWdsb2JfcGF0aChmbGFncywgcGF0LCAmdywgcGF0aCk7CisJaWYgKChmcGF0aCA9IHN0cl92YWwoZ2xvYmFsKCJGUEFUSCIpKSkgIT0gbnVsbCkKKwkJZ2xvYl9wYXRoKGZsYWdzLCBwYXQsICZ3LCBmcGF0aCk7CisKKwlud29yZHMgPSBYUHNpemUodyk7CisKKwlpZiAoIW53b3JkcykgeworCQkqd29yZHNwID0gTlVMTDsKKwkJWFBmcmVlKHcpOworCQlyZXR1cm4gKDApOworCX0KKwkvKiBTb3J0IGVudHJpZXMgKi8KKwlpZiAoZmxhZ3MgJiBYQ0ZfRlVMTFBBVEgpIHsKKwkJLyogU29ydCBieSBiYXNlbmFtZSwgdGhlbiBwYXRoIG9yZGVyICovCisJCXN0cnVjdCBwYXRoX29yZGVyX2luZm8gKmluZm8sICpsYXN0X2luZm8gPSBOVUxMOworCQljaGFyICoqd29yZHMgPSAoY2hhciAqKilYUHB0cnYodyk7CisJCWludCBpLCBwYXRoX29yZGVyID0gMDsKKworCQlpbmZvID0gKHN0cnVjdCBwYXRoX29yZGVyX2luZm8gKikKKwkJICAgIGFsbG9jKG53b3JkcyAqIHNpemVvZihzdHJ1Y3QgcGF0aF9vcmRlcl9pbmZvKSwgQVRFTVApOworCQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspIHsKKwkJCWluZm9baV0ud29yZCA9IHdvcmRzW2ldOworCQkJaW5mb1tpXS5iYXNlID0geF9iYXNlbmFtZSh3b3Jkc1tpXSwgTlVMTCk7CisJCQlpZiAoIWxhc3RfaW5mbyB8fCBpbmZvW2ldLmJhc2UgIT0gbGFzdF9pbmZvLT5iYXNlIHx8CisJCQkgICAgc3RybmNtcCh3b3Jkc1tpXSwgbGFzdF9pbmZvLT53b3JkLCBpbmZvW2ldLmJhc2UpICE9IDApIHsKKwkJCQlsYXN0X2luZm8gPSAmaW5mb1tpXTsKKwkJCQlwYXRoX29yZGVyKys7CisJCQl9CisJCQlpbmZvW2ldLnBhdGhfb3JkZXIgPSBwYXRoX29yZGVyOworCQl9CisJCXFzb3J0KGluZm8sIG53b3Jkcywgc2l6ZW9mKHN0cnVjdCBwYXRoX29yZGVyX2luZm8pLAorCQkgICAgcGF0aF9vcmRlcl9jbXApOworCQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspCisJCQl3b3Jkc1tpXSA9IGluZm9baV0ud29yZDsKKwkJYWZyZWUoaW5mbywgQVRFTVApOworCX0gZWxzZSB7CisJCS8qIFNvcnQgYW5kIHJlbW92ZSBkdXBsaWNhdGUgZW50cmllcyAqLworCQljaGFyICoqd29yZHMgPSAoY2hhciAqKilYUHB0cnYodyk7CisJCWludCBpLCBqOworCisJCXFzb3J0KHdvcmRzLCBud29yZHMsIHNpemVvZih2b2lkICopLCB4c3RyY21wKTsKKwkJZm9yIChpID0gaiA9IDA7IGkgPCBud29yZHMgLSAxOyBpKyspIHsKKwkJCWlmIChzdHJjbXAod29yZHNbaV0sIHdvcmRzW2kgKyAxXSkpCisJCQkJd29yZHNbaisrXSA9IHdvcmRzW2ldOworCQkJZWxzZQorCQkJCWFmcmVlKHdvcmRzW2ldLCBBVEVNUCk7CisJCX0KKwkJd29yZHNbaisrXSA9IHdvcmRzW2ldOworCQlud29yZHMgPSBqOworCQl3LmN1ciA9ICh2b2lkICoqKSZ3b3Jkc1tqXTsKKwl9CisKKwlYUHB1dCh3LCBOVUxMKTsKKwkqd29yZHNwID0gKGNoYXIgKiopWFBjbG9zZSh3KTsKKworCXJldHVybiAobndvcmRzKTsKK30KKworI2RlZmluZSBJU19XT1JEQyhjKQkoIWN0eXBlKGMsIENfTEVYMSkgJiYgKGMpICE9ICdcJycgJiYgKGMpICE9ICciJyAmJiBcCisJCQkgICAgKGMpICE9ICdgJyAmJiAoYykgIT0gJz0nICYmIChjKSAhPSAnOicpCisKK3N0YXRpYyBpbnQKK3hfbG9jYXRlX3dvcmQoY29uc3QgY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgcG9zLCBpbnQgKnN0YXJ0cCwKKyAgICBib29sICppc19jb21tYW5kcCkKK3sKKwlpbnQgc3RhcnQsIGVuZDsKKworCS8qIEJhZCBjYWxsPyBQcm9iYWJseSBzaG91bGQgcmVwb3J0IGVycm9yICovCisJaWYgKHBvcyA8IDAgfHwgcG9zID4gYnVmbGVuKSB7CisJCSpzdGFydHAgPSBwb3M7CisJCSppc19jb21tYW5kcCA9IGZhbHNlOworCQlyZXR1cm4gKDApOworCX0KKwkvKiBUaGUgY2FzZSB3aGVyZSBwb3MgPT0gYnVmbGVuIGhhcHBlbnMgdG8gdGFrZSBjYXJlIG9mIGl0c2VsZi4uLiAqLworCisJc3RhcnQgPSBwb3M7CisJLyogS2VlcCBnb2luZyBiYWNrd2FyZHMgdG8gc3RhcnQgb2Ygd29yZCAoaGFzIGVmZmVjdCBvZiBhbGxvd2luZworCSAqIG9uZSBibGFuayBhZnRlciB0aGUgZW5kIG9mIGEgd29yZCkKKwkgKi8KKwlmb3IgKDsgKHN0YXJ0ID4gMCAmJiBJU19XT1JEQyhidWZbc3RhcnQgLSAxXSkpIHx8CisJICAgIChzdGFydCA+IDEgJiYgYnVmW3N0YXJ0IC0gMl0gPT0gJ1xcJyk7IHN0YXJ0LS0pCisJCTsKKwkvKiBHbyBmb3J3YXJkcyB0byBlbmQgb2Ygd29yZCAqLworCWZvciAoZW5kID0gc3RhcnQ7IGVuZCA8IGJ1ZmxlbiAmJiBJU19XT1JEQyhidWZbZW5kXSk7IGVuZCsrKSB7CisJCWlmIChidWZbZW5kXSA9PSAnXFwnICYmIChlbmQgKyAxKSA8IGJ1ZmxlbikKKwkJCWVuZCsrOworCX0KKworCWlmIChpc19jb21tYW5kcCkgeworCQlib29sIGlzY21kOworCQlpbnQgcCA9IHN0YXJ0IC0gMTsKKworCQkvKiBGaWd1cmUgb3V0IGlmIHRoaXMgaXMgYSBjb21tYW5kICovCisJCXdoaWxlIChwID49IDAgJiYga3NoX2lzc3BhY2UoYnVmW3BdKSkKKwkJCXAtLTsKKwkJaXNjbWQgPSBwIDwgMCB8fCB2c3RyY2hyKCI7fCYoKWAiLCBidWZbcF0pOworCQlpZiAoaXNjbWQpIHsKKwkJCS8qIElmIGNvbW1hbmQgaGFzIGEgLywgcGF0aCwgZXRjLiBpcyBub3Qgc2VhcmNoZWQ7CisJCQkgKiBvbmx5IGN1cnJlbnQgZGlyZWN0b3J5IGlzIHNlYXJjaGVkIHdoaWNoIGlzIGp1c3QKKwkJCSAqIGxpa2UgZmlsZSBnbG9iYmluZy4KKwkJCSAqLworCQkJZm9yIChwID0gc3RhcnQ7IHAgPCBlbmQ7IHArKykKKwkJCQlpZiAoYnVmW3BdID09ICcvJykKKwkJCQkJYnJlYWs7CisJCQlpc2NtZCA9IHAgPT0gZW5kOworCQl9CisJCSppc19jb21tYW5kcCA9IGlzY21kOworCX0KKwkqc3RhcnRwID0gc3RhcnQ7CisKKwlyZXR1cm4gKGVuZCAtIHN0YXJ0KTsKK30KKworc3RhdGljIGludAoreF9jZl9nbG9iKGludCBmbGFncywgY29uc3QgY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgcG9zLCBpbnQgKnN0YXJ0cCwKKyAgICBpbnQgKmVuZHAsIGNoYXIgKioqd29yZHNwLCBib29sICppc19jb21tYW5kcCkKK3sKKwlpbnQgbGVuLCBud29yZHM7CisJY2hhciAqKndvcmRzID0gTlVMTDsKKwlib29sIGlzX2NvbW1hbmQ7CisKKwlsZW4gPSB4X2xvY2F0ZV93b3JkKGJ1ZiwgYnVmbGVuLCBwb3MsIHN0YXJ0cCwgJmlzX2NvbW1hbmQpOworCWlmICghKGZsYWdzICYgWENGX0NPTU1BTkQpKQorCQlpc19jb21tYW5kID0gZmFsc2U7CisJLyogRG9uJ3QgZG8gY29tbWFuZCBnbG9iaW5nIG9uIHplcm8gbGVuZ3RoIHN0cmluZ3MgLSBpdCB0YWtlcyB0b28KKwkgKiBsb25nIGFuZCBpc24ndCB2ZXJ5IHVzZWZ1bC4gRmlsZSBnbG9icyBhcmUgbW9yZSBsaWtlbHkgdG8gYmUKKwkgKiB1c2VmdWwsIHNvIGFsbG93IHRoZXNlLgorCSAqLworCWlmIChsZW4gPT0gMCAmJiBpc19jb21tYW5kKQorCQlyZXR1cm4gKDApOworCisJbndvcmRzID0gaXNfY29tbWFuZCA/CisJICAgIHhfY29tbWFuZF9nbG9iKGZsYWdzLCBidWYgKyAqc3RhcnRwLCBsZW4sICZ3b3JkcykgOgorCSAgICB4X2ZpbGVfZ2xvYihmbGFncywgYnVmICsgKnN0YXJ0cCwgbGVuLCAmd29yZHMpOworCWlmIChud29yZHMgPT0gMCkgeworCQkqd29yZHNwID0gTlVMTDsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKGlzX2NvbW1hbmRwKQorCQkqaXNfY29tbWFuZHAgPSBpc19jb21tYW5kOworCSp3b3Jkc3AgPSB3b3JkczsKKwkqZW5kcCA9ICpzdGFydHAgKyBsZW47CisKKwlyZXR1cm4gKG53b3Jkcyk7Cit9CisKKy8qIEdpdmVuIGEgc3RyaW5nLCBjb3B5IGl0IGFuZCBwb3NzaWJseSBhZGQgYSAnKicgdG8gdGhlIGVuZC4KKyAqIFRoZSBuZXcgc3RyaW5nIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgY2hhciAqCithZGRfZ2xvYihjb25zdCBjaGFyICpzdHIsIGludCBzbGVuKQoreworCWNoYXIgKnRvZ2xvYiwgKnM7CisJYm9vbCBzYXdfc2xhc2ggPSBmYWxzZTsKKworCWlmIChzbGVuIDwgMCkKKwkJcmV0dXJuIChOVUxMKTsKKworCS8qIGZvciBjbGFuZydzIHN0YXRpYyBhbmFseXNlciwgdGhlIG5vbm51bGwgYXR0cmlidXRlIGlzbid0IGVub3VnaCAqLworCW1rc3NlcnQoc3RyICE9IE5VTEwpOworCisJc3RybmR1cHgodG9nbG9iLCBzdHIsIHNsZW4gKyAxLCBBVEVNUCk7IC8qICsgMSBmb3IgIioiICovCisJdG9nbG9iW3NsZW5dID0gJ1wwJzsKKworCS8qCisJICogSWYgdGhlIHBhdGhuYW1lIGNvbnRhaW5zIGEgd2lsZGNhcmQgKGFuIHVucXVvdGVkICcqJywKKwkgKiAnPycsIG9yICdbJykgb3IgcGFyYW1ldGVyIGV4cGFuc2lvbiAoJyQnKSwgb3IgYSB+dXNlcm5hbWUKKwkgKiB3aXRoIG5vIHRyYWlsaW5nIHNsYXNoLCB0aGVuIGl0IGlzIGdsb2JiZWQgYmFzZWQgb24gdGhhdAorCSAqIHZhbHVlIChpLmUuLCB3aXRob3V0IHRoZSBhcHBlbmRlZCAnKicpLgorCSAqLworCWZvciAocyA9IHRvZ2xvYjsgKnM7IHMrKykgeworCQlpZiAoKnMgPT0gJ1xcJyAmJiBzWzFdKQorCQkJcysrOworCQllbHNlIGlmICgqcyA9PSAnKicgfHwgKnMgPT0gJ1snIHx8ICpzID09ICc/JyB8fCAqcyA9PSAnJCcgfHwKKwkJICAgIChzWzFdID09ICcoJyAvKikqLyAmJiAvKiAqcyBpbiAnKicsJz8nIGFscmVhZHkgY2hlY2tlZCAqLworCQkgICAgKCpzID09ICcrJyB8fCAqcyA9PSAnQCcgfHwgKnMgPT0gJyEnKSkpCisJCQlicmVhazsKKwkJZWxzZSBpZiAoKnMgPT0gJy8nKQorCQkJc2F3X3NsYXNoID0gdHJ1ZTsKKwl9CisJaWYgKCEqcyAmJiAoKnRvZ2xvYiAhPSAnficgfHwgc2F3X3NsYXNoKSkgeworCQl0b2dsb2Jbc2xlbl0gPSAnKic7CisJCXRvZ2xvYltzbGVuICsgMV0gPSAnXDAnOworCX0KKwlyZXR1cm4gKHRvZ2xvYik7Cit9CisKKy8qCisgKiBGaW5kIGxvbmdlc3QgY29tbW9uIHByZWZpeAorICovCitzdGF0aWMgaW50Cit4X2xvbmdlc3RfcHJlZml4KGludCBud29yZHMsIGNoYXIgKiBjb25zdCAqIHdvcmRzKQoreworCWludCBpLCBqLCBwcmVmaXhfbGVuOworCWNoYXIgKnA7CisKKwlpZiAobndvcmRzIDw9IDApCisJCXJldHVybiAoMCk7CisKKwlwcmVmaXhfbGVuID0gc3RybGVuKHdvcmRzWzBdKTsKKwlmb3IgKGkgPSAxOyBpIDwgbndvcmRzOyBpKyspCisJCWZvciAoaiA9IDAsIHAgPSB3b3Jkc1tpXTsgaiA8IHByZWZpeF9sZW47IGorKykKKwkJCWlmIChwW2pdICE9IHdvcmRzWzBdW2pdKSB7CisJCQkJcHJlZml4X2xlbiA9IGo7CisJCQkJYnJlYWs7CisJCQl9CisJcmV0dXJuIChwcmVmaXhfbGVuKTsKK30KKworc3RhdGljIHZvaWQKK3hfZnJlZV93b3JkcyhpbnQgbndvcmRzLCBjaGFyICoqd29yZHMpCit7CisJd2hpbGUgKG53b3JkcykKKwkJYWZyZWUod29yZHNbLS1ud29yZHNdLCBBVEVNUCk7CisJYWZyZWUod29yZHMsIEFURU1QKTsKK30KKworLyogUmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGJhc2VuYW1lIG9mIHN0cmluZyBzICh3aGljaCBlbmRzIGF0IHNlIC0gbmVlZCBub3QKKyAqIGJlIG51bGwgdGVybWluYXRlZCkuIFRyYWlsaW5nIHNsYXNoZXMgYXJlIGlnbm9yZWQuIElmIHMgaXMganVzdCBhIHNsYXNoLAorICogdGhlbiB0aGUgb2Zmc2V0IGlzIDAgKGFjdHVhbGx5LCBsZW5ndGggLSAxKS4KKyAqCXMJCVJldHVybgorICoJL2V0YwkJMQorICoJL2V0Yy8JCTEKKyAqCS9ldGMvLwkJMQorICoJL2V0Yy9mbwkJNQorICoJZm9vCQkwCisgKgkvLy8JCTIKKyAqCQkJMAorICovCitzdGF0aWMgaW50Cit4X2Jhc2VuYW1lKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnNlKQoreworCWNvbnN0IGNoYXIgKnA7CisKKwlpZiAoc2UgPT0gTlVMTCkKKwkJc2UgPSBzICsgc3RybGVuKHMpOworCWlmIChzID09IHNlKQorCQlyZXR1cm4gKDApOworCisJLyogU2tpcCB0cmFpbGluZyBzbGFzaGVzICovCisJZm9yIChwID0gc2UgLSAxOyBwID4gcyAmJiAqcCA9PSAnLyc7IHAtLSkKKwkJOworCWZvciAoOyBwID4gcyAmJiAqcCAhPSAnLyc7IHAtLSkKKwkJOworCWlmICgqcCA9PSAnLycgJiYgcCArIDEgPCBzZSkKKwkJcCsrOworCisJcmV0dXJuIChwIC0gcyk7Cit9CisKKy8qCisgKiBBcHBseSBwYXR0ZXJuIG1hdGNoaW5nIHRvIGEgdGFibGU6IGFsbCB0YWJsZSBlbnRyaWVzIHRoYXQgbWF0Y2ggYSBwYXR0ZXJuCisgKiBhcmUgYWRkZWQgdG8gd3AuCisgKi8KK3N0YXRpYyB2b2lkCitnbG9iX3RhYmxlKGNvbnN0IGNoYXIgKnBhdCwgWFB0clYgKndwLCBzdHJ1Y3QgdGFibGUgKnRwKQoreworCXN0cnVjdCB0c3RhdGUgdHM7CisJc3RydWN0IHRibCAqdGU7CisKKwlrdHdhbGsoJnRzLCB0cCk7CisJd2hpbGUgKCh0ZSA9IGt0bmV4dCgmdHMpKSkKKwkJaWYgKGdtYXRjaHgodGUtPm5hbWUsIHBhdCwgZmFsc2UpKSB7CisJCQljaGFyICpjcDsKKworCQkJc3RyZHVweChjcCwgdGUtPm5hbWUsIEFURU1QKTsKKwkJCVhQcHV0KCp3cCwgY3ApOworCQl9Cit9CisKK3N0YXRpYyB2b2lkCitnbG9iX3BhdGgoaW50IGZsYWdzLCBjb25zdCBjaGFyICpwYXQsIFhQdHJWICp3cCwgY29uc3QgY2hhciAqbHBhdGgpCit7CisJY29uc3QgY2hhciAqc3AsICpwOworCWNoYXIgKnhwLCAqKndvcmRzOworCWludCBzdGF0ZXJyLCBwYXRobGVuLCBwYXRsZW4sIG9sZHNpemUsIG5ld3NpemUsIGksIGo7CisJWFN0cmluZyB4czsKKworCXBhdGxlbiA9IHN0cmxlbihwYXQpICsgMTsKKwlzcCA9IGxwYXRoOworCVhpbml0KHhzLCB4cCwgcGF0bGVuICsgMTI4LCBBVEVNUCk7CisJd2hpbGUgKHNwKSB7CisJCXhwID0gWHN0cmluZyh4cywgeHApOworCQlpZiAoIShwID0gY3N0cmNocihzcCwgJzonKSkpCisJCQlwID0gc3AgKyBzdHJsZW4oc3ApOworCQlwYXRobGVuID0gcCAtIHNwOworCQlpZiAocGF0aGxlbikgeworCQkJLyogQ29weSBzcCBpbnRvIHhwLCBzdHVmZmluZyBhbnkgTUFHSUMgY2hhcmFjdGVycworCQkJICogb24gdGhlIHdheQorCQkJICovCisJCQljb25zdCBjaGFyICpzID0gc3A7CisKKwkJCVhjaGVja04oeHMsIHhwLCBwYXRobGVuICogMik7CisJCQl3aGlsZSAocyA8IHApIHsKKwkJCQlpZiAoSVNNQUdJQygqcykpCisJCQkJCSp4cCsrID0gTUFHSUM7CisJCQkJKnhwKysgPSAqcysrOworCQkJfQorCQkJKnhwKysgPSAnLyc7CisJCQlwYXRobGVuKys7CisJCX0KKwkJc3AgPSBwOworCQlYY2hlY2tOKHhzLCB4cCwgcGF0bGVuKTsKKwkJbWVtY3B5KHhwLCBwYXQsIHBhdGxlbik7CisKKwkJb2xkc2l6ZSA9IFhQc2l6ZSgqd3ApOworCQlnbG9iX3N0cihYc3RyaW5nKHhzLCB4cCksIHdwLCAxKTsgLyogbWFyayBkaXJzICovCisJCW5ld3NpemUgPSBYUHNpemUoKndwKTsKKworCQkvKiBDaGVjayB0aGF0IGVhY2ggbWF0Y2ggaXMgZXhlY3V0YWJsZS4uLiAqLworCQl3b3JkcyA9IChjaGFyICoqKVhQcHRydigqd3ApOworCQlmb3IgKGkgPSBqID0gb2xkc2l6ZTsgaSA8IG5ld3NpemU7IGkrKykgeworCQkJc3RhdGVyciA9IDA7CisJCQlpZiAoKHNlYXJjaF9hY2Nlc3Mod29yZHNbaV0sIFhfT0ssICZzdGF0ZXJyKSA+PSAwKSB8fAorCQkJICAgIChzdGF0ZXJyID09IEVJU0RJUikpIHsKKwkJCQl3b3Jkc1tqXSA9IHdvcmRzW2ldOworCQkJCWlmICghKGZsYWdzICYgWENGX0ZVTExQQVRIKSkKKwkJCQkJbWVtbW92ZSh3b3Jkc1tqXSwgd29yZHNbal0gKyBwYXRobGVuLAorCQkJCQkgICAgc3RybGVuKHdvcmRzW2pdICsgcGF0aGxlbikgKyAxKTsKKwkJCQlqKys7CisJCQl9IGVsc2UKKwkJCQlhZnJlZSh3b3Jkc1tpXSwgQVRFTVApOworCQl9CisJCXdwLT5jdXIgPSAodm9pZCAqKikmd29yZHNbal07CisKKwkJaWYgKCEqc3ArKykKKwkJCWJyZWFrOworCX0KKwlYZnJlZSh4cywgeHApOworfQorCisvKgorICogaWYgYXJndW1lbnQgc3RyaW5nIGNvbnRhaW5zIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMsIHRoZXkgd2lsbAorICogYmUgZXNjYXBlZCBhbmQgdGhlIHJlc3VsdCB3aWxsIGJlIHB1dCBpbnRvIGVkaXQgYnVmZmVyIGJ5CisgKiBrZXliaW5kaW5nLXNwZWNpZmljIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyBpbnQKK3hfZXNjYXBlKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4sIGludCAoKnB1dGJ1Zl9mdW5jKShjb25zdCBjaGFyICosIHNpemVfdCkpCit7CisJc2l6ZV90IGFkZCA9IDAsIHdsZW4gPSBsZW47CisJY29uc3QgY2hhciAqaWZzID0gc3RyX3ZhbChsb2NhbCgiSUZTIiwgMCkpOworCWludCBydmFsID0gMDsKKworCXdoaWxlICh3bGVuIC0gYWRkID4gMCkKKwkJaWYgKHZzdHJjaHIoIlwiIyQmJygpKjo7PD0+P1tcXGB7fH0iLCBzW2FkZF0pIHx8CisJCSAgICB2c3RyY2hyKGlmcywgc1thZGRdKSkgeworCQkJaWYgKHB1dGJ1Zl9mdW5jKHMsIGFkZCkgIT0gMCkgeworCQkJCXJ2YWwgPSAtMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXB1dGJ1Zl9mdW5jKHNbYWRkXSA9PSAnXG4nID8gIiciIDogIlxcIiwgMSk7CisJCQlwdXRidWZfZnVuYygmc1thZGRdLCAxKTsKKwkJCWlmIChzW2FkZF0gPT0gJ1xuJykKKwkJCQlwdXRidWZfZnVuYygiJyIsIDEpOworCisJCQlhZGQrKzsKKwkJCXdsZW4gLT0gYWRkOworCQkJcyArPSBhZGQ7CisJCQlhZGQgPSAwOworCQl9IGVsc2UKKwkJCSsrYWRkOworCWlmICh3bGVuID4gMCAmJiBydmFsID09IDApCisJCXJ2YWwgPSBwdXRidWZfZnVuYyhzLCB3bGVuKTsKKworCXJldHVybiAocnZhbCk7Cit9CisKKworLyogKysrIGVtYWNzIGVkaXRpbmcgbW9kZSArKysgKi8KKworc3RhdGljCUFyZWEJYWVkaXQ7CisjZGVmaW5lCUFFRElUCSZhZWRpdAkJLyogYXJlYSBmb3Iga2lsbCByaW5nIGFuZCBtYWNybyBkZWZucyAqLworCisvKiB2YWx1ZXMgcmV0dXJuZWQgYnkga2V5Ym9hcmQgZnVuY3Rpb25zICovCisjZGVmaW5lCUtTVEQJMAorI2RlZmluZQlLRU9MCTEJCS8qIF5NLCBeSiAqLworI2RlZmluZQlLSU5UUgkyCQkvKiBeRywgXkMgKi8KKworc3RydWN0IHhfZnRhYiB7CisJaW50ICgqeGZfZnVuYykoaW50IGMpOworCWNvbnN0IGNoYXIgKnhmX25hbWU7CisJc2hvcnQgeGZfZmxhZ3M7Cit9OworCitzdHJ1Y3QgeF9kZWZiaW5kaW5ncyB7CisJdW5zaWduZWQgY2hhciB4ZGJfZnVuYzsJLyogWEZVTkNfKiAqLworCXVuc2lnbmVkIGNoYXIgeGRiX3RhYjsKKwl1bnNpZ25lZCBjaGFyIHhkYl9jaGFyOworfTsKKworI2RlZmluZSBYRl9BUkcJCTEJLyogY29tbWFuZCB0YWtlcyBudW1iZXIgcHJlZml4ICovCisjZGVmaW5lCVhGX05PQklORAkyCS8qIG5vdCBhbGxvd2VkIHRvIGJpbmQgdG8gZnVuY3Rpb24gKi8KKyNkZWZpbmUJWEZfUFJFRklYCTQJLyogZnVuY3Rpb24gc2V0cyBwcmVmaXggKi8KKworLyogU2VwYXJhdG9yIGZvciBjb21wbGV0aW9uICovCisjZGVmaW5lCWlzX2NmcyhjKQkoKGMpID09ICcgJyB8fCAoYykgPT0gJ1x0JyB8fCAoYykgPT0gJyInIHx8IChjKSA9PSAnXCcnKQorLyogU2VwYXJhdG9yIGZvciBtb3Rpb24gKi8KKyNkZWZpbmUJaXNfbWZzKGMpCSghKGtzaF9pc2FsbnV4KGMpIHx8IChjKSA9PSAnJCcgfHwgKChjKSAmIDB4ODApKSkKKworI2RlZmluZSBYX05UQUJTCQkzCQkJLyogbm9ybWFsLCBtZXRhMSwgbWV0YTIgKi8KKyNkZWZpbmUgWF9UQUJTWgkJMjU2CQkJLyogc2l6ZSBvZiBrZXlkZWYgdGFibGVzIGV0YyAqLworCisvKiBBcmd1bWVudHMgZm9yIGRvX2NvbXBsZXRlKCkKKyAqIDAgPSBlbnVtZXJhdGUJTS09CWNvbXBsZXRlIGFzIG11Y2ggYXMgcG9zc2libGUgYW5kIHRoZW4gbGlzdAorICogMSA9IGNvbXBsZXRlCQlNLUVzYworICogMiA9IGxpc3QJCU0tPworICovCit0eXBlZGVmIGVudW0geworCUNUX0xJU1QsCS8qIGxpc3QgdGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zICovCisJQ1RfQ09NUExFVEUsCS8qIGNvbXBsZXRlIHRvIGxvbmdlc3QgcHJlZml4ICovCisJQ1RfQ09NUExJU1QJLyogY29tcGxldGUgYW5kIHRoZW4gbGlzdCAoaWYgbm9uLWV4YWN0KSAqLworfSBDb21wX3R5cGU7CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIGZvciBteSBob3Jpem9udGFsIHNjcm9sbGluZyBzdHVmZgorICovCitzdGF0aWMgY2hhciAqeGJ1ZjsJCS8qIGJlZyBpbnB1dCBidWZmZXIgKi8KK3N0YXRpYyBjaGFyICp4ZW5kOwkJLyogZW5kIGlucHV0IGJ1ZmZlciAqLworc3RhdGljIGNoYXIgKnhjcDsJCS8qIGN1cnJlbnQgcG9zaXRpb24gKi8KK3N0YXRpYyBjaGFyICp4ZXA7CQkvKiBjdXJyZW50IGVuZCAqLworc3RhdGljIGNoYXIgKnhicDsJCS8qIHN0YXJ0IG9mIHZpc2libGUgcG9ydGlvbiBvZiBpbnB1dCBidWZmZXIgKi8KK3N0YXRpYyBjaGFyICp4bHA7CQkvKiBsYXN0IGNoYXIgdmlzaWJsZSBvbiBzY3JlZW4gKi8KK3N0YXRpYyBpbnQgeF9hZGpfb2s7CisvKgorICogd2UgdXNlIHhfYWRqX2RvbmUgc28gdGhhdCBmdW5jdGlvbnMgY2FuIHRlbGwKKyAqIHdoZXRoZXIgeF9hZGp1c3QoKSBoYXMgYmVlbiBjYWxsZWQgd2hpbGUgdGhleSBhcmUgYWN0aXZlLgorICovCitzdGF0aWMgaW50IHhfYWRqX2RvbmU7CisKK3N0YXRpYyBpbnQgeF9jb2w7CitzdGF0aWMgaW50IHhfZGlzcGxlbjsKK3N0YXRpYyBpbnQgeF9hcmc7CQkvKiBnZW5lcmFsIHB1cnBvc2UgYXJnICovCitzdGF0aWMgaW50IHhfYXJnX2RlZmF1bHRlZDsJLyogeF9hcmcgbm90IGV4cGxpY2l0bHkgc2V0OyBkZWZhdWx0ZWQgdG8gMSAqLworCitzdGF0aWMgaW50IHhscF92YWxpZDsKKworc3RhdGljIGNoYXIgKip4X2hpc3RwOwkJLyogaGlzdG9yeSBwb3NpdGlvbiAqLworc3RhdGljIGludCB4X25leHRjbWQ7CQkvKiBmb3IgbmV3bGluZS1hbmQtbmV4dCAqLworc3RhdGljIGNoYXIgKnhtcDsJCS8qIG1hcmsgcG9pbnRlciAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgeF9sYXN0X2NvbW1hbmQ7CitzdGF0aWMgdW5zaWduZWQgY2hhciAoKnhfdGFiKVtYX1RBQlNaXTsJLyoga2V5IGRlZmluaXRpb24gKi8KKyNpZm5kZWYgTUtTSF9TTUFMTAorc3RhdGljIGNoYXIgKigqeF9hdGFiKVtYX1RBQlNaXTsJLyogbWFjcm8gZGVmaW5pdGlvbnMgKi8KKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGNoYXIgeF9ib3VuZFsoWF9UQUJTWiAqIFhfTlRBQlMgKyA3KSAvIDhdOworI2RlZmluZSBLSUxMU0laRQkyMAorc3RhdGljIGNoYXIgKmtpbGxzdGFja1tLSUxMU0laRV07CitzdGF0aWMgaW50IGtpbGxzcCwga2lsbHRwOworc3RhdGljIGludCB4X2N1cnByZWZpeDsKKyNpZm5kZWYgTUtTSF9TTUFMTAorc3RhdGljIGNoYXIgKm1hY3JvcHRyID0gTlVMTDsJLyogYmluZCBrZXkgbWFjcm8gYWN0aXZlPyAqLworI2VuZGlmCisjaWYgIU1LU0hfU19OT1ZJCitzdGF0aWMgaW50IGN1cl9jb2w7CQkvKiBjdXJyZW50IGNvbHVtbiBvbiBsaW5lICovCitzdGF0aWMgaW50IHB3aWR0aDsJCS8qIHdpZHRoIG9mIHByb21wdCAqLworc3RhdGljIGludCBwcm9tcHRfdHJ1bmM7CS8qIGhvdyBtdWNoIG9mIHByb21wdCB0byB0cnVuY2F0ZSAqLworc3RhdGljIGludCB3aW53aWR0aDsJCS8qIHdpZHRoIG9mIHdpbmRvdyAqLworc3RhdGljIGNoYXIgKndidWZbMl07CQkvKiB3aW5kb3cgYnVmZmVycyAqLworc3RhdGljIGludCB3YnVmX2xlbjsJCS8qIGxlbmd0aCBvZiB3aW5kb3cgYnVmZmVycyAoeF9jb2xzIC0gMykgKi8KK3N0YXRpYyBpbnQgd2luOwkJCS8qIHdpbmRvdyBidWZmZXIgaW4gdXNlICovCitzdGF0aWMgY2hhciBtb3JlYzsJCS8qIG1vcmUgY2hhcmFjdGVyIGF0IHJpZ2h0IG9mIHdpbmRvdyAqLworc3RhdGljIGludCBsYXN0cmVmOwkJLyogYXJndW1lbnQgdG8gbGFzdCByZWZyZXNoKCkgKi8KK3N0YXRpYyBpbnQgaG9sZGxlbjsJCS8qIGxlbmd0aCBvZiBob2xkYnVmICovCisjZW5kaWYKK3N0YXRpYyBpbnQgcHJvbXB0X3JlZHJhdzsJLyogMCBpZiBuZXdsaW5lIGZvcmNlZCBhZnRlciBwcm9tcHQgKi8KKworc3RhdGljIGludCB4X2lucyhjb25zdCBjaGFyICopOworc3RhdGljIHZvaWQgeF9kZWxldGUoaW50LCBpbnQpOworc3RhdGljIGludCB4X2J3b3JkKHZvaWQpOworc3RhdGljIGludCB4X2Z3b3JkKGludCk7CitzdGF0aWMgdm9pZCB4X2dvdG8oY2hhciAqKTsKK3N0YXRpYyB2b2lkIHhfYnMzKGNoYXIgKiopOworc3RhdGljIGludCB4X3NpemVfc3RyKGNoYXIgKik7CitzdGF0aWMgaW50IHhfc2l6ZTIoY2hhciAqLCBjaGFyICoqKTsKK3N0YXRpYyB2b2lkIHhfem90cyhjaGFyICopOworc3RhdGljIHZvaWQgeF96b3RjMihpbnQpOworc3RhdGljIHZvaWQgeF96b3RjMyhjaGFyICoqKTsKK3N0YXRpYyB2b2lkIHhfbG9hZF9oaXN0KGNoYXIgKiopOworc3RhdGljIGludCB4X3NlYXJjaChjaGFyICosIGludCwgaW50KTsKKyNpZm5kZWYgTUtTSF9TTUFMTAorc3RhdGljIGludCB4X3NlYXJjaF9kaXIoaW50KTsKKyNlbmRpZgorc3RhdGljIGludCB4X21hdGNoKGNoYXIgKiwgY2hhciAqKTsKK3N0YXRpYyB2b2lkIHhfcmVkcmF3KGludCk7CitzdGF0aWMgdm9pZCB4X3B1c2goaW50KTsKK3N0YXRpYyBjaGFyICp4X21hcGluKGNvbnN0IGNoYXIgKiwgQXJlYSAqKQorICAgIE1LU0hfQV9OT05OVUxMKChub25udWxsICgxKSkpOworc3RhdGljIGNoYXIgKnhfbWFwb3V0KGludCk7CitzdGF0aWMgdm9pZCB4X21hcG91dDIoaW50LCBjaGFyICoqKTsKK3N0YXRpYyB2b2lkIHhfcHJpbnQoaW50LCBpbnQpOworc3RhdGljIHZvaWQgeF9hZGp1c3Qodm9pZCk7CitzdGF0aWMgdm9pZCB4X2VfdW5nZXRjKGludCk7CitzdGF0aWMgaW50IHhfZV9nZXRjKHZvaWQpOworc3RhdGljIHZvaWQgeF9lX3B1dGMyKGludCk7CitzdGF0aWMgdm9pZCB4X2VfcHV0YzMoY29uc3QgY2hhciAqKik7CitzdGF0aWMgdm9pZCB4X2VfcHV0cyhjb25zdCBjaGFyICopOworI2lmbmRlZiBNS1NIX1NNQUxMCitzdGF0aWMgaW50IHhfZm9sZF9jYXNlKGludCk7CisjZW5kaWYKK3N0YXRpYyBjaGFyICp4X2xhc3RjcCh2b2lkKTsKK3N0YXRpYyB2b2lkIGRvX2NvbXBsZXRlKGludCwgQ29tcF90eXBlKTsKKworc3RhdGljIGludCB1bmdldF9jaGFyID0gLTE7CisKK3N0YXRpYyBpbnQgeF9kb19pbnMoY29uc3QgY2hhciAqLCBzaXplX3QpOworc3RhdGljIHZvaWQgYmluZF9pZl9ub3RfYm91bmQoaW50LCBpbnQsIGludCk7CisKK2VudW0gZW1hY3NfZnVuY3MgeworI2RlZmluZSBFTUFDU0ZOX0VOVU1TCisjaW5jbHVkZSAiZW1hY3Nmbi5oIgorCVhGVU5DX01BWAorfTsKKworI2RlZmluZSBFTUFDU0ZOX0RFRk5TCisjaW5jbHVkZSAiZW1hY3Nmbi5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHhfZnRhYiB4X2Z0YWJbXSA9IHsKKyNkZWZpbmUgRU1BQ1NGTl9JVEVNUworI2luY2x1ZGUgImVtYWNzZm4uaCIKKwl7IDAsIE5VTEwsIDAgfQorfTsKKworc3RhdGljIHN0cnVjdCB4X2RlZmJpbmRpbmdzIGNvbnN0IHhfZGVmYmluZGluZ3NbXSA9IHsKKwl7IFhGVU5DX2RlbF9iYWNrLAkJMCwgQ1RSTCgnPycpCX0sCisJeyBYRlVOQ19kZWxfYndvcmQsCQkxLCBDVFJMKCc/JykJfSwKKwl7IFhGVU5DX2VvdF9kZWwsCQkwLCBDVFJMKCdEJykJfSwKKwl7IFhGVU5DX2RlbF9iYWNrLAkJMCwgQ1RSTCgnSCcpCX0sCisJeyBYRlVOQ19kZWxfYndvcmQsCQkxLCBDVFJMKCdIJykJfSwKKwl7IFhGVU5DX2RlbF9id29yZCwJCTEsCSdoJwl9LAorCXsgWEZVTkNfbXZfYndvcmQsCQkxLAknYicJfSwKKwl7IFhGVU5DX212X2Z3b3JkLAkJMSwJJ2YnCX0sCisJeyBYRlVOQ19kZWxfZndvcmQsCQkxLAknZCcJfSwKKwl7IFhGVU5DX212X2JhY2ssCQkwLCBDVFJMKCdCJykJfSwKKwl7IFhGVU5DX212X2ZvcncsCQkwLCBDVFJMKCdGJykJfSwKKwl7IFhGVU5DX3NlYXJjaF9jaGFyX2ZvcncsCTAsIENUUkwoJ10nKQl9LAorCXsgWEZVTkNfc2VhcmNoX2NoYXJfYmFjaywJMSwgQ1RSTCgnXScpCX0sCisJeyBYRlVOQ19uZXdsaW5lLAkJMCwgQ1RSTCgnTScpCX0sCisJeyBYRlVOQ19uZXdsaW5lLAkJMCwgQ1RSTCgnSicpCX0sCisJeyBYRlVOQ19lbmRfb2ZfdGV4dCwJCTAsIENUUkwoJ18nKQl9LAorCXsgWEZVTkNfYWJvcnQsCQkJMCwgQ1RSTCgnRycpCX0sCisJeyBYRlVOQ19wcmV2X2NvbSwJCTAsIENUUkwoJ1AnKQl9LAorCXsgWEZVTkNfbmV4dF9jb20sCQkwLCBDVFJMKCdOJykJfSwKKwl7IFhGVU5DX25sX25leHRfY29tLAkJMCwgQ1RSTCgnTycpCX0sCisJeyBYRlVOQ19zZWFyY2hfaGlzdCwJCTAsIENUUkwoJ1InKQl9LAorCXsgWEZVTkNfYmVnX2hpc3QsCQkxLAknPCcJfSwKKwl7IFhGVU5DX2VuZF9oaXN0LAkJMSwJJz4nCX0sCisJeyBYRlVOQ19nb3RvX2hpc3QsCQkxLAknZycJfSwKKwl7IFhGVU5DX212X2VuZCwJCQkwLCBDVFJMKCdFJykJfSwKKwl7IFhGVU5DX212X2JlZ2luLAkJMCwgQ1RSTCgnQScpCX0sCisJeyBYRlVOQ19kcmF3X2xpbmUsCQkwLCBDVFJMKCdMJykJfSwKKwl7IFhGVU5DX2NscywJCQkxLCBDVFJMKCdMJykJfSwKKwl7IFhGVU5DX21ldGExLAkJCTAsIENUUkwoJ1snKQl9LAorCXsgWEZVTkNfbWV0YTIsCQkJMCwgQ1RSTCgnWCcpCX0sCisJeyBYRlVOQ19raWxsLAkJCTAsIENUUkwoJ0snKQl9LAorCXsgWEZVTkNfeWFuaywJCQkwLCBDVFJMKCdZJykJfSwKKwl7IFhGVU5DX21ldGFfeWFuaywJCTEsCSd5Jwl9LAorCXsgWEZVTkNfbGl0ZXJhbCwJCTAsIENUUkwoJ14nKQl9LAorCXsgWEZVTkNfY29tbWVudCwJCTEsCScjJwl9LAorCXsgWEZVTkNfdHJhbnNwb3NlLAkJMCwgQ1RSTCgnVCcpCX0sCisJeyBYRlVOQ19jb21wbGV0ZSwJCTEsIENUUkwoJ1snKQl9LAorCXsgWEZVTkNfY29tcF9saXN0LAkJMCwgQ1RSTCgnSScpCX0sCisJeyBYRlVOQ19jb21wX2xpc3QsCQkxLAknPScJfSwKKwl7IFhGVU5DX2VudW1lcmF0ZSwJCTEsCSc/Jwl9LAorCXsgWEZVTkNfZXhwYW5kLAkJCTEsCScqJwl9LAorCXsgWEZVTkNfY29tcF9maWxlLAkJMSwgQ1RSTCgnWCcpCX0sCisJeyBYRlVOQ19jb21wX2NvbW0sCQkyLCBDVFJMKCdbJykJfSwKKwl7IFhGVU5DX2xpc3RfY29tbSwJCTIsCSc/Jwl9LAorCXsgWEZVTkNfbGlzdF9maWxlLAkJMiwgQ1RSTCgnWScpCX0sCisJeyBYRlVOQ19zZXRfbWFyaywJCTEsCScgJwl9LAorCXsgWEZVTkNfa2lsbF9yZWdpb24sCQkwLCBDVFJMKCdXJykJfSwKKwl7IFhGVU5DX3hjaGdfcG9pbnRfbWFyaywJMiwgQ1RSTCgnWCcpCX0sCisJeyBYRlVOQ19saXRlcmFsLAkJMCwgQ1RSTCgnVicpCX0sCisJeyBYRlVOQ192ZXJzaW9uLAkJMSwgQ1RSTCgnVicpCX0sCisJeyBYRlVOQ19wcmV2X2hpc3R3b3JkLAkJMSwJJy4nCX0sCisJeyBYRlVOQ19wcmV2X2hpc3R3b3JkLAkJMSwJJ18nCX0sCisJeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzAnCX0sCisJeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzEnCX0sCisJeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzInCX0sCisJeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzMnCX0sCisJeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzQnCX0sCisJeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzUnCX0sCisJeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzYnCX0sCisJeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzcnCX0sCisJeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzgnCX0sCisJeyBYRlVOQ19zZXRfYXJnLAkJMSwJJzknCX0sCisjaWZuZGVmIE1LU0hfU01BTEwKKwl7IFhGVU5DX2ZvbGRfdXBwZXIsCQkxLAknVScJfSwKKwl7IFhGVU5DX2ZvbGRfdXBwZXIsCQkxLAkndScJfSwKKwl7IFhGVU5DX2ZvbGRfbG93ZXIsCQkxLAknTCcJfSwKKwl7IFhGVU5DX2ZvbGRfbG93ZXIsCQkxLAknbCcJfSwKKwl7IFhGVU5DX2ZvbGRfY2FwaXRhbGlzZSwJMSwJJ0MnCX0sCisJeyBYRlVOQ19mb2xkX2NhcGl0YWxpc2UsCTEsCSdjJwl9LAorI2VuZGlmCisJLyogVGhlc2UgZm9yIGFuc2kgYXJyb3cga2V5czogYXJndWFibGVseSBzaG91bGRuJ3QgYmUgaGVyZSBieQorCSAqIGRlZmF1bHQsIGJ1dCBpdHMgc2ltcGxlci9mYXN0ZXIvc21hbGxlciB0aGFuIHVzaW5nIHRlcm1jYXAKKwkgKiBlbnRyaWVzLgorCSAqLworCXsgWEZVTkNfbWV0YTIsCQkJMSwJJ1snCX0sCisJeyBYRlVOQ19tZXRhMiwJCQkxLAknTycJfSwKKwl7IFhGVU5DX3ByZXZfY29tLAkJMiwJJ0EnCX0sCisJeyBYRlVOQ19uZXh0X2NvbSwJCTIsCSdCJwl9LAorCXsgWEZVTkNfbXZfZm9ydywJCTIsCSdDJwl9LAorCXsgWEZVTkNfbXZfYmFjaywJCTIsCSdEJwl9LAorI2lmbmRlZiBNS1NIX1NNQUxMCisJeyBYRlVOQ192dF9oYWNrLAkJMiwJJzEnCX0sCisJeyBYRlVOQ19tdl9iZWdpbiB8IDB4ODAsCTIsCSc3Jwl9LAorCXsgWEZVTkNfbXZfYmVnaW4sCQkyLAknSCcJfSwKKwl7IFhGVU5DX212X2VuZCB8IDB4ODAsCQkyLAknNCcJfSwKKwl7IFhGVU5DX212X2VuZCB8IDB4ODAsCQkyLAknOCcJfSwKKwl7IFhGVU5DX212X2VuZCwJCQkyLAknRicJfSwKKwl7IFhGVU5DX2RlbF9jaGFyIHwgMHg4MCwJMiwJJzMnCX0sCisJeyBYRlVOQ19zZWFyY2hfaGlzdF91cCB8IDB4ODAsCTIsCSc1Jwl9LAorCXsgWEZVTkNfc2VhcmNoX2hpc3RfZG4gfCAweDgwLAkyLAknNicJfSwKKwkvKiBtb3JlIG5vbi1zdGFuZGFyZCBvbmVzICovCisJeyBYRlVOQ19lZGl0X2xpbmUsCQkyLAknZScJfQorI2VuZGlmCit9OworCisjaWZkZWYgTUtTSF9TTUFMTAorc3RhdGljIHZvaWQgeF9tb2RpZmllZCh2b2lkKTsKK3N0YXRpYyB2b2lkCit4X21vZGlmaWVkKHZvaWQpCit7CisJaWYgKCFtb2RpZmllZCkgeworCQl4X2hpc3RwID0gaGlzdHB0ciArIDE7CisJCW1vZGlmaWVkID0gMTsKKwl9Cit9CisjZGVmaW5lIFhGVU5DX1ZBTFVFKGYpIChmKQorI2Vsc2UKKyNkZWZpbmUgeF9tb2RpZmllZCgpIGRvIHsJCQlcCisJaWYgKCFtb2RpZmllZCkgewkJCVwKKwkJeF9oaXN0cCA9IGhpc3RwdHIgKyAxOwkJXAorCQltb2RpZmllZCA9IDE7CQkJXAorCX0JCQkJCVwKK30gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorI2RlZmluZSBYRlVOQ19WQUxVRShmKSAoZiAmIDB4N0YpCisjZW5kaWYKKworc3RhdGljIGludAoreF9lX2dldG1iYyhjaGFyICpzYnVmKQoreworCWludCBjLCBwb3MgPSAwOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopc2J1ZjsKKworCW1lbXNldChidWYsIDAsIDQpOworCWJ1Zltwb3MrK10gPSBjID0geF9lX2dldGMoKTsKKwlpZiAoYyA9PSAtMSkKKwkJcmV0dXJuICgtMSk7CisJaWYgKFVURk1PREUpIHsKKwkJaWYgKChidWZbMF0gPj0gMHhDMikgJiYgKGJ1ZlswXSA8IDB4RjApKSB7CisJCQljID0geF9lX2dldGMoKTsKKwkJCWlmIChjID09IC0xKQorCQkJCXJldHVybiAoLTEpOworCQkJaWYgKChjICYgMHhDMCkgIT0gMHg4MCkgeworCQkJCXhfZV91bmdldGMoYyk7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJCWJ1Zltwb3MrK10gPSBjOworCQl9CisJCWlmICgoYnVmWzBdID49IDB4RTApICYmIChidWZbMF0gPCAweEYwKSkgeworCQkJLyogWFhYIHhfZV91bmdldGMgaXMgb25lLW9jdGV0IG9ubHkgKi8KKwkJCWJ1Zltwb3MrK10gPSBjID0geF9lX2dldGMoKTsKKwkJCWlmIChjID09IC0xKQorCQkJCXJldHVybiAoLTEpOworCQl9CisJfQorCXJldHVybiAocG9zKTsKK30KKworc3RhdGljIHZvaWQKK3hfaW5pdF9wcm9tcHQodm9pZCkKK3sKKwl4X2NvbCA9IHByb21wdGxlbihwcm9tcHQpOworCXhfYWRqX29rID0gMTsKKwlwcm9tcHRfcmVkcmF3ID0gMTsKKwlpZiAoeF9jb2wgPj0geHhfY29scykKKwkJeF9jb2wgJT0geHhfY29sczsKKwl4X2Rpc3BsZW4gPSB4eF9jb2xzIC0gMiAtIHhfY29sOworCXhfYWRqX2RvbmUgPSAwOworCisJcHByb21wdChwcm9tcHQsIDApOworCWlmICh4X2Rpc3BsZW4gPCAxKSB7CisJCXhfY29sID0gMDsKKwkJeF9kaXNwbGVuID0geHhfY29scyAtIDI7CisJCXhfZV9wdXRjMignXG4nKTsKKwkJcHJvbXB0X3JlZHJhdyA9IDA7CisJfQorfQorCitzdGF0aWMgaW50Cit4X2VtYWNzKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpbnQgYywgaTsKKwl1bnNpZ25lZCBjaGFyIGY7CisKKwl4YnAgPSB4YnVmID0gYnVmOyB4ZW5kID0gYnVmICsgbGVuOworCXhscCA9IHhjcCA9IHhlcCA9IGJ1ZjsKKwkqeGNwID0gMDsKKwl4bHBfdmFsaWQgPSB0cnVlOworCXhtcCA9IE5VTEw7CisJeF9jdXJwcmVmaXggPSAwOworCXhfaGlzdHAgPSBoaXN0cHRyICsgMTsKKwl4X2xhc3RfY29tbWFuZCA9IFhGVU5DX2Vycm9yOworCisJeHhfY29scyA9IHhfY29sczsKKwl4X2luaXRfcHJvbXB0KCk7CisKKwlpZiAoeF9uZXh0Y21kID49IDApIHsKKwkJaW50IG9mZiA9IHNvdXJjZS0+bGluZSAtIHhfbmV4dGNtZDsKKwkJaWYgKGhpc3RwdHIgLSBoaXN0b3J5ID49IG9mZikKKwkJCXhfbG9hZF9oaXN0KGhpc3RwdHIgLSBvZmYpOworCQl4X25leHRjbWQgPSAtMTsKKwl9CisJZWRpdG1vZGUgPSAxOworCXdoaWxlICgxKSB7CisJCXhfZmx1c2goKTsKKwkJaWYgKChjID0geF9lX2dldGMoKSkgPCAwKQorCQkJcmV0dXJuICgwKTsKKworCQlmID0geF9jdXJwcmVmaXggPT0gLTEgPyBYRlVOQ19pbnNlcnQgOgorCQkgICAgeF90YWJbeF9jdXJwcmVmaXhdW2NdOworI2lmbmRlZiBNS1NIX1NNQUxMCisJCWlmIChmICYgMHg4MCkgeworCQkJZiAmPSAweDdGOworCQkJaWYgKChpID0geF9lX2dldGMoKSkgIT0gJ34nKQorCQkJCXhfZV91bmdldGMoaSk7CisJCX0KKworCQkvKiBhdm9pZCBiaW5kIGtleSBtYWNybyByZWN1cnNpb24gKi8KKwkJaWYgKG1hY3JvcHRyICYmIGYgPT0gWEZVTkNfaW5zX3N0cmluZykKKwkJCWYgPSBYRlVOQ19pbnNlcnQ7CisjZW5kaWYKKworCQlpZiAoISh4X2Z0YWJbZl0ueGZfZmxhZ3MgJiBYRl9QUkVGSVgpICYmCisJCSAgICB4X2xhc3RfY29tbWFuZCAhPSBYRlVOQ19zZXRfYXJnKSB7CisJCQl4X2FyZyA9IDE7CisJCQl4X2FyZ19kZWZhdWx0ZWQgPSAxOworCQl9CisJCWkgPSBjIHwgKHhfY3VycHJlZml4IDw8IDgpOworCQl4X2N1cnByZWZpeCA9IDA7CisJCXN3aXRjaCAoKCp4X2Z0YWJbZl0ueGZfZnVuYykoaSkpIHsKKwkJY2FzZSBLU1REOgorCQkJaWYgKCEoeF9mdGFiW2ZdLnhmX2ZsYWdzICYgWEZfUFJFRklYKSkKKwkJCQl4X2xhc3RfY29tbWFuZCA9IGY7CisJCQlicmVhazsKKwkJY2FzZSBLRU9MOgorCQkJaSA9IHhlcCAtIHhidWY7CisJCQlyZXR1cm4gKGkpOworCQljYXNlIEtJTlRSOgkvKiBzcGVjaWFsIGNhc2UgZm9yIGludGVycnVwdCAqLworCQkJdHJhcHNpZyhTSUdJTlQpOworCQkJeF9tb2RlKGZhbHNlKTsKKwkJCXVud2luZChMU0hFTEwpOworCQl9CisJCS8qIGFkLWhvYyBoYWNrIGZvciBmaXhpbmcgdGhlIGN1cnNvciBwb3NpdGlvbiAqLworCQl4X2dvdG8oeGNwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3hfaW5zZXJ0KGludCBjKQoreworCXN0YXRpYyBpbnQgbGVmdCA9IDAsIHBvcywgc2F2ZV9hcmc7CisJc3RhdGljIGNoYXIgc3RyWzRdOworCisJLyoKKwkgKiBTaG91bGQgYWxsb3cgdGFiIGFuZCBjb250cm9sIGNoYXJzLgorCSAqLworCWlmIChjID09IDApIHsKKyBpbnZtYnM6CisJCWxlZnQgPSAwOworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoS1NURCk7CisJfQorCWlmIChVVEZNT0RFKSB7CisJCWlmICgoKGMgJiAweEMwKSA9PSAweDgwKSAmJiBsZWZ0KSB7CisJCQlzdHJbcG9zKytdID0gYzsKKwkJCWlmICghLS1sZWZ0KSB7CisJCQkJc3RyW3Bvc10gPSAnXDAnOworCQkJCXhfYXJnID0gc2F2ZV9hcmc7CisJCQkJd2hpbGUgKHhfYXJnLS0pCisJCQkJCXhfaW5zKHN0cik7CisJCQl9CisJCQlyZXR1cm4gKEtTVEQpOworCQl9CisJCWlmIChsZWZ0KSB7CisJCQlpZiAoeF9jdXJwcmVmaXggPT0gLTEpIHsKKwkJCQkvKiBmbHVzaCBpbnZhbGlkIG11bHRpYnl0ZSAqLworCQkJCXN0cltwb3NdID0gJ1wwJzsKKwkJCQl3aGlsZSAoc2F2ZV9hcmctLSkKKwkJCQkJeF9pbnMoc3RyKTsKKwkJCX0KKwkJfQorCQlpZiAoKGMgPj0gMHhDMikgJiYgKGMgPCAweEUwKSkKKwkJCWxlZnQgPSAxOworCQllbHNlIGlmICgoYyA+PSAweEUwKSAmJiAoYyA8IDB4RjApKQorCQkJbGVmdCA9IDI7CisJCWVsc2UgaWYgKGMgPiAweDdGKQorCQkJZ290byBpbnZtYnM7CisJCWVsc2UKKwkJCWxlZnQgPSAwOworCQlpZiAobGVmdCkgeworCQkJc2F2ZV9hcmcgPSB4X2FyZzsKKwkJCXBvcyA9IDE7CisJCQlzdHJbMF0gPSBjOworCQkJcmV0dXJuIChLU1REKTsKKwkJfQorCX0KKwlsZWZ0ID0gMDsKKwlzdHJbMF0gPSBjOworCXN0clsxXSA9ICdcMCc7CisJd2hpbGUgKHhfYXJnLS0pCisJCXhfaW5zKHN0cik7CisJcmV0dXJuIChLU1REKTsKK30KKworI2lmbmRlZiBNS1NIX1NNQUxMCitzdGF0aWMgaW50Cit4X2luc19zdHJpbmcoaW50IGMpCit7CisJbWFjcm9wdHIgPSB4X2F0YWJbYyA+PiA4XVtjICYgMjU1XTsKKwkvKgorCSAqIHdlIG5vIGxvbmdlciBuZWVkIHRvIGJvdGhlciBjaGVja2luZyBpZiBtYWNyb3B0ciBpcworCSAqIG5vdCBOVUxMIGJ1dCBmaXJzdCBjaGFyIGlzIE5VTDsgeF9lX2dldGMoKSBkb2VzIGl0CisJICovCisJcmV0dXJuIChLU1REKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50Cit4X2RvX2lucyhjb25zdCBjaGFyICpjcCwgc2l6ZV90IGxlbikKK3sKKwlpZiAoeGVwICsgbGVuID49IHhlbmQpIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJbWVtbW92ZSh4Y3AgKyBsZW4sIHhjcCwgeGVwIC0geGNwICsgMSk7CisJbWVtbW92ZSh4Y3AsIGNwLCBsZW4pOworCXhjcCArPSBsZW47CisJeGVwICs9IGxlbjsKKwl4X21vZGlmaWVkKCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAoreF9pbnMoY29uc3QgY2hhciAqcykKK3sKKwljaGFyICpjcCA9IHhjcDsKKwlpbnQgYWRqID0geF9hZGpfZG9uZTsKKworCWlmICh4X2RvX2lucyhzLCBzdHJsZW4ocykpIDwgMCkKKwkJcmV0dXJuICgtMSk7CisJLyoKKwkgKiB4X3pvdHMoKSBtYXkgcmVzdWx0IGluIGEgY2FsbCB0byB4X2FkanVzdCgpCisJICogd2Ugd2FudCB4Y3AgdG8gcmVmbGVjdCB0aGUgbmV3IHBvc2l0aW9uLgorCSAqLworCXhscF92YWxpZCA9IGZhbHNlOworCXhfbGFzdGNwKCk7CisJeF9hZGpfb2sgPSAoeGNwID49IHhscCk7CisJeF96b3RzKGNwKTsKKwlpZiAoYWRqID09IHhfYWRqX2RvbmUpIHsJLyogaGFzIHhfYWRqdXN0KCkgYmVlbiBjYWxsZWQ/ICovCisJCS8qIG5vICovCisJCWNwID0geGxwOworCQl3aGlsZSAoY3AgPiB4Y3ApCisJCQl4X2JzMygmY3ApOworCX0KKwlpZiAoeGxwID09IHhlcCAtIDEpCisJCXhfcmVkcmF3KHh4X2NvbHMpOworCXhfYWRqX29rID0gMTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50Cit4X2RlbF9iYWNrKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJaW50IGkgPSAwOworCisJaWYgKHhjcCA9PSB4YnVmKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuIChLU1REKTsKKwl9CisJZG8geworCQl4X2dvdG8oeGNwIC0gMSk7CisJfSB3aGlsZSAoKCsraSA8IHhfYXJnKSAmJiAoeGNwICE9IHhidWYpKTsKKwl4X2RlbGV0ZShpLCBmYWxzZSk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9kZWxfY2hhcihpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWNoYXIgKmNwLCAqY3AyOworCWludCBpID0gMDsKKworCWNwID0geGNwOworCXdoaWxlIChpIDwgeF9hcmcpIHsKKwkJdXRmX3B0cmFkangoY3AsIGNwMik7CisJCWlmIChjcDIgPiB4ZXApCisJCQlicmVhazsKKwkJY3AgPSBjcDI7CisJCWkrKzsKKwl9CisKKwlpZiAoIWkpIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKEtTVEQpOworCX0KKwl4X2RlbGV0ZShpLCBmYWxzZSk7CisJcmV0dXJuIChLU1REKTsKK30KKworLyogRGVsZXRlIG5jIGNoYXJzIHRvIHRoZSByaWdodCBvZiB0aGUgY3Vyc29yIChpbmNsdWRpbmcgY3Vyc29yIHBvc2l0aW9uKSAqLworc3RhdGljIHZvaWQKK3hfZGVsZXRlKGludCBuYywgaW50IHB1c2gpCit7CisJaW50IGksIG5iLCBudzsKKwljaGFyICpjcDsKKworCWlmIChuYyA9PSAwKQorCQlyZXR1cm47CisKKwludyA9IDA7CisJY3AgPSB4Y3A7CisJZm9yIChpID0gMDsgaSA8IG5jOyArK2kpIHsKKwkJY2hhciAqY3AyOworCQlpbnQgajsKKworCQlqID0geF9zaXplMihjcCwgJmNwMik7CisJCWlmIChjcDIgPiB4ZXApCisJCQlicmVhazsKKwkJY3AgPSBjcDI7CisJCW53ICs9IGo7CisJfQorCW5iID0gY3AgLSB4Y3A7CisJLyogbmMgPSBpOyAqLworCisJaWYgKHhtcCAhPSBOVUxMICYmIHhtcCA+IHhjcCkgeworCQlpZiAoeGNwICsgbmIgPiB4bXApCisJCQl4bXAgPSB4Y3A7CisJCWVsc2UKKwkJCXhtcCAtPSBuYjsKKwl9CisJLyoKKwkgKiBUaGlzIGxldHMgdXMgeWFuayBhIHdvcmQgd2UgaGF2ZSBkZWxldGVkLgorCSAqLworCWlmIChwdXNoKQorCQl4X3B1c2gobmIpOworCisJeGVwIC09IG5iOworCW1lbW1vdmUoeGNwLCB4Y3AgKyBuYiwgeGVwIC0geGNwICsgMSk7CS8qIENvcGllcyB0aGUgTlVMICovCisJeF9hZGpfb2sgPSAwOwkJCS8qIGRvbid0IHJlZHJhdyAqLworCXhscF92YWxpZCA9IGZhbHNlOworCXhfem90cyh4Y3ApOworCS8qCisJICogaWYgd2UgYXJlIGFscmVhZHkgZmlsbGluZyB0aGUgbGluZSwKKwkgKiB0aGVyZSBpcyBubyBuZWVkIHRvICcgJywnXGInLgorCSAqIEJ1dCBpZiB3ZSBtdXN0LCBtYWtlIHN1cmUgd2UgZG8gdGhlIG1pbmltdW0uCisJICovCisJaWYgKChpID0geHhfY29scyAtIDIgLSB4X2NvbCkgPiAwIHx8IHhlcCAtIHhscCA9PSAwKSB7CisJCW53ID0gaSA9IChudyA8IGkpID8gbncgOiBpOworCQl3aGlsZSAoaS0tKQorCQkJeF9lX3B1dGMyKCcgJyk7CisJCWlmICh4X2NvbCA9PSB4eF9jb2xzIC0gMikgeworCQkJeF9lX3B1dGMyKCh4ZXAgPiB4bHApID8gJz4nIDogKHhicCA+IHhidWYpID8gJzwnIDogJyAnKTsKKwkJCSsrbnc7CisJCX0KKwkJd2hpbGUgKG53LS0pCisJCQl4X2VfcHV0YzIoJ1xiJyk7CisJfQorCS8qeF9nb3RvKHhjcCk7Ki8KKwl4X2Fkal9vayA9IDE7CisJeGxwX3ZhbGlkID0gZmFsc2U7CisJY3AgPSB4X2xhc3RjcCgpOworCXdoaWxlIChjcCA+IHhjcCkKKwkJeF9iczMoJmNwKTsKKworCXhfbW9kaWZpZWQoKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK3hfZGVsX2J3b3JkKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9kZWxldGUoeF9id29yZCgpLCB0cnVlKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X212X2J3b3JkKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9id29yZCgpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbXZfZndvcmQoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2Z3b3JkKDEpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfZGVsX2Z3b3JkKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9kZWxldGUoeF9md29yZCgwKSwgdHJ1ZSk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9id29yZCh2b2lkKQoreworCWludCBuYyA9IDAsIG5iID0gMDsKKwljaGFyICpjcCA9IHhjcDsKKworCWlmIChjcCA9PSB4YnVmKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuICgwKTsKKwl9CisJd2hpbGUgKHhfYXJnLS0pIHsKKwkJd2hpbGUgKGNwICE9IHhidWYgJiYgaXNfbWZzKGNwWy0xXSkpIHsKKwkJCWNwLS07CisJCQluYisrOworCQl9CisJCXdoaWxlIChjcCAhPSB4YnVmICYmICFpc19tZnMoY3BbLTFdKSkgeworCQkJY3AtLTsKKwkJCW5iKys7CisJCX0KKwl9CisJeF9nb3RvKGNwKTsKKwlmb3IgKGNwID0geGNwOyBjcCA8ICh4Y3AgKyBuYik7ICsrbmMpCisJCWNwICs9IHV0Zl9wdHJhZGooY3ApOworCXJldHVybiAobmMpOworfQorCitzdGF0aWMgaW50Cit4X2Z3b3JkKGludCBtb3ZlKQoreworCWludCBuYyA9IDA7CisJY2hhciAqY3AgPSB4Y3AsICpjcDI7CisKKwlpZiAoY3AgPT0geGVwKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuICgwKTsKKwl9CisJd2hpbGUgKHhfYXJnLS0pIHsKKwkJd2hpbGUgKGNwICE9IHhlcCAmJiBpc19tZnMoKmNwKSkKKwkJCWNwKys7CisJCXdoaWxlIChjcCAhPSB4ZXAgJiYgIWlzX21mcygqY3ApKQorCQkJY3ArKzsKKwl9CisJZm9yIChjcDIgPSB4Y3A7IGNwMiA8IGNwOyArK25jKQorCQljcDIgKz0gdXRmX3B0cmFkaihjcDIpOworCWlmIChtb3ZlKQorCQl4X2dvdG8oY3ApOworCXJldHVybiAobmMpOworfQorCitzdGF0aWMgdm9pZAoreF9nb3RvKGNoYXIgKmNwKQoreworCWlmIChVVEZNT0RFKQorCQl3aGlsZSAoKGNwID4geGJ1ZikgJiYgKCgqY3AgJiAweEMwKSA9PSAweDgwKSkKKwkJCS0tY3A7CisJaWYgKGNwIDwgeGJwIHx8IGNwID49IHV0Zl9za2lwY29scyh4YnAsIHhfZGlzcGxlbikpIHsKKwkJLyogd2UgYXJlIGhlYWRpbmcgb2ZmIHNjcmVlbiAqLworCQl4Y3AgPSBjcDsKKwkJeF9hZGp1c3QoKTsKKwl9IGVsc2UgaWYgKGNwIDwgeGNwKSB7CQkvKiBtb3ZlIGJhY2sgKi8KKwkJd2hpbGUgKGNwIDwgeGNwKQorCQkJeF9iczMoJnhjcCk7CisJfSBlbHNlIGlmIChjcCA+IHhjcCkgewkJLyogbW92ZSBmb3J3YXJkICovCisJCXdoaWxlIChjcCA+IHhjcCkKKwkJCXhfem90YzMoJnhjcCk7CisJfQorfQorCitzdGF0aWMgdm9pZAoreF9iczMoY2hhciAqKnApCit7CisJaW50IGk7CisKKwkoKnApLS07CisJaWYgKFVURk1PREUpCisJCXdoaWxlICgoKHVuc2lnbmVkIGNoYXIpKipwICYgMHhDMCkgPT0gMHg4MCkKKwkJCSgqcCktLTsKKworCWkgPSB4X3NpemUyKCpwLCBOVUxMKTsKKwl3aGlsZSAoaS0tKQorCQl4X2VfcHV0YzIoJ1xiJyk7Cit9CisKK3N0YXRpYyBpbnQKK3hfc2l6ZV9zdHIoY2hhciAqY3ApCit7CisJaW50IHNpemUgPSAwOworCXdoaWxlICgqY3ApCisJCXNpemUgKz0geF9zaXplMihjcCwgJmNwKTsKKwlyZXR1cm4gKHNpemUpOworfQorCitzdGF0aWMgaW50Cit4X3NpemUyKGNoYXIgKmNwLCBjaGFyICoqZGNwKQoreworCWludCBjID0gKih1bnNpZ25lZCBjaGFyICopY3A7CisKKwlpZiAoVVRGTU9ERSAmJiAoYyA+IDB4N0YpKQorCQlyZXR1cm4gKHV0Zl93aWR0aGFkaihjcCwgKGNvbnN0IGNoYXIgKiopZGNwKSk7CisJaWYgKGRjcCkKKwkJKmRjcCA9IGNwICsgMTsKKwlpZiAoYyA9PSAnXHQnKQorCQlyZXR1cm4gKDQpOwkvKiBLbHVkZ2UsIHRhYnMgYXJlIGFsd2F5cyBmb3VyIHNwYWNlcy4gKi8KKwlpZiAoYyA8ICcgJyB8fCBjID09IDB4N2YpCisJCXJldHVybiAoMik7CS8qIGNvbnRyb2wgdW5zaWduZWQgY2hhciAqLworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCit4X3pvdHMoY2hhciAqc3RyKQoreworCWludCBhZGogPSB4X2Fkal9kb25lOworCisJeF9sYXN0Y3AoKTsKKwl3aGlsZSAoKnN0ciAmJiBzdHIgPCB4bHAgJiYgYWRqID09IHhfYWRqX2RvbmUpCisJCXhfem90YzMoJnN0cik7Cit9CisKK3N0YXRpYyB2b2lkCit4X3pvdGMyKGludCBjKQoreworCWlmIChjID09ICdcdCcpIHsKKwkJLyogS2x1ZGdlLCB0YWJzIGFyZSBhbHdheXMgZm91ciBzcGFjZXMuICovCisJCXhfZV9wdXRzKCIgICAgIik7CisJfSBlbHNlIGlmIChjIDwgJyAnIHx8IGMgPT0gMHg3ZikgeworCQl4X2VfcHV0YzIoJ14nKTsKKwkJeF9lX3B1dGMyKFVOQ1RSTChjKSk7CisJfSBlbHNlCisJCXhfZV9wdXRjMihjKTsKK30KKworc3RhdGljIHZvaWQKK3hfem90YzMoY2hhciAqKmNwKQoreworCXVuc2lnbmVkIGNoYXIgYyA9ICoqKHVuc2lnbmVkIGNoYXIgKiopY3A7CisKKwlpZiAoYyA9PSAnXHQnKSB7CisJCS8qIEtsdWRnZSwgdGFicyBhcmUgYWx3YXlzIGZvdXIgc3BhY2VzLiAqLworCQl4X2VfcHV0cygiICAgICIpOworCQkoKmNwKSsrOworCX0gZWxzZSBpZiAoYyA8ICcgJyB8fCBjID09IDB4N2YpIHsKKwkJeF9lX3B1dGMyKCdeJyk7CisJCXhfZV9wdXRjMihVTkNUUkwoYykpOworCQkoKmNwKSsrOworCX0gZWxzZQorCQl4X2VfcHV0YzMoKGNvbnN0IGNoYXIgKiopY3ApOworfQorCitzdGF0aWMgaW50Cit4X212X2JhY2soaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlpZiAoeGNwID09IHhidWYpIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKEtTVEQpOworCX0KKwl3aGlsZSAoeF9hcmctLSkgeworCQl4X2dvdG8oeGNwIC0gMSk7CisJCWlmICh4Y3AgPT0geGJ1ZikKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X212X2ZvcncoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwljaGFyICpjcCA9IHhjcCwgKmNwMjsKKworCWlmICh4Y3AgPT0geGVwKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuIChLU1REKTsKKwl9CisJd2hpbGUgKHhfYXJnLS0pIHsKKwkJdXRmX3B0cmFkangoY3AsIGNwMik7CisJCWlmIChjcDIgPiB4ZXApCisJCQlicmVhazsKKwkJY3AgPSBjcDI7CisJfQorCXhfZ290byhjcCk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9zZWFyY2hfY2hhcl9mb3J3KGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJY2hhciAqY3AgPSB4Y3A7CisJY2hhciB0bXBbNF07CisKKwkqeGVwID0gJ1wwJzsKKwlpZiAoeF9lX2dldG1iYyh0bXApIDwgMCkgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoS1NURCk7CisJfQorCXdoaWxlICh4X2FyZy0tKSB7CisJCWlmICgoY3AgPSAoY3AgPT0geGVwKSA/IE5VTEwgOiBzdHJzdHIoY3AgKyAxLCB0bXApKSA9PSBOVUxMICYmCisJCSAgICAoY3AgPSBzdHJzdHIoeGJ1ZiwgdG1wKSkgPT0gTlVMTCkgeworCQkJeF9lX3B1dGMyKDcpOworCQkJcmV0dXJuIChLU1REKTsKKwkJfQorCX0KKwl4X2dvdG8oY3ApOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfc2VhcmNoX2NoYXJfYmFjayhpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWNoYXIgKmNwID0geGNwLCAqcCwgdG1wWzRdOworCWJvb2wgYjsKKworCWlmICh4X2VfZ2V0bWJjKHRtcCkgPCAwKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuIChLU1REKTsKKwl9CisJZm9yICg7IHhfYXJnLS07IGNwID0gcCkKKwkJZm9yIChwID0gY3A7IDsgKSB7CisJCQlpZiAocC0tID09IHhidWYpCisJCQkJcCA9IHhlcDsKKwkJCWlmIChwID09IGNwKSB7CisJCQkJeF9lX3B1dGMyKDcpOworCQkJCXJldHVybiAoS1NURCk7CisJCQl9CisJCQlpZiAoKHRtcFsxXSAmJiAoKHArMSkgPiB4ZXApKSB8fAorCQkJICAgICh0bXBbMl0gJiYgKChwKzIpID4geGVwKSkpCisJCQkJY29udGludWU7CisJCQliID0gdHJ1ZTsKKwkJCWlmICgqcCAhPSB0bXBbMF0pCisJCQkJYiA9IGZhbHNlOworCQkJaWYgKGIgJiYgdG1wWzFdICYmIHBbMV0gIT0gdG1wWzFdKQorCQkJCWIgPSBmYWxzZTsKKwkJCWlmIChiICYmIHRtcFsyXSAmJiBwWzJdICE9IHRtcFsyXSkKKwkJCQliID0gZmFsc2U7CisJCQlpZiAoYikKKwkJCQlicmVhazsKKwkJfQorCXhfZ290byhjcCk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9uZXdsaW5lKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9lX3B1dGMyKCdccicpOworCXhfZV9wdXRjMignXG4nKTsKKwl4X2ZsdXNoKCk7CisJKnhlcCsrID0gJ1xuJzsKKwlyZXR1cm4gKEtFT0wpOworfQorCitzdGF0aWMgaW50Cit4X2VuZF9vZl90ZXh0KGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF96b3RjMihlZGNoYXJzLmVvZik7CisJeF9wdXRjKCdccicpOworCXhfcHV0YygnXG4nKTsKKwl4X2ZsdXNoKCk7CisJcmV0dXJuIChLRU9MKTsKK30KKworc3RhdGljIGludAoreF9iZWdfaGlzdChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfbG9hZF9oaXN0KGhpc3RvcnkpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfZW5kX2hpc3QoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2xvYWRfaGlzdChoaXN0cHRyKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X3ByZXZfY29tKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9sb2FkX2hpc3QoeF9oaXN0cCAtIHhfYXJnKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X25leHRfY29tKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9sb2FkX2hpc3QoeF9oaXN0cCArIHhfYXJnKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCisvKiBHb3RvIGEgcGFydGljdWxhciBoaXN0b3J5IG51bWJlciBvYnRhaW5lZCBmcm9tIGFyZ3VtZW50LgorICogSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4gaGlzdG9yeSAxIGlzIHByb2JhYmx5IG5vdCB3aGF0IHlvdQorICogd2FudCBzbyB3ZSdsbCBzaW1wbHkgZ28gdG8gdGhlIG9sZGVzdCBvbmUuCisgKi8KK3N0YXRpYyBpbnQKK3hfZ290b19oaXN0KGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJaWYgKHhfYXJnX2RlZmF1bHRlZCkKKwkJeF9sb2FkX2hpc3QoaGlzdG9yeSk7CisJZWxzZQorCQl4X2xvYWRfaGlzdChoaXN0cHRyICsgeF9hcmcgLSBzb3VyY2UtPmxpbmUpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyB2b2lkCit4X2xvYWRfaGlzdChjaGFyICoqaHApCit7CisJaW50IG9sZHNpemU7CisJY2hhciAqc3AgPSBOVUxMOworCisJaWYgKGhwID09IGhpc3RwdHIgKyAxKSB7CisJCXNwID0gaG9sZGJ1ZjsKKwkJbW9kaWZpZWQgPSAwOworCX0gZWxzZSBpZiAoaHAgPCBoaXN0b3J5IHx8IGhwID4gaGlzdHB0cikgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybjsKKwl9CisJaWYgKHNwID09IE5VTEwpCisJCXNwID0gKmhwOworCXhfaGlzdHAgPSBocDsKKwlvbGRzaXplID0geF9zaXplX3N0cih4YnVmKTsKKwlpZiAobW9kaWZpZWQpCisJCXN0cmxjcHkoaG9sZGJ1ZiwgeGJ1Ziwgc2l6ZW9mKGhvbGRidWYpKTsKKwlzdHJsY3B5KHhidWYsIHNwLCB4ZW5kIC0geGJ1Zik7CisJeGJwID0geGJ1ZjsKKwl4ZXAgPSB4Y3AgPSB4YnVmICsgc3RybGVuKHhidWYpOworCXhscF92YWxpZCA9IGZhbHNlOworCWlmICh4ZXAgPD0geF9sYXN0Y3AoKSkgeworCQl4X3JlZHJhdyhvbGRzaXplKTsKKwl9CisJeF9nb3RvKHhlcCk7CisJbW9kaWZpZWQgPSAwOworfQorCitzdGF0aWMgaW50Cit4X25sX25leHRfY29tKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9uZXh0Y21kID0gc291cmNlLT5saW5lIC0gKGhpc3RwdHIgLSB4X2hpc3RwKSArIDE7CisJcmV0dXJuICh4X25ld2xpbmUoJ1xuJykpOworfQorCitzdGF0aWMgaW50Cit4X2VvdF9kZWwoaW50IGMpCit7CisJaWYgKHhlcCA9PSB4YnVmICYmIHhfYXJnX2RlZmF1bHRlZCkKKwkJcmV0dXJuICh4X2VuZF9vZl90ZXh0KGMpKTsKKwllbHNlCisJCXJldHVybiAoeF9kZWxfY2hhcihjKSk7Cit9CisKKy8qIHJldmVyc2UgaW5jcmVtZW50YWwgaGlzdG9yeSBzZWFyY2ggKi8KK3N0YXRpYyBpbnQKK3hfc2VhcmNoX2hpc3QoaW50IGMpCit7CisJaW50IG9mZnNldCA9IC0xOwkvKiBvZmZzZXQgb2YgbWF0Y2ggaW4geGJ1ZiwgZWxzZSAtMSAqLworCWNoYXIgcGF0WzI1NiArIDFdOwkvKiBwYXR0ZXJuIGJ1ZmZlciAqLworCWNoYXIgKnAgPSBwYXQ7CisJdW5zaWduZWQgY2hhciBmOworCisJKnAgPSAnXDAnOworCXdoaWxlICgxKSB7CisJCWlmIChvZmZzZXQgPCAwKSB7CisJCQl4X2VfcHV0cygiXG5JLXNlYXJjaDogIik7CisJCQl4X2VfcHV0cyhwYXQpOworCQl9CisJCXhfZmx1c2goKTsKKwkJaWYgKChjID0geF9lX2dldGMoKSkgPCAwKQorCQkJcmV0dXJuIChLU1REKTsKKwkJZiA9IHhfdGFiWzBdW2NdOworCQlpZiAoYyA9PSBDVFJMKCdbJykpIHsKKwkJCWlmICgoZiAmIDB4N0YpID09IFhGVU5DX21ldGExKSB7CisJCQkJaWYgKChjID0geF9lX2dldGMoKSkgPCAwKQorCQkJCQlyZXR1cm4gKEtTVEQpOworCQkJCWYgPSB4X3RhYlsxXVtjXSAmIDB4N0Y7CisJCQkJaWYgKGYgPT0gWEZVTkNfbWV0YTEgfHwgZiA9PSBYRlVOQ19tZXRhMikKKwkJCQkJeF9tZXRhMShDVFJMKCdbJykpOworCQkJCXhfZV91bmdldGMoYyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorI2lmbmRlZiBNS1NIX1NNQUxMCisJCWlmIChmICYgMHg4MCkgeworCQkJZiAmPSAweDdGOworCQkJaWYgKChjID0geF9lX2dldGMoKSkgIT0gJ34nKQorCQkJCXhfZV91bmdldGMoYyk7CisJCX0KKyNlbmRpZgorCQlpZiAoZiA9PSBYRlVOQ19zZWFyY2hfaGlzdCkKKwkJCW9mZnNldCA9IHhfc2VhcmNoKHBhdCwgMCwgb2Zmc2V0KTsKKwkJZWxzZSBpZiAoZiA9PSBYRlVOQ19kZWxfYmFjaykgeworCQkJaWYgKHAgPT0gcGF0KSB7CisJCQkJb2Zmc2V0ID0gLTE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocCA+IHBhdCkKKwkJCQkqLS1wID0gJ1wwJzsKKwkJCWlmIChwID09IHBhdCkKKwkJCQlvZmZzZXQgPSAtMTsKKwkJCWVsc2UKKwkJCQlvZmZzZXQgPSB4X3NlYXJjaChwYXQsIDEsIG9mZnNldCk7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChmID09IFhGVU5DX2luc2VydCkgeworCQkJLyogYWRkIGNoYXIgdG8gcGF0dGVybiAqLworCQkJLyogb3ZlcmZsb3cgY2hlY2suLi4gKi8KKwkJCWlmIChwID49ICZwYXRbc2l6ZW9mKHBhdCkgLSAxXSkgeworCQkJCXhfZV9wdXRjMig3KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCSpwKysgPSBjLCAqcCA9ICdcMCc7CisJCQlpZiAob2Zmc2V0ID49IDApIHsKKwkJCQkvKiBhbHJlYWR5IGhhdmUgcGFydGlhbCBtYXRjaCAqLworCQkJCW9mZnNldCA9IHhfbWF0Y2goeGJ1ZiwgcGF0KTsKKwkJCQlpZiAob2Zmc2V0ID49IDApIHsKKwkJCQkJeF9nb3RvKHhidWYgKyBvZmZzZXQgKyAocCAtIHBhdCkgLQorCQkJCQkgICAgKCpwYXQgPT0gJ14nKSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCW9mZnNldCA9IHhfc2VhcmNoKHBhdCwgMCwgb2Zmc2V0KTsKKwkJfSBlbHNlIGlmIChmID09IFhGVU5DX2Fib3J0KSB7CisJCQlpZiAob2Zmc2V0ID49IDApCisJCQkJeF9sb2FkX2hpc3QoaGlzdHB0ciArIDEpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7IC8qIG90aGVyIGNvbW1hbmQgKi8KKwkJCXhfZV91bmdldGMoYyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAob2Zmc2V0IDwgMCkKKwkJeF9yZWRyYXcoLTEpOworCXJldHVybiAoS1NURCk7Cit9CisKKy8qIHNlYXJjaCBiYWNrd2FyZCBmcm9tIGN1cnJlbnQgbGluZSAqLworc3RhdGljIGludAoreF9zZWFyY2goY2hhciAqcGF0LCBpbnQgc2FtZWxpbmUsIGludCBvZmZzZXQpCit7CisJY2hhciAqKmhwOworCWludCBpOworCisJZm9yIChocCA9IHhfaGlzdHAgLSAoc2FtZWxpbmUgPyAwIDogMSk7IGhwID49IGhpc3Rvcnk7IC0taHApIHsKKwkJaSA9IHhfbWF0Y2goKmhwLCBwYXQpOworCQlpZiAoaSA+PSAwKSB7CisJCQlpZiAob2Zmc2V0IDwgMCkKKwkJCQl4X2VfcHV0YzIoJ1xuJyk7CisJCQl4X2xvYWRfaGlzdChocCk7CisJCQl4X2dvdG8oeGJ1ZiArIGkgKyBzdHJsZW4ocGF0KSAtICgqcGF0ID09ICdeJykpOworCQkJcmV0dXJuIChpKTsKKwkJfQorCX0KKwl4X2VfcHV0YzIoNyk7CisJeF9oaXN0cCA9IGhpc3RwdHI7CisJcmV0dXJuICgtMSk7Cit9CisKKyNpZm5kZWYgTUtTSF9TTUFMTAorLyogYW5jaG9yZWQgc2VhcmNoIHVwIGZyb20gY3VycmVudCBsaW5lICovCitzdGF0aWMgaW50Cit4X3NlYXJjaF9oaXN0X3VwKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJcmV0dXJuICh4X3NlYXJjaF9kaXIoLTEpKTsKK30KKworLyogYW5jaG9yZWQgc2VhcmNoIGRvd24gZnJvbSBjdXJyZW50IGxpbmUgKi8KK3N0YXRpYyBpbnQKK3hfc2VhcmNoX2hpc3RfZG4oaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlyZXR1cm4gKHhfc2VhcmNoX2RpcigxKSk7Cit9CisKKy8qIGFuY2hvcmVkIHNlYXJjaCBpbiB0aGUgaW5kaWNhdGVkIGRpcmVjdGlvbiAqLworc3RhdGljIGludAoreF9zZWFyY2hfZGlyKGludCBzZWFyY2hfZGlyIC8qIHNob3VsZCd2ZSBiZWVuIGJvb2wgKi8pCit7CisJY2hhciAqKmhwID0geF9oaXN0cCArIHNlYXJjaF9kaXI7CisJc2l6ZV90IGN1cnMgPSB4Y3AgLSB4YnVmOworCisJd2hpbGUgKGhpc3RwdHIgPj0gaHAgJiYgaHAgPj0gaGlzdG9yeSkgeworCQlpZiAoc3RybmNtcCh4YnVmLCAqaHAsIGN1cnMpID09IDApIHsKKwkJCXhfbG9hZF9oaXN0KGhwKTsKKwkJCXhfZ290byh4YnVmICsgY3Vycyk7CisJCQlicmVhazsKKwkJfQorCQlocCArPSBzZWFyY2hfZGlyOworCX0KKwlyZXR1cm4gKEtTVEQpOworfQorI2VuZGlmCisKKy8qIHJldHVybiBwb3NpdGlvbiBvZiBmaXJzdCBtYXRjaCBvZiBwYXR0ZXJuIGluIHN0cmluZywgZWxzZSAtMSAqLworc3RhdGljIGludAoreF9tYXRjaChjaGFyICpzdHIsIGNoYXIgKnBhdCkKK3sKKwlpZiAoKnBhdCA9PSAnXicpIHsKKwkJcmV0dXJuICgoc3RybmNtcChzdHIsIHBhdCArIDEsIHN0cmxlbihwYXQgKyAxKSkgPT0gMCkgPyAwIDogLTEpOworCX0gZWxzZSB7CisJCWNoYXIgKnEgPSBzdHJzdHIoc3RyLCBwYXQpOworCQlyZXR1cm4gKChxID09IE5VTEwpID8gLTEgOiBxIC0gc3RyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3hfZGVsX2xpbmUoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlpbnQgaSwgajsKKworCSp4ZXAgPSAwOworCWkgPSB4ZXAgLSB4YnVmOworCWogPSB4X3NpemVfc3RyKHhidWYpOworCXhjcCA9IHhidWY7CisJeF9wdXNoKGkpOworCXhscCA9IHhicCA9IHhlcCA9IHhidWY7CisJeGxwX3ZhbGlkID0gdHJ1ZTsKKwkqeGNwID0gMDsKKwl4bXAgPSBOVUxMOworCXhfcmVkcmF3KGopOworCXhfbW9kaWZpZWQoKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X212X2VuZChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhfZ290byh4ZXApOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbXZfYmVnaW4oaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2dvdG8oeGJ1Zik7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9kcmF3X2xpbmUoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X3JlZHJhdygtMSk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9lX3JlYnVpbGRsaW5lKGNvbnN0IGNoYXIgKmNscnN0cikKK3sKKwlzaGZfcHV0cyhjbHJzdHIsIHNobF9vdXQpOworCXhfYWRqdXN0KCk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9jbHMoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlyZXR1cm4gKHhfZV9yZWJ1aWxkbGluZShNS1NIX0NMU19TVFJJTkcpKTsKK30KKworLyogUmVkcmF3IChwYXJ0IG9mKSB0aGUgbGluZS4gSWYgbGltaXQgaXMgPCAwLCB0aGUgZXZlcnl0aGluZyBpcyByZWRyYXduCisgKiBvbiBhIE5FVyBsaW5lLCBvdGhlcndpc2UgbGltaXQgaXMgdGhlIHNjcmVlbiBjb2x1bW4gdXAgdG8gd2hpY2ggbmVlZHMKKyAqIHJlZHJhd2luZy4KKyAqLworc3RhdGljIHZvaWQKK3hfcmVkcmF3KGludCBsaW1pdCkKK3sKKwlpbnQgaSwgaiwgeF90cnVuYyA9IDA7CisJY2hhciAqY3A7CisKKwl4X2Fkal9vayA9IDA7CisJaWYgKGxpbWl0ID09IC0xKQorCQl4X2VfcHV0YzIoJ1xuJyk7CisJZWxzZQorCQl4X2VfcHV0YzIoJ1xyJyk7CisJeF9mbHVzaCgpOworCWlmICh4YnAgPT0geGJ1ZikgeworCQl4X2NvbCA9IHByb21wdGxlbihwcm9tcHQpOworCQlpZiAoeF9jb2wgPj0geHhfY29scykKKwkJCXhfdHJ1bmMgPSAoeF9jb2wgLyB4eF9jb2xzKSAqIHh4X2NvbHM7CisJCWlmIChwcm9tcHRfcmVkcmF3KQorCQkJcHByb21wdChwcm9tcHQsIHhfdHJ1bmMpOworCX0KKwlpZiAoeF9jb2wgPj0geHhfY29scykKKwkJeF9jb2wgJT0geHhfY29sczsKKwl4X2Rpc3BsZW4gPSB4eF9jb2xzIC0gMiAtIHhfY29sOworCWlmICh4X2Rpc3BsZW4gPCAxKSB7CisJCXhfY29sID0gMDsKKwkJeF9kaXNwbGVuID0geHhfY29scyAtIDI7CisJfQorCXhscF92YWxpZCA9IGZhbHNlOworCXhfbGFzdGNwKCk7CisJeF96b3RzKHhicCk7CisJaWYgKHhicCAhPSB4YnVmIHx8IHhlcCA+IHhscCkKKwkJbGltaXQgPSB4eF9jb2xzOworCWlmIChsaW1pdCA+PSAwKSB7CisJCWlmICh4ZXAgPiB4bHApCisJCQlpID0gMDsJCQkvKiB3ZSBmaWxsIHRoZSBsaW5lICovCisJCWVsc2UgeworCQkJY2hhciAqY3BsID0geGJwOworCisJCQlpID0gbGltaXQ7CisJCQl3aGlsZSAoY3BsIDwgeGxwKQorCQkJCWkgLT0geF9zaXplMihjcGwsICZjcGwpOworCQl9CisKKwkJaiA9IDA7CisJCXdoaWxlICgoaiA8IGkpIHx8ICh4X2NvbCA8ICh4eF9jb2xzIC0gMikpKSB7CisJCQlpZiAoISh4X2NvbCA8ICh4eF9jb2xzIC0gMikpKQorCQkJCWJyZWFrOworCQkJeF9lX3B1dGMyKCcgJyk7CisJCQlqKys7CisJCX0KKwkJaSA9ICcgJzsKKwkJaWYgKHhlcCA+IHhscCkgewkJLyogbW9yZSBvZmYgc2NyZWVuICovCisJCQlpZiAoeGJwID4geGJ1ZikKKwkJCQlpID0gJyonOworCQkJZWxzZQorCQkJCWkgPSAnPic7CisJCX0gZWxzZSBpZiAoeGJwID4geGJ1ZikKKwkJCWkgPSAnPCc7CisJCXhfZV9wdXRjMihpKTsKKwkJaisrOworCQl3aGlsZSAoai0tKQorCQkJeF9lX3B1dGMyKCdcYicpOworCX0KKwljcCA9IHhscDsKKwl3aGlsZSAoY3AgPiB4Y3ApCisJCXhfYnMzKCZjcCk7CisJeF9hZGpfb2sgPSAxOworCXJldHVybjsKK30KKworc3RhdGljIGludAoreF90cmFuc3Bvc2UoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wYSwgdG1wYjsKKworCS8qIFdoYXQgdHJhbnNwb3NlIGlzIG1lYW50IHRvIGRvIHNlZW1zIHRvIGJlIHVwIGZvciBkZWJhdGUuIFRoaXMKKwkgKiBpcyBhIGdlbmVyYWwgc3VtbWFyeSBvZiB0aGUgb3B0aW9uczsgdGhlIHRleHQgaXMgYWJjZCB3aXRoIHRoZQorCSAqIHVwcGVyIGNhc2UgY2hhcmFjdGVyIG9yIHVuZGVyc2NvcmUgaW5kaWNhdGluZyB0aGUgY3Vyc29yIHBvc2l0aW9uOgorCSAqCVdobwkJCUJlZm9yZQlBZnRlcglCZWZvcmUJQWZ0ZXIKKwkgKglBVCZUIGtzaCBpbiBlbWFjcyBtb2RlOglhYkNkCWFiZEMJYWJjZF8JKGJlbGwpCisJICoJQVQmVCBrc2ggaW4gZ21hY3MgbW9kZToJYWJDZAliYUNkCWFiY2RfCWFiZGNfCisJICoJZ251IGVtYWNzOgkJYWJDZAlhY2JECWFiY2RfCWFiZGNfCisJICogUGRrc2ggY3VycmVudGx5IGdvZXMgd2l0aCBHTlUgYmVoYXZpb3Igc2luY2UgSSBiZWxpZXZlIHRoaXMgaXMgdGhlCisJICogbW9zdCBjb21tb24gdmVyc2lvbiBvZiBlbWFjcywgdW5sZXNzIGluIGdtYWNzIG1vZGUsIGluIHdoaWNoIGNhc2UKKwkgKiBpdCBkb2VzIHRoZSBBVCZUIGtzaCBnbWFjcyBtb2RlLgorCSAqIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBicm9rZW4gdXAgaW50byAzIGZ1bmN0aW9ucyBzbyB1c2VycyBjYW4gYmluZAorCSAqIHRvIHRoZSBvbmUgdGhleSB3YW50LgorCSAqLworCWlmICh4Y3AgPT0geGJ1ZikgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoS1NURCk7CisJfSBlbHNlIGlmICh4Y3AgPT0geGVwIHx8IEZsYWcoRkdNQUNTKSkgeworCQlpZiAoeGNwIC0geGJ1ZiA9PSAxKSB7CisJCQl4X2VfcHV0YzIoNyk7CisJCQlyZXR1cm4gKEtTVEQpOworCQl9CisJCS8qIEdvc2xpbmcvVW5pcHJlc3MgZW1hY3Mgc3R5bGU6IFN3YXAgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIHRoZQorCQkgKiBjdXJzb3IsIGRvIG5vdCBjaGFuZ2UgY3Vyc29yIHBvc2l0aW9uCisJCSAqLworCQl4X2JzMygmeGNwKTsKKwkJaWYgKHV0Zl9tYnRvd2MoJnRtcGEsIHhjcCkgPT0gKHNpemVfdCktMSkgeworCQkJeF9lX3B1dGMyKDcpOworCQkJcmV0dXJuIChLU1REKTsKKwkJfQorCQl4X2JzMygmeGNwKTsKKwkJaWYgKHV0Zl9tYnRvd2MoJnRtcGIsIHhjcCkgPT0gKHNpemVfdCktMSkgeworCQkJeF9lX3B1dGMyKDcpOworCQkJcmV0dXJuIChLU1REKTsKKwkJfQorCQl1dGZfd2N0b21iKHhjcCwgdG1wYSk7CisJCXhfem90YzMoJnhjcCk7CisJCXV0Zl93Y3RvbWIoeGNwLCB0bXBiKTsKKwkJeF96b3RjMygmeGNwKTsKKwl9IGVsc2UgeworCQkvKiBHTlUgZW1hY3Mgc3R5bGU6IFN3YXAgdGhlIGNoYXJhY3RlcnMgYmVmb3JlIGFuZCB1bmRlciB0aGUKKwkJICogY3Vyc29yLCBtb3ZlIGN1cnNvciBwb3NpdGlvbiBhbG9uZyBvbmUuCisJCSAqLworCQlpZiAodXRmX21idG93YygmdG1wYSwgeGNwKSA9PSAoc2l6ZV90KS0xKSB7CisJCQl4X2VfcHV0YzIoNyk7CisJCQlyZXR1cm4gKEtTVEQpOworCQl9CisJCXhfYnMzKCZ4Y3ApOworCQlpZiAodXRmX21idG93YygmdG1wYiwgeGNwKSA9PSAoc2l6ZV90KS0xKSB7CisJCQl4X2VfcHV0YzIoNyk7CisJCQlyZXR1cm4gKEtTVEQpOworCQl9CisJCXV0Zl93Y3RvbWIoeGNwLCB0bXBhKTsKKwkJeF96b3RjMygmeGNwKTsKKwkJdXRmX3djdG9tYih4Y3AsIHRtcGIpOworCQl4X3pvdGMzKCZ4Y3ApOworCX0KKwl4X21vZGlmaWVkKCk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9saXRlcmFsKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9jdXJwcmVmaXggPSAtMTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X21ldGExKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9jdXJwcmVmaXggPSAxOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbWV0YTIoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwl4X2N1cnByZWZpeCA9IDI7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9raWxsKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJaW50IGNvbCA9IHhjcCAtIHhidWY7CisJaW50IGxhc3Rjb2wgPSB4ZXAgLSB4YnVmOworCWludCBuZGVsOworCisJaWYgKHhfYXJnX2RlZmF1bHRlZCkKKwkJeF9hcmcgPSBsYXN0Y29sOworCWVsc2UgaWYgKHhfYXJnID4gbGFzdGNvbCkKKwkJeF9hcmcgPSBsYXN0Y29sOworCW5kZWwgPSB4X2FyZyAtIGNvbDsKKwlpZiAobmRlbCA8IDApIHsKKwkJeF9nb3RvKHhidWYgKyB4X2FyZyk7CisJCW5kZWwgPSAtbmRlbDsKKwl9CisJeF9kZWxldGUobmRlbCwgdHJ1ZSk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIHZvaWQKK3hfcHVzaChpbnQgbmNoYXJzKQoreworCWNoYXIgKmNwOworCisJc3RybmR1cHgoY3AsIHhjcCwgbmNoYXJzLCBBRURJVCk7CisJaWYgKGtpbGxzdGFja1traWxsc3BdKQorCQlhZnJlZShraWxsc3RhY2tba2lsbHNwXSwgQUVESVQpOworCWtpbGxzdGFja1traWxsc3BdID0gY3A7CisJa2lsbHNwID0gKGtpbGxzcCArIDEpICUgS0lMTFNJWkU7Cit9CisKK3N0YXRpYyBpbnQKK3hfeWFuayhpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWlmIChraWxsc3AgPT0gMCkKKwkJa2lsbHRwID0gS0lMTFNJWkU7CisJZWxzZQorCQlraWxsdHAgPSBraWxsc3A7CisJa2lsbHRwLS07CisJaWYgKGtpbGxzdGFja1traWxsdHBdID09IDApIHsKKwkJeF9lX3B1dHMoIlxubm90aGluZyB0byB5YW5rIik7CisJCXhfcmVkcmF3KC0xKTsKKwkJcmV0dXJuIChLU1REKTsKKwl9CisJeG1wID0geGNwOworCXhfaW5zKGtpbGxzdGFja1traWxsdHBdKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X21ldGFfeWFuayhpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWludCBsZW47CisKKwlpZiAoKHhfbGFzdF9jb21tYW5kICE9IFhGVU5DX3lhbmsgJiYgeF9sYXN0X2NvbW1hbmQgIT0gWEZVTkNfbWV0YV95YW5rKSB8fAorCSAgICBraWxsc3RhY2tba2lsbHRwXSA9PSAwKSB7CisJCWtpbGx0cCA9IGtpbGxzcDsKKwkJeF9lX3B1dHMoIlxueWFuayBzb21ldGhpbmcgZmlyc3QiKTsKKwkJeF9yZWRyYXcoLTEpOworCQlyZXR1cm4gKEtTVEQpOworCX0KKwlsZW4gPSBzdHJsZW4oa2lsbHN0YWNrW2tpbGx0cF0pOworCXhfZ290byh4Y3AgLSBsZW4pOworCXhfZGVsZXRlKGxlbiwgZmFsc2UpOworCWRvIHsKKwkJaWYgKGtpbGx0cCA9PSAwKQorCQkJa2lsbHRwID0gS0lMTFNJWkUgLSAxOworCQllbHNlCisJCQlraWxsdHAtLTsKKwl9IHdoaWxlIChraWxsc3RhY2tba2lsbHRwXSA9PSAwKTsKKwl4X2lucyhraWxsc3RhY2tba2lsbHRwXSk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9hYm9ydChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCS8qIHhfem90YyhjKTsgKi8KKwl4bHAgPSB4ZXAgPSB4Y3AgPSB4YnAgPSB4YnVmOworCXhscF92YWxpZCA9IHRydWU7CisJKnhjcCA9IDA7CisJeF9tb2RpZmllZCgpOworCXJldHVybiAoS0lOVFIpOworfQorCitzdGF0aWMgaW50Cit4X2Vycm9yKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJeF9lX3B1dGMyKDcpOworCXJldHVybiAoS1NURCk7Cit9CisKKyNpZm5kZWYgTUtTSF9TTUFMTAorLyogc3BlY2lhbCBWVDEwMCBzdHlsZSBrZXkgc2VxdWVuY2UgaGFjayAqLworc3RhdGljIGludAoreF92dF9oYWNrKGludCBjKQoreworCS8qIHdlIG9ubHkgc3VwcG9ydCBQRjItJzEnIGZvciBub3cgKi8KKwlpZiAoYyAhPSAoMiA8PCA4IHwgJzEnKSkKKwkJcmV0dXJuICh4X2Vycm9yKGMpKTsKKworCS8qIHdoYXQncyB0aGUgbmV4dCBjaGFyYWN0ZXI/ICovCisJc3dpdGNoICgoYyA9IHhfZV9nZXRjKCkpKSB7CisJY2FzZSAnfic6CisJCXhfYXJnID0gMTsKKwkJeF9hcmdfZGVmYXVsdGVkID0gMTsKKwkJcmV0dXJuICh4X212X2JlZ2luKDApKTsKKwljYXNlICc7JzoKKwkJLyogImludGVyZXN0aW5nIiBzZXF1ZW5jZSBkZXRlY3RlZCAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIHVud2luZF9lcnI7CisJfQorCisJLyogWFhYIHhfZV91bmdldGMgaXMgb25lLW9jdGV0IG9ubHkgKi8KKwlpZiAoKGMgPSB4X2VfZ2V0YygpKSAhPSAnNScgJiYgYyAhPSAnMycpCisJCWdvdG8gdW53aW5kX2VycjsKKworCS8qLQorCSAqIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgcmVhZCB0aGUgZm9sbG93aW5nIG9jdGV0cyBzbyBmYXI6CisJICogLSBFU0MrWyBvciBFU0MrTyBvciBDdHJsLVggKFByw6ZmaXggMikKKwkgKiAtIDEgKHZ0X2hhY2spCisJICogLSA7CisJICogLSA1IChDdHJsIGtleSBjb21iaW5lcikgb3IgMyAoQWx0IGtleSBjb21iaW5lcikKKwkgKiBXZSBjYW4gbm93IGFjY2VwdCBvbmUgbW9yZSBvY3RldCBkZXNpZ25hdGluZyB0aGUga2V5LgorCSAqLworCisJc3dpdGNoICgoYyA9IHhfZV9nZXRjKCkpKSB7CisJY2FzZSAnQyc6CisJCXJldHVybiAoeF9tdl9md29yZChjKSk7CisJY2FzZSAnRCc6CisJCXJldHVybiAoeF9tdl9id29yZChjKSk7CisJfQorCisgdW53aW5kX2VycjoKKwl4X2VfdW5nZXRjKGMpOworCXJldHVybiAoeF9lcnJvcihjKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGNoYXIgKgoreF9tYXBpbihjb25zdCBjaGFyICpjcCwgQXJlYSAqYXApCit7CisJY2hhciAqbmV3cywgKm9wOworCisJLyogZm9yIGNsYW5nJ3Mgc3RhdGljIGFuYWx5c2VyLCB0aGUgbm9ubnVsbCBhdHRyaWJ1dGUgaXNuJ3QgZW5vdWdoICovCisJbWtzc2VydChjcCAhPSBOVUxMKTsKKworCXN0cmR1cHgobmV3cywgY3AsIGFwKTsKKwlvcCA9IG5ld3M7CisJd2hpbGUgKCpjcCkgeworCQkvKiBYWFggLS0gc2hvdWxkIGhhbmRsZSBcXiBlc2NhcGU/ICovCisJCWlmICgqY3AgPT0gJ14nKSB7CisJCQljcCsrOworCQkJaWYgKCpjcCA+PSAnPycpCS8qIGluY2x1ZGVzICc/JzsgQVNDSUkgKi8KKwkJCQkqb3ArKyA9IENUUkwoKmNwKTsKKwkJCWVsc2UgeworCQkJCSpvcCsrID0gJ14nOworCQkJCWNwLS07CisJCQl9CisJCX0gZWxzZQorCQkJKm9wKysgPSAqY3A7CisJCWNwKys7CisJfQorCSpvcCA9ICdcMCc7CisKKwlyZXR1cm4gKG5ld3MpOworfQorCitzdGF0aWMgdm9pZAoreF9tYXBvdXQyKGludCBjLCBjaGFyICoqYnVmKQoreworCWNoYXIgKnAgPSAqYnVmOworCisJaWYgKGMgPCAnICcgfHwgYyA9PSAweDdmKSB7CisJCSpwKysgPSAnXic7CisJCSpwKysgPSBVTkNUUkwoYyk7CisJfSBlbHNlCisJCSpwKysgPSBjOworCSpwID0gMDsKKwkqYnVmID0gcDsKK30KKworc3RhdGljIGNoYXIgKgoreF9tYXBvdXQoaW50IGMpCit7CisJc3RhdGljIGNoYXIgYnVmWzhdOworCWNoYXIgKmJwID0gYnVmOworCisJeF9tYXBvdXQyKGMsICZicCk7CisJcmV0dXJuIChidWYpOworfQorCitzdGF0aWMgdm9pZAoreF9wcmludChpbnQgcHJlZml4LCBpbnQga2V5KQoreworCWludCBmID0geF90YWJbcHJlZml4XVtrZXldOworCisJaWYgKHByZWZpeCkKKwkJLyogcHJlZml4ID09IDEgfHwgcHJlZml4ID09IDIgKi8KKwkJc2hmX3B1dHMoeF9tYXBvdXQocHJlZml4ID09IDEgPworCQkgICAgQ1RSTCgnWycpIDogQ1RSTCgnWCcpKSwgc2hsX3N0ZG91dCk7CisjaWZkZWYgTUtTSF9TTUFMTAorCXNocHJpbnRmKCIlcyA9ICIsIHhfbWFwb3V0KGtleSkpOworI2Vsc2UKKwlzaHByaW50ZigiJXMlcyA9ICIsIHhfbWFwb3V0KGtleSksIChmICYgMHg4MCkgPyAifiIgOiAiIik7CisJaWYgKFhGVU5DX1ZBTFVFKGYpICE9IFhGVU5DX2luc19zdHJpbmcpCisjZW5kaWYKKwkJc2hwcmludGYoIiVzXG4iLCB4X2Z0YWJbWEZVTkNfVkFMVUUoZildLnhmX25hbWUpOworI2lmbmRlZiBNS1NIX1NNQUxMCisJZWxzZQorCQlzaHByaW50ZigiJyVzJ1xuIiwgeF9hdGFiW3ByZWZpeF1ba2V5XSk7CisjZW5kaWYKK30KKworaW50Cit4X2JpbmQoY29uc3QgY2hhciAqYTEsIGNvbnN0IGNoYXIgKmEyLAorI2lmbmRlZiBNS1NIX1NNQUxMCisgICAgYm9vbCBtYWNybywJCQkvKiBiaW5kIC1tICovCisjZW5kaWYKKyAgICBib29sIGxpc3QpCQkJLyogYmluZCAtbCAqLworeworCXVuc2lnbmVkIGNoYXIgZjsKKwlpbnQgcHJlZml4LCBrZXk7CisJY2hhciAqbTEsICptMjsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCWNoYXIgKnNwID0gTlVMTDsKKwlib29sIGhhc3RpbGRlOworI2VuZGlmCisKKwlpZiAoeF90YWIgPT0gTlVMTCkgeworCQliaV9lcnJvcmYoImNhbm5vdCBiaW5kLCBub3QgYSB0dHkiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJLyogTGlzdCBmdW5jdGlvbiBuYW1lcyAqLworCWlmIChsaXN0KSB7CisJCWZvciAoZiA9IDA7IGYgPCBORUxFTSh4X2Z0YWIpOyBmKyspCisJCQlpZiAoeF9mdGFiW2ZdLnhmX25hbWUgJiYKKwkJCSAgICAhKHhfZnRhYltmXS54Zl9mbGFncyAmIFhGX05PQklORCkpCisJCQkJc2hwcmludGYoIiVzXG4iLCB4X2Z0YWJbZl0ueGZfbmFtZSk7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChhMSA9PSBOVUxMKSB7CisJCWZvciAocHJlZml4ID0gMDsgcHJlZml4IDwgWF9OVEFCUzsgcHJlZml4KyspCisJCQlmb3IgKGtleSA9IDA7IGtleSA8IFhfVEFCU1o7IGtleSsrKSB7CisJCQkJZiA9IFhGVU5DX1ZBTFVFKHhfdGFiW3ByZWZpeF1ba2V5XSk7CisJCQkJaWYgKGYgPT0gWEZVTkNfaW5zZXJ0IHx8IGYgPT0gWEZVTkNfZXJyb3IKKyNpZm5kZWYgTUtTSF9TTUFMTAorCQkJCSAgICB8fCAobWFjcm8gJiYgZiAhPSBYRlVOQ19pbnNfc3RyaW5nKQorI2VuZGlmCisJCQkJICAgICkKKwkJCQkJY29udGludWU7CisJCQkJeF9wcmludChwcmVmaXgsIGtleSk7CisJCQl9CisJCXJldHVybiAoMCk7CisJfQorCW0yID0gbTEgPSB4X21hcGluKGExLCBBVEVNUCk7CisJcHJlZml4ID0gMDsKKwlmb3IgKDs7IG0xKyspIHsKKwkJa2V5ID0gKHVuc2lnbmVkIGNoYXIpKm0xOworCQlmID0gWEZVTkNfVkFMVUUoeF90YWJbcHJlZml4XVtrZXldKTsKKwkJaWYgKGYgPT0gWEZVTkNfbWV0YTEpCisJCQlwcmVmaXggPSAxOworCQllbHNlIGlmIChmID09IFhGVU5DX21ldGEyKQorCQkJcHJlZml4ID0gMjsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCWlmICgqKyttMQorI2lmbmRlZiBNS1NIX1NNQUxMCisJICAgICYmICgoKm0xICE9ICd+JykgfHwgKihtMSArIDEpKQorI2VuZGlmCisJICAgICkgeworCQljaGFyIG1zZ1syNTZdID0gImtleSBzZXF1ZW5jZSAnIjsKKwkJY29uc3QgY2hhciAqYyA9IGExOworCQltMSA9IG1zZyArIHN0cmxlbihtc2cpOworCQl3aGlsZSAoKmMgJiYgbTEgPCAobXNnICsgc2l6ZW9mKG1zZykgLSAzKSkKKwkJCXhfbWFwb3V0MigqYysrLCAmbTEpOworCQliaV9lcnJvcmYoIiVzJyB0b28gbG9uZyIsIG1zZyk7CisJCXJldHVybiAoMSk7CisJfQorI2lmbmRlZiBNS1NIX1NNQUxMCisJaGFzdGlsZGUgPSAqbTE7CisjZW5kaWYKKwlhZnJlZShtMiwgQVRFTVApOworCisJaWYgKGEyID09IE5VTEwpIHsKKwkJeF9wcmludChwcmVmaXgsIGtleSk7CisJCXJldHVybiAoMCk7CisJfQorCWlmICgqYTIgPT0gMCkgeworCQlmID0gWEZVTkNfaW5zZXJ0OworI2lmbmRlZiBNS1NIX1NNQUxMCisJfSBlbHNlIGlmIChtYWNybykgeworCQlmID0gWEZVTkNfaW5zX3N0cmluZzsKKwkJc3AgPSB4X21hcGluKGEyLCBBRURJVCk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlmb3IgKGYgPSAwOyBmIDwgTkVMRU0oeF9mdGFiKTsgZisrKQorCQkJaWYgKHhfZnRhYltmXS54Zl9uYW1lICYmCisJCQkgICAgc3RyY21wKHhfZnRhYltmXS54Zl9uYW1lLCBhMikgPT0gMCkKKwkJCQlicmVhazsKKwkJaWYgKGYgPT0gTkVMRU0oeF9mdGFiKSB8fCB4X2Z0YWJbZl0ueGZfZmxhZ3MgJiBYRl9OT0JJTkQpIHsKKwkJCWJpX2Vycm9yZigiJXM6IG5vIHN1Y2ggZnVuY3Rpb24iLCBhMik7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCisjaWZuZGVmIE1LU0hfU01BTEwKKwlpZiAoWEZVTkNfVkFMVUUoeF90YWJbcHJlZml4XVtrZXldKSA9PSBYRlVOQ19pbnNfc3RyaW5nICYmCisJICAgIHhfYXRhYltwcmVmaXhdW2tleV0pCisJCWFmcmVlKHhfYXRhYltwcmVmaXhdW2tleV0sIEFFRElUKTsKKyNlbmRpZgorCXhfdGFiW3ByZWZpeF1ba2V5XSA9IGYKKyNpZm5kZWYgTUtTSF9TTUFMTAorCSAgICB8IChoYXN0aWxkZSA/IDB4ODAgOiAwKQorI2VuZGlmCisJICAgIDsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCXhfYXRhYltwcmVmaXhdW2tleV0gPSBzcDsKKyNlbmRpZgorCisJLyogVHJhY2sgd2hhdCB0aGUgdXNlciBoYXMgYm91bmQgc28geF9tb2RlKHRydWUpIHdvbid0IHRvYXN0IHRoaW5ncyAqLworCWlmIChmID09IFhGVU5DX2luc2VydCkKKwkJeF9ib3VuZFsocHJlZml4ICogWF9UQUJTWiArIGtleSkgLyA4XSAmPQorCQkgICAgfigxIDw8ICgocHJlZml4ICogWF9UQUJTWiArIGtleSkgJSA4KSk7CisJZWxzZQorCQl4X2JvdW5kWyhwcmVmaXggKiBYX1RBQlNaICsga2V5KSAvIDhdIHw9CisJCSAgICAoMSA8PCAoKHByZWZpeCAqIFhfVEFCU1ogKyBrZXkpICUgOCkpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK3hfaW5pdF9lbWFjcyh2b2lkKQoreworCWludCBpLCBqOworCisJYWluaXQoQUVESVQpOworCXhfbmV4dGNtZCA9IC0xOworCisJeF90YWIgPSBhbGxvYyhYX05UQUJTICogc2l6ZW9mKCp4X3RhYiksIEFFRElUKTsKKwlmb3IgKGogPSAwOyBqIDwgWF9UQUJTWjsgaisrKQorCQl4X3RhYlswXVtqXSA9IFhGVU5DX2luc2VydDsKKwlmb3IgKGkgPSAxOyBpIDwgWF9OVEFCUzsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgWF9UQUJTWjsgaisrKQorCQkJeF90YWJbaV1bal0gPSBYRlVOQ19lcnJvcjsKKwlmb3IgKGkgPSAwOyBpIDwgKGludClORUxFTSh4X2RlZmJpbmRpbmdzKTsgaSsrKQorCQl4X3RhYlt4X2RlZmJpbmRpbmdzW2ldLnhkYl90YWJdW3hfZGVmYmluZGluZ3NbaV0ueGRiX2NoYXJdCisJCSAgICA9IHhfZGVmYmluZGluZ3NbaV0ueGRiX2Z1bmM7CisKKyNpZm5kZWYgTUtTSF9TTUFMTAorCXhfYXRhYiA9IGFsbG9jKFhfTlRBQlMgKiBzaXplb2YoKnhfYXRhYiksIEFFRElUKTsKKwlmb3IgKGkgPSAxOyBpIDwgWF9OVEFCUzsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgWF9UQUJTWjsgaisrKQorCQkJeF9hdGFiW2ldW2pdID0gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYmluZF9pZl9ub3RfYm91bmQoaW50IHAsIGludCBrLCBpbnQgZnVuYykKK3sKKwkvKiBIYXMgdXNlciBhbHJlYWR5IGJvdW5kIHRoaXMga2V5PyBJZiBzbywgZG9uJ3Qgb3ZlcnJpZGUgaXQgKi8KKwlpZiAoeF9ib3VuZFsoKHApICogWF9UQUJTWiArIChrKSkgLyA4XSAmCisJICAgICgxIDw8ICgoKHApICogWF9UQUJTWiArIChrKSkgJSA4KSkpCisJCXJldHVybjsKKworCXhfdGFiW3BdW2tdID0gZnVuYzsKK30KKworc3RhdGljIGludAoreF9zZXRfbWFyayhpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXhtcCA9IHhjcDsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2tpbGxfcmVnaW9uKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJaW50IHJzaXplOworCWNoYXIgKnhyOworCisJaWYgKHhtcCA9PSBOVUxMKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuIChLU1REKTsKKwl9CisJaWYgKHhtcCA+IHhjcCkgeworCQlyc2l6ZSA9IHhtcCAtIHhjcDsKKwkJeHIgPSB4Y3A7CisJfSBlbHNlIHsKKwkJcnNpemUgPSB4Y3AgLSB4bXA7CisJCXhyID0geG1wOworCX0KKwl4X2dvdG8oeHIpOworCXhfZGVsZXRlKHJzaXplLCB0cnVlKTsKKwl4bXAgPSB4cjsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X3hjaGdfcG9pbnRfbWFyayhpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWNoYXIgKnRtcDsKKworCWlmICh4bXAgPT0gTlVMTCkgeworCQl4X2VfcHV0YzIoNyk7CisJCXJldHVybiAoS1NURCk7CisJfQorCXRtcCA9IHhtcDsKKwl4bXAgPSB4Y3A7CisJeF9nb3RvKHRtcCk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9ub29wKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJcmV0dXJuIChLU1REKTsKK30KKworLyoKKyAqCUZpbGUvY29tbWFuZCBuYW1lIGNvbXBsZXRpb24gcm91dGluZXMKKyAqLworc3RhdGljIGludAoreF9jb21wX2NvbW0oaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlkb19jb21wbGV0ZShYQ0ZfQ09NTUFORCwgQ1RfQ09NUExFVEUpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfbGlzdF9jb21tKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJZG9fY29tcGxldGUoWENGX0NPTU1BTkQsIENUX0xJU1QpOworCXJldHVybiAoS1NURCk7Cit9CisKK3N0YXRpYyBpbnQKK3hfY29tcGxldGUoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlkb19jb21wbGV0ZShYQ0ZfQ09NTUFORF9GSUxFLCBDVF9DT01QTEVURSk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9lbnVtZXJhdGUoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlkb19jb21wbGV0ZShYQ0ZfQ09NTUFORF9GSUxFLCBDVF9MSVNUKTsKKwlyZXR1cm4gKEtTVEQpOworfQorCitzdGF0aWMgaW50Cit4X2NvbXBfZmlsZShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWRvX2NvbXBsZXRlKFhDRl9GSUxFLCBDVF9DT01QTEVURSk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9saXN0X2ZpbGUoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlkb19jb21wbGV0ZShYQ0ZfRklMRSwgQ1RfTElTVCk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9jb21wX2xpc3QoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlkb19jb21wbGV0ZShYQ0ZfQ09NTUFORF9GSUxFLCBDVF9DT01QTElTVCk7CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF9leHBhbmQoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwljaGFyICoqd29yZHM7CisJaW50IHN0YXJ0LCBlbmQsIG53b3JkcywgaTsKKwlib29sIGlzX2NvbW1hbmQ7CisKKwlud29yZHMgPSB4X2NmX2dsb2IoWENGX0ZJTEUsIHhidWYsIHhlcCAtIHhidWYsIHhjcCAtIHhidWYsCisJICAgICZzdGFydCwgJmVuZCwgJndvcmRzLCAmaXNfY29tbWFuZCk7CisKKwlpZiAobndvcmRzID09IDApIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKEtTVEQpOworCX0KKwl4X2dvdG8oeGJ1ZiArIHN0YXJ0KTsKKwl4X2RlbGV0ZShlbmQgLSBzdGFydCwgZmFsc2UpOworCWZvciAoaSA9IDA7IGkgPCBud29yZHM7KSB7CisJCWlmICh4X2VzY2FwZSh3b3Jkc1tpXSwgc3RybGVuKHdvcmRzW2ldKSwgeF9kb19pbnMpIDwgMCB8fAorCQkgICAgKCsraSA8IG53b3JkcyAmJiB4X2lucygiICIpIDwgMCkpIHsKKwkJCXhfZV9wdXRjMig3KTsKKwkJCXJldHVybiAoS1NURCk7CisJCX0KKwl9CisJeF9hZGp1c3QoKTsKKworCXJldHVybiAoS1NURCk7Cit9CisKKy8qIHR5cGUgPT0gMCBmb3IgbGlzdCwgMSBmb3IgY29tcGxldGUgYW5kIDIgZm9yIGNvbXBsZXRlLWxpc3QgKi8KK3N0YXRpYyB2b2lkCitkb19jb21wbGV0ZShpbnQgZmxhZ3MsCS8qIFhDRl97Q09NTUFORCxGSUxFLENPTU1BTkRfRklMRX0gKi8KKyAgICBDb21wX3R5cGUgdHlwZSkKK3sKKwljaGFyICoqd29yZHM7CisJaW50IHN0YXJ0LCBlbmQsIG5sZW4sIG9sZW4sIG53b3JkczsKKwlib29sIGlzX2NvbW1hbmQsIGNvbXBsZXRlZCA9IGZhbHNlOworCisJbndvcmRzID0geF9jZl9nbG9iKGZsYWdzLCB4YnVmLCB4ZXAgLSB4YnVmLCB4Y3AgLSB4YnVmLAorCSAgICAmc3RhcnQsICZlbmQsICZ3b3JkcywgJmlzX2NvbW1hbmQpOworCS8qIG5vIG1hdGNoICovCisJaWYgKG53b3JkcyA9PSAwKSB7CisJCXhfZV9wdXRjMig3KTsKKwkJcmV0dXJuOworCX0KKwlpZiAodHlwZSA9PSBDVF9MSVNUKSB7CisJCXhfcHJpbnRfZXhwYW5zaW9ucyhud29yZHMsIHdvcmRzLCBpc19jb21tYW5kKTsKKwkJeF9yZWRyYXcoMCk7CisJCXhfZnJlZV93b3Jkcyhud29yZHMsIHdvcmRzKTsKKwkJcmV0dXJuOworCX0KKwlvbGVuID0gZW5kIC0gc3RhcnQ7CisJbmxlbiA9IHhfbG9uZ2VzdF9wcmVmaXgobndvcmRzLCB3b3Jkcyk7CisJLyogY29tcGxldGUgKi8KKwlpZiAobndvcmRzID09IDEgfHwgbmxlbiA+IG9sZW4pIHsKKwkJeF9nb3RvKHhidWYgKyBzdGFydCk7CisJCXhfZGVsZXRlKG9sZW4sIGZhbHNlKTsKKwkJeF9lc2NhcGUod29yZHNbMF0sIG5sZW4sIHhfZG9faW5zKTsKKwkJeF9hZGp1c3QoKTsKKwkJY29tcGxldGVkID0gdHJ1ZTsKKwl9CisJLyogYWRkIHNwYWNlIGlmIHNpbmdsZSBub24tZGlyIG1hdGNoICovCisJaWYgKG53b3JkcyA9PSAxICYmIHdvcmRzWzBdW25sZW4gLSAxXSAhPSAnLycpIHsKKwkJeF9pbnMoIiAiKTsKKwkJY29tcGxldGVkID0gdHJ1ZTsKKwl9CisJaWYgKHR5cGUgPT0gQ1RfQ09NUExJU1QgJiYgIWNvbXBsZXRlZCkgeworCQl4X3ByaW50X2V4cGFuc2lvbnMobndvcmRzLCB3b3JkcywgaXNfY29tbWFuZCk7CisJCWNvbXBsZXRlZCA9IHRydWU7CisJfQorCWlmIChjb21wbGV0ZWQpCisJCXhfcmVkcmF3KDApOworCisJeF9mcmVlX3dvcmRzKG53b3Jkcywgd29yZHMpOworfQorCisvKiBOQU1FOgorICoJeF9hZGp1c3QgLSByZWRyYXcgdGhlIGxpbmUgYWRqdXN0aW5nIHN0YXJ0aW5nIHBvaW50IGV0Yy4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgaGF2ZSBleGNlZWRlZCB0aGUgYm91bmRzCisgKglvZiB0aGUgZWRpdCB3aW5kb3cuIEl0IGluY3JlbWVudHMgeF9hZGpfZG9uZSBzbyB0aGF0CisgKglmdW5jdGlvbnMgbGlrZSB4X2lucyBhbmQgeF9kZWxldGUga25vdyB0aGF0IHdlIGhhdmUgYmVlbgorICoJY2FsbGVkIGFuZCBjYW4gc2tpcCB0aGUgeF9icygpIHN0dWZmIHdoaWNoIGhhcyBhbHJlYWR5CisgKgliZWVuIGRvbmUgYnkgeF9yZWRyYXcuCisgKgorICogUkVUVVJOIFZBTFVFOgorICoJTm9uZQorICovCitzdGF0aWMgdm9pZAoreF9hZGp1c3Qodm9pZCkKK3sKKwl4X2Fkal9kb25lKys7CQkJLyogZmxhZyB0aGUgZmFjdCB0aGF0IHdlIHdlcmUgY2FsbGVkLiAqLworCS8qCisJICogd2UgaGFkIGEgcHJvYmxlbSBpZiB0aGUgcHJvbXB0IGxlbmd0aCA+IHh4X2NvbHMgLyAyCisJICovCisJaWYgKCh4YnAgPSB4Y3AgLSAoeF9kaXNwbGVuIC8gMikpIDwgeGJ1ZikKKwkJeGJwID0geGJ1ZjsKKwlpZiAoVVRGTU9ERSkKKwkJd2hpbGUgKCh4YnAgPiB4YnVmKSAmJiAoKCp4YnAgJiAweEMwKSA9PSAweDgwKSkKKwkJCS0teGJwOworCXhscF92YWxpZCA9IGZhbHNlOworCXhfcmVkcmF3KHh4X2NvbHMpOworCXhfZmx1c2goKTsKK30KKworc3RhdGljIHZvaWQKK3hfZV91bmdldGMoaW50IGMpCit7CisJdW5nZXRfY2hhciA9IGMgPCAwID8gLTEgOiAoYyAmIDI1NSk7Cit9CisKK3N0YXRpYyBpbnQKK3hfZV9nZXRjKHZvaWQpCit7CisJaW50IGM7CisKKwlpZiAodW5nZXRfY2hhciA+PSAwKSB7CisJCWMgPSB1bmdldF9jaGFyOworCQl1bmdldF9jaGFyID0gLTE7CisJCXJldHVybiAoYyk7CisJfQorCisjaWZuZGVmIE1LU0hfU01BTEwKKwlpZiAobWFjcm9wdHIpIHsKKwkJaWYgKChjID0gKHVuc2lnbmVkIGNoYXIpKm1hY3JvcHRyKyspKQorCQkJcmV0dXJuIChjKTsKKwkJbWFjcm9wdHIgPSBOVUxMOworCX0KKyNlbmRpZgorCisJcmV0dXJuICh4X2dldGMoKSk7Cit9CisKK3N0YXRpYyB2b2lkCit4X2VfcHV0YzIoaW50IGMpCit7CisJaW50IHdpZHRoID0gMTsKKworCWlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKQorCQl4X2NvbCA9IDA7CisJaWYgKHhfY29sIDwgeHhfY29scykgeworCQlpZiAoVVRGTU9ERSAmJiAoYyA+IDB4N0YpKSB7CisJCQljaGFyIHV0Zl90bXBbM107CisJCQlzaXplX3QgeDsKKworCQkJaWYgKGMgPCAweEEwKQorCQkJCWMgPSAweEZGRkQ7CisJCQl4ID0gdXRmX3djdG9tYih1dGZfdG1wLCBjKTsKKwkJCXhfcHV0Yyh1dGZfdG1wWzBdKTsKKwkJCWlmICh4ID4gMSkKKwkJCQl4X3B1dGModXRmX3RtcFsxXSk7CisJCQlpZiAoeCA+IDIpCisJCQkJeF9wdXRjKHV0Zl90bXBbMl0pOworCQkJd2lkdGggPSB1dGZfd2N3aWR0aChjKTsKKwkJfSBlbHNlCisJCQl4X3B1dGMoYyk7CisJCXN3aXRjaCAoYykgeworCQljYXNlIDc6CisJCQlicmVhazsKKwkJY2FzZSAnXHInOgorCQljYXNlICdcbic6CisJCQlicmVhazsKKwkJY2FzZSAnXGInOgorCQkJeF9jb2wtLTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJeF9jb2wgKz0gd2lkdGg7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoeF9hZGpfb2sgJiYgKHhfY29sIDwgMCB8fCB4X2NvbCA+PSAoeHhfY29scyAtIDIpKSkKKwkJeF9hZGp1c3QoKTsKK30KKworc3RhdGljIHZvaWQKK3hfZV9wdXRjMyhjb25zdCBjaGFyICoqY3ApCit7CisJaW50IHdpZHRoID0gMSwgYyA9ICoqKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiopY3A7CisKKwlpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKKwkJeF9jb2wgPSAwOworCWlmICh4X2NvbCA8IHh4X2NvbHMpIHsKKwkJaWYgKFVURk1PREUgJiYgKGMgPiAweDdGKSkgeworCQkJY2hhciAqY3AyOworCisJCQl3aWR0aCA9IHV0Zl93aWR0aGFkaigqY3AsIChjb25zdCBjaGFyICoqKSZjcDIpOworCQkJd2hpbGUgKCpjcCA8IGNwMikKKwkJCQl4X3B1dGNmKCooKmNwKSsrKTsKKwkJfSBlbHNlIHsKKwkJCSgqY3ApKys7CisJCQl4X3B1dGMoYyk7CisJCX0KKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgNzoKKwkJCWJyZWFrOworCQljYXNlICdccic6CisJCWNhc2UgJ1xuJzoKKwkJCWJyZWFrOworCQljYXNlICdcYic6CisJCQl4X2NvbC0tOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl4X2NvbCArPSB3aWR0aDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICh4X2Fkal9vayAmJiAoeF9jb2wgPCAwIHx8IHhfY29sID49ICh4eF9jb2xzIC0gMikpKQorCQl4X2FkanVzdCgpOworfQorCitzdGF0aWMgdm9pZAoreF9lX3B1dHMoY29uc3QgY2hhciAqcykKK3sKKwlpbnQgYWRqID0geF9hZGpfZG9uZTsKKworCXdoaWxlICgqcyAmJiBhZGogPT0geF9hZGpfZG9uZSkKKwkJeF9lX3B1dGMzKCZzKTsKK30KKworLyogTkFNRToKKyAqCXhfc2V0X2FyZyAtIHNldCBhbiBhcmcgdmFsdWUgZm9yIG5leHQgZnVuY3Rpb24KKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgaXMgYSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgTS1bMC05XS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKglLU1RECisgKi8KK3N0YXRpYyBpbnQKK3hfc2V0X2FyZyhpbnQgYykKK3sKKwlpbnQgbiA9IDAsIGZpcnN0ID0gMTsKKworCWMgJj0gMjU1OwkvKiBzdHJpcCBjb21tYW5kIHByZWZpeCAqLworCWZvciAoOyBjID49IDAgJiYga3NoX2lzZGlnaXQoYyk7IGMgPSB4X2VfZ2V0YygpLCBmaXJzdCA9IDApCisJCW4gPSBuICogMTAgKyAoYyAtICcwJyk7CisJaWYgKGMgPCAwIHx8IGZpcnN0KSB7CisJCXhfZV9wdXRjMig3KTsKKwkJeF9hcmcgPSAxOworCQl4X2FyZ19kZWZhdWx0ZWQgPSAxOworCX0gZWxzZSB7CisJCXhfZV91bmdldGMoYyk7CisJCXhfYXJnID0gbjsKKwkJeF9hcmdfZGVmYXVsdGVkID0gMDsKKwl9CisJcmV0dXJuIChLU1REKTsKK30KKworLyogQ29tbWVudCBvciB1bmNvbW1lbnQgdGhlIGN1cnJlbnQgbGluZS4gKi8KK3N0YXRpYyBpbnQKK3hfY29tbWVudChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWludCBvbGRzaXplID0geF9zaXplX3N0cih4YnVmKTsKKwlpbnQgbGVuID0geGVwIC0geGJ1ZjsKKwlpbnQgcmV0ID0geF9kb19jb21tZW50KHhidWYsIHhlbmQgLSB4YnVmLCAmbGVuKTsKKworCWlmIChyZXQgPCAwKQorCQl4X2VfcHV0YzIoNyk7CisJZWxzZSB7CisJCXhfbW9kaWZpZWQoKTsKKwkJeGVwID0geGJ1ZiArIGxlbjsKKwkJKnhlcCA9ICdcMCc7CisJCXhjcCA9IHhicCA9IHhidWY7CisJCXhfcmVkcmF3KG9sZHNpemUpOworCQlpZiAocmV0ID4gMCkKKwkJCXJldHVybiAoeF9uZXdsaW5lKCdcbicpKTsKKwl9CisJcmV0dXJuIChLU1REKTsKK30KKworc3RhdGljIGludAoreF92ZXJzaW9uKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJY2hhciAqb194YnVmID0geGJ1ZiwgKm9feGVuZCA9IHhlbmQ7CisJY2hhciAqb194YnAgPSB4YnAsICpvX3hlcCA9IHhlcCwgKm9feGNwID0geGNwOworCWludCB2bGVuLCBsaW0gPSB4X2xhc3RjcCgpIC0geGJwOworCWNoYXIgKnY7CisKKwlzdHJkdXB4KHYsIEtTSF9WRVJTSU9OLCBBVEVNUCk7CisKKwl4YnVmID0geGJwID0geGNwID0gdjsKKwl4ZW5kID0geGVwID0gdiArICh2bGVuID0gc3RybGVuKHYpKTsKKwl4X3JlZHJhdyhsaW0pOworCXhfZmx1c2goKTsKKworCWMgPSB4X2VfZ2V0YygpOworCXhidWYgPSBvX3hidWY7CisJeGVuZCA9IG9feGVuZDsKKwl4YnAgPSBvX3hicDsKKwl4ZXAgPSBvX3hlcDsKKwl4Y3AgPSBvX3hjcDsKKwl4X3JlZHJhdyh2bGVuKTsKKworCWlmIChjIDwgMCkKKwkJcmV0dXJuIChLU1REKTsKKwkvKiBUaGlzIGlzIHdoYXQgQVQmVCBrc2ggc2VlbXMgdG8gZG8uLi4gVmVyeSBiaXphcnJlICovCisJaWYgKGMgIT0gJyAnKQorCQl4X2VfdW5nZXRjKGMpOworCisJYWZyZWUodiwgQVRFTVApOworCXJldHVybiAoS1NURCk7Cit9CisKKyNpZm5kZWYgTUtTSF9TTUFMTAorc3RhdGljIGludAoreF9lZGl0X2xpbmUoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwlpZiAoeF9hcmdfZGVmYXVsdGVkKSB7CisJCWlmICh4ZXAgPT0geGJ1ZikgeworCQkJeF9lX3B1dGMyKDcpOworCQkJcmV0dXJuIChLU1REKTsKKwkJfQorCQlpZiAobW9kaWZpZWQpIHsKKwkJCSp4ZXAgPSAnXDAnOworCQkJaGlzdHNhdmUoJnNvdXJjZS0+bGluZSwgeGJ1ZiwgdHJ1ZSwgdHJ1ZSk7CisJCQl4X2FyZyA9IDA7CisJCX0gZWxzZQorCQkJeF9hcmcgPSBzb3VyY2UtPmxpbmUgLSAoaGlzdHB0ciAtIHhfaGlzdHApOworCX0KKwlpZiAoeF9hcmcpCisJCXNoZl9zbnByaW50Zih4YnVmLCB4ZW5kIC0geGJ1ZiwgIiVzICVkIiwKKwkJICAgICJmYyAtZSAke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0gLS0iLCB4X2FyZyk7CisJZWxzZQorCQlzdHJsY3B5KHhidWYsICJmYyAtZSAke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0gLS0iLCB4ZW5kIC0geGJ1Zik7CisJeGVwID0geGJ1ZiArIHN0cmxlbih4YnVmKTsKKwlyZXR1cm4gKHhfbmV3bGluZSgnXG4nKSk7Cit9CisjZW5kaWYKKworLyogTkFNRToKKyAqCXhfcHJldl9oaXN0d29yZCAtIHJlY292ZXIgd29yZCBmcm9tIHByZXYgY29tbWFuZAorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyBmdW5jdGlvbiByZWNvdmVycyB0aGUgbGFzdCB3b3JkIGZyb20gdGhlIHByZXZpb3VzCisgKgljb21tYW5kIGFuZCBpbnNlcnRzIGl0IGludG8gdGhlIGN1cnJlbnQgZWRpdCBsaW5lLiBJZiBhCisgKgludW1lcmljIGFyZyBpcyBzdXBwbGllZCB0aGVuIHRoZSBuJ3RoIHdvcmQgZnJvbSB0aGUKKyAqCXN0YXJ0IG9mIHRoZSBwcmV2aW91cyBjb21tYW5kIGlzIHVzZWQuCisgKglBcyBhIHNpZGUgZWZmZWN0LCB0cmFzaGVzIHRoZSBtYXJrIGluIG9yZGVyIHRvIGFjaGlldmUKKyAqCWJlaW5nIGNhbGxlZCBpbiBhIHJlcGVhdGFibGUgZmFzaGlvbi4KKyAqCisgKglCb3VuZCB0byBNLS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKglLU1RECisgKi8KK3N0YXRpYyBpbnQKK3hfcHJldl9oaXN0d29yZChpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCWNoYXIgKnJjcCwgKmNwOworCWNoYXIgKip4aHA7CisJaW50IG07CisKKwlpZiAoeG1wICYmIG1vZGlmaWVkID4gMSkKKwkJeF9raWxsX3JlZ2lvbigwKTsKKwltID0gbW9kaWZpZWQgPyBtb2RpZmllZCA6IDE7CisJeGhwID0gaGlzdHB0ciAtIChtIC0gMSk7CisJaWYgKCh4aHAgPCBoaXN0b3J5KSB8fCAhKGNwID0gKnhocCkpIHsKKwkJeF9lX3B1dGMyKDcpOworCQl4X21vZGlmaWVkKCk7CisJCXJldHVybiAoS1NURCk7CisJfQorCXhfc2V0X21hcmsoMCk7CisJaWYgKHhfYXJnX2RlZmF1bHRlZCkgeworCQlyY3AgPSAmY3Bbc3RybGVuKGNwKSAtIDFdOworCQkvKgorCQkgKiBpZ25vcmUgd2hpdGUtc3BhY2UgYWZ0ZXIgdGhlIGxhc3Qgd29yZAorCQkgKi8KKwkJd2hpbGUgKHJjcCA+IGNwICYmIGlzX2NmcygqcmNwKSkKKwkJCXJjcC0tOworCQl3aGlsZSAocmNwID4gY3AgJiYgIWlzX2NmcygqcmNwKSkKKwkJCXJjcC0tOworCQlpZiAoaXNfY2ZzKCpyY3ApKQorCQkJcmNwKys7CisJCXhfaW5zKHJjcCk7CisJfSBlbHNlIHsKKwkJY2hhciBjaDsKKworCQlyY3AgPSBjcDsKKwkJLyoKKwkJICogaWdub3JlIHdoaXRlLXNwYWNlIGF0IHN0YXJ0IG9mIGxpbmUKKwkJICovCisJCXdoaWxlICgqcmNwICYmIGlzX2NmcygqcmNwKSkKKwkJCXJjcCsrOworCQl3aGlsZSAoeF9hcmctLSA+IDEpIHsKKwkJCXdoaWxlICgqcmNwICYmICFpc19jZnMoKnJjcCkpCisJCQkJcmNwKys7CisJCQl3aGlsZSAoKnJjcCAmJiBpc19jZnMoKnJjcCkpCisJCQkJcmNwKys7CisJCX0KKwkJY3AgPSByY3A7CisJCXdoaWxlICgqcmNwICYmICFpc19jZnMoKnJjcCkpCisJCQlyY3ArKzsKKwkJY2ggPSAqcmNwOworCQkqcmNwID0gJ1wwJzsKKwkJeF9pbnMoY3ApOworCQkqcmNwID0gY2g7CisJfQorCW1vZGlmaWVkID0gbSArIDE7CisJcmV0dXJuIChLU1REKTsKK30KKworI2lmbmRlZiBNS1NIX1NNQUxMCisvKiBVcHBlcmNhc2UgTigxKSB3b3JkcyAqLworc3RhdGljIGludAoreF9mb2xkX3VwcGVyKGludCBjIE1LU0hfQV9VTlVTRUQpCit7CisJcmV0dXJuICh4X2ZvbGRfY2FzZSgnVScpKTsKK30KKworLyogTG93ZXJjYXNlIE4oMSkgd29yZHMgKi8KK3N0YXRpYyBpbnQKK3hfZm9sZF9sb3dlcihpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXJldHVybiAoeF9mb2xkX2Nhc2UoJ0wnKSk7Cit9CisKKy8qIExvd2VyY2FzZSBOKDEpIHdvcmRzICovCitzdGF0aWMgaW50Cit4X2ZvbGRfY2FwaXRhbGlzZShpbnQgYyBNS1NIX0FfVU5VU0VEKQoreworCXJldHVybiAoeF9mb2xkX2Nhc2UoJ0MnKSk7Cit9CisKKy8qIE5BTUU6CisgKgl4X2ZvbGRfY2FzZSAtIGNvbnZlcnQgd29yZCB0byBVUFBFUi9sb3dlci9DYXBpdGFsIGNhc2UKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbXBsZW1lbnQgTS1VLE0tdSxNLUwsTS1sLE0tQyBhbmQgTS1jCisgKgl0byBVUFBFUiBjYXNlLCBsb3dlciBjYXNlIG9yIENhcGl0YWxpc2Ugd29yZHMuCisgKgorICogUkVUVVJOIFZBTFVFOgorICoJTm9uZQorICovCitzdGF0aWMgaW50Cit4X2ZvbGRfY2FzZShpbnQgYykKK3sKKwljaGFyICpjcCA9IHhjcDsKKworCWlmIChjcCA9PSB4ZXApIHsKKwkJeF9lX3B1dGMyKDcpOworCQlyZXR1cm4gKEtTVEQpOworCX0KKwl3aGlsZSAoeF9hcmctLSkgeworCQkvKgorCQkgKiBmaXJzdCBza2lwIG92ZXIgYW55IHdoaXRlLXNwYWNlCisJCSAqLworCQl3aGlsZSAoY3AgIT0geGVwICYmIGlzX21mcygqY3ApKQorCQkJY3ArKzsKKwkJLyoKKwkJICogZG8gdGhlIGZpcnN0IGNoYXIgb24gaXRzIG93biBzaW5jZSBpdCBtYXkgYmUKKwkJICogYSBkaWZmZXJlbnQgYWN0aW9uIHRoYW4gZm9yIHRoZSByZXN0LgorCQkgKi8KKwkJaWYgKGNwICE9IHhlcCkgeworCQkJaWYgKGMgPT0gJ0wnKQkJLyogbG93ZXJjYXNlICovCisJCQkJKmNwID0ga3NoX3RvbG93ZXIoKmNwKTsKKwkJCWVsc2UJCQkvKiB1cHBlcmNhc2UsIGNhcGl0YWxpc2UgKi8KKwkJCQkqY3AgPSBrc2hfdG91cHBlcigqY3ApOworCQkJY3ArKzsKKwkJfQorCQkvKgorCQkgKiBub3cgZm9yIHRoZSByZXN0IG9mIHRoZSB3b3JkCisJCSAqLworCQl3aGlsZSAoY3AgIT0geGVwICYmICFpc19tZnMoKmNwKSkgeworCQkJaWYgKGMgPT0gJ1UnKQkJLyogdXBwZXJjYXNlICovCisJCQkJKmNwID0ga3NoX3RvdXBwZXIoKmNwKTsKKwkJCWVsc2UJCQkvKiBsb3dlcmNhc2UsIGNhcGl0YWxpc2UgKi8KKwkJCQkqY3AgPSBrc2hfdG9sb3dlcigqY3ApOworCQkJY3ArKzsKKwkJfQorCX0KKwl4X2dvdG8oY3ApOworCXhfbW9kaWZpZWQoKTsKKwlyZXR1cm4gKEtTVEQpOworfQorI2VuZGlmCisKKy8qIE5BTUU6CisgKgl4X2xhc3RjcCAtIGxhc3QgdmlzaWJsZSBjaGFyCisgKgorICogU1lOT1BTSVM6CisgKgl4X2xhc3RjcCgpCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoYXQgY2hhciBpbiB0aGUKKyAqCWVkaXQgYnVmZmVyIHRoYXQgd2lsbCBiZSB0aGUgbGFzdCBkaXNwbGF5ZWQgb24gdGhlCisgKglzY3JlZW4uIFRoZSBzZXF1ZW5jZToKKyAqCisgKgljcCA9IHhfbGFzdGNwKCk7CisgKgl3aGlsZSAoY3AgPiB4Y3ApCisgKgkJeF9iczMoJmNwKTsKKyAqCisgKglXaWxsIHBvc2l0aW9uIHRoZSBjdXJzb3IgY29ycmVjdGx5IG9uIHRoZSBzY3JlZW4uCisgKgorICogUkVUVVJOIFZBTFVFOgorICoJY3Agb3IgTlVMTAorICovCitzdGF0aWMgY2hhciAqCit4X2xhc3RjcCh2b2lkKQoreworCWlmICgheGxwX3ZhbGlkKSB7CisJCWludCBpID0gMCwgajsKKwkJY2hhciAqeGxwMjsKKworCQl4bHAgPSB4YnA7CisJCXdoaWxlICh4bHAgPCB4ZXApIHsKKwkJCWogPSB4X3NpemUyKHhscCwgJnhscDIpOworCQkJaWYgKChpICsgaikgPiB4X2Rpc3BsZW4pCisJCQkJYnJlYWs7CisJCQlpICs9IGo7CisJCQl4bHAgPSB4bHAyOworCQl9CisJfQorCXhscF92YWxpZCA9IHRydWU7CisJcmV0dXJuICh4bHApOworfQorCitzdGF0aWMgYm9vbAoreF9tb2RlKGJvb2wgb25vZmYpCit7CisJc3RhdGljIGJvb2wgeF9jdXJfbW9kZTsKKwlib29sIHByZXY7CisKKwlpZiAoeF9jdXJfbW9kZSA9PSBvbm9mZikKKwkJcmV0dXJuICh4X2N1cl9tb2RlKTsKKwlwcmV2ID0geF9jdXJfbW9kZTsKKwl4X2N1cl9tb2RlID0gb25vZmY7CisKKwlpZiAob25vZmYpIHsKKwkJc3RydWN0IHRlcm1pb3MgY2I7CisKKwkJY2IgPSB0dHlfc3RhdGU7CisKKwkJZWRjaGFycy5lcmFzZSA9IGNiLmNfY2NbVkVSQVNFXTsKKwkJZWRjaGFycy5raWxsID0gY2IuY19jY1tWS0lMTF07CisJCWVkY2hhcnMuaW50ciA9IGNiLmNfY2NbVklOVFJdOworCQllZGNoYXJzLnF1aXQgPSBjYi5jX2NjW1ZRVUlUXTsKKwkJZWRjaGFycy5lb2YgPSBjYi5jX2NjW1ZFT0ZdOworI2lmZGVmIFZXRVJBU0UKKwkJZWRjaGFycy53ZXJhc2UgPSBjYi5jX2NjW1ZXRVJBU0VdOworI2VuZGlmCisJCWNiLmNfaWZsYWcgJj0gfihJTkxDUiB8IElDUk5MKTsKKwkJY2IuY19sZmxhZyAmPSB+KElTSUcgfCBJQ0FOT04gfCBFQ0hPKTsKKyNpZiBkZWZpbmVkKFZMTkVYVCkgJiYgZGVmaW5lZChfUE9TSVhfVkRJU0FCTEUpCisJCS8qIG9zZi8xIHByb2Nlc3NlcyBsbmV4dCB3aGVuIH5pY2Fub24gKi8KKwkJY2IuY19jY1tWTE5FWFRdID0gX1BPU0lYX1ZESVNBQkxFOworI2VuZGlmCisJCS8qIHN1bm9zIDQuMS54ICYgb3NmLzEgcHJvY2Vzc2VzIGRpc2NhcmQoZmx1c2gpIHdoZW4gfmljYW5vbiAqLworI2lmIGRlZmluZWQoVkRJU0NBUkQpICYmIGRlZmluZWQoX1BPU0lYX1ZESVNBQkxFKQorCQljYi5jX2NjW1ZESVNDQVJEXSA9IF9QT1NJWF9WRElTQUJMRTsKKyNlbmRpZgorCQljYi5jX2NjW1ZUSU1FXSA9IDA7CisJCWNiLmNfY2NbVk1JTl0gPSAxOworCisJCXRjc2V0YXR0cih0dHlfZmQsIFRDU0FEUkFJTiwgJmNiKTsKKworI2lmZGVmIF9QT1NJWF9WRElTQUJMRQorCQkvKiBDb252ZXJ0IHVuc2V0IHZhbHVlcyB0byBpbnRlcm5hbCAndW5zZXQnIHZhbHVlICovCisJCWlmIChlZGNoYXJzLmVyYXNlID09IF9QT1NJWF9WRElTQUJMRSkKKwkJCWVkY2hhcnMuZXJhc2UgPSAtMTsKKwkJaWYgKGVkY2hhcnMua2lsbCA9PSBfUE9TSVhfVkRJU0FCTEUpCisJCQllZGNoYXJzLmtpbGwgPSAtMTsKKwkJaWYgKGVkY2hhcnMuaW50ciA9PSBfUE9TSVhfVkRJU0FCTEUpCisJCQllZGNoYXJzLmludHIgPSAtMTsKKwkJaWYgKGVkY2hhcnMucXVpdCA9PSBfUE9TSVhfVkRJU0FCTEUpCisJCQllZGNoYXJzLnF1aXQgPSAtMTsKKwkJaWYgKGVkY2hhcnMuZW9mID09IF9QT1NJWF9WRElTQUJMRSkKKwkJCWVkY2hhcnMuZW9mID0gLTE7CisJCWlmIChlZGNoYXJzLndlcmFzZSA9PSBfUE9TSVhfVkRJU0FCTEUpCisJCQllZGNoYXJzLndlcmFzZSA9IC0xOworI2VuZGlmCisKKwkJaWYgKGVkY2hhcnMuZXJhc2UgPj0gMCkgeworCQkJYmluZF9pZl9ub3RfYm91bmQoMCwgZWRjaGFycy5lcmFzZSwgWEZVTkNfZGVsX2JhY2spOworCQkJYmluZF9pZl9ub3RfYm91bmQoMSwgZWRjaGFycy5lcmFzZSwgWEZVTkNfZGVsX2J3b3JkKTsKKwkJfQorCQlpZiAoZWRjaGFycy5raWxsID49IDApCisJCQliaW5kX2lmX25vdF9ib3VuZCgwLCBlZGNoYXJzLmtpbGwsIFhGVU5DX2RlbF9saW5lKTsKKwkJaWYgKGVkY2hhcnMud2VyYXNlID49IDApCisJCQliaW5kX2lmX25vdF9ib3VuZCgwLCBlZGNoYXJzLndlcmFzZSwgWEZVTkNfZGVsX2J3b3JkKTsKKwkJaWYgKGVkY2hhcnMuaW50ciA+PSAwKQorCQkJYmluZF9pZl9ub3RfYm91bmQoMCwgZWRjaGFycy5pbnRyLCBYRlVOQ19hYm9ydCk7CisJCWlmIChlZGNoYXJzLnF1aXQgPj0gMCkKKwkJCWJpbmRfaWZfbm90X2JvdW5kKDAsIGVkY2hhcnMucXVpdCwgWEZVTkNfbm9vcCk7CisJfSBlbHNlCisJCXRjc2V0YXR0cih0dHlfZmQsIFRDU0FEUkFJTiwgJnR0eV9zdGF0ZSk7CisKKwlyZXR1cm4gKHByZXYpOworfQorCisjaWYgIU1LU0hfU19OT1ZJCisvKiArKysgdmkgZWRpdGluZyBtb2RlICsrKyAqLworCisjZGVmaW5lIEN0cmwoYykJCShjJjB4MWYpCisKK3N0cnVjdCBlZHN0YXRlIHsKKwljaGFyICpjYnVmOworCWludCB3aW5sZWZ0OworCWludCBjYnVmc2l6ZTsKKwlpbnQgbGluZWxlbjsKKwlpbnQgY3Vyc29yOworfTsKKworc3RhdGljIGludCB2aV9ob29rKGludCk7CitzdGF0aWMgaW50IG5leHRzdGF0ZShpbnQpOworc3RhdGljIGludCB2aV9pbnNlcnQoaW50KTsKK3N0YXRpYyBpbnQgdmlfY21kKGludCwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyBpbnQgZG9tb3ZlKGludCwgY29uc3QgY2hhciAqLCBpbnQpOworc3RhdGljIGludCByZWRvX2luc2VydChpbnQpOworc3RhdGljIHZvaWQgeWFua19yYW5nZShpbnQsIGludCk7CitzdGF0aWMgaW50IGJyYWNrdHlwZShpbnQpOworc3RhdGljIHZvaWQgc2F2ZV9jYnVmKHZvaWQpOworc3RhdGljIHZvaWQgcmVzdG9yZV9jYnVmKHZvaWQpOworc3RhdGljIGludCBwdXRidWYoY29uc3QgY2hhciAqLCBpbnQsIGludCk7CitzdGF0aWMgdm9pZCBkZWxfcmFuZ2UoaW50LCBpbnQpOworc3RhdGljIGludCBmaW5kY2goaW50LCBpbnQsIGludCwgaW50KTsKK3N0YXRpYyBpbnQgZm9yd3dvcmQoaW50KTsKK3N0YXRpYyBpbnQgYmFja3dvcmQoaW50KTsKK3N0YXRpYyBpbnQgZW5kd29yZChpbnQpOworc3RhdGljIGludCBGb3J3d29yZChpbnQpOworc3RhdGljIGludCBCYWNrd29yZChpbnQpOworc3RhdGljIGludCBFbmR3b3JkKGludCk7CitzdGF0aWMgaW50IGdyYWJoaXN0KGludCwgaW50KTsKK3N0YXRpYyBpbnQgZ3JhYnNlYXJjaChpbnQsIGludCwgaW50LCBjaGFyICopOworc3RhdGljIHZvaWQgcmVkcmF3X2xpbmUoaW50KTsKK3N0YXRpYyB2b2lkIHJlZnJlc2goaW50KTsKK3N0YXRpYyBpbnQgb3V0b2Z3aW4odm9pZCk7CitzdGF0aWMgdm9pZCByZXdpbmRvdyh2b2lkKTsKK3N0YXRpYyBpbnQgbmV3Y29sKGludCwgaW50KTsKK3N0YXRpYyB2b2lkIGRpc3BsYXkoY2hhciAqLCBjaGFyICosIGludCk7CitzdGF0aWMgdm9pZCBlZF9tb3Zfb3B0KGludCwgY2hhciAqKTsKK3N0YXRpYyBpbnQgZXhwYW5kX3dvcmQoaW50KTsKK3N0YXRpYyBpbnQgY29tcGxldGVfd29yZChpbnQsIGludCk7CitzdGF0aWMgaW50IHByaW50X2V4cGFuc2lvbnMoc3RydWN0IGVkc3RhdGUgKiwgaW50KTsKKyNkZWZpbmUgY2hhcl9sZW4oYykJKChjKSA8ICcgJyB8fCAoYykgPT0gMHg3RiA/IDIgOiAxKQorc3RhdGljIHZvaWQgeF92aV96b3RjKGludCk7CitzdGF0aWMgdm9pZCB2aV9lcnJvcih2b2lkKTsKK3N0YXRpYyB2b2lkIHZpX21hY3JvX3Jlc2V0KHZvaWQpOworc3RhdGljIGludCB4X3ZpX3B1dGJ1Zihjb25zdCBjaGFyICosIHNpemVfdCk7CisKKyNkZWZpbmUgQ18JMHgxCQkvKiBhIHZhbGlkIGNvbW1hbmQgdGhhdCBpc24ndCBhIE1fLCBFXywgVV8gKi8KKyNkZWZpbmUgTV8JMHgyCQkvKiBtb3ZlbWVudCBjb21tYW5kIChoLCBsLCBldGMuKSAqLworI2RlZmluZSBFXwkweDQJCS8qIGV4dGVuZGVkIGNvbW1hbmQgKGMsIGQsIHkpICovCisjZGVmaW5lIFhfCTB4OAkJLyogbG9uZyBjb21tYW5kIChALCBmLCBGLCB0LCBULCBldGMuKSAqLworI2RlZmluZSBVXwkweDEwCQkvKiBhbiBVTi11bmRvYWJsZSBjb21tYW5kICh0aGF0IGlzbid0IGEgTV8pICovCisjZGVmaW5lIEJfCTB4MjAJCS8qIGJhZCBjb21tYW5kICheQCkgKi8KKyNkZWZpbmUgWl8JMHg0MAkJLyogcmVwZWF0IGNvdW50IGRlZmF1bHRzIHRvIDAgKG5vdCAxKSAqLworI2RlZmluZSBTXwkweDgwCQkvKiBzZWFyY2ggKC8sID8pICovCisKKyNkZWZpbmUgaXNfYmFkKGMpCShjbGFzc2lmeVsoYykmMHg3Zl0mQl8pCisjZGVmaW5lIGlzX2NtZChjKQkoY2xhc3NpZnlbKGMpJjB4N2ZdJihNX3xFX3xDX3xVXykpCisjZGVmaW5lIGlzX21vdmUoYykJKGNsYXNzaWZ5WyhjKSYweDdmXSZNXykKKyNkZWZpbmUgaXNfZXh0ZW5kKGMpCShjbGFzc2lmeVsoYykmMHg3Zl0mRV8pCisjZGVmaW5lIGlzX2xvbmcoYykJKGNsYXNzaWZ5WyhjKSYweDdmXSZYXykKKyNkZWZpbmUgaXNfdW5kb2FibGUoYykJKCEoY2xhc3NpZnlbKGMpJjB4N2ZdJlVfKSkKKyNkZWZpbmUgaXNfc3JjaChjKQkoY2xhc3NpZnlbKGMpJjB4N2ZdJlNfKQorI2RlZmluZSBpc196ZXJvY291bnQoYykJKGNsYXNzaWZ5WyhjKSYweDdmXSZaXykKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2xhc3NpZnlbMTI4XSA9IHsKKy8qCSAwCTEJMgkzCTQJNQk2CTcJKi8KKy8qIDAJXkAJXkEJXkIJXkMJXkQJXkUJXkYJXkcJKi8KKwlCXywJMCwJMCwJMCwJMCwJQ198VV8sCUNffFpfLAkwLAorLyogMQleSAleSQleSgleSwleTAleTQleTgleTwkqLworCU1fLAlDX3xaXywJMCwJMCwJQ198VV8sCTAsCUNfLAkwLAorLyogMgleUAleUQleUgleUwleVAleVQleVgleVwkqLworCUNfLAkwLAlDX3xVXywJMCwJMCwJMCwJQ18sCTAsCisvKiAzCV5YCV5ZCV5aCV5bCV5cCV5dCV5eCV5fCSovCisJQ18sCTAsCTAsCUNffFpfLAkwLAkwLAkwLAkwLAorLyogNAk8c3BhY2U+CSEJIgkjCSQJJQkmCScJKi8KKwlNXywJMCwJMCwJQ18sCU1fLAlNXywJMCwJMCwKKy8qIDUJKAkpCSoJKwksCS0JLgkvCSovCisJMCwJMCwJQ18sCUNfLAlNXywJQ18sCTAsCUNffFNfLAorLyogNgkwCTEJMgkzCTQJNQk2CTcJKi8KKwlNXywJMCwJMCwJMCwJMCwJMCwJMCwJMCwKKy8qIDcJOAk5CToJOwk8CT0JPgk/CSovCisJMCwJMCwJMCwJTV8sCTAsCUNfLAkwLAlDX3xTXywKKy8qIDgJQAlBCUIJQwlECUUJRglHCSovCisJQ198WF8sCUNfLAlNXywJQ18sCUNfLAlNXywJTV98WF8sCUNffFVffFpfLAorLyogOQlICUkJSglLCUwJTQlOCU8JKi8KKwkwLAlDXywJMCwJMCwJMCwJMCwJQ198VV8sCTAsCisvKiBBCVAJUQlSCVMJVAlVCVYJVwkqLworCUNfLAkwLAlDXywJQ18sCU1ffFhfLAlDXywJMCwJTV8sCisvKiBCCVgJWQlaCVsJXAldCV4JXwkqLworCUNfLAlDX3xVXywJMCwJMCwJQ198Wl8sCTAsCU1fLAlDX3xaXywKKy8qIEMJYAlhCWIJYwlkCWUJZglnCSovCisJMCwJQ18sCU1fLAlFXywJRV8sCU1fLAlNX3xYXywJQ198Wl8sCisvKiBECWgJaQlqCWsJbAltCW4JbwkqLworCU1fLAlDXywJQ198VV8sCUNffFVfLAlNXywJMCwJQ198VV8sCTAsCisvKiBFCXAJcQlyCXMJdAl1CXYJdwkqLworCUNfLAkwLAlYXywJQ18sCU1ffFhfLAlDX3xVXywJQ198VV98Wl8sIE1fLAorLyogRgl4CXkJegl7CXwJfQl+CV4/CSovCisJQ18sCUVffFVfLAkwLAkwLAlNX3xaXywJMCwJQ18sCTAKK307CisKKyNkZWZpbmUgTUFYVklDTUQJMworI2RlZmluZSBTUkNITEVOCQk0MAorCisjZGVmaW5lIElOU0VSVAkJMQorI2RlZmluZSBSRVBMQUNFCQkyCisKKyNkZWZpbmUgVk5PUk1BTAkJMAkJLyogY29tbWFuZCwgaW5zZXJ0IG9yIHJlcGxhY2UgbW9kZSAqLworI2RlZmluZSBWQVJHMQkJMQkJLyogZGlnaXQgcHJlZml4IChmaXJzdCwgZWcsIDVsKSAqLworI2RlZmluZSBWRVhUQ01ECQkyCQkvKiBjbWQgKyBtb3ZlbWVudCAoZWcsIGNsKSAqLworI2RlZmluZSBWQVJHMgkJMwkJLyogZGlnaXQgcHJlZml4IChzZWNvbmQsIGVnLCAyYzNsKSAqLworI2RlZmluZSBWWENICQk0CQkvKiBmLCBGLCB0LCBULCBAICovCisjZGVmaW5lIFZGQUlMCQk1CQkvKiBiYWQgY29tbWFuZCAqLworI2RlZmluZSBWQ01ECQk2CQkvKiBzaW5nbGUgY2hhciBjb21tYW5kIChlZywgWCkgKi8KKyNkZWZpbmUgVlJFRE8JCTcJCS8qIC4gKi8KKyNkZWZpbmUgVkxJVAkJOAkJLyogXlYgKi8KKyNkZWZpbmUgVlNFQVJDSAkJOQkJLyogLywgPyAqLworI2RlZmluZSBWVkVSU0lPTgkxMAkJLyogPEVTQz4gXlYgKi8KKworc3RhdGljIGNoYXIJCXVuZG9jYnVmW0xJTkVdOworCitzdGF0aWMgc3RydWN0IGVkc3RhdGUJKnNhdmVfZWRzdGF0ZShzdHJ1Y3QgZWRzdGF0ZSAqb2xkKTsKK3N0YXRpYyB2b2lkCQlyZXN0b3JlX2Vkc3RhdGUoc3RydWN0IGVkc3RhdGUgKm9sZCwgc3RydWN0IGVkc3RhdGUgKm5ld3MpOworc3RhdGljIHZvaWQJCWZyZWVfZWRzdGF0ZShzdHJ1Y3QgZWRzdGF0ZSAqb2xkKTsKKworc3RhdGljIHN0cnVjdCBlZHN0YXRlCWVidWY7CitzdGF0aWMgc3RydWN0IGVkc3RhdGUJdW5kb2J1ZiA9IHsgdW5kb2NidWYsIDAsIExJTkUsIDAsIDAgfTsKKworc3RhdGljIHN0cnVjdCBlZHN0YXRlCSplczsJCQkvKiBjdXJyZW50IGVkaXRvciBzdGF0ZSAqLworc3RhdGljIHN0cnVjdCBlZHN0YXRlCSp1bmRvOworCitzdGF0aWMgY2hhciBpYnVmW0xJTkVdOwkJCS8qIGlucHV0IGJ1ZmZlciAqLworc3RhdGljIGludCBmaXJzdF9pbnNlcnQ7CQkvKiBzZXQgd2hlbiBzdGFydGluZyBpbiBpbnNlcnQgbW9kZSAqLworc3RhdGljIGludCBzYXZlZF9pbnNsZW47CQkvKiBzYXZlZCBpbnNsZW4gZm9yIGZpcnN0IGluc2VydCAqLworc3RhdGljIGludCBpbnNsZW47CQkJLyogbGVuZ3RoIG9mIGlucHV0IGJ1ZmZlciAqLworc3RhdGljIGludCBzcmNobGVuOwkJCS8qIGxlbmd0aCBvZiBjdXJyZW50IHNlYXJjaCBwYXR0ZXJuICovCitzdGF0aWMgY2hhciB5YnVmW0xJTkVdOwkJCS8qIHlhbmsgYnVmZmVyICovCitzdGF0aWMgaW50IHlhbmtsZW47CQkJLyogbGVuZ3RoIG9mIHlhbmsgYnVmZmVyICovCitzdGF0aWMgaW50IGZzYXZlY21kID0gJyAnOwkJLyogbGFzdCBmaW5kIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgZnNhdmVjaDsJCQkvKiBjaGFyYWN0ZXIgdG8gZmluZCAqLworc3RhdGljIGNoYXIgbGFzdGNtZFtNQVhWSUNNRF07CQkvKiBsYXN0IG5vbi1tb3ZlIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgbGFzdGFjOwkJCS8qIGFyZ2NudCBmb3IgbGFzdGNtZCAqLworc3RhdGljIGludCBsYXN0c2VhcmNoID0gJyAnOwkJLyogbGFzdCBzZWFyY2ggY29tbWFuZCAqLworc3RhdGljIGNoYXIgc3JjaHBhdFtTUkNITEVOXTsJCS8qIGxhc3Qgc2VhcmNoIHBhdHRlcm4gKi8KK3N0YXRpYyBpbnQgaW5zZXJ0OwkJCS8qIG5vbi16ZXJvIGluIGluc2VydCBtb2RlICovCitzdGF0aWMgaW50IGhudW07CQkJLyogcG9zaXRpb24gaW4gaGlzdG9yeSAqLworc3RhdGljIGludCBvaG51bTsJCQkvKiBoaXN0b3J5IGxpbmUgY29waWVkIChhZnRlciBtb2QpICovCitzdGF0aWMgaW50IGhsYXN0OwkJCS8qIDEgcGFzdCBsYXN0IHBvc2l0aW9uIGluIGhpc3RvcnkgKi8KK3N0YXRpYyBpbnQgc3RhdGU7CisKKy8qIEluZm9ybWF0aW9uIGZvciBrZWVwaW5nIHRyYWNrIG9mIG1hY3JvcyB0aGF0IGFyZSBiZWluZyBleHBhbmRlZC4KKyAqIFRoZSBmb3JtYXQgb2YgYnVmIGlzIHRoZSBhbGlhcyBjb250ZW50cyBmb2xsb3dlZCBieSBhIE5VTCBieXRlIGZvbGxvd2VkCisgKiBieSB0aGUgbmFtZSAobGV0dGVyKSBvZiB0aGUgYWxpYXMuIFRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBpcyBtYXJrZWQgYnkKKyAqIGEgZG91YmxlIE5VTC4gVGhlIG5hbWUgb2YgdGhlIGFsaWFzIGlzIHN0b3JlZCBzbyByZWN1cnNpdmUgbWFjcm9zIGNhbgorICogYmUgZGV0ZWN0ZWQuCisgKi8KK3N0cnVjdCBtYWNyb19zdGF0ZSB7CisJdW5zaWduZWQgY2hhciAqcDsJLyogY3VycmVudCBwb3NpdGlvbiBpbiBidWYgKi8KKwl1bnNpZ25lZCBjaGFyICpidWY7CS8qIHBvaW50ZXIgdG8gbWFjcm8ocykgYmVpbmcgZXhwYW5kZWQgKi8KKwlpbnQgbGVuOwkJLyogaG93IG11Y2ggZGF0YSBpbiBidWZmZXIgKi8KK307CitzdGF0aWMgc3RydWN0IG1hY3JvX3N0YXRlIG1hY3JvOworCitlbnVtIGV4cGFuZF9tb2RlIHsKKwlOT05FLCBFWFBBTkQsIENPTVBMRVRFLCBQUklOVAorfTsKK3N0YXRpYyBlbnVtIGV4cGFuZF9tb2RlIGV4cGFuZGVkID0gTk9ORTsJLyogbGFzdCBpbnB1dCB3YXMgZXhwYW5kZWQgKi8KKworc3RhdGljIGludAoreF92aShjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaW50IGM7CisKKwlzdGF0ZSA9IFZOT1JNQUw7CisJb2hudW0gPSBobnVtID0gaGxhc3QgPSBoaXN0bnVtKC0xKSArIDE7CisJaW5zZXJ0ID0gSU5TRVJUOworCXNhdmVkX2luc2xlbiA9IGluc2xlbjsKKwlmaXJzdF9pbnNlcnQgPSAxOworCWluc2xlbiA9IDA7CisJdmlfbWFjcm9fcmVzZXQoKTsKKworCWVzID0gJmVidWY7CisJZXMtPmNidWYgPSBidWY7CisJdW5kbyA9ICZ1bmRvYnVmOworCXVuZG8tPmNidWZzaXplID0gZXMtPmNidWZzaXplID0gbGVuID4gTElORSA/IExJTkUgOiBsZW47CisKKwllcy0+bGluZWxlbiA9IHVuZG8tPmxpbmVsZW4gPSAwOworCWVzLT5jdXJzb3IgPSB1bmRvLT5jdXJzb3IgPSAwOworCWVzLT53aW5sZWZ0ID0gdW5kby0+d2lubGVmdCA9IDA7CisKKwljdXJfY29sID0gcHJvbXB0bGVuKHByb21wdCk7CisJcHJvbXB0X3RydW5jID0gKGN1cl9jb2wgLyB4X2NvbHMpICogeF9jb2xzOworCWN1cl9jb2wgLT0gcHJvbXB0X3RydW5jOworCisJcHByb21wdChwcm9tcHQsIDApOworCWlmIChjdXJfY29sID4geF9jb2xzIC0gMyAtIE1JTl9FRElUX1NQQUNFKSB7CisJCXByb21wdF9yZWRyYXcgPSBjdXJfY29sID0gMDsKKwkJeF9wdXRjKCdcbicpOworCX0gZWxzZQorCQlwcm9tcHRfcmVkcmF3ID0gMTsKKwlwd2lkdGggPSBjdXJfY29sOworCisJaWYgKCF3YnVmX2xlbiB8fCB3YnVmX2xlbiAhPSB4X2NvbHMgLSAzKSB7CisJCXdidWZfbGVuID0geF9jb2xzIC0gMzsKKwkJd2J1ZlswXSA9IGFyZXNpemUod2J1ZlswXSwgd2J1Zl9sZW4sIEFQRVJNKTsKKwkJd2J1ZlsxXSA9IGFyZXNpemUod2J1ZlsxXSwgd2J1Zl9sZW4sIEFQRVJNKTsKKwl9CisJKHZvaWQpbWVtc2V0KHdidWZbMF0sICcgJywgd2J1Zl9sZW4pOworCSh2b2lkKW1lbXNldCh3YnVmWzFdLCAnICcsIHdidWZfbGVuKTsKKwl3aW53aWR0aCA9IHhfY29scyAtIHB3aWR0aCAtIDM7CisJd2luID0gMDsKKwltb3JlYyA9ICcgJzsKKwlsYXN0cmVmID0gMTsKKwlob2xkbGVuID0gMDsKKworCWVkaXRtb2RlID0gMjsKKwl4X2ZsdXNoKCk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKG1hY3JvLnApIHsKKwkJCWMgPSAqbWFjcm8ucCsrOworCQkJLyogZW5kIG9mIGN1cnJlbnQgbWFjcm8/ICovCisJCQlpZiAoIWMpIHsKKwkJCQkvKiBtb3JlIG1hY3JvcyBsZWZ0IHRvIGZpbmlzaD8gKi8KKwkJCQlpZiAoKm1hY3JvLnArKykKKwkJCQkJY29udGludWU7CisJCQkJLyogbXVzdCBiZSB0aGUgZW5kIG9mIGFsbCB0aGUgbWFjcm9zICovCisJCQkJdmlfbWFjcm9fcmVzZXQoKTsKKwkJCQljID0geF9nZXRjKCk7CisJCQl9CisJCX0gZWxzZQorCQkJYyA9IHhfZ2V0YygpOworCisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisJCWlmIChzdGF0ZSAhPSBWTElUKSB7CisJCQlpZiAoYyA9PSBlZGNoYXJzLmludHIgfHwgYyA9PSBlZGNoYXJzLnF1aXQpIHsKKwkJCQkvKiBwcmV0ZW5kIHdlIGdvdCBhbiBpbnRlcnJ1cHQgKi8KKwkJCQl4X3ZpX3pvdGMoYyk7CisJCQkJeF9mbHVzaCgpOworCQkJCXRyYXBzaWcoYyA9PSBlZGNoYXJzLmludHIgPyBTSUdJTlQgOiBTSUdRVUlUKTsKKwkJCQl4X21vZGUoZmFsc2UpOworCQkJCXVud2luZChMU0hFTEwpOworCQkJfSBlbHNlIGlmIChjID09IGVkY2hhcnMuZW9mICYmIHN0YXRlICE9IFZWRVJTSU9OKSB7CisJCQkJaWYgKGVzLT5saW5lbGVuID09IDApIHsKKwkJCQkJeF92aV96b3RjKGVkY2hhcnMuZW9mKTsKKwkJCQkJYyA9IC0xOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKHZpX2hvb2soYykpCisJCQlicmVhazsKKwkJeF9mbHVzaCgpOworCX0KKworCXhfcHV0YygnXHInKTsKKwl4X3B1dGMoJ1xuJyk7CisJeF9mbHVzaCgpOworCisJaWYgKGMgPT0gLTEgfHwgKHNzaXplX3QpbGVuIDw9IGVzLT5saW5lbGVuKQorCQlyZXR1cm4gKC0xKTsKKworCWlmIChlcy0+Y2J1ZiAhPSBidWYpCisJCW1lbW1vdmUoYnVmLCBlcy0+Y2J1ZiwgZXMtPmxpbmVsZW4pOworCisJYnVmW2VzLT5saW5lbGVuKytdID0gJ1xuJzsKKworCXJldHVybiAoZXMtPmxpbmVsZW4pOworfQorCitzdGF0aWMgaW50Cit2aV9ob29rKGludCBjaCkKK3sKKwlzdGF0aWMgY2hhciBjdXJjbWRbTUFYVklDTURdLCBsb2NwYXRbU1JDSExFTl07CisJc3RhdGljIGludCBjbWRsZW4sIGFyZ2MxLCBhcmdjMjsKKworCXN3aXRjaCAoc3RhdGUpIHsKKworCWNhc2UgVk5PUk1BTDoKKwkJaWYgKGluc2VydCAhPSAwKSB7CisJCQlpZiAoY2ggPT0gQ3RybCgndicpKSB7CisJCQkJc3RhdGUgPSBWTElUOworCQkJCWNoID0gJ14nOworCQkJfQorCQkJc3dpdGNoICh2aV9pbnNlcnQoY2gpKSB7CisJCQljYXNlIC0xOgorCQkJCXZpX2Vycm9yKCk7CisJCQkJc3RhdGUgPSBWTk9STUFMOworCQkJCWJyZWFrOworCQkJY2FzZSAwOgorCQkJCWlmIChzdGF0ZSA9PSBWTElUKSB7CisJCQkJCWVzLT5jdXJzb3ItLTsKKwkJCQkJcmVmcmVzaCgwKTsKKwkJCQl9IGVsc2UKKwkJCQkJcmVmcmVzaChpbnNlcnQgIT0gMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpCisJCQkJcmV0dXJuICgxKTsKKwkJCWNtZGxlbiA9IDA7CisJCQlhcmdjMSA9IDA7CisJCQlpZiAoY2ggPj0gJzEnICYmIGNoIDw9ICc5JykgeworCQkJCWFyZ2MxID0gY2ggLSAnMCc7CisJCQkJc3RhdGUgPSBWQVJHMTsKKwkJCX0gZWxzZSB7CisJCQkJY3VyY21kW2NtZGxlbisrXSA9IGNoOworCQkJCXN0YXRlID0gbmV4dHN0YXRlKGNoKTsKKwkJCQlpZiAoc3RhdGUgPT0gVlNFQVJDSCkgeworCQkJCQlzYXZlX2NidWYoKTsKKwkJCQkJZXMtPmN1cnNvciA9IDA7CisJCQkJCWVzLT5saW5lbGVuID0gMDsKKwkJCQkJaWYgKGNoID09ICcvJykgeworCQkJCQkJaWYgKHB1dGJ1ZigiLyIsIDEsIDApICE9IDApCisJCQkJCQkJcmV0dXJuICgtMSk7CisJCQkJCX0gZWxzZSBpZiAocHV0YnVmKCI/IiwgMSwgMCkgIT0gMCkKKwkJCQkJCXJldHVybiAoLTEpOworCQkJCQlyZWZyZXNoKDApOworCQkJCX0KKwkJCQlpZiAoc3RhdGUgPT0gVlZFUlNJT04pIHsKKwkJCQkJc2F2ZV9jYnVmKCk7CisJCQkJCWVzLT5jdXJzb3IgPSAwOworCQkJCQllcy0+bGluZWxlbiA9IDA7CisJCQkJCXB1dGJ1ZihLU0hfVkVSU0lPTiwKKwkJCQkJICAgIHN0cmxlbihLU0hfVkVSU0lPTiksIDApOworCQkJCQlyZWZyZXNoKDApOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgVkxJVDoKKwkJaWYgKGlzX2JhZChjaCkpIHsKKwkJCWRlbF9yYW5nZShlcy0+Y3Vyc29yLCBlcy0+Y3Vyc29yICsgMSk7CisJCQl2aV9lcnJvcigpOworCQl9IGVsc2UKKwkJCWVzLT5jYnVmW2VzLT5jdXJzb3IrK10gPSBjaDsKKwkJcmVmcmVzaCgxKTsKKwkJc3RhdGUgPSBWTk9STUFMOworCQlicmVhazsKKworCWNhc2UgVlZFUlNJT046CisJCXJlc3RvcmVfY2J1ZigpOworCQlzdGF0ZSA9IFZOT1JNQUw7CisJCXJlZnJlc2goMCk7CisJCWJyZWFrOworCisJY2FzZSBWQVJHMToKKwkJaWYgKGtzaF9pc2RpZ2l0KGNoKSkKKwkJCWFyZ2MxID0gYXJnYzEgKiAxMCArIGNoIC0gJzAnOworCQllbHNlIHsKKwkJCWN1cmNtZFtjbWRsZW4rK10gPSBjaDsKKwkJCXN0YXRlID0gbmV4dHN0YXRlKGNoKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVkVYVENNRDoKKwkJYXJnYzIgPSAwOworCQlpZiAoY2ggPj0gJzEnICYmIGNoIDw9ICc5JykgeworCQkJYXJnYzIgPSBjaCAtICcwJzsKKwkJCXN0YXRlID0gVkFSRzI7CisJCQlyZXR1cm4gKDApOworCQl9IGVsc2UgeworCQkJY3VyY21kW2NtZGxlbisrXSA9IGNoOworCQkJaWYgKGNoID09IGN1cmNtZFswXSkKKwkJCQlzdGF0ZSA9IFZDTUQ7CisJCQllbHNlIGlmIChpc19tb3ZlKGNoKSkKKwkJCQlzdGF0ZSA9IG5leHRzdGF0ZShjaCk7CisJCQllbHNlCisJCQkJc3RhdGUgPSBWRkFJTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVkFSRzI6CisJCWlmIChrc2hfaXNkaWdpdChjaCkpCisJCQlhcmdjMiA9IGFyZ2MyICogMTAgKyBjaCAtICcwJzsKKwkJZWxzZSB7CisJCQlpZiAoYXJnYzEgPT0gMCkKKwkJCQlhcmdjMSA9IGFyZ2MyOworCQkJZWxzZQorCQkJCWFyZ2MxICo9IGFyZ2MyOworCQkJY3VyY21kW2NtZGxlbisrXSA9IGNoOworCQkJaWYgKGNoID09IGN1cmNtZFswXSkKKwkJCQlzdGF0ZSA9IFZDTUQ7CisJCQllbHNlIGlmIChpc19tb3ZlKGNoKSkKKwkJCQlzdGF0ZSA9IG5leHRzdGF0ZShjaCk7CisJCQllbHNlCisJCQkJc3RhdGUgPSBWRkFJTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVlhDSDoKKwkJaWYgKGNoID09IEN0cmwoJ1snKSkKKwkJCXN0YXRlID0gVk5PUk1BTDsKKwkJZWxzZSB7CisJCQljdXJjbWRbY21kbGVuKytdID0gY2g7CisJCQlzdGF0ZSA9IFZDTUQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFZTRUFSQ0g6CisJCWlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicgLyp8fCBjaCA9PSBDdHJsKCdbJykqLyApIHsKKwkJCXJlc3RvcmVfY2J1ZigpOworCQkJLyogUmVwZWF0IGxhc3Qgc2VhcmNoPyAqLworCQkJaWYgKHNyY2hsZW4gPT0gMCkgeworCQkJCWlmICghc3JjaHBhdFswXSkgeworCQkJCQl2aV9lcnJvcigpOworCQkJCQlzdGF0ZSA9IFZOT1JNQUw7CisJCQkJCXJlZnJlc2goMCk7CisJCQkJCXJldHVybiAoMCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlsb2NwYXRbc3JjaGxlbl0gPSAnXDAnOworCQkJCW1lbWNweShzcmNocGF0LCBsb2NwYXQsIHNyY2hsZW4gKyAxKTsKKwkJCX0KKwkJCXN0YXRlID0gVkNNRDsKKwkJfSBlbHNlIGlmIChjaCA9PSBlZGNoYXJzLmVyYXNlIHx8IGNoID09IEN0cmwoJ2gnKSkgeworCQkJaWYgKHNyY2hsZW4gIT0gMCkgeworCQkJCXNyY2hsZW4tLTsKKwkJCQllcy0+bGluZWxlbiAtPSBjaGFyX2xlbigodW5zaWduZWQgY2hhcilsb2NwYXRbc3JjaGxlbl0pOworCQkJCWVzLT5jdXJzb3IgPSBlcy0+bGluZWxlbjsKKwkJCQlyZWZyZXNoKDApOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlyZXN0b3JlX2NidWYoKTsKKwkJCXN0YXRlID0gVk5PUk1BTDsKKwkJCXJlZnJlc2goMCk7CisJCX0gZWxzZSBpZiAoY2ggPT0gZWRjaGFycy5raWxsKSB7CisJCQlzcmNobGVuID0gMDsKKwkJCWVzLT5saW5lbGVuID0gMTsKKwkJCWVzLT5jdXJzb3IgPSAxOworCQkJcmVmcmVzaCgwKTsKKwkJCXJldHVybiAoMCk7CisJCX0gZWxzZSBpZiAoY2ggPT0gZWRjaGFycy53ZXJhc2UpIHsKKwkJCWludCBpLCBuID0gc3JjaGxlbjsKKwkJCXN0cnVjdCBlZHN0YXRlIG5ld19lcywgKnNhdmVfZXM7CisKKwkJCW5ld19lcy5jdXJzb3IgPSBuOworCQkJbmV3X2VzLmNidWYgPSBsb2NwYXQ7CisKKwkJCXNhdmVfZXMgPSBlczsKKwkJCWVzID0gJm5ld19lczsKKwkJCW4gPSBiYWNrd29yZCgxKTsKKwkJCWVzID0gc2F2ZV9lczsKKworCQkJZm9yIChpID0gc3JjaGxlbjsgLS1pID49IG47ICkKKwkJCQllcy0+bGluZWxlbiAtPSBjaGFyX2xlbigodW5zaWduZWQgY2hhcilsb2NwYXRbaV0pOworCQkJc3JjaGxlbiA9IG47CisJCQllcy0+Y3Vyc29yID0gZXMtPmxpbmVsZW47CisJCQlyZWZyZXNoKDApOworCQkJcmV0dXJuICgwKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzcmNobGVuID09IFNSQ0hMRU4gLSAxKQorCQkJCXZpX2Vycm9yKCk7CisJCQllbHNlIHsKKwkJCQlsb2NwYXRbc3JjaGxlbisrXSA9IGNoOworCQkJCWlmIChjaCA8ICcgJyB8fCBjaCA9PSAweDdmKSB7CisJCQkJCWlmIChlcy0+bGluZWxlbiArIDIgPiBlcy0+Y2J1ZnNpemUpCisJCQkJCQl2aV9lcnJvcigpOworCQkJCQllcy0+Y2J1Zltlcy0+bGluZWxlbisrXSA9ICdeJzsKKwkJCQkJZXMtPmNidWZbZXMtPmxpbmVsZW4rK10gPSBjaCBeICdAJzsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoZXMtPmxpbmVsZW4gPj0gZXMtPmNidWZzaXplKQorCQkJCQkJdmlfZXJyb3IoKTsKKwkJCQkJZXMtPmNidWZbZXMtPmxpbmVsZW4rK10gPSBjaDsKKwkJCQl9CisJCQkJZXMtPmN1cnNvciA9IGVzLT5saW5lbGVuOworCQkJCXJlZnJlc2goMCk7CisJCQl9CisJCQlyZXR1cm4gKDApOworCQl9CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFZDTUQ6CisJCXN0YXRlID0gVk5PUk1BTDsKKwkJc3dpdGNoICh2aV9jbWQoYXJnYzEsIGN1cmNtZCkpIHsKKwkJY2FzZSAtMToKKwkJCXZpX2Vycm9yKCk7CisJCQlyZWZyZXNoKDApOworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCWlmIChpbnNlcnQgIT0gMCkKKwkJCQlpbnNsZW4gPSAwOworCQkJcmVmcmVzaChpbnNlcnQgIT0gMCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcmVmcmVzaCgwKTsKKwkJCXJldHVybiAoMSk7CisJCWNhc2UgMjoKKwkJCS8qIGJhY2sgZnJvbSBhICd2JyBjb21tYW5kIC0gZG9uJ3QgcmVkcmF3IHRoZSBzY3JlZW4gKi8KKwkJCXJldHVybiAoMSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFZSRURPOgorCQlzdGF0ZSA9IFZOT1JNQUw7CisJCWlmIChhcmdjMSAhPSAwKQorCQkJbGFzdGFjID0gYXJnYzE7CisJCXN3aXRjaCAodmlfY21kKGxhc3RhYywgbGFzdGNtZCkpIHsKKwkJY2FzZSAtMToKKwkJCXZpX2Vycm9yKCk7CisJCQlyZWZyZXNoKDApOworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCWlmIChpbnNlcnQgIT0gMCkgeworCQkJCWlmIChsYXN0Y21kWzBdID09ICdzJyB8fCBsYXN0Y21kWzBdID09ICdjJyB8fAorCQkJCSAgICBsYXN0Y21kWzBdID09ICdDJykgeworCQkJCQlpZiAocmVkb19pbnNlcnQoMSkgIT0gMCkKKwkJCQkJCXZpX2Vycm9yKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHJlZG9faW5zZXJ0KGxhc3RhYykgIT0gMCkKKwkJCQkJCXZpX2Vycm9yKCk7CisJCQkJfQorCQkJfQorCQkJcmVmcmVzaCgwKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlyZWZyZXNoKDApOworCQkJcmV0dXJuICgxKTsKKwkJY2FzZSAyOgorCQkJLyogYmFjayBmcm9tIGEgJ3YnIGNvbW1hbmQgLSBjYW4ndCBoYXBwZW4gKi8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBWRkFJTDoKKwkJc3RhdGUgPSBWTk9STUFMOworCQl2aV9lcnJvcigpOworCQlicmVhazsKKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorbmV4dHN0YXRlKGludCBjaCkKK3sKKwlpZiAoaXNfZXh0ZW5kKGNoKSkKKwkJcmV0dXJuIChWRVhUQ01EKTsKKwllbHNlIGlmIChpc19zcmNoKGNoKSkKKwkJcmV0dXJuIChWU0VBUkNIKTsKKwllbHNlIGlmIChpc19sb25nKGNoKSkKKwkJcmV0dXJuIChWWENIKTsKKwllbHNlIGlmIChjaCA9PSAnLicpCisJCXJldHVybiAoVlJFRE8pOworCWVsc2UgaWYgKGNoID09IEN0cmwoJ3YnKSkKKwkJcmV0dXJuIChWVkVSU0lPTik7CisJZWxzZSBpZiAoaXNfY21kKGNoKSkKKwkJcmV0dXJuIChWQ01EKTsKKwllbHNlCisJCXJldHVybiAoVkZBSUwpOworfQorCitzdGF0aWMgaW50Cit2aV9pbnNlcnQoaW50IGNoKQoreworCWludCB0Y3Vyc29yOworCisJaWYgKGNoID09IGVkY2hhcnMuZXJhc2UgfHwgY2ggPT0gQ3RybCgnaCcpKSB7CisJCWlmIChpbnNlcnQgPT0gUkVQTEFDRSkgeworCQkJaWYgKGVzLT5jdXJzb3IgPT0gdW5kby0+Y3Vyc29yKSB7CisJCQkJdmlfZXJyb3IoKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaWYgKGluc2xlbiA+IDApCisJCQkJaW5zbGVuLS07CisJCQllcy0+Y3Vyc29yLS07CisJCQlpZiAoZXMtPmN1cnNvciA+PSB1bmRvLT5saW5lbGVuKQorCQkJCWVzLT5saW5lbGVuLS07CisJCQllbHNlCisJCQkJZXMtPmNidWZbZXMtPmN1cnNvcl0gPSB1bmRvLT5jYnVmW2VzLT5jdXJzb3JdOworCQl9IGVsc2UgeworCQkJaWYgKGVzLT5jdXJzb3IgPT0gMCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKGluc2xlbiA+IDApCisJCQkJaW5zbGVuLS07CisJCQllcy0+Y3Vyc29yLS07CisJCQllcy0+bGluZWxlbi0tOworCQkJbWVtbW92ZSgmZXMtPmNidWZbZXMtPmN1cnNvcl0sICZlcy0+Y2J1Zltlcy0+Y3Vyc29yICsgMV0sCisJCQkgICAgZXMtPmxpbmVsZW4gLSBlcy0+Y3Vyc29yICsgMSk7CisJCX0KKwkJZXhwYW5kZWQgPSBOT05FOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoY2ggPT0gZWRjaGFycy5raWxsKSB7CisJCWlmIChlcy0+Y3Vyc29yICE9IDApIHsKKwkJCWluc2xlbiA9IDA7CisJCQltZW1tb3ZlKGVzLT5jYnVmLCAmZXMtPmNidWZbZXMtPmN1cnNvcl0sCisJCQkgICAgZXMtPmxpbmVsZW4gLSBlcy0+Y3Vyc29yKTsKKwkJCWVzLT5saW5lbGVuIC09IGVzLT5jdXJzb3I7CisJCQllcy0+Y3Vyc29yID0gMDsKKwkJfQorCQlleHBhbmRlZCA9IE5PTkU7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChjaCA9PSBlZGNoYXJzLndlcmFzZSkgeworCQlpZiAoZXMtPmN1cnNvciAhPSAwKSB7CisJCQl0Y3Vyc29yID0gYmFja3dvcmQoMSk7CisJCQltZW1tb3ZlKCZlcy0+Y2J1Zlt0Y3Vyc29yXSwgJmVzLT5jYnVmW2VzLT5jdXJzb3JdLAorCQkJICAgIGVzLT5saW5lbGVuIC0gZXMtPmN1cnNvcik7CisJCQllcy0+bGluZWxlbiAtPSBlcy0+Y3Vyc29yIC0gdGN1cnNvcjsKKwkJCWlmIChpbnNsZW4gPCBlcy0+Y3Vyc29yIC0gdGN1cnNvcikKKwkJCQlpbnNsZW4gPSAwOworCQkJZWxzZQorCQkJCWluc2xlbiAtPSBlcy0+Y3Vyc29yIC0gdGN1cnNvcjsKKwkJCWVzLT5jdXJzb3IgPSB0Y3Vyc29yOworCQl9CisJCWV4cGFuZGVkID0gTk9ORTsKKwkJcmV0dXJuICgwKTsKKwl9CisJLyogSWYgYW55IGNoYXJzIGFyZSBlbnRlcmVkIGJlZm9yZSBlc2NhcGUsIHRyYXNoIHRoZSBzYXZlZCBpbnNlcnQKKwkgKiBidWZmZXIgKGlmIHVzZXIgaW5zZXJ0cyAmIGRlbGV0ZXMgY2hhciwgaWJ1ZiBnZXRzIHRyYXNoZWQgYW5kCisJICogd2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQpCisJICovCisJaWYgKGZpcnN0X2luc2VydCAmJiBjaCAhPSBDdHJsKCdbJykpCisJCXNhdmVkX2luc2xlbiA9IDA7CisJc3dpdGNoIChjaCkgeworCWNhc2UgJ1wwJzoKKwkJcmV0dXJuICgtMSk7CisKKwljYXNlICdccic6CisJY2FzZSAnXG4nOgorCQlyZXR1cm4gKDEpOworCisJY2FzZSBDdHJsKCdbJyk6CisJCWV4cGFuZGVkID0gTk9ORTsKKwkJaWYgKGZpcnN0X2luc2VydCkgeworCQkJZmlyc3RfaW5zZXJ0ID0gMDsKKwkJCWlmIChpbnNsZW4gPT0gMCkgeworCQkJCWluc2xlbiA9IHNhdmVkX2luc2xlbjsKKwkJCQlyZXR1cm4gKHJlZG9faW5zZXJ0KDApKTsKKwkJCX0KKwkJCWxhc3RjbWRbMF0gPSAnYSc7CisJCQlsYXN0YWMgPSAxOworCQl9CisJCWlmIChsYXN0Y21kWzBdID09ICdzJyB8fCBsYXN0Y21kWzBdID09ICdjJyB8fAorCQkgICAgbGFzdGNtZFswXSA9PSAnQycpCisJCQlyZXR1cm4gKHJlZG9faW5zZXJ0KDApKTsKKwkJZWxzZQorCQkJcmV0dXJuIChyZWRvX2luc2VydChsYXN0YWMgLSAxKSk7CisKKwkvKiB7IEJlZ2luIG5vbnN0YW5kYXJkIHZpIGNvbW1hbmRzICovCisJY2FzZSBDdHJsKCd4Jyk6CisJCWV4cGFuZF93b3JkKDApOworCQlicmVhazsKKworCWNhc2UgQ3RybCgnZicpOgorCQljb21wbGV0ZV93b3JkKDAsIDApOworCQlicmVhazsKKworCWNhc2UgQ3RybCgnZScpOgorCQlwcmludF9leHBhbnNpb25zKGVzLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIEN0cmwoJ2knKToKKwkJaWYgKEZsYWcoRlZJVEFCQ09NUExFVEUpKSB7CisJCQljb21wbGV0ZV93b3JkKDAsIDApOworCQkJYnJlYWs7CisJCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KKwkvKiBFbmQgbm9uc3RhbmRhcmQgdmkgY29tbWFuZHMgfSAqLworCisJZGVmYXVsdDoKKwkJaWYgKGVzLT5saW5lbGVuID49IGVzLT5jYnVmc2l6ZSAtIDEpCisJCQlyZXR1cm4gKC0xKTsKKwkJaWJ1ZltpbnNsZW4rK10gPSBjaDsKKwkJaWYgKGluc2VydCA9PSBJTlNFUlQpIHsKKwkJCW1lbW1vdmUoJmVzLT5jYnVmW2VzLT5jdXJzb3IgKyAxXSwgJmVzLT5jYnVmW2VzLT5jdXJzb3JdLAorCQkJICAgIGVzLT5saW5lbGVuIC0gZXMtPmN1cnNvcik7CisJCQllcy0+bGluZWxlbisrOworCQl9CisJCWVzLT5jYnVmW2VzLT5jdXJzb3IrK10gPSBjaDsKKwkJaWYgKGluc2VydCA9PSBSRVBMQUNFICYmIGVzLT5jdXJzb3IgPiBlcy0+bGluZWxlbikKKwkJCWVzLT5saW5lbGVuKys7CisJCWV4cGFuZGVkID0gTk9ORTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAordmlfY21kKGludCBhcmdjbnQsIGNvbnN0IGNoYXIgKmNtZCkKK3sKKwlpbnQgbmN1cnNvcjsKKwlpbnQgY3VyLCBjMSwgYzIsIGMzID0gMDsKKwlpbnQgYW55OworCXN0cnVjdCBlZHN0YXRlICp0OworCisJaWYgKGFyZ2NudCA9PSAwICYmICFpc196ZXJvY291bnQoKmNtZCkpCisJCWFyZ2NudCA9IDE7CisKKwlpZiAoaXNfbW92ZSgqY21kKSkgeworCQlpZiAoKGN1ciA9IGRvbW92ZShhcmdjbnQsIGNtZCwgMCkpID49IDApIHsKKwkJCWlmIChjdXIgPT0gZXMtPmxpbmVsZW4gJiYgY3VyICE9IDApCisJCQkJY3VyLS07CisJCQllcy0+Y3Vyc29yID0gY3VyOworCQl9IGVsc2UKKwkJCXJldHVybiAoLTEpOworCX0gZWxzZSB7CisJCS8qIERvbid0IHNhdmUgc3RhdGUgaW4gbWlkZGxlIG9mIG1hY3JvLi4gKi8KKwkJaWYgKGlzX3VuZG9hYmxlKCpjbWQpICYmICFtYWNyby5wKSB7CisJCQl1bmRvLT53aW5sZWZ0ID0gZXMtPndpbmxlZnQ7CisJCQltZW1tb3ZlKHVuZG8tPmNidWYsIGVzLT5jYnVmLCBlcy0+bGluZWxlbik7CisJCQl1bmRvLT5saW5lbGVuID0gZXMtPmxpbmVsZW47CisJCQl1bmRvLT5jdXJzb3IgPSBlcy0+Y3Vyc29yOworCQkJbGFzdGFjID0gYXJnY250OworCQkJbWVtbW92ZShsYXN0Y21kLCBjbWQsIE1BWFZJQ01EKTsKKwkJfQorCQlzd2l0Y2ggKCpjbWQpIHsKKworCQljYXNlIEN0cmwoJ2wnKToKKwkJY2FzZSBDdHJsKCdyJyk6CisJCQlyZWRyYXdfbGluZSgxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ0AnOgorCQkJeworCQkJCXN0YXRpYyBjaGFyIGFsaWFzW10gPSAiX1wwIjsKKwkJCQlzdHJ1Y3QgdGJsICphcDsKKwkJCQlpbnQgb2xlbiwgbmxlbjsKKwkJCQljaGFyICpwLCAqbmJ1ZjsKKworCQkJCS8qIGxvb2t1cCBsZXR0ZXIgaW4gYWxpYXMgbGlzdC4uLiAqLworCQkJCWFsaWFzWzFdID0gY21kWzFdOworCQkJCWFwID0ga3RzZWFyY2goJmFsaWFzZXMsIGFsaWFzLCBoYXNoKGFsaWFzKSk7CisJCQkJaWYgKCFjbWRbMV0gfHwgIWFwIHx8ICEoYXAtPmZsYWcgJiBJU1NFVCkpCisJCQkJCXJldHVybiAoLTEpOworCQkJCS8qIGNoZWNrIGlmIHRoaXMgaXMgYSByZWN1cnNpdmUgY2FsbC4uLiAqLworCQkJCWlmICgocCA9IChjaGFyICopbWFjcm8ucCkpCisJCQkJCXdoaWxlICgocCA9IHN0cm51bChwKSkgJiYgcFsxXSkKKwkJCQkJCWlmICgqKytwID09IGNtZFsxXSkKKwkJCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQkvKiBpbnNlcnQgYWxpYXMgaW50byBtYWNybyBidWZmZXIgKi8KKwkJCQlubGVuID0gc3RybGVuKGFwLT52YWwucykgKyAxOworCQkJCW9sZW4gPSAhbWFjcm8ucCA/IDIgOgorCQkJCSAgICBtYWNyby5sZW4gLSAobWFjcm8ucCAtIG1hY3JvLmJ1Zik7CisJCQkJbmJ1ZiA9IGFsbG9jKG5sZW4gKyAxICsgb2xlbiwgQVBFUk0pOworCQkJCW1lbWNweShuYnVmLCBhcC0+dmFsLnMsIG5sZW4pOworCQkJCW5idWZbbmxlbisrXSA9IGNtZFsxXTsKKwkJCQlpZiAobWFjcm8ucCkgeworCQkJCQltZW1jcHkobmJ1ZiArIG5sZW4sIG1hY3JvLnAsIG9sZW4pOworCQkJCQlhZnJlZShtYWNyby5idWYsIEFQRVJNKTsKKwkJCQkJbmxlbiArPSBvbGVuOworCQkJCX0gZWxzZSB7CisJCQkJCW5idWZbbmxlbisrXSA9ICdcMCc7CisJCQkJCW5idWZbbmxlbisrXSA9ICdcMCc7CisJCQkJfQorCQkJCW1hY3JvLnAgPSBtYWNyby5idWYgPSAodW5zaWduZWQgY2hhciAqKW5idWY7CisJCQkJbWFjcm8ubGVuID0gbmxlbjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJ2EnOgorCQkJbW9kaWZpZWQgPSAxOworCQkJaG51bSA9IGhsYXN0OworCQkJaWYgKGVzLT5saW5lbGVuICE9IDApCisJCQkJZXMtPmN1cnNvcisrOworCQkJaW5zZXJ0ID0gSU5TRVJUOworCQkJYnJlYWs7CisKKwkJY2FzZSAnQSc6CisJCQltb2RpZmllZCA9IDE7CisJCQlobnVtID0gaGxhc3Q7CisJCQlkZWxfcmFuZ2UoMCwgMCk7CisJCQllcy0+Y3Vyc29yID0gZXMtPmxpbmVsZW47CisJCQlpbnNlcnQgPSBJTlNFUlQ7CisJCQlicmVhazsKKworCQljYXNlICdTJzoKKwkJCWVzLT5jdXJzb3IgPSBkb21vdmUoMSwgIl4iLCAxKTsKKwkJCWRlbF9yYW5nZShlcy0+Y3Vyc29yLCBlcy0+bGluZWxlbik7CisJCQltb2RpZmllZCA9IDE7CisJCQlobnVtID0gaGxhc3Q7CisJCQlpbnNlcnQgPSBJTlNFUlQ7CisJCQlicmVhazsKKworCQljYXNlICdZJzoKKwkJCWNtZCA9ICJ5JCI7CisJCQkvKiBhaGhoaGhoLi4uICovCisJCWNhc2UgJ2MnOgorCQljYXNlICdkJzoKKwkJY2FzZSAneSc6CisJCQlpZiAoKmNtZCA9PSBjbWRbMV0pIHsKKwkJCQljMSA9ICpjbWQgPT0gJ2MnID8gZG9tb3ZlKDEsICJeIiwgMSkgOiAwOworCQkJCWMyID0gZXMtPmxpbmVsZW47CisJCQl9IGVsc2UgaWYgKCFpc19tb3ZlKGNtZFsxXSkpCisJCQkJcmV0dXJuICgtMSk7CisJCQllbHNlIHsKKwkJCQlpZiAoKG5jdXJzb3IgPSBkb21vdmUoYXJnY250LCAmY21kWzFdLCAxKSkgPCAwKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQlpZiAoKmNtZCA9PSAnYycgJiYKKwkJCQkgICAgKGNtZFsxXSA9PSAndycgfHwgY21kWzFdID09ICdXJykgJiYKKwkJCQkgICAgIWtzaF9pc3NwYWNlKGVzLT5jYnVmW2VzLT5jdXJzb3JdKSkgeworCQkJCQlkbyB7CisJCQkJCQktLW5jdXJzb3I7CisJCQkJCX0gd2hpbGUgKGtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSk7CisJCQkJCW5jdXJzb3IrKzsKKwkJCQl9CisJCQkJaWYgKG5jdXJzb3IgPiBlcy0+Y3Vyc29yKSB7CisJCQkJCWMxID0gZXMtPmN1cnNvcjsKKwkJCQkJYzIgPSBuY3Vyc29yOworCQkJCX0gZWxzZSB7CisJCQkJCWMxID0gbmN1cnNvcjsKKwkJCQkJYzIgPSBlcy0+Y3Vyc29yOworCQkJCQlpZiAoY21kWzFdID09ICclJykKKwkJCQkJCWMyKys7CisJCQkJfQorCQkJfQorCQkJaWYgKCpjbWQgIT0gJ2MnICYmIGMxICE9IGMyKQorCQkJCXlhbmtfcmFuZ2UoYzEsIGMyKTsKKwkJCWlmICgqY21kICE9ICd5JykgeworCQkJCWRlbF9yYW5nZShjMSwgYzIpOworCQkJCWVzLT5jdXJzb3IgPSBjMTsKKwkJCX0KKwkJCWlmICgqY21kID09ICdjJykgeworCQkJCW1vZGlmaWVkID0gMTsKKwkJCQlobnVtID0gaGxhc3Q7CisJCQkJaW5zZXJ0ID0gSU5TRVJUOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAncCc6CisJCQltb2RpZmllZCA9IDE7CisJCQlobnVtID0gaGxhc3Q7CisJCQlpZiAoZXMtPmxpbmVsZW4gIT0gMCkKKwkJCQllcy0+Y3Vyc29yKys7CisJCQl3aGlsZSAocHV0YnVmKHlidWYsIHlhbmtsZW4sIDApID09IDAgJiYgLS1hcmdjbnQgPiAwKQorCQkJCTsKKwkJCWlmIChlcy0+Y3Vyc29yICE9IDApCisJCQkJZXMtPmN1cnNvci0tOworCQkJaWYgKGFyZ2NudCAhPSAwKQorCQkJCXJldHVybiAoLTEpOworCQkJYnJlYWs7CisKKwkJY2FzZSAnUCc6CisJCQltb2RpZmllZCA9IDE7CisJCQlobnVtID0gaGxhc3Q7CisJCQlhbnkgPSAwOworCQkJd2hpbGUgKHB1dGJ1Zih5YnVmLCB5YW5rbGVuLCAwKSA9PSAwICYmIC0tYXJnY250ID4gMCkKKwkJCQlhbnkgPSAxOworCQkJaWYgKGFueSAmJiBlcy0+Y3Vyc29yICE9IDApCisJCQkJZXMtPmN1cnNvci0tOworCQkJaWYgKGFyZ2NudCAhPSAwKQorCQkJCXJldHVybiAoLTEpOworCQkJYnJlYWs7CisKKwkJY2FzZSAnQyc6CisJCQltb2RpZmllZCA9IDE7CisJCQlobnVtID0gaGxhc3Q7CisJCQlkZWxfcmFuZ2UoZXMtPmN1cnNvciwgZXMtPmxpbmVsZW4pOworCQkJaW5zZXJ0ID0gSU5TRVJUOworCQkJYnJlYWs7CisKKwkJY2FzZSAnRCc6CisJCQl5YW5rX3JhbmdlKGVzLT5jdXJzb3IsIGVzLT5saW5lbGVuKTsKKwkJCWRlbF9yYW5nZShlcy0+Y3Vyc29yLCBlcy0+bGluZWxlbik7CisJCQlpZiAoZXMtPmN1cnNvciAhPSAwKQorCQkJCWVzLT5jdXJzb3ItLTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2cnOgorCQkJaWYgKCFhcmdjbnQpCisJCQkJYXJnY250ID0gaGxhc3Q7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlICdHJzoKKwkJCWlmICghYXJnY250KQorCQkJCWFyZ2NudCA9IDE7CisJCQllbHNlCisJCQkJYXJnY250ID0gaGxhc3QgLSAoc291cmNlLT5saW5lIC0gYXJnY250KTsKKwkJCWlmIChncmFiaGlzdChtb2RpZmllZCwgYXJnY250IC0gMSkgPCAwKQorCQkJCXJldHVybiAoLTEpOworCQkJZWxzZSB7CisJCQkJbW9kaWZpZWQgPSAwOworCQkJCWhudW0gPSBhcmdjbnQgLSAxOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnaSc6CisJCQltb2RpZmllZCA9IDE7CisJCQlobnVtID0gaGxhc3Q7CisJCQlpbnNlcnQgPSBJTlNFUlQ7CisJCQlicmVhazsKKworCQljYXNlICdJJzoKKwkJCW1vZGlmaWVkID0gMTsKKwkJCWhudW0gPSBobGFzdDsKKwkJCWVzLT5jdXJzb3IgPSBkb21vdmUoMSwgIl4iLCAxKTsKKwkJCWluc2VydCA9IElOU0VSVDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2onOgorCQljYXNlICcrJzoKKwkJY2FzZSBDdHJsKCduJyk6CisJCQlpZiAoZ3JhYmhpc3QobW9kaWZpZWQsIGhudW0gKyBhcmdjbnQpIDwgMCkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWVsc2UgeworCQkJCW1vZGlmaWVkID0gMDsKKwkJCQlobnVtICs9IGFyZ2NudDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJ2snOgorCQljYXNlICctJzoKKwkJY2FzZSBDdHJsKCdwJyk6CisJCQlpZiAoZ3JhYmhpc3QobW9kaWZpZWQsIGhudW0gLSBhcmdjbnQpIDwgMCkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWVsc2UgeworCQkJCW1vZGlmaWVkID0gMDsKKwkJCQlobnVtIC09IGFyZ2NudDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJ3InOgorCQkJaWYgKGVzLT5saW5lbGVuID09IDApCisJCQkJcmV0dXJuICgtMSk7CisJCQltb2RpZmllZCA9IDE7CisJCQlobnVtID0gaGxhc3Q7CisJCQlpZiAoY21kWzFdID09IDApCisJCQkJdmlfZXJyb3IoKTsKKwkJCWVsc2UgeworCQkJCWludCBuOworCisJCQkJaWYgKGVzLT5jdXJzb3IgKyBhcmdjbnQgPiBlcy0+bGluZWxlbikKKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJZm9yIChuID0gMDsgbiA8IGFyZ2NudDsgKytuKQorCQkJCQllcy0+Y2J1Zltlcy0+Y3Vyc29yICsgbl0gPSBjbWRbMV07CisJCQkJZXMtPmN1cnNvciArPSBuIC0gMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJ1InOgorCQkJbW9kaWZpZWQgPSAxOworCQkJaG51bSA9IGhsYXN0OworCQkJaW5zZXJ0ID0gUkVQTEFDRTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3MnOgorCQkJaWYgKGVzLT5saW5lbGVuID09IDApCisJCQkJcmV0dXJuICgtMSk7CisJCQltb2RpZmllZCA9IDE7CisJCQlobnVtID0gaGxhc3Q7CisJCQlpZiAoZXMtPmN1cnNvciArIGFyZ2NudCA+IGVzLT5saW5lbGVuKQorCQkJCWFyZ2NudCA9IGVzLT5saW5lbGVuIC0gZXMtPmN1cnNvcjsKKwkJCWRlbF9yYW5nZShlcy0+Y3Vyc29yLCBlcy0+Y3Vyc29yICsgYXJnY250KTsKKwkJCWluc2VydCA9IElOU0VSVDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3YnOgorCQkJaWYgKCFhcmdjbnQpIHsKKwkJCQlpZiAoZXMtPmxpbmVsZW4gPT0gMCkKKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJaWYgKG1vZGlmaWVkKSB7CisJCQkJCWVzLT5jYnVmW2VzLT5saW5lbGVuXSA9ICdcMCc7CisJCQkJCWhpc3RzYXZlKCZzb3VyY2UtPmxpbmUsIGVzLT5jYnVmLCB0cnVlLAorCQkJCQkgICAgdHJ1ZSk7CisJCQkJfSBlbHNlCisJCQkJCWFyZ2NudCA9IHNvdXJjZS0+bGluZSArIDEgLQorCQkJCQkgICAgKGhsYXN0IC0gaG51bSk7CisJCQl9CisJCQlpZiAoYXJnY250KQorCQkJCXNoZl9zbnByaW50Zihlcy0+Y2J1ZiwgZXMtPmNidWZzaXplLCAiJXMgJWQiLAorCQkJCSAgICAiZmMgLWUgJHtWSVNVQUw6LSR7RURJVE9SOi12aX19IC0tIiwKKwkJCQkgICAgYXJnY250KTsKKwkJCWVsc2UKKwkJCQlzdHJsY3B5KGVzLT5jYnVmLAorCQkJCSAgICAiZmMgLWUgJHtWSVNVQUw6LSR7RURJVE9SOi12aX19IC0tIiwKKwkJCQkgICAgZXMtPmNidWZzaXplKTsKKwkJCWVzLT5saW5lbGVuID0gc3RybGVuKGVzLT5jYnVmKTsKKwkJCXJldHVybiAoMik7CisKKwkJY2FzZSAneCc6CisJCQlpZiAoZXMtPmxpbmVsZW4gPT0gMCkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCW1vZGlmaWVkID0gMTsKKwkJCWhudW0gPSBobGFzdDsKKwkJCWlmIChlcy0+Y3Vyc29yICsgYXJnY250ID4gZXMtPmxpbmVsZW4pCisJCQkJYXJnY250ID0gZXMtPmxpbmVsZW4gLSBlcy0+Y3Vyc29yOworCQkJeWFua19yYW5nZShlcy0+Y3Vyc29yLCBlcy0+Y3Vyc29yICsgYXJnY250KTsKKwkJCWRlbF9yYW5nZShlcy0+Y3Vyc29yLCBlcy0+Y3Vyc29yICsgYXJnY250KTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1gnOgorCQkJaWYgKGVzLT5jdXJzb3IgPiAwKSB7CisJCQkJbW9kaWZpZWQgPSAxOworCQkJCWhudW0gPSBobGFzdDsKKwkJCQlpZiAoZXMtPmN1cnNvciA8IGFyZ2NudCkKKwkJCQkJYXJnY250ID0gZXMtPmN1cnNvcjsKKwkJCQl5YW5rX3JhbmdlKGVzLT5jdXJzb3IgLSBhcmdjbnQsIGVzLT5jdXJzb3IpOworCQkJCWRlbF9yYW5nZShlcy0+Y3Vyc29yIC0gYXJnY250LCBlcy0+Y3Vyc29yKTsKKwkJCQllcy0+Y3Vyc29yIC09IGFyZ2NudDsKKwkJCX0gZWxzZQorCQkJCXJldHVybiAoLTEpOworCQkJYnJlYWs7CisKKwkJY2FzZSAndSc6CisJCQl0ID0gZXM7CisJCQllcyA9IHVuZG87CisJCQl1bmRvID0gdDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1UnOgorCQkJaWYgKCFtb2RpZmllZCkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWlmIChncmFiaGlzdChtb2RpZmllZCwgb2hudW0pIDwgMCkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCW1vZGlmaWVkID0gMDsKKwkJCWhudW0gPSBvaG51bTsKKwkJCWJyZWFrOworCisJCWNhc2UgJz8nOgorCQkJaWYgKGhudW0gPT0gaGxhc3QpCisJCQkJaG51bSA9IC0xOworCQkJLyogYWhoaCAqLworCQljYXNlICcvJzoKKwkJCWMzID0gMTsKKwkJCXNyY2hsZW4gPSAwOworCQkJbGFzdHNlYXJjaCA9ICpjbWQ7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlICduJzoKKwkJY2FzZSAnTic6CisJCQlpZiAobGFzdHNlYXJjaCA9PSAnICcpCisJCQkJcmV0dXJuICgtMSk7CisJCQlpZiAobGFzdHNlYXJjaCA9PSAnPycpCisJCQkJYzEgPSAxOworCQkJZWxzZQorCQkJCWMxID0gMDsKKwkJCWlmICgqY21kID09ICdOJykKKwkJCQljMSA9ICFjMTsKKwkJCWlmICgoYzIgPSBncmFic2VhcmNoKG1vZGlmaWVkLCBobnVtLAorCQkJICAgIGMxLCBzcmNocGF0KSkgPCAwKSB7CisJCQkJaWYgKGMzKSB7CisJCQkJCXJlc3RvcmVfY2J1ZigpOworCQkJCQlyZWZyZXNoKDApOworCQkJCX0KKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0gZWxzZSB7CisJCQkJbW9kaWZpZWQgPSAwOworCQkJCWhudW0gPSBjMjsKKwkJCQlvaG51bSA9IGhudW07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnXyc6CisJCQl7CisJCQkJaW50IGluc3BhY2U7CisJCQkJY2hhciAqcCwgKnNwOworCisJCQkJaWYgKGhpc3RudW0oLTEpIDwgMCkKKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJcCA9ICpoaXN0cG9zKCk7CisjZGVmaW5lIGlzc3AoYykJCShrc2hfaXNzcGFjZShjKSB8fCAoYykgPT0gJ1xuJykKKwkJCQlpZiAoYXJnY250KSB7CisJCQkJCXdoaWxlICgqcCAmJiBpc3NwKCpwKSkKKwkJCQkJCXArKzsKKwkJCQkJd2hpbGUgKCpwICYmIC0tYXJnY250KSB7CisJCQkJCQl3aGlsZSAoKnAgJiYgIWlzc3AoKnApKQorCQkJCQkJCXArKzsKKwkJCQkJCXdoaWxlICgqcCAmJiBpc3NwKCpwKSkKKwkJCQkJCQlwKys7CisJCQkJCX0KKwkJCQkJaWYgKCEqcCkKKwkJCQkJCXJldHVybiAoLTEpOworCQkJCQlzcCA9IHA7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3AgPSBwOworCQkJCQlpbnNwYWNlID0gMDsKKwkJCQkJd2hpbGUgKCpwKSB7CisJCQkJCQlpZiAoaXNzcCgqcCkpCisJCQkJCQkJaW5zcGFjZSA9IDE7CisJCQkJCQllbHNlIGlmIChpbnNwYWNlKSB7CisJCQkJCQkJaW5zcGFjZSA9IDA7CisJCQkJCQkJc3AgPSBwOworCQkJCQkJfQorCQkJCQkJcCsrOworCQkJCQl9CisJCQkJCXAgPSBzcDsKKwkJCQl9CisJCQkJbW9kaWZpZWQgPSAxOworCQkJCWhudW0gPSBobGFzdDsKKwkJCQlpZiAoZXMtPmN1cnNvciAhPSBlcy0+bGluZWxlbikKKwkJCQkJZXMtPmN1cnNvcisrOworCQkJCXdoaWxlICgqcCAmJiAhaXNzcCgqcCkpIHsKKwkJCQkJYXJnY250Kys7CisJCQkJCXArKzsKKwkJCQl9CisJCQkJaWYgKHB1dGJ1ZigiICIsIDEsIDApICE9IDApCisJCQkJCWFyZ2NudCA9IC0xOworCQkJCWVsc2UgaWYgKHB1dGJ1ZihzcCwgYXJnY250LCAwKSAhPSAwKQorCQkJCQlhcmdjbnQgPSAtMTsKKwkJCQlpZiAoYXJnY250IDwgMCkgeworCQkJCQlpZiAoZXMtPmN1cnNvciAhPSAwKQorCQkJCQkJZXMtPmN1cnNvci0tOworCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQl9CisJCQkJaW5zZXJ0ID0gSU5TRVJUOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnfic6CisJCQl7CisJCQkJY2hhciAqcDsKKwkJCQlpbnQgaTsKKworCQkJCWlmIChlcy0+bGluZWxlbiA9PSAwKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgYXJnY250OyBpKyspIHsKKwkJCQkJcCA9ICZlcy0+Y2J1Zltlcy0+Y3Vyc29yXTsKKwkJCQkJaWYgKGtzaF9pc2xvd2VyKCpwKSkgeworCQkJCQkJbW9kaWZpZWQgPSAxOworCQkJCQkJaG51bSA9IGhsYXN0OworCQkJCQkJKnAgPSBrc2hfdG91cHBlcigqcCk7CisJCQkJCX0gZWxzZSBpZiAoa3NoX2lzdXBwZXIoKnApKSB7CisJCQkJCQltb2RpZmllZCA9IDE7CisJCQkJCQlobnVtID0gaGxhc3Q7CisJCQkJCQkqcCA9IGtzaF90b2xvd2VyKCpwKTsKKwkJCQkJfQorCQkJCQlpZiAoZXMtPmN1cnNvciA8IGVzLT5saW5lbGVuIC0gMSkKKwkJCQkJCWVzLT5jdXJzb3IrKzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSAnIyc6CisJCQl7CisJCQkJaW50IHJldCA9IHhfZG9fY29tbWVudChlcy0+Y2J1ZiwgZXMtPmNidWZzaXplLAorCQkJCSAgICAmZXMtPmxpbmVsZW4pOworCQkJCWlmIChyZXQgPj0gMCkKKwkJCQkJZXMtPmN1cnNvciA9IDA7CisJCQkJcmV0dXJuIChyZXQpOworCQkJfQorCisJCWNhc2UgJz0nOgkJCS8qIEFUJlQga3NoICovCisJCWNhc2UgQ3RybCgnZScpOgkJCS8qIE5vbnN0YW5kYXJkIHZpL2tzaCAqLworCQkJcHJpbnRfZXhwYW5zaW9ucyhlcywgMSk7CisJCQlicmVhazsKKworCisJCWNhc2UgQ3RybCgnaScpOgkJCS8qIE5vbnN0YW5kYXJkIHZpL2tzaCAqLworCQkJaWYgKCFGbGFnKEZWSVRBQkNPTVBMRVRFKSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWNvbXBsZXRlX3dvcmQoMSwgYXJnY250KTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ3RybCgnWycpOgkJCS8qIHNvbWUgYW5ub3lpbmcgQVQmVCBrc2hzICovCisJCQlpZiAoIUZsYWcoRlZJRVNDQ09NUExFVEUpKQorCQkJCXJldHVybiAoLTEpOworCQljYXNlICdcXCc6CQkJLyogQVQmVCBrc2ggKi8KKwkJY2FzZSBDdHJsKCdmJyk6CQkJLyogTm9uc3RhbmRhcmQgdmkva3NoICovCisJCQljb21wbGV0ZV93b3JkKDEsIGFyZ2NudCk7CisJCQlicmVhazsKKworCisJCWNhc2UgJyonOgkJCS8qIEFUJlQga3NoICovCisJCWNhc2UgQ3RybCgneCcpOgkJCS8qIE5vbnN0YW5kYXJkIHZpL2tzaCAqLworCQkJZXhwYW5kX3dvcmQoMSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoaW5zZXJ0ID09IDAgJiYgZXMtPmN1cnNvciAhPSAwICYmIGVzLT5jdXJzb3IgPj0gZXMtPmxpbmVsZW4pCisJCQllcy0+Y3Vyc29yLS07CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2RvbW92ZShpbnQgYXJnY250LCBjb25zdCBjaGFyICpjbWQsIGludCBzdWIpCit7CisJaW50IGJjb3VudCwgaSA9IDAsIHQ7CisJaW50IG5jdXJzb3IgPSAwOworCisJc3dpdGNoICgqY21kKSB7CisJY2FzZSAnYic6CisJCWlmICghc3ViICYmIGVzLT5jdXJzb3IgPT0gMCkKKwkJCXJldHVybiAoLTEpOworCQluY3Vyc29yID0gYmFja3dvcmQoYXJnY250KTsKKwkJYnJlYWs7CisKKwljYXNlICdCJzoKKwkJaWYgKCFzdWIgJiYgZXMtPmN1cnNvciA9PSAwKQorCQkJcmV0dXJuICgtMSk7CisJCW5jdXJzb3IgPSBCYWNrd29yZChhcmdjbnQpOworCQlicmVhazsKKworCWNhc2UgJ2UnOgorCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yICsgMSA+PSBlcy0+bGluZWxlbikKKwkJCXJldHVybiAoLTEpOworCQluY3Vyc29yID0gZW5kd29yZChhcmdjbnQpOworCQlpZiAoc3ViICYmIG5jdXJzb3IgPCBlcy0+bGluZWxlbikKKwkJCW5jdXJzb3IrKzsKKwkJYnJlYWs7CisKKwljYXNlICdFJzoKKwkJaWYgKCFzdWIgJiYgZXMtPmN1cnNvciArIDEgPj0gZXMtPmxpbmVsZW4pCisJCQlyZXR1cm4gKC0xKTsKKwkJbmN1cnNvciA9IEVuZHdvcmQoYXJnY250KTsKKwkJaWYgKHN1YiAmJiBuY3Vyc29yIDwgZXMtPmxpbmVsZW4pCisJCQluY3Vyc29yKys7CisJCWJyZWFrOworCisJY2FzZSAnZic6CisJY2FzZSAnRic6CisJY2FzZSAndCc6CisJY2FzZSAnVCc6CisJCWZzYXZlY21kID0gKmNtZDsKKwkJZnNhdmVjaCA9IGNtZFsxXTsKKwkJLyogZHJvcCB0aHJvdWdoICovCisKKwljYXNlICcsJzoKKwljYXNlICc7JzoKKwkJaWYgKGZzYXZlY21kID09ICcgJykKKwkJCXJldHVybiAoLTEpOworCQlpID0gZnNhdmVjbWQgPT0gJ2YnIHx8IGZzYXZlY21kID09ICdGJzsKKwkJdCA9IGZzYXZlY21kID4gJ2EnOworCQlpZiAoKmNtZCA9PSAnLCcpCisJCQl0ID0gIXQ7CisJCWlmICgobmN1cnNvciA9IGZpbmRjaChmc2F2ZWNoLCBhcmdjbnQsIHQsIGkpKSA8IDApCisJCQlyZXR1cm4gKC0xKTsKKwkJaWYgKHN1YiAmJiB0KQorCQkJbmN1cnNvcisrOworCQlicmVhazsKKworCWNhc2UgJ2gnOgorCWNhc2UgQ3RybCgnaCcpOgorCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yID09IDApCisJCQlyZXR1cm4gKC0xKTsKKwkJbmN1cnNvciA9IGVzLT5jdXJzb3IgLSBhcmdjbnQ7CisJCWlmIChuY3Vyc29yIDwgMCkKKwkJCW5jdXJzb3IgPSAwOworCQlicmVhazsKKworCWNhc2UgJyAnOgorCWNhc2UgJ2wnOgorCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yICsgMSA+PSBlcy0+bGluZWxlbikKKwkJCXJldHVybiAoLTEpOworCQlpZiAoZXMtPmxpbmVsZW4gIT0gMCkgeworCQkJbmN1cnNvciA9IGVzLT5jdXJzb3IgKyBhcmdjbnQ7CisJCQlpZiAobmN1cnNvciA+IGVzLT5saW5lbGVuKQorCQkJCW5jdXJzb3IgPSBlcy0+bGluZWxlbjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgJ3cnOgorCQlpZiAoIXN1YiAmJiBlcy0+Y3Vyc29yICsgMSA+PSBlcy0+bGluZWxlbikKKwkJCXJldHVybiAoLTEpOworCQluY3Vyc29yID0gZm9yd3dvcmQoYXJnY250KTsKKwkJYnJlYWs7CisKKwljYXNlICdXJzoKKwkJaWYgKCFzdWIgJiYgZXMtPmN1cnNvciArIDEgPj0gZXMtPmxpbmVsZW4pCisJCQlyZXR1cm4gKC0xKTsKKwkJbmN1cnNvciA9IEZvcnd3b3JkKGFyZ2NudCk7CisJCWJyZWFrOworCisJY2FzZSAnMCc6CisJCW5jdXJzb3IgPSAwOworCQlicmVhazsKKworCWNhc2UgJ14nOgorCQluY3Vyc29yID0gMDsKKwkJd2hpbGUgKG5jdXJzb3IgPCBlcy0+bGluZWxlbiAtIDEgJiYKKwkJICAgIGtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCW5jdXJzb3IrKzsKKwkJYnJlYWs7CisKKwljYXNlICd8JzoKKwkJbmN1cnNvciA9IGFyZ2NudDsKKwkJaWYgKG5jdXJzb3IgPiBlcy0+bGluZWxlbikKKwkJCW5jdXJzb3IgPSBlcy0+bGluZWxlbjsKKwkJaWYgKG5jdXJzb3IpCisJCQluY3Vyc29yLS07CisJCWJyZWFrOworCisJY2FzZSAnJCc6CisJCWlmIChlcy0+bGluZWxlbiAhPSAwKQorCQkJbmN1cnNvciA9IGVzLT5saW5lbGVuOworCQllbHNlCisJCQluY3Vyc29yID0gMDsKKwkJYnJlYWs7CisKKwljYXNlICclJzoKKwkJbmN1cnNvciA9IGVzLT5jdXJzb3I7CisJCXdoaWxlIChuY3Vyc29yIDwgZXMtPmxpbmVsZW4gJiYKKwkJICAgIChpID0gYnJhY2t0eXBlKGVzLT5jYnVmW25jdXJzb3JdKSkgPT0gMCkKKwkJCW5jdXJzb3IrKzsKKwkJaWYgKG5jdXJzb3IgPT0gZXMtPmxpbmVsZW4pCisJCQlyZXR1cm4gKC0xKTsKKwkJYmNvdW50ID0gMTsKKwkJZG8geworCQkJaWYgKGkgPiAwKSB7CisJCQkJaWYgKCsrbmN1cnNvciA+PSBlcy0+bGluZWxlbikKKwkJCQkJcmV0dXJuICgtMSk7CisJCQl9IGVsc2UgeworCQkJCWlmICgtLW5jdXJzb3IgPCAwKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkJCXQgPSBicmFja3R5cGUoZXMtPmNidWZbbmN1cnNvcl0pOworCQkJaWYgKHQgPT0gaSkKKwkJCQliY291bnQrKzsKKwkJCWVsc2UgaWYgKHQgPT0gLWkpCisJCQkJYmNvdW50LS07CisJCX0gd2hpbGUgKGJjb3VudCAhPSAwKTsKKwkJaWYgKHN1YiAmJiBpID4gMCkKKwkJCW5jdXJzb3IrKzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKC0xKTsKKwl9CisJcmV0dXJuIChuY3Vyc29yKTsKK30KKworc3RhdGljIGludAorcmVkb19pbnNlcnQoaW50IGNvdW50KQoreworCXdoaWxlIChjb3VudC0tID4gMCkKKwkJaWYgKHB1dGJ1ZihpYnVmLCBpbnNsZW4sIGluc2VydCA9PSBSRVBMQUNFKSAhPSAwKQorCQkJcmV0dXJuICgtMSk7CisJaWYgKGVzLT5jdXJzb3IgPiAwKQorCQllcy0+Y3Vyc29yLS07CisJaW5zZXJ0ID0gMDsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAoreWFua19yYW5nZShpbnQgYSwgaW50IGIpCit7CisJeWFua2xlbiA9IGIgLSBhOworCWlmICh5YW5rbGVuICE9IDApCisJCW1lbW1vdmUoeWJ1ZiwgJmVzLT5jYnVmW2FdLCB5YW5rbGVuKTsKK30KKworc3RhdGljIGludAorYnJhY2t0eXBlKGludCBjaCkKK3sKKwlzd2l0Y2ggKGNoKSB7CisKKwljYXNlICcoJzoKKwkJcmV0dXJuICgxKTsKKworCWNhc2UgJ1snOgorCQlyZXR1cm4gKDIpOworCisJY2FzZSAneyc6CisJCXJldHVybiAoMyk7CisKKwljYXNlICcpJzoKKwkJcmV0dXJuICgtMSk7CisKKwljYXNlICddJzoKKwkJcmV0dXJuICgtMik7CisKKwljYXNlICd9JzoKKwkJcmV0dXJuICgtMyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKDApOworCX0KK30KKworLyoKKyAqCU5vbiB1c2VyIGludGVyZmFjZSBlZGl0b3Igcm91dGluZXMgYmVsb3cgaGVyZQorICovCisKK3N0YXRpYyB2b2lkCitzYXZlX2NidWYodm9pZCkKK3sKKwltZW1tb3ZlKGhvbGRidWYsIGVzLT5jYnVmLCBlcy0+bGluZWxlbik7CisJaG9sZGxlbiA9IGVzLT5saW5lbGVuOworCWhvbGRidWZbaG9sZGxlbl0gPSAnXDAnOworfQorCitzdGF0aWMgdm9pZAorcmVzdG9yZV9jYnVmKHZvaWQpCit7CisJZXMtPmN1cnNvciA9IDA7CisJZXMtPmxpbmVsZW4gPSBob2xkbGVuOworCW1lbW1vdmUoZXMtPmNidWYsIGhvbGRidWYsIGhvbGRsZW4pOworfQorCisvKiByZXR1cm4gYSBuZXcgZWRzdGF0ZSAqLworc3RhdGljIHN0cnVjdCBlZHN0YXRlICoKK3NhdmVfZWRzdGF0ZShzdHJ1Y3QgZWRzdGF0ZSAqb2xkKQoreworCXN0cnVjdCBlZHN0YXRlICpuZXdzOworCisJbmV3cyA9IGFsbG9jKHNpemVvZihzdHJ1Y3QgZWRzdGF0ZSksIEFQRVJNKTsKKwluZXdzLT5jYnVmID0gYWxsb2Mob2xkLT5jYnVmc2l6ZSwgQVBFUk0pOworCW1lbWNweShuZXdzLT5jYnVmLCBvbGQtPmNidWYsIG9sZC0+bGluZWxlbik7CisJbmV3cy0+Y2J1ZnNpemUgPSBvbGQtPmNidWZzaXplOworCW5ld3MtPmxpbmVsZW4gPSBvbGQtPmxpbmVsZW47CisJbmV3cy0+Y3Vyc29yID0gb2xkLT5jdXJzb3I7CisJbmV3cy0+d2lubGVmdCA9IG9sZC0+d2lubGVmdDsKKwlyZXR1cm4gKG5ld3MpOworfQorCitzdGF0aWMgdm9pZAorcmVzdG9yZV9lZHN0YXRlKHN0cnVjdCBlZHN0YXRlICpuZXdzLCBzdHJ1Y3QgZWRzdGF0ZSAqb2xkKQoreworCW1lbWNweShuZXdzLT5jYnVmLCBvbGQtPmNidWYsIG9sZC0+bGluZWxlbik7CisJbmV3cy0+bGluZWxlbiA9IG9sZC0+bGluZWxlbjsKKwluZXdzLT5jdXJzb3IgPSBvbGQtPmN1cnNvcjsKKwluZXdzLT53aW5sZWZ0ID0gb2xkLT53aW5sZWZ0OworCWZyZWVfZWRzdGF0ZShvbGQpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9lZHN0YXRlKHN0cnVjdCBlZHN0YXRlICpvbGQpCit7CisJYWZyZWUob2xkLT5jYnVmLCBBUEVSTSk7CisJYWZyZWUob2xkLCBBUEVSTSk7Cit9CisKKy8qCisgKiB0aGlzIGlzIHVzZWQgZm9yIGNhbGxpbmcgeF9lc2NhcGUoKSBpbiBjb21wbGV0ZV93b3JkKCkKKyAqLworc3RhdGljIGludAoreF92aV9wdXRidWYoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gKHB1dGJ1ZihzLCBsZW4sIDApKTsKK30KKworc3RhdGljIGludAorcHV0YnVmKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IHJlcGwpCit7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gKDApOworCWlmIChyZXBsKSB7CisJCWlmIChlcy0+Y3Vyc29yICsgbGVuID49IGVzLT5jYnVmc2l6ZSkKKwkJCXJldHVybiAoLTEpOworCQlpZiAoZXMtPmN1cnNvciArIGxlbiA+IGVzLT5saW5lbGVuKQorCQkJZXMtPmxpbmVsZW4gPSBlcy0+Y3Vyc29yICsgbGVuOworCX0gZWxzZSB7CisJCWlmIChlcy0+bGluZWxlbiArIGxlbiA+PSBlcy0+Y2J1ZnNpemUpCisJCQlyZXR1cm4gKC0xKTsKKwkJbWVtbW92ZSgmZXMtPmNidWZbZXMtPmN1cnNvciArIGxlbl0sICZlcy0+Y2J1Zltlcy0+Y3Vyc29yXSwKKwkJICAgIGVzLT5saW5lbGVuIC0gZXMtPmN1cnNvcik7CisJCWVzLT5saW5lbGVuICs9IGxlbjsKKwl9CisJbWVtbW92ZSgmZXMtPmNidWZbZXMtPmN1cnNvcl0sIGJ1ZiwgbGVuKTsKKwllcy0+Y3Vyc29yICs9IGxlbjsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAorZGVsX3JhbmdlKGludCBhLCBpbnQgYikKK3sKKwlpZiAoZXMtPmxpbmVsZW4gIT0gYikKKwkJbWVtbW92ZSgmZXMtPmNidWZbYV0sICZlcy0+Y2J1ZltiXSwgZXMtPmxpbmVsZW4gLSBiKTsKKwllcy0+bGluZWxlbiAtPSBiIC0gYTsKK30KKworc3RhdGljIGludAorZmluZGNoKGludCBjaCwgaW50IGNudCwgaW50IGZvcncsIGludCBpbmNsKQoreworCWludCBuY3Vyc29yOworCisJaWYgKGVzLT5saW5lbGVuID09IDApCisJCXJldHVybiAoLTEpOworCW5jdXJzb3IgPSBlcy0+Y3Vyc29yOworCXdoaWxlIChjbnQtLSkgeworCQlkbyB7CisJCQlpZiAoZm9ydykgeworCQkJCWlmICgrK25jdXJzb3IgPT0gZXMtPmxpbmVsZW4pCisJCQkJCXJldHVybiAoLTEpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoLS1uY3Vyc29yIDwgMCkKKwkJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCX0gd2hpbGUgKGVzLT5jYnVmW25jdXJzb3JdICE9IGNoKTsKKwl9CisJaWYgKCFpbmNsKSB7CisJCWlmIChmb3J3KQorCQkJbmN1cnNvci0tOworCQllbHNlCisJCQluY3Vyc29yKys7CisJfQorCXJldHVybiAobmN1cnNvcik7Cit9CisKK3N0YXRpYyBpbnQKK2Zvcnd3b3JkKGludCBhcmdjbnQpCit7CisJaW50IG5jdXJzb3I7CisKKwluY3Vyc29yID0gZXMtPmN1cnNvcjsKKwl3aGlsZSAobmN1cnNvciA8IGVzLT5saW5lbGVuICYmIGFyZ2NudC0tKSB7CisJCWlmIChrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQl3aGlsZSAoa3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pICYmCisJCQkgICAgbmN1cnNvciA8IGVzLT5saW5lbGVuKQorCQkJCW5jdXJzb3IrKzsKKwkJZWxzZSBpZiAoIWtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCXdoaWxlICgha3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pICYmCisJCQkgICAgIWtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSAmJgorCQkJICAgIG5jdXJzb3IgPCBlcy0+bGluZWxlbikKKwkJCQluY3Vyc29yKys7CisJCXdoaWxlIChrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKKwkJICAgIG5jdXJzb3IgPCBlcy0+bGluZWxlbikKKwkJCW5jdXJzb3IrKzsKKwl9CisJcmV0dXJuIChuY3Vyc29yKTsKK30KKworc3RhdGljIGludAorYmFja3dvcmQoaW50IGFyZ2NudCkKK3sKKwlpbnQgbmN1cnNvcjsKKworCW5jdXJzb3IgPSBlcy0+Y3Vyc29yOworCXdoaWxlIChuY3Vyc29yID4gMCAmJiBhcmdjbnQtLSkgeworCQl3aGlsZSAoLS1uY3Vyc29yID4gMCAmJiBrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQk7CisJCWlmIChuY3Vyc29yID4gMCkgeworCQkJaWYgKGtzaF9pc2FsbnV4KGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCQl3aGlsZSAoLS1uY3Vyc29yID49IDAgJiYKKwkJCQkgICAga3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJCQk7CisJCQllbHNlCisJCQkJd2hpbGUgKC0tbmN1cnNvciA+PSAwICYmCisJCQkJICAgICFrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKKwkJCQkgICAgIWtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCQkJOworCQkJbmN1cnNvcisrOworCQl9CisJfQorCXJldHVybiAobmN1cnNvcik7Cit9CisKK3N0YXRpYyBpbnQKK2VuZHdvcmQoaW50IGFyZ2NudCkKK3sKKwlpbnQgbmN1cnNvcjsKKworCW5jdXJzb3IgPSBlcy0+Y3Vyc29yOworCXdoaWxlIChuY3Vyc29yIDwgZXMtPmxpbmVsZW4gJiYgYXJnY250LS0pIHsKKwkJd2hpbGUgKCsrbmN1cnNvciA8IGVzLT5saW5lbGVuIC0gMSAmJgorCQkgICAga3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJOworCQlpZiAobmN1cnNvciA8IGVzLT5saW5lbGVuIC0gMSkgeworCQkJaWYgKGtzaF9pc2FsbnV4KGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCQl3aGlsZSAoKytuY3Vyc29yIDwgZXMtPmxpbmVsZW4gJiYKKwkJCQkgICAga3NoX2lzYWxudXgoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJCQk7CisJCQllbHNlCisJCQkJd2hpbGUgKCsrbmN1cnNvciA8IGVzLT5saW5lbGVuICYmCisJCQkJICAgICFrc2hfaXNhbG51eChlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKKwkJCQkgICAgIWtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCQkJOworCQkJbmN1cnNvci0tOworCQl9CisJfQorCXJldHVybiAobmN1cnNvcik7Cit9CisKK3N0YXRpYyBpbnQKK0Zvcnd3b3JkKGludCBhcmdjbnQpCit7CisJaW50IG5jdXJzb3I7CisKKwluY3Vyc29yID0gZXMtPmN1cnNvcjsKKwl3aGlsZSAobmN1cnNvciA8IGVzLT5saW5lbGVuICYmIGFyZ2NudC0tKSB7CisJCXdoaWxlICgha3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pICYmCisJCSAgICBuY3Vyc29yIDwgZXMtPmxpbmVsZW4pCisJCQluY3Vyc29yKys7CisJCXdoaWxlIChrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkgJiYKKwkJICAgIG5jdXJzb3IgPCBlcy0+bGluZWxlbikKKwkJCW5jdXJzb3IrKzsKKwl9CisJcmV0dXJuIChuY3Vyc29yKTsKK30KKworc3RhdGljIGludAorQmFja3dvcmQoaW50IGFyZ2NudCkKK3sKKwlpbnQgbmN1cnNvcjsKKworCW5jdXJzb3IgPSBlcy0+Y3Vyc29yOworCXdoaWxlIChuY3Vyc29yID4gMCAmJiBhcmdjbnQtLSkgeworCQl3aGlsZSAoLS1uY3Vyc29yID49IDAgJiYga3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJOworCQl3aGlsZSAobmN1cnNvciA+PSAwICYmICFrc2hfaXNzcGFjZShlcy0+Y2J1ZltuY3Vyc29yXSkpCisJCQluY3Vyc29yLS07CisJCW5jdXJzb3IrKzsKKwl9CisJcmV0dXJuIChuY3Vyc29yKTsKK30KKworc3RhdGljIGludAorRW5kd29yZChpbnQgYXJnY250KQoreworCWludCBuY3Vyc29yOworCisJbmN1cnNvciA9IGVzLT5jdXJzb3I7CisJd2hpbGUgKG5jdXJzb3IgPCBlcy0+bGluZWxlbiAtIDEgJiYgYXJnY250LS0pIHsKKwkJd2hpbGUgKCsrbmN1cnNvciA8IGVzLT5saW5lbGVuIC0gMSAmJgorCQkgICAga3NoX2lzc3BhY2UoZXMtPmNidWZbbmN1cnNvcl0pKQorCQkJOworCQlpZiAobmN1cnNvciA8IGVzLT5saW5lbGVuIC0gMSkgeworCQkJd2hpbGUgKCsrbmN1cnNvciA8IGVzLT5saW5lbGVuICYmCisJCQkgICAgIWtzaF9pc3NwYWNlKGVzLT5jYnVmW25jdXJzb3JdKSkKKwkJCQk7CisJCQluY3Vyc29yLS07CisJCX0KKwl9CisJcmV0dXJuIChuY3Vyc29yKTsKK30KKworc3RhdGljIGludAorZ3JhYmhpc3QoaW50IHNhdmUsIGludCBuKQoreworCWNoYXIgKmhwdHI7CisKKwlpZiAobiA8IDAgfHwgbiA+IGhsYXN0KQorCQlyZXR1cm4gKC0xKTsKKwlpZiAobiA9PSBobGFzdCkgeworCQlyZXN0b3JlX2NidWYoKTsKKwkJb2hudW0gPSBuOworCQlyZXR1cm4gKDApOworCX0KKwkodm9pZCloaXN0bnVtKG4pOworCWlmICgoaHB0ciA9ICpoaXN0cG9zKCkpID09IE5VTEwpIHsKKwkJaW50ZXJuYWxfd2FybmluZ2YoImdyYWJoaXN0OiBiYWQgaGlzdG9yeSBhcnJheSIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJaWYgKHNhdmUpCisJCXNhdmVfY2J1ZigpOworCWlmICgoZXMtPmxpbmVsZW4gPSBzdHJsZW4oaHB0cikpID49IGVzLT5jYnVmc2l6ZSkKKwkJZXMtPmxpbmVsZW4gPSBlcy0+Y2J1ZnNpemUgLSAxOworCW1lbW1vdmUoZXMtPmNidWYsIGhwdHIsIGVzLT5saW5lbGVuKTsKKwllcy0+Y3Vyc29yID0gMDsKKwlvaG51bSA9IG47CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorZ3JhYnNlYXJjaChpbnQgc2F2ZSwgaW50IHN0YXJ0LCBpbnQgZndkLCBjaGFyICpwYXQpCit7CisJY2hhciAqaHB0cjsKKwlpbnQgaGlzdDsKKwlpbnQgYW5jaG9yZWQ7CisKKwlpZiAoKHN0YXJ0ID09IDAgJiYgZndkID09IDApIHx8IChzdGFydCA+PSBobGFzdCAtIDEgJiYgZndkID09IDEpKQorCQlyZXR1cm4gKC0xKTsKKwlpZiAoZndkKQorCQlzdGFydCsrOworCWVsc2UKKwkJc3RhcnQtLTsKKwlhbmNob3JlZCA9ICpwYXQgPT0gJ14nID8gKCsrcGF0LCAxKSA6IDA7CisJaWYgKChoaXN0ID0gZmluZGhpc3Qoc3RhcnQsIGZ3ZCwgcGF0LCBhbmNob3JlZCkpIDwgMCkgeworCQkvKiBpZiAoc3RhcnQgIT0gMCAmJiBmd2QgJiYgbWF0Y2goaG9sZGJ1ZiwgcGF0KSA+PSAwKSB7ICovCisJCS8qIFhYWCBzaG91bGQgc3RyY21wIGJlIHN0cm5jbXA/ICovCisJCWlmIChzdGFydCAhPSAwICYmIGZ3ZCAmJiBzdHJjbXAoaG9sZGJ1ZiwgcGF0KSA+PSAwKSB7CisJCQlyZXN0b3JlX2NidWYoKTsKKwkJCXJldHVybiAoMCk7CisJCX0gZWxzZQorCQkJcmV0dXJuICgtMSk7CisJfQorCWlmIChzYXZlKQorCQlzYXZlX2NidWYoKTsKKwloaXN0bnVtKGhpc3QpOworCWhwdHIgPSAqaGlzdHBvcygpOworCWlmICgoZXMtPmxpbmVsZW4gPSBzdHJsZW4oaHB0cikpID49IGVzLT5jYnVmc2l6ZSkKKwkJZXMtPmxpbmVsZW4gPSBlcy0+Y2J1ZnNpemUgLSAxOworCW1lbW1vdmUoZXMtPmNidWYsIGhwdHIsIGVzLT5saW5lbGVuKTsKKwllcy0+Y3Vyc29yID0gMDsKKwlyZXR1cm4gKGhpc3QpOworfQorCitzdGF0aWMgdm9pZAorcmVkcmF3X2xpbmUoaW50IG5ld2wpCit7CisJKHZvaWQpbWVtc2V0KHdidWZbd2luXSwgJyAnLCB3YnVmX2xlbik7CisJaWYgKG5ld2wpIHsKKwkJeF9wdXRjKCdccicpOworCQl4X3B1dGMoJ1xuJyk7CisJfQorCWlmIChwcm9tcHRfcmVkcmF3KQorCQlwcHJvbXB0KHByb21wdCwgcHJvbXB0X3RydW5jKTsKKwljdXJfY29sID0gcHdpZHRoOworCW1vcmVjID0gJyAnOworfQorCitzdGF0aWMgdm9pZAorcmVmcmVzaChpbnQgbGVmdHNpZGUpCit7CisJaWYgKGxlZnRzaWRlIDwgMCkKKwkJbGVmdHNpZGUgPSBsYXN0cmVmOworCWVsc2UKKwkJbGFzdHJlZiA9IGxlZnRzaWRlOworCWlmIChvdXRvZndpbigpKQorCQlyZXdpbmRvdygpOworCWRpc3BsYXkod2J1ZlsxIC0gd2luXSwgd2J1Zlt3aW5dLCBsZWZ0c2lkZSk7CisJd2luID0gMSAtIHdpbjsKK30KKworc3RhdGljIGludAorb3V0b2Z3aW4odm9pZCkKK3sKKwlpbnQgY3VyLCBjb2w7CisKKwlpZiAoZXMtPmN1cnNvciA8IGVzLT53aW5sZWZ0KQorCQlyZXR1cm4gKDEpOworCWNvbCA9IDA7CisJY3VyID0gZXMtPndpbmxlZnQ7CisJd2hpbGUgKGN1ciA8IGVzLT5jdXJzb3IpCisJCWNvbCA9IG5ld2NvbCgodW5zaWduZWQgY2hhcillcy0+Y2J1ZltjdXIrK10sIGNvbCk7CisJaWYgKGNvbCA+PSB3aW53aWR0aCkKKwkJcmV0dXJuICgxKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAorcmV3aW5kb3codm9pZCkKK3sKKwlpbnQgdGN1ciwgdGNvbDsKKwlpbnQgaG9sZGN1cjEsIGhvbGRjb2wxOworCWludCBob2xkY3VyMiwgaG9sZGNvbDI7CisKKwlob2xkY3VyMSA9IGhvbGRjdXIyID0gdGN1ciA9IDA7CisJaG9sZGNvbDEgPSBob2xkY29sMiA9IHRjb2wgPSAwOworCXdoaWxlICh0Y3VyIDwgZXMtPmN1cnNvcikgeworCQlpZiAodGNvbCAtIGhvbGRjb2wyID4gd2lud2lkdGggLyAyKSB7CisJCQlob2xkY3VyMSA9IGhvbGRjdXIyOworCQkJaG9sZGNvbDEgPSBob2xkY29sMjsKKwkJCWhvbGRjdXIyID0gdGN1cjsKKwkJCWhvbGRjb2wyID0gdGNvbDsKKwkJfQorCQl0Y29sID0gbmV3Y29sKCh1bnNpZ25lZCBjaGFyKWVzLT5jYnVmW3RjdXIrK10sIHRjb2wpOworCX0KKwl3aGlsZSAodGNvbCAtIGhvbGRjb2wxID4gd2lud2lkdGggLyAyKQorCQlob2xkY29sMSA9IG5ld2NvbCgodW5zaWduZWQgY2hhcillcy0+Y2J1Zltob2xkY3VyMSsrXSwKKwkJICAgIGhvbGRjb2wxKTsKKwllcy0+d2lubGVmdCA9IGhvbGRjdXIxOworfQorCitzdGF0aWMgaW50CituZXdjb2woaW50IGNoLCBpbnQgY29sKQoreworCWlmIChjaCA9PSAnXHQnKQorCQlyZXR1cm4gKChjb2wgfCA3KSArIDEpOworCXJldHVybiAoY29sICsgY2hhcl9sZW4oY2gpKTsKK30KKworc3RhdGljIHZvaWQKK2Rpc3BsYXkoY2hhciAqd2IxLCBjaGFyICp3YjIsIGludCBsZWZ0c2lkZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCWNoYXIgKnR3YjEsICp0d2IyLCBtYzsKKwlpbnQgY3VyLCBjb2wsIGNudDsKKwlpbnQgbmNvbCA9IDA7CisJaW50IG1vcmVyaWdodDsKKworCWNvbCA9IDA7CisJY3VyID0gZXMtPndpbmxlZnQ7CisJbW9yZXJpZ2h0ID0gMDsKKwl0d2IxID0gd2IxOworCXdoaWxlIChjb2wgPCB3aW53aWR0aCAmJiBjdXIgPCBlcy0+bGluZWxlbikgeworCQlpZiAoY3VyID09IGVzLT5jdXJzb3IgJiYgbGVmdHNpZGUpCisJCQluY29sID0gY29sICsgcHdpZHRoOworCQlpZiAoKGNoID0gZXMtPmNidWZbY3VyXSkgPT0gJ1x0JykKKwkJCWRvIHsKKwkJCQkqdHdiMSsrID0gJyAnOworCQkJfSB3aGlsZSAoKytjb2wgPCB3aW53aWR0aCAmJiAoY29sICYgNykgIT0gMCk7CisJCWVsc2UgaWYgKGNvbCA8IHdpbndpZHRoKSB7CisJCQlpZiAoY2ggPCAnICcgfHwgY2ggPT0gMHg3ZikgeworCQkJCSp0d2IxKysgPSAnXic7CisJCQkJaWYgKCsrY29sIDwgd2lud2lkdGgpIHsKKwkJCQkJKnR3YjErKyA9IGNoIF4gJ0AnOworCQkJCQljb2wrKzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCSp0d2IxKysgPSBjaDsKKwkJCQljb2wrKzsKKwkJCX0KKwkJfQorCQlpZiAoY3VyID09IGVzLT5jdXJzb3IgJiYgIWxlZnRzaWRlKQorCQkJbmNvbCA9IGNvbCArIHB3aWR0aCAtIDE7CisJCWN1cisrOworCX0KKwlpZiAoY3VyID09IGVzLT5jdXJzb3IpCisJCW5jb2wgPSBjb2wgKyBwd2lkdGg7CisJaWYgKGNvbCA8IHdpbndpZHRoKSB7CisJCXdoaWxlIChjb2wgPCB3aW53aWR0aCkgeworCQkJKnR3YjErKyA9ICcgJzsKKwkJCWNvbCsrOworCQl9CisJfSBlbHNlCisJCW1vcmVyaWdodCsrOworCSp0d2IxID0gJyAnOworCisJY29sID0gcHdpZHRoOworCWNudCA9IHdpbndpZHRoOworCXR3YjEgPSB3YjE7CisJdHdiMiA9IHdiMjsKKwl3aGlsZSAoY250LS0pIHsKKwkJaWYgKCp0d2IxICE9ICp0d2IyKSB7CisJCQlpZiAoY3VyX2NvbCAhPSBjb2wpCisJCQkJZWRfbW92X29wdChjb2wsIHdiMSk7CisJCQl4X3B1dGMoKnR3YjEpOworCQkJY3VyX2NvbCsrOworCQl9CisJCXR3YjErKzsKKwkJdHdiMisrOworCQljb2wrKzsKKwl9CisJaWYgKGVzLT53aW5sZWZ0ID4gMCAmJiBtb3JlcmlnaHQpCisJCS8qIFBPU0lYIHNheXMgdG8gdXNlICogZm9yIHRoaXMgYnV0IHRoYXQgaXMgYSBnbG9iYmluZworCQkgKiBjaGFyYWN0ZXIgYW5kIG1heSBjb25mdXNlIHBlb3BsZTsgKyBpcyBtb3JlIGlubm9jdW91cworCQkgKi8KKwkJbWMgPSAnKyc7CisJZWxzZSBpZiAoZXMtPndpbmxlZnQgPiAwKQorCQltYyA9ICc8JzsKKwllbHNlIGlmIChtb3JlcmlnaHQpCisJCW1jID0gJz4nOworCWVsc2UKKwkJbWMgPSAnICc7CisJaWYgKG1jICE9IG1vcmVjKSB7CisJCWVkX21vdl9vcHQocHdpZHRoICsgd2lud2lkdGggKyAxLCB3YjEpOworCQl4X3B1dGMobWMpOworCQljdXJfY29sKys7CisJCW1vcmVjID0gbWM7CisJfQorCWlmIChjdXJfY29sICE9IG5jb2wpCisJCWVkX21vdl9vcHQobmNvbCwgd2IxKTsKK30KKworc3RhdGljIHZvaWQKK2VkX21vdl9vcHQoaW50IGNvbCwgY2hhciAqd2IpCit7CisJaWYgKGNvbCA8IGN1cl9jb2wpIHsKKwkJaWYgKGNvbCArIDEgPCBjdXJfY29sIC0gY29sKSB7CisJCQl4X3B1dGMoJ1xyJyk7CisJCQlpZiAocHJvbXB0X3JlZHJhdykKKwkJCQlwcHJvbXB0KHByb21wdCwgcHJvbXB0X3RydW5jKTsKKwkJCWN1cl9jb2wgPSBwd2lkdGg7CisJCQl3aGlsZSAoY3VyX2NvbCsrIDwgY29sKQorCQkJCXhfcHV0Y2YoKndiKyspOworCQl9IGVsc2UgeworCQkJd2hpbGUgKGN1cl9jb2wtLSA+IGNvbCkKKwkJCQl4X3B1dGMoJ1xiJyk7CisJCX0KKwl9IGVsc2UgeworCQl3YiA9ICZ3YltjdXJfY29sIC0gcHdpZHRoXTsKKwkJd2hpbGUgKGN1cl9jb2wrKyA8IGNvbCkKKwkJCXhfcHV0Y2YoKndiKyspOworCX0KKwljdXJfY29sID0gY29sOworfQorCisKKy8qIHJlcGxhY2Ugd29yZCB3aXRoIGFsbCBleHBhbnNpb25zIChpZSwgZXhwYW5kIHdvcmQqKSAqLworc3RhdGljIGludAorZXhwYW5kX3dvcmQoaW50IGNtZCkKK3sKKwlzdGF0aWMgc3RydWN0IGVkc3RhdGUgKmJ1ZjsKKwlpbnQgcnZhbCA9IDA7CisJaW50IG53b3JkczsKKwlpbnQgc3RhcnQsIGVuZDsKKwljaGFyICoqd29yZHM7CisJaW50IGk7CisKKwkvKiBVbmRvIHByZXZpb3VzIGV4cGFuc2lvbiAqLworCWlmIChjbWQgPT0gMCAmJiBleHBhbmRlZCA9PSBFWFBBTkQgJiYgYnVmKSB7CisJCXJlc3RvcmVfZWRzdGF0ZShlcywgYnVmKTsKKwkJYnVmID0gMDsKKwkJZXhwYW5kZWQgPSBOT05FOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoYnVmKSB7CisJCWZyZWVfZWRzdGF0ZShidWYpOworCQlidWYgPSAwOworCX0KKworCW53b3JkcyA9IHhfY2ZfZ2xvYihYQ0ZfQ09NTUFORF9GSUxFfFhDRl9GVUxMUEFUSCwKKwkgICAgZXMtPmNidWYsIGVzLT5saW5lbGVuLCBlcy0+Y3Vyc29yLAorCSAgICAmc3RhcnQsICZlbmQsICZ3b3JkcywgTlVMTCk7CisJaWYgKG53b3JkcyA9PSAwKSB7CisJCXZpX2Vycm9yKCk7CisJCXJldHVybiAoLTEpOworCX0KKworCWJ1ZiA9IHNhdmVfZWRzdGF0ZShlcyk7CisJZXhwYW5kZWQgPSBFWFBBTkQ7CisJZGVsX3JhbmdlKHN0YXJ0LCBlbmQpOworCWVzLT5jdXJzb3IgPSBzdGFydDsKKwlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyApIHsKKwkJaWYgKHhfZXNjYXBlKHdvcmRzW2ldLCBzdHJsZW4od29yZHNbaV0pLCB4X3ZpX3B1dGJ1ZikgIT0gMCkgeworCQkJcnZhbCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCsraSA8IG53b3JkcyAmJiBwdXRidWYoIiAiLCAxLCAwKSAhPSAwKSB7CisJCQlydmFsID0gLTE7CisJCQlicmVhazsKKwkJfQorCX0KKwlpID0gYnVmLT5jdXJzb3IgLSBlbmQ7CisJaWYgKHJ2YWwgPT0gMCAmJiBpID4gMCkKKwkJZXMtPmN1cnNvciArPSBpOworCW1vZGlmaWVkID0gMTsKKwlobnVtID0gaGxhc3Q7CisJaW5zZXJ0ID0gSU5TRVJUOworCWxhc3RhYyA9IDA7CisJcmVmcmVzaCgwKTsKKwlyZXR1cm4gKHJ2YWwpOworfQorCitzdGF0aWMgaW50Citjb21wbGV0ZV93b3JkKGludCBjbWQsIGludCBjb3VudCkKK3sKKwlzdGF0aWMgc3RydWN0IGVkc3RhdGUgKmJ1ZjsKKwlpbnQgcnZhbCwgbndvcmRzLCBzdGFydCwgZW5kLCBtYXRjaF9sZW47CisJY2hhciAqKndvcmRzOworCWNoYXIgKm1hdGNoOworCWJvb2wgaXNfY29tbWFuZCwgaXNfdW5pcXVlOworCisJLyogVW5kbyBwcmV2aW91cyBjb21wbGV0aW9uICovCisJaWYgKGNtZCA9PSAwICYmIGV4cGFuZGVkID09IENPTVBMRVRFICYmIGJ1ZikgeworCQlwcmludF9leHBhbnNpb25zKGJ1ZiwgMCk7CisJCWV4cGFuZGVkID0gUFJJTlQ7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChjbWQgPT0gMCAmJiBleHBhbmRlZCA9PSBQUklOVCAmJiBidWYpIHsKKwkJcmVzdG9yZV9lZHN0YXRlKGVzLCBidWYpOworCQlidWYgPSAwOworCQlleHBhbmRlZCA9IE5PTkU7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChidWYpIHsKKwkJZnJlZV9lZHN0YXRlKGJ1Zik7CisJCWJ1ZiA9IDA7CisJfQorCisJLyogWENGX0ZVTExQQVRIIGZvciBjb3VudCAnY2F1c2UgdGhlIG1lbnUgcHJpbnRlZCBieSBwcmludF9leHBhbnNpb25zKCkKKwkgKiB3YXMgZG9uZSB0aGlzIHdheS4KKwkgKi8KKwlud29yZHMgPSB4X2NmX2dsb2IoWENGX0NPTU1BTkRfRklMRSB8IChjb3VudCA/IFhDRl9GVUxMUEFUSCA6IDApLAorCSAgICBlcy0+Y2J1ZiwgZXMtPmxpbmVsZW4sIGVzLT5jdXJzb3IsCisJICAgICZzdGFydCwgJmVuZCwgJndvcmRzLCAmaXNfY29tbWFuZCk7CisJaWYgKG53b3JkcyA9PSAwKSB7CisJCXZpX2Vycm9yKCk7CisJCXJldHVybiAoLTEpOworCX0KKwlpZiAoY291bnQpIHsKKwkJaW50IGk7CisKKwkJY291bnQtLTsKKwkJaWYgKGNvdW50ID49IG53b3JkcykgeworCQkJdmlfZXJyb3IoKTsKKwkJCXhfcHJpbnRfZXhwYW5zaW9ucyhud29yZHMsIHdvcmRzLCBpc19jb21tYW5kKTsKKwkJCXhfZnJlZV93b3Jkcyhud29yZHMsIHdvcmRzKTsKKwkJCXJlZHJhd19saW5lKDApOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJLyoKKwkJICogRXhwYW5kIHRoZSBjb3VudCd0aCB3b3JkIHRvIGl0cyBiYXNlbmFtZQorCQkgKi8KKwkJaWYgKGlzX2NvbW1hbmQpIHsKKwkJCW1hdGNoID0gd29yZHNbY291bnRdICsKKwkJCSAgICB4X2Jhc2VuYW1lKHdvcmRzW2NvdW50XSwgTlVMTCk7CisJCQkvKiBJZiBtb3JlIHRoYW4gb25lIHBvc3NpYmxlIG1hdGNoLCB1c2UgZnVsbCBwYXRoICovCisJCQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspCisJCQkJaWYgKGkgIT0gY291bnQgJiYKKwkJCQkgICAgc3RyY21wKHdvcmRzW2ldICsgeF9iYXNlbmFtZSh3b3Jkc1tpXSwKKwkJCQkgICAgTlVMTCksIG1hdGNoKSA9PSAwKSB7CisJCQkJCW1hdGNoID0gd29yZHNbY291bnRdOworCQkJCQlicmVhazsKKwkJCQl9CisJCX0gZWxzZQorCQkJbWF0Y2ggPSB3b3Jkc1tjb3VudF07CisJCW1hdGNoX2xlbiA9IHN0cmxlbihtYXRjaCk7CisJCWlzX3VuaXF1ZSA9IHRydWU7CisJCS8qIGV4cGFuZGVkID0gUFJJTlQ7CW5leHQgY2FsbCB1bmRvICovCisJfSBlbHNlIHsKKwkJbWF0Y2ggPSB3b3Jkc1swXTsKKwkJbWF0Y2hfbGVuID0geF9sb25nZXN0X3ByZWZpeChud29yZHMsIHdvcmRzKTsKKwkJZXhwYW5kZWQgPSBDT01QTEVURTsJLyogbmV4dCBjYWxsIHdpbGwgbGlzdCBjb21wbGV0aW9ucyAqLworCQlpc191bmlxdWUgPSBud29yZHMgPT0gMTsKKwl9CisKKwlidWYgPSBzYXZlX2Vkc3RhdGUoZXMpOworCWRlbF9yYW5nZShzdGFydCwgZW5kKTsKKwllcy0+Y3Vyc29yID0gc3RhcnQ7CisKKwkvKiBlc2NhcGUgYWxsIHNoZWxsLXNlbnNpdGl2ZSBjaGFyYWN0ZXJzIGFuZCBwdXQgdGhlIHJlc3VsdCBpbnRvCisJICogY29tbWFuZCBidWZmZXIgKi8KKwlydmFsID0geF9lc2NhcGUobWF0Y2gsIG1hdGNoX2xlbiwgeF92aV9wdXRidWYpOworCisJaWYgKHJ2YWwgPT0gMCAmJiBpc191bmlxdWUpIHsKKwkJLyogSWYgZXhhY3QgbWF0Y2gsIGRvbid0IHVuZG8uIEFsbG93cyBkaXJlY3RvcnkgY29tcGxldGlvbnMKKwkJICogdG8gYmUgdXNlZCAoaWUsIGNvbXBsZXRlIHRoZSBuZXh0IHBvcnRpb24gb2YgdGhlIHBhdGgpLgorCQkgKi8KKwkJZXhwYW5kZWQgPSBOT05FOworCisJCS8qIElmIG5vdCBhIGRpcmVjdG9yeSwgYWRkIGEgc3BhY2UgdG8gdGhlIGVuZC4uLiAqLworCQlpZiAobWF0Y2hfbGVuID4gMCAmJiBtYXRjaFttYXRjaF9sZW4gLSAxXSAhPSAnLycpCisJCQlydmFsID0gcHV0YnVmKCIgIiwgMSwgMCk7CisJfQorCXhfZnJlZV93b3Jkcyhud29yZHMsIHdvcmRzKTsKKworCW1vZGlmaWVkID0gMTsKKwlobnVtID0gaGxhc3Q7CisJaW5zZXJ0ID0gSU5TRVJUOworCWxhc3RhYyA9IDA7CSAvKiBwcmV2ZW50IHRoaXMgZnJvbSBiZWluZyByZWRvbmUuLi4gKi8KKwlyZWZyZXNoKDApOworCisJcmV0dXJuIChydmFsKTsKK30KKworc3RhdGljIGludAorcHJpbnRfZXhwYW5zaW9ucyhzdHJ1Y3QgZWRzdGF0ZSAqZXN0LCBpbnQgY21kIE1LU0hfQV9VTlVTRUQpCit7CisJaW50IHN0YXJ0LCBlbmQsIG53b3JkczsKKwljaGFyICoqd29yZHM7CisJYm9vbCBpc19jb21tYW5kOworCisJbndvcmRzID0geF9jZl9nbG9iKFhDRl9DT01NQU5EX0ZJTEUgfCBYQ0ZfRlVMTFBBVEgsCisJICAgIGVzdC0+Y2J1ZiwgZXN0LT5saW5lbGVuLCBlc3QtPmN1cnNvciwKKwkgICAgJnN0YXJ0LCAmZW5kLCAmd29yZHMsICZpc19jb21tYW5kKTsKKwlpZiAobndvcmRzID09IDApIHsKKwkJdmlfZXJyb3IoKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCXhfcHJpbnRfZXhwYW5zaW9ucyhud29yZHMsIHdvcmRzLCBpc19jb21tYW5kKTsKKwl4X2ZyZWVfd29yZHMobndvcmRzLCB3b3Jkcyk7CisJcmVkcmF3X2xpbmUoMCk7CisJcmV0dXJuICgwKTsKK30KKworLyogU2ltaWxhciB0byB4X3pvdGMoZW1hY3MuYyksIGJ1dCBubyB0YWIgd2VpcmRuZXNzICovCitzdGF0aWMgdm9pZAoreF92aV96b3RjKGludCBjKQoreworCWlmIChjIDwgJyAnIHx8IGMgPT0gMHg3ZikgeworCQl4X3B1dGMoJ14nKTsKKwkJYyBePSAnQCc7CisJfQorCXhfcHV0YyhjKTsKK30KKworc3RhdGljIHZvaWQKK3ZpX2Vycm9yKHZvaWQpCit7CisJLyogQmVlbSBvdXQgb2YgYW55IG1hY3JvcyBhcyBzb29uIGFzIGFuIGVycm9yIG9jY3VycyAqLworCXZpX21hY3JvX3Jlc2V0KCk7CisJeF9wdXRjKDcpOworCXhfZmx1c2goKTsKK30KKworc3RhdGljIHZvaWQKK3ZpX21hY3JvX3Jlc2V0KHZvaWQpCit7CisJaWYgKG1hY3JvLnApIHsKKwkJYWZyZWUobWFjcm8uYnVmLCBBUEVSTSk7CisJCW1lbXNldCgoY2hhciAqKSZtYWNybywgMCwgc2l6ZW9mKG1hY3JvKSk7CisJfQorfQorI2VuZGlmIC8qICFNS1NIX1NfTk9WSSAqLwpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvZW1hY3Nmbi5oIGIvbWtzaC9zcmMvZW1hY3Nmbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMzMzOTkKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9lbWFjc2ZuLmgKQEAgLTAsMCArMSw4OSBAQAorI2lmIGRlZmluZWQoRU1BQ1NGTl9ERUZOUykKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2VtYWNzZm4uaCx2IDEuNSAyMDEwLzA3LzE3IDIyOjA5OjMzIHRnIEV4cCAkIik7CisjZGVmaW5lIEZOKGNuYW1lLHNuYW1lLGZsYWdzKQlzdGF0aWMgaW50IHhfIyNjbmFtZShpbnQpOworI2VsaWYgZGVmaW5lZChFTUFDU0ZOX0VOVU1TKQorI2RlZmluZSBGTihjbmFtZSxzbmFtZSxmbGFncykJWEZVTkNfIyNjbmFtZSwKKyNkZWZpbmUgRjAoY25hbWUsc25hbWUsZmxhZ3MpCVhGVU5DXyMjY25hbWUgPSAwLAorI2VsaWYgZGVmaW5lZChFTUFDU0ZOX0lURU1TKQorI2RlZmluZSBGTihjbmFtZSxzbmFtZSxmbGFncykJeyB4XyMjY25hbWUsIHNuYW1lLCBmbGFncyB9LAorI2VuZGlmCisKKyNpZm5kZWYgRjAKKyNkZWZpbmUgRjAgRk4KKyNlbmRpZgorCitGMChhYm9ydCwgImFib3J0IiwgMCkKK0ZOKGJlZ19oaXN0LCAiYmVnaW5uaW5nLW9mLWhpc3RvcnkiLCAwKQorRk4oY2xzLCAiY2xlYXItc2NyZWVuIiwgMCkKK0ZOKGNvbW1lbnQsICJjb21tZW50IiwgMCkKK0ZOKGNvbXBfY29tbSwgImNvbXBsZXRlLWNvbW1hbmQiLCAwKQorRk4oY29tcF9maWxlLCAiY29tcGxldGUtZmlsZSIsIDApCitGTihjb21wX2xpc3QsICJjb21wbGV0ZS1saXN0IiwgMCkKK0ZOKGNvbXBsZXRlLCAiY29tcGxldGUiLCAwKQorRk4oZGVsX2JhY2ssICJkZWxldGUtY2hhci1iYWNrd2FyZCIsIFhGX0FSRykKK0ZOKGRlbF9id29yZCwgImRlbGV0ZS13b3JkLWJhY2t3YXJkIiwgWEZfQVJHKQorRk4oZGVsX2NoYXIsICJkZWxldGUtY2hhci1mb3J3YXJkIiwgWEZfQVJHKQorRk4oZGVsX2Z3b3JkLCAiZGVsZXRlLXdvcmQtZm9yd2FyZCIsIFhGX0FSRykKK0ZOKGRlbF9saW5lLCAia2lsbC1saW5lIiwgMCkKK0ZOKGRyYXdfbGluZSwgInJlZHJhdyIsIDApCisjaWZuZGVmIE1LU0hfU01BTEwKK0ZOKGVkaXRfbGluZSwgImVkaXQtbGluZSIsIFhGX0FSRykKKyNlbmRpZgorRk4oZW5kX2hpc3QsICJlbmQtb2YtaGlzdG9yeSIsIDApCitGTihlbmRfb2ZfdGV4dCwgImVvdCIsIDApCitGTihlbnVtZXJhdGUsICJsaXN0IiwgMCkKK0ZOKGVvdF9kZWwsICJlb3Qtb3ItZGVsZXRlIiwgWEZfQVJHKQorRk4oZXJyb3IsICJlcnJvciIsIDApCitGTihleHBhbmQsICJleHBhbmQtZmlsZSIsIDApCisjaWZuZGVmIE1LU0hfU01BTEwKK0ZOKGZvbGRfY2FwaXRhbGlzZSwgImNhcGl0YWxpemUtd29yZCIsIFhGX0FSRykKK0ZOKGZvbGRfbG93ZXIsICJkb3duY2FzZS13b3JkIiwgWEZfQVJHKQorRk4oZm9sZF91cHBlciwgInVwY2FzZS13b3JkIiwgWEZfQVJHKQorI2VuZGlmCitGTihnb3RvX2hpc3QsICJnb3RvLWhpc3RvcnkiLCBYRl9BUkcpCisjaWZuZGVmIE1LU0hfU01BTEwKK0ZOKGluc19zdHJpbmcsICJtYWNyby1zdHJpbmciLCBYRl9OT0JJTkQpCisjZW5kaWYKK0ZOKGluc2VydCwgImF1dG8taW5zZXJ0IiwgWEZfQVJHKQorRk4oa2lsbCwgImtpbGwtdG8tZW9sIiwgWEZfQVJHKQorRk4oa2lsbF9yZWdpb24sICJraWxsLXJlZ2lvbiIsIDApCitGTihsaXN0X2NvbW0sICJsaXN0LWNvbW1hbmQiLCAwKQorRk4obGlzdF9maWxlLCAibGlzdC1maWxlIiwgMCkKK0ZOKGxpdGVyYWwsICJxdW90ZSIsIDApCitGTihtZXRhMSwgInByZWZpeC0xIiwgWEZfUFJFRklYKQorRk4obWV0YTIsICJwcmVmaXgtMiIsIFhGX1BSRUZJWCkKK0ZOKG1ldGFfeWFuaywgInlhbmstcG9wIiwgMCkKK0ZOKG12X2JhY2ssICJiYWNrd2FyZC1jaGFyIiwgWEZfQVJHKQorRk4obXZfYmVnaW4sICJiZWdpbm5pbmctb2YtbGluZSIsIDApCitGTihtdl9id29yZCwgImJhY2t3YXJkLXdvcmQiLCBYRl9BUkcpCitGTihtdl9lbmQsICJlbmQtb2YtbGluZSIsIDApCitGTihtdl9mb3J3LCAiZm9yd2FyZC1jaGFyIiwgWEZfQVJHKQorRk4obXZfZndvcmQsICJmb3J3YXJkLXdvcmQiLCBYRl9BUkcpCitGTihuZXdsaW5lLCAibmV3bGluZSIsIDApCitGTihuZXh0X2NvbSwgImRvd24taGlzdG9yeSIsIFhGX0FSRykKK0ZOKG5sX25leHRfY29tLCAibmV3bGluZS1hbmQtbmV4dCIsIDApCitGTihub29wLCAibm8tb3AiLCAwKQorRk4ocHJldl9jb20sICJ1cC1oaXN0b3J5IiwgWEZfQVJHKQorRk4ocHJldl9oaXN0d29yZCwgInByZXYtaGlzdC13b3JkIiwgWEZfQVJHKQorRk4oc2VhcmNoX2NoYXJfYmFjaywgInNlYXJjaC1jaGFyYWN0ZXItYmFja3dhcmQiLCBYRl9BUkcpCitGTihzZWFyY2hfY2hhcl9mb3J3LCAic2VhcmNoLWNoYXJhY3Rlci1mb3J3YXJkIiwgWEZfQVJHKQorRk4oc2VhcmNoX2hpc3QsICJzZWFyY2gtaGlzdG9yeSIsIDApCisjaWZuZGVmIE1LU0hfU01BTEwKK0ZOKHNlYXJjaF9oaXN0X2RuLCAic2VhcmNoLWhpc3RvcnktZG93biIsIDApCitGTihzZWFyY2hfaGlzdF91cCwgInNlYXJjaC1oaXN0b3J5LXVwIiwgMCkKKyNlbmRpZgorRk4oc2V0X2FyZywgInNldC1hcmciLCBYRl9OT0JJTkQpCitGTihzZXRfbWFyaywgInNldC1tYXJrLWNvbW1hbmQiLCAwKQorRk4odHJhbnNwb3NlLCAidHJhbnNwb3NlLWNoYXJzIiwgMCkKK0ZOKHZlcnNpb24sICJ2ZXJzaW9uIiwgMCkKKyNpZm5kZWYgTUtTSF9TTUFMTAorRk4odnRfaGFjaywgInZ0MTAwLWhhY2siLCBYRl9BUkcpCisjZW5kaWYKK0ZOKHhjaGdfcG9pbnRfbWFyaywgImV4Y2hhbmdlLXBvaW50LWFuZC1tYXJrIiwgMCkKK0ZOKHlhbmssICJ5YW5rIiwgMCkKKworI3VuZGVmIEZOCisjdW5kZWYgRjAKKyN1bmRlZiBFTUFDU0ZOX0RFRk5TCisjdW5kZWYgRU1BQ1NGTl9FTlVNUworI3VuZGVmIEVNQUNTRk5fSVRFTVMKZGlmZiAtLWdpdCBhL21rc2gvc3JjL2V2YWwuYyBiL21rc2gvc3JjL2V2YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjJlMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvZXZhbC5jCkBAIC0wLDAgKzEsMTU4MCBAQAorLyoJJE9wZW5CU0Q6IGV2YWwuYyx2IDEuMzUgMjAxMC8wMy8yNCAwODoyNzoyNiBmZ3NjaCBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2luY2x1ZGUgInNoLmgiCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2V2YWwuYyx2IDEuOTAgMjAxMC8wNy8xNyAyMjowOTozMyB0ZyBFeHAgJCIpOworCisvKgorICogc3RyaW5nIGV4cGFuc2lvbgorICoKKyAqIGZpcnN0IHBhc3M6IHF1b3RpbmcsIElGUyBzZXBhcmF0aW9uLCB+LCAke30sICQoKSBhbmQgJCgoKSkgc3Vic3RpdHV0aW9uLgorICogc2Vjb25kIHBhc3M6IGFsdGVybmF0aW9uICh7LH0pLCBmaWxlbmFtZSBleHBhbnNpb24gKCo/W10pLgorICovCisKKy8qIGV4cGFuc2lvbiBnZW5lcmF0b3Igc3RhdGUgKi8KK3R5cGVkZWYgc3RydWN0IEV4cGFuZCB7CisJLyogaW50IHR5cGU7ICovCQkJLyogc2VlIGV4cGFuZCgpICovCisJY29uc3QgY2hhciAqc3RyOwkJLyogc3RyaW5nICovCisJdW5pb24geworCQljb25zdCBjaGFyICoqc3RydjsJLyogc3RyaW5nW10gKi8KKwkJc3RydWN0IHNoZiAqc2hmOwkvKiBmaWxlICovCisJfSB1OwkJCQkvKiBzb3VyY2UgKi8KKwlzdHJ1Y3QgdGJsICp2YXI7CQkvKiB2YXJpYWJsZSBpbiAke3Zhci4ufSAqLworCXNob3J0IHNwbGl0OwkJCS8qIHNwbGl0ICIkQCIgLyBjYWxsIHdhaXRsYXN0ICQoKSAqLworfSBFeHBhbmQ7CisKKyNkZWZpbmUJWEJBU0UJCTAJLyogc2Nhbm5pbmcgb3JpZ2luYWwgKi8KKyNkZWZpbmUJWFNVQgkJMQkvKiBleHBhbmRpbmcgJHt9IHN0cmluZyAqLworI2RlZmluZQlYQVJHU0VQCQkyCS8qIGlmczAgYmV0d2VlbiAiJCoiICovCisjZGVmaW5lCVhBUkcJCTMJLyogZXhwYW5kaW5nICQqLCAkQCAqLworI2RlZmluZQlYQ09NCQk0CS8qIGV4cGFuZGluZyAkKCkgKi8KKyNkZWZpbmUgWE5VTExTVUIJNQkvKiAiJEAiIHdoZW4gJCMgaXMgMCAoZG9uJ3QgZ2VuZXJhdGUgd29yZCkgKi8KKyNkZWZpbmUgWFNVQk1JRAkJNgkvKiBtaWRkbGUgb2YgZXhwYW5kaW5nICR7fSAqLworCisvKiBTdGF0ZXMgdXNlZCBmb3IgZmllbGQgc3BsaXR0aW5nICovCisjZGVmaW5lIElGU19XT1JECTAJLyogd29yZCBoYXMgY2hhcnMgKG9yIHF1b3RlcykgKi8KKyNkZWZpbmUgSUZTX1dTCQkxCS8qIGhhdmUgc2VlbiBJRlMgd2hpdGUtc3BhY2UgKi8KKyNkZWZpbmUgSUZTX05XUwkJMgkvKiBoYXZlIHNlZW4gSUZTIG5vbi13aGl0ZS1zcGFjZSAqLworCitzdGF0aWMgaW50IHZhcnN1YihFeHBhbmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCAqLCBpbnQgKik7CitzdGF0aWMgaW50IGNvbXN1YihFeHBhbmQgKiwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyBjaGFyICp0cmltc3ViKGNoYXIgKiwgY2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQgZ2xvYihjaGFyICosIFhQdHJWICosIGludCk7CitzdGF0aWMgdm9pZCBnbG9iaXQoWFN0cmluZyAqLCBjaGFyICoqLCBjaGFyICosIFhQdHJWICosIGludCk7CitzdGF0aWMgY29uc3QgY2hhciAqbWF5YmVfZXhwYW5kX3RpbGRlKGNvbnN0IGNoYXIgKiwgWFN0cmluZyAqLCBjaGFyICoqLCBpbnQpOworc3RhdGljIGNoYXIgKnRpbGRlKGNoYXIgKik7CisjaWZuZGVmIE1LU0hfTk9QV05BTQorc3RhdGljIGNoYXIgKmhvbWVkaXIoY2hhciAqKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgYWx0X2V4cGFuZChYUHRyViAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQpOworc3RhdGljIHNpemVfdCB1dGZsZW4oY29uc3QgY2hhciAqKTsKK3N0YXRpYyB2b2lkIHV0ZmluY3B0cihjb25zdCBjaGFyICosIG1rc2hfYXJpX3QgKik7CisKKy8qIFVURk1PREUgZnVuY3Rpb25zICovCitzdGF0aWMgc2l6ZV90Cit1dGZsZW4oY29uc3QgY2hhciAqcykKK3sKKwlzaXplX3QgbjsKKworCWlmIChVVEZNT0RFKSB7CisJCW4gPSAwOworCQl3aGlsZSAoKnMpIHsKKwkJCXMgKz0gdXRmX3B0cmFkaihzKTsKKwkJCSsrbjsKKwkJfQorCX0gZWxzZQorCQluID0gc3RybGVuKHMpOworCXJldHVybiAobik7Cit9CisKK3N0YXRpYyB2b2lkCit1dGZpbmNwdHIoY29uc3QgY2hhciAqcywgbWtzaF9hcmlfdCAqbHApCit7CisJY29uc3QgY2hhciAqY3AgPSBzOworCisJd2hpbGUgKCgqbHApLS0pCisJCWNwICs9IHV0Zl9wdHJhZGooY3ApOworCSpscCA9IGNwIC0gczsKK30KKworLyogY29tcGlsZSBhbmQgZXhwYW5kIHdvcmQgKi8KK2NoYXIgKgorc3Vic3RpdHV0ZShjb25zdCBjaGFyICpjcCwgaW50IGYpCit7CisJc3RydWN0IHNvdXJjZSAqcywgKnNvbGQ7CisKKwlzb2xkID0gc291cmNlOworCXMgPSBwdXNocyhTV1NUUiwgQVRFTVApOworCXMtPnN0YXJ0ID0gcy0+c3RyID0gY3A7CisJc291cmNlID0gczsKKwlpZiAoeXlsZXgoT05FV09SRCkgIT0gTFdPUkQpCisJCWludGVybmFsX2Vycm9yZigic3Vic3RpdHV0ZSIpOworCXNvdXJjZSA9IHNvbGQ7CisJYWZyZWUocywgQVRFTVApOworCXJldHVybiAoZXZhbHN0cih5eWx2YWwuY3AsIGYpKTsKK30KKworLyoKKyAqIGV4cGFuZCBhcmctbGlzdAorICovCitjaGFyICoqCitldmFsKGNvbnN0IGNoYXIgKiphcCwgaW50IGYpCit7CisJWFB0clYgdzsKKworCWlmICgqYXAgPT0gTlVMTCkgeworCQl1bmlvbiBta3NoX2NjcGhhY2sgdmFwOworCisJCXZhcC5ybyA9IGFwOworCQlyZXR1cm4gKHZhcC5ydyk7CisJfQorCVhQaW5pdCh3LCAzMik7CisJWFBwdXQodywgTlVMTCk7CQkvKiBzcGFjZSBmb3Igc2hlbGwgbmFtZSAqLworCXdoaWxlICgqYXAgIT0gTlVMTCkKKwkJZXhwYW5kKCphcCsrLCAmdywgZik7CisJWFBwdXQodywgTlVMTCk7CisJcmV0dXJuICgoY2hhciAqKilYUGNsb3NlKHcpICsgMSk7Cit9CisKKy8qCisgKiBleHBhbmQgc3RyaW5nCisgKi8KK2NoYXIgKgorZXZhbHN0cihjb25zdCBjaGFyICpjcCwgaW50IGYpCit7CisJWFB0clYgdzsKKwljaGFyICpkcCA9IG51bGw7CisKKwlYUGluaXQodywgMSk7CisJZXhwYW5kKGNwLCAmdywgZik7CisJaWYgKFhQc2l6ZSh3KSkKKwkJZHAgPSAqWFBwdHJ2KHcpOworCVhQZnJlZSh3KTsKKwlyZXR1cm4gKGRwKTsKK30KKworLyoKKyAqIGV4cGFuZCBzdHJpbmcgLSByZXR1cm4gb25seSBvbmUgY29tcG9uZW50CisgKiB1c2VkIGZyb20gaW9zZXR1cCB0byBleHBhbmQgcmVkaXJlY3Rpb24gZmlsZXMKKyAqLworY2hhciAqCitldmFsb25lc3RyKGNvbnN0IGNoYXIgKmNwLCBpbnQgZikKK3sKKwlYUHRyViB3OworCWNoYXIgKnJ2OworCisJWFBpbml0KHcsIDEpOworCWV4cGFuZChjcCwgJncsIGYpOworCXN3aXRjaCAoWFBzaXplKHcpKSB7CisJY2FzZSAwOgorCQlydiA9IG51bGw7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcnYgPSAoY2hhciAqKSAqWFBwdHJ2KHcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlydiA9IGV2YWxzdHIoY3AsIGYmfkRPR0xPQik7CisJCWJyZWFrOworCX0KKwlYUGZyZWUodyk7CisJcmV0dXJuIChydik7Cit9CisKKy8qIGZvciBuZXN0ZWQgc3Vic3RpdHV0aW9uOiAke3Zhcjo9JHZhcjJ9ICovCit0eXBlZGVmIHN0cnVjdCBTdWJUeXBlIHsKKwlzdHJ1Y3QgdGJsICp2YXI7CS8qIHZhcmlhYmxlIGZvciAke3Zhci4ufSAqLworCXN0cnVjdCBTdWJUeXBlICpwcmV2OwkvKiBvbGQgdHlwZSAqLworCXN0cnVjdCBTdWJUeXBlICpuZXh0OwkvKiBwb3BlZCB0eXBlICh0byBhdm9pZCByZS1hbGxvY2F0aW5nKSAqLworCXNob3J0CXN0eXBlOwkJLyogWz0rLT8lI10gYWN0aW9uIGFmdGVyIGV4cGFuZGVkIHdvcmQgKi8KKwlzaG9ydAliYXNlOwkJLyogYmVnaW4gcG9zaXRpb24gb2YgZXhwYW5kZWQgd29yZCAqLworCXNob3J0CWY7CQkvKiBzYXZlZCB2YWx1ZSBvZiBmIChET1BBVCwgZXRjKSAqLworCXVpbnQ4X3QJcXVvdGVwOwkJLyogc2F2ZWQgdmFsdWUgb2YgcXVvdGUgKGZvciAkey4uWyUjXS4ufSkgKi8KKwl1aW50OF90CXF1b3RldzsJCS8qIHNhdmVkIHZhbHVlIG9mIHF1b3RlIChmb3IgJHsuLlsrLT1dLi59KSAqLworfSBTdWJUeXBlOworCit2b2lkCitleHBhbmQoY29uc3QgY2hhciAqY3AsCS8qIGlucHV0IHdvcmQgKi8KKyAgICBYUHRyViAqd3AsCQkvKiBvdXRwdXQgd29yZHMgKi8KKyAgICBpbnQgZikJCS8qIERPKiBmbGFncyAqLworeworCWludCBjID0gMDsKKwlpbnQgdHlwZTsJCS8qIGV4cGFuc2lvbiB0eXBlICovCisJaW50IHF1b3RlID0gMDsJCS8qIHF1b3RlZCAqLworCVhTdHJpbmcgZHM7CQkvKiBkZXN0aW5hdGlvbiBzdHJpbmcgKi8KKwljaGFyICpkcDsJCS8qIGRlc3RpbmF0aW9uICovCisJY29uc3QgY2hhciAqc3A7CQkvKiBzb3VyY2UgKi8KKwlpbnQgZmRvLCB3b3JkOwkJLyogc2Vjb25kIHBhc3MgZmxhZ3M7IGhhdmUgd29yZCAqLworCWludCBkb2JsYW5rOwkJLyogZmllbGQgc3BsaXR0aW5nIG9mIHBhcmFtZXRlci9jb21tYW5kIHN1YnN0ICovCisJRXhwYW5kIHggPSB7CQkvKiBleHBhbnNpb24gdmFyaWFibGVzICovCisJCU5VTEwsIHsgTlVMTCB9LCBOVUxMLCAwCisJfTsKKwlTdWJUeXBlIHN0X2hlYWQsICpzdDsKKwlpbnQgbmV3bGluZXMgPSAwOyAvKiBGb3IgdHJhaWxpbmcgbmV3bGluZXMgaW4gQ09NU1VCICovCisJaW50IHNhd19lcSwgdGlsZGVfb2s7CisJaW50IG1ha2VfbWFnaWM7CisJc2l6ZV90IGxlbjsKKworCWlmIChjcCA9PSBOVUxMKQorCQlpbnRlcm5hbF9lcnJvcmYoImV4cGFuZChOVUxMKSIpOworCS8qIGZvciBhbGlhcywgcmVhZG9ubHksIHNldCwgdHlwZXNldCBjb21tYW5kcyAqLworCWlmICgoZiAmIERPVkFDSEVDSykgJiYgaXNfd2R2YXJhc3NpZ24oY3ApKSB7CisJCWYgJj0gfihET1ZBQ0hFQ0t8RE9CTEFOS3xET0dMT0J8RE9USUxERSk7CisJCWYgfD0gRE9BU05USUxERTsKKwl9CisJaWYgKEZsYWcoRk5PR0xPQikpCisJCWYgJj0gfkRPR0xPQjsKKwlpZiAoRmxhZyhGTUFSS0RJUlMpKQorCQlmIHw9IERPTUFSS0RJUlM7CisJaWYgKEZsYWcoRkJSQUNFRVhQQU5EKSAmJiAoZiAmIERPR0xPQikpCisJCWYgfD0gRE9CUkFDRV87CisKKwlYaW5pdChkcywgZHAsIDEyOCwgQVRFTVApOwkvKiBpbml0IGRlc3QuIHN0cmluZyAqLworCXR5cGUgPSBYQkFTRTsKKwlzcCA9IGNwOworCWZkbyA9IDA7CisJc2F3X2VxID0gMDsKKwl0aWxkZV9vayA9IChmICYgKERPVElMREV8RE9BU05USUxERSkpID8gMSA6IDA7IC8qIG11c3QgYmUgMS8wICovCisJZG9ibGFuayA9IDA7CisJbWFrZV9tYWdpYyA9IDA7CisJd29yZCA9IChmJkRPQkxBTkspID8gSUZTX1dTIDogSUZTX1dPUkQ7CisJLyogY2xhbmcgZG9lc24ndCBrbm93IE9TVUJTVCBjb21lcyBiZWZvcmUgQ1NVQlNUICovCisJbWVtc2V0KCZzdF9oZWFkLCAwLCBzaXplb2Yoc3RfaGVhZCkpOworCXN0ID0gJnN0X2hlYWQ7CisKKwl3aGlsZSAoMSkgeworCQlYY2hlY2soZHMsIGRwKTsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBYQkFTRToJLyogb3JpZ2luYWwgcHJlZml4ZWQgc3RyaW5nICovCisJCQljID0gKnNwKys7CisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgRU9TOgorCQkJCWMgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSBDSEFSOgorCQkJCWMgPSAqc3ArKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgUUNIQVI6CisJCQkJcXVvdGUgfD0gMjsgLyogdGVtcG9yYXJ5IHF1b3RlICovCisJCQkJYyA9ICpzcCsrOworCQkJCWJyZWFrOworCQkJY2FzZSBPUVVPVEU6CisJCQkJd29yZCA9IElGU19XT1JEOworCQkJCXRpbGRlX29rID0gMDsKKwkJCQlxdW90ZSA9IDE7CisJCQkJY29udGludWU7CisJCQljYXNlIENRVU9URToKKwkJCQlxdW90ZSA9IHN0LT5xdW90ZXc7CisJCQkJY29udGludWU7CisJCQljYXNlIENPTVNVQjoKKwkJCQl0aWxkZV9vayA9IDA7CisJCQkJaWYgKGYgJiBET05UUlVOQ09NTUFORCkgeworCQkJCQl3b3JkID0gSUZTX1dPUkQ7CisJCQkJCSpkcCsrID0gJyQnOyAqZHArKyA9ICcoJzsKKwkJCQkJd2hpbGUgKCpzcCAhPSAnXDAnKSB7CisJCQkJCQlYY2hlY2soZHMsIGRwKTsKKwkJCQkJCSpkcCsrID0gKnNwKys7CisJCQkJCX0KKwkJCQkJKmRwKysgPSAnKSc7CisJCQkJfSBlbHNlIHsKKwkJCQkJdHlwZSA9IGNvbXN1YigmeCwgc3ApOworCQkJCQlpZiAodHlwZSA9PSBYQ09NICYmIChmJkRPQkxBTkspKQorCQkJCQkJZG9ibGFuaysrOworCQkJCQlzcCA9IHN0cm51bChzcCkgKyAxOworCQkJCQluZXdsaW5lcyA9IDA7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJY2FzZSBFWFBSU1VCOgorCQkJCXdvcmQgPSBJRlNfV09SRDsKKwkJCQl0aWxkZV9vayA9IDA7CisJCQkJaWYgKGYgJiBET05UUlVOQ09NTUFORCkgeworCQkJCQkqZHArKyA9ICckJzsgKmRwKysgPSAnKCc7ICpkcCsrID0gJygnOworCQkJCQl3aGlsZSAoKnNwICE9ICdcMCcpIHsKKwkJCQkJCVhjaGVjayhkcywgZHApOworCQkJCQkJKmRwKysgPSAqc3ArKzsKKwkJCQkJfQorCQkJCQkqZHArKyA9ICcpJzsgKmRwKysgPSAnKSc7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RydWN0IHRibCB2OworCQkJCQljaGFyICpwOworCisJCQkJCXYuZmxhZyA9IERFRklORUR8SVNTRVR8SU5URUdFUjsKKwkJCQkJdi50eXBlID0gMTA7IC8qIG5vdCBkZWZhdWx0ICovCisJCQkJCXYubmFtZVswXSA9ICdcMCc7CisJCQkJCXZfZXZhbHVhdGUoJnYsIHN1YnN0aXR1dGUoc3AsIDApLAorCQkJCQkgICAgS1NIX1VOV0lORF9FUlJPUiwgdHJ1ZSk7CisJCQkJCXNwID0gc3RybnVsKHNwKSArIDE7CisJCQkJCWZvciAocCA9IHN0cl92YWwoJnYpOyAqcDsgKSB7CisJCQkJCQlYY2hlY2soZHMsIGRwKTsKKwkJCQkJCSpkcCsrID0gKnArKzsKKwkJCQkJfQorCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCWNhc2UgT1NVQlNUOiB7CS8qICR7eyN9dmFyezp9Wz0rLT8jJV13b3JkfSAqLworCQkJLyogZm9ybWF0IGlzOgorCQkJICoJT1NVQlNUIFt7eF0gcGxhaW4tdmFyaWFibGUtcGFydCBcMAorCQkJICoJICAgIGNvbXBpbGVkLXdvcmQtcGFydCBDU1VCU1QgW314XQorCQkJICogVGhpcyBpcyB3aGVyZSBhbGwgc3ludGF4IGNoZWNraW5nIGdldHMgZG9uZS4uLgorCQkJICovCisJCQkJY29uc3QgY2hhciAqdmFybmFtZSA9ICsrc3A7IC8qIHNraXAgdGhlIHsgb3IgeCAofSkgKi8KKwkJCQlpbnQgc3R5cGU7CisJCQkJaW50IHNsZW4gPSAwOworCisJCQkJc3AgPSBjc3RyY2hyKHNwLCAnXDAnKSArIDE7IC8qIHNraXAgdmFyaWFibGUgKi8KKwkJCQl0eXBlID0gdmFyc3ViKCZ4LCB2YXJuYW1lLCBzcCwgJnN0eXBlLCAmc2xlbik7CisJCQkJaWYgKHR5cGUgPCAwKSB7CisJCQkJCWNoYXIgKmJlZywgKmVuZCwgKnN0cjsKKworIHVud2luZF9zdWJzdHN5bjoKKwkJCQkJc3AgPSB2YXJuYW1lIC0gMjsgLyogcmVzdG9yZSBzcCAqLworCQkJCQllbmQgPSAoYmVnID0gd2Rjb3B5KHNwLCBBVEVNUCkpICsKKwkJCQkJICAgICh3ZHNjYW4oc3AsIENTVUJTVCkgLSBzcCk7CisJCQkJCS8qICh7KSB0aGUgfSBvciB4IGlzIGFscmVhZHkgc2tpcHBlZCAqLworCQkJCQlpZiAoZW5kIDwgd2RzY2FuKGJlZywgRU9TKSkKKwkJCQkJCSplbmQgPSBFT1M7CisJCQkJCXN0ciA9IHNucHRyZWVmKE5VTEwsIDY0LCAiJVMiLCBiZWcpOworCQkJCQlhZnJlZShiZWcsIEFURU1QKTsKKwkJCQkJZXJyb3JmKCIlczogYmFkIHN1YnN0aXR1dGlvbiIsIHN0cik7CisJCQkJfQorCQkJCWlmIChmICYgRE9CTEFOSykKKwkJCQkJZG9ibGFuaysrOworCQkJCXRpbGRlX29rID0gMDsKKwkJCQlpZiAodHlwZSA9PSBYQkFTRSkgewkvKiBleHBhbmQ/ICovCisJCQkJCWlmICghc3QtPm5leHQpIHsKKwkJCQkJCVN1YlR5cGUgKm5ld3N0OworCisJCQkJCQluZXdzdCA9IGFsbG9jKHNpemVvZihTdWJUeXBlKSwgQVRFTVApOworCQkJCQkJbmV3c3QtPm5leHQgPSBOVUxMOworCQkJCQkJbmV3c3QtPnByZXYgPSBzdDsKKwkJCQkJCXN0LT5uZXh0ID0gbmV3c3Q7CisJCQkJCX0KKwkJCQkJc3QgPSBzdC0+bmV4dDsKKwkJCQkJc3QtPnN0eXBlID0gc3R5cGU7CisJCQkJCXN0LT5iYXNlID0gWHNhdmVwb3MoZHMsIGRwKTsKKwkJCQkJc3QtPmYgPSBmOworCQkJCQlzdC0+dmFyID0geC52YXI7CisJCQkJCXN0LT5xdW90ZXcgPSBzdC0+cXVvdGVwID0gcXVvdGU7CisJCQkJCS8qIHNraXAgcXVhbGlmaWVyKHMpICovCisJCQkJCWlmIChzdHlwZSkKKwkJCQkJCXNwICs9IHNsZW47CisJCQkJCXN3aXRjaCAoc3R5cGUgJiAweDdmKSB7CisJCQkJCWNhc2UgJzAnOiB7CisJCQkJCQljaGFyICpiZWcsICptaWQsICplbmQsICpzdGc7CisJCQkJCQlta3NoX2FyaV90IGZyb20gPSAwLCBudW0gPSAtMSwgZmxlbiwgZmluYyA9IDA7CisKKwkJCQkJCWJlZyA9IHdkY29weShzcCwgQVRFTVApOworCQkJCQkJbWlkID0gYmVnICsgKHdkc2NhbihzcCwgQURFTElNKSAtIHNwKTsKKwkJCQkJCXN0ZyA9IGJlZyArICh3ZHNjYW4oc3AsIENTVUJTVCkgLSBzcCk7CisJCQkJCQlpZiAobWlkID49IHN0ZykKKwkJCQkJCQlnb3RvIHVud2luZF9zdWJzdHN5bjsKKwkJCQkJCW1pZFstMl0gPSBFT1M7CisJCQkJCQlpZiAobWlkWy0xXSA9PSAvKnsqLyd9JykgeworCQkJCQkJCXNwICs9IG1pZCAtIGJlZyAtIDE7CisJCQkJCQkJZW5kID0gTlVMTDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZW5kID0gbWlkICsKKwkJCQkJCQkgICAgKHdkc2NhbihtaWQsIEFERUxJTSkgLSBtaWQpOworCQkJCQkJCWlmIChlbmQgPj0gc3RnKQorCQkJCQkJCQlnb3RvIHVud2luZF9zdWJzdHN5bjsKKwkJCQkJCQllbmRbLTJdID0gRU9TOworCQkJCQkJCXNwICs9IGVuZCAtIGJlZyAtIDE7CisJCQkJCQl9CisJCQkJCQlldmFsdWF0ZShzdWJzdGl0dXRlKHN0ZyA9IHdkc3RyaXAoYmVnLCBmYWxzZSwgZmFsc2UpLCAwKSwKKwkJCQkJCSAgICAmZnJvbSwgS1NIX1VOV0lORF9FUlJPUiwgdHJ1ZSk7CisJCQkJCQlhZnJlZShzdGcsIEFURU1QKTsKKwkJCQkJCWlmIChlbmQpIHsKKwkJCQkJCQlldmFsdWF0ZShzdWJzdGl0dXRlKHN0ZyA9IHdkc3RyaXAobWlkLCBmYWxzZSwgZmFsc2UpLCAwKSwKKwkJCQkJCQkgICAgJm51bSwgS1NIX1VOV0lORF9FUlJPUiwgdHJ1ZSk7CisJCQkJCQkJYWZyZWUoc3RnLCBBVEVNUCk7CisJCQkJCQl9CisJCQkJCQlhZnJlZShiZWcsIEFURU1QKTsKKwkJCQkJCWJlZyA9IHN0cl92YWwoc3QtPnZhcik7CisJCQkJCQlmbGVuID0gdXRmbGVuKGJlZyk7CisJCQkJCQlpZiAoZnJvbSA8IDApIHsKKwkJCQkJCQlpZiAoLWZyb20gPCBmbGVuKQorCQkJCQkJCQlmaW5jID0gZmxlbiArIGZyb207CisJCQkJCQl9IGVsc2UKKwkJCQkJCQlmaW5jID0gZnJvbSA8IGZsZW4gPyBmcm9tIDogZmxlbjsKKwkJCQkJCWlmIChVVEZNT0RFKQorCQkJCQkJCXV0ZmluY3B0cihiZWcsICZmaW5jKTsKKwkJCQkJCWJlZyArPSBmaW5jOworCQkJCQkJZmxlbiA9IHV0ZmxlbihiZWcpOworCQkJCQkJaWYgKG51bSA8IDAgfHwgbnVtID4gZmxlbikKKwkJCQkJCQludW0gPSBmbGVuOworCQkJCQkJaWYgKFVURk1PREUpCisJCQkJCQkJdXRmaW5jcHRyKGJlZywgJm51bSk7CisJCQkJCQlzdHJuZHVweCh4LnN0ciwgYmVnLCBudW0sIEFURU1QKTsKKwkJCQkJCWdvdG8gZG9fQ1NVQlNUOworCQkJCQl9CisJCQkJCWNhc2UgJy8nOiB7CisJCQkJCQljaGFyICpzLCAqcCwgKmQsICpzYmVnLCAqZW5kOworCQkJCQkJY2hhciAqcGF0LCAqcnJlcDsKKwkJCQkJCWNoYXIgKnRwYXQwLCAqdHBhdDEsICp0cGF0MjsKKworCQkJCQkJcyA9IHdkY29weShzcCwgQVRFTVApOworCQkJCQkJcCA9IHMgKyAod2RzY2FuKHNwLCBBREVMSU0pIC0gc3ApOworCQkJCQkJZCA9IHMgKyAod2RzY2FuKHNwLCBDU1VCU1QpIC0gc3ApOworCQkJCQkJaWYgKHAgPj0gZCkKKwkJCQkJCQlnb3RvIHVud2luZF9zdWJzdHN5bjsKKwkJCQkJCXBbLTJdID0gRU9TOworCQkJCQkJaWYgKHBbLTFdID09IC8qeyovJ30nKQorCQkJCQkJCWQgPSBOVUxMOworCQkJCQkJZWxzZQorCQkJCQkJCWRbLTJdID0gRU9TOworCQkJCQkJc3AgKz0gKGQgPyBkIDogcCkgLSBzIC0gMTsKKwkJCQkJCXRwYXQwID0gd2RzdHJpcChzLCB0cnVlLCB0cnVlKTsKKwkJCQkJCXBhdCA9IHN1YnN0aXR1dGUodHBhdDAsIDApOworCQkJCQkJaWYgKGQpIHsKKwkJCQkJCQlkID0gd2RzdHJpcChwLCB0cnVlLCBmYWxzZSk7CisJCQkJCQkJcnJlcCA9IHN1YnN0aXR1dGUoZCwgMCk7CisJCQkJCQkJYWZyZWUoZCwgQVRFTVApOworCQkJCQkJfSBlbHNlCisJCQkJCQkJcnJlcCA9IG51bGw7CisJCQkJCQlhZnJlZShzLCBBVEVNUCk7CisJCQkJCQlzID0gZCA9IHBhdDsKKwkJCQkJCXdoaWxlICgqcykKKwkJCQkJCQlpZiAoKnMgIT0gJ1xcJyB8fAorCQkJCQkJCSAgICBzWzFdID09ICclJyB8fAorCQkJCQkJCSAgICBzWzFdID09ICcjJyB8fAorCQkJCQkJCSAgICBzWzFdID09ICdcMCcgfHwKKwkJCQkvKiBYWFggcmVhbGx5PyAqLwkgICAgc1sxXSA9PSAnXFwnIHx8CisJCQkJCQkJICAgIHNbMV0gPT0gJy8nKQorCQkJCQkJCQkqZCsrID0gKnMrKzsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXMrKzsKKwkJCQkJCSpkID0gJ1wwJzsKKwkJCQkJCWFmcmVlKHRwYXQwLCBBVEVNUCk7CisKKwkJCQkJCS8qIHJlamVjdCBlbXB0eSBwYXR0ZXJuICovCisJCQkJCQlpZiAoISpwYXQgfHwgZ21hdGNoeCgiIiwgcGF0LCBmYWxzZSkpCisJCQkJCQkJZ290byBub19yZXBsOworCisJCQkJCQkvKiBwcmVwYXJlIHN0cmluZyBvbiB3aGljaCB0byB3b3JrICovCisJCQkJCQlzdHJkdXB4KHMsIHN0cl92YWwoc3QtPnZhciksIEFURU1QKTsKKwkJCQkJCXNiZWcgPSBzOworCisJCQkJCQkvKiBmaXJzdCBzZWUgaWYgd2UgaGF2ZSBhbnkgbWF0Y2ggYXQgYWxsICovCisJCQkJCQl0cGF0MCA9IHBhdDsKKwkJCQkJCWlmICgqcGF0ID09ICcjJykgeworCQkJCQkJCS8qIGFuY2hvciBhdCB0aGUgYmVnaW5uaW5nICovCisJCQkJCQkJdHBhdDEgPSBzaGZfc21wcmludGYoIiVzJWMqIiwgKyt0cGF0MCwgTUFHSUMpOworCQkJCQkJCXRwYXQyID0gdHBhdDE7CisJCQkJCQl9IGVsc2UgaWYgKCpwYXQgPT0gJyUnKSB7CisJCQkJCQkJLyogYW5jaG9yIGF0IHRoZSBlbmQgKi8KKwkJCQkJCQl0cGF0MSA9IHNoZl9zbXByaW50ZigiJWMqJXMiLCBNQUdJQywgKyt0cGF0MCk7CisJCQkJCQkJdHBhdDIgPSB0cGF0MDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLyogZmxvYXQgKi8KKwkJCQkJCQl0cGF0MSA9IHNoZl9zbXByaW50ZigiJWMqJXMlYyoiLCBNQUdJQywgcGF0LCBNQUdJQyk7CisJCQkJCQkJdHBhdDIgPSB0cGF0MSArIDI7CisJCQkJCQl9CisgYWdhaW5fcmVwbDoKKwkJCQkJCS8qIHRoaXMgd291bGQgbm90IGJlIG5lY2Vzc2FyeSBpZiBnbWF0Y2h4IHdvdWxkIHJldHVybgorCQkJCQkJICogdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIG9mIGEgbWF0Y2ggZm91bmQsIGxpa2UgcmUqCisJCQkJCQkgKi8KKwkJCQkJCWlmICghZ21hdGNoeChzYmVnLCB0cGF0MSwgZmFsc2UpKQorCQkJCQkJCWdvdG8gZW5kX3JlcGw7CisJCQkJCQllbmQgPSBzdHJudWwocyk7CisJCQkJCQkvKiBub3cgYW5jaG9yIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1hdGNoICovCisJCQkJCQlpZiAoKnBhdCAhPSAnIycpCisJCQkJCQkJd2hpbGUgKHNiZWcgPD0gZW5kKSB7CisJCQkJCQkJCWlmIChnbWF0Y2h4KHNiZWcsIHRwYXQyLCBmYWxzZSkpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJZWxzZQorCQkJCQkJCQkJc2JlZysrOworCQkJCQkJCX0KKwkJCQkJCS8qIG5vdyBhbmNob3IgdGhlIGVuZCBvZiB0aGUgbWF0Y2ggKi8KKwkJCQkJCXAgPSBlbmQ7CisJCQkJCQlpZiAoKnBhdCAhPSAnJScpCisJCQkJCQkJd2hpbGUgKHAgPj0gc2JlZykgeworCQkJCQkJCQlib29sIGdvdG1hdGNoOworCisJCQkJCQkJCWMgPSAqcDsgKnAgPSAnXDAnOworCQkJCQkJCQlnb3RtYXRjaCA9IGdtYXRjaHgoc2JlZywgdHBhdDAsIGZhbHNlKTsKKwkJCQkJCQkJKnAgPSBjOworCQkJCQkJCQlpZiAoZ290bWF0Y2gpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJcC0tOworCQkJCQkJCX0KKwkJCQkJCXN0cm5kdXB4KGVuZCwgcywgc2JlZyAtIHMsIEFURU1QKTsKKwkJCQkJCWQgPSBzaGZfc21wcmludGYoIiVzJXMlcyIsIGVuZCwgcnJlcCwgcCk7CisJCQkJCQlhZnJlZShlbmQsIEFURU1QKTsKKwkJCQkJCXNiZWcgPSBkICsgKHNiZWcgLSBzKSArIHN0cmxlbihycmVwKTsKKwkJCQkJCWFmcmVlKHMsIEFURU1QKTsKKwkJCQkJCXMgPSBkOworCQkJCQkJaWYgKHN0eXBlICYgMHg4MCkKKwkJCQkJCQlnb3RvIGFnYWluX3JlcGw7CisgZW5kX3JlcGw6CisJCQkJCQlhZnJlZSh0cGF0MSwgQVRFTVApOworCQkJCQkJeC5zdHIgPSBzOworIG5vX3JlcGw6CisJCQkJCQlhZnJlZShwYXQsIEFURU1QKTsKKwkJCQkJCWlmIChycmVwICE9IG51bGwpCisJCQkJCQkJYWZyZWUocnJlcCwgQVRFTVApOworCQkJCQkJZ290byBkb19DU1VCU1Q7CisJCQkJCX0KKwkJCQkJY2FzZSAnIyc6CisJCQkJCWNhc2UgJyUnOgorCQkJCQkJLyogISBET0JMQU5LLERPQlJBQ0VfLERPVElMREUgKi8KKwkJCQkJCWYgPSBET1BBVCB8IChmJkRPTlRSVU5DT01NQU5EKSB8CisJCQkJCQkgICAgRE9URU1QXzsKKwkJCQkJCXN0LT5xdW90ZXcgPSBxdW90ZSA9IDA7CisJCQkJCQkvKiBQcmVwZW5kIG9wZW4gcGF0dGVybiAoc28gfAorCQkJCQkJICogaW4gYSB0cmltIHdpbGwgd29yayBhcworCQkJCQkJICogZXhwZWN0ZWQpCisJCQkJCQkgKi8KKwkJCQkJCSpkcCsrID0gTUFHSUM7CisJCQkJCQkqZHArKyA9IChjaGFyKSgnQCcgfCAweDgwKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICc9JzoKKwkJCQkJCS8qIEVuYWJsaW5nIHRpbGRlIGV4cGFuc2lvbgorCQkJCQkJICogYWZ0ZXIgOnMgaGVyZSBpcworCQkJCQkJICogbm9uLXN0YW5kYXJkIGtzaCwgYnV0IGlzCisJCQkJCQkgKiBjb25zaXN0ZW50IHdpdGggcnVsZXMgZm9yCisJCQkJCQkgKiBvdGhlciBhc3NpZ25tZW50cy4gTm90CisJCQkJCQkgKiBzdXJlIHdoYXQgUE9TSVggdGhpbmtzIG9mCisJCQkJCQkgKiB0aGlzLgorCQkJCQkJICogTm90IGRvaW5nIHRpbGRlIGV4cGFuc2lvbgorCQkJCQkJICogZm9yIGludGVnZXIgdmFyaWFibGVzIGlzIGEKKwkJCQkJCSAqIG5vbi1QT1NJWCB0aGluZyAtIG1ha2VzCisJCQkJCQkgKiBzZW5zZSB0aG91Z2gsIHNpbmNlIH4gaXMKKwkJCQkJCSAqIGEgYXJpdGhtZXRpYyBvcGVyYXRvci4KKwkJCQkJCSAqLworCQkJCQkJaWYgKCEoeC52YXItPmZsYWcgJiBJTlRFR0VSKSkKKwkJCQkJCQlmIHw9IERPQVNOVElMREV8RE9USUxERTsKKwkJCQkJCWYgfD0gRE9URU1QXzsKKwkJCQkJCS8qIFRoZXNlIHdpbGwgYmUgZG9uZSBhZnRlciB0aGUKKwkJCQkJCSAqIHZhbHVlIGhhcyBiZWVuIGFzc2lnbmVkLgorCQkJCQkJICovCisJCQkJCQlmICY9IH4oRE9CTEFOS3xET0dMT0J8RE9CUkFDRV8pOworCQkJCQkJdGlsZGVfb2sgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJz8nOgorCQkJCQkJZiAmPSB+RE9CTEFOSzsKKwkJCQkJCWYgfD0gRE9URU1QXzsKKwkJCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQkJCWRlZmF1bHQ6CisJCQkJCQkvKiBFbmFibGUgdGlsZGUgZXhwYW5zaW9uICovCisJCQkJCQl0aWxkZV9vayA9IDE7CisJCQkJCQlmIHw9IERPVElMREU7CisJCQkJCX0KKwkJCQl9IGVsc2UKKwkJCQkJLyogc2tpcCB3b3JkICovCisJCQkJCXNwICs9IHdkc2NhbihzcCwgQ1NVQlNUKSAtIHNwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY2FzZSBDU1VCU1Q6IC8qIG9ubHkgZ2V0IGhlcmUgaWYgZXhwYW5kaW5nIHdvcmQgKi8KKyBkb19DU1VCU1Q6CisJCQkJc3ArKzsgLyogKHspIHNraXAgdGhlIH0gb3IgeCAqLworCQkJCXRpbGRlX29rID0gMDsJLyogaW4gY2FzZSBvZiAke3Vuc2V0Oi19ICovCisJCQkJKmRwID0gJ1wwJzsKKwkJCQlxdW90ZSA9IHN0LT5xdW90ZXA7CisJCQkJZiA9IHN0LT5mOworCQkJCWlmIChmJkRPQkxBTkspCisJCQkJCWRvYmxhbmstLTsKKwkJCQlzd2l0Y2ggKHN0LT5zdHlwZSYweDdmKSB7CisJCQkJY2FzZSAnIyc6CisJCQkJY2FzZSAnJSc6CisJCQkJCS8qIEFwcGVuZCBlbmQtcGF0dGVybiAqLworCQkJCQkqZHArKyA9IE1BR0lDOyAqZHArKyA9ICcpJzsgKmRwID0gJ1wwJzsKKwkJCQkJZHAgPSBYcmVzdHBvcyhkcywgZHAsIHN0LT5iYXNlKTsKKwkJCQkJLyogTXVzdCB1c2Ugc3QtPnZhciBzaW5jZSBjYWxsaW5nCisJCQkJCSAqIGdsb2JhbCB3b3VsZCBicmVhayB0aGluZ3MKKwkJCQkJICogbGlrZSB4W2krPTFdLgorCQkJCQkgKi8KKwkJCQkJeC5zdHIgPSB0cmltc3ViKHN0cl92YWwoc3QtPnZhciksCisJCQkJCQlkcCwgc3QtPnN0eXBlKTsKKwkJCQkJaWYgKHguc3RyWzBdICE9ICdcMCcgfHwgc3QtPnF1b3RlcCkKKwkJCQkJCXR5cGUgPSBYU1VCOworCQkJCQllbHNlCisJCQkJCQl0eXBlID0gWE5VTExTVUI7CisJCQkJCWlmIChmJkRPQkxBTkspCisJCQkJCQlkb2JsYW5rKys7CisJCQkJCXN0ID0gc3QtPnByZXY7CisJCQkJCWNvbnRpbnVlOworCQkJCWNhc2UgJz0nOgorCQkJCQkvKiBSZXN0b3JlIG91ciBwb3NpdGlvbiBhbmQgc3Vic3RpdHV0ZQorCQkJCQkgKiB0aGUgdmFsdWUgb2Ygc3QtPnZhciAobWF5IG5vdCBiZQorCQkJCQkgKiB0aGUgYXNzaWduZWQgdmFsdWUgaW4gdGhlIHByZXNlbmNlCisJCQkJCSAqIG9mIGludGVnZXIvcmlnaHQtYWRqL2V0YyBhdHRyaWJ1dGVzKS4KKwkJCQkJICovCisJCQkJCWRwID0gWHJlc3Rwb3MoZHMsIGRwLCBzdC0+YmFzZSk7CisJCQkJCS8qIE11c3QgdXNlIHN0LT52YXIgc2luY2UgY2FsbGluZworCQkJCQkgKiBnbG9iYWwgd291bGQgY2F1c2Ugd2l0aCB0aGluZ3MKKwkJCQkJICogbGlrZSB4W2krPTFdIHRvIGJlIGV2YWx1YXRlZCB0d2ljZS4KKwkJCQkJICovCisJCQkJCS8qIE5vdGU6IG5vdCBleHBvcnRlZCBieSBGRVhQT1JUCisJCQkJCSAqIGluIEFUJlQga3NoLgorCQkJCQkgKi8KKwkJCQkJLyogWFhYIFBPU0lYIHNheXMgcmVhZG9ubHkgaXMgb25seQorCQkJCQkgKiBmYXRhbCBmb3Igc3BlY2lhbCBidWlsdGlucyAoc2V0c3RyCisJCQkJCSAqIGRvZXMgcmVhZG9ubHkgY2hlY2spLgorCQkJCQkgKi8KKwkJCQkJbGVuID0gc3RybGVuKGRwKSArIDE7CisJCQkJCXNldHN0cihzdC0+dmFyLAorCQkJCQkgICAgZGVidW5rKGFsbG9jKGxlbiwgQVRFTVApLAorCQkJCQkgICAgZHAsIGxlbiksIEtTSF9VTldJTkRfRVJST1IpOworCQkJCQl4LnN0ciA9IHN0cl92YWwoc3QtPnZhcik7CisJCQkJCXR5cGUgPSBYU1VCOworCQkJCQlpZiAoZiZET0JMQU5LKQorCQkJCQkJZG9ibGFuaysrOworCQkJCQlzdCA9IHN0LT5wcmV2OworCQkJCQljb250aW51ZTsKKwkJCQljYXNlICc/JzogeworCQkJCQljaGFyICpzID0gWHJlc3Rwb3MoZHMsIGRwLCBzdC0+YmFzZSk7CisKKwkJCQkJZXJyb3JmKCIlczogJXMiLCBzdC0+dmFyLT5uYW1lLAorCQkJCQkgICAgZHAgPT0gcyA/CisJCQkJCSAgICAicGFyYW1ldGVyIG51bGwgb3Igbm90IHNldCIgOgorCQkJCQkgICAgKGRlYnVuayhzLCBzLCBzdHJsZW4ocykgKyAxKSwgcykpOworCQkJCX0KKwkJCQljYXNlICcwJzoKKwkJCQljYXNlICcvJzoKKwkJCQkJZHAgPSBYcmVzdHBvcyhkcywgZHAsIHN0LT5iYXNlKTsKKwkJCQkJdHlwZSA9IFhTVUI7CisJCQkJCWlmIChmJkRPQkxBTkspCisJCQkJCQlkb2JsYW5rKys7CisJCQkJCXN0ID0gc3QtPnByZXY7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlzdCA9IHN0LT5wcmV2OworCQkJCXR5cGUgPSBYQkFTRTsKKwkJCQljb250aW51ZTsKKworCQkJY2FzZSBPUEFUOiAvKiBvcGVuIHBhdHRlcm46ICooZm9vfGJhcikgKi8KKwkJCQkvKiBOZXh0IGNoYXIgaXMgdGhlIHR5cGUgb2YgcGF0dGVybiAqLworCQkJCW1ha2VfbWFnaWMgPSAxOworCQkJCWMgPSAqc3ArKyArIDB4ODA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1BBVDogLyogcGF0dGVybiBzZXBhcmF0b3IgKHwpICovCisJCQkJbWFrZV9tYWdpYyA9IDE7CisJCQkJYyA9ICd8JzsKKwkJCQlicmVhazsKKworCQkJY2FzZSBDUEFUOiAvKiBjbG9zZSBwYXR0ZXJuICovCisJCQkJbWFrZV9tYWdpYyA9IDE7CisJCQkJYyA9IC8qKCovICcpJzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgWE5VTExTVUI6CisJCQkvKiBTcGVjaWFsIGNhc2UgZm9yICIkQCIgKGFuZCAiJHtmb29bQF19IikgLSBubworCQkJICogd29yZCBpcyBnZW5lcmF0ZWQgaWYgJCMgaXMgMCAodW5sZXNzIHRoZXJlIGlzCisJCQkgKiBvdGhlciBzdHVmZiBpbnNpZGUgdGhlIHF1b3RlcykuCisJCQkgKi8KKwkJCXR5cGUgPSBYQkFTRTsKKwkJCWlmIChmJkRPQkxBTkspIHsKKwkJCQlkb2JsYW5rLS07CisJCQkJLyogbm90IHJlYWxseSBjb3JyZWN0OiB4PTsgIiR4JEAiIHNob3VsZAorCQkJCSAqIGdlbmVyYXRlIGEgbnVsbCBhcmd1bWVudCBhbmQKKwkJCQkgKiBzZXQgQTsgIiR7QDorfSIgc2hvdWxkbid0LgorCQkJCSAqLworCQkJCWlmIChkcCA9PSBYc3RyaW5nKGRzLCBkcCkpCisJCQkJCXdvcmQgPSBJRlNfV1M7CisJCQl9CisJCQljb250aW51ZTsKKworCQljYXNlIFhTVUI6CisJCWNhc2UgWFNVQk1JRDoKKwkJCWlmICgoYyA9ICp4LnN0cisrKSA9PSAwKSB7CisJCQkJdHlwZSA9IFhCQVNFOworCQkJCWlmIChmJkRPQkxBTkspCisJCQkJCWRvYmxhbmstLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgWEFSR1NFUDoKKwkJCXR5cGUgPSBYQVJHOworCQkJcXVvdGUgPSAxOworCQljYXNlIFhBUkc6CisJCQlpZiAoKGMgPSAqeC5zdHIrKykgPT0gJ1wwJykgeworCQkJCS8qIGZvcmNlIG51bGwgd29yZHMgdG8gYmUgY3JlYXRlZCBzbworCQkJCSAqIHNldCAtLSAnJyAyICcnOyBmb28gIiRAIiB3aWxsIGRvCisJCQkJICogdGhlIHJpZ2h0IHRoaW5nCisJCQkJICovCisJCQkJaWYgKHF1b3RlICYmIHguc3BsaXQpCisJCQkJCXdvcmQgPSBJRlNfV09SRDsKKwkJCQlpZiAoKHguc3RyID0gKngudS5zdHJ2KyspID09IE5VTEwpIHsKKwkJCQkJdHlwZSA9IFhCQVNFOworCQkJCQlpZiAoZiZET0JMQU5LKQorCQkJCQkJZG9ibGFuay0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJYyA9IGlmczA7CisJCQkJaWYgKGMgPT0gMCkgeworCQkJCQlpZiAocXVvdGUgJiYgIXguc3BsaXQpCisJCQkJCQljb250aW51ZTsKKwkJCQkJYyA9ICcgJzsKKwkJCQl9CisJCQkJaWYgKHF1b3RlICYmIHguc3BsaXQpIHsKKwkJCQkJLyogdGVybWluYXRlIHdvcmQgZm9yICIkQCIgKi8KKwkJCQkJdHlwZSA9IFhBUkdTRVA7CisJCQkJCXF1b3RlID0gMDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFhDT006CisJCQlpZiAobmV3bGluZXMpIHsJCS8qIFNwaXQgb3V0IHNhdmVkIE5McyAqLworCQkJCWMgPSAnXG4nOworCQkJCS0tbmV3bGluZXM7CisJCQl9IGVsc2UgeworCQkJCXdoaWxlICgoYyA9IHNoZl9nZXRjKHgudS5zaGYpKSA9PSAwIHx8IGMgPT0gJ1xuJykKKwkJCQkJaWYgKGMgPT0gJ1xuJykKKwkJCQkJCS8qIFNhdmUgbmV3bGluZXMgKi8KKwkJCQkJCW5ld2xpbmVzKys7CisJCQkJaWYgKG5ld2xpbmVzICYmIGMgIT0gRU9GKSB7CisJCQkJCXNoZl91bmdldGMoYywgeC51LnNoZik7CisJCQkJCWMgPSAnXG4nOworCQkJCQktLW5ld2xpbmVzOworCQkJCX0KKwkJCX0KKwkJCWlmIChjID09IEVPRikgeworCQkJCW5ld2xpbmVzID0gMDsKKwkJCQlzaGZfY2xvc2UoeC51LnNoZik7CisJCQkJaWYgKHguc3BsaXQpCisJCQkJCXN1YnN0X2V4c3RhdCA9IHdhaXRsYXN0KCk7CisJCQkJdHlwZSA9IFhCQVNFOworCQkJCWlmIChmJkRPQkxBTkspCisJCQkJCWRvYmxhbmstLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyogY2hlY2sgZm9yIGVuZCBvZiB3b3JkIG9yIElGUyBzZXBhcmF0aW9uICovCisJCWlmIChjID09IDAgfHwgKCFxdW90ZSAmJiAoZiAmIERPQkxBTkspICYmIGRvYmxhbmsgJiYKKwkJICAgICFtYWtlX21hZ2ljICYmIGN0eXBlKGMsIENfSUZTKSkpIHsKKwkJCS8qIEhvdyB3b3JkcyBhcmUgYnJva2VuIHVwOgorCQkJICoJCQl8CXZhbHVlIG9mIGMKKwkJCSAqCXdvcmQJCXwJd3MJbndzCTAKKwkJCSAqCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkgKglJRlNfV09SRAkJdy9XUwl3L05XUwl3CisJCQkgKglJRlNfV1MJCQktL1dTCXcvTldTCS0KKwkJCSAqCUlGU19OV1MJCQktL05XUwl3L05XUwl3CisJCQkgKiAodyBtZWFucyBnZW5lcmF0ZSBhIHdvcmQpCisJCQkgKiBOb3RlIHRoYXQgSUZTX05XUy8wIGdlbmVyYXRlcyBhIHdvcmQgKEFUJlQga3NoCisJCQkgKiBkb2Vzbid0IGRvIHRoaXMsIGJ1dCBQT1NJWCBkb2VzKS4KKwkJCSAqLworCQkJaWYgKHdvcmQgPT0gSUZTX1dPUkQgfHwKKwkJCSAgICAoIWN0eXBlKGMsIENfSUZTV1MpICYmIGMgJiYgd29yZCA9PSBJRlNfTldTKSkgeworCQkJCWNoYXIgKnA7CisKKwkJCQkqZHArKyA9ICdcMCc7CisJCQkJcCA9IFhjbG9zZShkcywgZHApOworCQkJCWlmIChmZG8gJiBET0JSQUNFXykKKwkJCQkJLyogYWxzbyBkb2VzIGdsb2JiaW5nICovCisJCQkJCWFsdF9leHBhbmQod3AsIHAsIHAsCisJCQkJCSAgICBwICsgWGxlbmd0aChkcywgKGRwIC0gMSkpLAorCQkJCQkgICAgZmRvIHwgKGYgJiBET01BUktESVJTKSk7CisJCQkJZWxzZSBpZiAoZmRvICYgRE9HTE9CKQorCQkJCQlnbG9iKHAsIHdwLCBmICYgRE9NQVJLRElSUyk7CisJCQkJZWxzZSBpZiAoKGYgJiBET1BBVCkgfHwgIShmZG8gJiBET01BR0lDXykpCisJCQkJCVhQcHV0KCp3cCwgcCk7CisJCQkJZWxzZQorCQkJCQlYUHB1dCgqd3AsIGRlYnVuayhwLCBwLCBzdHJsZW4ocCkgKyAxKSk7CisJCQkJZmRvID0gMDsKKwkJCQlzYXdfZXEgPSAwOworCQkJCXRpbGRlX29rID0gKGYgJiAoRE9USUxERXxET0FTTlRJTERFKSkgPyAxIDogMDsKKwkJCQlpZiAoYyAhPSAwKQorCQkJCQlYaW5pdChkcywgZHAsIDEyOCwgQVRFTVApOworCQkJfQorCQkJaWYgKGMgPT0gMCkKKwkJCQlyZXR1cm47CisJCQlpZiAod29yZCAhPSBJRlNfTldTKQorCQkJCXdvcmQgPSBjdHlwZShjLCBDX0lGU1dTKSA/IElGU19XUyA6IElGU19OV1M7CisJCX0gZWxzZSB7CisJCQlpZiAodHlwZSA9PSBYU1VCKSB7CisJCQkJaWYgKHdvcmQgPT0gSUZTX05XUyAmJgorCQkJCSAgICBYbGVuZ3RoKGRzLCBkcCkgPT0gMCkgeworCQkJCQljaGFyICpwOworCisJCQkJCSoocCA9IGFsbG9jKDEsIEFURU1QKSkgPSAnXDAnOworCQkJCQlYUHB1dCgqd3AsIHApOworCQkJCX0KKwkJCQl0eXBlID0gWFNVQk1JRDsKKwkJCX0KKworCQkJLyogYWdlIHRpbGRlX29rIGluZm8gLSB+IGNvZGUgdGVzdHMgc2Vjb25kIGJpdCAqLworCQkJdGlsZGVfb2sgPDw9IDE7CisJCQkvKiBtYXJrIGFueSBzcGVjaWFsIHNlY29uZCBwYXNzIGNoYXJzICovCisJCQlpZiAoIXF1b3RlKQorCQkJCXN3aXRjaCAoYykgeworCQkJCWNhc2UgJ1snOgorCQkJCWNhc2UgTk9UOgorCQkJCWNhc2UgJy0nOgorCQkJCWNhc2UgJ10nOgorCQkJCQkvKiBGb3IgY2hhcmFjdGVyIGNsYXNzZXMgLSBkb2Vzbid0IGh1cnQKKwkJCQkJICogdG8gaGF2ZSBtYWdpYyAhLC0sXXMgb3V0c2lkZSBvZgorCQkJCQkgKiBbLi4uXSBleHByZXNzaW9ucy4KKwkJCQkJICovCisJCQkJCWlmIChmICYgKERPUEFUIHwgRE9HTE9CKSkgeworCQkJCQkJZmRvIHw9IERPTUFHSUNfOworCQkJCQkJaWYgKGMgPT0gJ1snKQorCQkJCQkJCWZkbyB8PSBmICYgRE9HTE9COworCQkJCQkJKmRwKysgPSBNQUdJQzsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlICcqJzoKKwkJCQljYXNlICc/JzoKKwkJCQkJaWYgKGYgJiAoRE9QQVQgfCBET0dMT0IpKSB7CisJCQkJCQlmZG8gfD0gRE9NQUdJQ18gfCAoZiAmIERPR0xPQik7CisJCQkJCQkqZHArKyA9IE1BR0lDOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgT0JSQUNFOgorCQkJCWNhc2UgJywnOgorCQkJCWNhc2UgQ0JSQUNFOgorCQkJCQlpZiAoKGYgJiBET0JSQUNFXykgJiYgKGMgPT0gT0JSQUNFIHx8CisJCQkJCSAgICAoZmRvICYgRE9CUkFDRV8pKSkgeworCQkJCQkJZmRvIHw9IERPQlJBQ0VffERPTUFHSUNfOworCQkJCQkJKmRwKysgPSBNQUdJQzsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlICc9JzoKKwkJCQkJLyogTm90ZSBmaXJzdCB1bnF1b3RlZCA9IGZvciB+ICovCisJCQkJCWlmICghKGYgJiBET1RFTVBfKSAmJiAhc2F3X2VxICYmCisJCQkJCSAgICAoRmxhZyhGQlJBQ0VFWFBBTkQpIHx8CisJCQkJCSAgICAoZiAmIERPQVNOVElMREUpKSkgeworCQkJCQkJc2F3X2VxID0gMTsKKwkJCQkJCXRpbGRlX29rID0gMTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlICc6JzogLyogOiAqLworCQkJCQkvKiBOb3RlIHVucXVvdGVkIDogZm9yIH4gKi8KKwkJCQkJaWYgKCEoZiAmIERPVEVNUF8pICYmIChmICYgRE9BU05USUxERSkpCisJCQkJCQl0aWxkZV9vayA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ34nOgorCQkJCQkvKiB0aWxkZV9vayBpcyByZXNldCB3aGVuZXZlcgorCQkJCQkgKiBhbnkgb2YgJyAiICQoICQoKCAkeyB9IGFyZSBzZWVuLgorCQkJCQkgKiBOb3RlIHRoYXQgdGlsZGVfb2sgbXVzdCBiZSBwcmVzZXJ2ZWQKKwkJCQkJICogdGhyb3VnaCB0aGUgc2VxdWVuY2UgJHtBPWE9fX4KKwkJCQkJICovCisJCQkJCWlmICh0eXBlID09IFhCQVNFICYmCisJCQkJCSAgICAoZiAmIChET1RJTERFfERPQVNOVElMREUpKSAmJgorCQkJCQkgICAgKHRpbGRlX29rICYgMikpIHsKKwkJCQkJCWNvbnN0IGNoYXIgKnA7CisJCQkJCQljaGFyICpkcF94OworCisJCQkJCQlkcF94ID0gZHA7CisJCQkJCQlwID0gbWF5YmVfZXhwYW5kX3RpbGRlKHNwLAorCQkJCQkJICAgICZkcywgJmRwX3gsCisJCQkJCQkgICAgZiAmIERPQVNOVElMREUpOworCQkJCQkJaWYgKHApIHsKKwkJCQkJCQlpZiAoZHAgIT0gZHBfeCkKKwkJCQkJCQkJd29yZCA9IElGU19XT1JEOworCQkJCQkJCWRwID0gZHBfeDsKKwkJCQkJCQlzcCA9IHA7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJZWxzZQorCQkJCXF1b3RlICY9IH4yOyAvKiB1bmRvIHRlbXBvcmFyeSAqLworCisJCQlpZiAobWFrZV9tYWdpYykgeworCQkJCW1ha2VfbWFnaWMgPSAwOworCQkJCWZkbyB8PSBET01BR0lDXyB8IChmICYgRE9HTE9CKTsKKwkJCQkqZHArKyA9IE1BR0lDOworCQkJfSBlbHNlIGlmIChJU01BR0lDKGMpKSB7CisJCQkJZmRvIHw9IERPTUFHSUNfOworCQkJCSpkcCsrID0gTUFHSUM7CisJCQl9CisJCQkqZHArKyA9IGM7IC8qIHNhdmUgb3V0cHV0IGNoYXIgKi8KKwkJCXdvcmQgPSBJRlNfV09SRDsKKwkJfQorCX0KK30KKworLyoKKyAqIFByZXBhcmUgdG8gZ2VuZXJhdGUgdGhlIHN0cmluZyByZXR1cm5lZCBieSAke30gc3Vic3RpdHV0aW9uLgorICovCitzdGF0aWMgaW50Cit2YXJzdWIoRXhwYW5kICp4cCwgY29uc3QgY2hhciAqc3AsIGNvbnN0IGNoYXIgKndvcmQsCisgICAgaW50ICpzdHlwZXAsCS8qIGJlY29tZXMgcXVhbGlmaWVyIHR5cGUgKi8KKyAgICBpbnQgKnNsZW5wKQkJLyogIiAiIGxlbiAoPSwgOj0sIGV0Yy4pIHZhbGlkIGlmZiAqc3R5cGVwICE9IDAgKi8KK3sKKwlpbnQgYzsKKwlpbnQgc3RhdGU7CS8qIG5leHQgc3RhdGU6IFhCQVNFLCBYQVJHLCBYU1VCLCBYTlVMTFNVQiAqLworCWludCBzdHlwZTsJLyogc3Vic3RpdHV0aW9uIHR5cGUgKi8KKwlpbnQgc2xlbjsKKwljb25zdCBjaGFyICpwOworCXN0cnVjdCB0YmwgKnZwOworCWJvb2wgemVyb19vayA9IGZhbHNlOworCisJaWYgKChzdHlwZSA9IHNwWzBdKSA9PSAnXDAnKQkvKiBCYWQgdmFyaWFibGUgbmFtZSAqLworCQlyZXR1cm4gKC0xKTsKKworCXhwLT52YXIgPSBOVUxMOworCisJLyotCisJICogJHsjdmFyfSwgc3RyaW5nIGxlbmd0aCAoLVU6IGNoYXJhY3RlcnMsICtVOiBvY3RldHMpIG9yIGFycmF5IHNpemUKKwkgKiAkeyV2YXJ9LCBzdHJpbmcgd2lkdGggKC1VOiBzY3JlZW4gY29sdW1ucywgK1U6IG9jdGV0cykKKwkgKi8KKwljID0gc3BbMV07CisJaWYgKHN0eXBlID09ICclJyAmJiBjID09ICdcMCcpCisJCXJldHVybiAoLTEpOworCWlmICgoc3R5cGUgPT0gJyMnIHx8IHN0eXBlID09ICclJykgJiYgYyAhPSAnXDAnKSB7CisJCS8qIENhbid0IGhhdmUgYW55IG1vZGlmaWVycyBmb3IgJHsjLi4ufSBvciAkeyUuLi59ICovCisJCWlmICgqd29yZCAhPSBDU1VCU1QpCisJCQlyZXR1cm4gKC0xKTsKKwkJc3ArKzsKKwkJLyogQ2hlY2sgZm9yIHNpemUgb2YgYXJyYXkgKi8KKwkJaWYgKChwID0gY3N0cmNocihzcCwgJ1snKSkgJiYgKHBbMV0gPT0gJyonIHx8IHBbMV0gPT0gJ0AnKSAmJgorCQkgICAgcFsyXSA9PSAnXScpIHsKKwkJCWludCBuID0gMDsKKworCQkJaWYgKHN0eXBlICE9ICcjJykKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCXZwID0gZ2xvYmFsKGFycmF5bmFtZShzcCkpOworCQkJaWYgKHZwLT5mbGFnICYgKElTU0VUfEFSUkFZKSkKKwkJCQl6ZXJvX29rID0gdHJ1ZTsKKwkJCWZvciAoOyB2cDsgdnAgPSB2cC0+dS5hcnJheSkKKwkJCQlpZiAodnAtPmZsYWcgJiBJU1NFVCkKKwkJCQkJbisrOworCQkJYyA9IG47CisJCX0gZWxzZSBpZiAoYyA9PSAnKicgfHwgYyA9PSAnQCcpIHsKKwkJCWlmIChzdHlwZSAhPSAnIycpCisJCQkJcmV0dXJuICgtMSk7CisJCQljID0gZS0+bG9jLT5hcmdjOworCQl9IGVsc2UgeworCQkJcCA9IHN0cl92YWwoZ2xvYmFsKHNwKSk7CisJCQl6ZXJvX29rID0gcCAhPSBudWxsOworCQkJaWYgKHN0eXBlID09ICcjJykKKwkJCQljID0gdXRmbGVuKHApOworCQkJZWxzZSB7CisJCQkJLyogcGFydGlhbCB1dGZfbWJzd2lkdGggcmVpbXBsZW1lbnRhdGlvbiAqLworCQkJCWNvbnN0IGNoYXIgKnMgPSBwOworCQkJCXVuc2lnbmVkIGludCB3YzsKKwkJCQlzaXplX3QgbGVuOworCQkJCWludCBjdzsKKworCQkJCWMgPSAwOworCQkJCXdoaWxlICgqcykgeworCQkJCQlpZiAoIVVURk1PREUgfHwgKGxlbiA9IHV0Zl9tYnRvd2MoJndjLAorCQkJCQkgICAgcykpID09IChzaXplX3QpLTEpCisJCQkJCQkvKiBub3QgVVRGTU9ERSBvciBub3QgVVRGLTggKi8KKwkJCQkJCXdjID0gKHVuc2lnbmVkIGNoYXIpKCpzKyspOworCQkJCQllbHNlCisJCQkJCQkvKiBVVEZNT0RFIGFuZCBVVEYtOCAqLworCQkJCQkJcyArPSBsZW47CisJCQkJCS8qIHdjID09IGNoYXIgb3Igd2NoYXIgYXQgcysrICovCisJCQkJCWlmICgoY3cgPSB1dGZfd2N3aWR0aCh3YykpID09IC0xKSB7CisJCQkJCQkvKiA2NDYsIDg4NTktMSwgMTA2NDYgQzAvQzEgKi8KKwkJCQkJCWMgPSAtMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWMgKz0gY3c7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChGbGFnKEZOT1VOU0VUKSAmJiBjID09IDAgJiYgIXplcm9fb2spCisJCQllcnJvcmYoIiVzOiBwYXJhbWV0ZXIgbm90IHNldCIsIHNwKTsKKwkJKnN0eXBlcCA9IDA7IC8qIHVucXVhbGlmaWVkIHZhcmlhYmxlL3N0cmluZyBzdWJzdGl0dXRpb24gKi8KKwkJeHAtPnN0ciA9IHNoZl9zbXByaW50ZigiJWQiLCBjKTsKKwkJcmV0dXJuIChYU1VCKTsKKwl9CisKKwkvKiBDaGVjayBmb3IgcXVhbGlmaWVycyBpbiB3b3JkIHBhcnQgKi8KKwlzdHlwZSA9IDA7CisJYyA9IHdvcmRbc2xlbiA9IDBdID09IENIQVIgPyB3b3JkWzFdIDogMDsKKwlpZiAoYyA9PSAnOicpIHsKKwkJc2xlbiArPSAyOworCQlzdHlwZSA9IDB4ODA7CisJCWMgPSB3b3JkW3NsZW4gKyAwXSA9PSBDSEFSID8gd29yZFtzbGVuICsgMV0gOiAwOworCX0KKwlpZiAoIXN0eXBlICYmIGMgPT0gJy8nKSB7CisJCXNsZW4gKz0gMjsKKwkJc3R5cGUgPSBjOworCQlpZiAod29yZFtzbGVuXSA9PSBBREVMSU0pIHsKKwkJCXNsZW4gKz0gMjsKKwkJCXN0eXBlIHw9IDB4ODA7CisJCX0KKwl9IGVsc2UgaWYgKHN0eXBlID09IDB4ODAgJiYgKGMgPT0gJyAnIHx8IGMgPT0gJzAnKSkgeworCQlzdHlwZSB8PSAnMCc7CisJfSBlbHNlIGlmIChjdHlwZShjLCBDX1NVQk9QMSkpIHsKKwkJc2xlbiArPSAyOworCQlzdHlwZSB8PSBjOworCX0gZWxzZSBpZiAoY3R5cGUoYywgQ19TVUJPUDIpKSB7IC8qIE5vdGU6IGtzaDg4IGFsbG93cyA6JSwgOiUlLCBldGMgKi8KKwkJc2xlbiArPSAyOworCQlzdHlwZSA9IGM7CisJCWlmICh3b3JkW3NsZW4gKyAwXSA9PSBDSEFSICYmIGMgPT0gd29yZFtzbGVuICsgMV0pIHsKKwkJCXN0eXBlIHw9IDB4ODA7CisJCQlzbGVuICs9IDI7CisJCX0KKwl9IGVsc2UgaWYgKHN0eXBlKQkvKiA6IGlzIG5vdCBvayAqLworCQlyZXR1cm4gKC0xKTsKKwlpZiAoIXN0eXBlICYmICp3b3JkICE9IENTVUJTVCkKKwkJcmV0dXJuICgtMSk7CisJKnN0eXBlcCA9IHN0eXBlOworCSpzbGVucCA9IHNsZW47CisKKwljID0gc3BbMF07CisJaWYgKGMgPT0gJyonIHx8IGMgPT0gJ0AnKSB7CisJCXN3aXRjaCAoc3R5cGUgJiAweDdmKSB7CisJCWNhc2UgJz0nOgkvKiBjYW4ndCBhc3NpZ24gdG8gYSB2ZWN0b3IgKi8KKwkJY2FzZSAnJSc6CS8qIGNhbid0IHRyaW0gYSB2ZWN0b3IgKHlldCkgKi8KKwkJY2FzZSAnIyc6CisJCWNhc2UgJzAnOgorCQljYXNlICcvJzoKKwkJCXJldHVybiAoLTEpOworCQl9CisJCWlmIChlLT5sb2MtPmFyZ2MgPT0gMCkgeworCQkJeHAtPnN0ciA9IG51bGw7CisJCQl4cC0+dmFyID0gZ2xvYmFsKHNwKTsKKwkJCXN0YXRlID0gYyA9PSAnQCcgPyBYTlVMTFNVQiA6IFhTVUI7CisJCX0gZWxzZSB7CisJCQl4cC0+dS5zdHJ2ID0gKGNvbnN0IGNoYXIgKiopZS0+bG9jLT5hcmd2ICsgMTsKKwkJCXhwLT5zdHIgPSAqeHAtPnUuc3RydisrOworCQkJeHAtPnNwbGl0ID0gYyA9PSAnQCc7IC8qICRAICovCisJCQlzdGF0ZSA9IFhBUkc7CisJCX0KKwkJemVyb19vayA9IHRydWU7CS8qIFBPU0lYIDIwMDk/ICovCisJfSBlbHNlIHsKKwkJaWYgKChwID0gY3N0cmNocihzcCwgJ1snKSkgJiYgKHBbMV0gPT0gJyonIHx8IHBbMV0gPT0gJ0AnKSAmJgorCQkgICAgcFsyXSA9PSAnXScpIHsKKwkJCVhQdHJWIHd2OworCisJCQlzd2l0Y2ggKHN0eXBlICYgMHg3ZikgeworCQkJY2FzZSAnPSc6CS8qIGNhbid0IGFzc2lnbiB0byBhIHZlY3RvciAqLworCQkJY2FzZSAnJSc6CS8qIGNhbid0IHRyaW0gYSB2ZWN0b3IgKHlldCkgKi8KKwkJCWNhc2UgJyMnOgorCQkJY2FzZSAnPyc6CisJCQljYXNlICcwJzoKKwkJCWNhc2UgJy8nOgorCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJWFBpbml0KHd2LCAzMik7CisJCQlpZiAoKGMgPSBzcFswXSkgPT0gJyEnKQorCQkJCSsrc3A7CisJCQl2cCA9IGdsb2JhbChhcnJheW5hbWUoc3ApKTsKKwkJCWZvciAoOyB2cDsgdnAgPSB2cC0+dS5hcnJheSkgeworCQkJCWlmICghKHZwLT5mbGFnJklTU0VUKSkKKwkJCQkJY29udGludWU7CisJCQkJWFBwdXQod3YsIGMgPT0gJyEnID8gc2hmX3NtcHJpbnRmKCIlbHUiLAorCQkJCSAgICBhcnJheWluZGV4KHZwKSkgOgorCQkJCSAgICBzdHJfdmFsKHZwKSk7CisJCQl9CisJCQlpZiAoWFBzaXplKHd2KSA9PSAwKSB7CisJCQkJeHAtPnN0ciA9IG51bGw7CisJCQkJc3RhdGUgPSBwWzFdID09ICdAJyA/IFhOVUxMU1VCIDogWFNVQjsKKwkJCQlYUGZyZWUod3YpOworCQkJfSBlbHNlIHsKKwkJCQlYUHB1dCh3diwgMCk7CisJCQkJeHAtPnUuc3RydiA9IChjb25zdCBjaGFyICoqKVhQcHRydih3dik7CisJCQkJeHAtPnN0ciA9ICp4cC0+dS5zdHJ2Kys7CisJCQkJeHAtPnNwbGl0ID0gcFsxXSA9PSAnQCc7IC8qICR7Zm9vW0BdfSAqLworCQkJCXN0YXRlID0gWEFSRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIENhbid0IGFzc2lnbiB0aGluZ3MgbGlrZSAkISBvciAkMSAqLworCQkJaWYgKChzdHlwZSAmIDB4N2YpID09ICc9JyAmJgorCQkJICAgIGN0eXBlKCpzcCwgQ19WQVIxIHwgQ19ESUdJVCkpCisJCQkJcmV0dXJuICgtMSk7CisJCQlpZiAoKnNwID09ICchJyAmJiBzcFsxXSkgeworCQkJCSsrc3A7CisJCQkJeHAtPnZhciA9IGdsb2JhbChzcCk7CisJCQkJaWYgKGNzdHJjaHIoc3AsICdbJykpIHsKKwkJCQkJaWYgKHhwLT52YXItPmZsYWcgJiBJU1NFVCkKKwkJCQkJCXhwLT5zdHIgPSBzaGZfc21wcmludGYoIiVsdSIsCisJCQkJCQkgICAgYXJyYXlpbmRleCh4cC0+dmFyKSk7CisJCQkJCWVsc2UKKwkJCQkJCXhwLT5zdHIgPSBudWxsOworCQkJCX0gZWxzZSBpZiAoeHAtPnZhci0+ZmxhZyAmIElTU0VUKQorCQkJCQl4cC0+c3RyID0geHAtPnZhci0+bmFtZTsKKwkJCQllbHNlCisJCQkJCXhwLT5zdHIgPSAiMCI7CS8qIGtzaDkzIGNvbXBhdCAqLworCQkJfSBlbHNlIHsKKwkJCQl4cC0+dmFyID0gZ2xvYmFsKHNwKTsKKwkJCQl4cC0+c3RyID0gc3RyX3ZhbCh4cC0+dmFyKTsKKwkJCX0KKwkJCXN0YXRlID0gWFNVQjsKKwkJfQorCX0KKworCWMgPSBzdHlwZSYweDdmOworCS8qIHRlc3QgdGhlIGNvbXBpbGVyJ3MgY29kZSBnZW5lcmF0b3IgKi8KKwlpZiAoY3R5cGUoYywgQ19TVUJPUDIpIHx8IHN0eXBlID09ICgweDgwIHwgJzAnKSB8fCBjID09ICcvJyB8fAorCSAgICAoKChzdHlwZSYweDgwKSA/ICp4cC0+c3RyPT0nXDAnIDogeHAtPnN0cj09bnVsbCkgPyAvKiB1bmRlZj8gKi8KKwkgICAgYyA9PSAnPScgfHwgYyA9PSAnLScgfHwgYyA9PSAnPycgOiBjID09ICcrJykpCisJCXN0YXRlID0gWEJBU0U7CS8qIGV4cGFuZCB3b3JkIGluc3RlYWQgb2YgdmFyaWFibGUgdmFsdWUgKi8KKwlpZiAoRmxhZyhGTk9VTlNFVCkgJiYgeHAtPnN0ciA9PSBudWxsICYmICF6ZXJvX29rICYmCisJICAgIChjdHlwZShjLCBDX1NVQk9QMikgfHwgKHN0YXRlICE9IFhCQVNFICYmIGMgIT0gJysnKSkpCisJCWVycm9yZigiJXM6IHBhcmFtZXRlciBub3Qgc2V0Iiwgc3ApOworCXJldHVybiAoc3RhdGUpOworfQorCisvKgorICogUnVuIHRoZSBjb21tYW5kIGluICQoLi4uKSBhbmQgcmVhZCBpdHMgb3V0cHV0LgorICovCitzdGF0aWMgaW50Citjb21zdWIoRXhwYW5kICp4cCwgY29uc3QgY2hhciAqY3ApCit7CisJU291cmNlICpzLCAqc29sZDsKKwlzdHJ1Y3Qgb3AgKnQ7CisJc3RydWN0IHNoZiAqc2hmOworCisJcyA9IHB1c2hzKFNTVFJJTkcsIEFURU1QKTsKKwlzLT5zdGFydCA9IHMtPnN0ciA9IGNwOworCXNvbGQgPSBzb3VyY2U7CisJdCA9IGNvbXBpbGUocyk7CisJYWZyZWUocywgQVRFTVApOworCXNvdXJjZSA9IHNvbGQ7CisKKwlpZiAodCA9PSBOVUxMKQorCQlyZXR1cm4gKFhCQVNFKTsKKworCWlmICh0ICE9IE5VTEwgJiYgdC0+dHlwZSA9PSBUQ09NICYmIC8qICQoPGZpbGUpICovCisJICAgICp0LT5hcmdzID09IE5VTEwgJiYgKnQtPnZhcnMgPT0gTlVMTCAmJiB0LT5pb2FjdCAhPSBOVUxMKSB7CisJCXN0cnVjdCBpb3dvcmQgKmlvID0gKnQtPmlvYWN0OworCQljaGFyICpuYW1lOworCisJCWlmICgoaW8tPmZsYWcmSU9UWVBFKSAhPSBJT1JFQUQpCisJCQllcnJvcmYoImZ1bm55ICQoKSBjb21tYW5kOiAlcyIsCisJCQkgICAgc25wdHJlZWYoTlVMTCwgMzIsICIlUiIsIGlvKSk7CisJCXNoZiA9IHNoZl9vcGVuKG5hbWUgPSBldmFsc3RyKGlvLT5uYW1lLCBET1RJTERFKSwgT19SRE9OTFksIDAsCisJCQlTSEZfTUFQSEl8U0hGX0NMRVhFQyk7CisJCWlmIChzaGYgPT0gTlVMTCkKKwkJCWVycm9yZigiJXM6IGNhbm5vdCBvcGVuICQoKSBpbnB1dCIsIG5hbWUpOworCQl4cC0+c3BsaXQgPSAwOwkvKiBubyB3YWl0bGFzdCgpICovCisJfSBlbHNlIHsKKwkJaW50IG9mZDEsIHB2WzJdOworCQlvcGVucGlwZShwdik7CisJCXNoZiA9IHNoZl9mZG9wZW4ocHZbMF0sIFNIRl9SRCwgTlVMTCk7CisJCW9mZDEgPSBzYXZlZmQoMSk7CisJCWlmIChwdlsxXSAhPSAxKSB7CisJCQlrc2hfZHVwMihwdlsxXSwgMSwgZmFsc2UpOworCQkJY2xvc2UocHZbMV0pOworCQl9CisJCWV4ZWN1dGUodCwgWEZPUkt8WFhDT018WFBJUEVPLCBOVUxMKTsKKwkJcmVzdGZkKDEsIG9mZDEpOworCQlzdGFydGxhc3QoKTsKKwkJeHAtPnNwbGl0ID0gMTsJLyogd2FpdGxhc3QoKSAqLworCX0KKworCXhwLT51LnNoZiA9IHNoZjsKKwlyZXR1cm4gKFhDT00pOworfQorCisvKgorICogcGVyZm9ybSAjcGF0dGVybiBhbmQgJXBhdHRlcm4gc3Vic3RpdHV0aW9uIGluICR7fQorICovCisKK3N0YXRpYyBjaGFyICoKK3RyaW1zdWIoY2hhciAqc3RyLCBjaGFyICpwYXQsIGludCBob3cpCit7CisJY2hhciAqZW5kID0gc3RybnVsKHN0cik7CisJY2hhciAqcCwgYzsKKworCXN3aXRjaCAoaG93ICYgMHhGRikgeworCWNhc2UgJyMnOgkJLyogc2hvcnRlc3QgYXQgYmVnaW5uaW5nICovCisJCWZvciAocCA9IHN0cjsgcCA8PSBlbmQ7IHAgKz0gdXRmX3B0cmFkaihwKSkgeworCQkJYyA9ICpwOyAqcCA9ICdcMCc7CisJCQlpZiAoZ21hdGNoeChzdHIsIHBhdCwgZmFsc2UpKSB7CisJCQkJKnAgPSBjOworCQkJCXJldHVybiAocCk7CisJCQl9CisJCQkqcCA9IGM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnIyd8MHg4MDoJCS8qIGxvbmdlc3QgbWF0Y2ggYXQgYmVnaW5uaW5nICovCisJCWZvciAocCA9IGVuZDsgcCA+PSBzdHI7IHAtLSkgeworCQkJYyA9ICpwOyAqcCA9ICdcMCc7CisJCQlpZiAoZ21hdGNoeChzdHIsIHBhdCwgZmFsc2UpKSB7CisJCQkJKnAgPSBjOworCQkJCXJldHVybiAocCk7CisJCQl9CisJCQkqcCA9IGM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnJSc6CQkvKiBzaG9ydGVzdCBtYXRjaCBhdCBlbmQgKi8KKwkJcCA9IGVuZDsKKwkJd2hpbGUgKHAgPj0gc3RyKSB7CisJCQlpZiAoZ21hdGNoeChwLCBwYXQsIGZhbHNlKSkKKwkJCQlnb3RvIHRyaW1zdWJfbWF0Y2g7CisJCQlpZiAoVVRGTU9ERSkgeworCQkJCWNoYXIgKm9wID0gcDsKKwkJCQl3aGlsZSAoKHAtLSA+IHN0cikgJiYgKCgqcCAmIDB4QzApID09IDB4ODApKQorCQkJCQk7CisJCQkJaWYgKChwIDwgc3RyKSB8fCAocCArIHV0Zl9wdHJhZGoocCkgIT0gb3ApKQorCQkJCQlwID0gb3AgLSAxOworCQkJfSBlbHNlCisJCQkJLS1wOworCQl9CisJCWJyZWFrOworCWNhc2UgJyUnfDB4ODA6CQkvKiBsb25nZXN0IG1hdGNoIGF0IGVuZCAqLworCQlmb3IgKHAgPSBzdHI7IHAgPD0gZW5kOyBwKyspCisJCQlpZiAoZ21hdGNoeChwLCBwYXQsIGZhbHNlKSkgeworIHRyaW1zdWJfbWF0Y2g6CisJCQkJc3RybmR1cHgoZW5kLCBzdHIsIHAgLSBzdHIsIEFURU1QKTsKKwkJCQlyZXR1cm4gKGVuZCk7CisJCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAoc3RyKTsJCS8qIG5vIG1hdGNoLCByZXR1cm4gc3RyaW5nICovCit9CisKKy8qCisgKiBnbG9iCisgKiBOYW1lIGRlcml2ZWQgZnJvbSBWNidzIC9ldGMvZ2xvYiwgdGhlIHByb2dyYW0gdGhhdCBleHBhbmRlZCBmaWxlbmFtZXMuCisgKi8KKworLyogWFhYIGNwIG5vdCBjb25zdCAnY2F1c2Ugc2xhc2hlcyBhcmUgdGVtcG9yYXJpbHkgcmVwbGFjZWQgd2l0aCBOVUxzLi4uICovCitzdGF0aWMgdm9pZAorZ2xvYihjaGFyICpjcCwgWFB0clYgKndwLCBpbnQgbWFya2RpcnMpCit7CisJaW50IG9sZHNpemUgPSBYUHNpemUoKndwKTsKKworCWlmIChnbG9iX3N0cihjcCwgd3AsIG1hcmtkaXJzKSA9PSAwKQorCQlYUHB1dCgqd3AsIGRlYnVuayhjcCwgY3AsIHN0cmxlbihjcCkgKyAxKSk7CisJZWxzZQorCQlxc29ydChYUHB0cnYoKndwKSArIG9sZHNpemUsIFhQc2l6ZSgqd3ApIC0gb2xkc2l6ZSwKKwkJICAgIHNpemVvZih2b2lkICopLCB4c3RyY21wKTsKK30KKworI2RlZmluZSBHRl9OT05FCQkwCisjZGVmaW5lIEdGX0VYQ0hFQ0sJQklUKDApCQkvKiBkbyBleGlzdGVuY2UgY2hlY2sgb24gZmlsZSAqLworI2RlZmluZSBHRl9HTE9CQkVECUJJVCgxKQkJLyogc29tZSBnbG9iYmluZyBoYXMgYmVlbiBkb25lICovCisjZGVmaW5lIEdGX01BUktESVIJQklUKDIpCQkvKiBhZGQgdHJhaWxpbmcgLyB0byBkaXJlY3RvcmllcyAqLworCisvKiBBcHBseSBmaWxlIGdsb2JiaW5nIHRvIGNwIGFuZCBzdG9yZSB0aGUgbWF0Y2hpbmcgZmlsZXMgaW4gd3AuIFJldHVybnMKKyAqIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyBmb3VuZC4KKyAqLworaW50CitnbG9iX3N0cihjaGFyICpjcCwgWFB0clYgKndwLCBpbnQgbWFya2RpcnMpCit7CisJaW50IG9sZHNpemUgPSBYUHNpemUoKndwKTsKKwlYU3RyaW5nIHhzOworCWNoYXIgKnhwOworCisJWGluaXQoeHMsIHhwLCAyNTYsIEFURU1QKTsKKwlnbG9iaXQoJnhzLCAmeHAsIGNwLCB3cCwgbWFya2RpcnMgPyBHRl9NQVJLRElSIDogR0ZfTk9ORSk7CisJWGZyZWUoeHMsIHhwKTsKKworCXJldHVybiAoWFBzaXplKCp3cCkgLSBvbGRzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2dsb2JpdChYU3RyaW5nICp4cywJLyogZGVzdCBzdHJpbmcgKi8KKyAgICBjaGFyICoqeHBwLAkJLyogcHRyIHRvIGRlc3QgZW5kICovCisgICAgY2hhciAqc3AsCQkvKiBzb3VyY2UgcGF0aCAqLworICAgIFhQdHJWICp3cCwJCS8qIG91dHB1dCBsaXN0ICovCisgICAgaW50IGNoZWNrKQkJLyogR0ZfKiBmbGFncyAqLworeworCWNoYXIgKm5wOwkJLyogbmV4dCBzb3VyY2UgY29tcG9uZW50ICovCisJY2hhciAqeHAgPSAqeHBwOworCWNoYXIgKnNlOworCWNoYXIgb2RpcnNlcDsKKworCS8qIFRoaXMgdG8gYWxsb3cgbG9uZyBleHBhbnNpb25zIHRvIGJlIGludGVycnVwdGVkICovCisJaW50cmNoZWNrKCk7CisKKwlpZiAoc3AgPT0gTlVMTCkgewkvKiBlbmQgb2Ygc291cmNlIHBhdGggKi8KKwkJLyogV2Ugb25seSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGV4aXN0cyBpZiBhIHBhdHRlcm4KKwkJICogaXMgZm9sbG93ZWQgYnkgYSBub24tcGF0dGVybiAoZWcsIGZvbyp4L2Jhcjsgbm8gY2hlY2sKKwkJICogaXMgbmVlZGVkIGZvciBmb28qIHNpbmNlIHRoZSBtYXRjaCBtdXN0IGV4aXN0KSBvciBpZgorCQkgKiBhbnkgcGF0dGVybnMgd2VyZSBleHBhbmRlZCBhbmQgdGhlIG1hcmtkaXJzIG9wdGlvbiBpcyBzZXQuCisJCSAqIFN5bWxpbmtzIG1ha2UgdGhpbmdzIGEgYml0IHRyaWNreS4uLgorCQkgKi8KKwkJaWYgKChjaGVjayAmIEdGX0VYQ0hFQ0spIHx8CisJCSAgICAoKGNoZWNrICYgR0ZfTUFSS0RJUikgJiYgKGNoZWNrICYgR0ZfR0xPQkJFRCkpKSB7CisjZGVmaW5lIHN0YXRfY2hlY2soKQkoc3RhdF9kb25lID8gc3RhdF9kb25lIDogXAorCQkJICAgIChzdGF0X2RvbmUgPSBzdGF0KFhzdHJpbmcoKnhzLCB4cCksICZzdGF0YikgPCAwIFwKKwkJCQk/IC0xIDogMSkpCisJCQlzdHJ1Y3Qgc3RhdCBsc3RhdGIsIHN0YXRiOworCQkJaW50IHN0YXRfZG9uZSA9IDA7CSAvKiAtMTogZmFpbGVkLCAxIG9rICovCisKKwkJCWlmIChsc3RhdChYc3RyaW5nKCp4cywgeHApLCAmbHN0YXRiKSA8IDApCisJCQkJcmV0dXJuOworCQkJLyogc3BlY2lhbCBjYXNlIGZvciBzeXN0ZW1zIHdoaWNoIHN0cmlwIHRyYWlsaW5nCisJCQkgKiBzbGFzaGVzIGZyb20gcmVndWxhciBmaWxlcyAoZWcsIC9ldGMvcGFzc3dkLykuCisJCQkgKiBTdW5PUyA0LjEuMyBkb2VzIHRoaXMuLi4KKwkJCSAqLworCQkJaWYgKChjaGVjayAmIEdGX0VYQ0hFQ0spICYmIHhwID4gWHN0cmluZygqeHMsIHhwKSAmJgorCQkJICAgIHhwWy0xXSA9PSAnLycgJiYgIVNfSVNESVIobHN0YXRiLnN0X21vZGUpICYmCisJCQkgICAgKCFTX0lTTE5LKGxzdGF0Yi5zdF9tb2RlKSB8fAorCQkJICAgIHN0YXRfY2hlY2soKSA8IDAgfHwgIVNfSVNESVIoc3RhdGIuc3RfbW9kZSkpKQorCQkJCXJldHVybjsKKwkJCS8qIFBvc3NpYmx5IHRhY2sgb24gYSB0cmFpbGluZyAvIGlmIHRoZXJlIGlzbid0IGFscmVhZHkKKwkJCSAqIG9uZSBhbmQgaWYgdGhlIGZpbGUgaXMgYSBkaXJlY3Rvcnkgb3IgYSBzeW1saW5rIHRvIGEKKwkJCSAqIGRpcmVjdG9yeQorCQkJICovCisJCQlpZiAoKChjaGVjayAmIEdGX01BUktESVIpICYmIChjaGVjayAmIEdGX0dMT0JCRUQpKSAmJgorCQkJICAgIHhwID4gWHN0cmluZygqeHMsIHhwKSAmJiB4cFstMV0gIT0gJy8nICYmCisJCQkgICAgKFNfSVNESVIobHN0YXRiLnN0X21vZGUpIHx8CisJCQkgICAgKFNfSVNMTksobHN0YXRiLnN0X21vZGUpICYmIHN0YXRfY2hlY2soKSA+IDAgJiYKKwkJCSAgICBTX0lTRElSKHN0YXRiLnN0X21vZGUpKSkpIHsKKwkJCQkqeHArKyA9ICcvJzsKKwkJCQkqeHAgPSAnXDAnOworCQkJfQorCQl9CisJCXN0cm5kdXB4KG5wLCBYc3RyaW5nKCp4cywgeHApLCBYbGVuZ3RoKCp4cywgeHApLCBBVEVNUCk7CisJCVhQcHV0KCp3cCwgbnApOworCQlyZXR1cm47CisJfQorCisJaWYgKHhwID4gWHN0cmluZygqeHMsIHhwKSkKKwkJKnhwKysgPSAnLyc7CisJd2hpbGUgKCpzcCA9PSAnLycpIHsKKwkJWGNoZWNrKCp4cywgeHApOworCQkqeHArKyA9ICpzcCsrOworCX0KKwlucCA9IHN0cmNocihzcCwgJy8nKTsKKwlpZiAobnAgIT0gTlVMTCkgeworCQlzZSA9IG5wOworCQlvZGlyc2VwID0gKm5wOwkvKiBkb24ndCBhc3N1bWUgJy8nLCBjYW4gYmUgbXVsdGlwbGUga2luZHMgKi8KKwkJKm5wKysgPSAnXDAnOworCX0gZWxzZSB7CisJCW9kaXJzZXAgPSAnXDAnOyAvKiBrZWVwIGdjYyBxdWlldCAqLworCQlzZSA9IHNwICsgc3RybGVuKHNwKTsKKwl9CisKKworCS8qIENoZWNrIGlmIHNwIG5lZWRzIGdsb2JiaW5nIC0gZG9uZSB0byBhdm9pZCBwYXR0ZXJuIGNoZWNrcyBmb3Igc3RyaW5ncworCSAqIGNvbnRhaW5pbmcgTUFHSUMgY2hhcmFjdGVycywgb3BlbiBbcyB3aXRob3V0IHRoZSBtYXRjaGluZyBjbG9zZSBdLAorCSAqIGV0Yy4gKG90aGVyd2lzZSBvcGVuZGlyKCkgd2lsbCBiZSBjYWxsZWQgd2hpY2ggbWF5IGZhaWwgYmVjYXVzZSB0aGUKKwkgKiBkaXJlY3RvcnkgaXNuJ3QgcmVhZGFibGUgLSBpZiBubyBnbG9iYmluZyBpcyBuZWVkZWQsIG9ubHkgZXhlY3V0ZQorCSAqIHBlcm1pc3Npb24gc2hvdWxkIGJlIHJlcXVpcmVkIChhcyBwZXIgUE9TSVgpKS4KKwkgKi8KKwlpZiAoIWhhc19nbG9iYmluZyhzcCwgc2UpKSB7CisJCVhjaGVja04oKnhzLCB4cCwgc2UgLSBzcCArIDEpOworCQlkZWJ1bmsoeHAsIHNwLCBYbmxlZnQoKnhzLCB4cCkpOworCQl4cCArPSBzdHJsZW4oeHApOworCQkqeHBwID0geHA7CisJCWdsb2JpdCh4cywgeHBwLCBucCwgd3AsIGNoZWNrKTsKKwl9IGVsc2UgeworCQlESVIgKmRpcnA7CisJCXN0cnVjdCBkaXJlbnQgKmQ7CisJCWNoYXIgKm5hbWU7CisJCWludCBsZW47CisJCWludCBwcmVmaXhfbGVuOworCisJCS8qIHhwID0gKnhwcDsJY29weV9ub25fZ2xvYigpIG1heSBoYXZlIHJlLWFsbG9jJ2QgeHMgKi8KKwkJKnhwID0gJ1wwJzsKKwkJcHJlZml4X2xlbiA9IFhsZW5ndGgoKnhzLCB4cCk7CisJCWRpcnAgPSBvcGVuZGlyKHByZWZpeF9sZW4gPyBYc3RyaW5nKCp4cywgeHApIDogIi4iKTsKKwkJaWYgKGRpcnAgPT0gTlVMTCkKKwkJCWdvdG8gTm9kaXI7CisJCXdoaWxlICgoZCA9IHJlYWRkaXIoZGlycCkpICE9IE5VTEwpIHsKKwkJCW5hbWUgPSBkLT5kX25hbWU7CisJCQlpZiAobmFtZVswXSA9PSAnLicgJiYKKwkJCSAgICAobmFtZVsxXSA9PSAwIHx8IChuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09IDApKSkKKwkJCQljb250aW51ZTsgLyogYWx3YXlzIGlnbm9yZSAuIGFuZCAuLiAqLworCQkJaWYgKCgqbmFtZSA9PSAnLicgJiYgKnNwICE9ICcuJykgfHwKKwkJCSAgICAhZ21hdGNoeChuYW1lLCBzcCwgdHJ1ZSkpCisJCQkJY29udGludWU7CisKKwkJCWxlbiA9IHN0cmxlbihkLT5kX25hbWUpICsgMTsKKwkJCVhjaGVja04oKnhzLCB4cCwgbGVuKTsKKwkJCW1lbWNweSh4cCwgbmFtZSwgbGVuKTsKKwkJCSp4cHAgPSB4cCArIGxlbiAtIDE7CisJCQlnbG9iaXQoeHMsIHhwcCwgbnAsIHdwLAorCQkJCShjaGVjayAmIEdGX01BUktESVIpIHwgR0ZfR0xPQkJFRAorCQkJCXwgKG5wID8gR0ZfRVhDSEVDSyA6IEdGX05PTkUpKTsKKwkJCXhwID0gWHN0cmluZygqeHMsIHhwKSArIHByZWZpeF9sZW47CisJCX0KKwkJY2xvc2VkaXIoZGlycCk7CisgTm9kaXI6CisJCTsKKwl9CisKKwlpZiAobnAgIT0gTlVMTCkKKwkJKi0tbnAgPSBvZGlyc2VwOworfQorCisvKiByZW1vdmUgTUFHSUMgZnJvbSBzdHJpbmcgKi8KK2NoYXIgKgorZGVidW5rKGNoYXIgKmRwLCBjb25zdCBjaGFyICpzcCwgc2l6ZV90IGRsZW4pCit7CisJY2hhciAqZDsKKwljb25zdCBjaGFyICpzOworCisJaWYgKChzID0gY3N0cmNocihzcCwgTUFHSUMpKSkgeworCQlpZiAocyAtIHNwID49IChzc2l6ZV90KWRsZW4pCisJCQlyZXR1cm4gKGRwKTsKKwkJbWVtbW92ZShkcCwgc3AsIHMgLSBzcCk7CisJCWZvciAoZCA9IGRwICsgKHMgLSBzcCk7ICpzICYmIChkIC0gZHAgPCAoc3NpemVfdClkbGVuKTsgcysrKQorCQkJaWYgKCFJU01BR0lDKCpzKSB8fCAhKCorK3MgJiAweDgwKSB8fAorCQkJICAgICF2c3RyY2hyKCIqKz9AISAiLCAqcyAmIDB4N2YpKQorCQkJCSpkKysgPSAqczsKKwkJCWVsc2UgeworCQkJCS8qIGV4dGVuZGVkIHBhdHRlcm4gb3BlcmF0b3JzOiAqKz9AISAqLworCQkJCWlmICgoKnMgJiAweDdmKSAhPSAnICcpCisJCQkJCSpkKysgPSAqcyAmIDB4N2Y7CisJCQkJaWYgKGQgLSBkcCA8IChzc2l6ZV90KWRsZW4pCisJCQkJCSpkKysgPSAnKCc7CisJCQl9CisJCSpkID0gJ1wwJzsKKwl9IGVsc2UgaWYgKGRwICE9IHNwKQorCQlzdHJsY3B5KGRwLCBzcCwgZGxlbik7CisJcmV0dXJuIChkcCk7Cit9CisKKy8qIENoZWNrIGlmIHAgaXMgYW4gdW5xdW90ZWQgbmFtZSwgcG9zc2libHkgZm9sbG93ZWQgYnkgYSAvIG9yIDouIElmIHNvCisgKiBwdXRzIHRoZSBleHBhbmRlZCB2ZXJzaW9uIGluICpkY3AsZHAgYW5kIHJldHVybnMgYSBwb2ludGVyIGluIHAganVzdAorICogcGFzdCB0aGUgbmFtZSwgb3RoZXJ3aXNlIHJldHVybnMgMC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorbWF5YmVfZXhwYW5kX3RpbGRlKGNvbnN0IGNoYXIgKnAsIFhTdHJpbmcgKmRzcCwgY2hhciAqKmRwcCwgaW50IGlzYXNzaWduKQoreworCVhTdHJpbmcgdHM7CisJY2hhciAqZHAgPSAqZHBwOworCWNoYXIgKnRwOworCWNvbnN0IGNoYXIgKnI7CisKKwlYaW5pdCh0cywgdHAsIDE2LCBBVEVNUCk7CisJLyogOiBvbmx5IGZvciBET0FTTlRJTERFIGZvcm0gKi8KKwl3aGlsZSAocFswXSA9PSBDSEFSICYmIHBbMV0gIT0gJy8nICYmICghaXNhc3NpZ24gfHwgcFsxXSAhPSAnOicpKQorCXsKKwkJWGNoZWNrKHRzLCB0cCk7CisJCSp0cCsrID0gcFsxXTsKKwkJcCArPSAyOworCX0KKwkqdHAgPSAnXDAnOworCXIgPSAocFswXSA9PSBFT1MgfHwgcFswXSA9PSBDSEFSIHx8IHBbMF0gPT0gQ1NVQlNUKSA/CisJICAgIHRpbGRlKFhzdHJpbmcodHMsIHRwKSkgOiBOVUxMOworCVhmcmVlKHRzLCB0cCk7CisJaWYgKHIpIHsKKwkJd2hpbGUgKCpyKSB7CisJCQlYY2hlY2soKmRzcCwgZHApOworCQkJaWYgKElTTUFHSUMoKnIpKQorCQkJCSpkcCsrID0gTUFHSUM7CisJCQkqZHArKyA9ICpyKys7CisJCX0KKwkJKmRwcCA9IGRwOworCQlyID0gcDsKKwl9CisJcmV0dXJuIChyKTsKK30KKworLyoKKyAqIHRpbGRlIGV4cGFuc2lvbgorICoKKyAqIGJhc2VkIG9uIGEgdmVyc2lvbiBieSBBcm5vbGQgUm9iYmlucworICovCisKK3N0YXRpYyBjaGFyICoKK3RpbGRlKGNoYXIgKmNwKQoreworCWNoYXIgKmRwID0gbnVsbDsKKworCWlmIChjcFswXSA9PSAnXDAnKQorCQlkcCA9IHN0cl92YWwoZ2xvYmFsKCJIT01FIikpOworCWVsc2UgaWYgKGNwWzBdID09ICcrJyAmJiBjcFsxXSA9PSAnXDAnKQorCQlkcCA9IHN0cl92YWwoZ2xvYmFsKCJQV0QiKSk7CisJZWxzZSBpZiAoY3BbMF0gPT0gJy0nICYmIGNwWzFdID09ICdcMCcpCisJCWRwID0gc3RyX3ZhbChnbG9iYWwoIk9MRFBXRCIpKTsKKyNpZm5kZWYgTUtTSF9OT1BXTkFNCisJZWxzZQorCQlkcCA9IGhvbWVkaXIoY3ApOworI2VuZGlmCisJLyogSWYgSE9NRSwgUFdEIG9yIE9MRFBXRCBhcmUgbm90IHNldCwgZG9uJ3QgZXhwYW5kIH4gKi8KKwlyZXR1cm4gKGRwID09IG51bGwgPyBOVUxMIDogZHApOworfQorCisjaWZuZGVmIE1LU0hfTk9QV05BTQorLyoKKyAqIG1hcCB1c2VyaWQgdG8gdXNlcidzIGhvbWUgZGlyZWN0b3J5LgorICogbm90ZSB0aGF0IDQuMydzIGdldHB3IGFkZHMgbW9yZSB0aGFuIDZLIHRvIHRoZSBzaGVsbCwKKyAqIGFuZCB0aGUgWVAgdmVyc2lvbiBwcm9iYWJseSBhZGRzIG11Y2ggbW9yZS4KKyAqIHdlIG1pZ2h0IGNvbnNpZGVyIG91ciBvd24gdmVyc2lvbiBvZiBnZXRwd25hbSgpIHRvIGtlZXAgdGhlIHNpemUgZG93bi4KKyAqLworc3RhdGljIGNoYXIgKgoraG9tZWRpcihjaGFyICpuYW1lKQoreworCXN0cnVjdCB0YmwgKmFwOworCisJYXAgPSBrdGVudGVyKCZob21lZGlycywgbmFtZSwgaGFzaChuYW1lKSk7CisJaWYgKCEoYXAtPmZsYWcgJiBJU1NFVCkpIHsKKwkJc3RydWN0IHBhc3N3ZCAqcHc7CisKKwkJcHcgPSBnZXRwd25hbShuYW1lKTsKKwkJaWYgKHB3ID09IE5VTEwpCisJCQlyZXR1cm4gKE5VTEwpOworCQlzdHJkdXB4KGFwLT52YWwucywgcHctPnB3X2RpciwgQVBFUk0pOworCQlhcC0+ZmxhZyB8PSBERUZJTkVEfElTU0VUfEFMTE9DOworCX0KKwlyZXR1cm4gKGFwLT52YWwucyk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2FsdF9leHBhbmQoWFB0clYgKndwLCBjaGFyICpzdGFydCwgY2hhciAqZXhwX3N0YXJ0LCBjaGFyICplbmQsIGludCBmZG8pCit7CisJaW50IGNvdW50ID0gMDsKKwljaGFyICpicmFjZV9zdGFydCwgKmJyYWNlX2VuZCwgKmNvbW1hID0gTlVMTDsKKwljaGFyICpmaWVsZF9zdGFydDsKKwljaGFyICpwOworCisJLyogc2VhcmNoIGZvciBvcGVuIGJyYWNlICovCisJZm9yIChwID0gZXhwX3N0YXJ0OyAocCA9IHN0cmNocihwLCBNQUdJQykpICYmIHBbMV0gIT0gT0JSQUNFOyBwICs9IDIpCisJCTsKKwlicmFjZV9zdGFydCA9IHA7CisKKwkvKiBmaW5kIG1hdGNoaW5nIGNsb3NlIGJyYWNlLCBpZiBhbnkgKi8KKwlpZiAocCkgeworCQljb21tYSA9IE5VTEw7CisJCWNvdW50ID0gMTsKKwkJZm9yIChwICs9IDI7ICpwICYmIGNvdW50OyBwKyspIHsKKwkJCWlmIChJU01BR0lDKCpwKSkgeworCQkJCWlmICgqKytwID09IE9CUkFDRSkKKwkJCQkJY291bnQrKzsKKwkJCQllbHNlIGlmICgqcCA9PSBDQlJBQ0UpCisJCQkJCS0tY291bnQ7CisJCQkJZWxzZSBpZiAoKnAgPT0gJywnICYmIGNvdW50ID09IDEpCisJCQkJCWNvbW1hID0gcDsKKwkJCX0KKwkJfQorCX0KKwkvKiBubyB2YWxpZCBleHBhbnNpb25zLi4uICovCisJaWYgKCFwIHx8IGNvdW50ICE9IDApIHsKKwkJLyogTm90ZSB0aGF0IGdpdmVuIGF7e2IsY30gd2UgZG8gbm90IGV4cGFuZCBhbnl0aGluZyAodGhpcyBpcworCQkgKiB3aGF0IEFUJlQga3NoIGRvZXMuIFRoaXMgbWF5IGJlIGNoYW5nZWQgdG8gZG8gdGhlIHtiLGN9CisJCSAqIGV4cGFuc2lvbi4gfQorCQkgKi8KKwkJaWYgKGZkbyAmIERPR0xPQikKKwkJCWdsb2Ioc3RhcnQsIHdwLCBmZG8gJiBET01BUktESVJTKTsKKwkJZWxzZQorCQkJWFBwdXQoKndwLCBkZWJ1bmsoc3RhcnQsIHN0YXJ0LCBlbmQgLSBzdGFydCkpOworCQlyZXR1cm47CisJfQorCWJyYWNlX2VuZCA9IHA7CisJaWYgKCFjb21tYSkgeworCQlhbHRfZXhwYW5kKHdwLCBzdGFydCwgYnJhY2VfZW5kLCBlbmQsIGZkbyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBleHBhbmQgZXhwcmVzc2lvbiAqLworCWZpZWxkX3N0YXJ0ID0gYnJhY2Vfc3RhcnQgKyAyOworCWNvdW50ID0gMTsKKwlmb3IgKHAgPSBicmFjZV9zdGFydCArIDI7IHAgIT0gYnJhY2VfZW5kOyBwKyspIHsKKwkJaWYgKElTTUFHSUMoKnApKSB7CisJCQlpZiAoKisrcCA9PSBPQlJBQ0UpCisJCQkJY291bnQrKzsKKwkJCWVsc2UgaWYgKCgqcCA9PSBDQlJBQ0UgJiYgLS1jb3VudCA9PSAwKSB8fAorCQkJICAgICgqcCA9PSAnLCcgJiYgY291bnQgPT0gMSkpIHsKKwkJCQljaGFyICpuZXdzOworCQkJCWludCBsMSwgbDIsIGwzOworCisJCQkJbDEgPSBicmFjZV9zdGFydCAtIHN0YXJ0OworCQkJCWwyID0gKHAgLSAxKSAtIGZpZWxkX3N0YXJ0OworCQkJCWwzID0gZW5kIC0gYnJhY2VfZW5kOworCQkJCW5ld3MgPSBhbGxvYyhsMSArIGwyICsgbDMgKyAxLCBBVEVNUCk7CisJCQkJbWVtY3B5KG5ld3MsIHN0YXJ0LCBsMSk7CisJCQkJbWVtY3B5KG5ld3MgKyBsMSwgZmllbGRfc3RhcnQsIGwyKTsKKwkJCQltZW1jcHkobmV3cyArIGwxICsgbDIsIGJyYWNlX2VuZCwgbDMpOworCQkJCW5ld3NbbDEgKyBsMiArIGwzXSA9ICdcMCc7CisJCQkJYWx0X2V4cGFuZCh3cCwgbmV3cywgbmV3cyArIGwxLAorCQkJCSAgICBuZXdzICsgbDEgKyBsMiArIGwzLCBmZG8pOworCQkJCWZpZWxkX3N0YXJ0ID0gcCArIDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvZXhlYy5jIGIvbWtzaC9zcmMvZXhlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTMyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9leGVjLmMKQEAgLTAsMCArMSwxNTE4IEBACisvKgkkT3BlbkJTRDogZXhlYy5jLHYgMS40OSAyMDA5LzAxLzI5IDIzOjI3OjI2IGphcmVkeSBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2luY2x1ZGUgInNoLmgiCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2V4ZWMuYyx2IDEuNzUgMjAxMC8wNy8xNyAyMjowOTozNCB0ZyBFeHAgJCIpOworCisjaWZuZGVmIE1LU0hfREVGQVVMVF9FWEVDU0hFTEwKKyNkZWZpbmUgTUtTSF9ERUZBVUxUX0VYRUNTSEVMTAkiL2Jpbi9zaCIKKyNlbmRpZgorCitzdGF0aWMgaW50IGNvbWV4ZWMoc3RydWN0IG9wICosIHN0cnVjdCB0YmwgKnZvbGF0aWxlLCBjb25zdCBjaGFyICoqLAorICAgIGludCB2b2xhdGlsZSwgdm9sYXRpbGUgaW50ICopOworc3RhdGljIHZvaWQgc2NyaXB0ZXhlYyhzdHJ1Y3Qgb3AgKiwgY29uc3QgY2hhciAqKikgTUtTSF9BX05PUkVUVVJOOworc3RhdGljIGludCBjYWxsX2J1aWx0aW4oc3RydWN0IHRibCAqLCBjb25zdCBjaGFyICoqKTsKK3N0YXRpYyBpbnQgaW9zZXR1cChzdHJ1Y3QgaW93b3JkICosIHN0cnVjdCB0YmwgKik7CitzdGF0aWMgaW50IGhlcmVpbihjb25zdCBjaGFyICosIGludCk7CitzdGF0aWMgY29uc3QgY2hhciAqZG9fc2VsZWN0YXJncyhjb25zdCBjaGFyICoqLCBib29sKTsKK3N0YXRpYyBUZXN0X29wIGRidGVzdGVfaXNhKFRlc3RfZW52ICosIFRlc3RfbWV0YSk7CitzdGF0aWMgY29uc3QgY2hhciAqZGJ0ZXN0ZV9nZXRvcG5kKFRlc3RfZW52ICosIFRlc3Rfb3AsIGJvb2wpOworc3RhdGljIHZvaWQgZGJ0ZXN0ZV9lcnJvcihUZXN0X2VudiAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CisKKy8qCisgKiBleGVjdXRlIGNvbW1hbmQgdHJlZQorICovCitpbnQKK2V4ZWN1dGUoc3RydWN0IG9wICp2b2xhdGlsZSB0LAorICAgIHZvbGF0aWxlIGludCBmbGFncywJCS8qIGlmIFhFWEVDIGRvbid0IGZvcmsgKi8KKyAgICB2b2xhdGlsZSBpbnQgKiB2b2xhdGlsZSB4ZXJyb2spCit7CisJaW50IGk7CisJdm9sYXRpbGUgaW50IHJ2ID0gMCwgZHVtbXkgPSAwOworCWludCBwdlsyXTsKKwljb25zdCBjaGFyICoqIHZvbGF0aWxlIGFwOworCWNoYXIgKiogdm9sYXRpbGUgdXA7CisJY29uc3QgY2hhciAqcywgKmNwOworCXN0cnVjdCBpb3dvcmQgKippb3dwOworCXN0cnVjdCB0YmwgKnRwID0gTlVMTDsKKworCWlmICh0ID09IE5VTEwpCisJCXJldHVybiAoMCk7CisKKwkvKiBDYWxsZXIgZG9lc24ndCBjYXJlIGlmIFhFUlJPSyBzaG91bGQgcHJvcGFnYXRlLiAqLworCWlmICh4ZXJyb2sgPT0gTlVMTCkKKwkJeGVycm9rID0gJmR1bW15OworCisJaWYgKChmbGFncyZYRk9SSykgJiYgIShmbGFncyZYRVhFQykgJiYgdC0+dHlwZSAhPSBUUElQRSkKKwkJLyogcnVuIGluIHN1Yi1wcm9jZXNzICovCisJCXJldHVybiAoZXhjaGlsZCh0LCBmbGFncyAmIH5YVElNRSwgeGVycm9rLCAtMSkpOworCisJbmV3ZW52KEVfRVhFQyk7CisJaWYgKHRyYXApCisJCXJ1bnRyYXBzKDApOworCisJaWYgKHQtPnR5cGUgPT0gVENPTSkgeworCQkvKiBDbGVhciBzdWJzdF9leHN0YXQgYmVmb3JlIGFyZ3VtZW50IGV4cGFuc2lvbi4gVXNlZCBieQorCQkgKiBudWxsIGNvbW1hbmRzIChzZWUgY29tZXhlYygpIGFuZCBjX2V2YWwoKSkgYW5kIGJ5IGNfc2V0KCkuCisJCSAqLworCQlzdWJzdF9leHN0YXQgPSAwOworCisJCWN1cnJlbnRfbGluZW5vID0gdC0+bGluZW5vOwkvKiBmb3IgJExJTkVOTyAqLworCisJCS8qIFBPU0lYIHNheXMgZXhwYW5kIGNvbW1hbmQgd29yZHMgZmlyc3QsIHRoZW4gcmVkaXJlY3Rpb25zLAorCQkgKiBhbmQgYXNzaWdubWVudHMgbGFzdC4uCisJCSAqLworCQl1cCA9IGV2YWwodC0+YXJncywgdC0+dS5ldmFsZmxhZ3MgfCBET0JMQU5LIHwgRE9HTE9CIHwgRE9USUxERSk7CisJCWlmIChmbGFncyAmIFhUSU1FKQorCQkJLyogQWxsb3cgb3B0aW9uIHBhcnNpbmcgKGJpemFycmUsIGJ1dCBQT1NJWCkgKi8KKwkJCXRpbWV4X2hvb2sodCwgJnVwKTsKKwkJYXAgPSAoY29uc3QgY2hhciAqKil1cDsKKwkJaWYgKEZsYWcoRlhUUkFDRSkgJiYgYXBbMF0pIHsKKwkJCXNoZl9mcHJpbnRmKHNobF9vdXQsICIlcyIsCisJCQkJc3Vic3RpdHV0ZShzdHJfdmFsKGdsb2JhbCgiUFM0IikpLCAwKSk7CisJCQlmb3IgKGkgPSAwOyBhcFtpXTsgaSsrKQorCQkJCXNoZl9mcHJpbnRmKHNobF9vdXQsICIlcyVjIiwgYXBbaV0sCisJCQkJICAgIGFwW2kgKyAxXSA/ICcgJyA6ICdcbicpOworCQkJc2hmX2ZsdXNoKHNobF9vdXQpOworCQl9CisJCWlmIChhcFswXSkKKwkJCXRwID0gZmluZGNvbShhcFswXSwgRkNfQkl8RkNfRlVOQyk7CisJfQorCWZsYWdzICY9IH5YVElNRTsKKworCWlmICh0LT5pb2FjdCAhPSBOVUxMIHx8IHQtPnR5cGUgPT0gVFBJUEUgfHwgdC0+dHlwZSA9PSBUQ09QUk9DKSB7CisJCWUtPnNhdmVmZCA9IGFsbG9jKE5VRklMRSAqIHNpemVvZihzaG9ydCksIEFURU1QKTsKKwkJLyogaW5pdGlhbGlzZSB0byBub3QgcmVkaXJlY3RlZCAqLworCQltZW1zZXQoZS0+c2F2ZWZkLCAwLCBOVUZJTEUgKiBzaXplb2Yoc2hvcnQpKTsKKwl9CisKKwkvKiBkbyByZWRpcmVjdGlvbiwgdG8gYmUgcmVzdG9yZWQgaW4gcXVpdGVudigpICovCisJaWYgKHQtPmlvYWN0ICE9IE5VTEwpCisJCWZvciAoaW93cCA9IHQtPmlvYWN0OyAqaW93cCAhPSBOVUxMOyBpb3dwKyspIHsKKwkJCWlmIChpb3NldHVwKCppb3dwLCB0cCkgPCAwKSB7CisJCQkJZXhzdGF0ID0gcnYgPSAxOworCQkJCS8qIFJlZGlyZWN0aW9uIGZhaWx1cmVzIGZvciBzcGVjaWFsIGNvbW1hbmRzCisJCQkJICogY2F1c2UgKG5vbi1pbnRlcmFjdGl2ZSkgc2hlbGwgdG8gZXhpdC4KKwkJCQkgKi8KKwkJCQlpZiAodHAgJiYgdHAtPnR5cGUgPT0gQ1NIRUxMICYmCisJCQkJICAgICh0cC0+ZmxhZyAmIFNQRUNfQkkpKQorCQkJCQllcnJvcmZ6KCk7CisJCQkJLyogRGVhbCB3aXRoIEZFUlJFWElULCBxdWl0ZW52KCksIGV0Yy4gKi8KKwkJCQlnb3RvIEJyZWFrOworCQkJfQorCQl9CisKKwlzd2l0Y2ggKHQtPnR5cGUpIHsKKwljYXNlIFRDT006CisJCXJ2ID0gY29tZXhlYyh0LCB0cCwgKGNvbnN0IGNoYXIgKiopYXAsIGZsYWdzLCB4ZXJyb2spOworCQlicmVhazsKKworCWNhc2UgVFBBUkVOOgorCQlydiA9IGV4ZWN1dGUodC0+bGVmdCwgZmxhZ3MgfCBYRk9SSywgeGVycm9rKTsKKwkJYnJlYWs7CisKKwljYXNlIFRQSVBFOgorCQlmbGFncyB8PSBYRk9SSzsKKwkJZmxhZ3MgJj0gflhFWEVDOworCQllLT5zYXZlZmRbMF0gPSBzYXZlZmQoMCk7CisJCWUtPnNhdmVmZFsxXSA9IHNhdmVmZCgxKTsKKwkJd2hpbGUgKHQtPnR5cGUgPT0gVFBJUEUpIHsKKwkJCW9wZW5waXBlKHB2KTsKKwkJCWtzaF9kdXAyKHB2WzFdLCAxLCBmYWxzZSk7IC8qIHN0ZG91dCBvZiBjdXJyICovCisJCQkvKioKKwkJCSAqIExldCBleGNoaWxkKCkgY2xvc2UgcHZbMF0gaW4gY2hpbGQKKwkJCSAqIChpZiB0aGlzIGlzbid0IGRvbmUsIGNvbW1hbmRzIGxpa2UKKwkJCSAqCSg6IDsgY2F0IC9ldGMvdGVybWNhcCkgfCBzbGVlcCAxCisJCQkgKiB3aWxsIGhhbmcgZm9yZXZlcikuCisJCQkgKi8KKwkJCWV4Y2hpbGQodC0+bGVmdCwgZmxhZ3MgfCBYUElQRU8gfCBYQ0NMT1NFLAorCQkJICAgIE5VTEwsIHB2WzBdKTsKKwkJCWtzaF9kdXAyKHB2WzBdLCAwLCBmYWxzZSk7IC8qIHN0ZGluIG9mIG5leHQgKi8KKwkJCWNsb3NlcGlwZShwdik7CisJCQlmbGFncyB8PSBYUElQRUk7CisJCQl0ID0gdC0+cmlnaHQ7CisJCX0KKwkJcmVzdGZkKDEsIGUtPnNhdmVmZFsxXSk7IC8qIHN0ZG91dCBvZiBsYXN0ICovCisJCWUtPnNhdmVmZFsxXSA9IDA7IC8qIG5vIG5lZWQgdG8gcmUtcmVzdG9yZSB0aGlzICovCisJCS8qIExldCBleGNoaWxkKCkgY2xvc2UgMCBpbiBwYXJlbnQsIGFmdGVyIGZvcmssIGJlZm9yZSB3YWl0ICovCisJCWkgPSBleGNoaWxkKHQsIGZsYWdzIHwgWFBDTE9TRSwgeGVycm9rLCAwKTsKKwkJaWYgKCEoZmxhZ3MmWEJHTkQpICYmICEoZmxhZ3MmWFhDT00pKQorCQkJcnYgPSBpOworCQlicmVhazsKKworCWNhc2UgVExJU1Q6CisJCXdoaWxlICh0LT50eXBlID09IFRMSVNUKSB7CisJCQlleGVjdXRlKHQtPmxlZnQsIGZsYWdzICYgWEVSUk9LLCBOVUxMKTsKKwkJCXQgPSB0LT5yaWdodDsKKwkJfQorCQlydiA9IGV4ZWN1dGUodCwgZmxhZ3MgJiBYRVJST0ssIHhlcnJvayk7CisJCWJyZWFrOworCisJY2FzZSBUQ09QUk9DOiB7CisJCXNpZ3NldF90IG9tYXNrOworCisJCS8qIEJsb2NrIHNpZ2NoaWxkIGFzIHdlIGFyZSB1c2luZyB0aGluZ3MgY2hhbmdlZCBpbiB0aGUKKwkJICogc2lnbmFsIGhhbmRsZXIKKwkJICovCisJCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7CisJCWUtPnR5cGUgPSBFX0VSUkg7CisJCWkgPSBzaWdzZXRqbXAoZS0+amJ1ZiwgMCk7CisJCWlmIChpKSB7CisJCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwkJCXF1aXRlbnYoTlVMTCk7CisJCQl1bndpbmQoaSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJLyogQWxyZWFkeSBoYXZlIGEgKGxpdmUpIGNvLXByb2Nlc3M/ICovCisJCWlmIChjb3Byb2Muam9iICYmIGNvcHJvYy53cml0ZSA+PSAwKQorCQkJZXJyb3JmKCJjb3Byb2Nlc3MgYWxyZWFkeSBleGlzdHMiKTsKKworCQkvKiBDYW4gd2UgcmUtdXNlIHRoZSBleGlzdGluZyBjby1wcm9jZXNzIHBpcGU/ICovCisJCWNvcHJvY19jbGVhbnVwKHRydWUpOworCisJCS8qIGRvIHRoaXMgYmVmb3JlIG9wZW5pbmcgcGlwZXMsIGluIGNhc2UgdGhlc2UgZmFpbCAqLworCQllLT5zYXZlZmRbMF0gPSBzYXZlZmQoMCk7CisJCWUtPnNhdmVmZFsxXSA9IHNhdmVmZCgxKTsKKworCQlvcGVucGlwZShwdik7CisJCWlmIChwdlswXSAhPSAwKSB7CisJCQlrc2hfZHVwMihwdlswXSwgMCwgZmFsc2UpOworCQkJY2xvc2UocHZbMF0pOworCQl9CisJCWNvcHJvYy53cml0ZSA9IHB2WzFdOworCQljb3Byb2Muam9iID0gTlVMTDsKKworCQlpZiAoY29wcm9jLnJlYWR3ID49IDApCisJCQlrc2hfZHVwMihjb3Byb2MucmVhZHcsIDEsIGZhbHNlKTsKKwkJZWxzZSB7CisJCQlvcGVucGlwZShwdik7CisJCQljb3Byb2MucmVhZCA9IHB2WzBdOworCQkJa3NoX2R1cDIocHZbMV0sIDEsIGZhbHNlKTsKKwkJCWNvcHJvYy5yZWFkdyA9IHB2WzFdOwkgLyogY2xvc2VkIGJlZm9yZSBmaXJzdCByZWFkICovCisJCQljb3Byb2MubmpvYnMgPSAwOworCQkJLyogY3JlYXRlIG5ldyBjb3Byb2Nlc3MgaWQgKi8KKwkJCSsrY29wcm9jLmlkOworCQl9CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCQllLT50eXBlID0gRV9FWEVDOyAvKiBubyBtb3JlIG5lZWQgZm9yIGVycm9yIGhhbmRsZXIgKi8KKworCQkvKiBleGNoaWxkKCkgY2xvc2VzIGNvcHJvYy4qIGluIGNoaWxkIGFmdGVyIGZvcmssCisJCSAqIHdpbGwgYWxzbyBpbmNyZW1lbnQgY29wcm9jLm5qb2JzIHdoZW4gdGhlCisJCSAqIGpvYiBpcyBhY3R1YWxseSBjcmVhdGVkLgorCQkgKi8KKwkJZmxhZ3MgJj0gflhFWEVDOworCQlleGNoaWxkKHQtPmxlZnQsIGZsYWdzIHwgWEJHTkQgfCBYRk9SSyB8IFhDT1BST0MgfCBYQ0NMT1NFLAorCQkgICAgTlVMTCwgY29wcm9jLnJlYWR3KTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBUQVNZTkM6CisJCS8qIFhYWCBub24tb3B0aW1hbCwgSSB0aGluayAtICIoZm9vICYpIiwgZm9ya3MgZm9yICgpLAorCQkgKiBmb3JrcyBhZ2FpbiBmb3IgYXN5bmMuLi4gcGFyZW50IHNob3VsZCBvcHRpbWlzZQorCQkgKiB0aGlzIHRvICJmb28gJiIuLi4KKwkJICovCisJCXJ2ID0gZXhlY3V0ZSh0LT5sZWZ0LCAoZmxhZ3MmflhFWEVDKXxYQkdORHxYRk9SSywgeGVycm9rKTsKKwkJYnJlYWs7CisKKwljYXNlIFRPUjoKKwljYXNlIFRBTkQ6CisJCXJ2ID0gZXhlY3V0ZSh0LT5sZWZ0LCBYRVJST0ssIHhlcnJvayk7CisJCWlmICgocnYgPT0gMCkgPT0gKHQtPnR5cGUgPT0gVEFORCkpCisJCQlydiA9IGV4ZWN1dGUodC0+cmlnaHQsIFhFUlJPSywgeGVycm9rKTsKKwkJZmxhZ3MgfD0gWEVSUk9LOworCQlpZiAoeGVycm9rKQorCQkJKnhlcnJvayA9IDE7CisJCWJyZWFrOworCisJY2FzZSBUQkFORzoKKwkJcnYgPSAhZXhlY3V0ZSh0LT5yaWdodCwgWEVSUk9LLCB4ZXJyb2spOworCQlmbGFncyB8PSBYRVJST0s7CisJCWlmICh4ZXJyb2spCisJCQkqeGVycm9rID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFREQlJBQ0tFVDogeworCQlUZXN0X2VudiB0ZTsKKworCQl0ZS5mbGFncyA9IFRFRl9EQlJBQ0tFVDsKKwkJdGUucG9zLndwID0gdC0+YXJnczsKKwkJdGUuaXNhID0gZGJ0ZXN0ZV9pc2E7CisJCXRlLmdldG9wbmQgPSBkYnRlc3RlX2dldG9wbmQ7CisJCXRlLmV2YWwgPSB0ZXN0X2V2YWw7CisJCXRlLmVycm9yID0gZGJ0ZXN0ZV9lcnJvcjsKKworCQlydiA9IHRlc3RfcGFyc2UoJnRlKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBURk9SOgorCWNhc2UgVFNFTEVDVDogeworCQl2b2xhdGlsZSBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKwkJYXAgPSAodC0+dmFycyA9PSBOVUxMKSA/IGUtPmxvYy0+YXJndiArIDEgOgorCQkgICAgKGNvbnN0IGNoYXIgKiopZXZhbCgoY29uc3QgY2hhciAqKil0LT52YXJzLAorCQkgICAgRE9CTEFOSyB8IERPR0xPQiB8IERPVElMREUpOworCQllLT50eXBlID0gRV9MT09QOworCQl3aGlsZSAoMSkgeworCQkJaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKKwkJCWlmICghaSkKKwkJCQlicmVhazsKKwkJCWlmICgoZS0+ZmxhZ3MmRUZfQlJLQ09OVF9QQVNTKSB8fAorCQkJICAgIChpICE9IExCUkVBSyAmJiBpICE9IExDT05USU4pKSB7CisJCQkJcXVpdGVudihOVUxMKTsKKwkJCQl1bndpbmQoaSk7CisJCQl9IGVsc2UgaWYgKGkgPT0gTEJSRUFLKSB7CisJCQkJcnYgPSAwOworCQkJCWdvdG8gQnJlYWs7CisJCQl9CisJCX0KKwkJcnYgPSAwOyAvKiBpbiBjYXNlIG9mIGEgY29udGludWUgKi8KKwkJaWYgKHQtPnR5cGUgPT0gVEZPUikgeworCQkJd2hpbGUgKCphcCAhPSBOVUxMKSB7CisJCQkJc2V0c3RyKGdsb2JhbCh0LT5zdHIpLCAqYXArKywgS1NIX1VOV0lORF9FUlJPUik7CisJCQkJcnYgPSBleGVjdXRlKHQtPmxlZnQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spOworCQkJfQorCQl9IGVsc2UgeyAvKiBUU0VMRUNUICovCisJCQlmb3IgKDs7KSB7CisJCQkJaWYgKCEoY3AgPSBkb19zZWxlY3RhcmdzKGFwLCBpc19maXJzdCkpKSB7CisJCQkJCXJ2ID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlzX2ZpcnN0ID0gZmFsc2U7CisJCQkJc2V0c3RyKGdsb2JhbCh0LT5zdHIpLCBjcCwgS1NIX1VOV0lORF9FUlJPUik7CisJCQkJZXhlY3V0ZSh0LT5sZWZ0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFRXSElMRToKKwljYXNlIFRVTlRJTDoKKwkJZS0+dHlwZSA9IEVfTE9PUDsKKwkJd2hpbGUgKDEpIHsKKwkJCWkgPSBzaWdzZXRqbXAoZS0+amJ1ZiwgMCk7CisJCQlpZiAoIWkpCisJCQkJYnJlYWs7CisJCQlpZiAoKGUtPmZsYWdzJkVGX0JSS0NPTlRfUEFTUykgfHwKKwkJCSAgICAoaSAhPSBMQlJFQUsgJiYgaSAhPSBMQ09OVElOKSkgeworCQkJCXF1aXRlbnYoTlVMTCk7CisJCQkJdW53aW5kKGkpOworCQkJfSBlbHNlIGlmIChpID09IExCUkVBSykgeworCQkJCXJ2ID0gMDsKKwkJCQlnb3RvIEJyZWFrOworCQkJfQorCQl9CisJCXJ2ID0gMDsgLyogaW4gY2FzZSBvZiBhIGNvbnRpbnVlICovCisJCXdoaWxlICgoZXhlY3V0ZSh0LT5sZWZ0LCBYRVJST0ssIE5VTEwpID09IDApID09CisJCSAgICAodC0+dHlwZSA9PSBUV0hJTEUpKQorCQkJcnYgPSBleGVjdXRlKHQtPnJpZ2h0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKTsKKwkJYnJlYWs7CisKKwljYXNlIFRJRjoKKwljYXNlIFRFTElGOgorCQlpZiAodC0+cmlnaHQgPT0gTlVMTCkKKwkJCWJyZWFrOwkvKiBzaG91bGQgYmUgZXJyb3IgKi8KKwkJcnYgPSBleGVjdXRlKHQtPmxlZnQsIFhFUlJPSywgTlVMTCkgPT0gMCA/CisJCSAgICBleGVjdXRlKHQtPnJpZ2h0LT5sZWZ0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKSA6CisJCSAgICBleGVjdXRlKHQtPnJpZ2h0LT5yaWdodCwgZmxhZ3MgJiBYRVJST0ssIHhlcnJvayk7CisJCWJyZWFrOworCisJY2FzZSBUQ0FTRToKKwkJY3AgPSBldmFsc3RyKHQtPnN0ciwgRE9USUxERSk7CisJCWZvciAodCA9IHQtPmxlZnQ7IHQgIT0gTlVMTCAmJiB0LT50eXBlID09IFRQQVQ7IHQgPSB0LT5yaWdodCkKKwkJICAgIGZvciAoYXAgPSAoY29uc3QgY2hhciAqKil0LT52YXJzOyAqYXA7IGFwKyspCisJCQlpZiAoKHMgPSBldmFsc3RyKCphcCwgRE9USUxERXxET1BBVCkpICYmCisJCQkgICAgZ21hdGNoeChjcCwgcywgZmFsc2UpKQorCQkJCWdvdG8gRm91bmQ7CisJCWJyZWFrOworIEZvdW5kOgorCQlydiA9IGV4ZWN1dGUodC0+bGVmdCwgZmxhZ3MgJiBYRVJST0ssIHhlcnJvayk7CisJCWJyZWFrOworCisJY2FzZSBUQlJBQ0U6CisJCXJ2ID0gZXhlY3V0ZSh0LT5sZWZ0LCBmbGFncyAmIFhFUlJPSywgeGVycm9rKTsKKwkJYnJlYWs7CisKKwljYXNlIFRGVU5DVDoKKwkJcnYgPSBkZWZpbmUodC0+c3RyLCB0KTsKKwkJYnJlYWs7CisKKwljYXNlIFRUSU1FOgorCQkvKiBDbGVhciBYRVhFQyBzbyBuZXN0ZWQgZXhlY3V0ZSgpIGNhbGwgZG9lc24ndCBleGl0CisJCSAqIChhbGxvd3MgImxzIC1sIHwgdGltZSBncmVwIGZvbyIpLgorCQkgKi8KKwkJcnYgPSB0aW1leCh0LCBmbGFncyAmIH5YRVhFQywgeGVycm9rKTsKKwkJYnJlYWs7CisKKwljYXNlIFRFWEVDOgkJLyogYW4gZXZhbCdkIFRDT00gKi8KKwkJcyA9IHQtPmFyZ3NbMF07CisJCXVwID0gbWFrZW52KCk7CisJCXJlc3RvcmVzaWdzKCk7CisJCWNsZWFudXBfcHJvY19lbnYoKTsKKwkJeworCQkJdW5pb24gbWtzaF9jY3BoYWNrIGNhcmdzOworCisJCQljYXJncy5ybyA9IHQtPmFyZ3M7CisJCQlleGVjdmUodC0+c3RyLCBjYXJncy5ydywgdXApOworCQkJcnYgPSBlcnJubzsKKwkJfQorCQlpZiAocnYgPT0gRU5PRVhFQykKKwkJCXNjcmlwdGV4ZWModCwgKGNvbnN0IGNoYXIgKiopdXApOworCQllbHNlCisJCQllcnJvcmYoIiVzOiAlcyIsIHMsIHN0cmVycm9yKHJ2KSk7CisJfQorIEJyZWFrOgorCWV4c3RhdCA9IHJ2OworCisJcXVpdGVudihOVUxMKTsJCS8qIHJlc3RvcmVzIElPICovCisJaWYgKChmbGFncyZYRVhFQykpCisJCXVud2luZChMRVhJVCk7CS8qIGV4aXQgY2hpbGQgKi8KKwlpZiAocnYgIT0gMCAmJiAhKGZsYWdzICYgWEVSUk9LKSAmJgorCSAgICAoeGVycm9rID09IE5VTEwgfHwgISp4ZXJyb2spKSB7CisJCXRyYXBzaWcoU0lHRVJSXyk7CisJCWlmIChGbGFnKEZFUlJFWElUKSkKKwkJCXVud2luZChMRVJST1IpOworCX0KKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqIGV4ZWN1dGUgc2ltcGxlIGNvbW1hbmQKKyAqLworCitzdGF0aWMgaW50Citjb21leGVjKHN0cnVjdCBvcCAqdCwgc3RydWN0IHRibCAqdm9sYXRpbGUgdHAsIGNvbnN0IGNoYXIgKiphcCwKKyAgICB2b2xhdGlsZSBpbnQgZmxhZ3MsIHZvbGF0aWxlIGludCAqeGVycm9rKQoreworCWludCBpOworCXZvbGF0aWxlIGludCBydiA9IDA7CisJY29uc3QgY2hhciAqY3A7CisJY29uc3QgY2hhciAqKmxhc3RwOworCXN0YXRpYyBzdHJ1Y3Qgb3AgdGV4ZWM7IC8qIE11c3QgYmUgc3RhdGljIChYWFggYnV0IHdoeT8pICovCisJaW50IHR5cGVfZmxhZ3M7CisJaW50IGtlZXBhc25fb2s7CisJaW50IGZjZmxhZ3MgPSBGQ19CSXxGQ19GVU5DfEZDX1BBVEg7CisJYm9vbCBib3VybmVfZnVuY3Rpb25fY2FsbCA9IGZhbHNlOworCXN0cnVjdCBibG9jayAqbF9leHBhbmQsICpsX2Fzc2lnbjsKKworCS8qIHNuYWcgdGhlIGxhc3QgYXJndW1lbnQgZm9yICRfIFhYWCBub3QgdGhlIHNhbWUgYXMgQVQmVCBrc2gsCisJICogd2hpY2ggb25seSBzZWVtcyB0byBzZXQgJF8gYWZ0ZXIgYSBuZXdsaW5lIChidXQgbm90IGluCisJICogZnVuY3Rpb25zL2RvdCBzY3JpcHRzLCBidXQgaW4gaW50ZXJhY3RpdmUgYW5kIHNjcmlwdCkgLQorCSAqIHBlcmhhcHMgc2F2ZSBsYXN0IGFyZyBoZXJlIGFuZCBzZXQgaXQgaW4gc2hlbGwoKT8uCisJICovCisJaWYgKEZsYWcoRlRBTEtJTkcpICYmICoobGFzdHAgPSBhcCkpIHsKKwkJd2hpbGUgKCorK2xhc3RwKQorCQkJOworCQkvKiBzZXRzdHIoKSBjYW4ndCBmYWlsIGhlcmUgKi8KKwkJc2V0c3RyKHR5cGVzZXQoIl8iLCBMT0NBTCwgMCwgSU5URUdFUiwgMCksICotLWxhc3RwLAorCQkgICAgS1NIX1JFVFVSTl9FUlJPUik7CisJfQorCisJLyogRGVhbCB3aXRoIHRoZSBzaGVsbCBidWlsdGlucyBidWlsdGluLCBleGVjIGFuZCBjb21tYW5kIHNpbmNlCisJICogdGhleSBjYW4gYmUgZm9sbG93ZWQgYnkgb3RoZXIgY29tbWFuZHMuIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZQorCSAqIHdlIGtub3cgaWYgd2Ugc2hvdWxkIGNyZWF0ZSBhIGxvY2FsIGJsb2NrIHdoaWNoIG11c3QgYmUgZG9uZQorCSAqIGJlZm9yZSB3ZSBjYW4gZG8gYSBwYXRoIHNlYXJjaCAoaW4gY2FzZSB0aGUgYXNzaWdubWVudHMgY2hhbmdlCisJICogUEFUSCkuCisJICogT2RkIGNhc2VzOgorCSAqCUZPTz1iYXIgZXhlYyA+L2Rldi9udWxsCQlGT08gaXMga2VwdCBidXQgbm90IGV4cG9ydGVkCisJICoJRk9PPWJhciBleGVjIGZvb2JhcgkJRk9PIGlzIGV4cG9ydGVkCisJICoJRk9PPWJhciBjb21tYW5kIGV4ZWMgPi9kZXYvbnVsbAlGT08gaXMgbmVpdGhlciBrZXB0IG5vciBleHBvcnRlZAorCSAqCUZPTz1iYXIgY29tbWFuZAkJCUZPTyBpcyBuZWl0aGVyIGtlcHQgbm9yIGV4cG9ydGVkCisJICoJUEFUSD0uLi4gZm9vYmFyCQkJdXNlIG5ldyBQQVRIIGluIGZvb2JhciBzZWFyY2gKKwkgKi8KKwlrZWVwYXNuX29rID0gMTsKKwl3aGlsZSAodHAgJiYgdHAtPnR5cGUgPT0gQ1NIRUxMKSB7CisJCWZjZmxhZ3MgPSBGQ19CSXxGQ19GVU5DfEZDX1BBVEg7LyogdW5kbyBlZmZlY3RzIG9mIGNvbW1hbmQgKi8KKwkJaWYgKHRwLT52YWwuZiA9PSBjX2J1aWx0aW4pIHsKKwkJCWlmICgoY3AgPSAqKythcCkgPT0gTlVMTCkgeworCQkJCXRwID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXRwID0gZmluZGNvbShjcCwgRkNfQkkpOworCQkJaWYgKHRwID09IE5VTEwpCisJCQkJZXJyb3JmKCJidWlsdGluOiAlczogbm90IGEgYnVpbHRpbiIsIGNwKTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHRwLT52YWwuZiA9PSBjX2V4ZWMpIHsKKwkJCWlmIChhcFsxXSA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJYXArKzsKKwkJCWZsYWdzIHw9IFhFWEVDOworCQl9IGVsc2UgaWYgKHRwLT52YWwuZiA9PSBjX2NvbW1hbmQpIHsKKwkJCWludCBvcHRjLCBzYXdfcCA9IDA7CisKKwkJCS8qIFVnbHkgZGVhbGluZyB3aXRoIG9wdGlvbnMgaW4gdHdvIHBsYWNlcyAoaGVyZSBhbmQKKwkJCSAqIGluIGNfY29tbWFuZCgpLCBidXQgc3VjaCBpcyBsaWZlKQorCQkJICovCisJCQlrc2hfZ2V0b3B0X3Jlc2V0KCZidWlsdGluX29wdCwgMCk7CisJCQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KGFwLCAmYnVpbHRpbl9vcHQsICI6cCIpKSA9PSAncCcpCisJCQkJc2F3X3AgPSAxOworCQkJaWYgKG9wdGMgIT0gRU9GKQorCQkJCWJyZWFrOwkvKiBjb21tYW5kIC12ViBvciBzb21ldGhpbmcgKi8KKwkJCS8qIGRvbid0IGxvb2sgZm9yIGZ1bmN0aW9ucyAqLworCQkJZmNmbGFncyA9IEZDX0JJfEZDX1BBVEg7CisJCQlpZiAoc2F3X3ApIHsKKwkJCQlpZiAoRmxhZyhGUkVTVFJJQ1RFRCkpIHsKKwkJCQkJd2FybmluZ2YodHJ1ZSwKKwkJCQkJICAgICJjb21tYW5kIC1wOiByZXN0cmljdGVkIik7CisJCQkJCXJ2ID0gMTsKKwkJCQkJZ290byBMZWF2ZTsKKwkJCQl9CisJCQkJZmNmbGFncyB8PSBGQ19ERUZQQVRIOworCQkJfQorCQkJYXAgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCQkJLyogUE9TSVggc2F5cyBzcGVjaWFsIGJ1aWx0aW5zIGxvc2UgdGhlaXIgc3RhdHVzCisJCQkgKiBpZiBhY2Nlc3NlZCB1c2luZyBjb21tYW5kLgorCQkJICovCisJCQlrZWVwYXNuX29rID0gMDsKKwkJCWlmICghYXBbMF0pIHsKKwkJCQkvKiBlbnN1cmUgY29tbWFuZCB3aXRoIG5vIGFyZ3MgZXhpdHMgd2l0aCAwICovCisJCQkJc3Vic3RfZXhzdGF0ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlCisJCQlicmVhazsKKwkJdHAgPSBmaW5kY29tKGFwWzBdLCBmY2ZsYWdzICYgKEZDX0JJfEZDX0ZVTkMpKTsKKwl9CisJbF9leHBhbmQgPSBlLT5sb2M7CisJaWYgKGtlZXBhc25fb2sgJiYgKCFhcFswXSB8fCAodHAgJiYgKHRwLT5mbGFnICYgS0VFUEFTTikpKSkKKwkJdHlwZV9mbGFncyA9IDA7CisJZWxzZSB7CisJCS8qIGNyZWF0ZSBuZXcgdmFyaWFibGUvZnVuY3Rpb24gYmxvY2sgKi8KKwkJbmV3YmxvY2soKTsKKwkJLyoga3NoIGZ1bmN0aW9ucyBkb24ndCBrZWVwIGFzc2lnbm1lbnRzLCBQT1NJWCBmdW5jdGlvbnMgZG8uICovCisJCWlmIChrZWVwYXNuX29rICYmIHRwICYmIHRwLT50eXBlID09IENGVU5DICYmCisJCSAgICAhKHRwLT5mbGFnICYgRktTSCkpIHsKKwkJCWJvdXJuZV9mdW5jdGlvbl9jYWxsID0gdHJ1ZTsKKwkJCXR5cGVfZmxhZ3MgPSBFWFBPUlQ7CisJCX0gZWxzZQorCQkJdHlwZV9mbGFncyA9IExPQ0FMfExPQ0FMX0NPUFl8RVhQT1JUOworCX0KKwlsX2Fzc2lnbiA9IGUtPmxvYzsKKwlpZiAoRmxhZyhGRVhQT1JUKSkKKwkJdHlwZV9mbGFncyB8PSBFWFBPUlQ7CisJZm9yIChpID0gMDsgdC0+dmFyc1tpXTsgaSsrKSB7CisJCS8qIGRvIE5PVCBsb29rdXAgaW4gdGhlIG5ldyB2YXIvZm4gYmxvY2sganVzdCBjcmVhdGVkICovCisJCWUtPmxvYyA9IGxfZXhwYW5kOworCQljcCA9IGV2YWxzdHIodC0+dmFyc1tpXSwgRE9BU05USUxERSk7CisJCWUtPmxvYyA9IGxfYXNzaWduOworCQkvKiBidXQgYXNzaWduIGluIHRoZXJlIGFzIHVzdWFsICovCisKKwkJaWYgKEZsYWcoRlhUUkFDRSkpIHsKKwkJCWlmIChpID09IDApCisJCQkJc2hmX2ZwcmludGYoc2hsX291dCwgIiVzIiwKKwkJCQkJc3Vic3RpdHV0ZShzdHJfdmFsKGdsb2JhbCgiUFM0IikpLCAwKSk7CisJCQlzaGZfZnByaW50ZihzaGxfb3V0LCAiJXMlYyIsIGNwLAorCQkJICAgIHQtPnZhcnNbaSArIDFdID8gJyAnIDogJ1xuJyk7CisJCQlpZiAoIXQtPnZhcnNbaSArIDFdKQorCQkJCXNoZl9mbHVzaChzaGxfb3V0KTsKKwkJfQorCQl0eXBlc2V0KGNwLCB0eXBlX2ZsYWdzLCAwLCAwLCAwKTsKKwkJaWYgKGJvdXJuZV9mdW5jdGlvbl9jYWxsICYmICEodHlwZV9mbGFncyAmIEVYUE9SVCkpCisJCQl0eXBlc2V0KGNwLCBMT0NBTHxMT0NBTF9DT1BZfEVYUE9SVCwgMCwgMCwgMCk7CisJfQorCisJaWYgKChjcCA9ICphcCkgPT0gTlVMTCkgeworCQlydiA9IHN1YnN0X2V4c3RhdDsKKwkJZ290byBMZWF2ZTsKKwl9IGVsc2UgaWYgKCF0cCkgeworCQlpZiAoRmxhZyhGUkVTVFJJQ1RFRCkgJiYgdnN0cmNocihjcCwgJy8nKSkgeworCQkJd2FybmluZ2YodHJ1ZSwgIiVzOiByZXN0cmljdGVkIiwgY3ApOworCQkJcnYgPSAxOworCQkJZ290byBMZWF2ZTsKKwkJfQorCQl0cCA9IGZpbmRjb20oY3AsIGZjZmxhZ3MpOworCX0KKworCXN3aXRjaCAodHAtPnR5cGUpIHsKKwljYXNlIENTSEVMTDoJCQkvKiBzaGVsbCBidWlsdC1pbiAqLworCQlydiA9IGNhbGxfYnVpbHRpbih0cCwgKGNvbnN0IGNoYXIgKiopYXApOworCQlicmVhazsKKworCWNhc2UgQ0ZVTkM6IHsJCQkvKiBmdW5jdGlvbiBjYWxsICovCisJCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgb2xkX3hmbGFnOworCQl2b2xhdGlsZSBUZmxhZyBvbGRfaW51c2U7CisJCWNvbnN0IGNoYXIgKnZvbGF0aWxlIG9sZF9rc2huYW1lOworCisJCWlmICghKHRwLT5mbGFnICYgSVNTRVQpKSB7CisJCQlzdHJ1Y3QgdGJsICpmdHA7CisKKwkJCWlmICghdHAtPnUuZnBhdGgpIHsKKwkJCQlpZiAodHAtPnUyLmVycm5vXykgeworCQkJCQl3YXJuaW5nZih0cnVlLAorCQkJCQkgICAgIiVzOiBjYW4ndCBmaW5kIGZ1bmN0aW9uICIKKwkJCQkJICAgICJkZWZpbml0aW9uIGZpbGUgLSAlcyIsCisJCQkJCSAgICBjcCwgc3RyZXJyb3IodHAtPnUyLmVycm5vXykpOworCQkJCQlydiA9IDEyNjsKKwkJCQl9IGVsc2UgeworCQkJCQl3YXJuaW5nZih0cnVlLAorCQkJCQkgICAgIiVzOiBjYW4ndCBmaW5kIGZ1bmN0aW9uICIKKwkJCQkJICAgICJkZWZpbml0aW9uIGZpbGUiLCBjcCk7CisJCQkJCXJ2ID0gMTI3OworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpbmNsdWRlKHRwLT51LmZwYXRoLCAwLCBOVUxMLCAwKSA8IDApIHsKKwkJCQlydiA9IGVycm5vOworCQkJCXdhcm5pbmdmKHRydWUsCisJCQkJICAgICIlczogY2FuJ3Qgb3BlbiBmdW5jdGlvbiBkZWZpbml0aW9uIGZpbGUgJXMgLSAlcyIsCisJCQkJICAgIGNwLCB0cC0+dS5mcGF0aCwgc3RyZXJyb3IocnYpKTsKKwkJCQlydiA9IDEyNzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghKGZ0cCA9IGZpbmRmdW5jKGNwLCBoYXNoKGNwKSwgZmFsc2UpKSB8fAorCQkJICAgICEoZnRwLT5mbGFnICYgSVNTRVQpKSB7CisJCQkJd2FybmluZ2YodHJ1ZSwKKwkJCQkgICAgIiVzOiBmdW5jdGlvbiBub3QgZGVmaW5lZCBieSAlcyIsCisJCQkJICAgIGNwLCB0cC0+dS5mcGF0aCk7CisJCQkJcnYgPSAxMjc7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0cCA9IGZ0cDsKKwkJfQorCisJCS8qIGtzaCBmdW5jdGlvbnMgc2V0ICQwIHRvIGZ1bmN0aW9uIG5hbWUsIFBPU0lYIGZ1bmN0aW9ucyBsZWF2ZQorCQkgKiAkMCB1bmNoYW5nZWQuCisJCSAqLworCQlvbGRfa3NobmFtZSA9IGtzaG5hbWU7CisJCWlmICh0cC0+ZmxhZyAmIEZLU0gpCisJCQlrc2huYW1lID0gYXBbMF07CisJCWVsc2UKKwkJCWFwWzBdID0ga3NobmFtZTsKKwkJZS0+bG9jLT5hcmd2ID0gYXA7CisJCWZvciAoaSA9IDA7ICphcCsrICE9IE5VTEw7IGkrKykKKwkJCTsKKwkJZS0+bG9jLT5hcmdjID0gaSAtIDE7CisJCS8qIGtzaC1zdHlsZSBmdW5jdGlvbnMgaGFuZGxlIGdldG9wdHMgc2FuZWx5LAorCQkgKiBCb3VybmUvUE9TSVggZnVuY3Rpb25zIGFyZSBpbnNhbmUuLi4KKwkJICovCisJCWlmICh0cC0+ZmxhZyAmIEZLU0gpIHsKKwkJCWUtPmxvYy0+ZmxhZ3MgfD0gQkZfRE9HRVRPUFRTOworCQkJZS0+bG9jLT5nZXRvcHRzX3N0YXRlID0gdXNlcl9vcHQ7CisJCQlnZXRvcHRzX3Jlc2V0KDEpOworCQl9CisKKwkJb2xkX3hmbGFnID0gRmxhZyhGWFRSQUNFKTsKKwkJRmxhZyhGWFRSQUNFKSA9IHRwLT5mbGFnICYgVFJBQ0UgPyAxIDogMDsKKworCQlvbGRfaW51c2UgPSB0cC0+ZmxhZyAmIEZJTlVTRTsKKwkJdHAtPmZsYWcgfD0gRklOVVNFOworCisJCWUtPnR5cGUgPSBFX0ZVTkM7CisJCWkgPSBzaWdzZXRqbXAoZS0+amJ1ZiwgMCk7CisJCWlmIChpID09IDApIHsKKwkJCS8qIHNlZW1zIG9kZCB0byBwYXNzIFhFUlJPSyBoZXJlLCBidXQgQVQmVCBrc2ggZG9lcyAqLworCQkJZXhzdGF0ID0gZXhlY3V0ZSh0cC0+dmFsLnQsIGZsYWdzICYgWEVSUk9LLCB4ZXJyb2spOworCQkJaSA9IExSRVRVUk47CisJCX0KKwkJa3NobmFtZSA9IG9sZF9rc2huYW1lOworCQlGbGFnKEZYVFJBQ0UpID0gb2xkX3hmbGFnOworCQl0cC0+ZmxhZyA9ICh0cC0+ZmxhZyAmIH5GSU5VU0UpIHwgb2xkX2ludXNlOworCQkvKiBXZXJlIHdlIGRlbGV0ZWQgd2hpbGUgZXhlY3V0aW5nPyBJZiBzbywgZnJlZSB0aGUgZXhlY3V0aW9uCisJCSAqIHRyZWUuIHRvZG86IFVuZm9ydHVuYXRlbHksIHRoZSB0YWJsZSBlbnRyeSBpcyBuZXZlciByZS11c2VkCisJCSAqIHVudGlsIHRoZSBsb29rdXAgdGFibGUgaXMgZXhwYW5kZWQuCisJCSAqLworCQlpZiAoKHRwLT5mbGFnICYgKEZERUxFVEV8RklOVVNFKSkgPT0gRkRFTEVURSkgeworCQkJaWYgKHRwLT5mbGFnICYgQUxMT0MpIHsKKwkJCQl0cC0+ZmxhZyAmPSB+QUxMT0M7CisJCQkJdGZyZWUodHAtPnZhbC50LCB0cC0+YXJlYXApOworCQkJfQorCQkJdHAtPmZsYWcgPSAwOworCQl9CisJCXN3aXRjaCAoaSkgeworCQljYXNlIExSRVRVUk46CisJCWNhc2UgTEVSUk9SOgorCQkJcnYgPSBleHN0YXQ7CisJCQlicmVhazsKKwkJY2FzZSBMSU5UUjoKKwkJY2FzZSBMRVhJVDoKKwkJY2FzZSBMTEVBVkU6CisJCWNhc2UgTFNIRUxMOgorCQkJcXVpdGVudihOVUxMKTsKKwkJCXVud2luZChpKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJZGVmYXVsdDoKKwkJCXF1aXRlbnYoTlVMTCk7CisJCQlpbnRlcm5hbF9lcnJvcmYoIkNGVU5DICVkIiwgaSk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBDRVhFQzoJCS8qIGV4ZWN1dGFibGUgY29tbWFuZCAqLworCWNhc2UgQ1RBTElBUzoJCS8qIHRyYWNrZWQgYWxpYXMgKi8KKwkJaWYgKCEodHAtPmZsYWcmSVNTRVQpKSB7CisJCQkvKiBlcnJub18gd2lsbCBiZSBzZXQgaWYgdGhlIG5hbWVkIGNvbW1hbmQgd2FzIGZvdW5kCisJCQkgKiBidXQgY291bGQgbm90IGJlIGV4ZWN1dGVkIChwZXJtaXNzaW9ucywgbm8gZXhlY3V0ZQorCQkJICogYml0LCBkaXJlY3RvcnksIGV0YykuIFByaW50IG91dCBhIChob3BlZnVsbHkpCisJCQkgKiB1c2VmdWwgZXJyb3IgbWVzc2FnZSBhbmQgc2V0IHRoZSBleGl0IHN0YXR1cyB0byAxMjYuCisJCQkgKi8KKwkJCWlmICh0cC0+dTIuZXJybm9fKSB7CisJCQkJd2FybmluZ2YodHJ1ZSwgIiVzOiBjYW5ub3QgZXhlY3V0ZSAtICVzIiwgY3AsCisJCQkJICAgIHN0cmVycm9yKHRwLT51Mi5lcnJub18pKTsKKwkJCQlydiA9IDEyNjsJLyogUE9TSVggKi8KKwkJCX0gZWxzZSB7CisJCQkJd2FybmluZ2YodHJ1ZSwgIiVzOiBub3QgZm91bmQiLCBjcCk7CisJCQkJcnYgPSAxMjc7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIHNldCAkXyB0byBwcm9ncmFtbWUncyBmdWxsIHBhdGggKi8KKwkJLyogc2V0c3RyKCkgY2FuJ3QgZmFpbCBoZXJlICovCisJCXNldHN0cih0eXBlc2V0KCJfIiwgTE9DQUx8RVhQT1JULCAwLCBJTlRFR0VSLCAwKSwKKwkJICAgIHRwLT52YWwucywgS1NIX1JFVFVSTl9FUlJPUik7CisKKwkJaWYgKGZsYWdzJlhFWEVDKSB7CisJCQlqX2V4aXQoKTsKKwkJCWlmICghKGZsYWdzJlhCR05EKQorI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkJCSAgICB8fCBGbGFnKEZNT05JVE9SKQorI2VuZGlmCisJCQkgICAgKSB7CisJCQkJc2V0ZXhlY3NpZygmc2lndHJhcHNbU0lHSU5UXSwgU1NfUkVTVE9SRV9PUklHKTsKKwkJCQlzZXRleGVjc2lnKCZzaWd0cmFwc1tTSUdRVUlUXSwgU1NfUkVTVE9SRV9PUklHKTsKKwkJCX0KKwkJfQorCisJCS8qIHRvIGZvcmsgd2Ugc2V0IHVwIGEgVEVYRUMgbm9kZSBhbmQgY2FsbCBleGVjdXRlICovCisJCXRleGVjLnR5cGUgPSBURVhFQzsKKwkJdGV4ZWMubGVmdCA9IHQ7CS8qIGZvciB0cHJpbnQgKi8KKwkJdGV4ZWMuc3RyID0gdHAtPnZhbC5zOworCQl0ZXhlYy5hcmdzID0gYXA7CisJCXJ2ID0gZXhjaGlsZCgmdGV4ZWMsIGZsYWdzLCB4ZXJyb2ssIC0xKTsKKwkJYnJlYWs7CisJfQorIExlYXZlOgorCWlmIChmbGFncyAmIFhFWEVDKSB7CisJCWV4c3RhdCA9IHJ2OworCQl1bndpbmQoTExFQVZFKTsKKwl9CisJcmV0dXJuIChydik7Cit9CisKK3N0YXRpYyB2b2lkCitzY3JpcHRleGVjKHN0cnVjdCBvcCAqdHAsIGNvbnN0IGNoYXIgKiphcCkKK3sKKwljb25zdCBjaGFyICpzaDsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCXVuc2lnbmVkIGNoYXIgKmNwOworCWNoYXIgYnVmWzY0XTsJCS8qIDY0ID09IE1BWElOVEVSUCBpbiBNaXJCU0QgPHN5cy9wYXJhbS5oPiAqLworCWludCBmZDsKKyNlbmRpZgorCXVuaW9uIG1rc2hfY2NwaGFjayBhcmdzLCBjYXA7CisKKwlzaCA9IHN0cl92YWwoZ2xvYmFsKCJFWEVDU0hFTEwiKSk7CisJaWYgKHNoICYmICpzaCkKKwkJc2ggPSBzZWFyY2goc2gsIHBhdGgsIFhfT0ssIE5VTEwpOworCWlmICghc2ggfHwgISpzaCkKKwkJc2ggPSBNS1NIX0RFRkFVTFRfRVhFQ1NIRUxMOworCisJKnRwLT5hcmdzLS0gPSB0cC0+c3RyOworCisjaWZuZGVmIE1LU0hfU01BTEwKKwlpZiAoKGZkID0gb3Blbih0cC0+c3RyLCBPX1JET05MWSkpID49IDApIHsKKwkJLyogcmVhZCBmaXJzdCBNQVhJTlRFUlAgb2N0ZXRzIGZyb20gZmlsZSAqLworCQlpZiAocmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSkgPD0gMCkKKwkJCS8qIHJlYWQgZXJyb3IgLT4gbm8gZ29vZCAqLworCQkJYnVmWzBdID0gJ1wwJzsKKwkJY2xvc2UoZmQpOworCQkvKiBzY2FuIGZvciBuZXdsaW5lIChvciBDUikgb3IgTlVMIF9iZWZvcmVfIGVuZCBvZiBidWZmZXIgKi8KKwkJY3AgPSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKKwkJd2hpbGUgKChjaGFyICopY3AgPCAoYnVmICsgc2l6ZW9mKGJ1ZikpKQorCQkJaWYgKCpjcCA9PSAnXDAnIHx8ICpjcCA9PSAnXG4nIHx8ICpjcCA9PSAnXHInKSB7CisJCQkJKmNwID0gJ1wwJzsKKwkJCQlicmVhazsKKwkJCX0gZWxzZQorCQkJCSsrY3A7CisJCS8qIGlmIHRoZSBzaGViYW5nIGxpbmUgaXMgbG9uZ2VyIHRoYW4gTUFYSU5URVJQLCBiYWlsIG91dCAqLworCQlpZiAoKGNoYXIgKiljcCA+PSAoYnVmICsgc2l6ZW9mKGJ1ZikpKQorCQkJZ290byBub3NoZWJhbmc7CisJCS8qIHNraXAgVVRGLTggQnl0ZSBPcmRlciBNYXJrLCBpZiBwcmVzZW50ICovCisJCWNwID0gKHVuc2lnbmVkIGNoYXIgKilidWY7CisJCWlmICgoY3BbMF0gPT0gMHhFRikgJiYgKGNwWzFdID09IDB4QkIpICYmIChjcFsyXSA9PSAweEJGKSkKKwkJCWNwICs9IDM7CisJCS8qIGJhaWwgb3V0IGlmIHJlYWQgZXJyb3IgKGFib3ZlKSBvciBubyBzaGViYW5nICovCisJCWlmICgoY3BbMF0gIT0gJyMnKSB8fCAoY3BbMV0gIT0gJyEnKSkKKwkJCWdvdG8gbm9zaGViYW5nOworCQljcCArPSAyOworCQkvKiBza2lwIHdoaXRlc3BhY2UgYmVmb3JlIHNoZWxsIG5hbWUgKi8KKwkJd2hpbGUgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpCisJCQkrK2NwOworCQkvKiBqdXN0IHdoaXRlc3BhY2Ugb24gdGhlIGxpbmU/ICovCisJCWlmICgqY3AgPT0gJ1wwJykKKwkJCWdvdG8gbm9zaGViYW5nOworCQkvKiBubywgd2UgYWN0dWFsbHkgZm91bmQgYW4gaW50ZXJwcmV0ZXIgbmFtZSAqLworCQlzaCA9IChjaGFyICopY3A7CisJCS8qIGxvb2sgZm9yIGVuZCBvZiBzaGVsbC9pbnRlcnByZXRlciBuYW1lICovCisJCXdoaWxlICgqY3AgIT0gJyAnICYmICpjcCAhPSAnXHQnICYmICpjcCAhPSAnXDAnKQorCQkJKytjcDsKKwkJLyogYW55IGFyZ3VtZW50cz8gKi8KKwkJaWYgKCpjcCkgeworCQkJKmNwKysgPSAnXDAnOworCQkJLyogc2tpcCBzcGFjZXMgYmVmb3JlIGFyZ3VtZW50cyAqLworCQkJd2hpbGUgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpCisJCQkJKytjcDsKKwkJCS8qIHBhc3MgaXQgYWxsIGluIE9ORSBhcmd1bWVudCAoaGlzdG9yaWMgcmVhc29ucykgKi8KKwkJCWlmICgqY3ApCisJCQkJKnRwLT5hcmdzLS0gPSAoY2hhciAqKWNwOworCQl9Cisgbm9zaGViYW5nOgorCQlmZCA9IGJ1ZlswXSA8PCA4IHwgYnVmWzFdOworCQlpZiAoKGZkID09IC8qIE9NQUdJQyAqLyAwNDA3KSB8fAorCQkgICAgKGZkID09IC8qIE5NQUdJQyAqLyAwNDEwKSB8fAorCQkgICAgKGZkID09IC8qIFpNQUdJQyAqLyAwNDEzKSB8fAorCQkgICAgKGZkID09IC8qIFFNQUdJQyAqLyAwMzE0KSB8fAorCQkgICAgKGZkID09IC8qIEVDT0ZGX0kzODYgKi8gMHg0QzAxKSB8fAorCQkgICAgKGZkID09IC8qIEVDT0ZGX002OEsgKi8gMHgwMTUwIHx8IGZkID09IDB4NTAwMSkgfHwKKwkJICAgIChmZCA9PSAvKiBFQ09GRl9TSCAqLyAgIDB4MDUwMCB8fCBmZCA9PSAweDAwMDUpIHx8CisJCSAgICAoZmQgPT0gMHg3RjQ1ICYmIGJ1ZlsyXSA9PSAnTCcgJiYgYnVmWzNdID09ICdGJykgfHwKKwkJICAgIChmZCA9PSAvKiAiTVoiICovIDB4NEQ1QSkgfHwKKwkJICAgIChmZCA9PSAvKiBnemlwICovIDB4MUY4QikpCisJCQllcnJvcmYoIiVzOiBub3QgZXhlY3V0YWJsZTogbWFnaWMgJTA0WCIsIHRwLT5zdHIsIGZkKTsKKwl9CisjZW5kaWYKKwlhcmdzLnJvID0gdHAtPmFyZ3M7CisJKmFyZ3Mucm8gPSBzaDsKKworCWNhcC5ybyA9IGFwOworCWV4ZWN2ZShhcmdzLnJ3WzBdLCBhcmdzLnJ3LCBjYXAucncpOworCisJLyogcmVwb3J0IGJvdGggdGhlIHByb2dyYW1tZSB0aGF0IHdhcyBydW4gYW5kIHRoZSBib2d1cyBpbnRlcnByZXRlciAqLworCWVycm9yZigiJXM6ICVzOiAlcyIsIHRwLT5zdHIsIHNoLCBzdHJlcnJvcihlcnJubykpOworfQorCitpbnQKK3NoY29tZXhlYyhjb25zdCBjaGFyICoqd3ApCit7CisJc3RydWN0IHRibCAqdHA7CisKKwl0cCA9IGt0c2VhcmNoKCZidWlsdGlucywgKndwLCBoYXNoKCp3cCkpOworCWlmICh0cCA9PSBOVUxMKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoY29tZXhlYzogJXMiLCAqd3ApOworCXJldHVybiAoY2FsbF9idWlsdGluKHRwLCB3cCkpOworfQorCisvKgorICogU2VhcmNoIGZ1bmN0aW9uIHRhYmxlcyBmb3IgYSBmdW5jdGlvbi4gSWYgY3JlYXRlIHNldCwgYSB0YWJsZSBlbnRyeQorICogaXMgY3JlYXRlZCBpZiBub25lIGlzIGZvdW5kLgorICovCitzdHJ1Y3QgdGJsICoKK2ZpbmRmdW5jKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGgsIGJvb2wgY3JlYXRlKQoreworCXN0cnVjdCBibG9jayAqbDsKKwlzdHJ1Y3QgdGJsICp0cCA9IE5VTEw7CisKKwlmb3IgKGwgPSBlLT5sb2M7IGw7IGwgPSBsLT5uZXh0KSB7CisJCXRwID0ga3RzZWFyY2goJmwtPmZ1bnMsIG5hbWUsIGgpOworCQlpZiAodHApCisJCQlicmVhazsKKwkJaWYgKCFsLT5uZXh0ICYmIGNyZWF0ZSkgeworCQkJdHAgPSBrdGVudGVyKCZsLT5mdW5zLCBuYW1lLCBoKTsKKwkJCXRwLT5mbGFnID0gREVGSU5FRDsKKwkJCXRwLT50eXBlID0gQ0ZVTkM7CisJCQl0cC0+dmFsLnQgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuICh0cCk7Cit9CisKKy8qCisgKiBkZWZpbmUgZnVuY3Rpb24uIFJldHVybnMgMSBpZiBmdW5jdGlvbiBpcyBiZWluZyB1bmRlZmluZWQgKHQgPT0gMCkgYW5kCisgKiBmdW5jdGlvbiBkaWQgbm90IGV4aXN0LCByZXR1cm5zIDAgb3RoZXJ3aXNlLgorICovCitpbnQKK2RlZmluZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgb3AgKnQpCit7CisJc3RydWN0IHRibCAqdHA7CisJYm9vbCB3YXNfc2V0ID0gZmFsc2U7CisKKwl3aGlsZSAoMSkgeworCQl0cCA9IGZpbmRmdW5jKG5hbWUsIGhhc2gobmFtZSksIHRydWUpOworCisJCWlmICh0cC0+ZmxhZyAmIElTU0VUKQorCQkJd2FzX3NldCA9IHRydWU7CisJCS8qIElmIHRoaXMgZnVuY3Rpb24gaXMgY3VycmVudGx5IGJlaW5nIGV4ZWN1dGVkLCB3ZSB6YXAgdGhpcworCQkgKiB0YWJsZSBlbnRyeSBzbyBmaW5kZnVuYygpIHdvbid0IHNlZSBpdAorCQkgKi8KKwkJaWYgKHRwLT5mbGFnICYgRklOVVNFKSB7CisJCQl0cC0+bmFtZVswXSA9ICdcMCc7CisJCQl0cC0+ZmxhZyAmPSB+REVGSU5FRDsgLyogZW5zdXJlIGl0IHdvbid0IGJlIGZvdW5kICovCisJCQl0cC0+ZmxhZyB8PSBGREVMRVRFOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKworCWlmICh0cC0+ZmxhZyAmIEFMTE9DKSB7CisJCXRwLT5mbGFnICY9IH4oSVNTRVR8QUxMT0MpOworCQl0ZnJlZSh0cC0+dmFsLnQsIHRwLT5hcmVhcCk7CisJfQorCisJaWYgKHQgPT0gTlVMTCkgewkJLyogdW5kZWZpbmUgKi8KKwkJa3RkZWxldGUodHApOworCQlyZXR1cm4gKHdhc19zZXQgPyAwIDogMSk7CisJfQorCisJdHAtPnZhbC50ID0gdGNvcHkodC0+bGVmdCwgdHAtPmFyZWFwKTsKKwl0cC0+ZmxhZyB8PSAoSVNTRVR8QUxMT0MpOworCWlmICh0LT51LmtzaF9mdW5jKQorCQl0cC0+ZmxhZyB8PSBGS1NIOworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIGFkZCBidWlsdGluCisgKi8KK3ZvaWQKK2J1aWx0aW4oY29uc3QgY2hhciAqbmFtZSwgaW50ICgqZnVuYykgKGNvbnN0IGNoYXIgKiopKQoreworCXN0cnVjdCB0YmwgKnRwOworCVRmbGFnIGZsYWc7CisKKwkvKiBzZWUgaWYgYW55IGZsYWdzIHNob3VsZCBiZSBzZXQgZm9yIHRoaXMgYnVpbHRpbiAqLworCWZvciAoZmxhZyA9IDA7IDsgbmFtZSsrKSB7CisJCWlmICgqbmFtZSA9PSAnPScpCS8qIGNvbW1hbmQgZG9lcyB2YXJpYWJsZSBhc3NpZ25tZW50ICovCisJCQlmbGFnIHw9IEtFRVBBU047CisJCWVsc2UgaWYgKCpuYW1lID09ICcqJykJLyogUE9TSVggc3BlY2lhbCBidWlsdGluICovCisJCQlmbGFnIHw9IFNQRUNfQkk7CisJCWVsc2UgaWYgKCpuYW1lID09ICcrJykJLyogUE9TSVggcmVndWxhciBidWlsdGluICovCisJCQlmbGFnIHw9IFJFR19CSTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJdHAgPSBrdGVudGVyKCZidWlsdGlucywgbmFtZSwgaGFzaChuYW1lKSk7CisJdHAtPmZsYWcgPSBERUZJTkVEIHwgZmxhZzsKKwl0cC0+dHlwZSA9IENTSEVMTDsKKwl0cC0+dmFsLmYgPSBmdW5jOworfQorCisvKgorICogZmluZCBjb21tYW5kCisgKiBlaXRoZXIgZnVuY3Rpb24sIGhhc2hlZCBjb21tYW5kLCBvciBidWlsdC1pbiAoaW4gdGhhdCBvcmRlcikKKyAqLworc3RydWN0IHRibCAqCitmaW5kY29tKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncykKK3sKKwlzdGF0aWMgc3RydWN0IHRibCB0ZW1wOworCXVpbnQzMl90IGggPSBoYXNoKG5hbWUpOworCXN0cnVjdCB0YmwgKnRwID0gTlVMTCwgKnRiaTsKKwl1bnNpZ25lZCBjaGFyIGluc2VydCA9IEZsYWcoRlRSQUNLQUxMKTsJLyogaW5zZXJ0IGlmIG5vdCBmb3VuZCAqLworCWNoYXIgKmZwYXRoOwkJCS8qIGZvciBmdW5jdGlvbiBhdXRvbG9hZGluZyAqLworCXVuaW9uIG1rc2hfY2NoYWNrIG5wYXRoOworCisJaWYgKHZzdHJjaHIobmFtZSwgJy8nKSkgeworCQlpbnNlcnQgPSAwOworCQkvKiBwcmV2ZW50IEZQQVRIIHNlYXJjaCBiZWxvdyAqLworCQlmbGFncyAmPSB+RkNfRlVOQzsKKwkJZ290byBTZWFyY2g7CisJfQorCXRiaSA9IChmbGFncyAmIEZDX0JJKSA/IGt0c2VhcmNoKCZidWlsdGlucywgbmFtZSwgaCkgOiBOVUxMOworCS8qIFBPU0lYIHNheXMgc3BlY2lhbCBidWlsdGlucyBmaXJzdCwgdGhlbiBmdW5jdGlvbnMsIHRoZW4KKwkgKiBQT1NJWCByZWd1bGFyIGJ1aWx0aW5zLCB0aGVuIHNlYXJjaCBwYXRoLi4uCisJICovCisJaWYgKChmbGFncyAmIEZDX1NQRUNCSSkgJiYgdGJpICYmICh0YmktPmZsYWcgJiBTUEVDX0JJKSkKKwkJdHAgPSB0Ymk7CisJaWYgKCF0cCAmJiAoZmxhZ3MgJiBGQ19GVU5DKSkgeworCQl0cCA9IGZpbmRmdW5jKG5hbWUsIGgsIGZhbHNlKTsKKwkJaWYgKHRwICYmICEodHAtPmZsYWcgJiBJU1NFVCkpIHsKKwkJCWlmICgoZnBhdGggPSBzdHJfdmFsKGdsb2JhbCgiRlBBVEgiKSkpID09IG51bGwpIHsKKwkJCQl0cC0+dS5mcGF0aCA9IE5VTEw7CisJCQkJdHAtPnUyLmVycm5vXyA9IDA7CisJCQl9IGVsc2UKKwkJCQl0cC0+dS5mcGF0aCA9IHNlYXJjaChuYW1lLCBmcGF0aCwgUl9PSywKKwkJCQkgICAgJnRwLT51Mi5lcnJub18pOworCQl9CisJfQorCWlmICghdHAgJiYgKGZsYWdzICYgRkNfUkVHQkkpICYmIHRiaSAmJiAodGJpLT5mbGFnICYgUkVHX0JJKSkKKwkJdHAgPSB0Ymk7CisJaWYgKCF0cCAmJiAoZmxhZ3MgJiBGQ19VTlJFR0JJKSAmJiB0YmkpCisJCXRwID0gdGJpOworCWlmICghdHAgJiYgKGZsYWdzICYgRkNfUEFUSCkgJiYgIShmbGFncyAmIEZDX0RFRlBBVEgpKSB7CisJCXRwID0ga3RzZWFyY2goJnRhbGlhc2VzLCBuYW1lLCBoKTsKKwkJaWYgKHRwICYmICh0cC0+ZmxhZyAmIElTU0VUKSAmJiBhY2Nlc3ModHAtPnZhbC5zLCBYX09LKSAhPSAwKSB7CisJCQlpZiAodHAtPmZsYWcgJiBBTExPQykgeworCQkJCXRwLT5mbGFnICY9IH5BTExPQzsKKwkJCQlhZnJlZSh0cC0+dmFsLnMsIEFQRVJNKTsKKwkJCX0KKwkJCXRwLT5mbGFnICY9IH5JU1NFVDsKKwkJfQorCX0KKworIFNlYXJjaDoKKwlpZiAoKCF0cCB8fCAodHAtPnR5cGUgPT0gQ1RBTElBUyAmJiAhKHRwLT5mbGFnJklTU0VUKSkpICYmCisJICAgIChmbGFncyAmIEZDX1BBVEgpKSB7CisJCWlmICghdHApIHsKKwkJCWlmIChpbnNlcnQgJiYgIShmbGFncyAmIEZDX0RFRlBBVEgpKSB7CisJCQkJdHAgPSBrdGVudGVyKCZ0YWxpYXNlcywgbmFtZSwgaCk7CisJCQkJdHAtPnR5cGUgPSBDVEFMSUFTOworCQkJfSBlbHNlIHsKKwkJCQl0cCA9ICZ0ZW1wOworCQkJCXRwLT50eXBlID0gQ0VYRUM7CisJCQl9CisJCQl0cC0+ZmxhZyA9IERFRklORUQ7CS8qIG1ha2UgfklTU0VUICovCisJCX0KKwkJbnBhdGgucm8gPSBzZWFyY2gobmFtZSwgZmxhZ3MgJiBGQ19ERUZQQVRIID8gZGVmX3BhdGggOiBwYXRoLAorCQkgICAgWF9PSywgJnRwLT51Mi5lcnJub18pOworCQlpZiAobnBhdGgucm8pIHsKKwkJCXN0cmR1cHgodHAtPnZhbC5zLCBucGF0aC5ybywgQVBFUk0pOworCQkJaWYgKG5wYXRoLnJvICE9IG5hbWUpCisJCQkJYWZyZWUobnBhdGgucncsIEFURU1QKTsKKwkJCXRwLT5mbGFnIHw9IElTU0VUfEFMTE9DOworCQl9IGVsc2UgaWYgKChmbGFncyAmIEZDX0ZVTkMpICYmCisJCSAgICAoZnBhdGggPSBzdHJfdmFsKGdsb2JhbCgiRlBBVEgiKSkpICE9IG51bGwgJiYKKwkJICAgIChucGF0aC5ybyA9IHNlYXJjaChuYW1lLCBmcGF0aCwgUl9PSywKKwkJICAgICZ0cC0+dTIuZXJybm9fKSkgIT0gTlVMTCkgeworCQkJLyogQW4gdW5kb2N1bWVudGVkIGZlYXR1cmUgb2YgQVQmVCBrc2ggaXMgdGhhdCBpdAorCQkJICogc2VhcmNoZXMgRlBBVEggaWYgYSBjb21tYW5kIGlzIG5vdCBmb3VuZCwgZXZlbgorCQkJICogaWYgdGhlIGNvbW1hbmQgaGFzbid0IGJlZW4gc2V0IHVwIGFzIGFuIGF1dG9sb2FkZWQKKwkJCSAqIGZ1bmN0aW9uIChpZSwgbm8gdHlwZXNldCAtdWYpLgorCQkJICovCisJCQl0cCA9ICZ0ZW1wOworCQkJdHAtPnR5cGUgPSBDRlVOQzsKKwkJCXRwLT5mbGFnID0gREVGSU5FRDsgLyogbWFrZSB+SVNTRVQgKi8KKwkJCXRwLT51LmZwYXRoID0gbnBhdGgucm87CisJCX0KKwl9CisJcmV0dXJuICh0cCk7Cit9CisKKy8qCisgKiBmbHVzaCBleGVjdXRhYmxlIGNvbW1hbmRzIHdpdGggcmVsYXRpdmUgcGF0aHMKKyAqLwordm9pZAorZmx1c2hjb20oaW50IGFsbCkJLyoganVzdCByZWxhdGl2ZSBvciBhbGwgKi8KK3sKKwlzdHJ1Y3QgdGJsICp0cDsKKwlzdHJ1Y3QgdHN0YXRlIHRzOworCisJZm9yIChrdHdhbGsoJnRzLCAmdGFsaWFzZXMpOyAodHAgPSBrdG5leHQoJnRzKSkgIT0gTlVMTDsgKQorCQlpZiAoKHRwLT5mbGFnJklTU0VUKSAmJiAoYWxsIHx8IHRwLT52YWwuc1swXSAhPSAnLycpKSB7CisJCQlpZiAodHAtPmZsYWcmQUxMT0MpIHsKKwkJCQl0cC0+ZmxhZyAmPSB+KEFMTE9DfElTU0VUKTsKKwkJCQlhZnJlZSh0cC0+dmFsLnMsIEFQRVJNKTsKKwkJCX0KKwkJCXRwLT5mbGFnICY9IH5JU1NFVDsKKwkJfQorfQorCisvKiBDaGVjayBpZiBwYXRoIGlzIHNvbWV0aGluZyB3ZSB3YW50IHRvIGZpbmQuIFJldHVybnMgLTEgZm9yIGZhaWx1cmUuICovCitpbnQKK3NlYXJjaF9hY2Nlc3MoY29uc3QgY2hhciAqbHBhdGgsIGludCBtb2RlLAorICAgIGludCAqZXJybm9wKQkvKiBzZXQgaWYgY2FuZGlkYXRlIGZvdW5kLCBidXQgbm90IHN1aXRhYmxlICovCit7CisJaW50IHJldCwgZXJyID0gMDsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKworCWlmIChzdGF0KGxwYXRoLCAmc3RhdGIpIDwgMCkKKwkJcmV0dXJuICgtMSk7CisJcmV0ID0gYWNjZXNzKGxwYXRoLCBtb2RlKTsKKwlpZiAocmV0IDwgMCkKKwkJZXJyID0gZXJybm87IC8qIEZpbGUgZXhpc3RzLCBidXQgd2UgY2FuJ3QgYWNjZXNzIGl0ICovCisJZWxzZSBpZiAobW9kZSA9PSBYX09LICYmICghU19JU1JFRyhzdGF0Yi5zdF9tb2RlKSB8fAorCSAgICAhKHN0YXRiLnN0X21vZGUgJiAoU19JWFVTUnxTX0lYR1JQfFNfSVhPVEgpKSkpIHsKKwkJLyogVGhpcyAnY2F1c2UgYWNjZXNzKCkgc2F5cyByb290IGNhbiBleGVjdXRlIGV2ZXJ5dGhpbmcgKi8KKwkJcmV0ID0gLTE7CisJCWVyciA9IFNfSVNESVIoc3RhdGIuc3RfbW9kZSkgPyBFSVNESVIgOiBFQUNDRVM7CisJfQorCWlmIChlcnIgJiYgZXJybm9wICYmICEqZXJybm9wKQorCQkqZXJybm9wID0gZXJyOworCXJldHVybiAocmV0KTsKK30KKworLyoKKyAqIHNlYXJjaCBmb3IgY29tbWFuZCB3aXRoIFBBVEgKKyAqLworY29uc3QgY2hhciAqCitzZWFyY2goY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqbHBhdGgsCisgICAgaW50IG1vZGUsCQkvKiBSX09LIG9yIFhfT0sgKi8KKyAgICBpbnQgKmVycm5vcCkJLyogc2V0IGlmIGNhbmRpZGF0ZSBmb3VuZCwgYnV0IG5vdCBzdWl0YWJsZSAqLworeworCWNvbnN0IGNoYXIgKnNwLCAqcDsKKwljaGFyICp4cDsKKwlYU3RyaW5nIHhzOworCWludCBuYW1lbGVuOworCisJaWYgKGVycm5vcCkKKwkJKmVycm5vcCA9IDA7CisJaWYgKHZzdHJjaHIobmFtZSwgJy8nKSkgeworCQlpZiAoc2VhcmNoX2FjY2VzcyhuYW1lLCBtb2RlLCBlcnJub3ApID09IDApCisJCQlyZXR1cm4gKG5hbWUpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCW5hbWVsZW4gPSBzdHJsZW4obmFtZSkgKyAxOworCVhpbml0KHhzLCB4cCwgMTI4LCBBVEVNUCk7CisKKwlzcCA9IGxwYXRoOworCXdoaWxlIChzcCAhPSBOVUxMKSB7CisJCXhwID0gWHN0cmluZyh4cywgeHApOworCQlpZiAoIShwID0gY3N0cmNocihzcCwgJzonKSkpCisJCQlwID0gc3AgKyBzdHJsZW4oc3ApOworCQlpZiAocCAhPSBzcCkgeworCQkJWGNoZWNrTih4cywgeHAsIHAgLSBzcCk7CisJCQltZW1jcHkoeHAsIHNwLCBwIC0gc3ApOworCQkJeHAgKz0gcCAtIHNwOworCQkJKnhwKysgPSAnLyc7CisJCX0KKwkJc3AgPSBwOworCQlYY2hlY2tOKHhzLCB4cCwgbmFtZWxlbik7CisJCW1lbWNweSh4cCwgbmFtZSwgbmFtZWxlbik7CisJCWlmIChzZWFyY2hfYWNjZXNzKFhzdHJpbmcoeHMsIHhwKSwgbW9kZSwgZXJybm9wKSA9PSAwKQorCQkJcmV0dXJuIChYY2xvc2UoeHMsIHhwICsgbmFtZWxlbikpOworCQlpZiAoKnNwKysgPT0gJ1wwJykKKwkJCXNwID0gTlVMTDsKKwl9CisJWGZyZWUoeHMsIHhwKTsKKwlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgaW50CitjYWxsX2J1aWx0aW4oc3RydWN0IHRibCAqdHAsIGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgcnY7CisKKwlidWlsdGluX2FyZ3YwID0gd3BbMF07CisJYnVpbHRpbl9mbGFnID0gdHAtPmZsYWc7CisJc2hmX3Jlb3BlbigxLCBTSEZfV1IsIHNobF9zdGRvdXQpOworCXNobF9zdGRvdXRfb2sgPSAxOworCWtzaF9nZXRvcHRfcmVzZXQoJmJ1aWx0aW5fb3B0LCBHRl9FUlJPUik7CisJcnYgPSAoKnRwLT52YWwuZikod3ApOworCXNoZl9mbHVzaChzaGxfc3Rkb3V0KTsKKwlzaGxfc3Rkb3V0X29rID0gMDsKKwlidWlsdGluX2ZsYWcgPSAwOworCWJ1aWx0aW5fYXJndjAgPSBOVUxMOworCXJldHVybiAocnYpOworfQorCisvKgorICogc2V0IHVwIHJlZGlyZWN0aW9uLCBzYXZpbmcgb2xkIGZkcyBpbiBlLT5zYXZlZmQKKyAqLworc3RhdGljIGludAoraW9zZXR1cChzdHJ1Y3QgaW93b3JkICppb3AsIHN0cnVjdCB0YmwgKnRwKQoreworCWludCB1ID0gLTE7CisJY2hhciAqY3AgPSBpb3AtPm5hbWU7CisJaW50IGlvdHlwZSA9IGlvcC0+ZmxhZyAmIElPVFlQRTsKKwlpbnQgZG9fb3BlbiA9IDEsIGRvX2Nsb3NlID0gMCwgZmxhZ3MgPSAwOworCXN0cnVjdCBpb3dvcmQgaW90bXA7CisJc3RydWN0IHN0YXQgc3RhdGI7CisKKwlpZiAoaW90eXBlICE9IElPSEVSRSkKKwkJY3AgPSBldmFsb25lc3RyKGNwLCBET1RJTERFfChGbGFnKEZUQUxLSU5HX0kpID8gRE9HTE9CIDogMCkpOworCisJLyogVXNlZCBmb3IgdHJhY2luZyBhbmQgZXJyb3IgbWVzc2FnZXMgdG8gcHJpbnQgZXhwYW5kZWQgY3AgKi8KKwlpb3RtcCA9ICppb3A7CisJaW90bXAubmFtZSA9IChpb3R5cGUgPT0gSU9IRVJFKSA/IE5VTEwgOiBjcDsKKwlpb3RtcC5mbGFnIHw9IElPTkFNRVhQOworCisJaWYgKEZsYWcoRlhUUkFDRSkpCisJCXNoZWxsZigiJXMlc1xuIiwKKwkJICAgIHN1YnN0aXR1dGUoc3RyX3ZhbChnbG9iYWwoIlBTNCIpKSwgMCksCisJCSAgICBzbnB0cmVlZihOVUxMLCAzMiwgIiVSIiwgJmlvdG1wKSk7CisKKwlzd2l0Y2ggKGlvdHlwZSkgeworCWNhc2UgSU9SRUFEOgorCQlmbGFncyA9IE9fUkRPTkxZOworCQlicmVhazsKKworCWNhc2UgSU9DQVQ6CisJCWZsYWdzID0gT19XUk9OTFkgfCBPX0FQUEVORCB8IE9fQ1JFQVQ7CisJCWJyZWFrOworCisJY2FzZSBJT1dSSVRFOgorCQlmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkM7CisJCS8qIFRoZSBzdGF0KCkgaXMgaGVyZSB0byBhbGxvdyByZWRpcmVjdGlvbnMgdG8KKwkJICogdGhpbmdzIGxpa2UgL2Rldi9udWxsIHdpdGhvdXQgZXJyb3IuCisJCSAqLworCQlpZiAoRmxhZyhGTk9DTE9CQkVSKSAmJiAhKGlvcC0+ZmxhZyAmIElPQ0xPQikgJiYKKwkJICAgIChzdGF0KGNwLCAmc3RhdGIpIDwgMCB8fCBTX0lTUkVHKHN0YXRiLnN0X21vZGUpKSkKKwkJCWZsYWdzIHw9IE9fRVhDTDsKKwkJYnJlYWs7CisKKwljYXNlIElPUkRXUjoKKwkJZmxhZ3MgPSBPX1JEV1IgfCBPX0NSRUFUOworCQlicmVhazsKKworCWNhc2UgSU9IRVJFOgorCQlkb19vcGVuID0gMDsKKwkJLyogaGVyZWluKCkgcmV0dXJucyAtMiBpZiBlcnJvciBoYXMgYmVlbiBwcmludGVkICovCisJCXUgPSBoZXJlaW4oaW9wLT5oZXJlZG9jLCBpb3AtPmZsYWcgJiBJT0VWQUwpOworCQkvKiBjcCBtYXkgaGF2ZSB3cm9uZyBuYW1lICovCisJCWJyZWFrOworCisJY2FzZSBJT0RVUDogeworCQljb25zdCBjaGFyICplbXNnOworCisJCWRvX29wZW4gPSAwOworCQlpZiAoKmNwID09ICctJyAmJiAhY3BbMV0pIHsKKwkJCXUgPSAxMDA5OwkgLyogcHJldmVudCBlcnJvciByZXR1cm4gYmVsb3cgKi8KKwkJCWRvX2Nsb3NlID0gMTsKKwkJfSBlbHNlIGlmICgodSA9IGNoZWNrX2ZkKGNwLAorCQkgICAgWF9PSyB8ICgoaW9wLT5mbGFnICYgSU9SRFVQKSA/IFJfT0sgOiBXX09LKSwKKwkJICAgICZlbXNnKSkgPCAwKSB7CisJCQl3YXJuaW5nZih0cnVlLCAiJXM6ICVzIiwKKwkJCSAgICBzbnB0cmVlZihOVUxMLCAzMiwgIiVSIiwgJmlvdG1wKSwgZW1zZyk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlpZiAodSA9PSBpb3AtPnVuaXQpCisJCQlyZXR1cm4gKDApOwkJLyogImR1cCBmcm9tIiA9PSAiZHVwIHRvIiAqLworCQlicmVhazsKKwl9CisJfQorCisJaWYgKGRvX29wZW4pIHsKKwkJaWYgKEZsYWcoRlJFU1RSSUNURUQpICYmIChmbGFncyAmIE9fQ1JFQVQpKSB7CisJCQl3YXJuaW5nZih0cnVlLCAiJXM6IHJlc3RyaWN0ZWQiLCBjcCk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQl1ID0gb3BlbihjcCwgZmxhZ3MsIDA2NjYpOworCX0KKwlpZiAodSA8IDApIHsKKwkJLyogaGVyZWluKCkgbWF5IGFscmVhZHkgaGF2ZSBwcmludGVkIG1lc3NhZ2UgKi8KKwkJaWYgKHUgPT0gLTEpIHsKKwkJCXUgPSBlcnJubzsKKwkJCXdhcm5pbmdmKHRydWUsICJjYW5ub3QgJXMgJXM6ICVzIiwKKwkJCSAgICBpb3R5cGUgPT0gSU9EVVAgPyAiZHVwIiA6CisJCQkgICAgKGlvdHlwZSA9PSBJT1JFQUQgfHwgaW90eXBlID09IElPSEVSRSkgPworCQkJICAgICJvcGVuIiA6ICJjcmVhdGUiLCBjcCwgc3RyZXJyb3IodSkpOworCQl9CisJCXJldHVybiAoLTEpOworCX0KKwkvKiBEbyBub3Qgc2F2ZSBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHJlZGlyZWN0ZWQgKGkuZS4gImNhdCA+eCA+eSIpLiAqLworCWlmIChlLT5zYXZlZmRbaW9wLT51bml0XSA9PSAwKSB7CisJCS8qIElmIHRoZXNlIGFyZSB0aGUgc2FtZSwgaXQgbWVhbnMgdW5pdCB3YXMgcHJldmlvdXNseSBjbG9zZWQgKi8KKwkJaWYgKHUgPT0gaW9wLT51bml0KQorCQkJZS0+c2F2ZWZkW2lvcC0+dW5pdF0gPSAtMTsKKwkJZWxzZQorCQkJLyogY19leGVjKCkgYXNzdW1lcyBlLT5zYXZlZmRbZmRdIHNldCBmb3IgYW55CisJCQkgKiByZWRpcmVjdGlvbnMuIEFzayBzYXZlZmQoKSBub3QgdG8gY2xvc2UgaW9wLT51bml0OworCQkJICogdGhpcyBhbGxvd3MgZXJyb3IgbWVzc2FnZXMgdG8gYmUgc2VlbiBpZiBpb3AtPnVuaXQKKwkJCSAqIGlzIDI7IGFsc28gbWVhbnMgd2UgY2FuJ3QgbG9zZSB0aGUgZmQgKGVnLCBib3RoCisJCQkgKiBkdXAyIGJlbG93IGFuZCBkdXAyIGluIHJlc3RmZCgpIGZhaWxpbmcpLgorCQkJICovCisJCQllLT5zYXZlZmRbaW9wLT51bml0XSA9IHNhdmVmZChpb3AtPnVuaXQpOworCX0KKworCWlmIChkb19jbG9zZSkKKwkJY2xvc2UoaW9wLT51bml0KTsKKwllbHNlIGlmICh1ICE9IGlvcC0+dW5pdCkgeworCQlpZiAoa3NoX2R1cDIodSwgaW9wLT51bml0LCB0cnVlKSA8IDApIHsKKwkJCWludCBldjsKKworCQkJZXYgPSBlcnJubzsKKwkJCXdhcm5pbmdmKHRydWUsCisJCQkgICAgImNvdWxkIG5vdCBmaW5pc2ggKGR1cCkgcmVkaXJlY3Rpb24gJXM6ICVzIiwKKwkJCSAgICBzbnB0cmVlZihOVUxMLCAzMiwgIiVSIiwgJmlvdG1wKSwKKwkJCSAgICBzdHJlcnJvcihldikpOworCQkJaWYgKGlvdHlwZSAhPSBJT0RVUCkKKwkJCQljbG9zZSh1KTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCWlmIChpb3R5cGUgIT0gSU9EVVApCisJCQljbG9zZSh1KTsKKwkJLyogVG91Y2hpbmcgYW55IGNvLXByb2Nlc3MgZmQgaW4gYW4gZW1wdHkgZXhlYworCQkgKiBjYXVzZXMgdGhlIHNoZWxsIHRvIGNsb3NlIGl0cyBjb3BpZXMKKwkJICovCisJCWVsc2UgaWYgKHRwICYmIHRwLT50eXBlID09IENTSEVMTCAmJiB0cC0+dmFsLmYgPT0gY19leGVjKSB7CisJCQlpZiAoaW9wLT5mbGFnICYgSU9SRFVQKQkvKiBwb3NzaWJsZSBleGVjIDwmcCAqLworCQkJCWNvcHJvY19yZWFkX2Nsb3NlKHUpOworCQkJZWxzZQkJCS8qIHBvc3NpYmxlIGV4ZWMgPiZwICovCisJCQkJY29wcm9jX3dyaXRlX2Nsb3NlKHUpOworCQl9CisJfQorCWlmICh1ID09IDIpIC8qIENsZWFyIGFueSB3cml0ZSBlcnJvcnMgKi8KKwkJc2hmX3Jlb3BlbigyLCBTSEZfV1IsIHNobF9vdXQpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBvcGVuIGhlcmUgZG9jdW1lbnQgdGVtcCBmaWxlLgorICogaWYgdW5xdW90ZWQgaGVyZSwgZXhwYW5kIGhlcmUgdGVtcCBmaWxlIGludG8gc2Vjb25kIHRlbXAgZmlsZS4KKyAqLworc3RhdGljIGludAoraGVyZWluKGNvbnN0IGNoYXIgKmNvbnRlbnQsIGludCBzdWIpCit7CisJdm9sYXRpbGUgaW50IGZkID0gLTE7CisJc3RydWN0IHNvdXJjZSAqcywgKnZvbGF0aWxlIG9zb3VyY2U7CisJc3RydWN0IHNoZiAqdm9sYXRpbGUgc2hmOworCXN0cnVjdCB0ZW1wICpoOworCWludCBpOworCisJLyoga3NoIC1jICdjYXQgPDwgRU9GJyBjYW4gY2F1c2UgdGhpcy4uLiAqLworCWlmIChjb250ZW50ID09IE5VTEwpIHsKKwkJd2FybmluZ2YodHJ1ZSwgImhlcmUgZG9jdW1lbnQgbWlzc2luZyIpOworCQlyZXR1cm4gKC0yKTsgLyogc3BlY2lhbCB0byBpb3NldHVwKCk6IGRvbid0IHByaW50IGVycm9yICovCisJfQorCisJLyogQ3JlYXRlIHRlbXAgZmlsZSB0byBob2xkIGNvbnRlbnQgKGRvbmUgYmVmb3JlIG5ld2VudiBzbyB0ZW1wCisJICogZG9lc24ndCBnZXQgcmVtb3ZlZCB0b28gc29vbikuCisJICovCisJaCA9IG1ha2V0ZW1wKEFURU1QLCBUVF9IRVJFRE9DX0VYUCwgJmUtPnRlbXBzKTsKKwlpZiAoIShzaGYgPSBoLT5zaGYpIHx8IChmZCA9IG9wZW4oaC0+bmFtZSwgT19SRE9OTFksIDApKSA8IDApIHsKKwkJZmQgPSBlcnJubzsKKwkJd2FybmluZ2YodHJ1ZSwgImNhbid0ICVzIHRlbXBvcmFyeSBmaWxlICVzOiAlcyIsCisJCSAgICAhc2hmID8gImNyZWF0ZSIgOiAib3BlbiIsCisJCSAgICBoLT5uYW1lLCBzdHJlcnJvcihmZCkpOworCQlpZiAoc2hmKQorCQkJc2hmX2Nsb3NlKHNoZik7CisJCXJldHVybiAoLTIgLyogc3BlY2lhbCB0byBpb3NldHVwKCk6IGRvbid0IHByaW50IGVycm9yICovKTsKKwl9CisKKwlvc291cmNlID0gc291cmNlOworCW5ld2VudihFX0VSUkgpOworCWkgPSBzaWdzZXRqbXAoZS0+amJ1ZiwgMCk7CisJaWYgKGkpIHsKKwkJc291cmNlID0gb3NvdXJjZTsKKwkJcXVpdGVudihzaGYpOworCQljbG9zZShmZCk7CisJCXJldHVybiAoLTIpOyAvKiBzcGVjaWFsIHRvIGlvc2V0dXAoKTogZG9uJ3QgcHJpbnQgZXJyb3IgKi8KKwl9CisJaWYgKHN1YikgeworCQkvKiBEbyBzdWJzdGl0dXRpb25zIG9uIHRoZSBjb250ZW50IG9mIGhlcmVkb2MgKi8KKwkJcyA9IHB1c2hzKFNTVFJJTkcsIEFURU1QKTsKKwkJcy0+c3RhcnQgPSBzLT5zdHIgPSBjb250ZW50OworCQlzb3VyY2UgPSBzOworCQlpZiAoeXlsZXgoT05FV09SRHxIRVJFRE9DKSAhPSBMV09SRCkKKwkJCWludGVybmFsX2Vycm9yZigiaGVyZWluOiB5eWxleCIpOworCQlzb3VyY2UgPSBvc291cmNlOworCQlzaGZfcHV0cyhldmFsc3RyKHl5bHZhbC5jcCwgMCksIHNoZik7CisJfSBlbHNlCisJCXNoZl9wdXRzKGNvbnRlbnQsIHNoZik7CisKKwlxdWl0ZW52KE5VTEwpOworCisJaWYgKHNoZl9jbG9zZShzaGYpID09IEVPRikgeworCQlpID0gZXJybm87CisJCWNsb3NlKGZkKTsKKwkJZmQgPSBlcnJubzsKKwkJd2FybmluZ2YodHJ1ZSwgImVycm9yIHdyaXRpbmcgJXM6ICVzLCAlcyIsIGgtPm5hbWUsCisJCSAgICBzdHJlcnJvcihpKSwgc3RyZXJyb3IoZmQpKTsKKwkJcmV0dXJuICgtMik7CS8qIHNwZWNpYWwgdG8gaW9zZXR1cCgpOiBkb24ndCBwcmludCBlcnJvciAqLworCX0KKworCXJldHVybiAoZmQpOworfQorCisvKgorICoJa3NoIHNwZWNpYWwgLSB0aGUgc2VsZWN0IGNvbW1hbmQgcHJvY2Vzc2luZyBzZWN0aW9uCisgKglwcmludCB0aGUgYXJncyBpbiBjb2x1bW4gZm9ybSAtIGFzc3VtaW5nIHRoYXQgd2UgY2FuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2RvX3NlbGVjdGFyZ3MoY29uc3QgY2hhciAqKmFwLCBib29sIHByaW50X21lbnUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnJlYWRfYXJnc1tdID0geworCQkicmVhZCIsICItciIsICJSRVBMWSIsIE5VTEwKKwl9OworCWNoYXIgKnM7CisJaW50IGksIGFyZ2N0OworCisJZm9yIChhcmdjdCA9IDA7IGFwW2FyZ2N0XTsgYXJnY3QrKykKKwkJOworCXdoaWxlICgxKSB7CisJCS8qIE1lbnUgaXMgcHJpbnRlZCBpZgorCQkgKgktIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgYXJvdW5kIHRoZSBzZWxlY3QgbG9vcAorCQkgKgktIHRoZSB1c2VyIGVudGVycyBhIGJsYW5rIGxpbmUKKwkJICoJLSB0aGUgUkVQTFkgcGFyYW1ldGVyIGlzIGVtcHR5CisJCSAqLworCQlpZiAocHJpbnRfbWVudSB8fCAhKnN0cl92YWwoZ2xvYmFsKCJSRVBMWSIpKSkKKwkJCXByX21lbnUoYXApOworCQlzaGVsbGYoIiVzIiwgc3RyX3ZhbChnbG9iYWwoIlBTMyIpKSk7CisJCWlmIChjYWxsX2J1aWx0aW4oZmluZGNvbSgicmVhZCIsIEZDX0JJKSwgcmVhZF9hcmdzKSkKKwkJCXJldHVybiAoTlVMTCk7CisJCXMgPSBzdHJfdmFsKGdsb2JhbCgiUkVQTFkiKSk7CisJCWlmICgqcykgeworCQkJZ2V0bihzLCAmaSk7CisJCQlyZXR1cm4gKChpID49IDEgJiYgaSA8PSBhcmdjdCkgPyBhcFtpIC0gMV0gOiBudWxsKTsKKwkJfQorCQlwcmludF9tZW51ID0gMTsKKwl9Cit9CisKK3N0cnVjdCBzZWxlY3RfbWVudV9pbmZvIHsKKwljb25zdCBjaGFyICogY29uc3QgKmFyZ3M7CisJaW50IG51bV93aWR0aDsKK307CisKK3N0YXRpYyBjaGFyICpzZWxlY3RfZm10X2VudHJ5KGNoYXIgKiwgaW50LCBpbnQsIGNvbnN0IHZvaWQgKik7CisKKy8qIGZvcm1hdCBhIHNpbmdsZSBzZWxlY3QgbWVudSBpdGVtICovCitzdGF0aWMgY2hhciAqCitzZWxlY3RfZm10X2VudHJ5KGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IGksIGNvbnN0IHZvaWQgKmFyZykKK3sKKwljb25zdCBzdHJ1Y3Qgc2VsZWN0X21lbnVfaW5mbyAqc21pID0KKwkgICAgKGNvbnN0IHN0cnVjdCBzZWxlY3RfbWVudV9pbmZvICopYXJnOworCisJc2hmX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJSpkKSAlcyIsCisJICAgIHNtaS0+bnVtX3dpZHRoLCBpICsgMSwgc21pLT5hcmdzW2ldKTsKKwlyZXR1cm4gKGJ1Zik7Cit9CisKKy8qCisgKglwcmludCBhIHNlbGVjdCBzdHlsZSBtZW51CisgKi8KK2ludAorcHJfbWVudShjb25zdCBjaGFyICogY29uc3QgKmFwKQoreworCXN0cnVjdCBzZWxlY3RfbWVudV9pbmZvIHNtaTsKKwljb25zdCBjaGFyICogY29uc3QgKnBwOworCWludCBhY29scyA9IDAsIGFvY3RzID0gMCwgaSwgbjsKKworCS8qCisJICogd2lkdGgvY29sdW1uIGNhbGN1bGF0aW9ucyB3ZXJlIGRvbmUgb25jZSBhbmQgc2F2ZWQsIGJ1dCB0aGlzCisJICogbWVhbnMgc2VsZWN0IGNhbid0IGJlIHVzZWQgcmVjdXJzaXZlbHkgc28gd2UgcmUtY2FsY3VsYXRlCisJICogZWFjaCB0aW1lIChjb3VsZCBzYXZlIGluIGEgc3RydWN0dXJlIHRoYXQgaXMgcmV0dXJuZWQsIGJ1dAorCSAqIGl0J3MgcHJvYmFibHkgbm90IHdvcnRoIHRoZSBib3RoZXIpCisJICovCisKKwkvKgorCSAqIGdldCBkaW1lbnNpb25zIG9mIHRoZSBsaXN0CisJICovCisJZm9yIChuID0gMCwgcHAgPSBhcDsgKnBwOyBuKyssIHBwKyspIHsKKwkJaSA9IHN0cmxlbigqcHApOworCQlpZiAoaSA+IGFvY3RzKQorCQkJYW9jdHMgPSBpOworCQlpID0gdXRmX21ic3dpZHRoKCpwcCk7CisJCWlmIChpID4gYWNvbHMpCisJCQlhY29scyA9IGk7CisJfQorCisJLyoKKwkgKiB3ZSB3aWxsIHByaW50IGFuIGluZGV4IG9mIHRoZSBmb3JtICIlZCkgIiBpbiBmcm9udCBvZgorCSAqIGVhY2ggZW50cnksIHNvIGdldCB0aGUgbWF4aW11bSB3aWR0aCBvZiB0aGlzCisJICovCisJZm9yIChpID0gbiwgc21pLm51bV93aWR0aCA9IDE7IGkgPj0gMTA7IGkgLz0gMTApCisJCXNtaS5udW1fd2lkdGgrKzsKKworCXNtaS5hcmdzID0gYXA7CisJcHJpbnRfY29sdW1ucyhzaGxfb3V0LCBuLCBzZWxlY3RfZm10X2VudHJ5LCAodm9pZCAqKSZzbWksCisJICAgIHNtaS5udW1fd2lkdGggKyAyICsgYW9jdHMsIHNtaS5udW1fd2lkdGggKyAyICsgYWNvbHMsCisJICAgIHRydWUpOworCisJcmV0dXJuIChuKTsKK30KKworLyogWFhYOiBob3JyaWJsZSBrbHVkZ2UgdG8gZml0IHdpdGhpbiB0aGUgZnJhbWV3b3JrICovCitzdGF0aWMgY2hhciAqcGxhaW5fZm10X2VudHJ5KGNoYXIgKiwgaW50LCBpbnQsIGNvbnN0IHZvaWQgKik7CisKK3N0YXRpYyBjaGFyICoKK3BsYWluX2ZtdF9lbnRyeShjaGFyICpidWYsIGludCBidWZsZW4sIGludCBpLCBjb25zdCB2b2lkICphcmcpCit7CisJc2hmX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJXMiLCAoKGNvbnN0IGNoYXIgKiBjb25zdCAqKWFyZylbaV0pOworCXJldHVybiAoYnVmKTsKK30KKworaW50Citwcl9saXN0KGNoYXIgKiBjb25zdCAqYXApCit7CisJaW50IGFjb2xzID0gMCwgYW9jdHMgPSAwLCBpLCBuOworCWNoYXIgKiBjb25zdCAqcHA7CisKKwlmb3IgKG4gPSAwLCBwcCA9IGFwOyAqcHA7IG4rKywgcHArKykgeworCQlpID0gc3RybGVuKCpwcCk7CisJCWlmIChpID4gYW9jdHMpCisJCQlhb2N0cyA9IGk7CisJCWkgPSB1dGZfbWJzd2lkdGgoKnBwKTsKKwkJaWYgKGkgPiBhY29scykKKwkJCWFjb2xzID0gaTsKKwl9CisKKwlwcmludF9jb2x1bW5zKHNobF9vdXQsIG4sIHBsYWluX2ZtdF9lbnRyeSwgKGNvbnN0IHZvaWQgKilhcCwKKwkgICAgYW9jdHMsIGFjb2xzLCBmYWxzZSk7CisKKwlyZXR1cm4gKG4pOworfQorCisvKgorICoJW1sgLi4uIF1dIGV2YWx1YXRpb24gcm91dGluZXMKKyAqLworCisvKgorICogVGVzdCBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhIHdoYXRldmVyLiBBY2NlcHRzIHRoZSBjdXJyZW50IHRva2VuIGlmCisgKiBpdCBpcy4gUmV0dXJucyAwIGlmIGl0IGlzIG5vdCwgbm9uLXplcm8gaWYgaXQgaXMgKGluIHRoZSBjYXNlIG9mCisgKiBUTV9VTk9QIGFuZCBUTV9CSU5PUCwgdGhlIHJldHVybmVkIHZhbHVlIGlzIGEgVGVzdF9vcCkuCisgKi8KK3N0YXRpYyBUZXN0X29wCitkYnRlc3RlX2lzYShUZXN0X2VudiAqdGUsIFRlc3RfbWV0YSBtZXRhKQoreworCVRlc3Rfb3AgcmV0ID0gVE9fTk9OT1A7CisJaW50IHVxd29yZDsKKwljb25zdCBjaGFyICpwOworCisJaWYgKCEqdGUtPnBvcy53cCkKKwkJcmV0dXJuIChtZXRhID09IFRNX0VORCA/IFRPX05PTk5VTEwgOiBUT19OT05PUCk7CisKKwkvKiB1bnF1b3RlZCB3b3JkPyAqLworCWZvciAocCA9ICp0ZS0+cG9zLndwOyAqcCA9PSBDSEFSOyBwICs9IDIpCisJCTsKKwl1cXdvcmQgPSAqcCA9PSBFT1M7CisKKwlpZiAobWV0YSA9PSBUTV9VTk9QIHx8IG1ldGEgPT0gVE1fQklOT1ApIHsKKwkJaWYgKHVxd29yZCkgeworCQkJY2hhciBidWZbOF07CS8qIGxvbmdlciB0aGFuIHRoZSBsb25nZXN0IG9wZXJhdG9yICovCisJCQljaGFyICpxID0gYnVmOworCQkJZm9yIChwID0gKnRlLT5wb3Mud3A7CisJCQkgICAgKnAgPT0gQ0hBUiAmJiBxIDwgJmJ1ZltzaXplb2YoYnVmKSAtIDFdOyBwICs9IDIpCisJCQkJKnErKyA9IHBbMV07CisJCQkqcSA9ICdcMCc7CisJCQlyZXQgPSB0ZXN0X2lzb3AobWV0YSwgYnVmKTsKKwkJfQorCX0gZWxzZSBpZiAobWV0YSA9PSBUTV9FTkQpCisJCXJldCA9IFRPX05PTk9QOworCWVsc2UKKwkJcmV0ID0gKHVxd29yZCAmJiAhc3RyY21wKCp0ZS0+cG9zLndwLAorCQkgICAgZGJ0ZXN0X3Rva2Vuc1soaW50KW1ldGFdKSkgPyBUT19OT05OVUxMIDogVE9fTk9OT1A7CisKKwkvKiBBY2NlcHQgdGhlIHRva2VuPyAqLworCWlmIChyZXQgIT0gVE9fTk9OT1ApCisJCXRlLT5wb3Mud3ArKzsKKworCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZGJ0ZXN0ZV9nZXRvcG5kKFRlc3RfZW52ICp0ZSwgVGVzdF9vcCBvcCwgYm9vbCBkb19ldmFsKQoreworCWNvbnN0IGNoYXIgKnMgPSAqdGUtPnBvcy53cDsKKworCWlmICghcykKKwkJcmV0dXJuIChOVUxMKTsKKworCXRlLT5wb3Mud3ArKzsKKworCWlmICghZG9fZXZhbCkKKwkJcmV0dXJuIChudWxsKTsKKworCWlmIChvcCA9PSBUT19TVEVRTCB8fCBvcCA9PSBUT19TVE5FUSkKKwkJcyA9IGV2YWxzdHIocywgRE9USUxERSB8IERPUEFUKTsKKwllbHNlCisJCXMgPSBldmFsc3RyKHMsIERPVElMREUpOworCisJcmV0dXJuIChzKTsKK30KKworc3RhdGljIHZvaWQKK2RidGVzdGVfZXJyb3IoVGVzdF9lbnYgKnRlLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyICptc2cpCit7CisJdGUtPmZsYWdzIHw9IFRFRl9FUlJPUjsKKwlpbnRlcm5hbF93YXJuaW5nZigiZGJ0ZXN0ZV9lcnJvcjogJXMgKG9mZnNldCAlZCkiLCBtc2csIG9mZnNldCk7Cit9CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9leHByLmMgYi9ta3NoL3NyYy9leHByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1NzEwYwotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL2V4cHIuYwpAQCAtMCwwICsxLDg5NSBAQAorLyoJJE9wZW5CU0Q6IGV4cHIuYyx2IDEuMjEgMjAwOS8wNi8wMSAxOTowMDo1NyBkZXJhYWR0IEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaW5jbHVkZSAic2guaCIKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvZXhwci5jLHYgMS40NCAyMDEwLzA4LzE0IDIxOjM1OjEzIHRnIEV4cCAkIik7CisKKy8qIFRoZSBvcmRlciBvZiB0aGVzZSBlbnVtcyBpcyBjb25zdHJhaW5lZCBieSB0aGUgb3JkZXIgb2Ygb3BpbmZvW10gKi8KK2VudW0gdG9rZW4geworCS8qIHNvbWUgKGxvbmcpIHVuYXJ5IG9wZXJhdG9ycyAqLworCU9fUExVU1BMVVMgPSAwLCBPX01JTlVTTUlOVVMsCisJLyogYmluYXJ5IG9wZXJhdG9ycyAqLworCU9fRVEsIE9fTkUsCisJLyogYXNzaWdubWVudHMgYXJlIGFzc3VtZWQgdG8gYmUgaW4gcmFuZ2UgT19BU04gLi4gT19CT1JBU04gKi8KKwlPX0FTTiwgT19USU1FU0FTTiwgT19ESVZBU04sIE9fTU9EQVNOLCBPX1BMVVNBU04sIE9fTUlOVVNBU04sCisJT19MU0hJRlRBU04sIE9fUlNISUZUQVNOLCBPX0JBTkRBU04sIE9fQlhPUkFTTiwgT19CT1JBU04sCisJT19MU0hJRlQsIE9fUlNISUZULAorCU9fTEUsIE9fR0UsIE9fTFQsIE9fR1QsCisJT19MQU5ELAorCU9fTE9SLAorCU9fVElNRVMsIE9fRElWLCBPX01PRCwKKwlPX1BMVVMsIE9fTUlOVVMsCisJT19CQU5ELAorCU9fQlhPUiwKKwlPX0JPUiwKKwlPX1RFUk4sCisJT19DT01NQSwKKwkvKiB0aGluZ3MgYWZ0ZXIgdGhpcyBhcmVuJ3QgdXNlZCBhcyBiaW5hcnkgb3BlcmF0b3JzICovCisJLyogdW5hcnkgdGhhdCBhcmUgbm90IGFsc28gYmluYXJpZXMgKi8KKwlPX0JOT1QsIE9fTE5PVCwKKwkvKiBtaXNjICovCisJT1BFTl9QQVJFTiwgQ0xPU0VfUEFSRU4sIENURVJOLAorCS8qIHRoaW5ncyB0aGF0IGRvbid0IGFwcGVhciBpbiB0aGUgb3BpbmZvW10gdGFibGUgKi8KKwlWQVIsIExJVCwgRU5ELCBCQUQKK307CisjZGVmaW5lIElTX0JJTk9QKG9wKSAoKChpbnQpb3ApID49IChpbnQpT19FUSAmJiAoKGludClvcCkgPD0gKGludClPX0NPTU1BKQorI2RlZmluZSBJU19BU1NJR05PUChvcCkJKChpbnQpKG9wKSA+PSAoaW50KU9fQVNOICYmIChpbnQpKG9wKSA8PSAoaW50KU9fQk9SQVNOKQorCisvKiBwcmVjaXNpb25zOyB1c2VkIHRvIGJlIGVudW0gcHJlYyBidXQgd2UgZG8gYXJpdGhtZXRpY3Mgb24gaXQgKi8KKyNkZWZpbmUgUF9QUklNQVJZCTAJLyogVkFSLCBMSVQsICgpLCB+ICEgLSArICovCisjZGVmaW5lIFBfTVVMVAkJMQkvKiAqIC8gJSAqLworI2RlZmluZSBQX0FERAkJMgkvKiArIC0gKi8KKyNkZWZpbmUgUF9TSElGVAkJMwkvKiA8PCA+PiAqLworI2RlZmluZSBQX1JFTEFUSU9OCTQJLyogPCA8PSA+ID49ICovCisjZGVmaW5lIFBfRVFVQUxJVFkJNQkvKiA9PSAhPSAqLworI2RlZmluZSBQX0JBTkQJCTYJLyogJiAqLworI2RlZmluZSBQX0JYT1IJCTcJLyogXiAqLworI2RlZmluZSBQX0JPUgkJOAkvKiB8ICovCisjZGVmaW5lIFBfTEFORAkJOQkvKiAmJiAqLworI2RlZmluZSBQX0xPUgkJMTAJLyogfHwgKi8KKyNkZWZpbmUgUF9URVJOCQkxMQkvKiA/OiAqLworI2RlZmluZSBQX0FTU0lHTgkxMgkvKiA9ICo9IC89ICU9ICs9IC09IDw8PSA+Pj0gJj0gXj0gfD0gKi8KKyNkZWZpbmUgUF9DT01NQQkJMTMJLyogLCAqLworI2RlZmluZSBNQVhfUFJFQwlQX0NPTU1BCisKK3N0cnVjdCBvcGluZm8geworCWNoYXIJCW5hbWVbNF07CisJaW50CQlsZW47CS8qIG5hbWUgbGVuZ3RoICovCisJaW50CQlwcmVjOwkvKiBwcmVjZWRlbmNlOiBsb3dlciBpcyBoaWdoZXIgKi8KK307CisKKy8qIFRva2VucyBpbiB0aGlzIHRhYmxlIG11c3QgYmUgb3JkZXJlZCBzbyB0aGUgbG9uZ2VzdCBhcmUgZmlyc3QKKyAqIChlZywgKz0gYmVmb3JlICspLiBJZiB5b3UgY2hhbmdlIHNvbWV0aGluZywgY2hhbmdlIHRoZSBvcmRlcgorICogb2YgZW51bSB0b2tlbiB0b28uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3BpbmZvIG9waW5mb1tdID0geworCXsgIisrIiwJIDIsIFBfUFJJTUFSWSB9LAkvKiBiZWZvcmUgKyAqLworCXsgIi0tIiwJIDIsIFBfUFJJTUFSWSB9LAkvKiBiZWZvcmUgLSAqLworCXsgIj09IiwJIDIsIFBfRVFVQUxJVFkgfSwJLyogYmVmb3JlID0gKi8KKwl7ICIhPSIsCSAyLCBQX0VRVUFMSVRZIH0sCS8qIGJlZm9yZSAhICovCisJeyAiPSIsCSAxLCBQX0FTU0lHTiB9LAkJLyoga2VlcCBhc3NpZ25zIGluIGEgYmxvY2sgKi8KKwl7ICIqPSIsCSAyLCBQX0FTU0lHTiB9LAorCXsgIi89IiwJIDIsIFBfQVNTSUdOIH0sCisJeyAiJT0iLAkgMiwgUF9BU1NJR04gfSwKKwl7ICIrPSIsCSAyLCBQX0FTU0lHTiB9LAorCXsgIi09IiwJIDIsIFBfQVNTSUdOIH0sCisJeyAiPDw9IiwgMywgUF9BU1NJR04gfSwKKwl7ICI+Pj0iLCAzLCBQX0FTU0lHTiB9LAorCXsgIiY9IiwJIDIsIFBfQVNTSUdOIH0sCisJeyAiXj0iLAkgMiwgUF9BU1NJR04gfSwKKwl7ICJ8PSIsCSAyLCBQX0FTU0lHTiB9LAorCXsgIjw8IiwJIDIsIFBfU0hJRlQgfSwKKwl7ICI+PiIsCSAyLCBQX1NISUZUIH0sCisJeyAiPD0iLAkgMiwgUF9SRUxBVElPTiB9LAorCXsgIj49IiwJIDIsIFBfUkVMQVRJT04gfSwKKwl7ICI8IiwJIDEsIFBfUkVMQVRJT04gfSwKKwl7ICI+IiwJIDEsIFBfUkVMQVRJT04gfSwKKwl7ICImJiIsCSAyLCBQX0xBTkQgfSwKKwl7ICJ8fCIsCSAyLCBQX0xPUiB9LAorCXsgIioiLAkgMSwgUF9NVUxUIH0sCisJeyAiLyIsCSAxLCBQX01VTFQgfSwKKwl7ICIlIiwJIDEsIFBfTVVMVCB9LAorCXsgIisiLAkgMSwgUF9BREQgfSwKKwl7ICItIiwJIDEsIFBfQUREIH0sCisJeyAiJiIsCSAxLCBQX0JBTkQgfSwKKwl7ICJeIiwJIDEsIFBfQlhPUiB9LAorCXsgInwiLAkgMSwgUF9CT1IgfSwKKwl7ICI/IiwJIDEsIFBfVEVSTiB9LAorCXsgIiwiLAkgMSwgUF9DT01NQSB9LAorCXsgIn4iLAkgMSwgUF9QUklNQVJZIH0sCisJeyAiISIsCSAxLCBQX1BSSU1BUlkgfSwKKwl7ICIoIiwJIDEsIFBfUFJJTUFSWSB9LAorCXsgIikiLAkgMSwgUF9QUklNQVJZIH0sCisJeyAiOiIsCSAxLCBQX1BSSU1BUlkgfSwKKwl7ICIiLAkgMCwgUF9QUklNQVJZIH0KK307CisKK3R5cGVkZWYgc3RydWN0IGV4cHJfc3RhdGUgRXhwcl9zdGF0ZTsKK3N0cnVjdCBleHByX3N0YXRlIHsKKwljb25zdCBjaGFyICpleHByZXNzaW9uOwkJLyogZXhwcmVzc2lvbiBiZWluZyBldmFsdWF0ZWQgKi8KKwljb25zdCBjaGFyICp0b2twOwkJLyogbGV4aWNhbCBwb3NpdGlvbiAqLworCXN0cnVjdCB0YmwgKnZhbDsJCS8qIHZhbHVlIGZyb20gdG9rZW4oKSAqLworCXN0cnVjdCB0YmwgKmV2YWxpbmc7CQkvKiB2YXJpYWJsZSB0aGF0IGlzIGJlaW5nIHJlY3Vyc2l2ZWx5CisJCQkJCSAqIGV4cGFuZGVkIChFWFBSSU5FVkFMIGZsYWcgc2V0KSAqLworCWludCBub2Fzc2lnbjsJCQkvKiBkb24ndCBkbyBhc3NpZ25zIChmb3IgPzosJiYsfHwpICovCisJZW51bSB0b2tlbiB0b2s7CQkJLyogdG9rZW4gZnJvbSB0b2tlbigpICovCisJYm9vbCBhcml0aDsJCQkvKiBldmFsdWF0aW5nIGFuICQoKCkpIGV4cHJlc3Npb24/ICovCisJYm9vbCBuYXR1cmFsOwkJCS8qIHVuc2lnbmVkIGFyaXRobWV0aWMgY2FsY3VsYXRpb24gKi8KK307CisKKyNkZWZpbmUgYml2dWkoeCwgb3AsIHkpCShlcy0+bmF0dXJhbCA/CQkJXAorCShta3NoX2FyaV90KSgoeCktPnZhbC51IG9wICh5KS0+dmFsLnUpIDoJXAorCShta3NoX2FyaV90KSgoeCktPnZhbC5pIG9wICh5KS0+dmFsLmkpCQlcCispCisjZGVmaW5lIGNodnVpKHgsIG9wKQlkbyB7CQkJXAorCWlmIChlcy0+bmF0dXJhbCkJCQlcCisJCSh4KS0+dmFsLnUgPSBvcCAoeCktPnZhbC51OwlcCisJZWxzZQkJCQkJXAorCQkoeCktPnZhbC5pID0gb3AgKHgpLT52YWwuaTsJXAorfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisjZGVmaW5lIHN0dnVpKHgsIG4pCWRvIHsJCQlcCisJaWYgKGVzLT5uYXR1cmFsKQkJCVwKKwkJKHgpLT52YWwudSA9IChuKTsJCVwKKwllbHNlCQkJCQlcCisJCSh4KS0+dmFsLmkgPSAobik7CQlcCit9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKworZW51bSBlcnJvcl90eXBlIHsKKwlFVF9VTkVYUEVDVEVELCBFVF9CQURMSVQsIEVUX1JFQ1VSU0lWRSwKKwlFVF9MVkFMVUUsIEVUX1JET05MWSwgRVRfU1RSCit9OworCitzdGF0aWMgdm9pZCBldmFsZXJyKEV4cHJfc3RhdGUgKiwgZW51bSBlcnJvcl90eXBlLCBjb25zdCBjaGFyICopCisgICAgTUtTSF9BX05PUkVUVVJOOworc3RhdGljIHN0cnVjdCB0YmwgKmV2YWxleHByKEV4cHJfc3RhdGUgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGV4cHJ0b2tlbihFeHByX3N0YXRlICopOworc3RhdGljIHN0cnVjdCB0YmwgKmRvX3BwbW0oRXhwcl9zdGF0ZSAqLCBlbnVtIHRva2VuLCBzdHJ1Y3QgdGJsICosIGJvb2wpOworc3RhdGljIHZvaWQgYXNzaWduX2NoZWNrKEV4cHJfc3RhdGUgKiwgZW51bSB0b2tlbiwgc3RydWN0IHRibCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdGJsICp0ZW1wdmFyKHZvaWQpOworc3RhdGljIHN0cnVjdCB0YmwgKmludHZhcihFeHByX3N0YXRlICosIHN0cnVjdCB0YmwgKik7CisKKy8qCisgKiBwYXJzZSBhbmQgZXZhbHVhdGUgZXhwcmVzc2lvbgorICovCitpbnQKK2V2YWx1YXRlKGNvbnN0IGNoYXIgKmV4cHIsIG1rc2hfYXJpX3QgKnJ2YWwsIGludCBlcnJvcl9vaywgYm9vbCBhcml0aCkKK3sKKwlzdHJ1Y3QgdGJsIHY7CisJaW50IHJldDsKKworCXYuZmxhZyA9IERFRklORUR8SU5URUdFUjsKKwl2LnR5cGUgPSAwOworCXJldCA9IHZfZXZhbHVhdGUoJnYsIGV4cHIsIGVycm9yX29rLCBhcml0aCk7CisJKnJ2YWwgPSB2LnZhbC5pOworCXJldHVybiAocmV0KTsKK30KKworLyoKKyAqIHBhcnNlIGFuZCBldmFsdWF0ZSBleHByZXNzaW9uLCBzdG9yaW5nIHJlc3VsdCBpbiB2cC4KKyAqLworaW50Cit2X2V2YWx1YXRlKHN0cnVjdCB0YmwgKnZwLCBjb25zdCBjaGFyICpleHByLCB2b2xhdGlsZSBpbnQgZXJyb3Jfb2ssCisgICAgYm9vbCBhcml0aCkKK3sKKwlzdHJ1Y3QgdGJsICp2OworCUV4cHJfc3RhdGUgY3Vyc3RhdGU7CisJRXhwcl9zdGF0ZSAqIGNvbnN0IGVzID0gJmN1cnN0YXRlOworCWludCBpOworCisJLyogc2F2ZSBzdGF0ZSB0byBhbGxvdyByZWN1cnNpdmUgY2FsbHMgKi8KKwljdXJzdGF0ZS5leHByZXNzaW9uID0gY3Vyc3RhdGUudG9rcCA9IGV4cHI7CisJY3Vyc3RhdGUubm9hc3NpZ24gPSAwOworCWN1cnN0YXRlLmFyaXRoID0gYXJpdGg7CisJY3Vyc3RhdGUuZXZhbGluZyA9IE5VTEw7CisJY3Vyc3RhdGUubmF0dXJhbCA9IGZhbHNlOworCisJbmV3ZW52KEVfRVJSSCk7CisJaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKKwlpZiAoaSkgeworCQkvKiBDbGVhciBFWFBSSU5FVkFMIGluIG9mIGFueSB2YXJpYWJsZXMgd2Ugd2VyZSBwbGF5aW5nIHdpdGggKi8KKwkJaWYgKGN1cnN0YXRlLmV2YWxpbmcpCisJCQljdXJzdGF0ZS5ldmFsaW5nLT5mbGFnICY9IH5FWFBSSU5FVkFMOworCQlxdWl0ZW52KE5VTEwpOworCQlpZiAoaSA9PSBMQUVYUFIpIHsKKwkJCWlmIChlcnJvcl9vayA9PSBLU0hfUkVUVVJOX0VSUk9SKQorCQkJCXJldHVybiAoMCk7CisJCQllcnJvcmZ6KCk7CisJCX0KKwkJdW53aW5kKGkpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCisJZXhwcnRva2VuKGVzKTsKKwlpZiAoZXMtPnRvayA9PSBFTkQpIHsKKwkJZXMtPnRvayA9IExJVDsKKwkJZXMtPnZhbCA9IHRlbXB2YXIoKTsKKwl9CisJdiA9IGludHZhcihlcywgZXZhbGV4cHIoZXMsIE1BWF9QUkVDKSk7CisKKwlpZiAoZXMtPnRvayAhPSBFTkQpCisJCWV2YWxlcnIoZXMsIEVUX1VORVhQRUNURUQsIE5VTEwpOworCisJaWYgKGVzLT5hcml0aCAmJiBlcy0+bmF0dXJhbCkKKwkJdnAtPmZsYWcgfD0gSU5UX1U7CisJaWYgKHZwLT5mbGFnICYgSU5URUdFUikKKwkJc2V0aW50X3YodnAsIHYsIGVzLT5hcml0aCk7CisJZWxzZQorCQkvKiBjYW4gZmFpbCBpZiByZWFkb25seSAqLworCQlzZXRzdHIodnAsIHN0cl92YWwodiksIGVycm9yX29rKTsKKworCXF1aXRlbnYoTlVMTCk7CisKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdm9pZAorZXZhbGVycihFeHByX3N0YXRlICplcywgZW51bSBlcnJvcl90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFyIHRidWZbMl07CisJY29uc3QgY2hhciAqczsKKworCWVzLT5hcml0aCA9IGZhbHNlOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRVRfVU5FWFBFQ1RFRDoKKwkJc3dpdGNoIChlcy0+dG9rKSB7CisJCWNhc2UgVkFSOgorCQkJcyA9IGVzLT52YWwtPm5hbWU7CisJCQlicmVhazsKKwkJY2FzZSBMSVQ6CisJCQlzID0gc3RyX3ZhbChlcy0+dmFsKTsKKwkJCWJyZWFrOworCQljYXNlIEVORDoKKwkJCXMgPSAiZW5kIG9mIGV4cHJlc3Npb24iOworCQkJYnJlYWs7CisJCWNhc2UgQkFEOgorCQkJdGJ1ZlswXSA9ICplcy0+dG9rcDsKKwkJCXRidWZbMV0gPSAnXDAnOworCQkJcyA9IHRidWY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXMgPSBvcGluZm9bKGludCllcy0+dG9rXS5uYW1lOworCQl9CisJCXdhcm5pbmdmKHRydWUsICIlczogdW5leHBlY3RlZCAnJXMnIiwgZXMtPmV4cHJlc3Npb24sIHMpOworCQlicmVhazsKKworCWNhc2UgRVRfQkFETElUOgorCQl3YXJuaW5nZih0cnVlLCAiJXM6IGJhZCBudW1iZXIgJyVzJyIsIGVzLT5leHByZXNzaW9uLCBzdHIpOworCQlicmVhazsKKworCWNhc2UgRVRfUkVDVVJTSVZFOgorCQl3YXJuaW5nZih0cnVlLCAiJXM6IGV4cHJlc3Npb24gcmVjdXJzZXMgb24gcGFyYW1ldGVyICclcyciLAorCQkgICAgZXMtPmV4cHJlc3Npb24sIHN0cik7CisJCWJyZWFrOworCisJY2FzZSBFVF9MVkFMVUU6CisJCXdhcm5pbmdmKHRydWUsICIlczogJXMgcmVxdWlyZXMgbHZhbHVlIiwKKwkJICAgIGVzLT5leHByZXNzaW9uLCBzdHIpOworCQlicmVhazsKKworCWNhc2UgRVRfUkRPTkxZOgorCQl3YXJuaW5nZih0cnVlLCAiJXM6ICVzIGFwcGxpZWQgdG8gcmVhZCBvbmx5IHZhcmlhYmxlIiwKKwkJICAgIGVzLT5leHByZXNzaW9uLCBzdHIpOworCQlicmVhazsKKworCWRlZmF1bHQ6IC8qIGtlZXAgZ2NjIGhhcHB5ICovCisJY2FzZSBFVF9TVFI6CisJCXdhcm5pbmdmKHRydWUsICIlczogJXMiLCBlcy0+ZXhwcmVzc2lvbiwgc3RyKTsKKwkJYnJlYWs7CisJfQorCXVud2luZChMQUVYUFIpOworfQorCitzdGF0aWMgc3RydWN0IHRibCAqCitldmFsZXhwcihFeHByX3N0YXRlICplcywgaW50IHByZWMpCit7CisJc3RydWN0IHRibCAqdmwsICp2ciA9IE5VTEwsICp2YXNuOworCWVudW0gdG9rZW4gb3A7CisJbWtzaF9hcmlfdCByZXMgPSAwOworCisJaWYgKHByZWMgPT0gUF9QUklNQVJZKSB7CisJCW9wID0gZXMtPnRvazsKKwkJaWYgKG9wID09IE9fQk5PVCB8fCBvcCA9PSBPX0xOT1QgfHwgb3AgPT0gT19NSU5VUyB8fAorCQkgICAgb3AgPT0gT19QTFVTKSB7CisJCQlleHBydG9rZW4oZXMpOworCQkJdmwgPSBpbnR2YXIoZXMsIGV2YWxleHByKGVzLCBQX1BSSU1BUlkpKTsKKwkJCWlmIChvcCA9PSBPX0JOT1QpCisJCQkJY2h2dWkodmwsIH4pOworCQkJZWxzZSBpZiAob3AgPT0gT19MTk9UKQorCQkJCWNodnVpKHZsLCAhKTsKKwkJCWVsc2UgaWYgKG9wID09IE9fTUlOVVMpCisJCQkJY2h2dWkodmwsIC0pOworCQkJLyogb3AgPT0gT19QTFVTIGlzIGEgbm8tb3AgKi8KKwkJfSBlbHNlIGlmIChvcCA9PSBPUEVOX1BBUkVOKSB7CisJCQlleHBydG9rZW4oZXMpOworCQkJdmwgPSBldmFsZXhwcihlcywgTUFYX1BSRUMpOworCQkJaWYgKGVzLT50b2sgIT0gQ0xPU0VfUEFSRU4pCisJCQkJZXZhbGVycihlcywgRVRfU1RSLCAibWlzc2luZyApIik7CisJCQlleHBydG9rZW4oZXMpOworCQl9IGVsc2UgaWYgKG9wID09IE9fUExVU1BMVVMgfHwgb3AgPT0gT19NSU5VU01JTlVTKSB7CisJCQlleHBydG9rZW4oZXMpOworCQkJdmwgPSBkb19wcG1tKGVzLCBvcCwgZXMtPnZhbCwgdHJ1ZSk7CisJCQlleHBydG9rZW4oZXMpOworCQl9IGVsc2UgaWYgKG9wID09IFZBUiB8fCBvcCA9PSBMSVQpIHsKKwkJCXZsID0gZXMtPnZhbDsKKwkJCWV4cHJ0b2tlbihlcyk7CisJCX0gZWxzZSB7CisJCQlldmFsZXJyKGVzLCBFVF9VTkVYUEVDVEVELCBOVUxMKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQlpZiAoZXMtPnRvayA9PSBPX1BMVVNQTFVTIHx8IGVzLT50b2sgPT0gT19NSU5VU01JTlVTKSB7CisJCQl2bCA9IGRvX3BwbW0oZXMsIGVzLT50b2ssIHZsLCBmYWxzZSk7CisJCQlleHBydG9rZW4oZXMpOworCQl9CisJCXJldHVybiAodmwpOworCX0KKwl2bCA9IGV2YWxleHByKGVzLCBwcmVjIC0gMSk7CisJZm9yIChvcCA9IGVzLT50b2s7IElTX0JJTk9QKG9wKSAmJiBvcGluZm9bKGludClvcF0ucHJlYyA9PSBwcmVjOworCSAgICBvcCA9IGVzLT50b2spIHsKKwkJZXhwcnRva2VuKGVzKTsKKwkJdmFzbiA9IHZsOworCQlpZiAob3AgIT0gT19BU04pIC8qIHZsIG1heSBub3QgaGF2ZSBhIHZhbHVlIHlldCAqLworCQkJdmwgPSBpbnR2YXIoZXMsIHZsKTsKKwkJaWYgKElTX0FTU0lHTk9QKG9wKSkgeworCQkJYXNzaWduX2NoZWNrKGVzLCBvcCwgdmFzbik7CisJCQl2ciA9IGludHZhcihlcywgZXZhbGV4cHIoZXMsIFBfQVNTSUdOKSk7CisJCX0gZWxzZSBpZiAob3AgIT0gT19URVJOICYmIG9wICE9IE9fTEFORCAmJiBvcCAhPSBPX0xPUikKKwkJCXZyID0gaW50dmFyKGVzLCBldmFsZXhwcihlcywgcHJlYyAtIDEpKTsKKwkJaWYgKChvcCA9PSBPX0RJViB8fCBvcCA9PSBPX01PRCB8fCBvcCA9PSBPX0RJVkFTTiB8fAorCQkgICAgb3AgPT0gT19NT0RBU04pICYmIHZyLT52YWwuaSA9PSAwKSB7CisJCQlpZiAoZXMtPm5vYXNzaWduKQorCQkJCXZyLT52YWwuaSA9IDE7CisJCQllbHNlCisJCQkJZXZhbGVycihlcywgRVRfU1RSLCAiemVybyBkaXZpc29yIik7CisJCX0KKwkJc3dpdGNoICgoaW50KW9wKSB7CisJCWNhc2UgT19USU1FUzoKKwkJY2FzZSBPX1RJTUVTQVNOOgorCQkJcmVzID0gYml2dWkodmwsICosIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fRElWOgorCQljYXNlIE9fRElWQVNOOgorCQkJcmVzID0gYml2dWkodmwsIC8sIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fTU9EOgorCQljYXNlIE9fTU9EQVNOOgorCQkJcmVzID0gYml2dWkodmwsICUsIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fUExVUzoKKwkJY2FzZSBPX1BMVVNBU046CisJCQlyZXMgPSBiaXZ1aSh2bCwgKywgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19NSU5VUzoKKwkJY2FzZSBPX01JTlVTQVNOOgorCQkJcmVzID0gYml2dWkodmwsIC0sIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fTFNISUZUOgorCQljYXNlIE9fTFNISUZUQVNOOgorCQkJcmVzID0gYml2dWkodmwsIDw8LCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX1JTSElGVDoKKwkJY2FzZSBPX1JTSElGVEFTTjoKKwkJCXJlcyA9IGJpdnVpKHZsLCA+PiwgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19MVDoKKwkJCXJlcyA9IGJpdnVpKHZsLCA8LCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX0xFOgorCQkJcmVzID0gYml2dWkodmwsIDw9LCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX0dUOgorCQkJcmVzID0gYml2dWkodmwsID4sIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fR0U6CisJCQlyZXMgPSBiaXZ1aSh2bCwgPj0sIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fRVE6CisJCQlyZXMgPSBiaXZ1aSh2bCwgPT0sIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fTkU6CisJCQlyZXMgPSBiaXZ1aSh2bCwgIT0sIHZyKTsKKwkJCWJyZWFrOworCQljYXNlIE9fQkFORDoKKwkJY2FzZSBPX0JBTkRBU046CisJCQlyZXMgPSBiaXZ1aSh2bCwgJiwgdnIpOworCQkJYnJlYWs7CisJCWNhc2UgT19CWE9SOgorCQljYXNlIE9fQlhPUkFTTjoKKwkJCXJlcyA9IGJpdnVpKHZsLCBeLCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX0JPUjoKKwkJY2FzZSBPX0JPUkFTTjoKKwkJCXJlcyA9IGJpdnVpKHZsLCB8LCB2cik7CisJCQlicmVhazsKKwkJY2FzZSBPX0xBTkQ6CisJCQlpZiAoIXZsLT52YWwuaSkKKwkJCQllcy0+bm9hc3NpZ24rKzsKKwkJCXZyID0gaW50dmFyKGVzLCBldmFsZXhwcihlcywgcHJlYyAtIDEpKTsKKwkJCXJlcyA9IGJpdnVpKHZsLCAmJiwgdnIpOworCQkJaWYgKCF2bC0+dmFsLmkpCisJCQkJZXMtPm5vYXNzaWduLS07CisJCQlicmVhazsKKwkJY2FzZSBPX0xPUjoKKwkJCWlmICh2bC0+dmFsLmkpCisJCQkJZXMtPm5vYXNzaWduKys7CisJCQl2ciA9IGludHZhcihlcywgZXZhbGV4cHIoZXMsIHByZWMgLSAxKSk7CisJCQlyZXMgPSBiaXZ1aSh2bCwgfHwsIHZyKTsKKwkJCWlmICh2bC0+dmFsLmkpCisJCQkJZXMtPm5vYXNzaWduLS07CisJCQlicmVhazsKKwkJY2FzZSBPX1RFUk46CisJCQl7CisJCQkJYm9vbCBldiA9IHZsLT52YWwuaSAhPSAwOworCisJCQkJaWYgKCFldikKKwkJCQkJZXMtPm5vYXNzaWduKys7CisJCQkJdmwgPSBldmFsZXhwcihlcywgTUFYX1BSRUMpOworCQkJCWlmICghZXYpCisJCQkJCWVzLT5ub2Fzc2lnbi0tOworCQkJCWlmIChlcy0+dG9rICE9IENURVJOKQorCQkJCQlldmFsZXJyKGVzLCBFVF9TVFIsICJtaXNzaW5nIDoiKTsKKwkJCQlleHBydG9rZW4oZXMpOworCQkJCWlmIChldikKKwkJCQkJZXMtPm5vYXNzaWduKys7CisJCQkJdnIgPSBldmFsZXhwcihlcywgUF9URVJOKTsKKwkJCQlpZiAoZXYpCisJCQkJCWVzLT5ub2Fzc2lnbi0tOworCQkJCXZsID0gZXYgPyB2bCA6IHZyOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT19BU046CisJCQlyZXMgPSB2ci0+dmFsLmk7CisJCQlicmVhazsKKwkJY2FzZSBPX0NPTU1BOgorCQkJcmVzID0gdnItPnZhbC5pOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKElTX0FTU0lHTk9QKG9wKSkgeworCQkJc3R2dWkodnIsIHJlcyk7CisJCQlpZiAoIWVzLT5ub2Fzc2lnbikgeworCQkJCWlmICh2YXNuLT5mbGFnICYgSU5URUdFUikKKwkJCQkJc2V0aW50X3YodmFzbiwgdnIsIGVzLT5hcml0aCk7CisJCQkJZWxzZQorCQkJCQlzZXRpbnQodmFzbiwgcmVzKTsKKwkJCX0KKwkJCXZsID0gdnI7CisJCX0gZWxzZSBpZiAob3AgIT0gT19URVJOKQorCQkJc3R2dWkodmwsIHJlcyk7CisJfQorCXJldHVybiAodmwpOworfQorCitzdGF0aWMgdm9pZAorZXhwcnRva2VuKEV4cHJfc3RhdGUgKmVzKQoreworCWNvbnN0IGNoYXIgKmNwID0gZXMtPnRva3A7CisJaW50IGM7CisJY2hhciAqdHZhcjsKKworCS8qIHNraXAgd2hpdGUgc3BhY2UgKi8KKyBza2lwX3NwYWNlczoKKwl3aGlsZSAoKGMgPSAqY3ApLCBrc2hfaXNzcGFjZShjKSkKKwkJKytjcDsKKwlpZiAoZXMtPnRva3AgPT0gZXMtPmV4cHJlc3Npb24gJiYgYyA9PSAnIycpIHsKKwkJLyogZXhwcmVzc2lvbiBiZWdpbnMgd2l0aCAjICovCisJCWVzLT5uYXR1cmFsID0gdHJ1ZTsJLyogc3dpdGNoIHRvIHVuc2lnbmVkICovCisJCSsrY3A7CisJCWdvdG8gc2tpcF9zcGFjZXM7CisJfQorCWVzLT50b2twID0gY3A7CisKKwlpZiAoYyA9PSAnXDAnKQorCQllcy0+dG9rID0gRU5EOworCWVsc2UgaWYgKGtzaF9pc2FscGh4KGMpKSB7CisJCWZvciAoOyBrc2hfaXNhbG51eChjKTsgYyA9ICpjcCkKKwkJCWNwKys7CisJCWlmIChjID09ICdbJykgeworCQkJaW50IGxlbjsKKworCQkJbGVuID0gYXJyYXlfcmVmX2xlbihjcCk7CisJCQlpZiAobGVuID09IDApCisJCQkJZXZhbGVycihlcywgRVRfU1RSLCAibWlzc2luZyBdIik7CisJCQljcCArPSBsZW47CisJCX0gZWxzZSBpZiAoYyA9PSAnKCcgLyopKi8gKSB7CisJCQkvKiB0b2RvOiBhZGQgbWF0aCBmdW5jdGlvbnMgKGFsbCB0YWtlIHNpbmdsZSBhcmd1bWVudCk6CisJCQkgKiBhYnMgYWNvcyBhc2luIGF0YW4gY29zIGNvc2ggZXhwIGludCBsb2cgc2luIHNpbmggc3FydAorCQkJICogdGFuIHRhbmgKKwkJCSAqLworCQkJOworCQl9CisJCWlmIChlcy0+bm9hc3NpZ24pIHsKKwkJCWVzLT52YWwgPSB0ZW1wdmFyKCk7CisJCQllcy0+dmFsLT5mbGFnIHw9IEVYUFJMVkFMVUU7CisJCX0gZWxzZSB7CisJCQlzdHJuZHVweCh0dmFyLCBlcy0+dG9rcCwgY3AgLSBlcy0+dG9rcCwgQVRFTVApOworCQkJZXMtPnZhbCA9IGdsb2JhbCh0dmFyKTsKKwkJCWFmcmVlKHR2YXIsIEFURU1QKTsKKwkJfQorCQllcy0+dG9rID0gVkFSOworCX0gZWxzZSBpZiAoYyA9PSAnMScgJiYgY3BbMV0gPT0gJyMnKSB7CisJCWNwICs9IDI7CisJCWNwICs9IHV0Zl9wdHJhZGooY3ApOworCQlzdHJuZHVweCh0dmFyLCBlcy0+dG9rcCwgY3AgLSBlcy0+dG9rcCwgQVRFTVApOworCQlnb3RvIHByb2Nlc3NfdHZhcjsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCX0gZWxzZSBpZiAoYyA9PSAnXCcnKSB7CisJCSsrY3A7CisJCWNwICs9IHV0Zl9wdHJhZGooY3ApOworCQlpZiAoKmNwKysgIT0gJ1wnJykKKwkJCWV2YWxlcnIoZXMsIEVUX1NUUiwKKwkJCSAgICAibXVsdGktY2hhcmFjdGVyIGNoYXJhY3RlciBjb25zdGFudCIpOworCQkvKiAneCcgLT4gMSN4ICh4ID0gb25lIG11bHRpYnl0ZSBjaGFyYWN0ZXIpICovCisJCWMgPSBjcCAtIGVzLT50b2twOworCQl0dmFyID0gYWxsb2MoYyArIC8qIE5VTCAqLyAxLCBBVEVNUCk7CisJCXR2YXJbMF0gPSAnMSc7CisJCXR2YXJbMV0gPSAnIyc7CisJCW1lbWNweSh0dmFyICsgMiwgZXMtPnRva3AgKyAxLCBjIC0gMik7CisJCXR2YXJbY10gPSAnXDAnOworCQlnb3RvIHByb2Nlc3NfdHZhcjsKKyNlbmRpZgorCX0gZWxzZSBpZiAoa3NoX2lzZGlnaXQoYykpIHsKKwkJd2hpbGUgKGMgIT0gJ18nICYmIChrc2hfaXNhbG51eChjKSB8fCBjID09ICcjJykpCisJCQljID0gKmNwKys7CisJCXN0cm5kdXB4KHR2YXIsIGVzLT50b2twLCAtLWNwIC0gZXMtPnRva3AsIEFURU1QKTsKKyBwcm9jZXNzX3R2YXI6CisJCWVzLT52YWwgPSB0ZW1wdmFyKCk7CisJCWVzLT52YWwtPmZsYWcgJj0gfklOVEVHRVI7CisJCWVzLT52YWwtPnR5cGUgPSAwOworCQllcy0+dmFsLT52YWwucyA9IHR2YXI7CisJCWlmIChzZXRpbnRfdihlcy0+dmFsLCBlcy0+dmFsLCBlcy0+YXJpdGgpID09IE5VTEwpCisJCQlldmFsZXJyKGVzLCBFVF9CQURMSVQsIHR2YXIpOworCQlhZnJlZSh0dmFyLCBBVEVNUCk7CisJCWVzLT50b2sgPSBMSVQ7CisJfSBlbHNlIHsKKwkJaW50IGksIG4wOworCisJCWZvciAoaSA9IDA7IChuMCA9IG9waW5mb1tpXS5uYW1lWzBdKTsgaSsrKQorCQkJaWYgKGMgPT0gbjAgJiYgc3RybmNtcChjcCwgb3BpbmZvW2ldLm5hbWUsCisJCQkgICAgKHNpemVfdClvcGluZm9baV0ubGVuKSA9PSAwKSB7CisJCQkJZXMtPnRvayA9IChlbnVtIHRva2VuKWk7CisJCQkJY3AgKz0gb3BpbmZvW2ldLmxlbjsKKwkJCQlicmVhazsKKwkJCX0KKwkJaWYgKCFuMCkKKwkJCWVzLT50b2sgPSBCQUQ7CisJfQorCWVzLT50b2twID0gY3A7Cit9CisKKy8qIERvIGEgKysgb3IgLS0gb3BlcmF0aW9uICovCitzdGF0aWMgc3RydWN0IHRibCAqCitkb19wcG1tKEV4cHJfc3RhdGUgKmVzLCBlbnVtIHRva2VuIG9wLCBzdHJ1Y3QgdGJsICp2YXNuLCBib29sIGlzX3ByZWZpeCkKK3sKKwlzdHJ1Y3QgdGJsICp2bDsKKwlta3NoX2FyaV90IG92YWw7CisKKwlhc3NpZ25fY2hlY2soZXMsIG9wLCB2YXNuKTsKKworCXZsID0gaW50dmFyKGVzLCB2YXNuKTsKKwlvdmFsID0gdmwtPnZhbC5pOworCWlmIChvcCA9PSBPX1BMVVNQTFVTKSB7CisJCWlmIChlcy0+bmF0dXJhbCkKKwkJCSsrdmwtPnZhbC51OworCQllbHNlCisJCQkrK3ZsLT52YWwuaTsKKwl9IGVsc2UgeworCQlpZiAoZXMtPm5hdHVyYWwpCisJCQktLXZsLT52YWwudTsKKwkJZWxzZQorCQkJLS12bC0+dmFsLmk7CisJfQorCWlmICh2YXNuLT5mbGFnICYgSU5URUdFUikKKwkJc2V0aW50X3YodmFzbiwgdmwsIGVzLT5hcml0aCk7CisJZWxzZQorCQlzZXRpbnQodmFzbiwgdmwtPnZhbC5pKTsKKwlpZiAoIWlzX3ByZWZpeCkJCS8qIHVuZG8gdGhlIGluYy9kZWMgKi8KKwkJdmwtPnZhbC5pID0gb3ZhbDsKKworCXJldHVybiAodmwpOworfQorCitzdGF0aWMgdm9pZAorYXNzaWduX2NoZWNrKEV4cHJfc3RhdGUgKmVzLCBlbnVtIHRva2VuIG9wLCBzdHJ1Y3QgdGJsICp2YXNuKQoreworCWlmIChlcy0+dG9rID09IEVORCB8fAorCSAgICAodmFzbi0+bmFtZVswXSA9PSAnXDAnICYmICEodmFzbi0+ZmxhZyAmIEVYUFJMVkFMVUUpKSkKKwkJZXZhbGVycihlcywgRVRfTFZBTFVFLCBvcGluZm9bKGludClvcF0ubmFtZSk7CisJZWxzZSBpZiAodmFzbi0+ZmxhZyAmIFJET05MWSkKKwkJZXZhbGVycihlcywgRVRfUkRPTkxZLCBvcGluZm9bKGludClvcF0ubmFtZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGJsICoKK3RlbXB2YXIodm9pZCkKK3sKKwlzdHJ1Y3QgdGJsICp2cDsKKworCXZwID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCB0YmwpLCBBVEVNUCk7CisJdnAtPmZsYWcgPSBJU1NFVHxJTlRFR0VSOworCXZwLT50eXBlID0gMDsKKwl2cC0+YXJlYXAgPSBBVEVNUDsKKwl2cC0+dWEuaHZhbCA9IDA7CisJdnAtPnZhbC5pID0gMDsKKwl2cC0+bmFtZVswXSA9ICdcMCc7CisJcmV0dXJuICh2cCk7Cit9CisKKy8qIGNhc3QgKHN0cmluZykgdmFyaWFibGUgdG8gdGVtcG9yYXJ5IGludGVnZXIgdmFyaWFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgdGJsICoKK2ludHZhcihFeHByX3N0YXRlICplcywgc3RydWN0IHRibCAqdnApCit7CisJc3RydWN0IHRibCAqdnE7CisKKwkvKiB0cnkgdG8gYXZvaWQgcmVwbGFjaW5nIGEgdGVtcCB2YXIgd2l0aCBhbm90aGVyIHRlbXAgdmFyICovCisJaWYgKHZwLT5uYW1lWzBdID09ICdcMCcgJiYKKwkgICAgKHZwLT5mbGFnICYgKElTU0VUfElOVEVHRVJ8RVhQUkxWQUxVRSkpID09IChJU1NFVHxJTlRFR0VSKSkKKwkJcmV0dXJuICh2cCk7CisKKwl2cSA9IHRlbXB2YXIoKTsKKwlpZiAoc2V0aW50X3YodnEsIHZwLCBlcy0+YXJpdGgpID09IE5VTEwpIHsKKwkJaWYgKHZwLT5mbGFnICYgRVhQUklORVZBTCkKKwkJCWV2YWxlcnIoZXMsIEVUX1JFQ1VSU0lWRSwgdnAtPm5hbWUpOworCQllcy0+ZXZhbGluZyA9IHZwOworCQl2cC0+ZmxhZyB8PSBFWFBSSU5FVkFMOworCQl2X2V2YWx1YXRlKHZxLCBzdHJfdmFsKHZwKSwgS1NIX1VOV0lORF9FUlJPUiwgZXMtPmFyaXRoKTsKKwkJdnAtPmZsYWcgJj0gfkVYUFJJTkVWQUw7CisJCWVzLT5ldmFsaW5nID0gTlVMTDsKKwl9CisJcmV0dXJuICh2cSk7Cit9CisKKworLyoKKyAqIFVURi04IHN1cHBvcnQgY29kZTogaGlnaC1sZXZlbCBmdW5jdGlvbnMKKyAqLworCitpbnQKK3V0Zl93aWR0aGFkaihjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgKipkc3QpCit7CisJc2l6ZV90IGxlbjsKKwl1bnNpZ25lZCBpbnQgd2M7CisJaW50IHdpZHRoOworCisJaWYgKCFVVEZNT0RFIHx8IChsZW4gPSB1dGZfbWJ0b3djKCZ3Yywgc3JjKSkgPT0gKHNpemVfdCktMSB8fAorCSAgICB3YyA9PSAwKQorCQlsZW4gPSB3aWR0aCA9IDE7CisJZWxzZSBpZiAoKHdpZHRoID0gdXRmX3djd2lkdGgod2MpKSA8IDApCisJCS8qIFhYWCB1c2UgMiBmb3IgeF96b3RjMyBoZXJlPyAqLworCQl3aWR0aCA9IDE7CisKKwlpZiAoZHN0KQorCQkqZHN0ID0gc3JjICsgbGVuOworCXJldHVybiAod2lkdGgpOworfQorCitpbnQKK3V0Zl9tYnN3aWR0aChjb25zdCBjaGFyICpzKQoreworCXNpemVfdCBsZW47CisJdW5zaWduZWQgaW50IHdjOworCWludCB3aWR0aCA9IDAsIGN3OworCisJaWYgKCFVVEZNT0RFKQorCQlyZXR1cm4gKHN0cmxlbihzKSk7CisKKwl3aGlsZSAoKnMpCisJCWlmICgoKGxlbiA9IHV0Zl9tYnRvd2MoJndjLCBzKSkgPT0gKHNpemVfdCktMSkgfHwKKwkJICAgICgoY3cgPSB1dGZfd2N3aWR0aCh3YykpID09IC0xKSkgeworCQkJcysrOworCQkJd2lkdGggKz0gMTsKKwkJfSBlbHNlIHsKKwkJCXMgKz0gbGVuOworCQkJd2lkdGggKz0gY3c7CisJCX0KKwlyZXR1cm4gKHdpZHRoKTsKK30KKworY29uc3QgY2hhciAqCit1dGZfc2tpcGNvbHMoY29uc3QgY2hhciAqcCwgaW50IGNvbHMpCit7CisJaW50IGMgPSAwOworCisJd2hpbGUgKGMgPCBjb2xzKSB7CisJCWlmICghKnApCisJCQlyZXR1cm4gKHAgKyBjb2xzIC0gYyk7CisJCWMgKz0gdXRmX3dpZHRoYWRqKHAsICZwKTsKKwl9CisJcmV0dXJuIChwKTsKK30KKworc2l6ZV90Cit1dGZfcHRyYWRqKGNvbnN0IGNoYXIgKnNyYykKK3sKKwlyZWdpc3RlciBzaXplX3QgbjsKKworCWlmICghVVRGTU9ERSB8fAorCSAgICAqKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikoc3JjKSA8IDB4QzIgfHwKKwkgICAgKG4gPSB1dGZfbWJ0b3djKE5VTEwsIHNyYykpID09IChzaXplX3QpLTEpCisJCW4gPSAxOworCXJldHVybiAobik7Cit9CisKKy8qCisgKiBVVEYtOCBzdXBwb3J0IGNvZGU6IGxvdy1sZXZlbCBmdW5jdGlvbnMKKyAqLworCisvKiBDRVNVLTggbXVsdGlieXRlIGFuZCB3aWRlIGNoYXJhY3RlciBjb252ZXJzaW9uIGNyYWZ0ZWQgZm9yIG1rc2ggKi8KKworc2l6ZV90Cit1dGZfbWJ0b3djKHVuc2lnbmVkIGludCAqZHN0LCBjb25zdCBjaGFyICpzcmMpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopc3JjOworCXVuc2lnbmVkIGludCBjLCB3YzsKKworCWlmICgod2MgPSAqcysrKSA8IDB4ODApIHsKKyBvdXQ6CisJCWlmIChkc3QgIT0gTlVMTCkKKwkJCSpkc3QgPSB3YzsKKwkJcmV0dXJuICh3YyA/ICgoY29uc3QgY2hhciAqKXMgLSBzcmMpIDogMCk7CisJfQorCWlmICh3YyA8IDB4QzIgfHwgd2MgPj0gMHhGMCkKKwkJLyogPCAweEMwOiBzcHVyaW91cyBzZWNvbmQgYnl0ZSAqLworCQkvKiA8IDB4QzI6IG5vbi1taW5pbWFsaXN0aWMgbWFwcGluZyBlcnJvciBpbiAyLWJ5dGUgc2VxcyAqLworCQkvKiA+IDB4RUY6IGJleW9uZCBCTVAgKi8KKwkJZ290byBpbHNlcTsKKworCWlmICh3YyA8IDB4RTApIHsKKwkJd2MgPSAod2MgJiAweDFGKSA8PCA2OworCQlpZiAoKChjID0gKnMrKykgJiAweEMwKSAhPSAweDgwKQorCQkJZ290byBpbHNlcTsKKwkJd2MgfD0gYyAmIDB4M0Y7CisJCWdvdG8gb3V0OworCX0KKworCXdjID0gKHdjICYgMHgwRikgPDwgMTI7CisKKwlpZiAoKChjID0gKnMrKykgJiAweEMwKSAhPSAweDgwKQorCQlnb3RvIGlsc2VxOworCXdjIHw9IChjICYgMHgzRikgPDwgNjsKKworCWlmICgoKGMgPSAqcysrKSAmIDB4QzApICE9IDB4ODApCisJCWdvdG8gaWxzZXE7CisJd2MgfD0gYyAmIDB4M0Y7CisKKwkvKiBDaGVjayBmb3Igbm9uLW1pbmltYWxpc3RpYyBtYXBwaW5nIGVycm9yIGluIDMtYnl0ZSBzZXFzICovCisJaWYgKHdjID49IDB4MDgwMCAmJiB3YyA8PSAweEZGRkQpCisJCWdvdG8gb3V0OworIGlsc2VxOgorCXJldHVybiAoKHNpemVfdCkoLTEpKTsKK30KKworc2l6ZV90Cit1dGZfd2N0b21iKGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IHdjKQoreworCXVuc2lnbmVkIGNoYXIgKmQ7CisKKwlpZiAod2MgPCAweDgwKSB7CisJCSpkc3QgPSB3YzsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwlkID0gKHVuc2lnbmVkIGNoYXIgKilkc3Q7CisJaWYgKHdjIDwgMHgwODAwKQorCQkqZCsrID0gKHdjID4+IDYpIHwgMHhDMDsKKwllbHNlIHsKKwkJKmQrKyA9ICgod2MgPSB3YyA+IDB4RkZGRCA/IDB4RkZGRCA6IHdjKSA+PiAxMikgfCAweEUwOworCQkqZCsrID0gKCh3YyA+PiA2KSAmIDB4M0YpIHwgMHg4MDsKKwl9CisJKmQrKyA9ICh3YyAmIDB4M0YpIHwgMHg4MDsKKwlyZXR1cm4gKChjaGFyICopZCAtIGRzdCk7Cit9CisKKworI2lmbmRlZiBNS1NIX21pcmJzZF93Y3dpZHRoCisvKiAtLS0gYmVnaW4gb2Ygd2N3aWR0aC5jIGV4Y2VycHQgLS0tICovCisvKi0KKyAqIE1hcmt1cyBLdWhuIC0tIDIwMDctMDUtMjYgKFVuaWNvZGUgNS4wKQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKyAqIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuIFRoZSBhdXRob3IKKyAqIGRpc2NsYWltcyBhbGwgd2FycmFudGllcyB3aXRoIHJlZ2FyZCB0byB0aGlzIHNvZnR3YXJlLgorICovCisKK19fUkNTSUQoIiRtaXJvczogc3JjL2xpYi9saWJjL2kxOG4vd2N3aWR0aC5jLHYgMS44IDIwMDgvMDkvMjAgMTI6MDE6MTggdGcgRXhwICQiKTsKKworaW50Cit1dGZfd2N3aWR0aCh1bnNpZ25lZCBpbnQgYykKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNic2V0IHsKKwkJdW5zaWduZWQgc2hvcnQgZmlyc3Q7CisJCXVuc2lnbmVkIHNob3J0IGxhc3Q7CisJfSBjb21iW10gPSB7CisJCXsgMHgwMzAwLCAweDAzNkYgfSwgeyAweDA0ODMsIDB4MDQ4NiB9LCB7IDB4MDQ4OCwgMHgwNDg5IH0sCisJCXsgMHgwNTkxLCAweDA1QkQgfSwgeyAweDA1QkYsIDB4MDVCRiB9LCB7IDB4MDVDMSwgMHgwNUMyIH0sCisJCXsgMHgwNUM0LCAweDA1QzUgfSwgeyAweDA1QzcsIDB4MDVDNyB9LCB7IDB4MDYwMCwgMHgwNjAzIH0sCisJCXsgMHgwNjEwLCAweDA2MTUgfSwgeyAweDA2NEIsIDB4MDY1RSB9LCB7IDB4MDY3MCwgMHgwNjcwIH0sCisJCXsgMHgwNkQ2LCAweDA2RTQgfSwgeyAweDA2RTcsIDB4MDZFOCB9LCB7IDB4MDZFQSwgMHgwNkVEIH0sCisJCXsgMHgwNzBGLCAweDA3MEYgfSwgeyAweDA3MTEsIDB4MDcxMSB9LCB7IDB4MDczMCwgMHgwNzRBIH0sCisJCXsgMHgwN0E2LCAweDA3QjAgfSwgeyAweDA3RUIsIDB4MDdGMyB9LCB7IDB4MDkwMSwgMHgwOTAyIH0sCisJCXsgMHgwOTNDLCAweDA5M0MgfSwgeyAweDA5NDEsIDB4MDk0OCB9LCB7IDB4MDk0RCwgMHgwOTREIH0sCisJCXsgMHgwOTUxLCAweDA5NTQgfSwgeyAweDA5NjIsIDB4MDk2MyB9LCB7IDB4MDk4MSwgMHgwOTgxIH0sCisJCXsgMHgwOUJDLCAweDA5QkMgfSwgeyAweDA5QzEsIDB4MDlDNCB9LCB7IDB4MDlDRCwgMHgwOUNEIH0sCisJCXsgMHgwOUUyLCAweDA5RTMgfSwgeyAweDBBMDEsIDB4MEEwMiB9LCB7IDB4MEEzQywgMHgwQTNDIH0sCisJCXsgMHgwQTQxLCAweDBBNDIgfSwgeyAweDBBNDcsIDB4MEE0OCB9LCB7IDB4MEE0QiwgMHgwQTREIH0sCisJCXsgMHgwQTcwLCAweDBBNzEgfSwgeyAweDBBODEsIDB4MEE4MiB9LCB7IDB4MEFCQywgMHgwQUJDIH0sCisJCXsgMHgwQUMxLCAweDBBQzUgfSwgeyAweDBBQzcsIDB4MEFDOCB9LCB7IDB4MEFDRCwgMHgwQUNEIH0sCisJCXsgMHgwQUUyLCAweDBBRTMgfSwgeyAweDBCMDEsIDB4MEIwMSB9LCB7IDB4MEIzQywgMHgwQjNDIH0sCisJCXsgMHgwQjNGLCAweDBCM0YgfSwgeyAweDBCNDEsIDB4MEI0MyB9LCB7IDB4MEI0RCwgMHgwQjREIH0sCisJCXsgMHgwQjU2LCAweDBCNTYgfSwgeyAweDBCODIsIDB4MEI4MiB9LCB7IDB4MEJDMCwgMHgwQkMwIH0sCisJCXsgMHgwQkNELCAweDBCQ0QgfSwgeyAweDBDM0UsIDB4MEM0MCB9LCB7IDB4MEM0NiwgMHgwQzQ4IH0sCisJCXsgMHgwQzRBLCAweDBDNEQgfSwgeyAweDBDNTUsIDB4MEM1NiB9LCB7IDB4MENCQywgMHgwQ0JDIH0sCisJCXsgMHgwQ0JGLCAweDBDQkYgfSwgeyAweDBDQzYsIDB4MENDNiB9LCB7IDB4MENDQywgMHgwQ0NEIH0sCisJCXsgMHgwQ0UyLCAweDBDRTMgfSwgeyAweDBENDEsIDB4MEQ0MyB9LCB7IDB4MEQ0RCwgMHgwRDREIH0sCisJCXsgMHgwRENBLCAweDBEQ0EgfSwgeyAweDBERDIsIDB4MERENCB9LCB7IDB4MERENiwgMHgwREQ2IH0sCisJCXsgMHgwRTMxLCAweDBFMzEgfSwgeyAweDBFMzQsIDB4MEUzQSB9LCB7IDB4MEU0NywgMHgwRTRFIH0sCisJCXsgMHgwRUIxLCAweDBFQjEgfSwgeyAweDBFQjQsIDB4MEVCOSB9LCB7IDB4MEVCQiwgMHgwRUJDIH0sCisJCXsgMHgwRUM4LCAweDBFQ0QgfSwgeyAweDBGMTgsIDB4MEYxOSB9LCB7IDB4MEYzNSwgMHgwRjM1IH0sCisJCXsgMHgwRjM3LCAweDBGMzcgfSwgeyAweDBGMzksIDB4MEYzOSB9LCB7IDB4MEY3MSwgMHgwRjdFIH0sCisJCXsgMHgwRjgwLCAweDBGODQgfSwgeyAweDBGODYsIDB4MEY4NyB9LCB7IDB4MEY5MCwgMHgwRjk3IH0sCisJCXsgMHgwRjk5LCAweDBGQkMgfSwgeyAweDBGQzYsIDB4MEZDNiB9LCB7IDB4MTAyRCwgMHgxMDMwIH0sCisJCXsgMHgxMDMyLCAweDEwMzIgfSwgeyAweDEwMzYsIDB4MTAzNyB9LCB7IDB4MTAzOSwgMHgxMDM5IH0sCisJCXsgMHgxMDU4LCAweDEwNTkgfSwgeyAweDExNjAsIDB4MTFGRiB9LCB7IDB4MTM1RiwgMHgxMzVGIH0sCisJCXsgMHgxNzEyLCAweDE3MTQgfSwgeyAweDE3MzIsIDB4MTczNCB9LCB7IDB4MTc1MiwgMHgxNzUzIH0sCisJCXsgMHgxNzcyLCAweDE3NzMgfSwgeyAweDE3QjQsIDB4MTdCNSB9LCB7IDB4MTdCNywgMHgxN0JEIH0sCisJCXsgMHgxN0M2LCAweDE3QzYgfSwgeyAweDE3QzksIDB4MTdEMyB9LCB7IDB4MTdERCwgMHgxN0REIH0sCisJCXsgMHgxODBCLCAweDE4MEQgfSwgeyAweDE4QTksIDB4MThBOSB9LCB7IDB4MTkyMCwgMHgxOTIyIH0sCisJCXsgMHgxOTI3LCAweDE5MjggfSwgeyAweDE5MzIsIDB4MTkzMiB9LCB7IDB4MTkzOSwgMHgxOTNCIH0sCisJCXsgMHgxQTE3LCAweDFBMTggfSwgeyAweDFCMDAsIDB4MUIwMyB9LCB7IDB4MUIzNCwgMHgxQjM0IH0sCisJCXsgMHgxQjM2LCAweDFCM0EgfSwgeyAweDFCM0MsIDB4MUIzQyB9LCB7IDB4MUI0MiwgMHgxQjQyIH0sCisJCXsgMHgxQjZCLCAweDFCNzMgfSwgeyAweDFEQzAsIDB4MURDQSB9LCB7IDB4MURGRSwgMHgxREZGIH0sCisJCXsgMHgyMDBCLCAweDIwMEYgfSwgeyAweDIwMkEsIDB4MjAyRSB9LCB7IDB4MjA2MCwgMHgyMDYzIH0sCisJCXsgMHgyMDZBLCAweDIwNkYgfSwgeyAweDIwRDAsIDB4MjBFRiB9LCB7IDB4MzAyQSwgMHgzMDJGIH0sCisJCXsgMHgzMDk5LCAweDMwOUEgfSwgeyAweEE4MDYsIDB4QTgwNiB9LCB7IDB4QTgwQiwgMHhBODBCIH0sCisJCXsgMHhBODI1LCAweEE4MjYgfSwgeyAweEZCMUUsIDB4RkIxRSB9LCB7IDB4RkUwMCwgMHhGRTBGIH0sCisJCXsgMHhGRTIwLCAweEZFMjMgfSwgeyAweEZFRkYsIDB4RkVGRiB9LCB7IDB4RkZGOSwgMHhGRkZCIH0KKwl9OworCXNpemVfdCBtaW4gPSAwLCBtaWQsIG1heCA9IE5FTEVNKGNvbWIpIC0gMTsKKworCS8qIHRlc3QgZm9yIDgtYml0IGNvbnRyb2wgY2hhcmFjdGVycyAqLworCWlmIChjIDwgMzIgfHwgKGMgPj0gMHg3ZiAmJiBjIDwgMHhhMCkpCisJCXJldHVybiAoYyA/IC0xIDogMCk7CisKKwkvKiBiaW5hcnkgc2VhcmNoIGluIHRhYmxlIG9mIG5vbi1zcGFjaW5nIGNoYXJhY3RlcnMgKi8KKwlpZiAoYyA+PSBjb21iWzBdLmZpcnN0ICYmIGMgPD0gY29tYlttYXhdLmxhc3QpCisJCXdoaWxlIChtYXggPj0gbWluKSB7CisJCQltaWQgPSAobWluICsgbWF4KSAvIDI7CisJCQlpZiAoYyA+IGNvbWJbbWlkXS5sYXN0KQorCQkJCW1pbiA9IG1pZCArIDE7CisJCQllbHNlIGlmIChjIDwgY29tYlttaWRdLmZpcnN0KQorCQkJCW1heCA9IG1pZCAtIDE7CisJCQllbHNlCisJCQkJcmV0dXJuICgwKTsKKwkJfQorCisJLyogaWYgd2UgYXJyaXZlIGhlcmUsIGMgaXMgbm90IGEgY29tYmluaW5nIG9yIEMwL0MxIGNvbnRyb2wgY2hhciAqLworCXJldHVybiAoKGMgPj0gMHgxMTAwICYmICgKKwkgICAgYyA8PSAweDExNWYgfHwgLyogSGFuZ3VsIEphbW8gaW5pdC4gY29uc29uYW50cyAqLworCSAgICBjID09IDB4MjMyOSB8fCBjID09IDB4MjMyYSB8fAorCSAgICAoYyA+PSAweDJlODAgJiYgYyA8PSAweGE0Y2YgJiYgYyAhPSAweDMwM2YpIHx8IC8qIENKSyAuLi4gWWkgKi8KKwkgICAgKGMgPj0gMHhhYzAwICYmIGMgPD0gMHhkN2EzKSB8fCAvKiBIYW5ndWwgU3lsbGFibGVzICovCisJICAgIChjID49IDB4ZjkwMCAmJiBjIDw9IDB4ZmFmZikgfHwgLyogQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyAqLworCSAgICAoYyA+PSAweGZlMTAgJiYgYyA8PSAweGZlMTkpIHx8IC8qIFZlcnRpY2FsIGZvcm1zICovCisJICAgIChjID49IDB4ZmUzMCAmJiBjIDw9IDB4ZmU2ZikgfHwgLyogQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMgKi8KKwkgICAgKGMgPj0gMHhmZjAwICYmIGMgPD0gMHhmZjYwKSB8fCAvKiBGdWxsd2lkdGggRm9ybXMgKi8KKwkgICAgKGMgPj0gMHhmZmUwICYmIGMgPD0gMHhmZmU2KSkpID8gMiA6IDEpOworfQorLyogLS0tIGVuZCBvZiB3Y3dpZHRoLmMgZXhjZXJwdCAtLS0gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvZnVuY3MuYyBiL21rc2gvc3JjL2Z1bmNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5YzAzYQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL2Z1bmNzLmMKQEAgLTAsMCArMSwzNDI5IEBACisvKgkkT3BlbkJTRDogY19rc2guYyx2IDEuMzMgMjAwOS8wMi8wNyAxNDowMzoyNCBraWxpIEV4cCAkCSovCisvKgkkT3BlbkJTRDogY19zaC5jLHYgMS40MSAyMDEwLzAzLzI3IDA5OjEwOjAxIGptYyBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IGNfdGVzdC5jLHYgMS4xOCAyMDA5LzAzLzAxIDIwOjExOjA2IG90dG8gRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBjX3VsaW1pdC5jLHYgMS4xNyAyMDA4LzAzLzIxIDEyOjUxOjE5IG1pbGxlcnQgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpbmNsdWRlICJzaC5oIgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9mdW5jcy5jLHYgMS4xNTcgMjAxMC8wOC8yNCAxNDo0MjowMSB0ZyBFeHAgJCIpOworCisjaWYgSEFWRV9LSUxMUEcKKy8qCisgKiB1c2Uga2lsbHBnIGlmIDwgLTEgc2luY2UgLTEgZG9lcyBzcGVjaWFsIHRoaW5ncworICogZm9yIHNvbWUgbm9uLWtpbGxwZy1lbmRvd2VkIGtpbGxzCisgKi8KKyNkZWZpbmUgbWtzaF9raWxsKHAscykJKChwKSA8IC0xID8ga2lsbHBnKC0ocCksIChzKSkgOiBraWxsKChwKSwgKHMpKSkKKyNlbHNlCisvKiBjcm9zcyBmaW5nZXJzIGFuZCBob3BlIGtpbGwgaXMga2lsbHBnLWVuZG93ZWQgKi8KKyNkZWZpbmUgbWtzaF9raWxsCWtpbGwKKyNlbmRpZgorCisvKiBYWFggY29uZGl0aW9ucyBjb3JyZWN0PyAqLworI2lmICFkZWZpbmVkKFJMSU1fSU5GSU5JVFkpICYmICFkZWZpbmVkKE1LU0hfTk9fTElNSVRTKQorI2RlZmluZSBNS1NIX05PX0xJTUlUUworI2VuZGlmCisKKyNpZmRlZiBNS1NIX05PX0xJTUlUUworI2RlZmluZSBjX3VsaW1pdCBjX2xhYmVsCisjZW5kaWYKKworZXh0ZXJuIHVpbnQ4X3Qgc2V0X3JlZmZsYWc7CisKKy8qIEEgbGVhZGluZyA9IG1lYW5zIGFzc2lnbm1lbnRzIGJlZm9yZSBjb21tYW5kIGFyZSBrZXB0OworICogYSBsZWFkaW5nICogbWVhbnMgYSBQT1NJWCBzcGVjaWFsIGJ1aWx0aW47CisgKiBhIGxlYWRpbmcgKyBtZWFucyBhIFBPU0lYIHJlZ3VsYXIgYnVpbHRpbgorICogKCogYW5kICsgc2hvdWxkIG5vdCBiZSBjb21iaW5lZCkuCisgKi8KK2NvbnN0IHN0cnVjdCBidWlsdGluIG1rc2hidWlsdGluc1tdID0geworCXsiKj0uIiwgY19kb3R9LAorCXsiKj06IiwgY19sYWJlbH0sCisJeyJbIiwgY190ZXN0fSwKKwl7Iio9YnJlYWsiLCBjX2Jya2NvbnR9LAorCXsiPWJ1aWx0aW4iLCBjX2J1aWx0aW59LAorCXsiKj1jb250aW51ZSIsIGNfYnJrY29udH0sCisJeyIqPWV2YWwiLCBjX2V2YWx9LAorCXsiKj1leGVjIiwgY19leGVjfSwKKwl7Iio9ZXhpdCIsIGNfZXhpdHJldHVybn0sCisJeyIrZmFsc2UiLCBjX2xhYmVsfSwKKwl7Iio9cmV0dXJuIiwgY19leGl0cmV0dXJufSwKKwl7Iio9c2V0IiwgY19zZXR9LAorCXsiKj1zaGlmdCIsIGNfc2hpZnR9LAorCXsiPXRpbWVzIiwgY190aW1lc30sCisJeyIqPXRyYXAiLCBjX3RyYXB9LAorCXsiKz13YWl0IiwgY193YWl0fSwKKwl7IityZWFkIiwgY19yZWFkfSwKKwl7InRlc3QiLCBjX3Rlc3R9LAorCXsiK3RydWUiLCBjX2xhYmVsfSwKKwl7InVsaW1pdCIsIGNfdWxpbWl0fSwKKwl7Iit1bWFzayIsIGNfdW1hc2t9LAorCXsiKj11bnNldCIsIGNfdW5zZXR9LAorCXsiK2FsaWFzIiwgY19hbGlhc30sCS8qIG5vID06IEFUJlQgbWFudWFsIHdyb25nICovCisJeyIrY2QiLCBjX2NkfSwKKwl7ImNoZGlyIiwgY19jZH0sCS8qIGRhc2ggY29tcGF0aWJpbGl0eSBoYWNrICovCisJeyIrY29tbWFuZCIsIGNfY29tbWFuZH0sCisJeyJlY2hvIiwgY19wcmludH0sCisJeyIqPWV4cG9ydCIsIGNfdHlwZXNldH0sCisJeyIrZmMiLCBjX2ZjfSwKKwl7IitnZXRvcHRzIiwgY19nZXRvcHRzfSwKKwl7Iitqb2JzIiwgY19qb2JzfSwKKwl7IitraWxsIiwgY19raWxsfSwKKwl7ImxldCIsIGNfbGV0fSwKKwl7InByaW50IiwgY19wcmludH0sCisjaWZkZWYgTUtTSF9QUklOVEZfQlVJTFRJTgorCXsicHJpbnRmIiwgY19wcmludGZ9LAorI2VuZGlmCisJeyJwd2QiLCBjX3B3ZH0sCisJeyIqPXJlYWRvbmx5IiwgY190eXBlc2V0fSwKKwl7VF9fdHlwZXNldCwgY190eXBlc2V0fSwKKwl7Iit1bmFsaWFzIiwgY191bmFsaWFzfSwKKwl7IndoZW5jZSIsIGNfd2hlbmNlfSwKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJeyIrYmciLCBjX2ZnYmd9LAorCXsiK2ZnIiwgY19mZ2JnfSwKKyNlbmRpZgorCXsiYmluZCIsIGNfYmluZH0sCisjaWYgSEFWRV9NS05PRAorCXsibWtub2QiLCBjX21rbm9kfSwKKyNlbmRpZgorCXsicmVhbHBhdGgiLCBjX3JlYWxwYXRofSwKKwl7InJlbmFtZSIsIGNfcmVuYW1lfSwKKwl7TlVMTCwgKGludCAoKikoY29uc3QgY2hhciAqKikpTlVMTH0KK307CisKK3N0cnVjdCBraWxsX2luZm8geworCWludCBudW1fd2lkdGg7CisJaW50IG5hbWVfd2lkdGg7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRfb3AgeworCWNoYXIgb3BfdGV4dFs0XTsKKwlUZXN0X29wIG9wX251bTsKK30gdV9vcHNbXSA9IHsKKwl7Ii1hIiwJVE9fRklMQVhTVCB9LAorCXsiLWIiLAlUT19GSUxCREVWIH0sCisJeyItYyIsCVRPX0ZJTENERVYgfSwKKwl7Ii1kIiwJVE9fRklMSUQgfSwKKwl7Ii1lIiwJVE9fRklMRVhTVCB9LAorCXsiLWYiLAlUT19GSUxSRUcgfSwKKwl7Ii1HIiwJVE9fRklMR0lEIH0sCisJeyItZyIsCVRPX0ZJTFNFVEcgfSwKKwl7Ii1oIiwJVE9fRklMU1lNIH0sCisJeyItSCIsCVRPX0ZJTENERiB9LAorCXsiLWsiLAlUT19GSUxTVENLIH0sCisJeyItTCIsCVRPX0ZJTFNZTSB9LAorCXsiLW4iLAlUT19TVE5aRSB9LAorCXsiLU8iLAlUT19GSUxVSUQgfSwKKwl7Ii1vIiwJVE9fT1BUSU9OIH0sCisJeyItcCIsCVRPX0ZJTEZJRk8gfSwKKwl7Ii1yIiwJVE9fRklMUkQgfSwKKwl7Ii1zIiwJVE9fRklMR1ogfSwKKwl7Ii1TIiwJVE9fRklMU09DSyB9LAorCXsiLXQiLAlUT19GSUxUVCB9LAorCXsiLXUiLAlUT19GSUxTRVRVIH0sCisJeyItdyIsCVRPX0ZJTFdSIH0sCisJeyIteCIsCVRPX0ZJTEVYIH0sCisJeyIteiIsCVRPX1NUWkVSIH0sCisJeyIiLAlUT19OT05PUCB9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB0X29wIGJfb3BzW10gPSB7CisJeyI9IiwJVE9fU1RFUUwgfSwKKwl7Ij09IiwJVE9fU1RFUUwgfSwKKwl7IiE9IiwJVE9fU1RORVEgfSwKKwl7IjwiLAlUT19TVExUIH0sCisJeyI+IiwJVE9fU1RHVCB9LAorCXsiLWVxIiwJVE9fSU5URVEgfSwKKwl7Ii1uZSIsCVRPX0lOVE5FIH0sCisJeyItZ3QiLAlUT19JTlRHVCB9LAorCXsiLWdlIiwJVE9fSU5UR0UgfSwKKwl7Ii1sdCIsCVRPX0lOVExUIH0sCisJeyItbGUiLAlUT19JTlRMRSB9LAorCXsiLWVmIiwJVE9fRklMRVEgfSwKKwl7Ii1udCIsCVRPX0ZJTE5UIH0sCisJeyItb3QiLAlUT19GSUxPVCB9LAorCXsiIiwJVE9fTk9OT1AgfQorfTsKKworc3RhdGljIGludCB0ZXN0X2VhY2Nlc3MoY29uc3QgY2hhciAqLCBpbnQpOworc3RhdGljIGludCB0ZXN0X29leHByKFRlc3RfZW52ICosIGJvb2wpOworc3RhdGljIGludCB0ZXN0X2FleHByKFRlc3RfZW52ICosIGJvb2wpOworc3RhdGljIGludCB0ZXN0X25leHByKFRlc3RfZW52ICosIGJvb2wpOworc3RhdGljIGludCB0ZXN0X3ByaW1hcnkoVGVzdF9lbnYgKiwgYm9vbCk7CitzdGF0aWMgVGVzdF9vcCBwdGVzdF9pc2EoVGVzdF9lbnYgKiwgVGVzdF9tZXRhKTsKK3N0YXRpYyBjb25zdCBjaGFyICpwdGVzdF9nZXRvcG5kKFRlc3RfZW52ICosIFRlc3Rfb3AsIGJvb2wpOworc3RhdGljIHZvaWQgcHRlc3RfZXJyb3IoVGVzdF9lbnYgKiwgaW50LCBjb25zdCBjaGFyICopOworc3RhdGljIGNoYXIgKmtpbGxfZm10X2VudHJ5KGNoYXIgKiwgaW50LCBpbnQsIGNvbnN0IHZvaWQgKik7CitzdGF0aWMgdm9pZCBwX3RpbWUoc3RydWN0IHNoZiAqLCBib29sLCBsb25nLCBpbnQsIGludCwKKyAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikKKyAgICBNS1NIX0FfTk9OTlVMTCgobm9ubnVsbCAoNiwgNykpKTsKK3N0YXRpYyBjaGFyICpkb19yZWFscGF0aChjb25zdCBjaGFyICopOworCitzdGF0aWMgY2hhciAqCitkb19yZWFscGF0aChjb25zdCBjaGFyICp1cGF0aCkKK3sKKwljaGFyICp4cCwgKmlwLCAqdHAsICppcGF0aCwgKmxkZXN0ID0gTlVMTDsKKwlYU3RyaW5nIHhzOworCXB0cmRpZmZfdCBwb3M7CisJc2l6ZV90IGxlbjsKKwlpbnQgc3ltbGlua3MgPSAzMjsJLyogbWF4LiByZWN1cnNpb24gZGVwdGggKi8KKwlpbnQgbGxlbjsKKwlzdHJ1Y3Qgc3RhdCBzYjsKKyNpZmRlZiBOT19QQVRIX01BWAorCXNpemVfdCBsZGVzdGxlbiA9IDA7CisjZGVmaW5lIHBhdGhsZW4gc2Iuc3Rfc2l6ZQorI2RlZmluZSBwYXRoY25kIChsZGVzdGxlbiA8IChwYXRobGVuICsgMSkpCisjZWxzZQorI2RlZmluZSBwYXRobGVuIFBBVEhfTUFYCisjZGVmaW5lIHBhdGhjbmQgKCFsZGVzdCkKKyNlbmRpZgorCisJaWYgKHVwYXRoWzBdID09ICcvJykgeworCQkvKiB1cGF0aCBpcyBhbiBhYnNvbHV0ZSBwYXRobmFtZSAqLworCQlzdHJkdXB4KGlwYXRoLCB1cGF0aCwgQVRFTVApOworCX0gZWxzZSB7CisJCS8qIHVwYXRoIGlzIGEgcmVsYXRpdmUgcGF0aG5hbWUsIHByZXBlbmQgY3dkICovCisJCWlmICgodHAgPSBrc2hfZ2V0X3dkKE5VTEwpKSA9PSBOVUxMIHx8IHRwWzBdICE9ICcvJykKKwkJCXJldHVybiAoTlVMTCk7CisJCWlwYXRoID0gc2hmX3NtcHJpbnRmKCIlcy8lcyIsIHRwLCB1cGF0aCk7CisJCWFmcmVlKHRwLCBBVEVNUCk7CisJfQorCisJWGluaXQoeHMsIHhwLCBzdHJsZW4oaXAgPSBpcGF0aCkgKyAxLCBBVEVNUCk7CisKKwl3aGlsZSAoKmlwKSB7CisJCS8qIHNraXAgc2xhc2hlcyBpbiBpbnB1dCAqLworCQl3aGlsZSAoKmlwID09ICcvJykKKwkJCSsraXA7CisJCWlmICghKmlwKQorCQkJYnJlYWs7CisKKwkJLyogZ2V0IG5leHQgcGF0aG5hbWUgY29tcG9uZW50IGZyb20gaW5wdXQgKi8KKwkJdHAgPSBpcDsKKwkJd2hpbGUgKCppcCAmJiAqaXAgIT0gJy8nKQorCQkJKytpcDsKKwkJbGVuID0gaXAgLSB0cDsKKworCQkvKiBjaGVjayBpbnB1dCBmb3IgIi4iIGFuZCAiLi4iICovCisJCWlmICh0cFswXSA9PSAnLicpIHsKKwkJCWlmIChsZW4gPT0gMSkKKwkJCQkvKiBqdXN0IGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lICovCisJCQkJY29udGludWU7CisJCQllbHNlIGlmIChsZW4gPT0gMiAmJiB0cFsxXSA9PSAnLicpIHsKKwkJCQkvKiBzdHJpcCBvZmYgbGFzdCBwYXRobmFtZSBjb21wb25lbnQgKi8KKwkJCQl3aGlsZSAoeHAgPiBYc3RyaW5nKHhzLCB4cCkpCisJCQkJCWlmICgqLS14cCA9PSAnLycpCisJCQkJCQlicmVhazsKKwkJCQkvKiB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lICovCisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBzdG9yZSBvdXRwdXQgcG9zaXRpb24gYXdheSwgdGhlbiBhcHBlbmQgc2xhc2ggdG8gb3V0cHV0ICovCisJCXBvcyA9IFhzYXZlcG9zKHhzLCB4cCk7CisJCS8qIDEgZm9yIHRoZSAnLycgYW5kIGxlbiArIDEgZm9yIHRwIGFuZCB0aGUgTlVMIGZyb20gYmVsb3cgKi8KKwkJWGNoZWNrTih4cywgeHAsIDEgKyBsZW4gKyAxKTsKKwkJWHB1dCh4cywgeHAsICcvJyk7CisKKwkJLyogYXBwZW5kIG5leHQgcGF0aG5hbWUgY29tcG9uZW50IHRvIG91dHB1dCAqLworCQltZW1jcHkoeHAsIHRwLCBsZW4pOworCQl4cCArPSBsZW47CisJCSp4cCA9ICdcMCc7CisKKwkJLyogbHN0YXQgdGhlIGN1cnJlbnQgb3V0cHV0LCBzZWUgaWYgaXQncyBhIHN5bWxpbmsgKi8KKwkJaWYgKGxzdGF0KFhzdHJpbmcoeHMsIHhwKSwgJnNiKSkgeworCQkJLyogbHN0YXQgZmFpbGVkICovCisJCQlpZiAoZXJybm8gPT0gRU5PRU5UKSB7CisJCQkJLyogYmVjYXVzZSB0aGUgcGF0aG5hbWUgZG9lcyBub3QgZXhpc3QgKi8KKwkJCQl3aGlsZSAoKmlwID09ICcvJykKKwkJCQkJLyogc2tpcCBhbnkgdHJhaWxpbmcgc2xhc2hlcyAqLworCQkJCQkrK2lwOworCQkJCS8qIG5vIG1vcmUgY29tcG9uZW50cyBsZWZ0PyAqLworCQkJCWlmICghKmlwKQorCQkJCQkvKiB3ZSBjYW4gc3RpbGwgcmV0dXJuIHN1Y2Nlc3NmdWxseSAqLworCQkJCQlicmVhazsKKwkJCQkvKiBtb3JlIGNvbXBvbmVudHMgbGVmdD8gZmFsbCB0aHJvdWdoICovCisJCQl9CisJCQkvKiBub3QgRU5PRU5UIG9yIG5vdCBhdCB0aGUgZW5kIG9mIGlwYXRoICovCisJCQlnb3RvIG5vdGZvdW5kOworCQl9CisKKwkJLyogY2hlY2sgaWYgd2UgZW5jb3VudGVyZWQgYSBzeW1saW5rPyAqLworCQlpZiAoU19JU0xOSyhzYi5zdF9tb2RlKSkgeworCQkJLyogcmVhY2hlZCBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aD8gKi8KKwkJCWlmICghc3ltbGlua3MtLSkgeworCQkJCS8qIHllcCwgcHJldmVudCBpbmZpbml0ZSBsb29wcyAqLworCQkJCWVycm5vID0gRUxPT1A7CisJCQkJZ290byBub3Rmb3VuZDsKKwkJCX0KKworCQkJLyogZ2V0IHN5bWxpbmsoNykgdGFyZ2V0ICovCisJCQlpZiAocGF0aGNuZCkKKwkJCQlsZGVzdCA9IGFyZXNpemUobGRlc3QsIHBhdGhsZW4gKyAxLCBBVEVNUCk7CisJCQlsbGVuID0gcmVhZGxpbmsoWHN0cmluZyh4cywgeHApLCBsZGVzdCwgcGF0aGxlbik7CisJCQlpZiAobGxlbiA8IDApCisJCQkJLyogb29wcy4uLiAqLworCQkJCWdvdG8gbm90Zm91bmQ7CisJCQlsZGVzdFtsbGVuXSA9ICdcMCc7CisKKwkJCS8qCisJCQkgKiByZXN0YXJ0IGlmIHN5bWxpbmsgdGFyZ2V0IGlzIGFuIGFic29sdXRlIHBhdGgsCisJCQkgKiBvdGhlcndpc2UgY29udGludWUgd2l0aCBjdXJyZW50bHkgcmVzb2x2ZWQgcHJlZml4CisJCQkgKi8KKwkJCXhwID0gKGxkZXN0WzBdID09ICcvJykgPyBYc3RyaW5nKHhzLCB4cCkgOgorCQkJICAgIFhyZXN0cG9zKHhzLCB4cCwgcG9zKTsKKwkJCXRwID0gc2hmX3NtcHJpbnRmKCIlcyVzJXMiLCBsZGVzdCwgKmlwID8gIi8iIDogIiIsIGlwKTsKKwkJCWFmcmVlKGlwYXRoLCBBVEVNUCk7CisJCQlpcCA9IGlwYXRoID0gdHA7CisJCX0KKwkJLyogb3RoZXJ3aXNlIChubyBzeW1saW5rKSBtZXJlbHkgZ28gb24gKi8KKwl9CisKKwkvKgorCSAqIGVpdGhlciBmb3VuZCB0aGUgdGFyZ2V0IGFuZCBzdWNjZXNzZnVsbHkgcmVzb2x2ZWQgaXQsCisJICogb3IgZm91bmQgaXRzIHBhcmVudCBkaXJlY3RvcnkgYW5kIG1heSBjcmVhdGUgaXQKKwkgKi8KKwlpZiAoWGxlbmd0aCh4cywgeHApID09IDApCisJCS8qCisJCSAqIGlmIHRoZSByZXNvbHZlZCBwYXRobmFtZSBpcyAiIiwgbWFrZSBpdCAiLyIsCisJCSAqIG90aGVyd2lzZSBkbyBub3QgYWRkIGEgdHJhaWxpbmcgc2xhc2gKKwkJICovCisJCVhwdXQoeHMsIHhwLCAnLycpOworCVhwdXQoeHMsIHhwLCAnXDAnKTsKKworCS8qCisJICogaWYgc291cmNlIHBhdGggaGFkIGEgdHJhaWxpbmcgc2xhc2gsIGNoZWNrIGlmIHRhcmdldCBwYXRoCisJICogaXMgbm90IGEgbm9uLWRpcmVjdG9yeSBleGlzdGluZyBmaWxlCisJICovCisJaWYgKGlwID4gaXBhdGggJiYgaXBbLTFdID09ICcvJykgeworCQlpZiAoc3RhdChYc3RyaW5nKHhzLCB4cCksICZzYikpIHsKKwkJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQkJZ290byBub3Rmb3VuZDsKKwkJfSBlbHNlIGlmICghU19JU0RJUihzYi5zdF9tb2RlKSkgeworCQkJZXJybm8gPSBFTk9URElSOworCQkJZ290byBub3Rmb3VuZDsKKwkJfQorCQkvKiB0YXJnZXQgbm93IGVpdGhlciBkb2VzIG5vdCBleGlzdCBvciBpcyBhIGRpcmVjdG9yeSAqLworCX0KKworCS8qIHJldHVybiB0YXJnZXQgcGF0aCAqLworCWlmIChsZGVzdCAhPSBOVUxMKQorCQlhZnJlZShsZGVzdCwgQVRFTVApOworCWFmcmVlKGlwYXRoLCBBVEVNUCk7CisJcmV0dXJuIChYY2xvc2UoeHMsIHhwKSk7CisKKyBub3Rmb3VuZDoKKwlsbGVuID0gZXJybm87CS8qIHNhdmU7IGZyZWUoMykgbWlnaHQgdHJhc2ggaXQgKi8KKwlpZiAobGRlc3QgIT0gTlVMTCkKKwkJYWZyZWUobGRlc3QsIEFURU1QKTsKKwlhZnJlZShpcGF0aCwgQVRFTVApOworCVhmcmVlKHhzLCB4cCk7CisJZXJybm8gPSBsbGVuOworCXJldHVybiAoTlVMTCk7CisKKyN1bmRlZiBwYXRobGVuCisjdW5kZWYgcGF0aGNuZAorfQorCitpbnQKK2NfY2QoY29uc3QgY2hhciAqKndwKQoreworCWludCBvcHRjLCBydiwgcGh5c19wYXRoOworCWJvb2wgcGh5c2ljYWwgPSBGbGFnKEZQSFlTSUNBTCkgPyB0cnVlIDogZmFsc2U7CisJaW50IGNkbm9kZTsJCQkvKiB3YXMgYSBub2RlIGZyb20gY2RwYXRoIGFkZGVkIGluPyAqLworCWJvb2wgcHJpbnRwYXRoID0gZmFsc2U7CQkvKiBwcmludCB3aGVyZSB3ZSBjZCdkPyAqLworCXN0cnVjdCB0YmwgKnB3ZF9zLCAqb2xkcHdkX3M7CisJWFN0cmluZyB4czsKKwljaGFyICpkaXIsICphbGxvY2QgPSBOVUxMLCAqdHJ5cCwgKnB3ZCwgKmNkcGF0aDsKKworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgIkxQIikpICE9IC0xKQorCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAnTCc6CisJCQlwaHlzaWNhbCA9IGZhbHNlOworCQkJYnJlYWs7CisJCWNhc2UgJ1AnOgorCQkJcGh5c2ljYWwgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJcmV0dXJuICgxKTsKKwkJfQorCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKworCWlmIChGbGFnKEZSRVNUUklDVEVEKSkgeworCQliaV9lcnJvcmYoInJlc3RyaWN0ZWQgc2hlbGwgLSBjYW4ndCBjZCIpOworCQlyZXR1cm4gKDEpOworCX0KKworCXB3ZF9zID0gZ2xvYmFsKCJQV0QiKTsKKwlvbGRwd2RfcyA9IGdsb2JhbCgiT0xEUFdEIik7CisKKwlpZiAoIXdwWzBdKSB7CisJCS8qIE5vIGFyZ3VtZW50cyAtIGdvIGhvbWUgKi8KKwkJaWYgKChkaXIgPSBzdHJfdmFsKGdsb2JhbCgiSE9NRSIpKSkgPT0gbnVsbCkgeworCQkJYmlfZXJyb3JmKCJubyBob21lIGRpcmVjdG9yeSAoSE9NRSBub3Qgc2V0KSIpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0gZWxzZSBpZiAoIXdwWzFdKSB7CisJCS8qIE9uZSBhcmd1bWVudDogLSBvciBkaXIgKi8KKwkJc3RyZHVweChhbGxvY2QsIHdwWzBdLCBBVEVNUCk7CisJCWlmIChrc2hfaXNkYXNoKChkaXIgPSBhbGxvY2QpKSkgeworCQkJYWZyZWUoYWxsb2NkLCBBVEVNUCk7CisJCQlhbGxvY2QgPSBOVUxMOworCQkJZGlyID0gc3RyX3ZhbChvbGRwd2Rfcyk7CisJCQlpZiAoZGlyID09IG51bGwpIHsKKwkJCQliaV9lcnJvcmYoIm5vIE9MRFBXRCIpOworCQkJCXJldHVybiAoMSk7CisJCQl9CisJCQlwcmludHBhdGggPSB0cnVlOworCQl9CisJfSBlbHNlIGlmICghd3BbMl0pIHsKKwkJLyogVHdvIGFyZ3VtZW50cyAtIHN1YnN0aXR1dGUgYXJnMSBpbiBQV0QgZm9yIGFyZzIgKi8KKwkJaW50IGlsZW4sIG9sZW4sIG5sZW4sIGVsZW47CisJCWNoYXIgKmNwOworCisJCWlmICghY3VycmVudF93ZFswXSkgeworCQkJYmlfZXJyb3JmKCJkb24ndCBrbm93IGN1cnJlbnQgZGlyZWN0b3J5Iik7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCS8qIHN1YnN0aXR1dGUgYXJnMSBmb3IgYXJnMiBpbiBjdXJyZW50IHBhdGguCisJCSAqIGlmIHRoZSBmaXJzdCBzdWJzdGl0dXRpb24gZmFpbHMgYmVjYXVzZSB0aGUgY2QgZmFpbHMKKwkJICogd2UgY291bGQgdHJ5IHRvIGZpbmQgYW5vdGhlciBzdWJzdGl0dXRpb24uIEZvciBub3cKKwkJICogd2UgZG9uJ3QKKwkJICovCisJCWlmICgoY3AgPSBzdHJzdHIoY3VycmVudF93ZCwgd3BbMF0pKSA9PSBOVUxMKSB7CisJCQliaV9lcnJvcmYoImJhZCBzdWJzdGl0dXRpb24iKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwkJaWxlbiA9IGNwIC0gY3VycmVudF93ZDsKKwkJb2xlbiA9IHN0cmxlbih3cFswXSk7CisJCW5sZW4gPSBzdHJsZW4od3BbMV0pOworCQllbGVuID0gc3RybGVuKGN1cnJlbnRfd2QgKyBpbGVuICsgb2xlbikgKyAxOworCQlkaXIgPSBhbGxvY2QgPSBhbGxvYyhpbGVuICsgbmxlbiArIGVsZW4sIEFURU1QKTsKKwkJbWVtY3B5KGRpciwgY3VycmVudF93ZCwgaWxlbik7CisJCW1lbWNweShkaXIgKyBpbGVuLCB3cFsxXSwgbmxlbik7CisJCW1lbWNweShkaXIgKyBpbGVuICsgbmxlbiwgY3VycmVudF93ZCArIGlsZW4gKyBvbGVuLCBlbGVuKTsKKwkJcHJpbnRwYXRoID0gdHJ1ZTsKKwl9IGVsc2UgeworCQliaV9lcnJvcmYoInRvbyBtYW55IGFyZ3VtZW50cyIpOworCQlyZXR1cm4gKDEpOworCX0KKworI2lmZGVmIE5PX1BBVEhfTUFYCisJLyogb25seSBhIGZpcnN0IGd1ZXNzOyBtYWtlX3BhdGggd2lsbCBlbmxhcmdlIHhzIGlmIG5lY2Vzc2FyeSAqLworCVhpbml0Tih4cywgMTAyNCwgQVRFTVApOworI2Vsc2UKKwlYaW5pdE4oeHMsIFBBVEhfTUFYLCBBVEVNUCk7CisjZW5kaWYKKworCWNkcGF0aCA9IHN0cl92YWwoZ2xvYmFsKCJDRFBBVEgiKSk7CisJZG8geworCQljZG5vZGUgPSBtYWtlX3BhdGgoY3VycmVudF93ZCwgZGlyLCAmY2RwYXRoLCAmeHMsICZwaHlzX3BhdGgpOworCQlpZiAocGh5c2ljYWwpCisJCQlydiA9IGNoZGlyKHRyeXAgPSBYc3RyaW5nKHhzLCB4cCkgKyBwaHlzX3BhdGgpOworCQllbHNlIHsKKwkJCXNpbXBsaWZ5X3BhdGgoWHN0cmluZyh4cywgeHApKTsKKwkJCXJ2ID0gY2hkaXIodHJ5cCA9IFhzdHJpbmcoeHMsIHhwKSk7CisJCX0KKwl9IHdoaWxlIChydiA8IDAgJiYgY2RwYXRoICE9IE5VTEwpOworCisJaWYgKHJ2IDwgMCkgeworCQlpZiAoY2Rub2RlKQorCQkJYmlfZXJyb3JmKCIlczogYmFkIGRpcmVjdG9yeSIsIGRpcik7CisJCWVsc2UKKwkJCWJpX2Vycm9yZigiJXMgLSAlcyIsIHRyeXAsIHN0cmVycm9yKGVycm5vKSk7CisJCWFmcmVlKGFsbG9jZCwgQVRFTVApOworCQlyZXR1cm4gKDEpOworCX0KKworCS8qIGFsbG9jZCAoYWJvdmUpID0+IGRpciwgd2hpY2ggaXMgbm8gbG9uZ2VyIHVzZWQgKi8KKwlhZnJlZShhbGxvY2QsIEFURU1QKTsKKwlhbGxvY2QgPSBOVUxMOworCisJLyogQ2xlYXIgb3V0IHRyYWNrZWQgYWxpYXNlcyB3aXRoIHJlbGF0aXZlIHBhdGhzICovCisJZmx1c2hjb20oMCk7CisKKwkvKiBTZXQgT0xEUFdEIChub3RlOiB1bnNldHRpbmcgT0xEUFdEIGRvZXMgbm90IGRpc2FibGUgdGhpcworCSAqIHNldHRpbmcgaW4gQVQmVCBrc2gpCisJICovCisJaWYgKGN1cnJlbnRfd2RbMF0pCisJCS8qIElnbm9yZSBmYWlsdXJlIChoYXBwZW5zIGlmIHJlYWRvbmx5IG9yIGludGVnZXIpICovCisJCXNldHN0cihvbGRwd2RfcywgY3VycmVudF93ZCwgS1NIX1JFVFVSTl9FUlJPUik7CisKKwlpZiAoWHN0cmluZyh4cywgeHApWzBdICE9ICcvJykgeworCQlwd2QgPSBOVUxMOworCX0gZWxzZSBpZiAoIXBoeXNpY2FsIHx8ICEocHdkID0gYWxsb2NkID0gZG9fcmVhbHBhdGgoWHN0cmluZyh4cywgeHApKSkpCisJCXB3ZCA9IFhzdHJpbmcoeHMsIHhwKTsKKworCS8qIFNldCBQV0QgKi8KKwlpZiAocHdkKSB7CisJCWNoYXIgKnB0bXAgPSBwd2Q7CisKKwkJc2V0X2N1cnJlbnRfd2QocHRtcCk7CisJCS8qIElnbm9yZSBmYWlsdXJlIChoYXBwZW5zIGlmIHJlYWRvbmx5IG9yIGludGVnZXIpICovCisJCXNldHN0cihwd2RfcywgcHRtcCwgS1NIX1JFVFVSTl9FUlJPUik7CisJfSBlbHNlIHsKKwkJc2V0X2N1cnJlbnRfd2QobnVsbCk7CisJCXB3ZCA9IFhzdHJpbmcoeHMsIHhwKTsKKwkJLyogWFhYIHVuc2V0ICRQV0Q/ICovCisJfQorCWlmIChwcmludHBhdGggfHwgY2Rub2RlKQorCQlzaHByaW50ZigiJXNcbiIsIHB3ZCk7CisKKwlhZnJlZShhbGxvY2QsIEFURU1QKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK2NfcHdkKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgb3B0YzsKKwlib29sIHBoeXNpY2FsID0gRmxhZyhGUEhZU0lDQUwpID8gdHJ1ZSA6IGZhbHNlOworCWNoYXIgKnAsICphbGxvY2QgPSBOVUxMOworCisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAiTFAiKSkgIT0gLTEpCisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdMJzoKKwkJCXBoeXNpY2FsID0gZmFsc2U7CisJCQlicmVhazsKKwkJY2FzZSAnUCc6CisJCQlwaHlzaWNhbCA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlyZXR1cm4gKDEpOworCQl9CisJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCisJaWYgKHdwWzBdKSB7CisJCWJpX2Vycm9yZigidG9vIG1hbnkgYXJndW1lbnRzIik7CisJCXJldHVybiAoMSk7CisJfQorCXAgPSBjdXJyZW50X3dkWzBdID8gKHBoeXNpY2FsID8gYWxsb2NkID0gZG9fcmVhbHBhdGgoY3VycmVudF93ZCkgOgorCSAgICBjdXJyZW50X3dkKSA6IE5VTEw7CisJaWYgKHAgJiYgYWNjZXNzKHAsIFJfT0spIDwgMCkKKwkJcCA9IE5VTEw7CisJaWYgKCFwICYmICEocCA9IGFsbG9jZCA9IGtzaF9nZXRfd2QoTlVMTCkpKSB7CisJCWJpX2Vycm9yZigiY2FuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5IC0gJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKDEpOworCX0KKwlzaHByaW50ZigiJXNcbiIsIHApOworCWFmcmVlKGFsbG9jZCwgQVRFTVApOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzX3B0cjsKK3N0YXRpYyBpbnQgc19nZXQodm9pZCk7CitzdGF0aWMgdm9pZCBzX3B1dChpbnQpOworCitpbnQKK2NfcHJpbnQoY29uc3QgY2hhciAqKndwKQoreworI2RlZmluZSBQT19OTAkJQklUKDApCS8qIHByaW50IG5ld2xpbmUgKi8KKyNkZWZpbmUgUE9fRVhQQU5ECUJJVCgxKQkvKiBleHBhbmQgYmFja3NsYXNoIHNlcXVlbmNlcyAqLworI2RlZmluZSBQT19QTUlOVVNNSU5VUwlCSVQoMikJLyogcHJpbnQgYSAtLSBhcmd1bWVudCAqLworI2RlZmluZSBQT19ISVNUCQlCSVQoMykJLyogcHJpbnQgdG8gaGlzdG9yeSBpbnN0ZWFkIG9mIHN0ZG91dCAqLworI2RlZmluZSBQT19DT1BST0MJQklUKDQpCS8qIHByaW50aW5nIHRvIGNvcHJvY2VzczogYmxvY2sgU0lHUElQRSAqLworCWludCBmZCA9IDEsIGM7CisJaW50IGZsYWdzID0gUE9fRVhQQU5EfFBPX05MOworCWNvbnN0IGNoYXIgKnMsICplbXNnOworCVhTdHJpbmcgeHM7CisJY2hhciAqeHA7CisKKwlpZiAod3BbMF1bMF0gPT0gJ2UnKSB7CisJCS8qIGVjaG8gYnVpbHRpbiAqLworCQl3cCsrOworCQlpZiAoRmxhZyhGUE9TSVgpIHx8IEZsYWcoRlNIKSkgeworCQkJLyogRGViaWFuIFBvbGljeSAxMC40IGNvbXBsaWFudCAiZWNobyIgYnVpbHRpbiAqLworCQkJaWYgKCp3cCAmJiAhc3RyY21wKCp3cCwgIi1uIikpIHsKKwkJCQkvKiB3ZSByZWNvZ25pc2UgIi1uIiBvbmx5IGFzIHRoZSBmaXJzdCBhcmcgKi8KKwkJCQlmbGFncyA9IDA7CisJCQkJd3ArKzsKKwkJCX0gZWxzZQorCQkJCS8qIG90aGVyd2lzZSwgd2UgcHJpbnQgZXZlcnl0aGluZyBhcy1pcyAqLworCQkJCWZsYWdzID0gUE9fTkw7CisJCX0gZWxzZSB7CisJCQlpbnQgbmZsYWdzID0gZmxhZ3M7CisKKwkJCS8qKgorCQkJICogYSBjb21wcm9taXNlIGJldHdlZW4gc3lzViBhbmQgQlNEIGVjaG8gY29tbWFuZHM6CisJCQkgKiBlc2NhcGUgc2VxdWVuY2VzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQsIGFuZCAtbiwKKwkJCSAqIC1lIGFuZCAtRSBhcmUgcmVjb2duaXNlZCBpZiB0aGV5IGFwcGVhciBpbiBhcmd1LQorCQkJICogbWVudHMgd2l0aCBubyBpbGxlZ2FsIG9wdGlvbnMgKGllLCBlY2hvIC1ucSB3aWxsCisJCQkgKiBwcmludCAtbnEpLgorCQkJICogRGlmZmVyZW50IGZyb20gc3lzViBlY2hvIHNpbmNlIG9wdGlvbnMgYXJlIHJlY28tCisJCQkgKiBnbmlzZWQsIGRpZmZlcmVudCBmcm9tIEJTRCBlY2hvIHNpbmNlIGVzY2FwZSBzZS0KKwkJCSAqIHF1ZW5jZXMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KKwkJCSAqLworCisJCQl3aGlsZSAoKHMgPSAqd3ApICYmICpzID09ICctJyAmJiBzWzFdKSB7CisJCQkJd2hpbGUgKCorK3MpCisJCQkJCWlmICgqcyA9PSAnbicpCisJCQkJCQluZmxhZ3MgJj0gflBPX05MOworCQkJCQllbHNlIGlmICgqcyA9PSAnZScpCisJCQkJCQluZmxhZ3MgfD0gUE9fRVhQQU5EOworCQkJCQllbHNlIGlmICgqcyA9PSAnRScpCisJCQkJCQluZmxhZ3MgJj0gflBPX0VYUEFORDsKKwkJCQkJZWxzZQorCQkJCQkJLyoKKwkJCQkJCSAqIGJhZCBvcHRpb246IGRvbid0IHVzZQorCQkJCQkJICogbmZsYWdzLCBwcmludCBhcmd1bWVudAorCQkJCQkJICovCisJCQkJCQlicmVhazsKKworCQkJCWlmICgqcykKKwkJCQkJYnJlYWs7CisJCQkJd3ArKzsKKwkJCQlmbGFncyA9IG5mbGFnczsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWludCBvcHRjOworCQljb25zdCBjaGFyICpvcHRzID0gIlJucHJzdSwiOworCisJCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgb3B0cykpICE9IC0xKQorCQkJc3dpdGNoIChvcHRjKSB7CisJCQljYXNlICdSJzogLyogZmFrZSBCU0QgZWNobyBjb21tYW5kICovCisJCQkJZmxhZ3MgfD0gUE9fUE1JTlVTTUlOVVM7CisJCQkJZmxhZ3MgJj0gflBPX0VYUEFORDsKKwkJCQlvcHRzID0gIm5lIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2UnOgorCQkJCWZsYWdzIHw9IFBPX0VYUEFORDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ24nOgorCQkJCWZsYWdzICY9IH5QT19OTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3AnOgorCQkJCWlmICgoZmQgPSBjb3Byb2NfZ2V0ZmQoV19PSywgJmVtc2cpKSA8IDApIHsKKwkJCQkJYmlfZXJyb3JmKCItcDogJXMiLCBlbXNnKTsKKwkJCQkJcmV0dXJuICgxKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdyJzoKKwkJCQlmbGFncyAmPSB+UE9fRVhQQU5EOworCQkJCWJyZWFrOworCQkJY2FzZSAncyc6CisJCQkJZmxhZ3MgfD0gUE9fSElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3UnOgorCQkJCWlmICghKihzID0gYnVpbHRpbl9vcHQub3B0YXJnKSkKKwkJCQkJZmQgPSAwOworCQkJCWVsc2UgaWYgKChmZCA9IGNoZWNrX2ZkKHMsIFdfT0ssICZlbXNnKSkgPCAwKSB7CisJCQkJCWJpX2Vycm9yZigiLXU6ICVzOiAlcyIsIHMsIGVtc2cpOworCQkJCQlyZXR1cm4gKDEpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJz8nOgorCQkJCXJldHVybiAoMSk7CisJCQl9CisKKwkJaWYgKCEoYnVpbHRpbl9vcHQuaW5mbyAmIEdJX01JTlVTTUlOVVMpKSB7CisJCQkvKiB0cmVhdCBhIGxvbmUgLSBsaWtlIC0tICovCisJCQlpZiAod3BbYnVpbHRpbl9vcHQub3B0aW5kXSAmJgorCQkJICAgIGtzaF9pc2Rhc2god3BbYnVpbHRpbl9vcHQub3B0aW5kXSkpCisJCQkJYnVpbHRpbl9vcHQub3B0aW5kKys7CisJCX0gZWxzZSBpZiAoZmxhZ3MgJiBQT19QTUlOVVNNSU5VUykKKwkJCWJ1aWx0aW5fb3B0Lm9wdGluZC0tOworCQl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisJfQorCisJWGluaXQoeHMsIHhwLCAxMjgsIEFURU1QKTsKKworCXdoaWxlICgqd3AgIT0gTlVMTCkgeworCQlzID0gKndwOworCQl3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKSB7CisJCQlYY2hlY2soeHMsIHhwKTsKKwkJCWlmICgoZmxhZ3MgJiBQT19FWFBBTkQpICYmIGMgPT0gJ1xcJykgeworCQkJCXNfcHRyID0gczsKKwkJCQljID0gdW5ia3NsKGZhbHNlLCBzX2dldCwgc19wdXQpOworCQkJCXMgPSBzX3B0cjsKKwkJCQlpZiAoYyA9PSAtMSkgeworCQkJCQkvKiByZWplY3RlZCBieSBnZW5lcmljIGZ1bmN0aW9uICovCisJCQkJCXN3aXRjaCAoKGMgPSAqcysrKSkgeworCQkJCQljYXNlICdjJzoKKwkJCQkJCWZsYWdzICY9IH5QT19OTDsKKwkJCQkJCS8qIEFUJlQgYnJhaW4gZGFtYWdlICovCisJCQkJCQljb250aW51ZTsKKwkJCQkJY2FzZSAnXDAnOgorCQkJCQkJcy0tOworCQkJCQkJYyA9ICdcXCc7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCVhwdXQoeHMsIHhwLCAnXFwnKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoKHVuc2lnbmVkIGludCljID4gMHhGRikgeworCQkJCQkvKiBnZW5lcmljIGZ1bmN0aW9uIHJldHVybmVkIFVuaWNvZGUgKi8KKwkJCQkJY2hhciB0c1s0XTsKKworCQkJCQljID0gdXRmX3djdG9tYih0cywgYyAtIDB4MTAwKTsKKwkJCQkJdHNbY10gPSAwOworCQkJCQlmb3IgKGMgPSAwOyB0c1tjXTsgKytjKQorCQkJCQkJWHB1dCh4cywgeHAsIHRzW2NdKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJWHB1dCh4cywgeHAsIGMpOworCQl9CisJCWlmICgqKyt3cCAhPSBOVUxMKQorCQkJWHB1dCh4cywgeHAsICcgJyk7CisJfQorCWlmIChmbGFncyAmIFBPX05MKQorCQlYcHV0KHhzLCB4cCwgJ1xuJyk7CisKKwlpZiAoZmxhZ3MgJiBQT19ISVNUKSB7CisJCVhwdXQoeHMsIHhwLCAnXDAnKTsKKwkJaGlzdHNhdmUoJnNvdXJjZS0+bGluZSwgWHN0cmluZyh4cywgeHApLCB0cnVlLCBmYWxzZSk7CisJCVhmcmVlKHhzLCB4cCk7CisJfSBlbHNlIHsKKwkJaW50IGxlbiA9IFhsZW5ndGgoeHMsIHhwKTsKKwkJaW50IG9waXBlID0gMDsKKworCQkvKiBFbnN1cmUgd2UgYXJlbid0IGtpbGxlZCBieSBhIFNJR1BJUEUgd2hpbGUgd3JpdGluZyB0bworCQkgKiBhIGNvcHJvY2Vzcy4gQVQmVCBrc2ggZG9lc24ndCBzZWVtIHRvIGRvIHRoaXMgKHNlZW1zCisJCSAqIHRvIGp1c3QgY2hlY2sgdGhhdCB0aGUgY28tcHJvY2VzcyBpcyBhbGl2ZSB3aGljaCBpcworCQkgKiBub3QgZW5vdWdoKS4KKwkJICovCisJCWlmIChjb3Byb2Mud3JpdGUgPj0gMCAmJiBjb3Byb2Mud3JpdGUgPT0gZmQpIHsKKwkJCWZsYWdzIHw9IFBPX0NPUFJPQzsKKwkJCW9waXBlID0gYmxvY2tfcGlwZSgpOworCQl9CisJCWZvciAocyA9IFhzdHJpbmcoeHMsIHhwKTsgbGVuID4gMDsgKSB7CisJCQlpZiAoKGMgPSB3cml0ZShmZCwgcywgbGVuKSkgPCAwKSB7CisJCQkJaWYgKGZsYWdzICYgUE9fQ09QUk9DKQorCQkJCQlyZXN0b3JlX3BpcGUob3BpcGUpOworCQkJCWlmIChlcnJubyA9PSBFSU5UUikgeworCQkJCQkvKiBhbGxvdyB1c2VyIHRvIF5DIG91dCAqLworCQkJCQlpbnRyY2hlY2soKTsKKwkJCQkJaWYgKGZsYWdzICYgUE9fQ09QUk9DKQorCQkJCQkJb3BpcGUgPSBibG9ja19waXBlKCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQkJcyArPSBjOworCQkJbGVuIC09IGM7CisJCX0KKwkJaWYgKGZsYWdzICYgUE9fQ09QUk9DKQorCQkJcmVzdG9yZV9waXBlKG9waXBlKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitzX2dldCh2b2lkKQoreworCXJldHVybiAoKnNfcHRyKyspOworfQorCitzdGF0aWMgdm9pZAorc19wdXQoaW50IGMgTUtTSF9BX1VOVVNFRCkKK3sKKwktLXNfcHRyOworfQorCitpbnQKK2Nfd2hlbmNlKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlzdHJ1Y3QgdGJsICp0cDsKKwljb25zdCBjaGFyICppZDsKKwlib29sIHBmbGFnID0gZmFsc2UsIHZmbGFnID0gZmFsc2UsIFZmbGFnID0gZmFsc2U7CisJaW50IHJ2ID0gMCwgb3B0YywgZmNmbGFnczsKKwlib29sIGlhbV93aGVuY2UgPSB3cFswXVswXSA9PSAndyc7CisJY29uc3QgY2hhciAqb3B0cyA9IGlhbV93aGVuY2UgPyAicHYiIDogInB2ViI7CisKKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG9wdHMpKSAhPSAtMSkKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ3AnOgorCQkJcGZsYWcgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJdmZsYWcgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ1YnOgorCQkJVmZsYWcgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJcmV0dXJuICgxKTsKKwkJfQorCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKworCWZjZmxhZ3MgPSBGQ19CSSB8IEZDX1BBVEggfCBGQ19GVU5DOworCWlmICghaWFtX3doZW5jZSkgeworCQkvKiBOb3RlIHRoYXQgLXAgb24gaXRzIG93biBpcyBkZWFsIHdpdGggaW4gY29tZXhlYygpICovCisJCWlmIChwZmxhZykKKwkJCWZjZmxhZ3MgfD0gRkNfREVGUEFUSDsKKwkJLyogQ29udmVydCBjb21tYW5kIG9wdGlvbnMgdG8gd2hlbmNlIG9wdGlvbnMgLSBub3RlIHRoYXQKKwkJICogY29tbWFuZCAtcFYgdXNlcyBhIGRpZmZlcmVudCBwYXRoIHNlYXJjaCB0aGFuIHdoZW5jZSAtdgorCQkgKiBvciB3aGVuY2UgLXB2LiBUaGlzIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgZmVhdHVyZS4KKwkJICovCisJCXZmbGFnID0gVmZsYWc7CisJfQorCWlmIChwZmxhZykKKwkJZmNmbGFncyAmPSB+KEZDX0JJIHwgRkNfRlVOQyk7CisKKwl3aGlsZSAoKHZmbGFnIHx8IHJ2ID09IDApICYmIChpZCA9ICp3cCsrKSAhPSBOVUxMKSB7CisJCXVpbnQzMl90IGggPSAwOworCisJCXRwID0gTlVMTDsKKwkJaWYgKChpYW1fd2hlbmNlIHx8IHZmbGFnKSAmJiAhcGZsYWcpCisJCQl0cCA9IGt0c2VhcmNoKCZrZXl3b3JkcywgaWQsIGggPSBoYXNoKGlkKSk7CisJCWlmICghdHAgJiYgIXBmbGFnKSB7CisJCQl0cCA9IGt0c2VhcmNoKCZhbGlhc2VzLCBpZCwgaCA/IGggOiBoYXNoKGlkKSk7CisJCQlpZiAodHAgJiYgISh0cC0+ZmxhZyAmIElTU0VUKSkKKwkJCQl0cCA9IE5VTEw7CisJCX0KKwkJaWYgKCF0cCkKKwkJCXRwID0gZmluZGNvbShpZCwgZmNmbGFncyk7CisJCWlmICh2ZmxhZyB8fCAodHAtPnR5cGUgIT0gQ0FMSUFTICYmIHRwLT50eXBlICE9IENFWEVDICYmCisJCSAgICB0cC0+dHlwZSAhPSBDVEFMSUFTKSkKKwkJCXNoZl9wdXRzKGlkLCBzaGxfc3Rkb3V0KTsKKwkJc3dpdGNoICh0cC0+dHlwZSkgeworCQljYXNlIENLRVlXRDoKKwkJCWlmICh2ZmxhZykKKwkJCQlzaGZfcHV0cygiIGlzIGEgcmVzZXJ2ZWQgd29yZCIsIHNobF9zdGRvdXQpOworCQkJYnJlYWs7CisJCWNhc2UgQ0FMSUFTOgorCQkJaWYgKHZmbGFnKQorCQkJCXNocHJpbnRmKCIgaXMgYW4gJXNhbGlhcyBmb3IgIiwKKwkJCQkgICAgKHRwLT5mbGFnICYgRVhQT1JUKSA/ICJleHBvcnRlZCAiIDogbnVsbCk7CisJCQlpZiAoIWlhbV93aGVuY2UgJiYgIXZmbGFnKQorCQkJCXNocHJpbnRmKCJhbGlhcyAlcz0iLCBpZCk7CisJCQlwcmludF92YWx1ZV9xdW90ZWQodHAtPnZhbC5zKTsKKwkJCWJyZWFrOworCQljYXNlIENGVU5DOgorCQkJaWYgKHZmbGFnKSB7CisJCQkJc2hmX3B1dHMoIiBpcyBhIiwgc2hsX3N0ZG91dCk7CisJCQkJaWYgKHRwLT5mbGFnICYgRVhQT1JUKQorCQkJCQlzaGZfcHV0cygibiBleHBvcnRlZCIsIHNobF9zdGRvdXQpOworCQkJCWlmICh0cC0+ZmxhZyAmIFRSQUNFKQorCQkJCQlzaGZfcHV0cygiIHRyYWNlZCIsIHNobF9zdGRvdXQpOworCQkJCWlmICghKHRwLT5mbGFnICYgSVNTRVQpKSB7CisJCQkJCXNoZl9wdXRzKCIgdW5kZWZpbmVkIiwgc2hsX3N0ZG91dCk7CisJCQkJCWlmICh0cC0+dS5mcGF0aCkKKwkJCQkJCXNocHJpbnRmKCIgKGF1dG9sb2FkIGZyb20gJXMpIiwKKwkJCQkJCSAgICB0cC0+dS5mcGF0aCk7CisJCQkJfQorCQkJCXNoZl9wdXRzKCIgZnVuY3Rpb24iLCBzaGxfc3Rkb3V0KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENTSEVMTDoKKwkJCWlmICh2ZmxhZykKKwkJCQlzaHByaW50ZigiIGlzIGElcyBzaGVsbCBidWlsdGluIiwKKwkJCQkgICAgKHRwLT5mbGFnICYgU1BFQ19CSSkgPyAiIHNwZWNpYWwiIDogbnVsbCk7CisJCQlicmVhazsKKwkJY2FzZSBDVEFMSUFTOgorCQljYXNlIENFWEVDOgorCQkJaWYgKHRwLT5mbGFnICYgSVNTRVQpIHsKKwkJCQlpZiAodmZsYWcpIHsKKwkJCQkJc2hmX3B1dHMoIiBpcyAiLCBzaGxfc3Rkb3V0KTsKKwkJCQkJaWYgKHRwLT50eXBlID09IENUQUxJQVMpCisJCQkJCQlzaHByaW50ZigiYSB0cmFja2VkICVzYWxpYXMgZm9yICIsCisJCQkJCQkgICAgKHRwLT5mbGFnICYgRVhQT1JUKSA/CisJCQkJCQkgICAgImV4cG9ydGVkICIgOiBudWxsKTsKKwkJCQl9CisJCQkJc2hmX3B1dHModHAtPnZhbC5zLCBzaGxfc3Rkb3V0KTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHZmbGFnKQorCQkJCQlzaGZfcHV0cygiIG5vdCBmb3VuZCIsIHNobF9zdGRvdXQpOworCQkJCXJ2ID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc2hwcmludGYoIiVzIGlzICpHT0sqIiwgaWQpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHZmbGFnIHx8ICFydikKKwkJCXNoZl9wdXRjKCdcbicsIHNobF9zdGRvdXQpOworCX0KKwlyZXR1cm4gKHJ2KTsKK30KKworLyogRGVhbCB3aXRoIGNvbW1hbmQgLXZWIC0gY29tbWFuZCAtcCBkZWFsdCB3aXRoIGluIGNvbWV4ZWMoKSAqLworaW50CitjX2NvbW1hbmQoY29uc3QgY2hhciAqKndwKQoreworCS8qIExldCBjX3doZW5jZSBkbyB0aGUgd29yay4gTm90ZSB0aGF0IGNfY29tbWFuZCgpIG11c3QgYmUKKwkgKiBhIGRpc3RpbmN0IGZ1bmN0aW9uIGZyb20gY193aGVuY2UoKSAodGVzdGVkIGluIGNvbWV4ZWMoKSkuCisJICovCisJcmV0dXJuIChjX3doZW5jZSh3cCkpOworfQorCisvKiB0eXBlc2V0LCBleHBvcnQsIGFuZCByZWFkb25seSAqLworaW50CitjX3R5cGVzZXQoY29uc3QgY2hhciAqKndwKQoreworCXN0cnVjdCBibG9jayAqbDsKKwlzdHJ1Y3QgdGJsICp2cCwgKipwOworCVRmbGFnIGZzZXQgPSAwLCBmY2xyID0gMCwgZmxhZzsKKwlpbnQgdGhpbmcgPSAwLCBmaWVsZCwgYmFzZSwgb3B0YzsKKwljb25zdCBjaGFyICpvcHRzOworCWNvbnN0IGNoYXIgKmZpZWxkc3RyLCAqYmFzZXN0cjsKKwlib29sIGxvY2FsdiA9IGZhbHNlLCBmdW5jID0gZmFsc2UsIHBmbGFnID0gZmFsc2UsIGlzdHNldCA9IHRydWU7CisKKwlzd2l0Y2ggKCoqd3ApIHsKKwljYXNlICdlJzoJCS8qIGV4cG9ydCAqLworCQlmc2V0IHw9IEVYUE9SVDsKKwkJaXN0c2V0ID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgJ3InOgkJLyogcmVhZG9ubHkgKi8KKwkJZnNldCB8PSBSRE9OTFk7CisJCWlzdHNldCA9IGZhbHNlOworCQlicmVhazsKKwljYXNlICdzJzoJCS8qIHNldCAqLworCQkvKiBjYWxsZWQgd2l0aCAndHlwZXNldCAtJyAqLworCQlicmVhazsKKwljYXNlICd0JzoJCS8qIHR5cGVzZXQgKi8KKwkJbG9jYWx2ID0gdHJ1ZTsKKwkJYnJlYWs7CisJfQorCisJLyogc2VlIGNvbW1lbnQgYmVsb3cgcmVnYXJkaW5nIHBvc3NpYmxlIG9waW9ucyAqLworCW9wdHMgPSBpc3RzZXQgPyAiTCNSI1VaI2FmaSNsbnBydHV4IiA6ICJwIjsKKworCWZpZWxkc3RyID0gYmFzZXN0ciA9IE5VTEw7CisJYnVpbHRpbl9vcHQuZmxhZ3MgfD0gR0ZfUExVU09QVDsKKwkvKiBBVCZUIGtzaCBzZWVtcyB0byBoYXZlIDAtOSBhcyBvcHRpb25zIHdoaWNoIGFyZSBtdWx0aXBsaWVkCisJICogdG8gZ2V0IGEgbnVtYmVyIHRoYXQgaXMgdXNlZCB3aXRoIC1MLCAtUiwgLVogb3IgLWkgKGVnLCAtMVIyCisJICogc2V0cyByaWdodCBqdXN0aWZ5IGluIGEgZmllbGQgb2YgMTIpLiBUaGlzIGFsbG93cyBvcHRpb25zCisJICogdG8gYmUgZ3JvdXBlZCBpbiBhbiBvcmRlciAoZWcsIC1MdTEyKSwgYnV0IGRpc2FsbG93cyAtaTggLUwzIGFuZAorCSAqIGRvZXMgbm90IGFsbG93IHRoZSBudW1iZXIgdG8gYmUgc3BlY2lmaWVkIGFzIGEgc2VwYXJhdGUgYXJndW1lbnQKKwkgKiBIZXJlLCB0aGUgbnVtYmVyIG11c3QgZm9sbG93IHRoZSBSTFppIG9wdGlvbiwgYnV0IGlzIG9wdGlvbmFsCisJICogKHNlZSB0aGUgIyBrbHVkZ2UgaW4ga3NoX2dldG9wdCgpKS4KKwkgKi8KKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG9wdHMpKSAhPSAtMSkgeworCQlmbGFnID0gMDsKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ0wnOgorCQkJZmxhZyA9IExKVVNUOworCQkJZmllbGRzdHIgPSBidWlsdGluX29wdC5vcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnUic6CisJCQlmbGFnID0gUkpVU1Q7CisJCQlmaWVsZHN0ciA9IGJ1aWx0aW5fb3B0Lm9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdVJzoKKwkJCS8qIEFUJlQga3NoIHVzZXMgdSwgYnV0IHRoaXMgY29uZmxpY3RzIHdpdGgKKwkJCSAqIHVwcGVyL2xvd2VyIGNhc2UuIElmIHRoaXMgb3B0aW9uIGlzIGNoYW5nZWQsCisJCQkgKiBuZWVkIHRvIGNoYW5nZSB0aGUgLVUgYmVsb3cgYXMgd2VsbAorCQkJICovCisJCQlmbGFnID0gSU5UX1U7CisJCQlicmVhazsKKwkJY2FzZSAnWic6CisJCQlmbGFnID0gWkVST0ZJTDsKKwkJCWZpZWxkc3RyID0gYnVpbHRpbl9vcHQub3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2EnOgorCQkJLyoKKwkJCSAqIHRoaXMgaXMgc3VwcG9zZWQgdG8gc2V0ICgtYSkgb3IgdW5zZXQgKCthKSB0aGUKKwkJCSAqIGluZGV4ZWQgYXJyYXkgYXR0cmlidXRlOyBpdCBkb2VzIG5vdGhpbmcgb24gYW4KKwkJCSAqIGV4aXN0aW5nIHJlZ3VsYXIgc3RyaW5nIG9yIGluZGV4ZWQgYXJyYXkgdGhvdWdoCisJCQkgKi8KKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWZ1bmMgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJZmxhZyA9IElOVEVHRVI7CisJCQliYXNlc3RyID0gYnVpbHRpbl9vcHQub3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJZmxhZyA9IExDQVNFVjsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCXNldF9yZWZmbGFnID0gKGJ1aWx0aW5fb3B0LmluZm8gJiBHSV9QTFVTKSA/IDIgOiAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJLyogZXhwb3J0LCByZWFkb25seTogUE9TSVggLXAgZmxhZyAqLworCQkJLyogdHlwZXNldDogc2hvdyB2YWx1ZXMgYXMgd2VsbCAqLworCQkJcGZsYWcgPSB0cnVlOworCQkJaWYgKGlzdHNldCkKKwkJCQljb250aW51ZTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCWZsYWcgPSBSRE9OTFk7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlmbGFnID0gVFJBQ0U7CisJCQlicmVhazsKKwkJY2FzZSAndSc6CisJCQlmbGFnID0gVUNBU0VWX0FMOwkvKiB1cHBlciBjYXNlIC8gYXV0b2xvYWQgKi8KKwkJCWJyZWFrOworCQljYXNlICd4JzoKKwkJCWZsYWcgPSBFWFBPUlQ7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlyZXR1cm4gKDEpOworCQl9CisJCWlmIChidWlsdGluX29wdC5pbmZvICYgR0lfUExVUykgeworCQkJZmNsciB8PSBmbGFnOworCQkJZnNldCAmPSB+ZmxhZzsKKwkJCXRoaW5nID0gJysnOworCQl9IGVsc2UgeworCQkJZnNldCB8PSBmbGFnOworCQkJZmNsciAmPSB+ZmxhZzsKKwkJCXRoaW5nID0gJy0nOworCQl9CisJfQorCisJZmllbGQgPSAwOworCWlmIChmaWVsZHN0ciAmJiAhYmlfZ2V0bihmaWVsZHN0ciwgJmZpZWxkKSkKKwkJcmV0dXJuICgxKTsKKwliYXNlID0gMDsKKwlpZiAoYmFzZXN0ciAmJiAhYmlfZ2V0bihiYXNlc3RyLCAmYmFzZSkpCisJCXJldHVybiAoMSk7CisKKwlpZiAoIShidWlsdGluX29wdC5pbmZvICYgR0lfTUlOVVNNSU5VUykgJiYgd3BbYnVpbHRpbl9vcHQub3B0aW5kXSAmJgorCSAgICAod3BbYnVpbHRpbl9vcHQub3B0aW5kXVswXSA9PSAnLScgfHwKKwkgICAgd3BbYnVpbHRpbl9vcHQub3B0aW5kXVswXSA9PSAnKycpICYmCisJICAgIHdwW2J1aWx0aW5fb3B0Lm9wdGluZF1bMV0gPT0gJ1wwJykgeworCQl0aGluZyA9IHdwW2J1aWx0aW5fb3B0Lm9wdGluZF1bMF07CisJCWJ1aWx0aW5fb3B0Lm9wdGluZCsrOworCX0KKworCWlmIChmdW5jICYmICgoKGZzZXR8ZmNscikgJiB+KFRSQUNFfFVDQVNFVl9BTHxFWFBPUlQpKSB8fCBzZXRfcmVmZmxhZykpIHsKKwkJYmlfZXJyb3JmKCJvbmx5IC10LCAtdSBhbmQgLXggb3B0aW9ucyBtYXkgYmUgdXNlZCB3aXRoIC1mIik7CisJCXNldF9yZWZmbGFnID0gMDsKKwkJcmV0dXJuICgxKTsKKwl9CisJaWYgKHdwW2J1aWx0aW5fb3B0Lm9wdGluZF0pIHsKKwkJLyogVGFrZSBjYXJlIG9mIGV4Y2x1c2lvbnMuCisJCSAqIEF0IHRoaXMgcG9pbnQsIGZsYWdzIGluIGZzZXQgYXJlIGNsZWFyZWQgaW4gZmNsciBhbmQgdmljZQorCQkgKiB2ZXJzYS4gVGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgcHJlc2VydmVkLgorCQkgKi8KKwkJaWYgKGZzZXQgJiBMQ0FTRVYpCS8qIExDQVNFViBoYXMgcHJpb3JpdHkgb3ZlciBVQ0FTRVZfQUwgKi8KKwkJCWZzZXQgJj0gflVDQVNFVl9BTDsKKwkJaWYgKGZzZXQgJiBMSlVTVCkJLyogTEpVU1QgaGFzIHByaW9yaXR5IG92ZXIgUkpVU1QgKi8KKwkJCWZzZXQgJj0gflJKVVNUOworCQlpZiAoKGZzZXQgJiAoWkVST0ZJTHxMSlVTVCkpID09IFpFUk9GSUwpIHsgLyogLVogaW1wbGllcyAtWlIgKi8KKwkJCWZzZXQgfD0gUkpVU1Q7CisJCQlmY2xyICY9IH5SSlVTVDsKKwkJfQorCQkvKiBTZXR0aW5nIHRoZXNlIGF0dHJpYnV0ZXMgY2xlYXJzIHRoZSBvdGhlcnMsIHVubGVzcyB0aGV5CisJCSAqIGFyZSBhbHNvIHNldCBpbiB0aGlzIGNvbW1hbmQKKwkJICovCisJCWlmICgoZnNldCAmIChMSlVTVCB8IFJKVVNUIHwgWkVST0ZJTCB8IFVDQVNFVl9BTCB8IExDQVNFViB8CisJCSAgICBJTlRFR0VSIHwgSU5UX1UgfCBJTlRfTCkpIHx8IHNldF9yZWZmbGFnKQorCQkJZmNsciB8PSB+ZnNldCAmIChMSlVTVCB8IFJKVVNUIHwgWkVST0ZJTCB8IFVDQVNFVl9BTCB8CisJCQkgICAgTENBU0VWIHwgSU5URUdFUiB8IElOVF9VIHwgSU5UX0wpOworCX0KKworCS8qIHNldCB2YXJpYWJsZXMgYW5kIGF0dHJpYnV0ZXMgKi8KKwlpZiAod3BbYnVpbHRpbl9vcHQub3B0aW5kXSkgeworCQlpbnQgaSwgcnYgPSAwOworCQlzdHJ1Y3QgdGJsICpmOworCisJCWlmIChsb2NhbHYgJiYgIWZ1bmMpCisJCQlmc2V0IHw9IExPQ0FMOworCQlmb3IgKGkgPSBidWlsdGluX29wdC5vcHRpbmQ7IHdwW2ldOyBpKyspIHsKKwkJCWlmIChmdW5jKSB7CisJCQkJZiA9IGZpbmRmdW5jKHdwW2ldLCBoYXNoKHdwW2ldKSwKKwkJCQkgICAgKGZzZXQmVUNBU0VWX0FMKSA/IHRydWUgOiBmYWxzZSk7CisJCQkJaWYgKCFmKSB7CisJCQkJCS8qIEFUJlQga3NoIGRvZXMgKytydjogYm9ndXMgKi8KKwkJCQkJcnYgPSAxOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKGZzZXQgfCBmY2xyKSB7CisJCQkJCWYtPmZsYWcgfD0gZnNldDsKKwkJCQkJZi0+ZmxhZyAmPSB+ZmNscjsKKwkJCQl9IGVsc2UKKwkJCQkJZnB0cmVlZihzaGxfc3Rkb3V0LCAwLAorCQkJCQkgICAgZi0+ZmxhZyAmIEZLU0ggPworCQkJCQkgICAgImZ1bmN0aW9uICVzICVUXG4iIDoKKwkJCQkJICAgICIlcygpICVUXG4iLCB3cFtpXSwgZi0+dmFsLnQpOworCQkJfSBlbHNlIGlmICghdHlwZXNldCh3cFtpXSwgZnNldCwgZmNsciwgZmllbGQsIGJhc2UpKSB7CisJCQkJYmlfZXJyb3JmKCIlczogbm90IGlkZW50aWZpZXIiLCB3cFtpXSk7CisJCQkJc2V0X3JlZmZsYWcgPSAwOworCQkJCXJldHVybiAoMSk7CisJCQl9CisJCX0KKwkJc2V0X3JlZmZsYWcgPSAwOworCQlyZXR1cm4gKHJ2KTsKKwl9CisKKwkvKiBsaXN0IHZhcmlhYmxlcyBhbmQgYXR0cmlidXRlcyAqLworCWZsYWcgPSBmc2V0IHwgZmNscjsgLyogbm8gZGlmZmVyZW5jZSBhdCB0aGlzIHBvaW50Li4gKi8KKwlpZiAoZnVuYykgeworCQlmb3IgKGwgPSBlLT5sb2M7IGw7IGwgPSBsLT5uZXh0KSB7CisJCQlmb3IgKHAgPSBrdHNvcnQoJmwtPmZ1bnMpOyAodnAgPSAqcCsrKTsgKSB7CisJCQkJaWYgKGZsYWcgJiYgKHZwLT5mbGFnICYgZmxhZykgPT0gMCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHRoaW5nID09ICctJykKKwkJCQkJZnB0cmVlZihzaGxfc3Rkb3V0LCAwLCB2cC0+ZmxhZyAmIEZLU0ggPworCQkJCQkgICAgImZ1bmN0aW9uICVzICVUXG4iIDogIiVzKCkgJVRcbiIsCisJCQkJCSAgICB2cC0+bmFtZSwgdnAtPnZhbC50KTsKKwkJCQllbHNlCisJCQkJCXNocHJpbnRmKCIlc1xuIiwgdnAtPm5hbWUpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yIChsID0gZS0+bG9jOyBsOyBsID0gbC0+bmV4dCkgeworCQkJZm9yIChwID0ga3Rzb3J0KCZsLT52YXJzKTsgKHZwID0gKnArKyk7ICkgeworCQkJCXN0cnVjdCB0YmwgKnR2cDsKKwkJCQlib29sIGFueV9zZXQgPSBmYWxzZTsKKwkJCQkvKgorCQkJCSAqIFNlZSBpZiB0aGUgcGFyYW1ldGVyIGlzIHNldCAoZm9yIGFycmF5cywgaWYgYW55CisJCQkJICogZWxlbWVudCBpcyBzZXQpLgorCQkJCSAqLworCQkJCWZvciAodHZwID0gdnA7IHR2cDsgdHZwID0gdHZwLT51LmFycmF5KQorCQkJCQlpZiAodHZwLT5mbGFnICYgSVNTRVQpIHsKKwkJCQkJCWFueV9zZXQgPSB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCS8qCisJCQkJICogQ2hlY2sgYXR0cmlidXRlcyAtIG5vdGUgdGhhdCBhbGwgYXJyYXkgZWxlbWVudHMKKwkJCQkgKiBoYXZlIChzaG91bGQgaGF2ZT8pIHRoZSBzYW1lIGF0dHJpYnV0ZXMsIHNvIGNoZWNraW5nCisJCQkJICogdGhlIGZpcnN0IGlzIHN1ZmZpY2llbnQuCisJCQkJICoKKwkJCQkgKiBSZXBvcnQgYW4gdW5zZXQgcGFyYW0gb25seSBpZiB0aGUgdXNlciBoYXMKKwkJCQkgKiBleHBsaWNpdGx5IGdpdmVuIGl0IHNvbWUgYXR0cmlidXRlIChsaWtlIGV4cG9ydCk7CisJCQkJICogb3RoZXJ3aXNlLCBhZnRlciAiZWNobyAkRk9PIiwgd2Ugd291bGQgcmVwb3J0IEZPTy4uLgorCQkJCSAqLworCQkJCWlmICghYW55X3NldCAmJiAhKHZwLT5mbGFnICYgVVNFUkFUVFJJQikpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChmbGFnICYmICh2cC0+ZmxhZyAmIGZsYWcpID09IDApCisJCQkJCWNvbnRpbnVlOworCQkJCWZvciAoOyB2cDsgdnAgPSB2cC0+dS5hcnJheSkgeworCQkJCQkvKiBJZ25vcmUgYXJyYXkgZWxlbWVudHMgdGhhdCBhcmVuJ3QKKwkJCQkJICogc2V0IHVubGVzcyB0aGVyZSBhcmUgbm8gc2V0IGVsZW1lbnRzLAorCQkJCQkgKiBpbiB3aGljaCBjYXNlIHRoZSBmaXJzdCBpcyByZXBvcnRlZCBvbiAqLworCQkJCQlpZiAoKHZwLT5mbGFnJkFSUkFZKSAmJiBhbnlfc2V0ICYmCisJCQkJCSAgICAhKHZwLT5mbGFnICYgSVNTRVQpKQorCQkJCQkJY29udGludWU7CisJCQkJCS8qIG5vIGFyZ3VtZW50cyAqLworCQkJCQlpZiAodGhpbmcgPT0gMCAmJiBmbGFnID09IDApIHsKKwkJCQkJCS8qIEFUJlQga3NoIHByaW50cyB0aGluZ3MKKwkJCQkJCSAqIGxpa2UgZXhwb3J0LCBpbnRlZ2VyLAorCQkJCQkJICogbGVmdGFkaiwgemVyb2ZpbGwsIGV0Yy4sCisJCQkJCQkgKiBidXQgUE9TSVggc2F5cyBtdXN0CisJCQkJCQkgKiBiZSBzdWl0YWJsZSBmb3IgcmUtZW50cnkuLi4KKwkJCQkJCSAqLworCQkJCQkJc2hmX3B1dHMoInR5cGVzZXQgIiwgc2hsX3N0ZG91dCk7CisJCQkJCQlpZiAoKCh2cC0+ZmxhZyYoQVJSQVl8QVNTT0MpKT09QVNTT0MpKQorCQkJCQkJCXNoZl9wdXRzKCItbiAiLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCWlmICgodnAtPmZsYWcmSU5URUdFUikpCisJCQkJCQkJc2hmX3B1dHMoIi1pICIsIHNobF9zdGRvdXQpOworCQkJCQkJaWYgKCh2cC0+ZmxhZyZFWFBPUlQpKQorCQkJCQkJCXNoZl9wdXRzKCIteCAiLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCWlmICgodnAtPmZsYWcmUkRPTkxZKSkKKwkJCQkJCQlzaGZfcHV0cygiLXIgIiwgc2hsX3N0ZG91dCk7CisJCQkJCQlpZiAoKHZwLT5mbGFnJlRSQUNFKSkKKwkJCQkJCQlzaGZfcHV0cygiLXQgIiwgc2hsX3N0ZG91dCk7CisJCQkJCQlpZiAoKHZwLT5mbGFnJkxKVVNUKSkKKwkJCQkJCQlzaHByaW50ZigiLUwlZCAiLCB2cC0+dTIuZmllbGQpOworCQkJCQkJaWYgKCh2cC0+ZmxhZyZSSlVTVCkpCisJCQkJCQkJc2hwcmludGYoIi1SJWQgIiwgdnAtPnUyLmZpZWxkKTsKKwkJCQkJCWlmICgodnAtPmZsYWcmWkVST0ZJTCkpCisJCQkJCQkJc2hmX3B1dHMoIi1aICIsIHNobF9zdGRvdXQpOworCQkJCQkJaWYgKCh2cC0+ZmxhZyZMQ0FTRVYpKQorCQkJCQkJCXNoZl9wdXRzKCItbCAiLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCWlmICgodnAtPmZsYWcmVUNBU0VWX0FMKSkKKwkJCQkJCQlzaGZfcHV0cygiLXUgIiwgc2hsX3N0ZG91dCk7CisJCQkJCQlpZiAoKHZwLT5mbGFnJklOVF9VKSkKKwkJCQkJCQlzaGZfcHV0cygiLVUgIiwgc2hsX3N0ZG91dCk7CisJCQkJCQlzaGZfcHV0cyh2cC0+bmFtZSwgc2hsX3N0ZG91dCk7CisJCQkJCQlpZiAocGZsYWcpIHsKKwkJCQkJCQljaGFyICpzID0gc3RyX3ZhbCh2cCk7CisKKwkJCQkJCQlzaGZfcHV0YygnPScsIHNobF9zdGRvdXQpOworCQkJCQkJCS8qIEFUJlQga3NoIGNhbid0IGhhdmUKKwkJCQkJCQkgKiBqdXN0aWZpZWQgaW50ZWdlcnMuLiAqLworCQkJCQkJCWlmICgodnAtPmZsYWcgJgorCQkJCQkJCSAgICAoSU5URUdFUnxMSlVTVHxSSlVTVCkpID09CisJCQkJCQkJICAgIElOVEVHRVIpCisJCQkJCQkJCXNoZl9wdXRzKHMsIHNobF9zdGRvdXQpOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcHJpbnRfdmFsdWVfcXVvdGVkKHMpOworCQkJCQkJfQorCQkJCQkJc2hmX3B1dGMoJ1xuJywgc2hsX3N0ZG91dCk7CisJCQkJCQlpZiAodnAtPmZsYWcgJiBBUlJBWSkKKwkJCQkJCQlicmVhazsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChwZmxhZykKKwkJCQkJCQlzaGZfcHV0cyhpc3RzZXQgPworCQkJCQkJCSAgICAidHlwZXNldCAiIDoKKwkJCQkJCQkgICAgKGZsYWcgJiBFWFBPUlQpID8KKwkJCQkJCQkgICAgImV4cG9ydCAiIDoKKwkJCQkJCQkgICAgInJlYWRvbmx5ICIsCisJCQkJCQkJICAgIHNobF9zdGRvdXQpOworCQkJCQkJaWYgKCh2cC0+ZmxhZyZBUlJBWSkgJiYgYW55X3NldCkKKwkJCQkJCQlzaHByaW50ZigiJXNbJWx1XSIsCisJCQkJCQkJICAgIHZwLT5uYW1lLAorCQkJCQkJCSAgICBhcnJheWluZGV4KHZwKSk7CisJCQkJCQllbHNlCisJCQkJCQkJc2hmX3B1dHModnAtPm5hbWUsIHNobF9zdGRvdXQpOworCQkJCQkJaWYgKHRoaW5nID09ICctJyAmJiAodnAtPmZsYWcmSVNTRVQpKSB7CisJCQkJCQkJY2hhciAqcyA9IHN0cl92YWwodnApOworCisJCQkJCQkJc2hmX3B1dGMoJz0nLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCQkvKiBBVCZUIGtzaCBjYW4ndCBoYXZlCisJCQkJCQkJICoganVzdGlmaWVkIGludGVnZXJzLi4gKi8KKwkJCQkJCQlpZiAoKHZwLT5mbGFnICYKKwkJCQkJCQkgICAgKElOVEVHRVJ8TEpVU1R8UkpVU1QpKSA9PQorCQkJCQkJCSAgICBJTlRFR0VSKQorCQkJCQkJCQlzaGZfcHV0cyhzLCBzaGxfc3Rkb3V0KTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXByaW50X3ZhbHVlX3F1b3RlZChzKTsKKwkJCQkJCX0KKwkJCQkJCXNoZl9wdXRjKCdcbicsIHNobF9zdGRvdXQpOworCQkJCQl9CisJCQkJCS8qIE9ubHkgcmVwb3J0IGZpcnN0ICdlbGVtZW50JyBvZiBhbiBhcnJheSB3aXRoCisJCQkJCSAqIG5vIHNldCBlbGVtZW50cy4KKwkJCQkJICovCisJCQkJCWlmICghYW55X3NldCkKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gKDApOworfQorCitpbnQKK2NfYWxpYXMoY29uc3QgY2hhciAqKndwKQoreworCXN0cnVjdCB0YWJsZSAqdCA9ICZhbGlhc2VzOworCWludCBydiA9IDAsIHByZWZpeCA9IDA7CisJYm9vbCByZmxhZyA9IGZhbHNlLCB0ZmxhZywgVWZsYWcgPSBmYWxzZSwgcGZsYWcgPSBmYWxzZTsKKwlUZmxhZyB4ZmxhZyA9IDA7CisJaW50IG9wdGM7CisKKwlidWlsdGluX29wdC5mbGFncyB8PSBHRl9QTFVTT1BUOworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgImRwcnRVeCIpKSAhPSAtMSkgeworCQlwcmVmaXggPSBidWlsdGluX29wdC5pbmZvICYgR0lfUExVUyA/ICcrJyA6ICctJzsKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ2QnOgorI2lmZGVmIE1LU0hfTk9QV05BTQorCQkJdCA9IE5VTEw7CS8qIGZpeCAiYWxpYXMgLWR0IiAqLworI2Vsc2UKKwkJCXQgPSAmaG9tZWRpcnM7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCXBmbGFnID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXJmbGFnID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCXQgPSAmdGFsaWFzZXM7CisJCQlicmVhazsKKwkJY2FzZSAnVSc6CisJCQkvKgorCQkJICoga2x1ZGdlIGZvciB0cmFja2VkIGFsaWFzIGluaXRpYWxpemF0aW9uCisJCQkgKiAoZG9uJ3QgZG8gYSBwYXRoIHNlYXJjaCwganVzdCBtYWtlIGFuIGVudHJ5KQorCQkJICovCisJCQlVZmxhZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAneCc6CisJCQl4ZmxhZyA9IEVYUE9SVDsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9CisjaWZkZWYgTUtTSF9OT1BXTkFNCisJaWYgKHQgPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKyNlbmRpZgorCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKworCWlmICghKGJ1aWx0aW5fb3B0LmluZm8gJiBHSV9NSU5VU01JTlVTKSAmJiAqd3AgJiYKKwkgICAgKHdwWzBdWzBdID09ICctJyB8fCB3cFswXVswXSA9PSAnKycpICYmIHdwWzBdWzFdID09ICdcMCcpIHsKKwkJcHJlZml4ID0gd3BbMF1bMF07CisJCXdwKys7CisJfQorCisJdGZsYWcgPSB0ID09ICZ0YWxpYXNlczsKKworCS8qICJoYXNoIC1yIiBtZWFucyByZXNldCBhbGwgdGhlIHRyYWNrZWQgYWxpYXNlcy4uICovCisJaWYgKHJmbGFnKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICphcmdzW10gPSB7CisJCQkidW5hbGlhcyIsICItdGEiLCBOVUxMCisJCX07CisKKwkJaWYgKCF0ZmxhZyB8fCAqd3ApIHsKKwkJCXNoZl9wdXRzKCJhbGlhczogLXIgZmxhZyBjYW4gb25seSBiZSB1c2VkIHdpdGggLXQiCisJCQkgICAgIiBhbmQgd2l0aG91dCBhcmd1bWVudHNcbiIsIHNobF9zdGRvdXQpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCQlrc2hfZ2V0b3B0X3Jlc2V0KCZidWlsdGluX29wdCwgR0ZfRVJST1IpOworCQlyZXR1cm4gKGNfdW5hbGlhcyhhcmdzKSk7CisJfQorCisJaWYgKCp3cCA9PSBOVUxMKSB7CisJCXN0cnVjdCB0YmwgKmFwLCAqKnA7CisKKwkJZm9yIChwID0ga3Rzb3J0KHQpOyAoYXAgPSAqcCsrKSAhPSBOVUxMOyApCisJCQlpZiAoKGFwLT5mbGFnICYgKElTU0VUfHhmbGFnKSkgPT0gKElTU0VUfHhmbGFnKSkgeworCQkJCWlmIChwZmxhZykKKwkJCQkJc2hmX3B1dHMoImFsaWFzICIsIHNobF9zdGRvdXQpOworCQkJCXNoZl9wdXRzKGFwLT5uYW1lLCBzaGxfc3Rkb3V0KTsKKwkJCQlpZiAocHJlZml4ICE9ICcrJykgeworCQkJCQlzaGZfcHV0YygnPScsIHNobF9zdGRvdXQpOworCQkJCQlwcmludF92YWx1ZV9xdW90ZWQoYXAtPnZhbC5zKTsKKwkJCQl9CisJCQkJc2hmX3B1dGMoJ1xuJywgc2hsX3N0ZG91dCk7CisJCQl9CisJfQorCisJZm9yICg7ICp3cCAhPSBOVUxMOyB3cCsrKSB7CisJCWNvbnN0IGNoYXIgKmFsaWFzID0gKndwLCAqdmFsLCAqbmV3dmFsOworCQljaGFyICp4YWxpYXMgPSBOVUxMOworCQlzdHJ1Y3QgdGJsICphcDsKKwkJdWludDMyX3QgaDsKKworCQlpZiAoKHZhbCA9IGNzdHJjaHIoYWxpYXMsICc9JykpKSB7CisJCQlzdHJuZHVweCh4YWxpYXMsIGFsaWFzLCB2YWwrKyAtIGFsaWFzLCBBVEVNUCk7CisJCQlhbGlhcyA9IHhhbGlhczsKKwkJfQorCQloID0gaGFzaChhbGlhcyk7CisJCWlmICh2YWwgPT0gTlVMTCAmJiAhdGZsYWcgJiYgIXhmbGFnKSB7CisJCQlhcCA9IGt0c2VhcmNoKHQsIGFsaWFzLCBoKTsKKwkJCWlmIChhcCAhPSBOVUxMICYmIChhcC0+ZmxhZyZJU1NFVCkpIHsKKwkJCQlpZiAocGZsYWcpCisJCQkJCXNoZl9wdXRzKCJhbGlhcyAiLCBzaGxfc3Rkb3V0KTsKKwkJCQlzaGZfcHV0cyhhcC0+bmFtZSwgc2hsX3N0ZG91dCk7CisJCQkJaWYgKHByZWZpeCAhPSAnKycpIHsKKwkJCQkJc2hmX3B1dGMoJz0nLCBzaGxfc3Rkb3V0KTsKKwkJCQkJcHJpbnRfdmFsdWVfcXVvdGVkKGFwLT52YWwucyk7CisJCQkJfQorCQkJCXNoZl9wdXRjKCdcbicsIHNobF9zdGRvdXQpOworCQkJfSBlbHNlIHsKKwkJCQlzaHByaW50ZigiJXMgYWxpYXMgbm90IGZvdW5kXG4iLCBhbGlhcyk7CisJCQkJcnYgPSAxOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJYXAgPSBrdGVudGVyKHQsIGFsaWFzLCBoKTsKKwkJYXAtPnR5cGUgPSB0ZmxhZyA/IENUQUxJQVMgOiBDQUxJQVM7CisJCS8qIEFyZSB3ZSBzZXR0aW5nIHRoZSB2YWx1ZSBvciBqdXN0IHNvbWUgZmxhZ3M/ICovCisJCWlmICgodmFsICYmICF0ZmxhZykgfHwgKCF2YWwgJiYgdGZsYWcgJiYgIVVmbGFnKSkgeworCQkJaWYgKGFwLT5mbGFnJkFMTE9DKSB7CisJCQkJYXAtPmZsYWcgJj0gfihBTExPQ3xJU1NFVCk7CisJCQkJYWZyZWUoYXAtPnZhbC5zLCBBUEVSTSk7CisJCQl9CisJCQkvKiBpZ25vcmUgdmFsdWVzIGZvciAtdCAoQVQmVCBrc2ggZG9lcyB0aGlzKSAqLworCQkJbmV3dmFsID0gdGZsYWcgPyBzZWFyY2goYWxpYXMsIHBhdGgsIFhfT0ssIE5VTEwpIDogdmFsOworCQkJaWYgKG5ld3ZhbCkgeworCQkJCXN0cmR1cHgoYXAtPnZhbC5zLCBuZXd2YWwsIEFQRVJNKTsKKwkJCQlhcC0+ZmxhZyB8PSBBTExPQ3xJU1NFVDsKKwkJCX0gZWxzZQorCQkJCWFwLT5mbGFnICY9IH5JU1NFVDsKKwkJfQorCQlhcC0+ZmxhZyB8PSBERUZJTkVEOworCQlpZiAocHJlZml4ID09ICcrJykKKwkJCWFwLT5mbGFnICY9IH54ZmxhZzsKKwkJZWxzZQorCQkJYXAtPmZsYWcgfD0geGZsYWc7CisJCWFmcmVlKHhhbGlhcywgQVRFTVApOworCX0KKworCXJldHVybiAocnYpOworfQorCitpbnQKK2NfdW5hbGlhcyhjb25zdCBjaGFyICoqd3ApCit7CisJc3RydWN0IHRhYmxlICp0ID0gJmFsaWFzZXM7CisJc3RydWN0IHRibCAqYXA7CisJaW50IG9wdGMsIHJ2ID0gMDsKKwlib29sIGFsbCA9IGZhbHNlOworCisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAiYWR0IikpICE9IC0xKQorCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAnYSc6CisJCQlhbGwgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorI2lmZGVmIE1LU0hfTk9QV05BTQorCQkJdCA9IE5VTEw7CS8qIGZpeCAidW5hbGlhcyAtZHQiICovCisjZWxzZQorCQkJdCA9ICZob21lZGlyczsKKyNlbmRpZgorCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJdCA9ICZ0YWxpYXNlczsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXJldHVybiAoMSk7CisJCX0KKyNpZmRlZiBNS1NIX05PUFdOQU0KKwlpZiAodCA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworI2VuZGlmCisJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCisJZm9yICg7ICp3cCAhPSBOVUxMOyB3cCsrKSB7CisJCWFwID0ga3RzZWFyY2godCwgKndwLCBoYXNoKCp3cCkpOworCQlpZiAoYXAgPT0gTlVMTCkgeworCQkJcnYgPSAxOwkvKiBQT1NJWCAqLworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGFwLT5mbGFnJkFMTE9DKSB7CisJCQlhcC0+ZmxhZyAmPSB+KEFMTE9DfElTU0VUKTsKKwkJCWFmcmVlKGFwLT52YWwucywgQVBFUk0pOworCQl9CisJCWFwLT5mbGFnICY9IH4oREVGSU5FRHxJU1NFVHxFWFBPUlQpOworCX0KKworCWlmIChhbGwpIHsKKwkJc3RydWN0IHRzdGF0ZSB0czsKKworCQlmb3IgKGt0d2FsaygmdHMsIHQpOyAoYXAgPSBrdG5leHQoJnRzKSk7ICkgeworCQkJaWYgKGFwLT5mbGFnJkFMTE9DKSB7CisJCQkJYXAtPmZsYWcgJj0gfihBTExPQ3xJU1NFVCk7CisJCQkJYWZyZWUoYXAtPnZhbC5zLCBBUEVSTSk7CisJCQl9CisJCQlhcC0+ZmxhZyAmPSB+KERFRklORUR8SVNTRVR8RVhQT1JUKTsKKwkJfQorCX0KKworCXJldHVybiAocnYpOworfQorCitpbnQKK2NfbGV0KGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgcnYgPSAxOworCW1rc2hfYXJpX3QgdmFsOworCisJaWYgKHdwWzFdID09IE5VTEwpIC8qIEFUJlQga3NoIGRvZXMgdGhpcyAqLworCQliaV9lcnJvcmYoIm5vIGFyZ3VtZW50cyIpOworCWVsc2UKKwkJZm9yICh3cCsrOyAqd3A7IHdwKyspCisJCQlpZiAoIWV2YWx1YXRlKCp3cCwgJnZhbCwgS1NIX1JFVFVSTl9FUlJPUiwgdHJ1ZSkpIHsKKwkJCQlydiA9IDI7CS8qIGRpc3Rpbmd1aXNoIGVycm9yIGZyb20gemVybyByZXN1bHQgKi8KKwkJCQlicmVhazsKKwkJCX0gZWxzZQorCQkJCXJ2ID0gdmFsID09IDA7CisJcmV0dXJuIChydik7Cit9CisKK2ludAorY19qb2JzKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgb3B0YywgZmxhZyA9IDAsIG5mbGFnID0gMCwgcnYgPSAwOworCisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAibHBueiIpKSAhPSAtMSkKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ2wnOgorCQkJZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlmbGFnID0gMjsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW5mbGFnID0gMTsKKwkJCWJyZWFrOworCQljYXNlICd6JzoJLyogZGVidWdnaW5nOiBwcmludCB6b21iaWVzICovCisJCQluZmxhZyA9IC0xOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJcmV0dXJuICgxKTsKKwkJfQorCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKwlpZiAoISp3cCkgeworCQlpZiAoal9qb2JzKE5VTEwsIGZsYWcsIG5mbGFnKSkKKwkJCXJ2ID0gMTsKKwl9IGVsc2UgeworCQlmb3IgKDsgKndwOyB3cCsrKQorCQkJaWYgKGpfam9icygqd3AsIGZsYWcsIG5mbGFnKSkKKwkJCQlydiA9IDE7CisJfQorCXJldHVybiAocnYpOworfQorCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAoraW50CitjX2ZnYmcoY29uc3QgY2hhciAqKndwKQoreworCWJvb2wgYmcgPSBzdHJjbXAoKndwLCAiYmciKSA9PSAwOworCWludCBydiA9IDA7CisKKwlpZiAoIUZsYWcoRk1PTklUT1IpKSB7CisJCWJpX2Vycm9yZigiam9iIGNvbnRyb2wgbm90IGVuYWJsZWQiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJaWYgKGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgbnVsbCkgPT0gJz8nKQorCQlyZXR1cm4gKDEpOworCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKwlpZiAoKndwKQorCQlmb3IgKDsgKndwOyB3cCsrKQorCQkJcnYgPSBqX3Jlc3VtZSgqd3AsIGJnKTsKKwllbHNlCisJCXJ2ID0gal9yZXN1bWUoIiUlIiwgYmcpOworCXJldHVybiAoYmcgPyAwIDogcnYpOworfQorI2VuZGlmCisKKy8qIGZvcm1hdCBhIHNpbmdsZSBraWxsIGl0ZW0gKi8KK3N0YXRpYyBjaGFyICoKK2tpbGxfZm10X2VudHJ5KGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IGksIGNvbnN0IHZvaWQgKmFyZykKK3sKKwljb25zdCBzdHJ1Y3Qga2lsbF9pbmZvICpraSA9IChjb25zdCBzdHJ1Y3Qga2lsbF9pbmZvICopYXJnOworCisJaSsrOworCXNoZl9zbnByaW50ZihidWYsIGJ1ZmxlbiwgIiUqZCAlKnMgJXMiLAorCSAgICBraS0+bnVtX3dpZHRoLCBpLAorCSAgICBraS0+bmFtZV93aWR0aCwgc2lndHJhcHNbaV0ubmFtZSwKKwkgICAgc2lndHJhcHNbaV0ubWVzcyk7CisJcmV0dXJuIChidWYpOworfQorCitpbnQKK2Nfa2lsbChjb25zdCBjaGFyICoqd3ApCit7CisJVHJhcCAqdCA9IE5VTEw7CisJY29uc3QgY2hhciAqcDsKKwlib29sIGxmbGFnID0gZmFsc2U7CisJaW50IGksIG4sIHJ2LCBzaWc7CisKKwkvKiBhc3N1bWUgb2xkIHN0eWxlIG9wdGlvbnMgaWYgLWRpZ2l0cyBvciAtVVBQRVJDQVNFICovCisJaWYgKChwID0gd3BbMV0pICYmICpwID09ICctJyAmJiAoa3NoX2lzZGlnaXQocFsxXSkgfHwKKwkgICAga3NoX2lzdXBwZXIocFsxXSkpKSB7CisJCWlmICghKHQgPSBnZXR0cmFwKHAgKyAxLCB0cnVlKSkpIHsKKwkJCWJpX2Vycm9yZigiYmFkIHNpZ25hbCAnJXMnIiwgcCArIDEpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCQlpID0gKHdwWzJdICYmIHN0cmNtcCh3cFsyXSwgIi0tIikgPT0gMCkgPyAzIDogMjsKKwl9IGVsc2UgeworCQlpbnQgb3B0YzsKKworCQl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJsczoiKSkgIT0gLTEpCisJCQlzd2l0Y2ggKG9wdGMpIHsKKwkJCWNhc2UgJ2wnOgorCQkJCWxmbGFnID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOgorCQkJCWlmICghKHQgPSBnZXR0cmFwKGJ1aWx0aW5fb3B0Lm9wdGFyZywgdHJ1ZSkpKSB7CisJCQkJCWJpX2Vycm9yZigiYmFkIHNpZ25hbCAnJXMnIiwKKwkJCQkJICAgIGJ1aWx0aW5fb3B0Lm9wdGFyZyk7CisJCQkJCXJldHVybiAoMSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnPyc6CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJaSA9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKwl9CisJaWYgKChsZmxhZyAmJiB0KSB8fCAoIXdwW2ldICYmICFsZmxhZykpIHsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCQlzaGZfcHV0cygidXNhZ2U6XHRraWxsIFstcyBzaWduYW1lIHwgLXNpZ251bSB8IC1zaWduYW1lXSIKKwkJICAgICIgeyBqb2IgfCBwaWQgfCBwZ3JwIH0gLi4uXG4iCisJCSAgICAiXHRraWxsIC1sIFtleGl0X3N0YXR1cyAuLi5dXG4iLCBzaGxfb3V0KTsKKyNlbmRpZgorCQliaV9lcnJvcmZ6KCk7CisJCXJldHVybiAoMSk7CisJfQorCisJaWYgKGxmbGFnKSB7CisJCWlmICh3cFtpXSkgeworCQkJZm9yICg7IHdwW2ldOyBpKyspIHsKKwkJCQlpZiAoIWJpX2dldG4od3BbaV0sICZuKSkKKwkJCQkJcmV0dXJuICgxKTsKKwkJCQlpZiAobiA+IDEyOCAmJiBuIDwgMTI4ICsgTlNJRykKKwkJCQkJbiAtPSAxMjg7CisJCQkJaWYgKG4gPiAwICYmIG4gPCBOU0lHKQorCQkJCQlzaHByaW50ZigiJXNcbiIsIHNpZ3RyYXBzW25dLm5hbWUpOworCQkJCWVsc2UKKwkJCQkJc2hwcmludGYoIiVkXG4iLCBuKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWludCB3LCBqLCBtZXNzX2NvbHMsIG1lc3Nfb2N0czsKKwkJCXN0cnVjdCBraWxsX2luZm8ga2k7CisKKwkJCWZvciAoaiA9IE5TSUcsIGtpLm51bV93aWR0aCA9IDE7IGogPj0gMTA7IGogLz0gMTApCisJCQkJa2kubnVtX3dpZHRoKys7CisJCQlraS5uYW1lX3dpZHRoID0gbWVzc19jb2xzID0gbWVzc19vY3RzID0gMDsKKwkJCWZvciAoaiA9IDA7IGogPCBOU0lHOyBqKyspIHsKKwkJCQl3ID0gc3RybGVuKHNpZ3RyYXBzW2pdLm5hbWUpOworCQkJCWlmICh3ID4ga2kubmFtZV93aWR0aCkKKwkJCQkJa2kubmFtZV93aWR0aCA9IHc7CisJCQkJdyA9IHN0cmxlbihzaWd0cmFwc1tqXS5tZXNzKTsKKwkJCQlpZiAodyA+IG1lc3Nfb2N0cykKKwkJCQkJbWVzc19vY3RzID0gdzsKKwkJCQl3ID0gdXRmX21ic3dpZHRoKHNpZ3RyYXBzW2pdLm1lc3MpOworCQkJCWlmICh3ID4gbWVzc19jb2xzKQorCQkJCQltZXNzX2NvbHMgPSB3OworCQkJfQorCisJCQlwcmludF9jb2x1bW5zKHNobF9zdGRvdXQsIE5TSUcgLSAxLAorCQkJICAgIGtpbGxfZm10X2VudHJ5LCAodm9pZCAqKSZraSwKKwkJCSAgICBraS5udW1fd2lkdGggKyAxICsga2kubmFtZV93aWR0aCArIDEgKyBtZXNzX29jdHMsCisJCQkgICAga2kubnVtX3dpZHRoICsgMSArIGtpLm5hbWVfd2lkdGggKyAxICsgbWVzc19jb2xzLAorCQkJICAgIHRydWUpOworCQl9CisJCXJldHVybiAoMCk7CisJfQorCXJ2ID0gMDsKKwlzaWcgPSB0ID8gdC0+c2lnbmFsIDogU0lHVEVSTTsKKwlmb3IgKDsgKHAgPSB3cFtpXSk7IGkrKykgeworCQlpZiAoKnAgPT0gJyUnKSB7CisJCQlpZiAoal9raWxsKHAsIHNpZykpCisJCQkJcnYgPSAxOworCQl9IGVsc2UgaWYgKCFnZXRuKHAsICZuKSkgeworCQkJYmlfZXJyb3JmKCIlczogYXJndW1lbnRzIG11c3QgYmUgam9icyBvciBwcm9jZXNzIElEcyIsCisJCQkgICAgcCk7CisJCQlydiA9IDE7CisJCX0gZWxzZSB7CisJCQlpZiAobWtzaF9raWxsKG4sIHNpZykgPCAwKSB7CisJCQkJYmlfZXJyb3JmKCIlczogJXMiLCBwLCBzdHJlcnJvcihlcnJubykpOworCQkJCXJ2ID0gMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gKHJ2KTsKK30KKwordm9pZAorZ2V0b3B0c19yZXNldChpbnQgdmFsKQoreworCWlmICh2YWwgPj0gMSkgeworCQlrc2hfZ2V0b3B0X3Jlc2V0KCZ1c2VyX29wdCwgR0ZfTk9OQU1FIHwgR0ZfUExVU09QVCk7CisJCXVzZXJfb3B0Lm9wdGluZCA9IHVzZXJfb3B0LnVvcHRpbmQgPSB2YWw7CisJfQorfQorCitpbnQKK2NfZ2V0b3B0cyhjb25zdCBjaGFyICoqd3ApCit7CisJaW50IGFyZ2MsIG9wdGMsIHJ2OworCWNvbnN0IGNoYXIgKm9wdHMsICp2YXI7CisJY2hhciBidWZbM107CisJc3RydWN0IHRibCAqdnEsICp2b3B0YXJnOworCisJaWYgKGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgbnVsbCkgPT0gJz8nKQorCQlyZXR1cm4gKDEpOworCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKworCW9wdHMgPSAqd3ArKzsKKwlpZiAoIW9wdHMpIHsKKwkJYmlfZXJyb3JmKCJtaXNzaW5nIG9wdGlvbnMgYXJndW1lbnQiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwl2YXIgPSAqd3ArKzsKKwlpZiAoIXZhcikgeworCQliaV9lcnJvcmYoIm1pc3NpbmcgbmFtZSBhcmd1bWVudCIpOworCQlyZXR1cm4gKDEpOworCX0KKwlpZiAoISp2YXIgfHwgKnNraXBfdmFybmFtZSh2YXIsIHRydWUpKSB7CisJCWJpX2Vycm9yZigiJXM6IGlzIG5vdCBhbiBpZGVudGlmaWVyIiwgdmFyKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwlpZiAoZS0+bG9jLT5uZXh0ID09IE5VTEwpIHsKKwkJaW50ZXJuYWxfd2FybmluZ2YoImNfZ2V0b3B0czogbm8gYXJndiIpOworCQlyZXR1cm4gKDEpOworCX0KKwkvKiBXaGljaCBhcmd1bWVudHMgYXJlIHdlIHBhcnNpbmcuLi4gKi8KKwlpZiAoKndwID09IE5VTEwpCisJCXdwID0gZS0+bG9jLT5uZXh0LT5hcmd2OworCWVsc2UKKwkJKi0td3AgPSBlLT5sb2MtPm5leHQtPmFyZ3ZbMF07CisKKwkvKiBDaGVjayB0aGF0IG91ciBzYXZlZCBzdGF0ZSB3b24ndCBjYXVzZSBhIGNvcmUgZHVtcC4uLiAqLworCWZvciAoYXJnYyA9IDA7IHdwW2FyZ2NdOyBhcmdjKyspCisJCTsKKwlpZiAodXNlcl9vcHQub3B0aW5kID4gYXJnYyB8fAorCSAgICAodXNlcl9vcHQucCAhPSAwICYmCisJICAgIHVzZXJfb3B0LnAgPiBzdHJsZW4od3BbdXNlcl9vcHQub3B0aW5kIC0gMV0pKSkgeworCQliaV9lcnJvcmYoImFyZ3VtZW50cyBjaGFuZ2VkIHNpbmNlIGxhc3QgY2FsbCIpOworCQlyZXR1cm4gKDEpOworCX0KKworCXVzZXJfb3B0Lm9wdGFyZyA9IE5VTEw7CisJb3B0YyA9IGtzaF9nZXRvcHQod3AsICZ1c2VyX29wdCwgb3B0cyk7CisKKwlpZiAob3B0YyA+PSAwICYmIG9wdGMgIT0gJz8nICYmICh1c2VyX29wdC5pbmZvICYgR0lfUExVUykpIHsKKwkJYnVmWzBdID0gJysnOworCQlidWZbMV0gPSBvcHRjOworCQlidWZbMl0gPSAnXDAnOworCX0gZWxzZSB7CisJCS8qIFBPU0lYIHNheXMgdmFyIGlzIHNldCB0byA/IGF0IGVuZC1vZi1vcHRpb25zLCBBVCZUIGtzaAorCQkgKiBzZXRzIGl0IHRvIG51bGwgLSB3ZSBnbyB3aXRoIFBPU0lYLi4uCisJCSAqLworCQlidWZbMF0gPSBvcHRjIDwgMCA/ICc/JyA6IG9wdGM7CisJCWJ1ZlsxXSA9ICdcMCc7CisJfQorCisJLyogQVQmVCBrc2g5MyBpbiBmYWN0IGRvZXMgY2hhbmdlIE9QVElORCBmb3IgdW5rbm93biBvcHRpb25zIHRvbyAqLworCXVzZXJfb3B0LnVvcHRpbmQgPSB1c2VyX29wdC5vcHRpbmQ7CisKKwl2b3B0YXJnID0gZ2xvYmFsKCJPUFRBUkciKTsKKwl2b3B0YXJnLT5mbGFnICY9IH5SRE9OTFk7CS8qIEFUJlQga3NoIGNsZWFycyBybyBhbmQgaW50ICovCisJLyogUGFyYW5vaWE6IGVuc3VyZSBubyBiaXphcnJlIHJlc3VsdHMuICovCisJaWYgKHZvcHRhcmctPmZsYWcgJiBJTlRFR0VSKQorCSAgICB0eXBlc2V0KCJPUFRBUkciLCAwLCBJTlRFR0VSLCAwLCAwKTsKKwlpZiAodXNlcl9vcHQub3B0YXJnID09IE5VTEwpCisJCXVuc2V0KHZvcHRhcmcsIDEpOworCWVsc2UKKwkJLyogVGhpcyBjYW4ndCBmYWlsIChoYXZlIGNsZWFyZWQgcmVhZG9ubHkvaW50ZWdlcikgKi8KKwkJc2V0c3RyKHZvcHRhcmcsIHVzZXJfb3B0Lm9wdGFyZywgS1NIX1JFVFVSTl9FUlJPUik7CisKKwlydiA9IDA7CisKKwl2cSA9IGdsb2JhbCh2YXIpOworCS8qIEVycm9yIG1lc3NhZ2UgYWxyZWFkeSBwcmludGVkIChpbnRlZ2VyLCByZWFkb25seSkgKi8KKwlpZiAoIXNldHN0cih2cSwgYnVmLCBLU0hfUkVUVVJOX0VSUk9SKSkKKwkJcnYgPSAxOworCWlmIChGbGFnKEZFWFBPUlQpKQorCQl0eXBlc2V0KHZhciwgRVhQT1JULCAwLCAwLCAwKTsKKworCXJldHVybiAob3B0YyA8IDAgPyAxIDogcnYpOworfQorCitpbnQKK2NfYmluZChjb25zdCBjaGFyICoqd3ApCit7CisJaW50IG9wdGMsIHJ2ID0gMDsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCWJvb2wgbWFjcm8gPSBmYWxzZTsKKyNlbmRpZgorCWJvb2wgbGlzdCA9IGZhbHNlOworCWNvbnN0IGNoYXIgKmNwOworCWNoYXIgKnVwOworCisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LAorI2lmbmRlZiBNS1NIX1NNQUxMCisJICAgICJsbSIKKyNlbHNlCisJICAgICJsIgorI2VuZGlmCisJICAgICkpICE9IC0xKQorCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAnbCc6CisJCQlsaXN0ID0gdHJ1ZTsKKwkJCWJyZWFrOworI2lmbmRlZiBNS1NIX1NNQUxMCisJCWNhc2UgJ20nOgorCQkJbWFjcm8gPSB0cnVlOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSAnPyc6CisJCQlyZXR1cm4gKDEpOworCQl9CisJd3AgKz0gYnVpbHRpbl9vcHQub3B0aW5kOworCisJaWYgKCp3cCA9PSBOVUxMKQkvKiBsaXN0IGFsbCAqLworCQlydiA9IHhfYmluZChOVUxMLCBOVUxMLAorI2lmbmRlZiBNS1NIX1NNQUxMCisJCSAgICBmYWxzZSwKKyNlbmRpZgorCQkgICAgbGlzdCk7CisKKwlmb3IgKDsgKndwICE9IE5VTEw7IHdwKyspIHsKKwkJaWYgKChjcCA9IGNzdHJjaHIoKndwLCAnPScpKSA9PSBOVUxMKQorCQkJdXAgPSBOVUxMOworCQllbHNlIHsKKwkJCXN0cmR1cHgodXAsICp3cCwgQVRFTVApOworCQkJdXBbY3ArKyAtICp3cF0gPSAnXDAnOworCQl9CisJCWlmICh4X2JpbmQodXAgPyB1cCA6ICp3cCwgY3AsCisjaWZuZGVmIE1LU0hfU01BTEwKKwkJICAgIG1hY3JvLAorI2VuZGlmCisJCSAgICBmYWxzZSkpCisJCQlydiA9IDE7CisJCWFmcmVlKHVwLCBBVEVNUCk7CisJfQorCisJcmV0dXJuIChydik7Cit9CisKKy8qIDosIGZhbHNlIGFuZCB0cnVlIChhbmQgdWxpbWl0IGlmIE1LU0hfTk9fTElNSVRTKSAqLworaW50CitjX2xhYmVsKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlyZXR1cm4gKHdwWzBdWzBdID09ICdmJyA/IDEgOiAwKTsKK30KKworaW50CitjX3NoaWZ0KGNvbnN0IGNoYXIgKip3cCkKK3sKKwlzdHJ1Y3QgYmxvY2sgKmwgPSBlLT5sb2M7CisJaW50IG47CisJbWtzaF9hcmlfdCB2YWw7CisJY29uc3QgY2hhciAqYXJnOworCisJaWYgKGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgbnVsbCkgPT0gJz8nKQorCQlyZXR1cm4gKDEpOworCWFyZyA9IHdwW2J1aWx0aW5fb3B0Lm9wdGluZF07CisKKwlpZiAoYXJnKSB7CisJCWV2YWx1YXRlKGFyZywgJnZhbCwgS1NIX1VOV0lORF9FUlJPUiwgZmFsc2UpOworCQluID0gdmFsOworCX0gZWxzZQorCQluID0gMTsKKwlpZiAobiA8IDApIHsKKwkJYmlfZXJyb3JmKCIlczogYmFkIG51bWJlciIsIGFyZyk7CisJCXJldHVybiAoMSk7CisJfQorCWlmIChsLT5hcmdjIDwgbikgeworCQliaV9lcnJvcmYoIm5vdGhpbmcgdG8gc2hpZnQiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJbC0+YXJndltuXSA9IGwtPmFyZ3ZbMF07CisJbC0+YXJndiArPSBuOworCWwtPmFyZ2MgLT0gbjsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK2NfdW1hc2soY29uc3QgY2hhciAqKndwKQoreworCWludCBpLCBvcHRjOworCWNvbnN0IGNoYXIgKmNwOworCWJvb2wgc3ltYm9saWMgPSBmYWxzZTsKKwltb2RlX3Qgb2xkX3VtYXNrOworCisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAiUyIpKSAhPSAtMSkKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ1MnOgorCQkJc3ltYm9saWMgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJcmV0dXJuICgxKTsKKwkJfQorCWNwID0gd3BbYnVpbHRpbl9vcHQub3B0aW5kXTsKKwlpZiAoY3AgPT0gTlVMTCkgeworCQlvbGRfdW1hc2sgPSB1bWFzaygobW9kZV90KTApOworCQl1bWFzayhvbGRfdW1hc2spOworCQlpZiAoc3ltYm9saWMpIHsKKwkJCWNoYXIgYnVmWzE4XSwgKnA7CisJCQlpbnQgajsKKworCQkJb2xkX3VtYXNrID0gfm9sZF91bWFzazsKKwkJCXAgPSBidWY7CisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkJKnArKyA9ICJ1Z28iW2ldOworCQkJCSpwKysgPSAnPSc7CisJCQkJZm9yIChqID0gMDsgaiA8IDM7IGorKykKKwkJCQkJaWYgKG9sZF91bWFzayAmICgxIDw8ICg4IC0gKDMqaSArIGopKSkpCisJCQkJCQkqcCsrID0gInJ3eCJbal07CisJCQkJKnArKyA9ICcsJzsKKwkJCX0KKwkJCXBbLTFdID0gJ1wwJzsKKwkJCXNocHJpbnRmKCIlc1xuIiwgYnVmKTsKKwkJfSBlbHNlCisJCQlzaHByaW50ZigiJSMzLjNvXG4iLCAodW5zaWduZWQgaW50KW9sZF91bWFzayk7CisJfSBlbHNlIHsKKwkJbW9kZV90IG5ld191bWFzazsKKworCQlpZiAoa3NoX2lzZGlnaXQoKmNwKSkgeworCQkJZm9yIChuZXdfdW1hc2sgPSAwOyAqY3AgPj0gJzAnICYmICpjcCA8PSAnNyc7IGNwKyspCisJCQkJbmV3X3VtYXNrID0gbmV3X3VtYXNrICogOCArICgqY3AgLSAnMCcpOworCQkJaWYgKCpjcCkgeworCQkJCWJpX2Vycm9yZigiYmFkIG51bWJlciIpOworCQkJCXJldHVybiAoMSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBzeW1ib2xpYyBmb3JtYXQgKi8KKwkJCWludCBwb3NpdGlvbnMsIG5ld192YWw7CisJCQljaGFyIG9wOworCisJCQlvbGRfdW1hc2sgPSB1bWFzaygobW9kZV90KTApOworCQkJdW1hc2sob2xkX3VtYXNrKTsgLyogaW4gY2FzZSBvZiBlcnJvciAqLworCQkJb2xkX3VtYXNrID0gfm9sZF91bWFzazsKKwkJCW5ld191bWFzayA9IG9sZF91bWFzazsKKwkJCXBvc2l0aW9ucyA9IDA7CisJCQl3aGlsZSAoKmNwKSB7CisJCQkJd2hpbGUgKCpjcCAmJiB2c3RyY2hyKCJhdWdvIiwgKmNwKSkKKwkJCQkJc3dpdGNoICgqY3ArKykgeworCQkJCQljYXNlICdhJzoKKwkJCQkJCXBvc2l0aW9ucyB8PSAwMTExOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ3UnOgorCQkJCQkJcG9zaXRpb25zIHw9IDAxMDA7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnZyc6CisJCQkJCQlwb3NpdGlvbnMgfD0gMDAxMDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdvJzoKKwkJCQkJCXBvc2l0aW9ucyB8PSAwMDAxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQlpZiAoIXBvc2l0aW9ucykKKwkJCQkJcG9zaXRpb25zID0gMDExMTsgLyogZGVmYXVsdCBpcyBhICovCisJCQkJaWYgKCF2c3RyY2hyKCI9Ky0iLCBvcCA9ICpjcCkpCisJCQkJCWJyZWFrOworCQkJCWNwKys7CisJCQkJbmV3X3ZhbCA9IDA7CisJCQkJd2hpbGUgKCpjcCAmJiB2c3RyY2hyKCJyd3h1Z29YcyIsICpjcCkpCisJCQkJCXN3aXRjaCAoKmNwKyspIHsKKwkJCQkJY2FzZSAncic6IG5ld192YWwgfD0gMDQ7IGJyZWFrOworCQkJCQljYXNlICd3JzogbmV3X3ZhbCB8PSAwMjsgYnJlYWs7CisJCQkJCWNhc2UgJ3gnOiBuZXdfdmFsIHw9IDAxOyBicmVhazsKKwkJCQkJY2FzZSAndSc6CisJCQkJCQluZXdfdmFsIHw9IG9sZF91bWFzayA+PiA2OworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ2cnOgorCQkJCQkJbmV3X3ZhbCB8PSBvbGRfdW1hc2sgPj4gMzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdvJzoKKwkJCQkJCW5ld192YWwgfD0gb2xkX3VtYXNrID4+IDA7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnWCc6CisJCQkJCQlpZiAob2xkX3VtYXNrICYgMDExMSkKKwkJCQkJCQluZXdfdmFsIHw9IDAxOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ3MnOgorCQkJCQkJLyogaWdub3JlZCAqLworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQluZXdfdmFsID0gKG5ld192YWwgJiAwNykgKiBwb3NpdGlvbnM7CisJCQkJc3dpdGNoIChvcCkgeworCQkJCWNhc2UgJy0nOgorCQkJCQluZXdfdW1hc2sgJj0gfm5ld192YWw7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJz0nOgorCQkJCQluZXdfdW1hc2sgPSBuZXdfdmFsIHwKKwkJCQkJICAgIChuZXdfdW1hc2sgJiB+KHBvc2l0aW9ucyAqIDA3KSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJysnOgorCQkJCQluZXdfdW1hc2sgfD0gbmV3X3ZhbDsKKwkJCQl9CisJCQkJaWYgKCpjcCA9PSAnLCcpIHsKKwkJCQkJcG9zaXRpb25zID0gMDsKKwkJCQkJY3ArKzsKKwkJCQl9IGVsc2UgaWYgKCF2c3RyY2hyKCI9Ky0iLCAqY3ApKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmICgqY3ApIHsKKwkJCQliaV9lcnJvcmYoImJhZCBtYXNrIik7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJCW5ld191bWFzayA9IH5uZXdfdW1hc2s7CisJCX0KKwkJdW1hc2sobmV3X3VtYXNrKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworaW50CitjX2RvdChjb25zdCBjaGFyICoqd3ApCit7CisJY29uc3QgY2hhciAqZmlsZSwgKmNwLCAqKmFyZ3Y7CisJaW50IGFyZ2MsIGksIGVycmNvZGU7CisKKwlpZiAoa3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBudWxsKSA9PSAnPycpCisJCXJldHVybiAoMSk7CisKKwlpZiAoKGNwID0gd3BbYnVpbHRpbl9vcHQub3B0aW5kXSkgPT0gTlVMTCkgeworCQliaV9lcnJvcmYoIm1pc3NpbmcgYXJndW1lbnQiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJaWYgKChmaWxlID0gc2VhcmNoKGNwLCBwYXRoLCBSX09LLCAmZXJyY29kZSkpID09IE5VTEwpIHsKKwkJYmlfZXJyb3JmKCIlczogJXMiLCBjcCwKKwkJICAgIGVycmNvZGUgPyBzdHJlcnJvcihlcnJjb2RlKSA6ICJub3QgZm91bmQiKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwkvKiBTZXQgcG9zaXRpb25hbCBwYXJhbWV0ZXJzPyAqLworCWlmICh3cFtidWlsdGluX29wdC5vcHRpbmQgKyAxXSkgeworCQlhcmd2ID0gd3AgKyBidWlsdGluX29wdC5vcHRpbmQ7CisJCWFyZ3ZbMF0gPSBlLT5sb2MtPmFyZ3ZbMF07IC8qIHByZXNlcnZlICQwICovCisJCWZvciAoYXJnYyA9IDA7IGFyZ3ZbYXJnYyArIDFdOyBhcmdjKyspCisJCQk7CisJfSBlbHNlIHsKKwkJYXJnYyA9IDA7CisJCWFyZ3YgPSBOVUxMOworCX0KKwlpZiAoKGkgPSBpbmNsdWRlKGZpbGUsIGFyZ2MsIGFyZ3YsIDApKSA8IDApIHsKKwkJLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJYmlfZXJyb3JmKCIlczogJXMiLCBjcCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJcmV0dXJuIChpKTsKK30KKworaW50CitjX3dhaXQoY29uc3QgY2hhciAqKndwKQoreworCWludCBydiA9IDAsIHNpZzsKKworCWlmIChrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG51bGwpID09ICc/JykKKwkJcmV0dXJuICgxKTsKKwl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisJaWYgKCp3cCA9PSBOVUxMKSB7CisJCXdoaWxlICh3YWl0Zm9yKE5VTEwsICZzaWcpID49IDApCisJCQk7CisJCXJ2ID0gc2lnOworCX0gZWxzZSB7CisJCWZvciAoOyAqd3A7IHdwKyspCisJCQlydiA9IHdhaXRmb3IoKndwLCAmc2lnKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJ2ID0gc2lnID8gc2lnIDogMTI3OyAvKiBtYWdpYyBleGl0IGNvZGU6IGJhZCBqb2ItaWQgKi8KKwl9CisJcmV0dXJuIChydik7Cit9CisKK2ludAorY19yZWFkKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgYyA9IDAsIGVjb2RlID0gMCwgZmQgPSAwLCBvcHRjOworCWJvb2wgZXhwYW5kZSA9IHRydWUsIGhpc3RvcnlyID0gZmFsc2UsIGV4cGFuZGluZzsKKwljb25zdCBjaGFyICpjcCwgKmVtc2c7CisJc3RydWN0IHNoZiAqc2hmOworCVhTdHJpbmcgY3MsIHhzID0geyBOVUxMLCBOVUxMLCAwLCBOVUxMfTsKKwlzdHJ1Y3QgdGJsICp2cDsKKwljaGFyICpjY3AsICp4cCA9IE5VTEwsICp3cGFsbG9jID0gTlVMTDsKKwlzdGF0aWMgY2hhciBSRVBMWVtdID0gIlJFUExZIjsKKworCXdoaWxlICgob3B0YyA9IGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgInByc3UsIikpICE9IC0xKQorCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAncCc6CisJCQlpZiAoKGZkID0gY29wcm9jX2dldGZkKFJfT0ssICZlbXNnKSkgPCAwKSB7CisJCQkJYmlfZXJyb3JmKCItcDogJXMiLCBlbXNnKTsKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJZXhwYW5kZSA9IGZhbHNlOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJaGlzdG9yeXIgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ3UnOgorCQkJaWYgKCEqKGNwID0gYnVpbHRpbl9vcHQub3B0YXJnKSkKKwkJCQlmZCA9IDA7CisJCQllbHNlIGlmICgoZmQgPSBjaGVja19mZChjcCwgUl9PSywgJmVtc2cpKSA8IDApIHsKKwkJCQliaV9lcnJvcmYoIi11OiAlczogJXMiLCBjcCwgZW1zZyk7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXJldHVybiAoMSk7CisJCX0KKwl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisKKwlpZiAoKndwID09IE5VTEwpCisJCSotLXdwID0gUkVQTFk7CisKKwkvKiBTaW5jZSB3ZSBjYW4ndCBuZWNlc3NhcmlseSBzZWVrIGJhY2t3YXJkcyBvbiBub24tcmVndWxhciBmaWxlcywKKwkgKiBkb24ndCBidWZmZXIgdGhlbSBzbyB3ZSBjYW4ndCByZWFkIHRvbyBtdWNoLgorCSAqLworCXNoZiA9IHNoZl9yZW9wZW4oZmQsIFNIRl9SRCB8IFNIRl9JTlRFUlJVUFQgfCBjYW5fc2VlayhmZCksIHNobF9zcGFyZSk7CisKKwlpZiAoKGNwID0gY3N0cmNocigqd3AsICc/JykpICE9IE5VTEwpIHsKKwkJc3RyZHVweCh3cGFsbG9jLCAqd3AsIEFURU1QKTsKKwkJd3BhbGxvY1tjcCAtICp3cF0gPSAnXDAnOworCQkqd3AgPSB3cGFsbG9jOworCQlpZiAoaXNhdHR5KGZkKSkgeworCQkJLyogQVQmVCBrc2ggc2F5cyBpdCBwcmludHMgcHJvbXB0IG9uIGZkIGlmIGl0J3Mgb3BlbgorCQkJICogZm9yIHdyaXRpbmcgYW5kIGlzIGEgdHR5LCBidXQgaXQgZG9lc24ndCBkbyBpdAorCQkJICogKGl0IGFsc28gZG9lc24ndCBjaGVjayB0aGUgaW50ZXJhY3RpdmUgZmxhZywKKwkJCSAqIGFzIGlzIGluZGljYXRlZCBpbiB0aGUgS29ybnNoZWxsIGJvb2spLgorCQkJICovCisJCQlzaGVsbGYoIiVzIiwgY3ArMSk7CisJCX0KKwl9CisKKwkvKiBJZiB3ZSBhcmUgcmVhZGluZyBmcm9tIHRoZSBjby1wcm9jZXNzIGZvciB0aGUgZmlyc3QgdGltZSwKKwkgKiBtYWtlIHN1cmUgdGhlIG90aGVyIHNpZGUgb2YgdGhlIHBpcGUgaXMgY2xvc2VkIGZpcnN0LiBUaGlzIGFsbG93cworCSAqIHRoZSBkZXRlY3Rpb24gb2YgZW9mLgorCSAqCisJICogVGhpcyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIEFUJlQga3NoLi4uIHRoZSBmZCBpcyBrZXB0IHNvIGFub3RoZXIKKwkgKiBjb3Byb2MgY2FuIGJlIHN0YXJ0ZWQgd2l0aCBzYW1lIG91dHB1dCwgaG93ZXZlciwgdGhpcyBtZWFucyBlb2YKKwkgKiBjYW4ndCBiZSBkZXRlY3RlZC4uLiBUaGlzIGlzIHdoeSBpdCBpcyBjbG9zZWQgaGVyZS4KKwkgKiBJZiB0aGlzIGNhbGwgaXMgcmVtb3ZlZCwgcmVtb3ZlIHRoZSBlb2YgY2hlY2sgYmVsb3csIHRvby4KKwkgKiBjb3Byb2NfcmVhZHdfY2xvc2UoZmQpOworCSAqLworCisJaWYgKGhpc3RvcnlyKQorCQlYaW5pdCh4cywgeHAsIDEyOCwgQVRFTVApOworCWV4cGFuZGluZyA9IGZhbHNlOworCVhpbml0KGNzLCBjY3AsIDEyOCwgQVRFTVApOworCWZvciAoOyAqd3AgIT0gTlVMTDsgd3ArKykgeworCQlmb3IgKGNjcCA9IFhzdHJpbmcoY3MsIGNjcCk7IDsgKSB7CisJCQlpZiAoYyA9PSAnXG4nIHx8IGMgPT0gRU9GKQorCQkJCWJyZWFrOworCQkJd2hpbGUgKDEpIHsKKwkJCQljID0gc2hmX2dldGMoc2hmKTsKKwkJCQlpZiAoYyA9PSAnXDAnKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoYyA9PSBFT0YgJiYgc2hmX2Vycm9yKHNoZikgJiYKKwkJCQkgICAgc2hmX2Vycm5vKHNoZikgPT0gRUlOVFIpIHsKKwkJCQkJLyogV2FzIHRoZSBvZmZlbmRpbmcgc2lnbmFsIG9uZSB0aGF0CisJCQkJCSAqIHdvdWxkIG5vcm1hbGx5IGtpbGwgYSBwcm9jZXNzPworCQkJCQkgKiBJZiBzbywgcHJldGVuZCB0aGUgcmVhZCB3YXMga2lsbGVkLgorCQkJCQkgKi8KKwkJCQkJZWNvZGUgPSBmYXRhbF90cmFwX2NoZWNrKCk7CisKKwkJCQkJLyogbm9uIGZhdGFsIChlZywgQ0hMRCksIGNhcnJ5IG9uICovCisJCQkJCWlmICghZWNvZGUpIHsKKwkJCQkJCXNoZl9jbGVhcmVycihzaGYpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaGlzdG9yeXIpIHsKKwkJCQlYY2hlY2soeHMsIHhwKTsKKwkJCQlYcHV0KHhzLCB4cCwgYyk7CisJCQl9CisJCQlYY2hlY2soY3MsIGNjcCk7CisJCQlpZiAoZXhwYW5kaW5nKSB7CisJCQkJZXhwYW5kaW5nID0gZmFsc2U7CisJCQkJaWYgKGMgPT0gJ1xuJykgeworCQkJCQljID0gMDsKKwkJCQkJaWYgKEZsYWcoRlRBTEtJTkdfSSkgJiYgaXNhdHR5KGZkKSkgeworCQkJCQkJLyogc2V0IHByb21wdCBpbiBjYXNlIHRoaXMgaXMKKwkJCQkJCSAqIGNhbGxlZCBmcm9tIC5wcm9maWxlIG9yICRFTlYKKwkJCQkJCSAqLworCQkJCQkJc2V0X3Byb21wdChQUzIsIE5VTEwpOworCQkJCQkJcHByb21wdChwcm9tcHQsIDApOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChjICE9IEVPRikKKwkJCQkJWHB1dChjcywgY2NwLCBjKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChleHBhbmRlICYmIGMgPT0gJ1xcJykgeworCQkJCWV4cGFuZGluZyA9IHRydWU7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoYyA9PSAnXG4nIHx8IGMgPT0gRU9GKQorCQkJCWJyZWFrOworCQkJaWYgKGN0eXBlKGMsIENfSUZTKSkgeworCQkJCWlmIChYbGVuZ3RoKGNzLCBjY3ApID09IDAgJiYgY3R5cGUoYywgQ19JRlNXUykpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICh3cFsxXSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlYcHV0KGNzLCBjY3AsIGMpOworCQl9CisJCS8qIHN0cmlwIHRyYWlsaW5nIElGUyB3aGl0ZSBzcGFjZSBmcm9tIGxhc3QgdmFyaWFibGUgKi8KKwkJaWYgKCF3cFsxXSkKKwkJCXdoaWxlIChYbGVuZ3RoKGNzLCBjY3ApICYmIGN0eXBlKGNjcFstMV0sIENfSUZTKSAmJgorCQkJICAgIGN0eXBlKGNjcFstMV0sIENfSUZTV1MpKQorCQkJCWNjcC0tOworCQlYcHV0KGNzLCBjY3AsICdcMCcpOworCQl2cCA9IGdsb2JhbCgqd3ApOworCQkvKiBNdXN0IGJlIGRvbmUgYmVmb3JlIHNldHRpbmcgZXhwb3J0LiAqLworCQlpZiAodnAtPmZsYWcgJiBSRE9OTFkpIHsKKwkJCXNoZl9mbHVzaChzaGYpOworCQkJYmlfZXJyb3JmKCIlcyBpcyByZWFkIG9ubHkiLCAqd3ApOworCQkJYWZyZWUod3BhbGxvYywgQVRFTVApOworCQkJcmV0dXJuICgxKTsKKwkJfQorCQlpZiAoRmxhZyhGRVhQT1JUKSkKKwkJCXR5cGVzZXQoKndwLCBFWFBPUlQsIDAsIDAsIDApOworCQlpZiAoIXNldHN0cih2cCwgWHN0cmluZyhjcywgY2NwKSwgS1NIX1JFVFVSTl9FUlJPUikpIHsKKwkJCXNoZl9mbHVzaChzaGYpOworCQkJYWZyZWUod3BhbGxvYywgQVRFTVApOworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0KKworCXNoZl9mbHVzaChzaGYpOworCWlmIChoaXN0b3J5cikgeworCQlYcHV0KHhzLCB4cCwgJ1wwJyk7CisJCWhpc3RzYXZlKCZzb3VyY2UtPmxpbmUsIFhzdHJpbmcoeHMsIHhwKSwgdHJ1ZSwgZmFsc2UpOworCQlYZnJlZSh4cywgeHApOworCX0KKwkvKiBpZiB0aGlzIGlzIHRoZSBjby1wcm9jZXNzIGZkLCBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yCisJICogKGNhbiBnZXQgZW9mIGlmIGFuZCBvbmx5IGlmIGFsbCBwcm9jZXNzZXMgYXJlIGhhdmUgZGllZCwgaWUsCisJICogY29wcm9jLm5qb2JzIGlzIDAgYW5kIHRoZSBwaXBlIGlzIGNsb3NlZCkuCisJICovCisJaWYgKGMgPT0gRU9GICYmICFlY29kZSkKKwkJY29wcm9jX3JlYWRfY2xvc2UoZmQpOworCisJYWZyZWUod3BhbGxvYywgQVRFTVApOworCXJldHVybiAoZWNvZGUgPyBlY29kZSA6IGMgPT0gRU9GKTsKK30KKworaW50CitjX2V2YWwoY29uc3QgY2hhciAqKndwKQoreworCXN0cnVjdCBzb3VyY2UgKnMsICpzYXZlcyA9IHNvdXJjZTsKKwl1bnNpZ25lZCBjaGFyIHNhdmVmOworCWludCBydjsKKworCWlmIChrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG51bGwpID09ICc/JykKKwkJcmV0dXJuICgxKTsKKwlzID0gcHVzaHMoU1dPUkRTLCBBVEVNUCk7CisJcy0+dS5zdHJ2ID0gd3AgKyBidWlsdGluX29wdC5vcHRpbmQ7CisKKwkvKi0KKwkgKiBUaGUgZm9sbG93aW5nIGNvZGUgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSB0aGUgY29tbWFuZCBpcworCSAqIGVtcHR5IGR1ZSB0byBmYWlsZWQgY29tbWFuZCBzdWJzdGl0dXRpb24sIGZvciBleGFtcGxlIGJ5CisJICoJZXZhbCAiJChmYWxzZSkiCisJICogVGhpcyBoYXMgaGlzdG9yaWNhbGx5IHJldHVybmVkIDEgYnkgQVQmVCBrc2g4OC4gSW4gdGhpcworCSAqIGNhc2UsIHNoZWxsKCkgd2lsbCBub3Qgc2V0IG9yIGNoYW5nZSBleHN0YXQgYmVjYXVzZSB0aGUKKwkgKiBjb21waWxlZCB0cmVlIGlzIGVtcHR5LCBzbyBpdCB3aWxsIHVzZSB0aGUgdmFsdWUgd2UgcGFzcworCSAqIGZyb20gc3Vic3RfZXhzdGF0LCB3aGljaCBpcyBjbGVhcmVkIGluIGV4ZWN1dGUoKSwgc28gaXQKKwkgKiBzaG91bGQgaGF2ZSBiZWVuIDAgaWYgdGhlcmUgd2VyZSBubyBzdWJzdGl0dXRpb25zLgorCSAqCisJICogUE9TSVggaG93ZXZlciBzYXlzIHdlIGRvbid0IGRvIHRoaXMsIGV2ZW4gdGhvdWdoIGl0IGlzCisJICogdHJhZGl0aW9uYWxseSBkb25lLiBBVCZUIGtzaDkzIGFncmVlcyB3aXRoIFBPU0lYLCBzbyB3ZQorCSAqIGRvLiBUaGUgZm9sbG93aW5nIGlzIGFuIGV4Y2VycHQgZnJvbSBTVVN2NCBbMTAwMy4yLTIwMDhdOgorCSAqCisJICogMi45LjE6IFNpbXBsZSBDb21tYW5kcworCSAqCS4uLiBJZiB0aGVyZSBpcyBhIGNvbW1hbmQgbmFtZSwgZXhlY3V0aW9uIHNoYWxsCisJICoJY29udGludWUgYXMgZGVzY3JpYmVkIGluIDIuOS4xLjEgW0NvbW1hbmQgU2VhcmNoCisJICoJYW5kIEV4ZWN1dGlvbl0uIElmIHRoZXJlIGlzIG5vIGNvbW1hbmQgbmFtZSwgYnV0CisJICoJdGhlIGNvbW1hbmQgY29udGFpbmVkIGEgY29tbWFuZCBzdWJzdGl0dXRpb24sIHRoZQorCSAqCWNvbW1hbmQgc2hhbGwgY29tcGxldGUgd2l0aCB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlCisJICoJbGFzdCBjb21tYW5kIHN1YnN0aXR1dGlvbiBwZXJmb3JtZWQuCisJICogMi45LjEuMTogQ29tbWFuZCBTZWFyY2ggYW5kIEV4ZWN1dGlvbgorCSAqCSgxKSBhLiBJZiB0aGUgY29tbWFuZCBuYW1lIG1hdGNoZXMgdGhlIG5hbWUgb2YgYQorCSAqCXNwZWNpYWwgYnVpbHQtaW4gdXRpbGl0eSwgdGhhdCBzcGVjaWFsIGJ1aWx0LWluCisJICoJdXRpbGl0eSBzaGFsbCBiZSBpbnZva2VkLgorCSAqIDIuMTQuNTogZXZhbAorCSAqCUlmIHRoZXJlIGFyZSBubyBhcmd1bWVudHMsIG9yIG9ubHkgbnVsbCBhcmd1bWVudHMsCisJICoJZXZhbCBzaGFsbCByZXR1cm4gYSB6ZXJvIGV4aXQgc3RhdHVzOyAuLi4KKwkgKi8KKwkvKiBleHN0YXQgPSBzdWJzdF9leHN0YXQ7ICovCS8qIEFUJlQga3NoODggKi8KKwlleHN0YXQgPSAwOwkJCS8qIFNVU3Y0ICovCisKKwlzYXZlZiA9IEZsYWcoRkVSUkVYSVQpOworCUZsYWcoRkVSUkVYSVQpID0gMDsKKwlydiA9IHNoZWxsKHMsIGZhbHNlKTsKKwlGbGFnKEZFUlJFWElUKSA9IHNhdmVmOworCXNvdXJjZSA9IHNhdmVzOworCWFmcmVlKHMsIEFURU1QKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworaW50CitjX3RyYXAoY29uc3QgY2hhciAqKndwKQoreworCWludCBpOworCWNvbnN0IGNoYXIgKnM7CisJVHJhcCAqcDsKKworCWlmIChrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG51bGwpID09ICc/JykKKwkJcmV0dXJuICgxKTsKKwl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisKKwlpZiAoKndwID09IE5VTEwpIHsKKwkJZm9yIChwID0gc2lndHJhcHMsIGkgPSBOU0lHKzE7IC0taSA+PSAwOyBwKyspCisJCQlpZiAocC0+dHJhcCAhPSBOVUxMKSB7CisJCQkJc2hmX3B1dHMoInRyYXAgLS0gIiwgc2hsX3N0ZG91dCk7CisJCQkJcHJpbnRfdmFsdWVfcXVvdGVkKHAtPnRyYXApOworCQkJCXNocHJpbnRmKCIgJXNcbiIsIHAtPm5hbWUpOworCQkJfQorCQlyZXR1cm4gKDApOworCX0KKworCS8qCisJICogVXNlIGNhc2Ugc2Vuc2l0aXZlIGxvb2t1cCBmb3IgZmlyc3QgYXJnIHNvIHRoZQorCSAqIGNvbW1hbmQgJ2V4aXQnIGlzbid0IGNvbmZ1c2VkIHdpdGggdGhlIHBzZXVkby1zaWduYWwKKwkgKiAnRVhJVCcuCisJICovCisJcyA9IChnZXR0cmFwKCp3cCwgZmFsc2UpID09IE5VTEwpID8gKndwKysgOiBOVUxMOyAvKiBnZXQgY29tbWFuZCAqLworCWlmIChzICE9IE5VTEwgJiYgc1swXSA9PSAnLScgJiYgc1sxXSA9PSAnXDAnKQorCQlzID0gTlVMTDsKKworCS8qIHNldC9jbGVhciB0cmFwcyAqLworCXdoaWxlICgqd3AgIT0gTlVMTCkgeworCQlwID0gZ2V0dHJhcCgqd3ArKywgdHJ1ZSk7CisJCWlmIChwID09IE5VTEwpIHsKKwkJCWJpX2Vycm9yZigiYmFkIHNpZ25hbCAlcyIsIHdwWy0xXSk7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCXNldHRyYXAocCwgcyk7CisJfQorCXJldHVybiAoMCk7Cit9CisKK2ludAorY19leGl0cmV0dXJuKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgbiwgaG93ID0gTEVYSVQ7CisJY29uc3QgY2hhciAqYXJnOworCisJaWYgKGtzaF9nZXRvcHQod3AsICZidWlsdGluX29wdCwgbnVsbCkgPT0gJz8nKQorCQlyZXR1cm4gKDEpOworCWFyZyA9IHdwW2J1aWx0aW5fb3B0Lm9wdGluZF07CisKKwlpZiAoYXJnKSB7CisJCWlmICghZ2V0bihhcmcsICZuKSkgeworCQkJZXhzdGF0ID0gMTsKKwkJCXdhcm5pbmdmKHRydWUsICIlczogYmFkIG51bWJlciIsIGFyZyk7CisJCX0gZWxzZQorCQkJZXhzdGF0ID0gbjsKKwl9CisJaWYgKHdwWzBdWzBdID09ICdyJykgeyAvKiByZXR1cm4gKi8KKwkJc3RydWN0IGVudiAqZXA7CisKKwkJLyogbmVlZCB0byB0ZWxsIGlmIHRoaXMgaXMgZXhpdCBvciByZXR1cm4gc28gdHJhcCBleGl0IHdpbGwKKwkJICogd29yayByaWdodCAoUE9TSVgpCisJCSAqLworCQlmb3IgKGVwID0gZTsgZXA7IGVwID0gZXAtPm9lbnYpCisJCQlpZiAoU1RPUF9SRVRVUk4oZXAtPnR5cGUpKSB7CisJCQkJaG93ID0gTFJFVFVSTjsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisKKwlpZiAoaG93ID09IExFWElUICYmICFyZWFsbHlfZXhpdCAmJiBqX3N0b3BwZWRfcnVubmluZygpKSB7CisJCXJlYWxseV9leGl0ID0gMTsKKwkJaG93ID0gTFNIRUxMOworCX0KKworCXF1aXRlbnYoTlVMTCk7CS8qIGdldCByaWQgb2YgYW55IGkvbyByZWRpcmVjdGlvbnMgKi8KKwl1bndpbmQoaG93KTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKK2ludAorY19icmtjb250KGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgbiwgcXVpdDsKKwlzdHJ1Y3QgZW52ICplcCwgKmxhc3RfZXAgPSBOVUxMOworCWNvbnN0IGNoYXIgKmFyZzsKKworCWlmIChrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsIG51bGwpID09ICc/JykKKwkJcmV0dXJuICgxKTsKKwlhcmcgPSB3cFtidWlsdGluX29wdC5vcHRpbmRdOworCisJaWYgKCFhcmcpCisJCW4gPSAxOworCWVsc2UgaWYgKCFiaV9nZXRuKGFyZywgJm4pKQorCQlyZXR1cm4gKDEpOworCXF1aXQgPSBuOworCWlmIChxdWl0IDw9IDApIHsKKwkJLyogQVQmVCBrc2ggZG9lcyB0aGlzIGZvciBub24taW50ZXJhY3RpdmUgc2hlbGxzIG9ubHkgLSB3ZWlyZCAqLworCQliaV9lcnJvcmYoIiVzOiBiYWQgdmFsdWUiLCBhcmcpOworCQlyZXR1cm4gKDEpOworCX0KKworCS8qIFN0b3AgYXQgRV9OT05FLCBFX1BBUlNFLCBFX0ZVTkMsIG9yIEVfSU5DTCAqLworCWZvciAoZXAgPSBlOyBlcCAmJiAhU1RPUF9CUktDT05UKGVwLT50eXBlKTsgZXAgPSBlcC0+b2VudikKKwkJaWYgKGVwLT50eXBlID09IEVfTE9PUCkgeworCQkJaWYgKC0tcXVpdCA9PSAwKQorCQkJCWJyZWFrOworCQkJZXAtPmZsYWdzIHw9IEVGX0JSS0NPTlRfUEFTUzsKKwkJCWxhc3RfZXAgPSBlcDsKKwkJfQorCisJaWYgKHF1aXQpIHsKKwkJLyogQVQmVCBrc2ggZG9lc24ndCBwcmludCBhIG1lc3NhZ2UgLSBqdXN0IGRvZXMgd2hhdCBpdAorCQkgKiBjYW4uIFdlIHByaW50IGEgbWVzc2FnZSAnY2F1c2UgaXQgaGVscHMgaW4gZGVidWdnaW5nCisJCSAqIHNjcmlwdHMsIGJ1dCBkb24ndCBnZW5lcmF0ZSBhbiBlcnJvciAoaWUsIGtlZXAgZ29pbmcpLgorCQkgKi8KKwkJaWYgKG4gPT0gcXVpdCkgeworCQkJd2FybmluZ2YodHJ1ZSwgIiVzOiBjYW5ub3QgJXMiLCB3cFswXSwgd3BbMF0pOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQkvKiBQT1NJWCBzYXlzIGlmIG4gaXMgdG9vIGJpZywgdGhlIGxhc3QgZW5jbG9zaW5nIGxvb3AKKwkJICogc2hhbGwgYmUgdXNlZC4gRG9lc24ndCBzYXkgdG8gcHJpbnQgYW4gZXJyb3IgYnV0IHdlCisJCSAqIGRvIGFueXdheSAnY2F1c2UgdGhlIHVzZXIgbWVzc2VkIHVwLgorCQkgKi8KKwkJaWYgKGxhc3RfZXApCisJCQlsYXN0X2VwLT5mbGFncyAmPSB+RUZfQlJLQ09OVF9QQVNTOworCQl3YXJuaW5nZih0cnVlLCAiJXM6IGNhbiBvbmx5ICVzICVkIGxldmVsKHMpIiwKKwkJICAgIHdwWzBdLCB3cFswXSwgbiAtIHF1aXQpOworCX0KKworCXVud2luZCgqd3BbMF0gPT0gJ2InID8gTEJSRUFLIDogTENPTlRJTik7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitpbnQKK2Nfc2V0KGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgYXJnaTsKKwlib29sIHNldGFyZ3M7CisJc3RydWN0IGJsb2NrICpsID0gZS0+bG9jOworCWNvbnN0IGNoYXIgKipvd3A7CisKKwlpZiAod3BbMV0gPT0gTlVMTCkgeworCQlzdGF0aWMgY29uc3QgY2hhciAqYXJnc1tdID0geyAic2V0IiwgIi0iLCBOVUxMIH07CisJCXJldHVybiAoY190eXBlc2V0KGFyZ3MpKTsKKwl9CisKKwlhcmdpID0gcGFyc2VfYXJncyh3cCwgT0ZfU0VULCAmc2V0YXJncyk7CisJaWYgKGFyZ2kgPCAwKQorCQlyZXR1cm4gKDEpOworCS8qIHNldCAkIyBhbmQgJCogKi8KKwlpZiAoc2V0YXJncykgeworCQl3cCArPSBhcmdpIC0gMTsKKwkJb3dwID0gd3A7CisJCXdwWzBdID0gbC0+YXJndlswXTsgLyogc2F2ZSAkMCAqLworCQl3aGlsZSAoKisrd3AgIT0gTlVMTCkKKwkJCXN0cmR1cHgoKndwLCAqd3AsICZsLT5hcmVhKTsKKwkJbC0+YXJnYyA9IHdwIC0gb3dwIC0gMTsKKwkJbC0+YXJndiA9IGFsbG9jKChsLT5hcmdjICsgMikgKiBzaXplb2YoY2hhciAqKSwgJmwtPmFyZWEpOworCQlmb3IgKHdwID0gbC0+YXJndjsgKCp3cCsrID0gKm93cCsrKSAhPSBOVUxMOyApCisJCQk7CisJfQorCS8qLQorCSAqIFBPU0lYIHNheXMgc2V0IGV4aXQgc3RhdHVzIGlzIDAsIGJ1dCBvbGQgc2NyaXB0cyB0aGF0IHVzZQorCSAqIGdldG9wdCgxKSB1c2UgdGhlIGNvbnN0cnVjdAorCSAqCXNldCAtLSAkKGdldG9wdCBhYjpjICIkQCIpCisJICogd2hpY2ggYXNzdW1lcyB0aGUgZXhpdCB2YWx1ZSBzZXQgd2lsbCBiZSB0aGF0IG9mIHRoZSAkKCkKKwkgKiAoc3Vic3RfZXhzdGF0IGlzIGNsZWFyZWQgaW4gZXhlY3V0ZSgpIHNvIHRoYXQgaXQgd2lsbCBiZSAwCisJICogaWYgdGhlcmUgYXJlIG5vIGNvbW1hbmQgc3Vic3RpdHV0aW9ucykuCisJICogU3dpdGNoZWQga3NoICghcG9zaXggIXNoKSB0byBQT1NJWCBpbiBta3NoIFIzOWIuCisJICovCisJcmV0dXJuIChGbGFnKEZTSCkgPyBzdWJzdF9leHN0YXQgOiAwKTsKK30KKworaW50CitjX3Vuc2V0KGNvbnN0IGNoYXIgKip3cCkKK3sKKwljb25zdCBjaGFyICppZDsKKwlpbnQgb3B0YzsKKwlib29sIHVuc2V0X3ZhciA9IHRydWU7CisKKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KHdwLCAmYnVpbHRpbl9vcHQsICJmdiIpKSAhPSAtMSkKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ2YnOgorCQkJdW5zZXRfdmFyID0gZmFsc2U7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQl1bnNldF92YXIgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJcmV0dXJuICgxKTsKKwkJfQorCXdwICs9IGJ1aWx0aW5fb3B0Lm9wdGluZDsKKwlmb3IgKDsgKGlkID0gKndwKSAhPSBOVUxMOyB3cCsrKQorCQlpZiAodW5zZXRfdmFyKSB7CS8qIHVuc2V0IHZhcmlhYmxlICovCisJCQlzdHJ1Y3QgdGJsICp2cDsKKwkJCWNoYXIgKmNwID0gTlVMTDsKKwkJCXNpemVfdCBuOworCisJCQluID0gc3RybGVuKGlkKTsKKwkJCWlmIChuID4gMyAmJiBpZFtuLTNdID09ICdbJyAmJiBpZFtuLTJdID09ICcqJyAmJgorCQkJICAgIGlkW24tMV0gPT0gJ10nKSB7CisJCQkJc3RybmR1cHgoY3AsIGlkLCBuIC0gMywgQVRFTVApOworCQkJCWlkID0gY3A7CisJCQkJb3B0YyA9IDM7CisJCQl9IGVsc2UKKwkJCQlvcHRjID0gdnN0cmNocihpZCwgJ1snKSA/IDAgOiAxOworCisJCQl2cCA9IGdsb2JhbChpZCk7CisJCQlhZnJlZShjcCwgQVRFTVApOworCisJCQlpZiAoKHZwLT5mbGFnJlJET05MWSkpIHsKKwkJCQliaV9lcnJvcmYoIiVzIGlzIHJlYWQgb25seSIsIHZwLT5uYW1lKTsKKwkJCQlyZXR1cm4gKDEpOworCQkJfQorCQkJdW5zZXQodnAsIG9wdGMpOworCQl9IGVsc2UJCQkvKiB1bnNldCBmdW5jdGlvbiAqLworCQkJZGVmaW5lKGlkLCBOVUxMKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAorcF90aW1lKHN0cnVjdCBzaGYgKnNoZiwgYm9vbCBwb3NpeCwgbG9uZyB0dl9zZWMsIGludCB0dl91c2VjLCBpbnQgd2lkdGgsCisgICAgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpzdWZmaXgpCit7CisJdHZfdXNlYyAvPSAxMDAwMDsKKwlpZiAocG9zaXgpCisJCXNoZl9mcHJpbnRmKHNoZiwgIiVzJSpsZC4lMDJkJXMiLCBwcmVmaXgsIHdpZHRoLAorCQkgICAgdHZfc2VjLCB0dl91c2VjLCBzdWZmaXgpOworCWVsc2UKKwkJc2hmX2ZwcmludGYoc2hmLCAiJXMlKmxkbSVkLiUwMmRzJXMiLCBwcmVmaXgsIHdpZHRoLAorCQkgICAgdHZfc2VjIC8gNjAsIChpbnQpKHR2X3NlYyAlIDYwKSwgdHZfdXNlYywgc3VmZml4KTsKK30KKworaW50CitjX3RpbWVzKGNvbnN0IGNoYXIgKip3cCBNS1NIX0FfVU5VU0VEKQoreworCXN0cnVjdCBydXNhZ2UgdXNhZ2U7CisKKwlnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZ1c2FnZSk7CisJcF90aW1lKHNobF9zdGRvdXQsIGZhbHNlLCB1c2FnZS5ydV91dGltZS50dl9zZWMsCisJICAgIHVzYWdlLnJ1X3V0aW1lLnR2X3VzZWMsIDAsIG51bGwsICIgIik7CisJcF90aW1lKHNobF9zdGRvdXQsIGZhbHNlLCB1c2FnZS5ydV9zdGltZS50dl9zZWMsCisJICAgIHVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMsIDAsIG51bGwsICJcbiIpOworCisJZ2V0cnVzYWdlKFJVU0FHRV9DSElMRFJFTiwgJnVzYWdlKTsKKwlwX3RpbWUoc2hsX3N0ZG91dCwgZmFsc2UsIHVzYWdlLnJ1X3V0aW1lLnR2X3NlYywKKwkgICAgdXNhZ2UucnVfdXRpbWUudHZfdXNlYywgMCwgbnVsbCwgIiAiKTsKKwlwX3RpbWUoc2hsX3N0ZG91dCwgZmFsc2UsIHVzYWdlLnJ1X3N0aW1lLnR2X3NlYywKKwkgICAgdXNhZ2UucnVfc3RpbWUudHZfdXNlYywgMCwgbnVsbCwgIlxuIik7CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogdGltZSBwaXBlbGluZSAocmVhbGx5IGEgc3RhdGVtZW50LCBub3QgYSBidWlsdC1pbiBjb21tYW5kKQorICovCitpbnQKK3RpbWV4KHN0cnVjdCBvcCAqdCwgaW50IGYsIHZvbGF0aWxlIGludCAqeGVycm9rKQoreworI2RlZmluZSBURl9OT0FSR1MJQklUKDApCisjZGVmaW5lIFRGX05PUkVBTAlCSVQoMSkJCS8qIGRvbid0IHJlcG9ydCByZWFsIHRpbWUgKi8KKyNkZWZpbmUgVEZfUE9TSVgJQklUKDIpCQkvKiByZXBvcnQgaW4gUE9TSVggZm9ybWF0ICovCisJaW50IHJ2ID0gMCwgdGYgPSAwOworCXN0cnVjdCBydXNhZ2UgcnUwLCBydTEsIGNydTAsIGNydTE7CisJc3RydWN0IHRpbWV2YWwgdXNydGltZSwgc3lzdGltZSwgdHYwLCB0djE7CisKKwlnZXR0aW1lb2ZkYXkoJnR2MCwgTlVMTCk7CisJZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmcnUwKTsKKwlnZXRydXNhZ2UoUlVTQUdFX0NISUxEUkVOLCAmY3J1MCk7CisJaWYgKHQtPmxlZnQpIHsKKwkJLyoKKwkJICogVHdvIHdheXMgb2YgZ2V0dGluZyBjcHUgdXNhZ2Ugb2YgYSBjb21tYW5kOiBqdXN0IHVzZSB0MAorCQkgKiBhbmQgdDEgKHdoaWNoIHdpbGwgZ2V0IGNwdSB1c2FnZSBmcm9tIG90aGVyIGpvYnMgdGhhdAorCQkgKiBmaW5pc2ggd2hpbGUgd2UgYXJlIGV4ZWN1dGluZyB0LT5sZWZ0KSwgb3IgZ2V0IHRoZQorCQkgKiBjcHUgdXNhZ2Ugb2YgdC0+bGVmdC4gQVQmVCBrc2ggZG9lcyB0aGUgZm9ybWVyLCB3aGlsZQorCQkgKiBwZGtzaCB0cmllcyB0byBkbyB0aGUgbGF0ZXIgKHRoZSBqX3VzcnRpbWUgaGFjayBkb2Vzbid0CisJCSAqIHJlYWxseSB3b3JrIGFzIGl0IG9ubHkgY291bnRzIHRoZSBsYXN0IGpvYikuCisJCSAqLworCQl0aW1lcmNsZWFyKCZqX3VzcnRpbWUpOworCQl0aW1lcmNsZWFyKCZqX3N5c3RpbWUpOworCQlydiA9IGV4ZWN1dGUodC0+bGVmdCwgZiB8IFhUSU1FLCB4ZXJyb2spOworCQlpZiAodC0+bGVmdC0+dHlwZSA9PSBUQ09NKQorCQkJdGYgfD0gdC0+bGVmdC0+c3RyWzBdOworCQlnZXR0aW1lb2ZkYXkoJnR2MSwgTlVMTCk7CisJCWdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnJ1MSk7CisJCWdldHJ1c2FnZShSVVNBR0VfQ0hJTERSRU4sICZjcnUxKTsKKwl9IGVsc2UKKwkJdGYgPSBURl9OT0FSR1M7CisKKwlpZiAodGYgJiBURl9OT0FSR1MpIHsgLyoga3NoOTMgLSByZXBvcnQgc2hlbGwgdGltZXMgKHNoZWxsK2tpZHMpICovCisJCXRmIHw9IFRGX05PUkVBTDsKKwkJdGltZXJhZGQoJnJ1MC5ydV91dGltZSwgJmNydTAucnVfdXRpbWUsICZ1c3J0aW1lKTsKKwkJdGltZXJhZGQoJnJ1MC5ydV9zdGltZSwgJmNydTAucnVfc3RpbWUsICZzeXN0aW1lKTsKKwl9IGVsc2UgeworCQl0aW1lcnN1YigmcnUxLnJ1X3V0aW1lLCAmcnUwLnJ1X3V0aW1lLCAmdXNydGltZSk7CisJCXRpbWVyYWRkKCZ1c3J0aW1lLCAmal91c3J0aW1lLCAmdXNydGltZSk7CisJCXRpbWVyc3ViKCZydTEucnVfc3RpbWUsICZydTAucnVfc3RpbWUsICZzeXN0aW1lKTsKKwkJdGltZXJhZGQoJnN5c3RpbWUsICZqX3N5c3RpbWUsICZzeXN0aW1lKTsKKwl9CisKKwlpZiAoISh0ZiAmIFRGX05PUkVBTCkpIHsKKwkJdGltZXJzdWIoJnR2MSwgJnR2MCwgJnR2MSk7CisJCWlmICh0ZiAmIFRGX1BPU0lYKQorCQkJcF90aW1lKHNobF9vdXQsIHRydWUsIHR2MS50dl9zZWMsIHR2MS50dl91c2VjLAorCQkJICAgIDUsICJyZWFsICIsICJcbiIpOworCQllbHNlCisJCQlwX3RpbWUoc2hsX291dCwgZmFsc2UsIHR2MS50dl9zZWMsIHR2MS50dl91c2VjLAorCQkJICAgIDUsIG51bGwsICIgcmVhbCAiKTsKKwl9CisJaWYgKHRmICYgVEZfUE9TSVgpCisJCXBfdGltZShzaGxfb3V0LCB0cnVlLCB1c3J0aW1lLnR2X3NlYywgdXNydGltZS50dl91c2VjLAorCQkgICAgNSwgInVzZXIgIiwgIlxuIik7CisJZWxzZQorCQlwX3RpbWUoc2hsX291dCwgZmFsc2UsIHVzcnRpbWUudHZfc2VjLCB1c3J0aW1lLnR2X3VzZWMsCisJCSAgICA1LCBudWxsLCAiIHVzZXIgIik7CisJaWYgKHRmICYgVEZfUE9TSVgpCisJCXBfdGltZShzaGxfb3V0LCB0cnVlLCBzeXN0aW1lLnR2X3NlYywgc3lzdGltZS50dl91c2VjLAorCQkgICAgNSwgInN5cyAgIiwgIlxuIik7CisJZWxzZQorCQlwX3RpbWUoc2hsX291dCwgZmFsc2UsIHN5c3RpbWUudHZfc2VjLCBzeXN0aW1lLnR2X3VzZWMsCisJCSAgICA1LCBudWxsLCAiIHN5c3RlbVxuIik7CisJc2hmX2ZsdXNoKHNobF9vdXQpOworCisJcmV0dXJuIChydik7Cit9CisKK3ZvaWQKK3RpbWV4X2hvb2soc3RydWN0IG9wICp0LCBjaGFyICoqdm9sYXRpbGUgKmFwcCkKK3sKKwljaGFyICoqd3AgPSAqYXBwOworCWludCBvcHRjLCBpLCBqOworCUdldG9wdCBvcHQ7CisKKwlrc2hfZ2V0b3B0X3Jlc2V0KCZvcHQsIDApOworCW9wdC5vcHRpbmQgPSAwOwkvKiBzdGFydCBhdCB0aGUgc3RhcnQgKi8KKwl3aGlsZSAoKG9wdGMgPSBrc2hfZ2V0b3B0KChjb25zdCBjaGFyICoqKXdwLCAmb3B0LCAiOnAiKSkgIT0gLTEpCisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdwJzoKKwkJCXQtPnN0clswXSB8PSBURl9QT1NJWDsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCWVycm9yZigidGltZTogLSVzIHVua25vd24gb3B0aW9uIiwgb3B0Lm9wdGFyZyk7CisJCWNhc2UgJzonOgorCQkJZXJyb3JmKCJ0aW1lOiAtJXMgcmVxdWlyZXMgYW4gYXJndW1lbnQiLAorCQkJICAgIG9wdC5vcHRhcmcpOworCQl9CisJLyogQ29weSBjb21tYW5kIHdvcmRzIGRvd24gb3ZlciBvcHRpb25zLiAqLworCWlmIChvcHQub3B0aW5kICE9IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IG9wdC5vcHRpbmQ7IGkrKykKKwkJCWFmcmVlKHdwW2ldLCBBVEVNUCk7CisJCWZvciAoaSA9IDAsIGogPSBvcHQub3B0aW5kOyAod3BbaV0gPSB3cFtqXSk7IGkrKywgaisrKQorCQkJOworCX0KKwlpZiAoIXdwWzBdKQorCQl0LT5zdHJbMF0gfD0gVEZfTk9BUkdTOworCSphcHAgPSB3cDsKK30KKworLyogZXhlYyB3aXRoIG5vIGFyZ3MgLSBhcmdzIGNhc2UgaXMgdGFrZW4gY2FyZSBvZiBpbiBjb21leGVjKCkgKi8KK2ludAorY19leGVjKGNvbnN0IGNoYXIgKip3cCBNS1NIX0FfVU5VU0VEKQoreworCWludCBpOworCisJLyogbWFrZSBzdXJlIHJlZGlyZWN0cyBzdGF5IGluIHBsYWNlICovCisJaWYgKGUtPnNhdmVmZCAhPSBOVUxMKSB7CisJCWZvciAoaSA9IDA7IGkgPCBOVUZJTEU7IGkrKykgeworCQkJaWYgKGUtPnNhdmVmZFtpXSA+IDApCisJCQkJY2xvc2UoZS0+c2F2ZWZkW2ldKTsKKwkJCS8qCisJCQkgKiBrZWVwIGFsbCBmaWxlIGRlc2NyaXB0b3JzID4gMiBwcml2YXRlIGZvciBrc2gsCisJCQkgKiBidXQgbm90IGZvciBQT1NJWCBvciBsZWdhY3kva2x1ZGdlIHNoCisJCQkgKi8KKwkJCWlmICghRmxhZyhGUE9TSVgpICYmICFGbGFnKEZTSCkgJiYgaSA+IDIgJiYKKwkJCSAgICBlLT5zYXZlZmRbaV0pCisJCQkJZmNudGwoaSwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisJCX0KKwkJZS0+c2F2ZWZkID0gTlVMTDsKKwl9CisJcmV0dXJuICgwKTsKK30KKworI2lmIEhBVkVfTUtOT0QKK2ludAorY19ta25vZChjb25zdCBjaGFyICoqd3ApCit7CisJaW50IGFyZ2MsIG9wdGMsIHJ2ID0gMDsKKwlib29sIGlzbWtmaWZvID0gZmFsc2U7CisJY29uc3QgY2hhciAqKmFyZ3Y7CisJdm9pZCAqc2V0ID0gTlVMTDsKKwltb2RlX3QgbW9kZSA9IDAsIG9sZG1vZGUgPSAwOworCisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCAibToiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcHRjKSB7CisJCWNhc2UgJ20nOgorCQkJc2V0ID0gc2V0bW9kZShidWlsdGluX29wdC5vcHRhcmcpOworCQkJaWYgKHNldCA9PSBOVUxMKSB7CisJCQkJYmlfZXJyb3JmKCJpbnZhbGlkIGZpbGUgbW9kZSIpOworCQkJCXJldHVybiAoMSk7CisJCQl9CisJCQltb2RlID0gZ2V0bW9kZShzZXQsIChtb2RlX3QpKERFRkZJTEVNT0RFKSk7CisJCQlmcmVlKHNldCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gY19ta25vZF91c2FnZTsKKwkJfQorCX0KKwlhcmd2ID0gJndwW2J1aWx0aW5fb3B0Lm9wdGluZF07CisJaWYgKGFyZ3ZbMF0gPT0gTlVMTCkKKwkJZ290byBjX21rbm9kX3VzYWdlOworCWZvciAoYXJnYyA9IDA7IGFyZ3ZbYXJnY107IGFyZ2MrKykKKwkJOworCWlmIChhcmdjID09IDIgJiYgYXJndlsxXVswXSA9PSAncCcpCisJCWlzbWtmaWZvID0gdHJ1ZTsKKwllbHNlIGlmIChhcmdjICE9IDQgfHwgKGFyZ3ZbMV1bMF0gIT0gJ2InICYmIGFyZ3ZbMV1bMF0gIT0gJ2MnKSkKKwkJZ290byBjX21rbm9kX3VzYWdlOworCisJaWYgKHNldCAhPSBOVUxMKQorCQlvbGRtb2RlID0gdW1hc2soKG1vZGVfdCkwKTsKKwllbHNlCisJCW1vZGUgPSBERUZGSUxFTU9ERTsKKworCW1vZGUgfD0gKGFyZ3ZbMV1bMF0gPT0gJ2InKSA/IFNfSUZCTEsgOgorCSAgICAoYXJndlsxXVswXSA9PSAnYycpID8gU19JRkNIUiA6IDA7CisKKwlpZiAoIWlzbWtmaWZvKSB7CisJCXVuc2lnbmVkIGxvbmcgbWFqbnVtLCBtaW5udW07CisJCWRldl90IGR2OworCQljaGFyICpjOworCisJCW1ham51bSA9IHN0cnRvdWwoYXJndlsyXSwgJmMsIDApOworCQlpZiAoKGMgPT0gYXJndlsyXSkgfHwgKCpjICE9ICdcMCcpKSB7CisJCQliaV9lcnJvcmYoIm5vbi1udW1lcmljIGRldmljZSBtYWpvciAnJXMnIiwgYXJndlsyXSk7CisJCQlnb3RvIGNfbWtub2RfZXJyOworCQl9CisJCW1pbm51bSA9IHN0cnRvdWwoYXJndlszXSwgJmMsIDApOworCQlpZiAoKGMgPT0gYXJndlszXSkgfHwgKCpjICE9ICdcMCcpKSB7CisJCQliaV9lcnJvcmYoIm5vbi1udW1lcmljIGRldmljZSBtaW5vciAnJXMnIiwgYXJndlszXSk7CisJCQlnb3RvIGNfbWtub2RfZXJyOworCQl9CisJCWR2ID0gbWFrZWRldihtYWpudW0sIG1pbm51bSk7CisJCWlmICgodW5zaWduZWQgbG9uZykobWFqb3IoZHYpKSAhPSBtYWpudW0pIHsKKwkJCWJpX2Vycm9yZigiZGV2aWNlIG1ham9yIHRvbyBsYXJnZTogJWx1IiwgbWFqbnVtKTsKKwkJCWdvdG8gY19ta25vZF9lcnI7CisJCX0KKwkJaWYgKCh1bnNpZ25lZCBsb25nKShtaW5vcihkdikpICE9IG1pbm51bSkgeworCQkJYmlfZXJyb3JmKCJkZXZpY2UgbWlub3IgdG9vIGxhcmdlOiAlbHUiLCBtaW5udW0pOworCQkJZ290byBjX21rbm9kX2VycjsKKwkJfQorCQlpZiAobWtub2QoYXJndlswXSwgbW9kZSwgZHYpKQorCQkJZ290byBjX21rbm9kX2ZhaWxlZDsKKwl9IGVsc2UgaWYgKG1rZmlmbyhhcmd2WzBdLCBtb2RlKSkgeworIGNfbWtub2RfZmFpbGVkOgorCQliaV9lcnJvcmYoIiVzOiAlcyIsICp3cCwgc3RyZXJyb3IoZXJybm8pKTsKKyBjX21rbm9kX2VycjoKKwkJcnYgPSAxOworCX0KKworCWlmIChzZXQpCisJCXVtYXNrKG9sZG1vZGUpOworCXJldHVybiAocnYpOworIGNfbWtub2RfdXNhZ2U6CisJYmlfZXJyb3JmKCJ1c2FnZTogbWtub2QgWy1tIG1vZGVdIG5hbWUgYnxjIG1ham9yIG1pbm9yIik7CisJYmlfZXJyb3JmKCJ1c2FnZTogbWtub2QgWy1tIG1vZGVdIG5hbWUgcCIpOworCXJldHVybiAoMSk7Cit9CisjZW5kaWYKKworLyogZHVtbXkgZnVuY3Rpb24sIHNwZWNpYWwgY2FzZSBpbiBjb21leGVjKCkgKi8KK2ludAorY19idWlsdGluKGNvbnN0IGNoYXIgKip3cCBNS1NIX0FfVU5VU0VEKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qIHRlc3QoMSkgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGdyYW1tYXI6CisJb2V4cHIJOjo9IGFleHByIHwgYWV4cHIgIi1vIiBvZXhwciA7CisJYWV4cHIJOjo9IG5leHByIHwgbmV4cHIgIi1hIiBhZXhwciA7CisJbmV4cHIJOjo9IHByaW1hcnkgfCAiISIgbmV4cHIgOworCXByaW1hcnkJOjo9IHVuYXJ5LW9wZXJhdG9yIG9wZXJhbmQKKwkJfCBvcGVyYW5kIGJpbmFyeS1vcGVyYXRvciBvcGVyYW5kCisJCXwgb3BlcmFuZAorCQl8ICIoIiBvZXhwciAiKSIKKwkJOworCisJdW5hcnktb3BlcmF0b3IgOjo9ICItYSJ8Ii1yInwiLXcifCIteCJ8Ii1lInwiLWYifCItZCJ8Ii1jInwiLWIifCItcCJ8CisJCQkgICAiLXUifCItZyJ8Ii1rInwiLXMifCItdCJ8Ii16InwiLW4ifCItbyJ8Ii1PInwiLUcifAorCQkJICAgIi1MInwiLWgifCItUyJ8Ii1IIjsKKworCWJpbmFyeS1vcGVyYXRvciA6Oj0gIj0ifCI9PSJ8IiE9InwiLWVxInwiLW5lInwiLWdlInwiLWd0InwiLWxlInwiLWx0InwKKwkJCSAgICAiLW50InwiLW90InwiLWVmInwKKwkJCSAgICAiPCJ8Ij4iCSMgcnVsZXMgdXNlZCBmb3IgW1sgLi4gXV0gZXhwcmVzc2lvbnMKKwkJCSAgICA7CisJb3BlcmFuZCA6Oj0gPGFueSB0aGluZz4KKyovCisKKyNkZWZpbmUgVF9FUlJfRVhJVAkyCS8qIFBPU0lYIHNheXMgPiAxIGZvciBlcnJvcnMgKi8KKworaW50CitjX3Rlc3QoY29uc3QgY2hhciAqKndwKQoreworCWludCBhcmdjLCByZXM7CisJVGVzdF9lbnYgdGU7CisKKwl0ZS5mbGFncyA9IDA7CisJdGUuaXNhID0gcHRlc3RfaXNhOworCXRlLmdldG9wbmQgPSBwdGVzdF9nZXRvcG5kOworCXRlLmV2YWwgPSB0ZXN0X2V2YWw7CisJdGUuZXJyb3IgPSBwdGVzdF9lcnJvcjsKKworCWZvciAoYXJnYyA9IDA7IHdwW2FyZ2NdOyBhcmdjKyspCisJCTsKKworCWlmIChzdHJjbXAod3BbMF0sICJbIikgPT0gMCkgeworCQlpZiAoc3RyY21wKHdwWy0tYXJnY10sICJdIikgIT0gMCkgeworCQkJYmlfZXJyb3JmKCJtaXNzaW5nIF0iKTsKKwkJCXJldHVybiAoVF9FUlJfRVhJVCk7CisJCX0KKwl9CisKKwl0ZS5wb3Mud3AgPSB3cCArIDE7CisJdGUud3BfZW5kID0gd3AgKyBhcmdjOworCisJLyoKKwkgKiBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZXMgZnJvbSBQT1NJWC4yLCBzZWN0aW9uIDQuNjIuNC4KKwkgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbGwgdGhlIHJ1bGVzIGlzbid0IG5lY2Vzc2FyeSBzaW5jZQorCSAqIG91ciBwYXJzZXIgZG9lcyB0aGUgcmlnaHQgdGhpbmcgZm9yIHRoZSBvbWl0dGVkIHN0ZXBzLgorCSAqLworCWlmIChhcmdjIDw9IDUpIHsKKwkJY29uc3QgY2hhciAqKm93cCA9IHdwOworCQlpbnQgaW52ZXJ0ID0gMDsKKwkJVGVzdF9vcCBvcDsKKwkJY29uc3QgY2hhciAqb3BuZDEsICpvcG5kMjsKKworCQl3aGlsZSAoLS1hcmdjID49IDApIHsKKwkJCWlmICgoKnRlLmlzYSkoJnRlLCBUTV9FTkQpKQorCQkJCXJldHVybiAoITApOworCQkJaWYgKGFyZ2MgPT0gMykgeworCQkJCW9wbmQxID0gKCp0ZS5nZXRvcG5kKSgmdGUsIFRPX05PTk9QLCAxKTsKKwkJCQlpZiAoKG9wID0gKCp0ZS5pc2EpKCZ0ZSwgVE1fQklOT1ApKSkgeworCQkJCQlvcG5kMiA9ICgqdGUuZ2V0b3BuZCkoJnRlLCBvcCwgMSk7CisJCQkJCXJlcyA9ICgqdGUuZXZhbCkoJnRlLCBvcCwgb3BuZDEsCisJCQkJCSAgICBvcG5kMiwgMSk7CisJCQkJCWlmICh0ZS5mbGFncyAmIFRFRl9FUlJPUikKKwkJCQkJCXJldHVybiAoVF9FUlJfRVhJVCk7CisJCQkJCWlmIChpbnZlcnQgJiAxKQorCQkJCQkJcmVzID0gIXJlczsKKwkJCQkJcmV0dXJuICghcmVzKTsKKwkJCQl9CisJCQkJLyogYmFjayB1cCB0byBvcG5kMSAqLworCQkJCXRlLnBvcy53cC0tOworCQkJfQorCQkJaWYgKGFyZ2MgPT0gMSkgeworCQkJCW9wbmQxID0gKCp0ZS5nZXRvcG5kKSgmdGUsIFRPX05PTk9QLCAxKTsKKwkJCQlpZiAoc3RyY21wKG9wbmQxLCAiLXQiKSA9PSAwKQorCQkJCSAgICBicmVhazsKKwkJCQlyZXMgPSAoKnRlLmV2YWwpKCZ0ZSwgVE9fU1ROWkUsIG9wbmQxLAorCQkJCSAgICBOVUxMLCAxKTsKKwkJCQlpZiAoaW52ZXJ0ICYgMSkKKwkJCQkJcmVzID0gIXJlczsKKwkJCQlyZXR1cm4gKCFyZXMpOworCQkJfQorCQkJaWYgKCgqdGUuaXNhKSgmdGUsIFRNX05PVCkpIHsKKwkJCQlpbnZlcnQrKzsKKwkJCX0gZWxzZQorCQkJCWJyZWFrOworCQl9CisJCXRlLnBvcy53cCA9IG93cCArIDE7CisJfQorCisJcmV0dXJuICh0ZXN0X3BhcnNlKCZ0ZSkpOworfQorCisvKgorICogR2VuZXJpYyB0ZXN0IHJvdXRpbmVzLgorICovCisKK1Rlc3Rfb3AKK3Rlc3RfaXNvcChUZXN0X21ldGEgbWV0YSwgY29uc3QgY2hhciAqcykKK3sKKwljaGFyIHNjMTsKKwljb25zdCBzdHJ1Y3QgdF9vcCAqdGJsOworCisJdGJsID0gbWV0YSA9PSBUTV9VTk9QID8gdV9vcHMgOiBiX29wczsKKwlpZiAoKnMpIHsKKwkJc2MxID0gc1sxXTsKKwkJZm9yICg7IHRibC0+b3BfdGV4dFswXTsgdGJsKyspCisJCQlpZiAoc2MxID09IHRibC0+b3BfdGV4dFsxXSAmJiAhc3RyY21wKHMsIHRibC0+b3BfdGV4dCkpCisJCQkJcmV0dXJuICh0YmwtPm9wX251bSk7CisJfQorCXJldHVybiAoVE9fTk9OT1ApOworfQorCitpbnQKK3Rlc3RfZXZhbChUZXN0X2VudiAqdGUsIFRlc3Rfb3Agb3AsIGNvbnN0IGNoYXIgKm9wbmQxLCBjb25zdCBjaGFyICpvcG5kMiwKKyAgICBib29sIGRvX2V2YWwpCit7CisJaW50IGksIHM7CisJc2l6ZV90IGs7CisJc3RydWN0IHN0YXQgYjEsIGIyOworCW1rc2hfYXJpX3QgdjEsIHYyOworCisJaWYgKCFkb19ldmFsKQorCQlyZXR1cm4gKDApOworCisJc3dpdGNoICgoaW50KW9wKSB7CisJLyoKKwkgKiBVbmFyeSBPcGVyYXRvcnMKKwkgKi8KKwljYXNlIFRPX1NUTlpFOiAvKiAtbiAqLworCQlyZXR1cm4gKCpvcG5kMSAhPSAnXDAnKTsKKwljYXNlIFRPX1NUWkVSOiAvKiAteiAqLworCQlyZXR1cm4gKCpvcG5kMSA9PSAnXDAnKTsKKwljYXNlIFRPX09QVElPTjogLyogLW8gKi8KKwkJaWYgKChpID0gKm9wbmQxKSA9PSAnIScgfHwgaSA9PSAnPycpCisJCQlvcG5kMSsrOworCQlpZiAoKGsgPSBvcHRpb24ob3BuZDEpKSA9PSAoc2l6ZV90KS0xKQorCQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIChpID09ICc/JyA/IDEgOiBpID09ICchJyA/ICFGbGFnKGspIDogRmxhZyhrKSk7CisJY2FzZSBUT19GSUxSRDogLyogLXIgKi8KKwkJcmV0dXJuICh0ZXN0X2VhY2Nlc3Mob3BuZDEsIFJfT0spID09IDApOworCWNhc2UgVE9fRklMV1I6IC8qIC13ICovCisJCXJldHVybiAodGVzdF9lYWNjZXNzKG9wbmQxLCBXX09LKSA9PSAwKTsKKwljYXNlIFRPX0ZJTEVYOiAvKiAteCAqLworCQlyZXR1cm4gKHRlc3RfZWFjY2VzcyhvcG5kMSwgWF9PSykgPT0gMCk7CisJY2FzZSBUT19GSUxBWFNUOiAvKiAtYSAqLworCWNhc2UgVE9fRklMRVhTVDogLyogLWUgKi8KKwkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDApOworCWNhc2UgVE9fRklMUkVHOiAvKiAtciAqLworCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBTX0lTUkVHKGIxLnN0X21vZGUpKTsKKwljYXNlIFRPX0ZJTElEOiAvKiAtZCAqLworCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBTX0lTRElSKGIxLnN0X21vZGUpKTsKKwljYXNlIFRPX0ZJTENERVY6IC8qIC1jICovCisJCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIFNfSVNDSFIoYjEuc3RfbW9kZSkpOworCWNhc2UgVE9fRklMQkRFVjogLyogLWIgKi8KKwkJcmV0dXJuIChzdGF0KG9wbmQxLCAmYjEpID09IDAgJiYgU19JU0JMSyhiMS5zdF9tb2RlKSk7CisJY2FzZSBUT19GSUxGSUZPOiAvKiAtcCAqLworCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBTX0lTRklGTyhiMS5zdF9tb2RlKSk7CisJY2FzZSBUT19GSUxTWU06IC8qIC1oIC1MICovCisJCXJldHVybiAobHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBTX0lTTE5LKGIxLnN0X21vZGUpKTsKKwljYXNlIFRPX0ZJTFNPQ0s6IC8qIC1TICovCisJCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIFNfSVNTT0NLKGIxLnN0X21vZGUpKTsKKwljYXNlIFRPX0ZJTENERjovKiAtSCBIUCBjb250ZXh0IGRlcGVuZGVudCBmaWxlcyAoZGlyZWN0b3JpZXMpICovCisJCXJldHVybiAoMCk7CisJY2FzZSBUT19GSUxTRVRVOiAvKiAtdSAqLworCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJgorCQkgICAgKGIxLnN0X21vZGUgJiBTX0lTVUlEKSA9PSBTX0lTVUlEKTsKKwljYXNlIFRPX0ZJTFNFVEc6IC8qIC1nICovCisJCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmCisJCSAgICAoYjEuc3RfbW9kZSAmIFNfSVNHSUQpID09IFNfSVNHSUQpOworCWNhc2UgVE9fRklMU1RDSzogLyogLWsgKi8KKyNpZmRlZiBTX0lTVlRYCisJCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmCisJCSAgICAoYjEuc3RfbW9kZSAmIFNfSVNWVFgpID09IFNfSVNWVFgpOworI2Vsc2UKKwkJcmV0dXJuICgwKTsKKyNlbmRpZgorCWNhc2UgVE9fRklMR1o6IC8qIC1zICovCisJCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIGIxLnN0X3NpemUgPiAwTCk7CisJY2FzZSBUT19GSUxUVDogLyogLXQgKi8KKwkJaWYgKG9wbmQxICYmICFiaV9nZXRuKG9wbmQxLCAmaSkpIHsKKwkJCXRlLT5mbGFncyB8PSBURUZfRVJST1I7CisJCQlpID0gMDsKKwkJfSBlbHNlCisJCQlpID0gaXNhdHR5KG9wbmQxID8gaSA6IDApOworCQlyZXR1cm4gKGkpOworCWNhc2UgVE9fRklMVUlEOiAvKiAtTyAqLworCQlyZXR1cm4gKHN0YXQob3BuZDEsICZiMSkgPT0gMCAmJiBiMS5zdF91aWQgPT0ga3NoZXVpZCk7CisJY2FzZSBUT19GSUxHSUQ6IC8qIC1HICovCisJCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmIGIxLnN0X2dpZCA9PSBnZXRlZ2lkKCkpOworCS8qCisJICogQmluYXJ5IE9wZXJhdG9ycworCSAqLworCWNhc2UgVE9fU1RFUUw6IC8qID0gKi8KKwkJaWYgKHRlLT5mbGFncyAmIFRFRl9EQlJBQ0tFVCkKKwkJCXJldHVybiAoZ21hdGNoeChvcG5kMSwgb3BuZDIsIGZhbHNlKSk7CisJCXJldHVybiAoc3RyY21wKG9wbmQxLCBvcG5kMikgPT0gMCk7CisJY2FzZSBUT19TVE5FUTogLyogIT0gKi8KKwkJaWYgKHRlLT5mbGFncyAmIFRFRl9EQlJBQ0tFVCkKKwkJCXJldHVybiAoIWdtYXRjaHgob3BuZDEsIG9wbmQyLCBmYWxzZSkpOworCQlyZXR1cm4gKHN0cmNtcChvcG5kMSwgb3BuZDIpICE9IDApOworCWNhc2UgVE9fU1RMVDogLyogPCAqLworCQlyZXR1cm4gKHN0cmNtcChvcG5kMSwgb3BuZDIpIDwgMCk7CisJY2FzZSBUT19TVEdUOiAvKiA+ICovCisJCXJldHVybiAoc3RyY21wKG9wbmQxLCBvcG5kMikgPiAwKTsKKwljYXNlIFRPX0lOVEVROiAvKiAtZXEgKi8KKwljYXNlIFRPX0lOVE5FOiAvKiAtbmUgKi8KKwljYXNlIFRPX0lOVEdFOiAvKiAtZ2UgKi8KKwljYXNlIFRPX0lOVEdUOiAvKiAtZ3QgKi8KKwljYXNlIFRPX0lOVExFOiAvKiAtbGUgKi8KKwljYXNlIFRPX0lOVExUOiAvKiAtbHQgKi8KKwkJaWYgKCFldmFsdWF0ZShvcG5kMSwgJnYxLCBLU0hfUkVUVVJOX0VSUk9SLCBmYWxzZSkgfHwKKwkJICAgICFldmFsdWF0ZShvcG5kMiwgJnYyLCBLU0hfUkVUVVJOX0VSUk9SLCBmYWxzZSkpIHsKKwkJCS8qIGVycm9yIGFscmVhZHkgcHJpbnRlZC4uICovCisJCQl0ZS0+ZmxhZ3MgfD0gVEVGX0VSUk9SOworCQkJcmV0dXJuICgxKTsKKwkJfQorCQlzd2l0Y2ggKChpbnQpb3ApIHsKKwkJY2FzZSBUT19JTlRFUToKKwkJCXJldHVybiAodjEgPT0gdjIpOworCQljYXNlIFRPX0lOVE5FOgorCQkJcmV0dXJuICh2MSAhPSB2Mik7CisJCWNhc2UgVE9fSU5UR0U6CisJCQlyZXR1cm4gKHYxID49IHYyKTsKKwkJY2FzZSBUT19JTlRHVDoKKwkJCXJldHVybiAodjEgPiB2Mik7CisJCWNhc2UgVE9fSU5UTEU6CisJCQlyZXR1cm4gKHYxIDw9IHYyKTsKKwkJY2FzZSBUT19JTlRMVDoKKwkJCXJldHVybiAodjEgPCB2Mik7CisJCX0KKwljYXNlIFRPX0ZJTE5UOiAvKiAtbnQgKi8KKwkJLyoga3NoODgva3NoOTMgc3VjY2VlZCBpZiBmaWxlMiBjYW4ndCBiZSBzdGF0ZWQKKwkJICogKHN1YnRseSBkaWZmZXJlbnQgZnJvbSAnZG9lcyBub3QgZXhpc3QnKS4KKwkJICovCisJCXJldHVybiAoc3RhdChvcG5kMSwgJmIxKSA9PSAwICYmCisJCSAgICAoKChzID0gc3RhdChvcG5kMiwgJmIyKSkgPT0gMCAmJgorCQkgICAgYjEuc3RfbXRpbWUgPiBiMi5zdF9tdGltZSkgfHwgcyA8IDApKTsKKwljYXNlIFRPX0ZJTE9UOiAvKiAtb3QgKi8KKwkJLyoga3NoODgva3NoOTMgc3VjY2VlZCBpZiBmaWxlMSBjYW4ndCBiZSBzdGF0ZWQKKwkJICogKHN1YnRseSBkaWZmZXJlbnQgZnJvbSAnZG9lcyBub3QgZXhpc3QnKS4KKwkJICovCisJCXJldHVybiAoc3RhdChvcG5kMiwgJmIyKSA9PSAwICYmCisJCSAgICAoKChzID0gc3RhdChvcG5kMSwgJmIxKSkgPT0gMCAmJgorCQkgICAgYjEuc3RfbXRpbWUgPCBiMi5zdF9tdGltZSkgfHwgcyA8IDApKTsKKwljYXNlIFRPX0ZJTEVROiAvKiAtZWYgKi8KKwkJcmV0dXJuIChzdGF0IChvcG5kMSwgJmIxKSA9PSAwICYmIHN0YXQgKG9wbmQyLCAmYjIpID09IDAgJiYKKwkJICAgIGIxLnN0X2RldiA9PSBiMi5zdF9kZXYgJiYgYjEuc3RfaW5vID09IGIyLnN0X2lubyk7CisJfQorCSgqdGUtPmVycm9yKSh0ZSwgMCwgImludGVybmFsIGVycm9yOiB1bmtub3duIG9wIik7CisJcmV0dXJuICgxKTsKK30KKworLyogT24gbW9zdC9hbGwgdW5peGVuLCBhY2Nlc3MoKSBzYXlzIGV2ZXJ5dGhpbmcgaXMgZXhlY3V0YWJsZSBmb3Igcm9vdC4uLiAqLworc3RhdGljIGludAordGVzdF9lYWNjZXNzKGNvbnN0IGNoYXIgKnBhdGhsLCBpbnQgbW9kZSkKK3sKKwlpbnQgcnY7CisKKwlpZiAoKHJ2ID0gYWNjZXNzKHBhdGhsLCBtb2RlKSkgPT0gMCAmJiBrc2hldWlkID09IDAgJiYgKG1vZGUgJiBYX09LKSkgeworCQlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKworCQlpZiAoc3RhdChwYXRobCwgJnN0YXRiKSA8IDApCisJCQlydiA9IC0xOworCQllbHNlIGlmIChTX0lTRElSKHN0YXRiLnN0X21vZGUpKQorCQkJcnYgPSAwOworCQllbHNlCisJCQlydiA9IChzdGF0Yi5zdF9tb2RlICYgKFNfSVhVU1J8U19JWEdSUHxTX0lYT1RIKSkgPworCQkJICAgIDAgOiAtMTsKKwl9CisJcmV0dXJuIChydik7Cit9CisKK2ludAordGVzdF9wYXJzZShUZXN0X2VudiAqdGUpCit7CisJaW50IHJ2OworCisJcnYgPSB0ZXN0X29leHByKHRlLCAxKTsKKworCWlmICghKHRlLT5mbGFncyAmIFRFRl9FUlJPUikgJiYgISgqdGUtPmlzYSkodGUsIFRNX0VORCkpCisJCSgqdGUtPmVycm9yKSh0ZSwgMCwgInVuZXhwZWN0ZWQgb3BlcmF0b3Ivb3BlcmFuZCIpOworCisJcmV0dXJuICgodGUtPmZsYWdzICYgVEVGX0VSUk9SKSA/IFRfRVJSX0VYSVQgOiAhcnYpOworfQorCitzdGF0aWMgaW50Cit0ZXN0X29leHByKFRlc3RfZW52ICp0ZSwgYm9vbCBkb19ldmFsKQoreworCWludCBydjsKKworCWlmICgocnYgPSB0ZXN0X2FleHByKHRlLCBkb19ldmFsKSkpCisJCWRvX2V2YWwgPSBmYWxzZTsKKwlpZiAoISh0ZS0+ZmxhZ3MgJiBURUZfRVJST1IpICYmICgqdGUtPmlzYSkodGUsIFRNX09SKSkKKwkJcmV0dXJuICh0ZXN0X29leHByKHRlLCBkb19ldmFsKSB8fCBydik7CisJcmV0dXJuIChydik7Cit9CisKK3N0YXRpYyBpbnQKK3Rlc3RfYWV4cHIoVGVzdF9lbnYgKnRlLCBib29sIGRvX2V2YWwpCit7CisJaW50IHJ2OworCisJaWYgKCEocnYgPSB0ZXN0X25leHByKHRlLCBkb19ldmFsKSkpCisJCWRvX2V2YWwgPSBmYWxzZTsKKwlpZiAoISh0ZS0+ZmxhZ3MgJiBURUZfRVJST1IpICYmICgqdGUtPmlzYSkodGUsIFRNX0FORCkpCisJCXJldHVybiAodGVzdF9hZXhwcih0ZSwgZG9fZXZhbCkgJiYgcnYpOworCXJldHVybiAocnYpOworfQorCitzdGF0aWMgaW50Cit0ZXN0X25leHByKFRlc3RfZW52ICp0ZSwgYm9vbCBkb19ldmFsKQoreworCWlmICghKHRlLT5mbGFncyAmIFRFRl9FUlJPUikgJiYgKCp0ZS0+aXNhKSh0ZSwgVE1fTk9UKSkKKwkJcmV0dXJuICghdGVzdF9uZXhwcih0ZSwgZG9fZXZhbCkpOworCXJldHVybiAodGVzdF9wcmltYXJ5KHRlLCBkb19ldmFsKSk7Cit9CisKK3N0YXRpYyBpbnQKK3Rlc3RfcHJpbWFyeShUZXN0X2VudiAqdGUsIGJvb2wgZG9fZXZhbCkKK3sKKwljb25zdCBjaGFyICpvcG5kMSwgKm9wbmQyOworCWludCBydjsKKwlUZXN0X29wIG9wOworCisJaWYgKHRlLT5mbGFncyAmIFRFRl9FUlJPUikKKwkJcmV0dXJuICgwKTsKKwlpZiAoKCp0ZS0+aXNhKSh0ZSwgVE1fT1BBUkVOKSkgeworCQlydiA9IHRlc3Rfb2V4cHIodGUsIGRvX2V2YWwpOworCQlpZiAodGUtPmZsYWdzICYgVEVGX0VSUk9SKQorCQkJcmV0dXJuICgwKTsKKwkJaWYgKCEoKnRlLT5pc2EpKHRlLCBUTV9DUEFSRU4pKSB7CisJCQkoKnRlLT5lcnJvcikodGUsIDAsICJtaXNzaW5nIGNsb3NpbmcgcGFyZW4iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJcmV0dXJuIChydik7CisJfQorCS8qCisJICogQmluYXJ5IHNob3VsZCBoYXZlIHByZWNlZGVuY2Ugb3ZlciB1bmFyeSBpbiB0aGlzIGNhc2UKKwkgKiBzbyB0aGF0IHNvbWV0aGluZyBsaWtlIHRlc3QgXCggLWYgPSAtZiBcKSBpcyBhY2NlcHRlZAorCSAqLworCWlmICgodGUtPmZsYWdzICYgVEVGX0RCUkFDS0VUKSB8fCAoJnRlLT5wb3Mud3BbMV0gPCB0ZS0+d3BfZW5kICYmCisJICAgICF0ZXN0X2lzb3AoVE1fQklOT1AsIHRlLT5wb3Mud3BbMV0pKSkgeworCQlpZiAoKG9wID0gKCp0ZS0+aXNhKSh0ZSwgVE1fVU5PUCkpKSB7CisJCQkvKiB1bmFyeSBleHByZXNzaW9uICovCisJCQlvcG5kMSA9ICgqdGUtPmdldG9wbmQpKHRlLCBvcCwgZG9fZXZhbCk7CisJCQlpZiAoIW9wbmQxKSB7CisJCQkJKCp0ZS0+ZXJyb3IpKHRlLCAtMSwgIm1pc3NpbmcgYXJndW1lbnQiKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCisJCQlyZXR1cm4gKCgqdGUtPmV2YWwpKHRlLCBvcCwgb3BuZDEsIE5VTEwsIGRvX2V2YWwpKTsKKwkJfQorCX0KKwlvcG5kMSA9ICgqdGUtPmdldG9wbmQpKHRlLCBUT19OT05PUCwgZG9fZXZhbCk7CisJaWYgKCFvcG5kMSkgeworCQkoKnRlLT5lcnJvcikodGUsIDAsICJleHByZXNzaW9uIGV4cGVjdGVkIik7CisJCXJldHVybiAoMCk7CisJfQorCWlmICgob3AgPSAoKnRlLT5pc2EpKHRlLCBUTV9CSU5PUCkpKSB7CisJCS8qIGJpbmFyeSBleHByZXNzaW9uICovCisJCW9wbmQyID0gKCp0ZS0+Z2V0b3BuZCkodGUsIG9wLCBkb19ldmFsKTsKKwkJaWYgKCFvcG5kMikgeworCQkJKCp0ZS0+ZXJyb3IpKHRlLCAtMSwgIm1pc3Npbmcgc2Vjb25kIGFyZ3VtZW50Iik7CisJCQlyZXR1cm4gKDApOworCQl9CisKKwkJcmV0dXJuICgoKnRlLT5ldmFsKSh0ZSwgb3AsIG9wbmQxLCBvcG5kMiwgZG9fZXZhbCkpOworCX0KKwlyZXR1cm4gKCgqdGUtPmV2YWwpKHRlLCBUT19TVE5aRSwgb3BuZDEsIE5VTEwsIGRvX2V2YWwpKTsKK30KKworLyoKKyAqIFBsYWluIHRlc3QgKHRlc3QgYW5kIFsgLi4gXSkgc3BlY2lmaWMgcm91dGluZXMuCisgKi8KKworLyoKKyAqIFRlc3QgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYSB3aGF0ZXZlci4gQWNjZXB0cyB0aGUgY3VycmVudCB0b2tlbiBpZgorICogaXQgaXMuIFJldHVybnMgMCBpZiBpdCBpcyBub3QsIG5vbi16ZXJvIGlmIGl0IGlzIChpbiB0aGUgY2FzZSBvZgorICogVE1fVU5PUCBhbmQgVE1fQklOT1AsIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhIFRlc3Rfb3ApLgorICovCitzdGF0aWMgVGVzdF9vcAorcHRlc3RfaXNhKFRlc3RfZW52ICp0ZSwgVGVzdF9tZXRhIG1ldGEpCit7CisJLyogT3JkZXIgaW1wb3J0YW50IC0gaW5kZXhlZCBieSBUZXN0X21ldGEgdmFsdWVzICovCisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRva2Vuc1tdID0geworCQkiLW8iLCAiLWEiLCAiISIsICIoIiwgIikiCisJfTsKKwlUZXN0X29wIHJ2OworCisJaWYgKHRlLT5wb3Mud3AgPj0gdGUtPndwX2VuZCkKKwkJcmV0dXJuIChtZXRhID09IFRNX0VORCA/IFRPX05PTk5VTEwgOiBUT19OT05PUCk7CisKKwlpZiAobWV0YSA9PSBUTV9VTk9QIHx8IG1ldGEgPT0gVE1fQklOT1ApCisJCXJ2ID0gdGVzdF9pc29wKG1ldGEsICp0ZS0+cG9zLndwKTsKKwllbHNlIGlmIChtZXRhID09IFRNX0VORCkKKwkJcnYgPSBUT19OT05PUDsKKwllbHNlCisJCXJ2ID0gIXN0cmNtcCgqdGUtPnBvcy53cCwgdG9rZW5zWyhpbnQpbWV0YV0pID8KKwkJICAgIFRPX05PTk5VTEwgOiBUT19OT05PUDsKKworCS8qIEFjY2VwdCB0aGUgdG9rZW4/ICovCisJaWYgKHJ2ICE9IFRPX05PTk9QKQorCQl0ZS0+cG9zLndwKys7CisKKwlyZXR1cm4gKHJ2KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorcHRlc3RfZ2V0b3BuZChUZXN0X2VudiAqdGUsIFRlc3Rfb3Agb3AsIGJvb2wgZG9fZXZhbCBNS1NIX0FfVU5VU0VEKQoreworCWlmICh0ZS0+cG9zLndwID49IHRlLT53cF9lbmQpCisJCXJldHVybiAob3AgPT0gVE9fRklMVFQgPyAiMSIgOiBOVUxMKTsKKwlyZXR1cm4gKCp0ZS0+cG9zLndwKyspOworfQorCitzdGF0aWMgdm9pZAorcHRlc3RfZXJyb3IoVGVzdF9lbnYgKnRlLCBpbnQgb2ZzLCBjb25zdCBjaGFyICptc2cpCit7CisJY29uc3QgY2hhciAqb3A7CisKKwl0ZS0+ZmxhZ3MgfD0gVEVGX0VSUk9SOworCWlmICgob3AgPSB0ZS0+cG9zLndwICsgb2ZzID49IHRlLT53cF9lbmQgPyBOVUxMIDogdGUtPnBvcy53cFtvZnNdKSkKKwkJYmlfZXJyb3JmKCIlczogJXMiLCBvcCwgbXNnKTsKKwllbHNlCisJCWJpX2Vycm9yZigiJXMiLCBtc2cpOworfQorCisjaWZuZGVmIE1LU0hfTk9fTElNSVRTCisjZGVmaW5lIFNPRlQJMHgxCisjZGVmaW5lIEhBUkQJMHgyCisKK3N0cnVjdCBsaW1pdHMgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IHJlc291cmNlOwkJLyogcmVzb3VyY2UgdG8gZ2V0L3NldCAqLworCWludCBmYWN0b3I7CQkvKiBtdWx0aXBseSBieSB0byBnZXQgcmxpbV97Y3VyLG1heH0gdmFsdWVzICovCisJY2hhciBvcHRpb247Cit9OworCitzdGF0aWMgdm9pZCBwcmludF91bGltaXQoY29uc3Qgc3RydWN0IGxpbWl0cyAqLCBpbnQpOworc3RhdGljIGludCBzZXRfdWxpbWl0KGNvbnN0IHN0cnVjdCBsaW1pdHMgKiwgY29uc3QgY2hhciAqLCBpbnQpOworCisvKiBNYWdpYyB0byBkaXZpbmUgdGhlICdtJyBhbmQgJ3YnIGxpbWl0cyAqLworCisjaWZkZWYgUkxJTUlUX0FTCisjaWYgIWRlZmluZWQoUkxJTUlUX1ZNRU0pIHx8IChSTElNSVRfVk1FTSA9PSBSTElNSVRfQVMpIHx8IFwKKyAgICAhZGVmaW5lZChSTElNSVRfUlNTKSB8fCAoUkxJTUlUX1ZNRU0gPT0gUkxJTUlUX1JTUykKKyNkZWZpbmUgVUxJTUlUX1ZfSVNfQVMKKyNlbGlmIGRlZmluZWQoUkxJTUlUX1ZNRU0pCisjaWYgIWRlZmluZWQoUkxJTUlUX1JTUykgfHwgKFJMSU1JVF9SU1MgPT0gUkxJTUlUX0FTKQorI2RlZmluZSBVTElNSVRfVl9JU19BUworI2Vsc2UKKyNkZWZpbmUgVUxJTUlUX1ZfSVNfVk1FTQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUkxJTUlUX1JTUworI2lmZGVmIFVMSU1JVF9WX0lTX1ZNRU0KKyNkZWZpbmUgVUxJTUlUX01fSVNfUlNTCisjZWxpZiBkZWZpbmVkKFJMSU1JVF9WTUVNKSAmJiAoUkxJTUlUX1ZNRU0gPT0gUkxJTUlUX1JTUykKKyNkZWZpbmUgVUxJTUlUX01fSVNfVk1FTQorI2Vsc2UKKyNkZWZpbmUgVUxJTUlUX01fSVNfUlNTCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVMSU1JVF9NX0lTX1JTUykgJiYgZGVmaW5lZChSTElNSVRfQVMpICYmIChSTElNSVRfUlNTID09IFJMSU1JVF9BUykKKyN1bmRlZiBVTElNSVRfTV9JU19SU1MKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSTElNSVRfQVMpICYmICFkZWZpbmVkKFVMSU1JVF9NX0lTX1ZNRU0pICYmIGRlZmluZWQoUkxJTUlUX1ZNRU0pCisjZGVmaW5lIFVMSU1JVF9WX0lTX1ZNRU0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVUxJTUlUX1ZfSVNfVk1FTSkgJiYgZGVmaW5lZChSTElNSVRfVk1FTSkgJiYgXAorICAgICghZGVmaW5lZChSTElNSVRfUlNTKSB8fCAoZGVmaW5lZChSTElNSVRfQVMpICYmIChSTElNSVRfUlNTID09IFJMSU1JVF9BUykpKQorI2RlZmluZSBVTElNSVRfTV9JU19WTUVNCisjZW5kaWYKKworI2lmIGRlZmluZWQoVUxJTUlUX01fSVNfVk1FTSkgJiYgZGVmaW5lZChSTElNSVRfQVMpICYmIFwKKyAgICAoUkxJTUlUX1ZNRU0gPT0gUkxJTUlUX0FTKQorI3VuZGVmIFVMSU1JVF9NX0lTX1ZNRU0KKyNlbmRpZgorCisKK2ludAorY191bGltaXQoY29uc3QgY2hhciAqKndwKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgbGltaXRzIGxpbWl0c1tdID0geworCQkvKiBkbyBub3QgdXNlIG9wdGlvbnMgLUgsIC1TIG9yIC1hIG9yIGNoYW5nZSB0aGUgb3JkZXIgKi8KKyNpZmRlZiBSTElNSVRfQ1BVCisJCXsgInRpbWUoY3B1LXNlY29uZHMpIiwgUkxJTUlUX0NQVSwgMSwgJ3QnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfRlNJWkUKKwkJeyAiZmlsZShibG9ja3MpIiwgUkxJTUlUX0ZTSVpFLCA1MTIsICdmJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0NPUkUKKwkJeyAiY29yZWR1bXAoYmxvY2tzKSIsIFJMSU1JVF9DT1JFLCA1MTIsICdjJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0RBVEEKKwkJeyAiZGF0YShLaUIpIiwgUkxJTUlUX0RBVEEsIDEwMjQsICdkJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1NUQUNLCisJCXsgInN0YWNrKEtpQikiLCBSTElNSVRfU1RBQ0ssIDEwMjQsICdzJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX01FTUxPQ0sKKwkJeyAibG9ja2VkbWVtKEtpQikiLCBSTElNSVRfTUVNTE9DSywgMTAyNCwgJ2wnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTk9GSUxFCisJCXsgIm5vZmlsZXMoZGVzY3JpcHRvcnMpIiwgUkxJTUlUX05PRklMRSwgMSwgJ24nIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTlBST0MKKwkJeyAicHJvY2Vzc2VzIiwgUkxJTUlUX05QUk9DLCAxLCAncCcgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9TV0FQCisJCXsgInN3YXAoS2lCKSIsIFJMSU1JVF9TV0FQLCAxMDI0LCAndycgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9MT0NLUworCQl7ICJmbG9ja3MiLCBSTElNSVRfTE9DS1MsIC0xLCAnTCcgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9USU1FCisJCXsgImh1bWFudGltZShzZWNvbmRzKSIsIFJMSU1JVF9USU1FLCAxLCAnVCcgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9OT1ZNT04KKwkJeyAidm5vZGVtb25pdG9ycyIsIFJMSU1JVF9OT1ZNT04sIDEsICdWJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1NJR1BFTkRJTkcKKwkJeyAic2lncGVuZGluZyIsIFJMSU1JVF9TSUdQRU5ESU5HLCAxLCAnaScgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9NU0dRVUVVRQorCQl7ICJtc2dxdWV1ZShieXRlcykiLCBSTElNSVRfTVNHUVVFVUUsIDEsICdxJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0FJT19NRU0KKwkJeyAiQUlPbG9ja2VkbWVtKEtpQikiLCBSTElNSVRfQUlPX01FTSwgMTAyNCwgJ00nIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfQUlPX09QUworCQl7ICJBSU9vcGVyYXRpb25zIiwgUkxJTUlUX0FJT19PUFMsIDEsICdPJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1RDQUNIRQorCQl7ICJjYWNoZWR0aHJlYWRzIiwgUkxJTUlUX1RDQUNIRSwgMSwgJ0MnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfU0JTSVpFCisJCXsgInNvY2tidWZzaXooS2lCKSIsIFJMSU1JVF9TQlNJWkUsIDEwMjQsICdCJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1BUSFJFQUQKKwkJeyAidGhyZWFkc3BlcnByb2Nlc3MiLCBSTElNSVRfUFRIUkVBRCwgMSwgJ1AnIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTklDRQorCQl7ICJtYXhuaWNlIiwgUkxJTUlUX05JQ0UsIDEsICdlJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1JUUFJJTworCQl7ICJtYXhydHByaW8iLCBSTElNSVRfUlRQUklPLCAxLCAncicgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVUxJTUlUX01fSVNfUlNTKQorCQl7ICJyZXNpZGVudC1zZXQoS2lCKSIsIFJMSU1JVF9SU1MsIDEwMjQsICdtJyB9LAorI2VsaWYgZGVmaW5lZChVTElNSVRfTV9JU19WTUVNKQorCQl7ICJtZW1vcnkoS2lCKSIsIFJMSU1JVF9WTUVNLCAxMDI0LCAnbScgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQoVUxJTUlUX1ZfSVNfVk1FTSkKKwkJeyAidmlydHVhbC1tZW1vcnkoS2lCKSIsIFJMSU1JVF9WTUVNLCAxMDI0LCAndicgfSwKKyNlbGlmIGRlZmluZWQoVUxJTUlUX1ZfSVNfQVMpCisJCXsgImFkZHJlc3Mtc3BhY2UoS2lCKSIsIFJMSU1JVF9BUywgMTAyNCwgJ3YnIH0sCisjZW5kaWYKKwkJeyBOVUxMLCAwLCAwLCAwIH0KKwl9OworCXN0YXRpYyBjaGFyIG9wdHNbMyArIE5FTEVNKGxpbWl0cyldOworCWludCBob3cgPSBTT0ZUIHwgSEFSRCwgb3B0Yywgd2hhdCA9ICdmJzsKKwlib29sIGFsbCA9IGZhbHNlOworCWNvbnN0IHN0cnVjdCBsaW1pdHMgKmw7CisKKwlpZiAoIW9wdHNbMF0pIHsKKwkJLyogYnVpbGQgb3B0aW9ucyBzdHJpbmcgb24gZmlyc3QgY2FsbCAtIHl1Y2sgKi8KKwkJY2hhciAqcCA9IG9wdHM7CisKKwkJKnArKyA9ICdIJzsgKnArKyA9ICdTJzsgKnArKyA9ICdhJzsKKwkJZm9yIChsID0gbGltaXRzOyBsLT5uYW1lOyBsKyspCisJCQkqcCsrID0gbC0+b3B0aW9uOworCQkqcCA9ICdcMCc7CisJfQorCisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LCBvcHRzKSkgIT0gLTEpCisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdIJzoKKwkJCWhvdyA9IEhBUkQ7CisJCQlicmVhazsKKwkJY2FzZSAnUyc6CisJCQlob3cgPSBTT0ZUOworCQkJYnJlYWs7CisJCWNhc2UgJ2EnOgorCQkJYWxsID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCWJpX2Vycm9yZigidXNhZ2U6IHVsaW1pdCBbLWFjZGZITGxtbnBTc1R0dnddIFt2YWx1ZV0iKTsKKwkJCXJldHVybiAoMSk7CisJCWRlZmF1bHQ6CisJCQl3aGF0ID0gb3B0YzsKKwkJfQorCisJZm9yIChsID0gbGltaXRzOyBsLT5uYW1lICYmIGwtPm9wdGlvbiAhPSB3aGF0OyBsKyspCisJCTsKKwlpZiAoIWwtPm5hbWUpIHsKKwkJaW50ZXJuYWxfd2FybmluZ2YoInVsaW1pdDogJWMiLCB3aGF0KTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwlpZiAod3BbYnVpbHRpbl9vcHQub3B0aW5kXSkgeworCQlpZiAoYWxsIHx8IHdwW2J1aWx0aW5fb3B0Lm9wdGluZCArIDFdKSB7CisJCQliaV9lcnJvcmYoInRvbyBtYW55IGFyZ3VtZW50cyIpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCQlyZXR1cm4gKHNldF91bGltaXQobCwgd3BbYnVpbHRpbl9vcHQub3B0aW5kXSwgaG93KSk7CisJfQorCWlmICghYWxsKQorCQlwcmludF91bGltaXQobCwgaG93KTsKKwllbHNlIGZvciAobCA9IGxpbWl0czsgbC0+bmFtZTsgbCsrKSB7CisJCXNocHJpbnRmKCIlLTIwcyAiLCBsLT5uYW1lKTsKKwkJcHJpbnRfdWxpbWl0KGwsIGhvdyk7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3NldF91bGltaXQoY29uc3Qgc3RydWN0IGxpbWl0cyAqbCwgY29uc3QgY2hhciAqdiwgaW50IGhvdykKK3sKKwlybGltX3QgdmFsID0gKHJsaW1fdCkwOworCXN0cnVjdCBybGltaXQgbGltaXQ7CisKKwlpZiAoc3RyY21wKHYsICJ1bmxpbWl0ZWQiKSA9PSAwKQorCQl2YWwgPSAocmxpbV90KVJMSU1fSU5GSU5JVFk7CisJZWxzZSB7CisJCW1rc2hfYXJpX3QgcnZhbDsKKworCQlpZiAoIWV2YWx1YXRlKHYsICZydmFsLCBLU0hfUkVUVVJOX0VSUk9SLCBmYWxzZSkpCisJCQlyZXR1cm4gKDEpOworCQkvKgorCQkgKiBBdm9pZCBwcm9ibGVtcyBjYXVzZWQgYnkgdHlwb3MgdGhhdCBldmFsdWF0ZSBtaXNzZXMgZHVlCisJCSAqIHRvIGV2YWx1YXRpbmcgdW5zZXQgcGFyYW1ldGVycyB0byAwLi4uCisJCSAqIElmIHRoaXMgY2F1c2VzIHByb2JsZW1zLCB3aWxsIGhhdmUgdG8gYWRkIHBhcmFtZXRlciB0bworCQkgKiBldmFsdWF0ZSgpIHRvIGNvbnRyb2wgaWYgdW5zZXQgcGFyYW1zIGFyZSAwIG9yIGFuIGVycm9yLgorCQkgKi8KKwkJaWYgKCFydmFsICYmICFrc2hfaXNkaWdpdCh2WzBdKSkgeworCQkJYmlfZXJyb3JmKCJpbnZhbGlkICVzIGxpbWl0OiAlcyIsIGwtPm5hbWUsIHYpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCQl2YWwgPSAocmxpbV90KSgocmxpbV90KXJ2YWwgKiBsLT5mYWN0b3IpOworCX0KKworCWlmIChnZXRybGltaXQobC0+cmVzb3VyY2UsICZsaW1pdCkgPCAwKSB7CisJCS8qIHNvbWUgY2Fubm90IGJlIHJlYWQsIGUuZy4gTGludXggUkxJTUlUX0xPQ0tTICovCisJCWxpbWl0LnJsaW1fY3VyID0gUkxJTV9JTkZJTklUWTsKKwkJbGltaXQucmxpbV9tYXggPSBSTElNX0lORklOSVRZOworCX0KKwlpZiAoaG93ICYgU09GVCkKKwkJbGltaXQucmxpbV9jdXIgPSB2YWw7CisJaWYgKGhvdyAmIEhBUkQpCisJCWxpbWl0LnJsaW1fbWF4ID0gdmFsOworCWlmICghc2V0cmxpbWl0KGwtPnJlc291cmNlLCAmbGltaXQpKQorCQlyZXR1cm4gKDApOworCWlmIChlcnJubyA9PSBFUEVSTSkKKwkJYmlfZXJyb3JmKCIlcyBleGNlZWRzIGFsbG93YWJsZSAlcyBsaW1pdCIsIHYsIGwtPm5hbWUpOworCWVsc2UKKwkJYmlfZXJyb3JmKCJiYWQgJXMgbGltaXQ6ICVzIiwgbC0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfdWxpbWl0KGNvbnN0IHN0cnVjdCBsaW1pdHMgKmwsIGludCBob3cpCit7CisJcmxpbV90IHZhbCA9IChybGltX3QpMDsKKwlzdHJ1Y3QgcmxpbWl0IGxpbWl0OworCisJaWYgKGdldHJsaW1pdChsLT5yZXNvdXJjZSwgJmxpbWl0KSkgeworCQlzaGZfcHV0cygidW5rbm93blxuIiwgc2hsX3N0ZG91dCk7CisJCXJldHVybjsKKwl9CisJaWYgKGhvdyAmIFNPRlQpCisJCXZhbCA9IGxpbWl0LnJsaW1fY3VyOworCWVsc2UgaWYgKGhvdyAmIEhBUkQpCisJCXZhbCA9IGxpbWl0LnJsaW1fbWF4OworCWlmICh2YWwgPT0gKHJsaW1fdClSTElNX0lORklOSVRZKQorCQlzaGZfcHV0cygidW5saW1pdGVkXG4iLCBzaGxfc3Rkb3V0KTsKKwllbHNlCisJCXNocHJpbnRmKCIlbGRcbiIsIChsb25nKSh2YWwgLyBsLT5mYWN0b3IpKTsKK30KKyNlbmRpZgorCitpbnQKK2NfcmVuYW1lKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgcnYgPSAxOworCisJaWYgKHdwID09IE5VTEwJCS8qIGFyZ3YgKi8gfHwKKwkgICAgd3BbMF0gPT0gTlVMTAkvKiBuYW1lIG9mIGJ1aWx0aW4gKi8gfHwKKwkgICAgd3BbMV0gPT0gTlVMTAkvKiBmaXJzdCBhcmd1bWVudCAqLyB8fAorCSAgICB3cFsyXSA9PSBOVUxMCS8qIHNlY29uZCBhcmd1bWVudCAqLyB8fAorCSAgICB3cFszXSAhPSBOVUxMCS8qIG5vIGZ1cnRoZXIgYXJncyBwbGVhc2UgKi8pCisJCWJpX2Vycm9yZihUX3N5bmVycik7CisJZWxzZSBpZiAoKHJ2ID0gcmVuYW1lKHdwWzFdLCB3cFsyXSkpICE9IDApIHsKKwkJcnYgPSBlcnJubzsKKwkJYmlfZXJyb3JmKCJmYWlsZWQ6ICVzIiwgc3RyZXJyb3IocnYpKTsKKwl9CisKKwlyZXR1cm4gKHJ2KTsKK30KKworaW50CitjX3JlYWxwYXRoKGNvbnN0IGNoYXIgKip3cCkKK3sKKwlpbnQgcnYgPSAxOworCWNoYXIgKmJ1ZjsKKworCWlmICh3cCAhPSBOVUxMICYmIHdwWzBdICE9IE5VTEwgJiYgd3BbMV0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKHdwWzFdLCAiLS0iKSkgeworCQkJaWYgKHdwWzJdID09IE5VTEwpIHsKKwkJCQl3cCArPSAxOworCQkJCXJ2ID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh3cFsyXSAhPSBOVUxMICYmIHdwWzNdID09IE5VTEwpIHsKKwkJCQl3cCArPSAyOworCQkJCXJ2ID0gMDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChydikKKwkJYmlfZXJyb3JmKFRfc3luZXJyKTsKKwllbHNlIGlmICgoYnVmID0gZG9fcmVhbHBhdGgoKndwKSkgPT0gTlVMTCkgeworCQlydiA9IGVycm5vOworCQliaV9lcnJvcmYoIiVzOiAlcyIsICp3cCwgc3RyZXJyb3IocnYpKTsKKwkJaWYgKCh1bnNpZ25lZCBpbnQpcnYgPiAyNTUpCisJCQlydiA9IDI1NTsKKwl9IGVsc2UgeworCQlzaHByaW50ZigiJXNcbiIsIGJ1Zik7CisJCWFmcmVlKGJ1ZiwgQVRFTVApOworCX0KKworCXJldHVybiAocnYpOworfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvaGlzdHJhcC5jIGIvbWtzaC9zcmMvaGlzdHJhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYzRjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9oaXN0cmFwLmMKQEAgLTAsMCArMSwxNDgzIEBACisvKgkkT3BlbkJTRDogaGlzdG9yeS5jLHYgMS4zOSAyMDEwLzA1LzE5IDE3OjM2OjA4IGphc3BlciBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IHRyYXAuYyx2IDEuMjMgMjAxMC8wNS8xOSAxNzozNjowOCBqYXNwZXIgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpbmNsdWRlICJzaC5oIgorI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNlbmRpZgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9oaXN0cmFwLmMsdiAxLjk4IDIwMTAvMDcvMjQgMTc6MDg6MjkgdGcgRXhwICQiKTsKKworLyotCisgKiBNaXJPUzogVGhpcyBpcyB0aGUgZGVmYXVsdCBtYXBwaW5nIHR5cGUsIGFuZCBuZWVkIG5vdCBiZSBzcGVjaWZpZWQuCisgKiBJUklYIGRvZXNuJ3QgaGF2ZSB0aGlzIGNvbnN0YW50LgorICovCisjaWZuZGVmIE1BUF9GSUxFCisjZGVmaW5lIE1BUF9GSUxFCTAKKyNlbmRpZgorCitUcmFwIHNpZ3RyYXBzW05TSUcgKyAxXTsKK3N0YXRpYyBzdHJ1Y3Qgc2lnYWN0aW9uIFNpZ2FjdF9pZ247CisKKyNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorc3RhdGljIGludCBoaXN0X2NvdW50X2xpbmVzKHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgaGlzdF9zaHJpbmsodW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmhpc3Rfc2tpcF9iYWNrKHVuc2lnbmVkIGNoYXIgKixpbnQgKixpbnQpOworc3RhdGljIHZvaWQgaGlzdGxvYWQoU291cmNlICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGhpc3RpbnNlcnQoU291cmNlICosIGludCwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyB2b2lkIHdyaXRlaGlzdGZpbGUoaW50LCBjaGFyICopOworc3RhdGljIGludCBzcHJpbmtsZShpbnQpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgaGlzdF9leGVjdXRlKGNoYXIgKik7CitzdGF0aWMgaW50IGhpc3RfcmVwbGFjZShjaGFyICoqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbCk7CitzdGF0aWMgY2hhciAqKmhpc3RfZ2V0KGNvbnN0IGNoYXIgKiwgYm9vbCwgYm9vbCk7CitzdGF0aWMgY2hhciAqKmhpc3RfZ2V0X29sZGVzdCh2b2lkKTsKK3N0YXRpYyB2b2lkIGhpc3RiYWNrdXAodm9pZCk7CisKK3N0YXRpYyBjaGFyICoqY3VycmVudDsJCS8qIGN1cnJlbnQgcG9zaXRpb24gaW4gaGlzdG9yeVtdICovCitzdGF0aWMgaW50IGhzdGFydGVkOwkJLyogc2V0IGFmdGVyIGhpc3RfaW5pdCgpIGNhbGxlZCAqLworc3RhdGljIFNvdXJjZSAqaGlzdF9zb3VyY2U7CisKKyNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorc3RhdGljIGNoYXIgKmhuYW1lOwkJLyogY3VycmVudCBuYW1lIG9mIGhpc3RvcnkgZmlsZSAqLworc3RhdGljIGludCBoaXN0ZmQ7CitzdGF0aWMgaW50IGhzaXplOworI2VuZGlmCisKK2ludAorY19mYyhjb25zdCBjaGFyICoqd3ApCit7CisJc3RydWN0IHNoZiAqc2hmOworCXN0cnVjdCB0ZW1wICp0ZjsKKwljb25zdCBjaGFyICpwOworCWNoYXIgKmVkaXRvciA9IE5VTEw7CisJYm9vbCBnZmxhZyA9IGZhbHNlLCBsZmxhZyA9IGZhbHNlLCBuZmxhZyA9IGZhbHNlLCByZmxhZyA9IGZhbHNlLAorCSAgICBzZmxhZyA9IGZhbHNlOworCWludCBvcHRjOworCWNvbnN0IGNoYXIgKmZpcnN0ID0gTlVMTCwgKmxhc3QgPSBOVUxMOworCWNoYXIgKipoZmlyc3QsICoqaGxhc3QsICoqaHA7CisKKwlpZiAoIUZsYWcoRlRBTEtJTkdfSSkpIHsKKwkJYmlfZXJyb3JmKCJoaXN0b3J5IGZ1bmN0aW9ucyBub3QgYXZhaWxhYmxlIik7CisJCXJldHVybiAoMSk7CisJfQorCisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdCh3cCwgJmJ1aWx0aW5fb3B0LAorCSAgICAiZTpnbG5yczAsMSwyLDMsNCw1LDYsNyw4LDksIikpICE9IC0xKQorCQlzd2l0Y2ggKG9wdGMpIHsKKwkJY2FzZSAnZSc6CisJCQlwID0gYnVpbHRpbl9vcHQub3B0YXJnOworCQkJaWYgKGtzaF9pc2Rhc2gocCkpCisJCQkJc2ZsYWcgPSB0cnVlOworCQkJZWxzZSB7CisJCQkJc2l6ZV90IGxlbiA9IHN0cmxlbihwKTsKKwkJCQllZGl0b3IgPSBhbGxvYyhsZW4gKyA0LCBBVEVNUCk7CisJCQkJbWVtY3B5KGVkaXRvciwgcCwgbGVuKTsKKwkJCQltZW1jcHkoZWRpdG9yICsgbGVuLCAiICRfIiwgNCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnZyc6IC8qIG5vbi1BVCZUIGtzaCAqLworCQkJZ2ZsYWcgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJbGZsYWcgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJbmZsYWcgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJcmZsYWcgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgkvKiBQT1NJWCB2ZXJzaW9uIG9mIC1lIC0gKi8KKwkJCXNmbGFnID0gdHJ1ZTsKKwkJCWJyZWFrOworCQkvKiBrbHVkZ2UgY2l0eSAtIGFjY2VwdCAtbnVtIGFzIC0tIC1udW0gKGtpbmQgb2YpICovCisJCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKwkJY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorCQkJcCA9IHNoZl9zbXByaW50ZigiLSVjJXMiLAorCQkJCQlvcHRjLCBidWlsdGluX29wdC5vcHRhcmcpOworCQkJaWYgKCFmaXJzdCkKKwkJCQlmaXJzdCA9IHA7CisJCQllbHNlIGlmICghbGFzdCkKKwkJCQlsYXN0ID0gcDsKKwkJCWVsc2UgeworCQkJCWJpX2Vycm9yZigidG9vIG1hbnkgYXJndW1lbnRzIik7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXJldHVybiAoMSk7CisJCX0KKwl3cCArPSBidWlsdGluX29wdC5vcHRpbmQ7CisKKwkvKiBTdWJzdGl0dXRlIGFuZCBleGVjdXRlIGNvbW1hbmQgKi8KKwlpZiAoc2ZsYWcpIHsKKwkJY2hhciAqcGF0ID0gTlVMTCwgKnJlcCA9IE5VTEw7CisKKwkJaWYgKGVkaXRvciB8fCBsZmxhZyB8fCBuZmxhZyB8fCByZmxhZykgeworCQkJYmlfZXJyb3JmKCJjYW4ndCB1c2UgLWUsIC1sLCAtbiwgLXIgd2l0aCAtcyAoLWUgLSkiKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKworCQkvKiBDaGVjayBmb3IgcGF0dGVybiByZXBsYWNlbWVudCBhcmd1bWVudCAqLworCQlpZiAoKndwICYmICoqd3AgJiYgKHAgPSBjc3RyY2hyKCp3cCArIDEsICc9JykpKSB7CisJCQlzdHJkdXB4KHBhdCwgKndwLCBBVEVNUCk7CisJCQlyZXAgPSBwYXQgKyAocCAtICp3cCk7CisJCQkqcmVwKysgPSAnXDAnOworCQkJd3ArKzsKKwkJfQorCQkvKiBDaGVjayBmb3Igc2VhcmNoIHByZWZpeCAqLworCQlpZiAoIWZpcnN0ICYmIChmaXJzdCA9ICp3cCkpCisJCQl3cCsrOworCQlpZiAobGFzdCB8fCAqd3ApIHsKKwkJCWJpX2Vycm9yZigidG9vIG1hbnkgYXJndW1lbnRzIik7CisJCQlyZXR1cm4gKDEpOworCQl9CisKKwkJaHAgPSBmaXJzdCA/IGhpc3RfZ2V0KGZpcnN0LCBmYWxzZSwgZmFsc2UpIDoKKwkJICAgIGhpc3RfZ2V0X25ld2VzdChmYWxzZSk7CisJCWlmICghaHApCisJCQlyZXR1cm4gKDEpOworCQlyZXR1cm4gKGhpc3RfcmVwbGFjZShocCwgcGF0LCByZXAsIGdmbGFnKSk7CisJfQorCisJaWYgKGVkaXRvciAmJiAobGZsYWcgfHwgbmZsYWcpKSB7CisJCWJpX2Vycm9yZigiY2FuJ3QgdXNlIC1sLCAtbiB3aXRoIC1lIik7CisJCXJldHVybiAoMSk7CisJfQorCisJaWYgKCFmaXJzdCAmJiAoZmlyc3QgPSAqd3ApKQorCQl3cCsrOworCWlmICghbGFzdCAmJiAobGFzdCA9ICp3cCkpCisJCXdwKys7CisJaWYgKCp3cCkgeworCQliaV9lcnJvcmYoInRvbyBtYW55IGFyZ3VtZW50cyIpOworCQlyZXR1cm4gKDEpOworCX0KKwlpZiAoIWZpcnN0KSB7CisJCWhmaXJzdCA9IGxmbGFnID8gaGlzdF9nZXQoIi0xNiIsIHRydWUsIHRydWUpIDoKKwkJICAgIGhpc3RfZ2V0X25ld2VzdChmYWxzZSk7CisJCWlmICghaGZpcnN0KQorCQkJcmV0dXJuICgxKTsKKwkJLyogY2FuJ3QgZmFpbCBpZiBoZmlyc3QgZGlkbid0IGZhaWwgKi8KKwkJaGxhc3QgPSBoaXN0X2dldF9uZXdlc3QoZmFsc2UpOworCX0gZWxzZSB7CisJCS8qIFBPU0lYIHNheXMgbm90IGFuIGVycm9yIGlmIGZpcnN0L2xhc3Qgb3V0IG9mIGJvdW5kcworCQkgKiB3aGVuIHJhbmdlIGlzIHNwZWNpZmllZDsgQVQmVCBrc2ggYW5kIHBka3NoIGFsbG93IG91dCBvZgorCQkgKiBib3VuZHMgZm9yIC1sIGFzIHdlbGwuCisJCSAqLworCQloZmlyc3QgPSBoaXN0X2dldChmaXJzdCwgKGxmbGFnIHx8IGxhc3QpID8gdHJ1ZSA6IGZhbHNlLCBsZmxhZyk7CisJCWlmICghaGZpcnN0KQorCQkJcmV0dXJuICgxKTsKKwkJaGxhc3QgPSBsYXN0ID8gaGlzdF9nZXQobGFzdCwgdHJ1ZSwgbGZsYWcpIDoKKwkJICAgIChsZmxhZyA/IGhpc3RfZ2V0X25ld2VzdChmYWxzZSkgOiBoZmlyc3QpOworCQlpZiAoIWhsYXN0KQorCQkJcmV0dXJuICgxKTsKKwl9CisJaWYgKGhmaXJzdCA+IGhsYXN0KSB7CisJCWNoYXIgKip0ZW1wOworCisJCXRlbXAgPSBoZmlyc3Q7IGhmaXJzdCA9IGhsYXN0OyBobGFzdCA9IHRlbXA7CisJCXJmbGFnID0gIXJmbGFnOyAvKiBQT1NJWCAqLworCX0KKworCS8qIExpc3QgaGlzdG9yeSAqLworCWlmIChsZmxhZykgeworCQljaGFyICpzLCAqdDsKKworCQlmb3IgKGhwID0gcmZsYWcgPyBobGFzdCA6IGhmaXJzdDsKKwkJICAgIGhwID49IGhmaXJzdCAmJiBocCA8PSBobGFzdDsgaHAgKz0gcmZsYWcgPyAtMSA6IDEpIHsKKwkJCWlmICghbmZsYWcpCisJCQkJc2hmX2ZwcmludGYoc2hsX3N0ZG91dCwgIiVkIiwKKwkJCQkgICAgaGlzdF9zb3VyY2UtPmxpbmUgLSAoaW50KShoaXN0cHRyIC0gaHApKTsKKwkJCXNoZl9wdXRjKCdcdCcsIHNobF9zdGRvdXQpOworCQkJLyogcHJpbnQgbXVsdGktbGluZSBjb21tYW5kcyBjb3JyZWN0bHkgKi8KKwkJCXMgPSAqaHA7CisJCQl3aGlsZSAoKHQgPSBzdHJjaHIocywgJ1xuJykpKSB7CisJCQkJKnQgPSAnXDAnOworCQkJCXNoZl9mcHJpbnRmKHNobF9zdGRvdXQsICIlc1xuXHQiLCBzKTsKKwkJCQkqdCsrID0gJ1xuJzsKKwkJCQlzID0gdDsKKwkJCX0KKwkJCXNoZl9mcHJpbnRmKHNobF9zdGRvdXQsICIlc1xuIiwgcyk7CisJCX0KKwkJc2hmX2ZsdXNoKHNobF9zdGRvdXQpOworCQlyZXR1cm4gKDApOworCX0KKworCS8qIFJ1biBlZGl0b3Igb24gc2VsZWN0ZWQgbGluZXMsIHRoZW4gcnVuIHJlc3VsdGluZyBjb21tYW5kcyAqLworCisJdGYgPSBtYWtldGVtcChBVEVNUCwgVFRfSElTVF9FRElULCAmZS0+dGVtcHMpOworCWlmICghKHNoZiA9IHRmLT5zaGYpKSB7CisJCWJpX2Vycm9yZigiY2Fubm90IGNyZWF0ZSB0ZW1wIGZpbGUgJXMgLSAlcyIsCisJCSAgICB0Zi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJZm9yIChocCA9IHJmbGFnID8gaGxhc3QgOiBoZmlyc3Q7CisJICAgIGhwID49IGhmaXJzdCAmJiBocCA8PSBobGFzdDsgaHAgKz0gcmZsYWcgPyAtMSA6IDEpCisJCXNoZl9mcHJpbnRmKHNoZiwgIiVzXG4iLCAqaHApOworCWlmIChzaGZfY2xvc2Uoc2hmKSA9PSBFT0YpIHsKKwkJYmlfZXJyb3JmKCJlcnJvciB3cml0aW5nIHRlbXBvcmFyeSBmaWxlIC0gJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKDEpOworCX0KKworCS8qIElnbm9yZSBzZXRzdHIgZXJyb3JzIGhlcmUgKGFyYml0cmFyeSkgKi8KKwlzZXRzdHIobG9jYWwoIl8iLCBmYWxzZSksIHRmLT5uYW1lLCBLU0hfUkVUVVJOX0VSUk9SKTsKKworCS8qIFhYWDogc291cmNlIHNob3VsZCBub3QgZ2V0IHRyYXNoZWQgYnkgdGhpcy4uICovCisJeworCQlTb3VyY2UgKnNvbGQgPSBzb3VyY2U7CisJCWludCByZXQ7CisKKwkJcmV0ID0gY29tbWFuZChlZGl0b3IgPyBlZGl0b3IgOiAiJHtGQ0VESVQ6LS9iaW4vZWR9ICRfIiwgMCk7CisJCXNvdXJjZSA9IHNvbGQ7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gKHJldCk7CisJfQorCisJeworCQlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKwkJWFN0cmluZyB4czsKKwkJY2hhciAqeHA7CisJCWludCBuOworCisJCWlmICghKHNoZiA9IHNoZl9vcGVuKHRmLT5uYW1lLCBPX1JET05MWSwgMCwgMCkpKSB7CisJCQliaV9lcnJvcmYoImNhbm5vdCBvcGVuIHRlbXAgZmlsZSAlcyIsIHRmLT5uYW1lKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKworCQluID0gc3RhdCh0Zi0+bmFtZSwgJnN0YXRiKSA8IDAgPyAxMjggOiBzdGF0Yi5zdF9zaXplICsgMTsKKwkJWGluaXQoeHMsIHhwLCBuLCBoaXN0X3NvdXJjZS0+YXJlYXApOworCQl3aGlsZSAoKG4gPSBzaGZfcmVhZCh4cCwgWG5sZWZ0KHhzLCB4cCksIHNoZikpID4gMCkgeworCQkJeHAgKz0gbjsKKwkJCWlmIChYbmxlZnQoeHMsIHhwKSA8PSAwKQorCQkJCVhjaGVja04oeHMsIHhwLCBYbGVuZ3RoKHhzLCB4cCkpOworCQl9CisJCWlmIChuIDwgMCkgeworCQkJYmlfZXJyb3JmKCJlcnJvciByZWFkaW5nIHRlbXAgZmlsZSAlcyAtICVzIiwKKwkJCSAgICB0Zi0+bmFtZSwgc3RyZXJyb3Ioc2hmX2Vycm5vKHNoZikpKTsKKwkJCXNoZl9jbG9zZShzaGYpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCQlzaGZfY2xvc2Uoc2hmKTsKKwkJKnhwID0gJ1wwJzsKKwkJc3RyaXBfbnVscyhYc3RyaW5nKHhzLCB4cCksIFhsZW5ndGgoeHMsIHhwKSk7CisJCXJldHVybiAoaGlzdF9leGVjdXRlKFhzdHJpbmcoeHMsIHhwKSkpOworCX0KK30KKworLyogU2F2ZSBjbWQgaW4gaGlzdG9yeSwgZXhlY3V0ZSBjbWQgKGNtZCBnZXRzIHRyYXNoZWQpICovCitzdGF0aWMgaW50CitoaXN0X2V4ZWN1dGUoY2hhciAqY21kKQoreworCVNvdXJjZSAqc29sZDsKKwlpbnQgcmV0OworCWNoYXIgKnAsICpxOworCisJaGlzdGJhY2t1cCgpOworCisJZm9yIChwID0gY21kOyBwOyBwID0gcSkgeworCQlpZiAoKHEgPSBzdHJjaHIocCwgJ1xuJykpKSB7CisJCQkqcSsrID0gJ1wwJzsgLyoga2lsbCB0aGUgbmV3bGluZSAqLworCQkJaWYgKCEqcSkgLyogaWdub3JlIHRyYWlsaW5nIG5ld2xpbmUgKi8KKwkJCQlxID0gTlVMTDsKKwkJfQorCQloaXN0c2F2ZSgmaGlzdF9zb3VyY2UtPmxpbmUsIHAsIHRydWUsIHRydWUpOworCisJCXNoZWxsZigiJXNcbiIsIHApOyAvKiBQT1NJWCBkb2Vzbid0IHNheSB0aGlzIGlzIGRvbmUuLi4gKi8KKwkJaWYgKHEpCQkvKiByZXN0b3JlIFxuICh0cmFpbGluZyBcbiBub3QgcmVzdG9yZWQpICovCisJCQlxWy0xXSA9ICdcbic7CisJfQorCisJLyoKKwkgKiBDb21tYW5kcyBhcmUgZXhlY3V0ZWQgaGVyZSBpbnN0ZWFkIG9mIHB1c2hpbmcgdGhlbSBvbnRvIHRoZQorCSAqIGlucHV0ICdjYXVzZSBQT1NJWCBzYXlzIHRoZSByZWRpcmVjdGlvbiBhbmQgdmFyaWFibGUgYXNzaWdubWVudHMKKwkgKiBpbgorCSAqCVg9eSBmYyAtZSAtIDQyIDI+IC9kZXYvbnVsbAorCSAqIGFyZSB0byBlZmZlY3QgdGhlIHJlcGVhdGVkIGNvbW1hbmRzIGVudmlyb25tZW50LgorCSAqLworCS8qIFhYWDogc291cmNlIHNob3VsZCBub3QgZ2V0IHRyYXNoZWQgYnkgdGhpcy4uICovCisJc29sZCA9IHNvdXJjZTsKKwlyZXQgPSBjb21tYW5kKGNtZCwgMCk7CisJc291cmNlID0gc29sZDsKKwlyZXR1cm4gKHJldCk7Cit9CisKK3N0YXRpYyBpbnQKK2hpc3RfcmVwbGFjZShjaGFyICoqaHAsIGNvbnN0IGNoYXIgKnBhdCwgY29uc3QgY2hhciAqcmVwLCBib29sIGdsb2JyKQoreworCWNoYXIgKmxpbmU7CisKKwlpZiAoIXBhdCkKKwkJc3RyZHVweChsaW5lLCAqaHAsIEFURU1QKTsKKwllbHNlIHsKKwkJY2hhciAqcywgKnMxOworCQlpbnQgcGF0X2xlbiA9IHN0cmxlbihwYXQpOworCQlpbnQgcmVwX2xlbiA9IHN0cmxlbihyZXApOworCQlpbnQgbGVuOworCQlYU3RyaW5nIHhzOworCQljaGFyICp4cDsKKwkJYm9vbCBhbnlfc3Vic3QgPSBmYWxzZTsKKworCQlYaW5pdCh4cywgeHAsIDEyOCwgQVRFTVApOworCQlmb3IgKHMgPSAqaHA7IChzMSA9IHN0cnN0cihzLCBwYXQpKSAmJiAoIWFueV9zdWJzdCB8fCBnbG9icik7CisJCSAgICBzID0gczEgKyBwYXRfbGVuKSB7CisJCQlhbnlfc3Vic3QgPSB0cnVlOworCQkJbGVuID0gczEgLSBzOworCQkJWGNoZWNrTih4cywgeHAsIGxlbiArIHJlcF9sZW4pOworCQkJbWVtY3B5KHhwLCBzLCBsZW4pOwkJLyogZmlyc3QgcGFydCAqLworCQkJeHAgKz0gbGVuOworCQkJbWVtY3B5KHhwLCByZXAsIHJlcF9sZW4pOwkvKiByZXBsYWNlbWVudCAqLworCQkJeHAgKz0gcmVwX2xlbjsKKwkJfQorCQlpZiAoIWFueV9zdWJzdCkgeworCQkJYmlfZXJyb3JmKCJzdWJzdGl0dXRpb24gZmFpbGVkIik7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCWxlbiA9IHN0cmxlbihzKSArIDE7CisJCVhjaGVja04oeHMsIHhwLCBsZW4pOworCQltZW1jcHkoeHAsIHMsIGxlbik7CisJCXhwICs9IGxlbjsKKwkJbGluZSA9IFhjbG9zZSh4cywgeHApOworCX0KKwlyZXR1cm4gKGhpc3RfZXhlY3V0ZShsaW5lKSk7Cit9CisKKy8qCisgKiBnZXQgcG9pbnRlciB0byBoaXN0b3J5IGdpdmVuIHBhdHRlcm4KKyAqIHBhdHRlcm4gaXMgYSBudW1iZXIgb3Igc3RyaW5nCisgKi8KK3N0YXRpYyBjaGFyICoqCitoaXN0X2dldChjb25zdCBjaGFyICpzdHIsIGJvb2wgYXBwcm94LCBib29sIGFsbG93X2N1cikKK3sKKwljaGFyICoqaHAgPSBOVUxMOworCWludCBuOworCisJaWYgKGdldG4oc3RyLCAmbikpIHsKKwkJaHAgPSBoaXN0cHRyICsgKG4gPCAwID8gbiA6IChuIC0gaGlzdF9zb3VyY2UtPmxpbmUpKTsKKwkJaWYgKChwdHJkaWZmX3QpaHAgPCAocHRyZGlmZl90KWhpc3RvcnkpIHsKKwkJCWlmIChhcHByb3gpCisJCQkJaHAgPSBoaXN0X2dldF9vbGRlc3QoKTsKKwkJCWVsc2UgeworCQkJCWJpX2Vycm9yZigiJXM6IG5vdCBpbiBoaXN0b3J5Iiwgc3RyKTsKKwkJCQlocCA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSBpZiAoKHB0cmRpZmZfdClocCA+IChwdHJkaWZmX3QpaGlzdHB0cikgeworCQkJaWYgKGFwcHJveCkKKwkJCQlocCA9IGhpc3RfZ2V0X25ld2VzdChhbGxvd19jdXIpOworCQkJZWxzZSB7CisJCQkJYmlfZXJyb3JmKCIlczogbm90IGluIGhpc3RvcnkiLCBzdHIpOworCQkJCWhwID0gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIGlmICghYWxsb3dfY3VyICYmIGhwID09IGhpc3RwdHIpIHsKKwkJCWJpX2Vycm9yZigiJXM6IGludmFsaWQgcmFuZ2UiLCBzdHIpOworCQkJaHAgPSBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJaW50IGFuY2hvcmVkID0gKnN0ciA9PSAnPycgPyAoKytzdHIsIDApIDogMTsKKworCQkvKiB0aGUgLTEgaXMgdG8gYXZvaWQgdGhlIGN1cnJlbnQgZmMgY29tbWFuZCAqLworCQlpZiAoKG4gPSBmaW5kaGlzdChoaXN0cHRyIC0gaGlzdG9yeSAtIDEsIDAsIHN0ciwgYW5jaG9yZWQpKSA8IDApCisJCQliaV9lcnJvcmYoIiVzOiBub3QgaW4gaGlzdG9yeSIsIHN0cik7CisJCWVsc2UKKwkJCWhwID0gJmhpc3Rvcnlbbl07CisJfQorCXJldHVybiAoaHApOworfQorCisvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXdlc3QgY29tbWFuZCBpbiB0aGUgaGlzdG9yeSAqLworY2hhciAqKgoraGlzdF9nZXRfbmV3ZXN0KGJvb2wgYWxsb3dfY3VyKQoreworCWlmIChoaXN0cHRyIDwgaGlzdG9yeSB8fCAoIWFsbG93X2N1ciAmJiBoaXN0cHRyID09IGhpc3RvcnkpKSB7CisJCWJpX2Vycm9yZigibm8gaGlzdG9yeSAoeWV0KSIpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlyZXR1cm4gKGFsbG93X2N1ciA/IGhpc3RwdHIgOiBoaXN0cHRyIC0gMSk7Cit9CisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG9sZGVzdCBjb21tYW5kIGluIHRoZSBoaXN0b3J5ICovCitzdGF0aWMgY2hhciAqKgoraGlzdF9nZXRfb2xkZXN0KHZvaWQpCit7CisJaWYgKGhpc3RwdHIgPD0gaGlzdG9yeSkgeworCQliaV9lcnJvcmYoIm5vIGhpc3RvcnkgKHlldCkiKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJcmV0dXJuIChoaXN0b3J5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJhY2sgdXAgb3ZlciBsYXN0IGhpc3RzYXZlICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2hpc3RiYWNrdXAodm9pZCkKK3sKKwlzdGF0aWMgaW50IGxhc3RfbGluZSA9IC0xOworCisJaWYgKGhpc3RwdHIgPj0gaGlzdG9yeSAmJiBsYXN0X2xpbmUgIT0gaGlzdF9zb3VyY2UtPmxpbmUpIHsKKwkJaGlzdF9zb3VyY2UtPmxpbmUtLTsKKwkJYWZyZWUoKmhpc3RwdHIsIEFQRVJNKTsKKwkJaGlzdHB0ci0tOworCQlsYXN0X2xpbmUgPSBoaXN0X3NvdXJjZS0+bGluZTsKKwl9Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgKi8KK2NoYXIgKioKK2hpc3Rwb3Modm9pZCkKK3sKKwlyZXR1cm4gKGN1cnJlbnQpOworfQorCitpbnQKK2hpc3RudW0oaW50IG4pCit7CisJaW50IGxhc3QgPSBoaXN0cHRyIC0gaGlzdG9yeTsKKworCWlmIChuIDwgMCB8fCBuID49IGxhc3QpIHsKKwkJY3VycmVudCA9IGhpc3RwdHI7CisJCXJldHVybiAobGFzdCk7CisJfSBlbHNlIHsKKwkJY3VycmVudCA9ICZoaXN0b3J5W25dOworCQlyZXR1cm4gKG4pOworCX0KK30KKworLyoKKyAqIFRoaXMgd2lsbCBiZWNvbWUgdW5uZWNlc3NhcnkgaWYgaGlzdF9nZXQgaXMgbW9kaWZpZWQgdG8gYWxsb3cKKyAqIHNlYXJjaGluZyBmcm9tIHBvc2l0aW9ucyBvdGhlciB0aGFuIHRoZSBlbmQsIGFuZCBpbiBlaXRoZXIKKyAqIGRpcmVjdGlvbi4KKyAqLworaW50CitmaW5kaGlzdChpbnQgc3RhcnQsIGludCBmd2QsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGFuY2hvcmVkKQoreworCWNoYXIJKipocDsKKwlpbnQJbWF4aGlzdCA9IGhpc3RwdHIgLSBoaXN0b3J5OworCWludAlpbmNyID0gZndkID8gMSA6IC0xOworCWludAlsZW4gPSBzdHJsZW4oc3RyKTsKKworCWlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gbWF4aGlzdCkKKwkJc3RhcnQgPSBtYXhoaXN0OworCisJaHAgPSAmaGlzdG9yeVtzdGFydF07CisJZm9yICg7IGhwID49IGhpc3RvcnkgJiYgaHAgPD0gaGlzdHB0cjsgaHAgKz0gaW5jcikKKwkJaWYgKChhbmNob3JlZCAmJiBzdHJuY21wKCpocCwgc3RyLCBsZW4pID09IDApIHx8CisJCSAgICAoIWFuY2hvcmVkICYmIHN0cnN0cigqaHAsIHN0cikpKQorCQkJcmV0dXJuIChocCAtIGhpc3RvcnkpOworCisJcmV0dXJuICgtMSk7Cit9CisKK2ludAorZmluZGhpc3RyZWwoY29uc3QgY2hhciAqc3RyKQoreworCWludAltYXhoaXN0ID0gaGlzdHB0ciAtIGhpc3Rvcnk7CisJaW50CXN0YXJ0ID0gbWF4aGlzdCAtIDE7CisJaW50CXJlYzsKKworCWdldG4oc3RyLCAmcmVjKTsKKwlpZiAocmVjID09IDApCisJCXJldHVybiAoLTEpOworCWlmIChyZWMgPiAwKSB7CisJCWlmIChyZWMgPiBtYXhoaXN0KQorCQkJcmV0dXJuICgtMSk7CisJCXJldHVybiAocmVjIC0gMSk7CisJfQorCWlmIChyZWMgPiBtYXhoaXN0KQorCQlyZXR1cm4gKC0xKTsKKwlyZXR1cm4gKHN0YXJ0ICsgcmVjICsgMSk7Cit9CisKKy8qCisgKglzZXQgaGlzdG9yeQorICoJdGhpcyBtZWFucyByZWFsbG9jYXRpbmcgdGhlIGRhdGFzcGFjZQorICovCit2b2lkCitzZXRoaXN0c2l6ZShpbnQgbikKK3sKKwlpZiAobiA+IDAgJiYgbiAhPSBoaXN0c2l6ZSkgeworCQlpbnQgY3Vyc2l6ZSA9IGhpc3RwdHIgLSBoaXN0b3J5OworCisJCS8qIHNhdmUgbW9zdCByZWNlbnQgaGlzdG9yeSAqLworCQlpZiAobiA8IGN1cnNpemUpIHsKKwkJCW1lbW1vdmUoaGlzdG9yeSwgaGlzdHB0ciAtIG4sIG4gKiBzaXplb2YoY2hhciAqKSk7CisJCQljdXJzaXplID0gbjsKKwkJfQorCisJCWhpc3RvcnkgPSBhcmVzaXplKGhpc3RvcnksIG4gKiBzaXplb2YoY2hhciAqKSwgQVBFUk0pOworCisJCWhpc3RzaXplID0gbjsKKwkJaGlzdHB0ciA9IGhpc3RvcnkgKyBjdXJzaXplOworCX0KK30KKworI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCisvKgorICoJc2V0IGhpc3RvcnkgZmlsZQorICoJVGhpcyBjYW4gbWVhbiByZWxvYWRpbmcvcmVzZXR0aW5nL3N0YXJ0aW5nIGhpc3RvcnkgZmlsZQorICoJbWFpbnRlbmFuY2UKKyAqLwordm9pZAorc2V0aGlzdGZpbGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwkvKiBpZiBub3Qgc3RhcnRlZCB0aGVuIG5vdGhpbmcgdG8gZG8gKi8KKwlpZiAoaHN0YXJ0ZWQgPT0gMCkKKwkJcmV0dXJuOworCisJLyogaWYgdGhlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgd2UgaGF2ZSAqLworCWlmIChobmFtZSAmJiBzdHJjbXAoaG5hbWUsIG5hbWUpID09IDApCisJCXJldHVybjsKKworCS8qCisJICogaXRzIGEgbmV3IG5hbWUgLSBwb3NzaWJseQorCSAqLworCWlmIChoaXN0ZmQpIHsKKwkJLyogeWVzIHRoZSBmaWxlIGlzIG9wZW4gKi8KKwkJKHZvaWQpY2xvc2UoaGlzdGZkKTsKKwkJaGlzdGZkID0gMDsKKwkJaHNpemUgPSAwOworCQlhZnJlZShobmFtZSwgQVBFUk0pOworCQlobmFtZSA9IE5VTEw7CisJCS8qIGxldCdzIHJlc2V0IHRoZSBoaXN0b3J5ICovCisJCWhpc3RwdHIgPSBoaXN0b3J5IC0gMTsKKwkJaGlzdF9zb3VyY2UtPmxpbmUgPSAwOworCX0KKworCWhpc3RfaW5pdChoaXN0X3NvdXJjZSk7Cit9CisjZW5kaWYKKworLyoKKyAqCWluaXRpYWxpc2UgdGhlIGhpc3RvcnkgdmVjdG9yCisgKi8KK3ZvaWQKK2luaXRfaGlzdHZlYyh2b2lkKQoreworCWlmIChoaXN0b3J5ID09IChjaGFyICoqKU5VTEwpIHsKKwkJaGlzdHNpemUgPSBISVNUT1JZU0laRTsKKwkJaGlzdG9yeSA9IGFsbG9jKGhpc3RzaXplICogc2l6ZW9mKGNoYXIgKiksIEFQRVJNKTsKKwkJaGlzdHB0ciA9IGhpc3RvcnkgLSAxOworCX0KK30KKworCisvKgorICoJUm91dGluZXMgYWRkZWQgYnkgUGV0ZXIgQ29sbGluc29uIEJTREkoRXVyb3BlKS9IaWxsc2lkZSBTeXN0ZW1zIHRvCisgKglhKSBwZXJtaXQgSElTVFNJWkUgdG8gY29udHJvbCBudW1iZXIgb2YgbGluZXMgb2YgaGlzdG9yeSBzdG9yZWQKKyAqCWIpIG1haW50YWluIGEgcGh5c2ljYWwgaGlzdG9yeSBmaWxlCisgKgorICoJSXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgaXMgYSBsb3Qgb2YgZ2hhc3RseSBoYWNrZXJ5IGhlcmUKKyAqLworCisjaWYgIWRlZmluZWQoTUtTSF9TTUFMTCkgJiYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKKy8qIGRvIG5vdCBzYXZlIGNvbW1hbmQgaW4gaGlzdG9yeSBidXQgcG9zc2libHkgc3luYyAqLworYm9vbAoraGlzdHN5bmModm9pZCkKK3sKKwlib29sIGNoYW5nZWQgPSBmYWxzZTsKKworCWlmIChoaXN0ZmQpIHsKKwkJaW50IGxubyA9IGhpc3Rfc291cmNlLT5saW5lOworCisJCWhpc3Rfc291cmNlLT5saW5lKys7CisJCXdyaXRlaGlzdGZpbGUoMCwgTlVMTCk7CisJCWhpc3Rfc291cmNlLT5saW5lLS07CisKKwkJaWYgKGxubyAhPSBoaXN0X3NvdXJjZS0+bGluZSkKKwkJCWNoYW5nZWQgPSB0cnVlOworCX0KKworCXJldHVybiAoY2hhbmdlZCk7Cit9CisjZW5kaWYKKworLyoKKyAqIHNhdmUgY29tbWFuZCBpbiBoaXN0b3J5CisgKi8KK3ZvaWQKK2hpc3RzYXZlKGludCAqbG5wLCBjb25zdCBjaGFyICpjbWQsIGJvb2wgZG93cml0ZSBNS1NIX0FfVU5VU0VELCBib29sIGlnbm9yZWR1cHMpCit7CisJY2hhciAqKmhwOworCWNoYXIgKmMsICpjcDsKKworCXN0cmR1cHgoYywgY21kLCBBUEVSTSk7CisJaWYgKChjcCA9IHN0cmNocihjLCAnXG4nKSkgIT0gTlVMTCkKKwkJKmNwID0gJ1wwJzsKKworCWlmIChpZ25vcmVkdXBzICYmICFzdHJjbXAoYywgKmhpc3RwdHIpCisjaWYgIWRlZmluZWQoTUtTSF9TTUFMTCkgJiYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKKwkgICAgJiYgIWhpc3RzeW5jKCkKKyNlbmRpZgorCSAgICApIHsKKwkJYWZyZWUoYywgQVBFUk0pOworCQlyZXR1cm47CisJfQorCSsrKmxucDsKKworI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCisJaWYgKGhpc3RmZCAmJiBkb3dyaXRlKQorCQl3cml0ZWhpc3RmaWxlKCpsbnAsIGMpOworI2VuZGlmCisKKwlocCA9IGhpc3RwdHI7CisKKwlpZiAoKytocCA+PSBoaXN0b3J5ICsgaGlzdHNpemUpIHsgLyogcmVtb3ZlIG9sZGVzdCBjb21tYW5kICovCisJCWFmcmVlKCpoaXN0b3J5LCBBUEVSTSk7CisJCWZvciAoaHAgPSBoaXN0b3J5OyBocCA8IGhpc3RvcnkgKyBoaXN0c2l6ZSAtIDE7IGhwKyspCisJCQlocFswXSA9IGhwWzFdOworCX0KKwkqaHAgPSBjOworCWhpc3RwdHIgPSBocDsKK30KKworLyoKKyAqCVdyaXRlIGhpc3RvcnkgZGF0YSB0byBhIGZpbGUgbm9taW5hdGVkIGJ5IEhJU1RGSUxFCisgKglpZiBISVNURklMRSBpcyB1bnNldCB0aGVuIGhpc3Rvcnkgc3RpbGwgaGFwcGVucywgYnV0CisgKgl0aGUgZGF0YSBpcyBub3Qgd3JpdHRlbiB0byBhIGZpbGUKKyAqCUFsbCBjb3BpZXMgb2Yga3NoIGxvb2tpbmcgYXQgdGhlIGZpbGUgd2lsbCBtYWludGFpbiB0aGUKKyAqCXNhbWUgaGlzdG9yeS4gVGhpcyBpcyBrc2ggYmVoYXZpb3VyLgorICoKKyAqCVRoaXMgc3R1ZmYgdXNlcyBtbWFwKCkKKyAqCWlmIHlvdXIgc3lzdGVtIGFpbid0IGdvdCBpdCAtIHRoZW4geW91J2xsIGhhdmUgdG8gdW5kZWYgSElTVE9SWUZJTEUKKyAqLworCisvKgorICoJT3BlbiBhIGhpc3RvcnkgZmlsZQorICoJRm9ybWF0IGlzOgorICoJQnl0ZXMgMSwgMjoKKyAqCQlITUFHSUMgLSBqdXN0IHRvIGNoZWNrIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aAorICoJCXRoZSBjb3JyZWN0IG9iamVjdAorICoJVGhlbiBmb2xsb3dzIGEgbnVtYmVyIG9mIHN0b3JlZCBjb21tYW5kcworICoJRWFjaCBjb21tYW5kIGlzCisgKgk8Y29tbWFuZCBieXRlPjxjb21tYW5kIG51bWJlcig0IGJ5dGVzKT48Ynl0ZXM+PG51bGw+CisgKi8KKyNkZWZpbmUgSE1BR0lDMQkJMHhhYgorI2RlZmluZSBITUFHSUMyCQkweGNkCisjZGVmaW5lIENPTU1BTkQJCTB4ZmYKKwordm9pZAoraGlzdF9pbml0KFNvdXJjZSAqcykKK3sKKyNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorCXVuc2lnbmVkIGNoYXIgKmJhc2U7CisJaW50IGxpbmVzLCBmZCwgcnYgPSAwOworI2VuZGlmCisKKwlpZiAoRmxhZyhGVEFMS0lORykgPT0gMCkKKwkJcmV0dXJuOworCisJaHN0YXJ0ZWQgPSAxOworCisJaGlzdF9zb3VyY2UgPSBzOworCisjaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKKwlpZiAoKGhuYW1lID0gc3RyX3ZhbChnbG9iYWwoIkhJU1RGSUxFIikpKSA9PSBOVUxMKQorCQlyZXR1cm47CisJc3RyZHVweChobmFtZSwgaG5hbWUsIEFQRVJNKTsKKworIHJldHJ5OgorCS8qIHdlIGhhdmUgYSBmaWxlIGFuZCBhcmUgaW50ZXJhY3RpdmUgKi8KKwlpZiAoKGZkID0gb3BlbihobmFtZSwgT19SRFdSfE9fQ1JFQVR8T19BUFBFTkQsIDA2MDApKSA8IDApCisJCXJldHVybjsKKworCWhpc3RmZCA9IHNhdmVmZChmZCk7CisJaWYgKGhpc3RmZCAhPSBmZCkKKwkJY2xvc2UoZmQpOworCisJKHZvaWQpZmxvY2soaGlzdGZkLCBMT0NLX0VYKTsKKworCWhzaXplID0gbHNlZWsoaGlzdGZkLCAob2ZmX3QpMCwgU0VFS19FTkQpOworCisJaWYgKGhzaXplID09IDApIHsKKwkJLyogYWRkIG1hZ2ljICovCisJCWlmIChzcHJpbmtsZShoaXN0ZmQpKSB7CisJCQloaXN0X2ZpbmlzaCgpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIGlmIChoc2l6ZSA+IDApIHsKKwkJLyoKKwkJICogd2UgaGF2ZSBzb21lIGRhdGEKKwkJICovCisJCWJhc2UgPSAodm9pZCAqKW1tYXAoTlVMTCwgaHNpemUsIFBST1RfUkVBRCwKKwkJICAgIE1BUF9GSUxFIHwgTUFQX1BSSVZBVEUsIGhpc3RmZCwgKG9mZl90KTApOworCQkvKgorCQkgKiBjaGVjayBvbiBpdHMgdmFsaWRpdHkKKwkJICovCisJCWlmIChiYXNlID09ICh1bnNpZ25lZCBjaGFyICopTUFQX0ZBSUxFRCB8fAorCQkgICAgKmJhc2UgIT0gSE1BR0lDMSB8fCBiYXNlWzFdICE9IEhNQUdJQzIpIHsKKwkJCWlmIChiYXNlICE9ICh1bnNpZ25lZCBjaGFyICopTUFQX0ZBSUxFRCkKKwkJCQltdW5tYXAoKGNhZGRyX3QpYmFzZSwgaHNpemUpOworCQkJaGlzdF9maW5pc2goKTsKKwkJCWlmICh1bmxpbmsoaG5hbWUpIC8qIGZhaWxzICovKQorCQkJCWdvdG8gaGluaXRlcnI7CisJCQlnb3RvIHJldHJ5OworCQl9CisJCWlmIChoc2l6ZSA+IDIpIHsKKwkJCWxpbmVzID0gaGlzdF9jb3VudF9saW5lcyhiYXNlKzIsIGhzaXplLTIpOworCQkJaWYgKGxpbmVzID4gaGlzdHNpemUpIHsKKwkJCQkvKiB3ZSBuZWVkIHRvIG1ha2UgdGhlIGZpbGUgc21hbGxlciAqLworCQkJCWlmIChoaXN0X3NocmluayhiYXNlLCBoc2l6ZSkpCisJCQkJCXJ2ID0gdW5saW5rKGhuYW1lKTsKKwkJCQltdW5tYXAoKGNhZGRyX3QpYmFzZSwgaHNpemUpOworCQkJCWhpc3RfZmluaXNoKCk7CisJCQkJaWYgKHJ2KSB7CisgaGluaXRlcnI6CisJCQkJCWJpX2Vycm9yZigiY2Fubm90IHVubGluayBISVNURklMRSAlcyIKKwkJCQkJICAgICIgLSAlcyIsIGhuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQkJCQloc2l6ZSA9IDA7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJZ290byByZXRyeTsKKwkJCX0KKwkJfQorCQloaXN0bG9hZChoaXN0X3NvdXJjZSwgYmFzZSsyLCBoc2l6ZS0yKTsKKwkJbXVubWFwKChjYWRkcl90KWJhc2UsIGhzaXplKTsKKwl9CisJKHZvaWQpZmxvY2soaGlzdGZkLCBMT0NLX1VOKTsKKwloc2l6ZSA9IGxzZWVrKGhpc3RmZCwgKG9mZl90KTAsIFNFRUtfRU5EKTsKKyNlbmRpZgorfQorCisjaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKK3R5cGVkZWYgZW51bSBzdGF0ZSB7CisJc2hkciwJCS8qIGV4cGVjdGluZyBhIGhlYWRlciAqLworCXNsaW5lLAkJLyogbG9va2luZyBmb3IgYSBudWxsIGJ5dGUgdG8gZW5kIHRoZSBsaW5lICovCisJc24xLAkJLyogYnl0ZXMgMSB0byA0IG9mIGEgbGluZSBubyAqLworCXNuMiwgc24zLCBzbjQKK30gU3RhdGU7CisKK3N0YXRpYyBpbnQKK2hpc3RfY291bnRfbGluZXModW5zaWduZWQgY2hhciAqYmFzZSwgaW50IGJ5dGVzKQoreworCVN0YXRlIHN0YXRlID0gc2hkcjsKKwlpbnQgbGluZXMgPSAwOworCisJd2hpbGUgKGJ5dGVzLS0pIHsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIHNoZHI6CisJCQlpZiAoKmJhc2UgPT0gQ09NTUFORCkKKwkJCQlzdGF0ZSA9IHNuMTsKKwkJCWJyZWFrOworCQljYXNlIHNuMToKKwkJCXN0YXRlID0gc24yOyBicmVhazsKKwkJY2FzZSBzbjI6CisJCQlzdGF0ZSA9IHNuMzsgYnJlYWs7CisJCWNhc2Ugc24zOgorCQkJc3RhdGUgPSBzbjQ7IGJyZWFrOworCQljYXNlIHNuNDoKKwkJCXN0YXRlID0gc2xpbmU7IGJyZWFrOworCQljYXNlIHNsaW5lOgorCQkJaWYgKCpiYXNlID09ICdcMCcpIHsKKwkJCQlsaW5lcysrOworCQkJCXN0YXRlID0gc2hkcjsKKwkJCX0KKwkJfQorCQliYXNlKys7CisJfQorCXJldHVybiAobGluZXMpOworfQorCisvKgorICoJU2hyaW5rIHRoZSBoaXN0b3J5IGZpbGUgdG8gaGlzdHNpemUgbGluZXMKKyAqLworc3RhdGljIGludAoraGlzdF9zaHJpbmsodW5zaWduZWQgY2hhciAqb2xkYmFzZSwgaW50IG9sZGJ5dGVzKQoreworCWludCBmZCwgcnYgPSAwOworCWNoYXIgKm5maWxlID0gTlVMTDsKKwlzdHJ1Y3QJc3RhdCBzdGF0YjsKKwl1bnNpZ25lZCBjaGFyICpuYmFzZSA9IG9sZGJhc2U7CisJaW50IG5ieXRlcyA9IG9sZGJ5dGVzOworCisJbmJhc2UgPSBoaXN0X3NraXBfYmFjayhuYmFzZSwgJm5ieXRlcywgaGlzdHNpemUpOworCWlmIChuYmFzZSA9PSBOVUxMKQorCQlyZXR1cm4gKDEpOworCWlmIChuYmFzZSA9PSBvbGRiYXNlKQorCQlyZXR1cm4gKDApOworCisJLyoKKwkgKgljcmVhdGUgdGVtcCBmaWxlCisJICovCisJbmZpbGUgPSBzaGZfc21wcmludGYoIiVzLiVkIiwgaG5hbWUsIChpbnQpcHJvY3BpZCk7CisJaWYgKChmZCA9IG9wZW4obmZpbGUsIE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19XUk9OTFksIDA2MDApKSA8IDApCisJCWdvdG8gZXJyb3V0OworCWlmIChmc3RhdChoaXN0ZmQsICZzdGF0YikgPj0gMCAmJgorCSAgICBjaG93bihuZmlsZSwgc3RhdGIuc3RfdWlkLCBzdGF0Yi5zdF9naWQpKQorCQlnb3RvIGVycm91dDsKKworCWlmIChzcHJpbmtsZShmZCkgfHwgd3JpdGUoZmQsIG5iYXNlLCBuYnl0ZXMpICE9IG5ieXRlcykKKwkJZ290byBlcnJvdXQ7CisJY2xvc2UoZmQpOworCWZkID0gLTE7CisKKwkvKgorCSAqCXJlbmFtZQorCSAqLworCWlmIChyZW5hbWUobmZpbGUsIGhuYW1lKSA8IDApIHsKKyBlcnJvdXQ6CisJCWlmIChmZCA+PSAwKSB7CisJCQljbG9zZShmZCk7CisJCQlpZiAobmZpbGUpCisJCQkJdW5saW5rKG5maWxlKTsKKwkJfQorCQlydiA9IDE7CisJfQorCWFmcmVlKG5maWxlLCBBVEVNUCk7CisJcmV0dXJuIChydik7Cit9CisKKy8qCisgKglmaW5kIGEgcG9pbnRlciB0byB0aGUgZGF0YSAnbm8nIGJhY2sgZnJvbSB0aGUgZW5kIG9mIHRoZSBmaWxlCisgKglyZXR1cm4gdGhlIHBvaW50ZXIgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdAorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCitoaXN0X3NraXBfYmFjayh1bnNpZ25lZCBjaGFyICpiYXNlLCBpbnQgKmJ5dGVzLCBpbnQgbm8pCit7CisJaW50IGxpbmVzID0gMDsKKwl1bnNpZ25lZCBjaGFyICplcDsKKworCWZvciAoZXAgPSBiYXNlICsgKmJ5dGVzOyAtLWVwID4gYmFzZTsgKSB7CisJCS8qCisJCSAqIHRoaXMgZG9lc24ndCByZWFsbHkgd29yazogdGhlIDQgYnl0ZSBsaW5lIG51bWJlciB0aGF0CisJCSAqIGlzIGVuY29kZWQgYWZ0ZXIgdGhlIENPTU1BTkQgYnl0ZSBjYW4gaXRzZWxmIGNvbnRhaW4KKwkJICogdGhlIENPTU1BTkQgYnl0ZS4uLi4KKwkJICovCisJCWZvciAoOyBlcCA+IGJhc2UgJiYgKmVwICE9IENPTU1BTkQ7IGVwLS0pCisJCQk7CisJCWlmIChlcCA9PSBiYXNlKQorCQkJYnJlYWs7CisJCWlmICgrK2xpbmVzID09IG5vKSB7CisJCQkqYnl0ZXMgPSAqYnl0ZXMgLSAoKGNoYXIgKillcCAtIChjaGFyICopYmFzZSk7CisJCQlyZXR1cm4gKGVwKTsKKwkJfQorCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCisvKgorICoJbG9hZCB0aGUgaGlzdG9yeSBzdHJ1Y3R1cmUgZnJvbSB0aGUgc3RvcmVkIGRhdGEKKyAqLworc3RhdGljIHZvaWQKK2hpc3Rsb2FkKFNvdXJjZSAqcywgdW5zaWduZWQgY2hhciAqYmFzZSwgaW50IGJ5dGVzKQoreworCVN0YXRlIHN0YXRlOworCWludCBsbm8gPSAwOworCXVuc2lnbmVkIGNoYXIgKmxpbmUgPSBOVUxMOworCisJZm9yIChzdGF0ZSA9IHNoZHI7IGJ5dGVzLS0gPiAwOyBiYXNlKyspIHsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIHNoZHI6CisJCQlpZiAoKmJhc2UgPT0gQ09NTUFORCkKKwkJCQlzdGF0ZSA9IHNuMTsKKwkJCWJyZWFrOworCQljYXNlIHNuMToKKwkJCWxubyA9ICgoKCpiYXNlKSYweGZmKTw8MjQpOworCQkJc3RhdGUgPSBzbjI7CisJCQlicmVhazsKKwkJY2FzZSBzbjI6CisJCQlsbm8gfD0gKCgoKmJhc2UpJjB4ZmYpPDwxNik7CisJCQlzdGF0ZSA9IHNuMzsKKwkJCWJyZWFrOworCQljYXNlIHNuMzoKKwkJCWxubyB8PSAoKCgqYmFzZSkmMHhmZik8PDgpOworCQkJc3RhdGUgPSBzbjQ7CisJCQlicmVhazsKKwkJY2FzZSBzbjQ6CisJCQlsbm8gfD0gKCpiYXNlKSYweGZmOworCQkJbGluZSA9IGJhc2UrMTsKKwkJCXN0YXRlID0gc2xpbmU7CisJCQlicmVhazsKKwkJY2FzZSBzbGluZToKKwkJCWlmICgqYmFzZSA9PSAnXDAnKSB7CisJCQkJLyogd29ycnkgYWJvdXQgbGluZSBudW1iZXJzICovCisJCQkJaWYgKGhpc3RwdHIgPj0gaGlzdG9yeSAmJiBsbm8tMSAhPSBzLT5saW5lKSB7CisJCQkJCS8qIGEgcmVwbGFjZW1lbnQgPyAqLworCQkJCQloaXN0aW5zZXJ0KHMsIGxubywgKGNoYXIgKilsaW5lKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzLT5saW5lID0gbG5vLS07CisJCQkJCWhpc3RzYXZlKCZsbm8sIChjaGFyICopbGluZSwgZmFsc2UsCisJCQkJCSAgICBmYWxzZSk7CisJCQkJfQorCQkJCXN0YXRlID0gc2hkcjsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqCUluc2VydCBhIGxpbmUgaW50byB0aGUgaGlzdG9yeSBhdCBhIHNwZWNpZmllZCBudW1iZXIKKyAqLworc3RhdGljIHZvaWQKK2hpc3RpbnNlcnQoU291cmNlICpzLCBpbnQgbG5vLCBjb25zdCBjaGFyICpsaW5lKQoreworCWNoYXIgKipocDsKKworCWlmIChsbm8gPj0gcy0+bGluZSAtIChoaXN0cHRyIC0gaGlzdG9yeSkgJiYgbG5vIDw9IHMtPmxpbmUpIHsKKwkJaHAgPSAmaGlzdHB0cltsbm8gLSBzLT5saW5lXTsKKwkJaWYgKCpocCkKKwkJCWFmcmVlKCpocCwgQVBFUk0pOworCQlzdHJkdXB4KCpocCwgbGluZSwgQVBFUk0pOworCX0KK30KKworLyoKKyAqCXdyaXRlIGEgY29tbWFuZCB0byB0aGUgZW5kIG9mIHRoZSBoaXN0b3J5IGZpbGUKKyAqCVRoaXMgKk1BWSogc2VlbSBlYXN5IGJ1dCBpdCdzIGFsc28gbmVjZXNzYXJ5IHRvIGNoZWNrCisgKgl0aGF0IHRoZSBoaXN0b3J5IGZpbGUgaGFzIG5vdCBjaGFuZ2VkIGluIHNpemUuCisgKglJZiBpdCBoYXMgLSB0aGVuIHNvbWUgb3RoZXIgc2hlbGwgaGFzIHdyaXR0ZW4gdG8gaXQKKyAqCWFuZCB3ZSBzaG91bGQgcmVhZCB0aG9zZSBjb21tYW5kcyB0byB1cGRhdGUgb3VyIGhpc3RvcnkKKyAqLworc3RhdGljIHZvaWQKK3dyaXRlaGlzdGZpbGUoaW50IGxubywgY2hhciAqY21kKQoreworCWludAlzaXplbm93OworCXVuc2lnbmVkIGNoYXIJKmJhc2U7CisJdW5zaWduZWQgY2hhcgkqbmV3czsKKwlpbnQJYnl0ZXM7CisJdW5zaWduZWQgY2hhcgloZHJbNV07CisKKwkodm9pZClmbG9jayhoaXN0ZmQsIExPQ0tfRVgpOworCXNpemVub3cgPSBsc2VlayhoaXN0ZmQsIChvZmZfdCkwLCBTRUVLX0VORCk7CisJaWYgKHNpemVub3cgIT0gaHNpemUpIHsKKwkJLyoKKwkJICoJVGhpbmdzIGhhdmUgY2hhbmdlZAorCQkgKi8KKwkJaWYgKHNpemVub3cgPiBoc2l6ZSkgeworCQkJLyogc29tZW9uZSBoYXMgYWRkZWQgc29tZSBsaW5lcyAqLworCQkJYnl0ZXMgPSBzaXplbm93IC0gaHNpemU7CisJCQliYXNlID0gKHZvaWQgKiltbWFwKE5VTEwsIHNpemVub3csIFBST1RfUkVBRCwKKwkJCSAgICBNQVBfRklMRSB8IE1BUF9QUklWQVRFLCBoaXN0ZmQsIChvZmZfdCkwKTsKKwkJCWlmIChiYXNlID09ICh1bnNpZ25lZCBjaGFyICopTUFQX0ZBSUxFRCkKKwkJCQlnb3RvIGJhZDsKKwkJCW5ld3MgPSBiYXNlICsgaHNpemU7CisJCQlpZiAoKm5ld3MgIT0gQ09NTUFORCkgeworCQkJCW11bm1hcCgoY2FkZHJfdCliYXNlLCBzaXplbm93KTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWhpc3Rfc291cmNlLT5saW5lLS07CisJCQloaXN0bG9hZChoaXN0X3NvdXJjZSwgbmV3cywgYnl0ZXMpOworCQkJaGlzdF9zb3VyY2UtPmxpbmUrKzsKKwkJCWxubyA9IGhpc3Rfc291cmNlLT5saW5lOworCQkJbXVubWFwKChjYWRkcl90KWJhc2UsIHNpemVub3cpOworCQkJaHNpemUgPSBzaXplbm93OworCQl9IGVsc2UgeworCQkJLyogaXQgaGFzIHNocnVuayAqLworCQkJLyogYnV0IHRvIHdoYXQ/ICovCisJCQkvKiB3ZSdsbCBnaXZlIHVwIGZvciBub3cgKi8KKwkJCWdvdG8gYmFkOworCQl9CisJfQorCWlmIChjbWQpIHsKKwkJLyoKKwkJICoJd2UgY2FuIHdyaXRlIG91ciBiaXQgbm93CisJCSAqLworCQloZHJbMF0gPSBDT01NQU5EOworCQloZHJbMV0gPSAobG5vPj4yNCkmMHhmZjsKKwkJaGRyWzJdID0gKGxubz4+MTYpJjB4ZmY7CisJCWhkclszXSA9IChsbm8+PjgpJjB4ZmY7CisJCWhkcls0XSA9IGxubyYweGZmOworCQlieXRlcyA9IHN0cmxlbihjbWQpICsgMTsKKwkJaWYgKCh3cml0ZShoaXN0ZmQsIGhkciwgNSkgIT0gNSkgfHwKKwkJICAgICh3cml0ZShoaXN0ZmQsIGNtZCwgYnl0ZXMpICE9IGJ5dGVzKSkKKwkJCWdvdG8gYmFkOworCQloc2l6ZSA9IGxzZWVrKGhpc3RmZCwgKG9mZl90KTAsIFNFRUtfRU5EKTsKKwl9CisJKHZvaWQpZmxvY2soaGlzdGZkLCBMT0NLX1VOKTsKKwlyZXR1cm47CisgYmFkOgorCWhpc3RfZmluaXNoKCk7Cit9CisKK3ZvaWQKK2hpc3RfZmluaXNoKHZvaWQpCit7CisJKHZvaWQpZmxvY2soaGlzdGZkLCBMT0NLX1VOKTsKKwkodm9pZCljbG9zZShoaXN0ZmQpOworCWhpc3RmZCA9IDA7Cit9CisKKy8qCisgKglhZGQgbWFnaWMgdG8gdGhlIGhpc3RvcnkgZmlsZQorICovCitzdGF0aWMgaW50CitzcHJpbmtsZShpbnQgZmQpCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWFnW10gPSB7IEhNQUdJQzEsIEhNQUdJQzIgfTsKKworCXJldHVybiAod3JpdGUoZmQsIG1hZywgMikgIT0gMik7Cit9CisjZW5kaWYKKworI2lmICFIQVZFX1NZU19TSUdOQU1FCitzdGF0aWMgY29uc3Qgc3RydWN0IG1rc2hfc2lncGFpciB7CisJY29uc3QgY2hhciAqY29uc3QgbmFtZTsKKwlpbnQgbnI7Cit9IG1rc2hfc2lncGFpcnNbXSA9IHsKKyNpbmNsdWRlICJzaWduYW1lcy5pbmMiCisJeyBOVUxMLCAwIH0KK307CisjZW5kaWYKKwordm9pZAoraW5pdHRyYXBzKHZvaWQpCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqY3M7CisKKwkvKiBQb3B1bGF0ZSBzaWd0cmFwcyBiYXNlZCBvbiBzeXNfc2lnbmFtZSBhbmQgc3lzX3NpZ2xpc3QuICovCisJZm9yIChpID0gMDsgaSA8PSBOU0lHOyBpKyspIHsKKwkJc2lndHJhcHNbaV0uc2lnbmFsID0gaTsKKwkJaWYgKGkgPT0gU0lHRVJSXykgeworCQkJc2lndHJhcHNbaV0ubmFtZSA9ICJFUlIiOworCQkJc2lndHJhcHNbaV0ubWVzcyA9ICJFcnJvciBoYW5kbGVyIjsKKwkJfSBlbHNlIHsKKyNpZiBIQVZFX1NZU19TSUdOQU1FCisJCQljcyA9IHN5c19zaWduYW1lW2ldOworI2Vsc2UKKwkJCWNvbnN0IHN0cnVjdCBta3NoX3NpZ3BhaXIgKnBhaXIgPSBta3NoX3NpZ3BhaXJzOworCQkJd2hpbGUgKChwYWlyLT5uciAhPSBpKSAmJiAocGFpci0+bmFtZSAhPSBOVUxMKSkKKwkJCQkrK3BhaXI7CisJCQljcyA9IHBhaXItPm5hbWU7CisjZW5kaWYKKwkJCWlmICgoY3MgPT0gTlVMTCkgfHwKKwkJCSAgICAoY3NbMF0gPT0gJ1wwJykpCisJCQkJc2lndHJhcHNbaV0ubmFtZSA9IHNoZl9zbXByaW50ZigiJWQiLCBpKTsKKwkJCWVsc2UgeworCQkJCWNoYXIgKnM7CisKKwkJCQlpZiAoIXN0cm5jYXNlY21wKGNzLCAiU0lHIiwgMykpCisJCQkJCWNzICs9IDM7CisJCQkJc3RyZHVweChzLCBjcywgQVBFUk0pOworCQkJCXNpZ3RyYXBzW2ldLm5hbWUgPSBzOworCQkJCXdoaWxlICgoKnMgPSBrc2hfdG91cHBlcigqcykpKQorCQkJCQkrK3M7CisJCQl9CisjaWYgSEFWRV9TWVNfU0lHTElTVAorCQkJc2lndHJhcHNbaV0ubWVzcyA9IHN5c19zaWdsaXN0W2ldOworI2VsaWYgSEFWRV9TVFJTSUdOQUwKKwkJCXNpZ3RyYXBzW2ldLm1lc3MgPSBzdHJzaWduYWwoaSk7CisjZWxzZQorCQkJc2lndHJhcHNbaV0ubWVzcyA9IE5VTEw7CisjZW5kaWYKKwkJCWlmICgoc2lndHJhcHNbaV0ubWVzcyA9PSBOVUxMKSB8fAorCQkJICAgIChzaWd0cmFwc1tpXS5tZXNzWzBdID09ICdcMCcpKQorCQkJCXNpZ3RyYXBzW2ldLm1lc3MgPSBzaGZfc21wcmludGYoIlNpZ25hbCAlZCIsIGkpOworCQl9CisJfQorCXNpZ3RyYXBzW1NJR0VYSVRfXS5uYW1lID0gIkVYSVQiOwkvKiBvdXIgbmFtZSBmb3Igc2lnbmFsIDAgKi8KKworCSh2b2lkKXNpZ2VtcHR5c2V0KCZTaWdhY3RfaWduLnNhX21hc2spOworCVNpZ2FjdF9pZ24uc2FfZmxhZ3MgPSAwOyAvKiBpbnRlcnJ1cHRpYmxlICovCisJU2lnYWN0X2lnbi5zYV9oYW5kbGVyID0gU0lHX0lHTjsKKworCXNpZ3RyYXBzW1NJR0lOVF0uZmxhZ3MgfD0gVEZfREZMX0lOVFIgfCBURl9UVFlfSU5UUjsKKwlzaWd0cmFwc1tTSUdRVUlUXS5mbGFncyB8PSBURl9ERkxfSU5UUiB8IFRGX1RUWV9JTlRSOworCXNpZ3RyYXBzW1NJR1RFUk1dLmZsYWdzIHw9IFRGX0RGTF9JTlRSOy8qIG5vdCBmYXRhbCBmb3IgaW50ZXJhY3RpdmUgKi8KKwlzaWd0cmFwc1tTSUdIVVBdLmZsYWdzIHw9IFRGX0ZBVEFMOworCXNpZ3RyYXBzW1NJR0NITERdLmZsYWdzIHw9IFRGX1NIRUxMX1VTRVM7CisKKwkvKiB0aGVzZSBhcmUgYWx3YXlzIGNhdWdodCBzbyB3ZSBjYW4gY2xlYW4gdXAgYW55IHRlbXBvcmFyeSBmaWxlcy4gKi8KKwlzZXRzaWcoJnNpZ3RyYXBzW1NJR0lOVF0sIHRyYXBzaWcsIFNTX1JFU1RPUkVfT1JJRyk7CisJc2V0c2lnKCZzaWd0cmFwc1tTSUdRVUlUXSwgdHJhcHNpZywgU1NfUkVTVE9SRV9PUklHKTsKKwlzZXRzaWcoJnNpZ3RyYXBzW1NJR1RFUk1dLCB0cmFwc2lnLCBTU19SRVNUT1JFX09SSUcpOworCXNldHNpZygmc2lndHJhcHNbU0lHSFVQXSwgdHJhcHNpZywgU1NfUkVTVE9SRV9PUklHKTsKK30KKworc3RhdGljIHZvaWQgYWxhcm1fY2F0Y2hlcihpbnQgc2lnKTsKKwordm9pZAorYWxhcm1faW5pdCh2b2lkKQoreworCXNpZ3RyYXBzW1NJR0FMUk1dLmZsYWdzIHw9IFRGX1NIRUxMX1VTRVM7CisJc2V0c2lnKCZzaWd0cmFwc1tTSUdBTFJNXSwgYWxhcm1fY2F0Y2hlciwKKwkJU1NfUkVTVE9SRV9PUklHfFNTX0ZPUkNFfFNTX1NIVFJBUCk7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorYWxhcm1fY2F0Y2hlcihpbnQgc2lnIE1LU0hfQV9VTlVTRUQpCit7CisJLyogdGhpcyBydW5zIGluc2lkZSBpbnRlcnJ1cHQgY29udGV4dCwgd2l0aCBlcnJubyBzYXZlZCAqLworCisJaWYgKGtzaF90bW91dF9zdGF0ZSA9PSBUTU9VVF9SRUFESU5HKSB7CisJCWludCBsZWZ0ID0gYWxhcm0oMCk7CisKKwkJaWYgKGxlZnQgPT0gMCkgeworCQkJa3NoX3Rtb3V0X3N0YXRlID0gVE1PVVRfTEVBVklORzsKKwkJCWludHJzaWcgPSAxOworCQl9IGVsc2UKKwkJCWFsYXJtKGxlZnQpOworCX0KK30KKworVHJhcCAqCitnZXR0cmFwKGNvbnN0IGNoYXIgKm5hbWUsIGludCBpZ25jYXNlKQoreworCWludCBuID0gTlNJRyArIDE7CisJVHJhcCAqcDsKKwljb25zdCBjaGFyICpuMjsKKwlpbnQgKCpjbXBmdW5jKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikgPSBzdHJjbXA7CisKKwlpZiAoa3NoX2lzZGlnaXQoKm5hbWUpKSB7CisJCWlmIChnZXRuKG5hbWUsICZuKSAmJiAwIDw9IG4gJiYgbiA8IE5TSUcpCisJCQlyZXR1cm4gKCZzaWd0cmFwc1tuXSk7CisJCWVsc2UKKwkJCXJldHVybiAoTlVMTCk7CisJfQorCisJbjIgPSBzdHJuY2FzZWNtcChuYW1lLCAiU0lHIiwgMykgPyBOVUxMIDogbmFtZSArIDM7CisJaWYgKGlnbmNhc2UpCisJCWNtcGZ1bmMgPSBzdHJjYXNlY21wOworCWZvciAocCA9IHNpZ3RyYXBzOyAtLW4gPj0gMDsgcCsrKQorCQlpZiAoIWNtcGZ1bmMocC0+bmFtZSwgbmFtZSkgfHwgKG4yICYmICFjbXBmdW5jKHAtPm5hbWUsIG4yKSkpCisJCQlyZXR1cm4gKHApOworCXJldHVybiAoTlVMTCk7Cit9CisKKy8qCisgKiB0cmFwIHNpZ25hbCBoYW5kbGVyCisgKi8KK3ZvaWQKK3RyYXBzaWcoaW50IGkpCit7CisJVHJhcCAqcCA9ICZzaWd0cmFwc1tpXTsKKwlpbnQgZXJybm9fID0gZXJybm87CisKKwl0cmFwID0gcC0+c2V0ID0gMTsKKwlpZiAocC0+ZmxhZ3MgJiBURl9ERkxfSU5UUikKKwkJaW50cnNpZyA9IDE7CisJaWYgKChwLT5mbGFncyAmIFRGX0ZBVEFMKSAmJiAhcC0+dHJhcCkgeworCQlmYXRhbF90cmFwID0gMTsKKwkJaW50cnNpZyA9IDE7CisJfQorCWlmIChwLT5zaHRyYXApCisJCSgqcC0+c2h0cmFwKShpKTsKKwllcnJubyA9IGVycm5vXzsKK30KKworLyoKKyAqIGNhbGxlZCB3aGVuIHdlIHdhbnQgdG8gYWxsb3cgdGhlIHVzZXIgdG8gXkMgb3V0IG9mIHNvbWV0aGluZyAtIHdvbid0CisgKiB3b3JrIGlmIHVzZXIgaGFzIHRyYXBwZWQgU0lHSU5ULgorICovCit2b2lkCitpbnRyY2hlY2sodm9pZCkKK3sKKwlpZiAoaW50cnNpZykKKwkJcnVudHJhcHMoVEZfREZMX0lOVFJ8VEZfRkFUQUwpOworfQorCisvKgorICogY2FsbGVkIGFmdGVyIEVJTlRSIHRvIGNoZWNrIGlmIGEgc2lnbmFsIHdpdGggbm9ybWFsbHkgY2F1c2VzIHByb2Nlc3MKKyAqIHRlcm1pbmF0aW9uIGhhcyBiZWVuIHJlY2VpdmVkLgorICovCitpbnQKK2ZhdGFsX3RyYXBfY2hlY2sodm9pZCkKK3sKKwlpbnQgaTsKKwlUcmFwICpwOworCisJLyogdG9kbzogc2hvdWxkIGNoZWNrIGlmIHNpZ25hbCBpcyBmYXRhbCwgbm90IHRoZSBURl9ERkxfSU5UUiBmbGFnICovCisJZm9yIChwID0gc2lndHJhcHMsIGkgPSBOU0lHKzE7IC0taSA+PSAwOyBwKyspCisJCWlmIChwLT5zZXQgJiYgKHAtPmZsYWdzICYgKFRGX0RGTF9JTlRSfFRGX0ZBVEFMKSkpCisJCQkvKiByZXR1cm4gdmFsdWUgaXMgdXNlZCBhcyBhbiBleGl0IGNvZGUgKi8KKwkJCXJldHVybiAoMTI4ICsgcC0+c2lnbmFsKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogUmV0dXJucyB0aGUgc2lnbmFsIG51bWJlciBvZiBhbnkgcGVuZGluZyB0cmFwczogaWUsIGEgc2lnbmFsIHdoaWNoIGhhcworICogb2NjdXJyZWQgZm9yIHdoaWNoIGEgdHJhcCBoYXMgYmVlbiBzZXQgb3IgZm9yIHdoaWNoIHRoZSBURl9ERkxfSU5UUiBmbGFnCisgKiBpcyBzZXQuCisgKi8KK2ludAordHJhcF9wZW5kaW5nKHZvaWQpCit7CisJaW50IGk7CisJVHJhcCAqcDsKKworCWZvciAocCA9IHNpZ3RyYXBzLCBpID0gTlNJRysxOyAtLWkgPj0gMDsgcCsrKQorCQlpZiAocC0+c2V0ICYmICgocC0+dHJhcCAmJiBwLT50cmFwWzBdKSB8fAorCQkgICAgKChwLT5mbGFncyAmIChURl9ERkxfSU5UUnxURl9GQVRBTCkpICYmICFwLT50cmFwKSkpCisJCQlyZXR1cm4gKHAtPnNpZ25hbCk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIHJ1biBhbnkgcGVuZGluZyB0cmFwcy4gSWYgaW50ciBpcyBzZXQsIG9ubHkgcnVuIHRyYXBzIHRoYXQKKyAqIGNhbiBpbnRlcnJ1cHQgY29tbWFuZHMuCisgKi8KK3ZvaWQKK3J1bnRyYXBzKGludCBmbGFnKQoreworCWludCBpOworCVRyYXAgKnA7CisKKwlpZiAoa3NoX3Rtb3V0X3N0YXRlID09IFRNT1VUX0xFQVZJTkcpIHsKKwkJa3NoX3Rtb3V0X3N0YXRlID0gVE1PVVRfRVhFQ1VUSU5HOworCQl3YXJuaW5nZihmYWxzZSwgInRpbWVkIG91dCB3YWl0aW5nIGZvciBpbnB1dCIpOworCQl1bndpbmQoTEVYSVQpOworCX0gZWxzZQorCQkvKgorCQkgKiBYWFg6IHRoaXMgbWVhbnMgdGhlIGFsYXJtIHdpbGwgaGF2ZSBubyBlZmZlY3QgaWYgYSB0cmFwCisJCSAqIGlzIGNhdWdodCBhZnRlciB0aGUgYWxhcm0oKSB3YXMgc3RhcnRlZC4uLm5vdCBnb29kLgorCQkgKi8KKwkJa3NoX3Rtb3V0X3N0YXRlID0gVE1PVVRfRVhFQ1VUSU5HOworCWlmICghZmxhZykKKwkJdHJhcCA9IDA7CisJaWYgKGZsYWcgJiBURl9ERkxfSU5UUikKKwkJaW50cnNpZyA9IDA7CisJaWYgKGZsYWcgJiBURl9GQVRBTCkKKwkJZmF0YWxfdHJhcCA9IDA7CisJZm9yIChwID0gc2lndHJhcHMsIGkgPSBOU0lHKzE7IC0taSA+PSAwOyBwKyspCisJCWlmIChwLT5zZXQgJiYgKCFmbGFnIHx8CisJCSAgICAoKHAtPmZsYWdzICYgZmxhZykgJiYgcC0+dHJhcCA9PSBOVUxMKSkpCisJCQlydW50cmFwKHApOworfQorCit2b2lkCitydW50cmFwKFRyYXAgKnApCit7CisJaW50CWkgPSBwLT5zaWduYWw7CisJY2hhcgkqdHJhcHN0ciA9IHAtPnRyYXA7CisJaW50CW9leHN0YXQ7CisJaW50CW9sZF9jaGFuZ2VkID0gMDsKKworCXAtPnNldCA9IDA7CisJaWYgKHRyYXBzdHIgPT0gTlVMTCkgeyAvKiBTSUdfREZMICovCisJCWlmIChwLT5mbGFncyAmIFRGX0ZBVEFMKSB7CisJCQkvKiBlZywgU0lHSFVQICovCisJCQlleHN0YXQgPSAxMjggKyBpOworCQkJdW53aW5kKExMRUFWRSk7CisJCX0KKwkJaWYgKHAtPmZsYWdzICYgVEZfREZMX0lOVFIpIHsKKwkJCS8qIGVnLCBTSUdJTlQsIFNJR1FVSVQsIFNJR1RFUk0sIGV0Yy4gKi8KKwkJCWV4c3RhdCA9IDEyOCArIGk7CisJCQl1bndpbmQoTElOVFIpOworCQl9CisJCXJldHVybjsKKwl9CisJaWYgKHRyYXBzdHJbMF0gPT0gJ1wwJykgLyogU0lHX0lHTiAqLworCQlyZXR1cm47CisJaWYgKGkgPT0gU0lHRVhJVF8gfHwgaSA9PSBTSUdFUlJfKSB7CS8qIGF2b2lkIHJlY3Vyc2lvbiBvbiB0aGVzZSAqLworCQlvbGRfY2hhbmdlZCA9IHAtPmZsYWdzICYgVEZfQ0hBTkdFRDsKKwkJcC0+ZmxhZ3MgJj0gflRGX0NIQU5HRUQ7CisJCXAtPnRyYXAgPSBOVUxMOworCX0KKwlvZXhzdGF0ID0gZXhzdGF0OworCS8qCisJICogTm90ZTogdHJhcHN0ciBpcyBmdWxseSBwYXJzZWQgYmVmb3JlIGFueXRoaW5nIGlzIGV4ZWN1dGVkLCB0aHVzCisJICogbm8gcHJvYmxlbSB3aXRoIGFmcmVlKHAtPnRyYXApIGluIHNldHRyYXAoKSB3aGlsZSBzdGlsbCBpbiB1c2UuCisJICovCisJY29tbWFuZCh0cmFwc3RyLCBjdXJyZW50X2xpbmVubyk7CisJZXhzdGF0ID0gb2V4c3RhdDsKKwlpZiAoaSA9PSBTSUdFWElUXyB8fCBpID09IFNJR0VSUl8pIHsKKwkJaWYgKHAtPmZsYWdzICYgVEZfQ0hBTkdFRCkKKwkJCS8qIGRvbid0IGNsZWFyIFRGX0NIQU5HRUQgKi8KKwkJCWFmcmVlKHRyYXBzdHIsIEFQRVJNKTsKKwkJZWxzZQorCQkJcC0+dHJhcCA9IHRyYXBzdHI7CisJCXAtPmZsYWdzIHw9IG9sZF9jaGFuZ2VkOworCX0KK30KKworLyogY2xlYXIgcGVuZGluZyB0cmFwcyBhbmQgcmVzZXQgdXNlcidzIHRyYXAgaGFuZGxlcnM7IHVzZWQgYWZ0ZXIgZm9yaygyKSAqLwordm9pZAorY2xlYXJ0cmFwcyh2b2lkKQoreworCWludCBpOworCVRyYXAgKnA7CisKKwl0cmFwID0gMDsKKwlpbnRyc2lnID0gMDsKKwlmYXRhbF90cmFwID0gMDsKKwlmb3IgKGkgPSBOU0lHKzEsIHAgPSBzaWd0cmFwczsgLS1pID49IDA7IHArKykgeworCQlwLT5zZXQgPSAwOworCQlpZiAoKHAtPmZsYWdzICYgVEZfVVNFUl9TRVQpICYmIChwLT50cmFwICYmIHAtPnRyYXBbMF0pKQorCQkJc2V0dHJhcChwLCBOVUxMKTsKKwl9Cit9CisKKy8qIHJlc3RvcmUgc2lnbmFscyBqdXN0IGJlZm9yZSBhbiBleGVjKDIpICovCit2b2lkCityZXN0b3Jlc2lncyh2b2lkKQoreworCWludCBpOworCVRyYXAgKnA7CisKKwlmb3IgKGkgPSBOU0lHKzEsIHAgPSBzaWd0cmFwczsgLS1pID49IDA7IHArKykKKwkJaWYgKHAtPmZsYWdzICYgKFRGX0VYRUNfSUdOfFRGX0VYRUNfREZMKSkKKwkJCXNldHNpZyhwLCAocC0+ZmxhZ3MgJiBURl9FWEVDX0lHTikgPyBTSUdfSUdOIDogU0lHX0RGTCwKKwkJCSAgICBTU19SRVNUT1JFX0NVUlJ8U1NfRk9SQ0UpOworfQorCit2b2lkCitzZXR0cmFwKFRyYXAgKnAsIGNvbnN0IGNoYXIgKnMpCit7CisJc2lnX3QgZjsKKworCWlmIChwLT50cmFwKQorCQlhZnJlZShwLT50cmFwLCBBUEVSTSk7CisJc3RyZHVweChwLT50cmFwLCBzLCBBUEVSTSk7IC8qIGhhbmRsZXMgcyA9PSAwICovCisJcC0+ZmxhZ3MgfD0gVEZfQ0hBTkdFRDsKKwlmID0gIXMgPyBTSUdfREZMIDogc1swXSA/IHRyYXBzaWcgOiBTSUdfSUdOOworCisJcC0+ZmxhZ3MgfD0gVEZfVVNFUl9TRVQ7CisJaWYgKChwLT5mbGFncyAmIChURl9ERkxfSU5UUnxURl9GQVRBTCkpICYmIGYgPT0gU0lHX0RGTCkKKwkJZiA9IHRyYXBzaWc7CisJZWxzZSBpZiAocC0+ZmxhZ3MgJiBURl9TSEVMTF9VU0VTKSB7CisJCWlmICghKHAtPmZsYWdzICYgVEZfT1JJR19JR04pIHx8IEZsYWcoRlRBTEtJTkcpKSB7CisJCQkvKiBkbyB3aGF0IHVzZXIgd2FudHMgYXQgZXhlYyB0aW1lICovCisJCQlwLT5mbGFncyAmPSB+KFRGX0VYRUNfSUdOfFRGX0VYRUNfREZMKTsKKwkJCWlmIChmID09IFNJR19JR04pCisJCQkJcC0+ZmxhZ3MgfD0gVEZfRVhFQ19JR047CisJCQllbHNlCisJCQkJcC0+ZmxhZ3MgfD0gVEZfRVhFQ19ERkw7CisJCX0KKworCQkvKgorCQkgKiBhc3N1bWVzIGhhbmRsZXIgYWxyZWFkeSBzZXQgdG8gd2hhdCBzaGVsbCB3YW50cyBpdAorCQkgKiAobm9ybWFsbHkgdHJhcHNpZywgYnV0IGNvdWxkIGJlIGpfc2lnY2hsZCgpIG9yIFNJR19JR04pCisJCSAqLworCQlyZXR1cm47CisJfQorCisJLyogdG9kbzogc2hvdWxkIHdlIGxldCB1c2VyIGtub3cgc2lnbmFsIGlzIGlnbm9yZWQ/IGhvdz8gKi8KKwlzZXRzaWcocCwgZiwgU1NfUkVTVE9SRV9DVVJSfFNTX1VTRVIpOworfQorCisvKgorICogQ2FsbGVkIGJ5IGNfcHJpbnQoKSB3aGVuIHdyaXRpbmcgdG8gYSBjby1wcm9jZXNzIHRvIGVuc3VyZSBTSUdQSVBFIHdvbid0CisgKiBraWxsIHNoZWxsICh1bmxlc3MgdXNlciBjYXRjaGVzIGl0IGFuZCBleGl0cykKKyAqLworaW50CitibG9ja19waXBlKHZvaWQpCit7CisJaW50IHJlc3RvcmVfZGZsID0gMDsKKwlUcmFwICpwID0gJnNpZ3RyYXBzW1NJR1BJUEVdOworCisJaWYgKCEocC0+ZmxhZ3MgJiAoVEZfT1JJR19JR058VEZfT1JJR19ERkwpKSkgeworCQlzZXRzaWcocCwgU0lHX0lHTiwgU1NfUkVTVE9SRV9DVVJSKTsKKwkJaWYgKHAtPmZsYWdzICYgVEZfT1JJR19ERkwpCisJCQlyZXN0b3JlX2RmbCA9IDE7CisJfSBlbHNlIGlmIChwLT5jdXJzaWcgPT0gU0lHX0RGTCkgeworCQlzZXRzaWcocCwgU0lHX0lHTiwgU1NfUkVTVE9SRV9DVVJSKTsKKwkJcmVzdG9yZV9kZmwgPSAxOyAvKiByZXN0b3JlIHRvIFNJR19ERkwgKi8KKwl9CisJcmV0dXJuIChyZXN0b3JlX2RmbCk7Cit9CisKKy8qIENhbGxlZCBieSBjX3ByaW50KCkgdG8gdW5kbyB3aGF0ZXZlciBibG9ja19waXBlKCkgZGlkICovCit2b2lkCityZXN0b3JlX3BpcGUoaW50IHJlc3RvcmVfZGZsKQoreworCWlmIChyZXN0b3JlX2RmbCkKKwkJc2V0c2lnKCZzaWd0cmFwc1tTSUdQSVBFXSwgU0lHX0RGTCwgU1NfUkVTVE9SRV9DVVJSKTsKK30KKworLyoKKyAqIFNldCBhY3Rpb24gZm9yIGEgc2lnbmFsLiBBY3Rpb24gbWF5IG5vdCBiZSBzZXQgaWYgb3JpZ2luYWwKKyAqIGFjdGlvbiB3YXMgU0lHX0lHTiwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBmbGFncyBhbmQgRlRBTEtJTkcuCisgKi8KK2ludAorc2V0c2lnKFRyYXAgKnAsIHNpZ190IGYsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ2FjdDsKKworCWlmIChwLT5zaWduYWwgPT0gU0lHRVhJVF8gfHwgcC0+c2lnbmFsID09IFNJR0VSUl8pCisJCXJldHVybiAoMSk7CisKKwkvKgorCSAqIEZpcnN0IHRpbWUgc2V0dGluZyB0aGlzIHNpZ25hbD8gSWYgc28sIGdldCBhbmQgbm90ZSB0aGUgY3VycmVudAorCSAqIHNldHRpbmcuCisJICovCisJaWYgKCEocC0+ZmxhZ3MgJiAoVEZfT1JJR19JR058VEZfT1JJR19ERkwpKSkgeworCQlzaWdhY3Rpb24ocC0+c2lnbmFsLCAmU2lnYWN0X2lnbiwgJnNpZ2FjdCk7CisJCXAtPmZsYWdzIHw9IHNpZ2FjdC5zYV9oYW5kbGVyID09IFNJR19JR04gPworCQkgICAgVEZfT1JJR19JR04gOiBURl9PUklHX0RGTDsKKwkJcC0+Y3Vyc2lnID0gU0lHX0lHTjsKKwl9CisKKwkvKi0KKwkgKiBHZW5lcmFsbHksIGFuIGlnbm9yZWQgc2lnbmFsIHN0YXlzIGlnbm9yZWQsIGV4Y2VwdCBpZgorCSAqCS0gdGhlIHVzZXIgb2YgYW4gaW50ZXJhY3RpdmUgc2hlbGwgd2FudHMgdG8gY2hhbmdlIGl0CisJICoJLSB0aGUgc2hlbGwgd2FudHMgZm9yIGZvcmNlIGEgY2hhbmdlCisJICovCisJaWYgKChwLT5mbGFncyAmIFRGX09SSUdfSUdOKSAmJiAhKGZsYWdzICYgU1NfRk9SQ0UpICYmCisJICAgICghKGZsYWdzICYgU1NfVVNFUikgfHwgIUZsYWcoRlRBTEtJTkcpKSkKKwkJcmV0dXJuICgwKTsKKworCXNldGV4ZWNzaWcocCwgZmxhZ3MgJiBTU19SRVNUT1JFX01BU0spOworCisJLyoKKwkgKiBUaGlzIGlzIGhlcmUgJ2NhdXNlIHRoZXJlIHNob3VsZCBiZSBhIHdheSBvZiBjbGVhcmluZworCSAqIHNodHJhcHMsIGJ1dCBkb24ndCBrbm93IGlmIHRoaXMgaXMgYSBzYW5lIHdheSBvZiBkb2luZworCSAqIGl0LiBBdCB0aGUgbW9tZW50LCBhbGwgdXNlcnMgb2Ygc2h0cmFwIGFyZSBsaWZldGltZQorCSAqIHVzZXJzIChTSUdBTFJNLCBTSUdDSExELCBTSUdXSU5DSCkuCisJICovCisJaWYgKCEoZmxhZ3MgJiBTU19VU0VSKSkKKwkJcC0+c2h0cmFwID0gKHNpZ190KU5VTEw7CisJaWYgKGZsYWdzICYgU1NfU0hUUkFQKSB7CisJCXAtPnNodHJhcCA9IGY7CisJCWYgPSB0cmFwc2lnOworCX0KKworCWlmIChwLT5jdXJzaWcgIT0gZikgeworCQlwLT5jdXJzaWcgPSBmOworCQkodm9pZClzaWdlbXB0eXNldCgmc2lnYWN0LnNhX21hc2spOworCQlzaWdhY3Quc2FfZmxhZ3MgPSAwIC8qIGludGVycnVwdGlibGUgKi87CisJCXNpZ2FjdC5zYV9oYW5kbGVyID0gZjsKKwkJc2lnYWN0aW9uKHAtPnNpZ25hbCwgJnNpZ2FjdCwgTlVMTCk7CisJfQorCisJcmV0dXJuICgxKTsKK30KKworLyogY29udHJvbCB3aGF0IHNpZ25hbCBpcyBzZXQgdG8gYmVmb3JlIGFuIGV4ZWMoKSAqLwordm9pZAorc2V0ZXhlY3NpZyhUcmFwICpwLCBpbnQgcmVzdG9yZSkKK3sKKwkvKiBYWFggZGVidWdnaW5nICovCisJaWYgKCEocC0+ZmxhZ3MgJiAoVEZfT1JJR19JR058VEZfT1JJR19ERkwpKSkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzZXRleGVjc2lnOiB1bnNldCBzaWduYWwgJWQoJXMpIiwKKwkJICAgIHAtPnNpZ25hbCwgcC0+bmFtZSk7CisKKwkvKiByZXN0b3JlIG9yaWdpbmFsIHZhbHVlIGZvciBleGVjJ2Qga2lkcyAqLworCXAtPmZsYWdzICY9IH4oVEZfRVhFQ19JR058VEZfRVhFQ19ERkwpOworCXN3aXRjaCAocmVzdG9yZSAmIFNTX1JFU1RPUkVfTUFTSykgeworCWNhc2UgU1NfUkVTVE9SRV9DVVJSOiAvKiBsZWF2ZSB0aGluZ3MgYXMgdGhleSBjdXJyZW50bHkgYXJlICovCisJCWJyZWFrOworCWNhc2UgU1NfUkVTVE9SRV9PUklHOgorCQlwLT5mbGFncyB8PSBwLT5mbGFncyAmIFRGX09SSUdfSUdOID8gVEZfRVhFQ19JR04gOiBURl9FWEVDX0RGTDsKKwkJYnJlYWs7CisJY2FzZSBTU19SRVNUT1JFX0RGTDoKKwkJcC0+ZmxhZ3MgfD0gVEZfRVhFQ19ERkw7CisJCWJyZWFrOworCWNhc2UgU1NfUkVTVE9SRV9JR046CisJCXAtPmZsYWdzIHw9IFRGX0VYRUNfSUdOOworCQlicmVhazsKKwl9Cit9CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9qb2JzLmMgYi9ta3NoL3NyYy9qb2JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczMjZhMQotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL2pvYnMuYwpAQCAtMCwwICsxLDE2NDggQEAKKy8qCSRPcGVuQlNEOiBqb2JzLmMsdiAxLjM4IDIwMDkvMTIvMTIgMDQ6Mjg6NDQgZGVyYWFkdCBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOQorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2luY2x1ZGUgInNoLmgiCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL2pvYnMuYyx2IDEuNjkgMjAxMC8wNy8wNCAxNzozMzo1NCB0ZyBFeHAgJCIpOworCisjaWYgSEFWRV9LSUxMUEcKKyNkZWZpbmUgbWtzaF9raWxscGcJCWtpbGxwZworI2Vsc2UKKy8qIGNyb3NzIGZpbmdlcnMgYW5kIGhvcGUga2lsbCBpcyBraWxscGctZW5kb3dlZCAqLworI2RlZmluZSBta3NoX2tpbGxwZyhwLHMpCWtpbGwoLShwKSwgKHMpKQorI2VuZGlmCisKKy8qIE9yZGVyIGltcG9ydGFudCEgKi8KKyNkZWZpbmUgUFJVTk5JTkcJMAorI2RlZmluZSBQRVhJVEVECQkxCisjZGVmaW5lIFBTSUdOQUxMRUQJMgorI2RlZmluZSBQU1RPUFBFRAkzCisKK3R5cGVkZWYgc3RydWN0IHByb2MJUHJvYzsKK3N0cnVjdCBwcm9jIHsKKwlQcm9jICpuZXh0OwkJLyogbmV4dCBwcm9jZXNzIGluIHBpcGVsaW5lIChpZiBhbnkpICovCisJcGlkX3QgcGlkOwkJLyogcHJvY2VzcyBpZCAqLworCWludCBzdGF0ZTsKKwlpbnQgc3RhdHVzOwkJLyogd2FpdCBzdGF0dXMgKi8KKwljaGFyIGNvbW1hbmRbNDhdOwkvKiBwcm9jZXNzIGNvbW1hbmQgc3RyaW5nICovCit9OworCisvKiBOb3RpZnkvcHJpbnQgZmxhZyAtIGpfcHJpbnQoKSBhcmd1bWVudCAqLworI2RlZmluZSBKUF9OT05FCQkwCS8qIGRvbid0IHByaW50IGFueXRoaW5nICovCisjZGVmaW5lIEpQX1NIT1JUCTEJLyogcHJpbnQgc2lnbmFscyBwcm9jZXNzZXMgd2VyZSBraWxsZWQgYnkgKi8KKyNkZWZpbmUgSlBfTUVESVVNCTIJLyogcHJpbnQgW2pvYi1udW1dIC0vKyBjb21tYW5kICovCisjZGVmaW5lIEpQX0xPTkcJCTMJLyogcHJpbnQgW2pvYi1udW1dIC0vKyBwaWQgY29tbWFuZCAqLworI2RlZmluZSBKUF9QR1JQCQk0CS8qIHByaW50IHBncnAgKi8KKworLyogcHV0X2pvYigpIGZsYWdzICovCisjZGVmaW5lIFBKX09OX0ZST05UCTAJLyogYXQgdmVyeSBmcm9udCAqLworI2RlZmluZSBQSl9QQVNUX1NUT1BQRUQJMQkvKiBqdXN0IHBhc3QgYW55IHN0b3BwZWQgam9icyAqLworCisvKiBKb2IuZmxhZ3MgdmFsdWVzICovCisjZGVmaW5lIEpGX1NUQVJURUQJMHgwMDEJLyogc2V0IHdoZW4gYWxsIHByb2Nlc3NlcyBpbiBqb2IgYXJlIHN0YXJ0ZWQgKi8KKyNkZWZpbmUgSkZfV0FJVElORwkweDAwMgkvKiBzZXQgaWYgal93YWl0aigpIGlzIHdhaXRpbmcgb24gam9iICovCisjZGVmaW5lIEpGX1dfQVNZTkNOT1RJRlkgMHgwMDQJLyogc2V0IGlmIHdhaXRpbmcgYW5kIGFzeW5jIG5vdGlmaWNhdGlvbiBvayAqLworI2RlZmluZSBKRl9YWENPTQkweDAwOAkvKiBzZXQgZm9yICQoY29tbWFuZCkgam9icyAqLworI2RlZmluZSBKRl9GRwkJMHgwMTAJLyogcnVubmluZyBpbiBmb3JlZ3JvdW5kIChhbHNvIGhhcyB0dHkgcGdycCkgKi8KKyNkZWZpbmUgSkZfU0FWRURUVFkJMHgwMjAJLyogai0+dHR5c3RhdGUgaXMgdmFsaWQgKi8KKyNkZWZpbmUgSkZfQ0hBTkdFRAkweDA0MAkvKiBwcm9jZXNzIGhhcyBjaGFuZ2VkIHN0YXRlICovCisjZGVmaW5lIEpGX0tOT1dOCTB4MDgwCS8qICQhIHJlZmVyZW5jZWQgKi8KKyNkZWZpbmUgSkZfWk9NQklFCTB4MTAwCS8qIGtub3duLCB1bndhaXRlZCBwcm9jZXNzICovCisjZGVmaW5lIEpGX1JFTU9WRQkweDIwMAkvKiBmbGFnZ2VkIGZvciByZW1vdmFsIChqX2pvYnMoKS9qX25vaXR5ZigpKSAqLworI2RlZmluZSBKRl9VU0VUVFlNT0RFCTB4NDAwCS8qIHR0eSBtb2RlIHNhdmVkIGlmIHByb2Nlc3MgZXhpdHMgbm9ybWFsbHkgKi8KKyNkZWZpbmUgSkZfU0FWRURUVFlQR1JQCTB4ODAwCS8qIGotPnNhdmVkX3R0eXBncnAgaXMgdmFsaWQgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgam9iIEpvYjsKK3N0cnVjdCBqb2IgeworCUpvYiAqbmV4dDsJCS8qIG5leHQgam9iIGluIGxpc3QgKi8KKwlQcm9jICpwcm9jX2xpc3Q7CS8qIHByb2Nlc3MgbGlzdCAqLworCVByb2MgKmxhc3RfcHJvYzsJLyogbGFzdCBwcm9jZXNzIGluIGxpc3QgKi8KKwlzdHJ1Y3QgdGltZXZhbCBzeXN0aW1lOwkvKiBzeXN0ZW0gdGltZSB1c2VkIGJ5IGpvYiAqLworCXN0cnVjdCB0aW1ldmFsIHVzcnRpbWU7CS8qIHVzZXIgdGltZSB1c2VkIGJ5IGpvYiAqLworCXBpZF90IHBncnA7CQkvKiBwcm9jZXNzIGdyb3VwIG9mIGpvYiAqLworCXBpZF90IHBwaWQ7CQkvKiBwaWQgb2YgcHJvY2VzcyB0aGF0IGZvcmtlZCBqb2IgKi8KKwlpbnQgam9iOwkJLyogam9iIG51bWJlcjogJW4gKi8KKwlpbnQgZmxhZ3M7CQkvKiBzZWUgSkZfKiAqLworCXZvbGF0aWxlIGludCBzdGF0ZTsJLyogam9iIHN0YXRlICovCisJaW50IHN0YXR1czsJCS8qIGV4aXQgc3RhdHVzIG9mIGxhc3QgcHJvY2VzcyAqLworCWludDMyX3QJYWdlOwkJLyogbnVtYmVyIG9mIGpvYnMgc3RhcnRlZCAqLworCUNvcHJvY19pZCBjb3Byb2NfaWQ7CS8qIDAgb3IgaWQgb2YgY29wcm9jZXNzIG91dHB1dCBwaXBlICovCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCXN0cnVjdCB0ZXJtaW9zIHR0eXN0YXRlOy8qIHNhdmVkIHR0eSBzdGF0ZSBmb3Igc3RvcHBlZCBqb2JzICovCisJcGlkX3Qgc2F2ZWRfdHR5cGdycDsJLyogc2F2ZWQgdHR5IHByb2Nlc3MgZ3JvdXAgZm9yIHN0b3BwZWQgam9icyAqLworI2VuZGlmCit9OworCisvKiBGbGFncyBmb3Igal93YWl0aigpICovCisjZGVmaW5lIEpXX05PTkUJCTB4MDAKKyNkZWZpbmUgSldfSU5URVJSVVBUCTB4MDEJLyogXkMgd2lsbCBzdG9wIHRoZSB3YWl0ICovCisjZGVmaW5lIEpXX0FTWU5DTk9USUZZCTB4MDIJLyogYXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbiBkdXJpbmcgd2FpdCBvayAqLworI2RlZmluZSBKV19TVE9QUEVEV0FJVAkweDA0CS8qIHdhaXQgZXZlbiBpZiBqb2Igc3RvcHBlZCAqLworCisvKiBFcnJvciBjb2RlcyBmb3Igal9sb29rdXAoKSAqLworI2RlZmluZSBKTF9PSwkJMAorI2RlZmluZSBKTF9OT1NVQ0gJMQkvKiBubyBzdWNoIGpvYiAqLworI2RlZmluZSBKTF9BTUJJRwkyCS8qICVmb28gb3IgJT9mb28gaXMgYW1iaWd1b3VzICovCisjZGVmaW5lIEpMX0lOVkFMSUQJMwkvKiBub24tcGlkLCBub24tJSBqb2IgaWQgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGxvb2t1cF9tc2dzW10gPSB7CisJbnVsbCwKKwkibm8gc3VjaCBqb2IiLAorCSJhbWJpZ3VvdXMiLAorCSJhcmd1bWVudCBtdXN0IGJlICVqb2Igb3IgcHJvY2VzcyBpZCIsCisJTlVMTAorfTsKKworc3RhdGljIEpvYiAqam9iX2xpc3Q7CQkvKiBqb2IgbGlzdCAqLworc3RhdGljIEpvYiAqbGFzdF9qb2I7CitzdGF0aWMgSm9iICphc3luY19qb2I7CitzdGF0aWMgcGlkX3QgYXN5bmNfcGlkOworCitzdGF0aWMgaW50IG56b21iaWU7CQkvKiAjIG9mIHpvbWJpZXMgb3duZWQgYnkgdGhpcyBwcm9jZXNzICovCitzdGF0aWMgaW50MzJfdCBuam9iczsJCS8qICMgb2Ygam9icyBzdGFydGVkICovCisKKyNpZm5kZWYgQ0hJTERfTUFYCisjZGVmaW5lIENISUxEX01BWAkyNQorI2VuZGlmCisKKy8qIGhlbGRfc2lnY2hsZCBpcyBzZXQgaWYgc2lnY2hsZCBvY2N1cnMgYmVmb3JlIGEgam9iIGlzIGNvbXBsZXRlbHkgc3RhcnRlZCAqLworc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBoZWxkX3NpZ2NobGQ7CisKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECitzdGF0aWMgc3RydWN0IHNoZgkqc2hsX2o7CitzdGF0aWMgYm9vbAkJdHR5cGdycF9vazsJLyogc2V0IGlmIGNhbiB1c2UgdHR5IHBncnBzICovCitzdGF0aWMgcGlkX3QJCXJlc3RvcmVfdHR5cGdycCA9IC0xOworc3RhdGljIGludCBjb25zdAl0dF9zaWdzW10gPSB7IFNJR1RTVFAsIFNJR1RUSU4sIFNJR1RUT1UgfTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZAkJal9zZXRfYXN5bmMoSm9iICopOworc3RhdGljIHZvaWQJCWpfc3RhcnRqb2IoSm9iICopOworc3RhdGljIGludAkJal93YWl0aihKb2IgKiwgaW50LCBjb25zdCBjaGFyICopOworc3RhdGljIHZvaWQJCWpfc2lnY2hsZChpbnQpOworc3RhdGljIHZvaWQJCWpfcHJpbnQoSm9iICosIGludCwgc3RydWN0IHNoZiAqKTsKK3N0YXRpYyBKb2IJCSpqX2xvb2t1cChjb25zdCBjaGFyICosIGludCAqKTsKK3N0YXRpYyBKb2IJCSpuZXdfam9iKHZvaWQpOworc3RhdGljIFByb2MJCSpuZXdfcHJvYyh2b2lkKTsKK3N0YXRpYyB2b2lkCQljaGVja19qb2IoSm9iICopOworc3RhdGljIHZvaWQJCXB1dF9qb2IoSm9iICosIGludCk7CitzdGF0aWMgdm9pZAkJcmVtb3ZlX2pvYihKb2IgKiwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyBpbnQJCWtpbGxfam9iKEpvYiAqLCBpbnQpOworCisvKiBpbml0aWFsaXNlIGpvYiBjb250cm9sICovCit2b2lkCitqX2luaXQodm9pZCkKK3sKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJYm9vbCBtZmxhZ3NldCA9IEZsYWcoRk1PTklUT1IpICE9IDEyNzsKKworCUZsYWcoRk1PTklUT1IpID0gMDsKKyNlbmRpZgorCisJKHZvaWQpc2lnZW1wdHlzZXQoJnNtX2RlZmF1bHQpOworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmc21fZGVmYXVsdCwgTlVMTCk7CisKKwkodm9pZClzaWdlbXB0eXNldCgmc21fc2lnY2hsZCk7CisJKHZvaWQpc2lnYWRkc2V0KCZzbV9zaWdjaGxkLCBTSUdDSExEKTsKKworCXNldHNpZygmc2lndHJhcHNbU0lHQ0hMRF0sIGpfc2lnY2hsZCwKKwkgICAgU1NfUkVTVE9SRV9PUklHfFNTX0ZPUkNFfFNTX1NIVFJBUCk7CisKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJaWYgKCFtZmxhZ3NldCAmJiBGbGFnKEZUQUxLSU5HKSkKKwkJRmxhZyhGTU9OSVRPUikgPSAxOworCisJLyoKKwkgKiBzaGxfaiBpcyB1c2VkIHRvIGRvIGFzeW5jaHJvbm91cyBub3RpZmljYXRpb24gKHVzZWQgaW4KKwkgKiBhbiBpbnRlcnJ1cHQgaGFuZGxlciwgc28gbmVlZCBhIGRpc3RpbmN0IHNoZikKKwkgKi8KKwlzaGxfaiA9IHNoZl9mZG9wZW4oMiwgU0hGX1dSLCBOVUxMKTsKKworCWlmIChGbGFnKEZNT05JVE9SKSB8fCBGbGFnKEZUQUxLSU5HKSkgeworCQlpbnQgaTsKKworCQkvKgorCQkgKiB0aGUgVEZfU0hFTExfVVNFUyB0ZXN0IGlzIGEga2x1ZGdlIHRoYXQgbGV0cyB1cyBrbm93IGlmCisJCSAqIGlmIHRoZSBzaWduYWxzIGhhdmUgYmVlbiBjaGFuZ2VkIGJ5IHRoZSBzaGVsbC4KKwkJICovCisJCWZvciAoaSA9IE5FTEVNKHR0X3NpZ3MpOyAtLWkgPj0gMDsgKSB7CisJCQlzaWd0cmFwc1t0dF9zaWdzW2ldXS5mbGFncyB8PSBURl9TSEVMTF9VU0VTOworCQkJLyogal9jaGFuZ2UoKSBzZXRzIHRoaXMgdG8gU1NfUkVTVE9SRV9ERkwgaWYgRk1PTklUT1IgKi8KKwkJCXNldHNpZygmc2lndHJhcHNbdHRfc2lnc1tpXV0sIFNJR19JR04sCisJCQkgICAgU1NfUkVTVE9SRV9JR058U1NfRk9SQ0UpOworCQl9CisJfQorCisJLyogal9jaGFuZ2UoKSBjYWxscyB0dHlfaW5pdCgpICovCisJaWYgKEZsYWcoRk1PTklUT1IpKQorCQlqX2NoYW5nZSgpOworCWVsc2UKKyNlbmRpZgorCSAgaWYgKEZsYWcoRlRBTEtJTkcpKQorCQl0dHlfaW5pdCh0cnVlLCB0cnVlKTsKK30KKworLyogam9iIGNsZWFudXAgYmVmb3JlIHNoZWxsIGV4aXQgKi8KK3ZvaWQKK2pfZXhpdCh2b2lkKQoreworCS8qIGtpbGwgc3RvcHBlZCwgYW5kIHBvc3NpYmx5IHJ1bm5pbmcsIGpvYnMgKi8KKwlKb2IJKmo7CisJaW50CWtpbGxlZCA9IDA7CisKKwlmb3IgKGogPSBqb2JfbGlzdDsgaiAhPSBOVUxMOyBqID0gai0+bmV4dCkgeworCQlpZiAoai0+cHBpZCA9PSBwcm9jcGlkICYmCisJCSAgICAoai0+c3RhdGUgPT0gUFNUT1BQRUQgfHwKKwkJICAgIChqLT5zdGF0ZSA9PSBQUlVOTklORyAmJgorCQkgICAgKChqLT5mbGFncyAmIEpGX0ZHKSB8fAorCQkgICAgKEZsYWcoRkxPR0lOKSAmJiAhRmxhZyhGTk9IVVApICYmIHByb2NwaWQgPT0ga3NocGlkKSkpKSkgeworCQkJa2lsbGVkID0gMTsKKwkJCWlmIChqLT5wZ3JwID09IDApCisJCQkJa2lsbF9qb2IoaiwgU0lHSFVQKTsKKwkJCWVsc2UKKwkJCQlta3NoX2tpbGxwZyhqLT5wZ3JwLCBTSUdIVVApOworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkJCWlmIChqLT5zdGF0ZSA9PSBQU1RPUFBFRCkgeworCQkJCWlmIChqLT5wZ3JwID09IDApCisJCQkJCWtpbGxfam9iKGosIFNJR0NPTlQpOworCQkJCWVsc2UKKwkJCQkJbWtzaF9raWxscGcoai0+cGdycCwgU0lHQ09OVCk7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKwlpZiAoa2lsbGVkKQorCQlzbGVlcCgxKTsKKwlqX25vdGlmeSgpOworCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCWlmIChrc2hwaWQgPT0gcHJvY3BpZCAmJiByZXN0b3JlX3R0eXBncnAgPj0gMCkgeworCQkvKgorCQkgKiBOZWVkIHRvIHJlc3RvcmUgdGhlIHR0eSBwZ3JwIHRvIHdoYXQgaXQgd2FzIHdoZW4gdGhlCisJCSAqIHNoZWxsIHN0YXJ0ZWQgdXAsIHNvIHRoYXQgdGhlIHByb2Nlc3MgdGhhdCBzdGFydGVkIHVzCisJCSAqIHdpbGwgYmUgYWJsZSB0byBhY2Nlc3MgdGhlIHR0eSB3aGVuIHdlIGFyZSBkb25lLgorCQkgKiBBbHNvIG5lZWQgdG8gcmVzdG9yZSBvdXIgcHJvY2VzcyBncm91cCBpbiBjYXNlIHdlIGFyZQorCQkgKiBhYm91dCB0byBkbyBhbiBleGVjIHNvIHRoYXQgYm90aCBvdXIgcGFyZW50IGFuZCB0aGUKKwkJICogcHJvY2VzcyB3ZSBhcmUgdG8gYmVjb21lIHdpbGwgYmUgYWJsZSB0byBhY2Nlc3MgdGhlIHR0eS4KKwkJICovCisJCXRjc2V0cGdycCh0dHlfZmQsIHJlc3RvcmVfdHR5cGdycCk7CisJCXNldHBnaWQoMCwgcmVzdG9yZV90dHlwZ3JwKTsKKwl9CisJaWYgKEZsYWcoRk1PTklUT1IpKSB7CisJCUZsYWcoRk1PTklUT1IpID0gMDsKKwkJal9jaGFuZ2UoKTsKKwl9CisjZW5kaWYKK30KKworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKy8qIHR1cm4gam9iIGNvbnRyb2wgb24gb3Igb2ZmIGFjY29yZGluZyB0byBGbGFnKEZNT05JVE9SKSAqLwordm9pZAoral9jaGFuZ2Uodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmIChGbGFnKEZNT05JVE9SKSkgeworCQlib29sIHVzZV90dHkgPSBGbGFnKEZUQUxLSU5HKTsKKworCQkvKiBEb24ndCBjYWxsIHRjZ2V0YXR0cigpICd0aWwgd2Ugb3duIHRoZSB0dHkgcHJvY2VzcyBncm91cCAqLworCQlpZiAodXNlX3R0eSkKKwkJCXR0eV9pbml0KGZhbHNlLCB0cnVlKTsKKworCQkvKiBubyBjb250cm9sbGluZyB0dHksIG5vIFNJR1QqICovCisJCWlmICgodHR5cGdycF9vayA9IHVzZV90dHkgJiYgdHR5X2ZkID49IDAgJiYgdHR5X2RldnR0eSkpIHsKKwkJCXNldHNpZygmc2lndHJhcHNbU0lHVFRJTl0sIFNJR19ERkwsCisJCQkgICAgU1NfUkVTVE9SRV9PUklHfFNTX0ZPUkNFKTsKKwkJCS8qIHdhaXQgdG8gYmUgZ2l2ZW4gdHR5IChQT1NJWC4xLCBCLjIsIGpvYiBjb250cm9sKSAqLworCQkJd2hpbGUgKDEpIHsKKwkJCQlwaWRfdCB0dHlwZ3JwOworCisJCQkJaWYgKCh0dHlwZ3JwID0gdGNnZXRwZ3JwKHR0eV9mZCkpIDwgMCkgeworCQkJCQl3YXJuaW5nZihmYWxzZSwKKwkJCQkJICAgICJqX2luaXQ6IHRjZ2V0cGdycCgpIGZhaWxlZDogJXMiLAorCQkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJdHR5cGdycF9vayA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKHR0eXBncnAgPT0ga3NocGdycCkKKwkJCQkJYnJlYWs7CisJCQkJa2lsbCgwLCBTSUdUVElOKTsKKwkJCX0KKwkJfQorCQlmb3IgKGkgPSBORUxFTSh0dF9zaWdzKTsgLS1pID49IDA7ICkKKwkJCXNldHNpZygmc2lndHJhcHNbdHRfc2lnc1tpXV0sIFNJR19JR04sCisJCQkgICAgU1NfUkVTVE9SRV9ERkx8U1NfRk9SQ0UpOworCQlpZiAodHR5cGdycF9vayAmJiBrc2hwZ3JwICE9IGtzaHBpZCkgeworCQkJaWYgKHNldHBnaWQoMCwga3NocGlkKSA8IDApIHsKKwkJCQl3YXJuaW5nZihmYWxzZSwKKwkJCQkgICAgImpfaW5pdDogc2V0cGdpZCgpIGZhaWxlZDogJXMiLAorCQkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJCXR0eXBncnBfb2sgPSBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRjc2V0cGdycCh0dHlfZmQsIGtzaHBpZCkgPCAwKSB7CisJCQkJCXdhcm5pbmdmKGZhbHNlLAorCQkJCQkgICAgImpfaW5pdDogdGNzZXRwZ3JwKCkgZmFpbGVkOiAlcyIsCisJCQkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJCQl0dHlwZ3JwX29rID0gZmFsc2U7CisJCQkJfSBlbHNlCisJCQkJCXJlc3RvcmVfdHR5cGdycCA9IGtzaHBncnA7CisJCQkJa3NocGdycCA9IGtzaHBpZDsKKwkJCX0KKwkJfQorCQlpZiAodXNlX3R0eSAmJiAhdHR5cGdycF9vaykKKwkJCXdhcm5pbmdmKGZhbHNlLCAid2FybmluZzogd29uJ3QgaGF2ZSBmdWxsIGpvYiBjb250cm9sIik7CisJCWlmICh0dHlfZmQgPj0gMCkKKwkJCXRjZ2V0YXR0cih0dHlfZmQsICZ0dHlfc3RhdGUpOworCX0gZWxzZSB7CisJCXR0eXBncnBfb2sgPSBmYWxzZTsKKwkJaWYgKEZsYWcoRlRBTEtJTkcpKQorCQkJZm9yIChpID0gTkVMRU0odHRfc2lncyk7IC0taSA+PSAwOyApCisJCQkJc2V0c2lnKCZzaWd0cmFwc1t0dF9zaWdzW2ldXSwgU0lHX0lHTiwKKwkJCQkgICAgU1NfUkVTVE9SRV9JR058U1NfRk9SQ0UpOworCQllbHNlCisJCQlmb3IgKGkgPSBORUxFTSh0dF9zaWdzKTsgLS1pID49IDA7ICkgeworCQkJCWlmIChzaWd0cmFwc1t0dF9zaWdzW2ldXS5mbGFncyAmCisJCQkJICAgIChURl9PUklHX0lHTiB8IFRGX09SSUdfREZMKSkKKwkJCQkJc2V0c2lnKCZzaWd0cmFwc1t0dF9zaWdzW2ldXSwKKwkJCQkJICAgIChzaWd0cmFwc1t0dF9zaWdzW2ldXS5mbGFncyAmIFRGX09SSUdfSUdOKSA/CisJCQkJCSAgICBTSUdfSUdOIDogU0lHX0RGTCwKKwkJCQkJICAgIFNTX1JFU1RPUkVfT1JJR3xTU19GT1JDRSk7CisJCQl9CisJCWlmICghRmxhZyhGVEFMS0lORykpCisJCQl0dHlfY2xvc2UoKTsKKwl9Cit9CisjZW5kaWYKKworLyogZXhlY3V0ZSB0cmVlIGluIGNoaWxkIHN1YnByb2Nlc3MgKi8KK2ludAorZXhjaGlsZChzdHJ1Y3Qgb3AgKnQsIGludCBmbGFncywKKyAgICB2b2xhdGlsZSBpbnQgKnhlcnJvaywKKyAgICAvKiB1c2VkIGlmIFhQQ0xPU0Ugb3IgWENDTE9TRSAqLyBpbnQgY2xvc2VfZmQpCit7CisJc3RhdGljIFByb2MgKmxhc3RfcHJvYzsJCS8qIGZvciBwaXBlbGluZXMgKi8KKworCWludCBydiA9IDAsIGZvcmtzbGVlcDsKKwlzaWdzZXRfdCBvbWFzazsKKwlzdHJ1Y3QgeworCQlQcm9jICpwOworCQlKb2IgKmo7CisJCXBpZF90IGNsZHBpZDsKKwl9IHBpOworCisJaWYgKGZsYWdzICYgWEVYRUMpCisJCS8qCisJCSAqIENsZWFyIFhGT1JLfFhQQ0xPU0V8WENDTE9TRXxYQ09QUk9DfFhQSVBFT3xYUElQRUl8WFhDT018WEJHTkQKKwkJICogKGFsc28gZG9uZSBpbiBhbm90aGVyIGV4ZWN1dGUoKSBiZWxvdykKKwkJICovCisJCXJldHVybiAoZXhlY3V0ZSh0LCBmbGFncyAmIChYRVhFQyB8IFhFUlJPSyksIHhlcnJvaykpOworCisJLyogbm8gU0lHQ0hMRHMgd2hpbGUgbWVzc2luZyB3aXRoIGpvYiBhbmQgcHJvY2VzcyBsaXN0cyAqLworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNtX3NpZ2NobGQsICZvbWFzayk7CisKKwlwaS5wID0gbmV3X3Byb2MoKTsKKwlwaS5wLT5uZXh0ID0gTlVMTDsKKwlwaS5wLT5zdGF0ZSA9IFBSVU5OSU5HOworCXBpLnAtPnN0YXR1cyA9IDA7CisJcGkucC0+cGlkID0gMDsKKworCS8qIGxpbmsgcHJvY2VzcyBpbnRvIGpvYnMgbGlzdCAqLworCWlmIChmbGFncyAmIFhQSVBFSSkgeworCQkvKiBjb250aW51aW5nIHdpdGggYSBwaXBlICovCisJCWlmICghbGFzdF9qb2IpCisJCQlpbnRlcm5hbF9lcnJvcmYoCisJCQkgICAgImV4Y2hpbGQ6IFhQSVBFSSBhbmQgbm8gbGFzdF9qb2IgLSBwaWQgJWQiLAorCQkJICAgIChpbnQpcHJvY3BpZCk7CisJCXBpLmogPSBsYXN0X2pvYjsKKwkJaWYgKGxhc3RfcHJvYykKKwkJCWxhc3RfcHJvYy0+bmV4dCA9IHBpLnA7CisJCWxhc3RfcHJvYyA9IHBpLnA7CisJfSBlbHNlIHsKKwkJcGkuaiA9IG5ld19qb2IoKTsgLyogZmlsbHMgaW4gcGkuai0+am9iICovCisJCS8qCisJCSAqIHdlIGRvbid0IGNvbnNpZGVyIFhYQ09NcyBmb3JlZ3JvdW5kIHNpbmNlIHRoZXkgZG9uJ3QgZ2V0CisJCSAqIHR0eSBwcm9jZXNzIGdyb3VwIGFuZCB3ZSBkb24ndCBzYXZlIG9yIHJlc3RvcmUgdHR5IG1vZGVzLgorCQkgKi8KKwkJcGkuai0+ZmxhZ3MgPSAoZmxhZ3MgJiBYWENPTSkgPyBKRl9YWENPTSA6CisJCSAgICAoKGZsYWdzICYgWEJHTkQpID8gMCA6IChKRl9GR3xKRl9VU0VUVFlNT0RFKSk7CisJCXRpbWVyY2xlYXIoJnBpLmotPnVzcnRpbWUpOworCQl0aW1lcmNsZWFyKCZwaS5qLT5zeXN0aW1lKTsKKwkJcGkuai0+c3RhdGUgPSBQUlVOTklORzsKKwkJcGkuai0+cGdycCA9IDA7CisJCXBpLmotPnBwaWQgPSBwcm9jcGlkOworCQlwaS5qLT5hZ2UgPSArK25qb2JzOworCQlwaS5qLT5wcm9jX2xpc3QgPSBwaS5wOworCQlwaS5qLT5jb3Byb2NfaWQgPSAwOworCQlsYXN0X2pvYiA9IHBpLmo7CisJCWxhc3RfcHJvYyA9IHBpLnA7CisJCXB1dF9qb2IocGkuaiwgUEpfUEFTVF9TVE9QUEVEKTsKKwl9CisKKwlzbnB0cmVlZihwaS5wLT5jb21tYW5kLCBzaXplb2YocGkucC0+Y29tbWFuZCksICIlVCIsIHQpOworCisJLyogY3JlYXRlIGNoaWxkIHByb2Nlc3MgKi8KKwlmb3Jrc2xlZXAgPSAxOworCXdoaWxlICgocGkuY2xkcGlkID0gZm9yaygpKSA8IDAgJiYgZXJybm8gPT0gRUFHQUlOICYmIGZvcmtzbGVlcCA8IDMyKSB7CisJCWlmIChpbnRyc2lnKQkgLyogYWxsb3cgdXNlciB0byBeQyBvdXQuLi4gKi8KKwkJCWJyZWFrOworCQlzbGVlcChmb3Jrc2xlZXApOworCQlmb3Jrc2xlZXAgPDw9IDE7CisJfQorCWlmIChwaS5jbGRwaWQgPCAwKSB7CisJCWtpbGxfam9iKHBpLmosIFNJR0tJTEwpOworCQlyZW1vdmVfam9iKHBpLmosICJmb3JrIGZhaWxlZCIpOworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwkJZXJyb3JmKCJjYW5ub3QgZm9yayAtIHRyeSBhZ2FpbiIpOworCX0KKwlwaS5wLT5waWQgPSBwaS5jbGRwaWQgPyBwaS5jbGRwaWQgOiAocHJvY3BpZCA9IGdldHBpZCgpKTsKKworCS8qCisJICogZW5zdXJlIG5leHQgY2hpbGQgZ2V0cyBhIChzbGlnaHRseSkgZGlmZmVyZW50ICRSQU5ET00gc2VxdWVuY2UKKwkgKiBmcm9tIGl0cyBwYXJlbnQgcHJvY2VzcyBhbmQgb3RoZXIgY2hpbGQgcHJvY2Vzc2VzCisJICovCisJY2hhbmdlX3JhbmRvbSgmcGksIHNpemVvZihwaSkpOworCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCS8qIGpvYiBjb250cm9sIHNldCB1cCAqLworCWlmIChGbGFnKEZNT05JVE9SKSAmJiAhKGZsYWdzJlhYQ09NKSkgeworCQlpbnQJZG90dHkgPSAwOworCQlpZiAocGkuai0+cGdycCA9PSAwKSB7CS8qIEZpcnN0IHByb2Nlc3MgKi8KKwkJCXBpLmotPnBncnAgPSBwaS5wLT5waWQ7CisJCQlkb3R0eSA9IDE7CisJCX0KKworCQkvKiBzZXQgcGdycCBpbiBib3RoIHBhcmVudCBhbmQgY2hpbGQgdG8gZGVhbCB3aXRoIHJhY2UKKwkJICogY29uZGl0aW9uCisJCSAqLworCQlzZXRwZ2lkKHBpLnAtPnBpZCwgcGkuai0+cGdycCk7CisJCWlmICh0dHlwZ3JwX29rICYmIGRvdHR5ICYmICEoZmxhZ3MgJiBYQkdORCkpCisJCQl0Y3NldHBncnAodHR5X2ZkLCBwaS5qLT5wZ3JwKTsKKwl9CisjZW5kaWYKKworCS8qIHVzZWQgdG8gY2xvc2UgcGlwZSBpbnB1dCBmZCAqLworCWlmIChjbG9zZV9mZCA+PSAwICYmICgoKGZsYWdzICYgWFBDTE9TRSkgJiYgcGkuY2xkcGlkKSB8fAorCSAgICAoKGZsYWdzICYgWENDTE9TRSkgJiYgIXBpLmNsZHBpZCkpKQorCQljbG9zZShjbG9zZV9mZCk7CisJaWYgKCFwaS5jbGRwaWQpIHsKKwkJLyogY2hpbGQgKi8KKworCQkvKiBEbyB0aGlzIGJlZm9yZSByZXN0b3Jpbmcgc2lnbmFsICovCisJCWlmIChmbGFncyAmIFhDT1BST0MpCisJCQljb3Byb2NfY2xlYW51cChmYWxzZSk7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCQljbGVhbnVwX3BhcmVudHNfZW52KCk7CisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCQkvKiBJZiBGTU9OSVRPUiBvciBGVEFMS0lORyBpcyBzZXQsIHRoZXNlIHNpZ25hbHMgYXJlIGlnbm9yZWQsCisJCSAqIGlmIG5laXRoZXIgRk1PTklUT1Igbm9yIEZUQUxLSU5HIGFyZSBzZXQsIHRoZSBzaWduYWxzIGhhdmUKKwkJICogdGhlaXIgaW5oZXJpdGVkIHZhbHVlcy4KKwkJICovCisJCWlmIChGbGFnKEZNT05JVE9SKSAmJiAhKGZsYWdzICYgWFhDT00pKSB7CisJCQlmb3IgKGZvcmtzbGVlcCA9IE5FTEVNKHR0X3NpZ3MpOyAtLWZvcmtzbGVlcCA+PSAwOyApCisJCQkJc2V0c2lnKCZzaWd0cmFwc1t0dF9zaWdzW2ZvcmtzbGVlcF1dLCBTSUdfREZMLAorCQkJCSAgICBTU19SRVNUT1JFX0RGTHxTU19GT1JDRSk7CisJCX0KKyNlbmRpZgorI2lmIEhBVkVfTklDRQorCQlpZiAoRmxhZyhGQkdOSUNFKSAmJiAoZmxhZ3MgJiBYQkdORCkpCisJCQkodm9pZCluaWNlKDQpOworI2VuZGlmCisJCWlmICgoZmxhZ3MgJiBYQkdORCkKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJCSAgICAmJiAhRmxhZyhGTU9OSVRPUikKKyNlbmRpZgorCQkgICAgKSB7CisJCQlzZXRzaWcoJnNpZ3RyYXBzW1NJR0lOVF0sIFNJR19JR04sCisJCQkgICAgU1NfUkVTVE9SRV9JR058U1NfRk9SQ0UpOworCQkJc2V0c2lnKCZzaWd0cmFwc1tTSUdRVUlUXSwgU0lHX0lHTiwKKwkJCSAgICBTU19SRVNUT1JFX0lHTnxTU19GT1JDRSk7CisJCQlpZiAoKCEoZmxhZ3MgJiAoWFBJUEVJIHwgWENPUFJPQykpKSAmJgorCQkJICAgICgoZm9ya3NsZWVwID0gb3BlbigiL2Rldi9udWxsIiwgMCkpID4gMCkpIHsKKwkJCQkodm9pZClrc2hfZHVwMihmb3Jrc2xlZXAsIDAsIHRydWUpOworCQkJCWNsb3NlKGZvcmtzbGVlcCk7CisJCQl9CisJCX0KKwkJcmVtb3ZlX2pvYihwaS5qLCAiY2hpbGQiKTsJLyogaW4gY2FzZSBvZiAkKGpvYnMpIGNvbW1hbmQgKi8KKwkJbnpvbWJpZSA9IDA7CisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCQl0dHlwZ3JwX29rID0gZmFsc2U7CisJCUZsYWcoRk1PTklUT1IpID0gMDsKKyNlbmRpZgorCQlGbGFnKEZUQUxLSU5HKSA9IDA7CisJCXR0eV9jbG9zZSgpOworCQljbGVhcnRyYXBzKCk7CisJCS8qIG5vIHJldHVybiAqLworCQlleGVjdXRlKHQsIChmbGFncyAmIFhFUlJPSykgfCBYRVhFQywgTlVMTCk7CisjaWZuZGVmIE1LU0hfU01BTEwKKwkJaWYgKHQtPnR5cGUgPT0gVFBJUEUpCisJCQl1bndpbmQoTExFQVZFKTsKKwkJaW50ZXJuYWxfd2FybmluZ2YoImV4Y2hpbGQ6IGV4ZWN1dGUoKSByZXR1cm5lZCIpOworCQlmcHRyZWVmKHNobF9vdXQsIDIsICJleGNoaWxkOiB0cmllZCB0byBleGVjdXRlIHtcbiVUXG59XG4iLCB0KTsKKwkJc2hmX2ZsdXNoKHNobF9vdXQpOworI2VuZGlmCisJCXVud2luZChMTEVBVkUpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCisJLyogc2hlbGwgKHBhcmVudCkgc3R1ZmYgKi8KKwlpZiAoIShmbGFncyAmIFhQSVBFTykpIHsJLyogbGFzdCBwcm9jZXNzIGluIGEgam9iICovCisJCWpfc3RhcnRqb2IocGkuaik7CisJCWlmIChmbGFncyAmIFhDT1BST0MpIHsKKwkJCXBpLmotPmNvcHJvY19pZCA9IGNvcHJvYy5pZDsKKwkJCS8qIG4gam9icyB1c2luZyBjby1wcm9jZXNzIG91dHB1dCAqLworCQkJY29wcm9jLm5qb2JzKys7CisJCQkvKiBqIHVzaW5nIGNvLXByb2Nlc3MgaW5wdXQgKi8KKwkJCWNvcHJvYy5qb2IgPSAodm9pZCAqKXBpLmo7CisJCX0KKwkJaWYgKGZsYWdzICYgWEJHTkQpIHsKKwkJCWpfc2V0X2FzeW5jKHBpLmopOworCQkJaWYgKEZsYWcoRlRBTEtJTkcpKSB7CisJCQkJc2hmX2ZwcmludGYoc2hsX291dCwgIlslZF0iLCBwaS5qLT5qb2IpOworCQkJCWZvciAocGkucCA9IHBpLmotPnByb2NfbGlzdDsgcGkucDsKKwkJCQkgICAgcGkucCA9IHBpLnAtPm5leHQpCisJCQkJCXNoZl9mcHJpbnRmKHNobF9vdXQsICIgJWQiLAorCQkJCQkgICAgKGludClwaS5wLT5waWQpOworCQkJCXNoZl9wdXRjaGFyKCdcbicsIHNobF9vdXQpOworCQkJCXNoZl9mbHVzaChzaGxfb3V0KTsKKwkJCX0KKwkJfSBlbHNlCisJCQlydiA9IGpfd2FpdGoocGkuaiwgSldfTk9ORSwgImp3Omxhc3QgcHJvYyIpOworCX0KKworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCisJcmV0dXJuIChydik7Cit9CisKKy8qIHN0YXJ0IHRoZSBsYXN0IGpvYjogb25seSB1c2VkIGZvciAkKGNvbW1hbmQpIGpvYnMgKi8KK3ZvaWQKK3N0YXJ0bGFzdCh2b2lkKQoreworCXNpZ3NldF90IG9tYXNrOworCisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKKworCWlmIChsYXN0X2pvYikgeyAvKiBubyBuZWVkIHRvIHJlcG9ydCBlcnJvciAtIHdhaXRsYXN0KCkgd2lsbCBkbyBpdCAqLworCQkvKiBlbnN1cmUgaXQgaXNuJ3QgcmVtb3ZlZCBieSBjaGVja19qb2IoKSAqLworCQlsYXN0X2pvYi0+ZmxhZ3MgfD0gSkZfV0FJVElORzsKKwkJal9zdGFydGpvYihsYXN0X2pvYik7CisJfQorCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworfQorCisvKiB3YWl0IGZvciBsYXN0IGpvYjogb25seSB1c2VkIGZvciAkKGNvbW1hbmQpIGpvYnMgKi8KK2ludAord2FpdGxhc3Qodm9pZCkKK3sKKwlpbnQJcnY7CisJSm9iCSpqOworCXNpZ3NldF90IG9tYXNrOworCisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKKworCWogPSBsYXN0X2pvYjsKKwlpZiAoIWogfHwgIShqLT5mbGFncyAmIEpGX1NUQVJURUQpKSB7CisJCWlmICghaikKKwkJCXdhcm5pbmdmKHRydWUsICJ3YWl0bGFzdDogbm8gbGFzdCBqb2IiKTsKKwkJZWxzZQorCQkJaW50ZXJuYWxfd2FybmluZ2YoIndhaXRsYXN0OiBub3Qgc3RhcnRlZCIpOworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwkJcmV0dXJuICgxMjUpOyAvKiBub3Qgc28gYXJiaXRyYXJ5LCBub24temVybyB2YWx1ZSAqLworCX0KKworCXJ2ID0gal93YWl0aihqLCBKV19OT05FLCAianc6d2FpdGxhc3QiKTsKKworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCisJcmV0dXJuIChydik7Cit9CisKKy8qIHdhaXQgZm9yIGNoaWxkLCBpbnRlcnJ1cHRhYmxlLiAqLworaW50Cit3YWl0Zm9yKGNvbnN0IGNoYXIgKmNwLCBpbnQgKnNpZ3ApCit7CisJaW50CXJ2OworCUpvYgkqajsKKwlpbnQJZWNvZGU7CisJaW50CWZsYWdzID0gSldfSU5URVJSVVBUfEpXX0FTWU5DTk9USUZZOworCXNpZ3NldF90IG9tYXNrOworCisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKKworCSpzaWdwID0gMDsKKworCWlmIChjcCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIHdhaXQgZm9yIGFuIHVuc3BlY2lmaWVkIGpvYiAtIGFsd2F5cyByZXR1cm5zIDAsIHNvCisJCSAqIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgZXhpdGVkL3NpZ25hbGVkIGpvYnMKKwkJICovCisJCWZvciAoaiA9IGpvYl9saXN0OyBqOyBqID0gai0+bmV4dCkKKwkJCS8qIEFUJlQga3NoIHdpbGwgd2FpdCBmb3Igc3RvcHBlZCBqb2JzIC0gd2UgZG9uJ3QgKi8KKwkJCWlmIChqLT5wcGlkID09IHByb2NwaWQgJiYgai0+c3RhdGUgPT0gUFJVTk5JTkcpCisJCQkJYnJlYWs7CisJCWlmICghaikgeworCQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0gZWxzZSBpZiAoKGogPSBqX2xvb2t1cChjcCwgJmVjb2RlKSkpIHsKKwkJLyogZG9uJ3QgcmVwb3J0IG5vcm1hbCBqb2IgY29tcGxldGlvbiAqLworCQlmbGFncyAmPSB+SldfQVNZTkNOT1RJRlk7CisJCWlmIChqLT5wcGlkICE9IHByb2NwaWQpIHsKKwkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwl9IGVsc2UgeworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwkJaWYgKGVjb2RlICE9IEpMX05PU1VDSCkKKwkJCWJpX2Vycm9yZigiJXM6ICVzIiwgY3AsIGxvb2t1cF9tc2dzW2Vjb2RlXSk7CisJCXJldHVybiAoLTEpOworCX0KKworCS8qIEFUJlQga3NoIHdpbGwgd2FpdCBmb3Igc3RvcHBlZCBqb2JzIC0gd2UgZG9uJ3QgKi8KKwlydiA9IGpfd2FpdGooaiwgZmxhZ3MsICJqdzp3YWl0Zm9yIik7CisKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKworCWlmIChydiA8IDApIC8qIHdlIHdlcmUgaW50ZXJydXB0ZWQgKi8KKwkJKnNpZ3AgPSAxMjggKyAtcnY7CisKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoga2lsbCAoYnVpbHQtaW4pIGEgam9iICovCitpbnQKK2pfa2lsbChjb25zdCBjaGFyICpjcCwgaW50IHNpZykKK3sKKwlKb2IJKmo7CisJaW50CXJ2ID0gMDsKKwlpbnQJZWNvZGU7CisJc2lnc2V0X3Qgb21hc2s7CisKKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOworCisJaWYgKChqID0gal9sb29rdXAoY3AsICZlY29kZSkpID09IE5VTEwpIHsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJCWJpX2Vycm9yZigiJXM6ICVzIiwgY3AsIGxvb2t1cF9tc2dzW2Vjb2RlXSk7CisJCXJldHVybiAoMSk7CisJfQorCisJaWYgKGotPnBncnAgPT0gMCkgewkvKiBzdGFydGVkIHdoZW4gIUZsYWcoRk1PTklUT1IpICovCisJCWlmIChraWxsX2pvYihqLCBzaWcpIDwgMCkgeworCQkJYmlfZXJyb3JmKCIlczogJXMiLCBjcCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJ2ID0gMTsKKwkJfQorCX0gZWxzZSB7CisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCQlpZiAoai0+c3RhdGUgPT0gUFNUT1BQRUQgJiYgKHNpZyA9PSBTSUdURVJNIHx8IHNpZyA9PSBTSUdIVVApKQorCQkJbWtzaF9raWxscGcoai0+cGdycCwgU0lHQ09OVCk7CisjZW5kaWYKKwkJaWYgKG1rc2hfa2lsbHBnKGotPnBncnAsIHNpZykgPCAwKSB7CisJCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLCBzdHJlcnJvcihlcnJubykpOworCQkJcnYgPSAxOworCQl9CisJfQorCisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisKKwlyZXR1cm4gKHJ2KTsKK30KKworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKy8qIGZnIGFuZCBiZyBidWlsdC1pbnM6IGNhbGxlZCBvbmx5IGlmIEZsYWcoRk1PTklUT1IpIHNldCAqLworaW50CitqX3Jlc3VtZShjb25zdCBjaGFyICpjcCwgaW50IGJnKQoreworCUpvYgkqajsKKwlQcm9jCSpwOworCWludAllY29kZTsKKwlpbnQJcnVubmluZzsKKwlpbnQJcnYgPSAwOworCXNpZ3NldF90IG9tYXNrOworCisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKKworCWlmICgoaiA9IGpfbG9va3VwKGNwLCAmZWNvZGUpKSA9PSBOVUxMKSB7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCQliaV9lcnJvcmYoIiVzOiAlcyIsIGNwLCBsb29rdXBfbXNnc1tlY29kZV0pOworCQlyZXR1cm4gKDEpOworCX0KKworCWlmIChqLT5wZ3JwID09IDApIHsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbWFzaywgTlVMTCk7CisJCWJpX2Vycm9yZigiam9iIG5vdCBqb2ItY29udHJvbGxlZCIpOworCQlyZXR1cm4gKDEpOworCX0KKworCWlmIChiZykKKwkJc2hwcmludGYoIlslZF0gIiwgai0+am9iKTsKKworCXJ1bm5pbmcgPSAwOworCWZvciAocCA9IGotPnByb2NfbGlzdDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkgeworCQlpZiAocC0+c3RhdGUgPT0gUFNUT1BQRUQpIHsKKwkJCXAtPnN0YXRlID0gUFJVTk5JTkc7CisJCQlwLT5zdGF0dXMgPSAwOworCQkJcnVubmluZyA9IDE7CisJCX0KKwkJc2hmX3B1dHMocC0+Y29tbWFuZCwgc2hsX3N0ZG91dCk7CisJCWlmIChwLT5uZXh0KQorCQkJc2hmX3B1dHMoInwgIiwgc2hsX3N0ZG91dCk7CisJfQorCXNoZl9wdXRjKCdcbicsIHNobF9zdGRvdXQpOworCXNoZl9mbHVzaChzaGxfc3Rkb3V0KTsKKwlpZiAocnVubmluZykKKwkJai0+c3RhdGUgPSBQUlVOTklORzsKKworCXB1dF9qb2IoaiwgUEpfUEFTVF9TVE9QUEVEKTsKKwlpZiAoYmcpCisJCWpfc2V0X2FzeW5jKGopOworCWVsc2UgeworCQkvKiBhdHRhY2ggdHR5IHRvIGpvYiAqLworCQlpZiAoai0+c3RhdGUgPT0gUFJVTk5JTkcpIHsKKwkJCWlmICh0dHlwZ3JwX29rICYmIChqLT5mbGFncyAmIEpGX1NBVkVEVFRZKSkKKwkJCQl0Y3NldGF0dHIodHR5X2ZkLCBUQ1NBRFJBSU4sICZqLT50dHlzdGF0ZSk7CisJCQkvKiBTZWUgY29tbWVudCBpbiBqX3dhaXRqIHJlZ2FyZGluZyBzYXZlZF90dHlwZ3JwLiAqLworCQkJaWYgKHR0eXBncnBfb2sgJiYKKwkJCSAgICB0Y3NldHBncnAodHR5X2ZkLCAoai0+ZmxhZ3MgJiBKRl9TQVZFRFRUWVBHUlApID8KKwkJCSAgICBqLT5zYXZlZF90dHlwZ3JwIDogai0+cGdycCkgPCAwKSB7CisJCQkJcnYgPSBlcnJubzsKKwkJCQlpZiAoai0+ZmxhZ3MgJiBKRl9TQVZFRFRUWSkKKwkJCQkJdGNzZXRhdHRyKHR0eV9mZCwgVENTQURSQUlOLCAmdHR5X3N0YXRlKTsKKwkJCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLAorCQkJCSAgICBOVUxMKTsKKwkJCQliaV9lcnJvcmYoIjFzdCB0Y3NldHBncnAoJWQsICVkKSBmYWlsZWQ6ICVzIiwKKwkJCQkgICAgdHR5X2ZkLAorCQkJCSAgICAoaW50KSgoai0+ZmxhZ3MgJiBKRl9TQVZFRFRUWVBHUlApID8KKwkJCQkgICAgai0+c2F2ZWRfdHR5cGdycCA6IGotPnBncnApLAorCQkJCSAgICBzdHJlcnJvcihydikpOworCQkJCXJldHVybiAoMSk7CisJCQl9CisJCX0KKwkJai0+ZmxhZ3MgfD0gSkZfRkc7CisJCWotPmZsYWdzICY9IH5KRl9LTk9XTjsKKwkJaWYgKGogPT0gYXN5bmNfam9iKQorCQkJYXN5bmNfam9iID0gTlVMTDsKKwl9CisKKwlpZiAoai0+c3RhdGUgPT0gUFJVTk5JTkcgJiYgbWtzaF9raWxscGcoai0+cGdycCwgU0lHQ09OVCkgPCAwKSB7CisJCWludCBlcnIgPSBlcnJubzsKKworCQlpZiAoIWJnKSB7CisJCQlqLT5mbGFncyAmPSB+SkZfRkc7CisJCQlpZiAodHR5cGdycF9vayAmJiAoai0+ZmxhZ3MgJiBKRl9TQVZFRFRUWSkpCisJCQkJdGNzZXRhdHRyKHR0eV9mZCwgVENTQURSQUlOLCAmdHR5X3N0YXRlKTsKKwkJCWlmICh0dHlwZ3JwX29rICYmIHRjc2V0cGdycCh0dHlfZmQsIGtzaHBncnApIDwgMCkKKwkJCQl3YXJuaW5nZih0cnVlLAorCQkJCSAgICAiZmc6IDJuZCB0Y3NldHBncnAoJWQsICVsZCkgZmFpbGVkOiAlcyIsCisJCQkJICAgIHR0eV9mZCwgKGxvbmcpa3NocGdycCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwkJYmlfZXJyb3JmKCJjYW5ub3QgY29udGludWUgam9iICVzOiAlcyIsCisJCSAgICBjcCwgc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiAoMSk7CisJfQorCWlmICghYmcpIHsKKwkJaWYgKHR0eXBncnBfb2spIHsKKwkJCWotPmZsYWdzICY9IH4oSkZfU0FWRURUVFkgfCBKRl9TQVZFRFRUWVBHUlApOworCQl9CisJCXJ2ID0gal93YWl0aihqLCBKV19OT05FLCAianc6cmVzdW1lIik7CisJfQorCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCXJldHVybiAocnYpOworfQorI2VuZGlmCisKKy8qIGFyZSB0aGVyZSBhbnkgcnVubmluZyBvciBzdG9wcGVkIGpvYnMgPyAqLworaW50CitqX3N0b3BwZWRfcnVubmluZyh2b2lkKQoreworCUpvYgkqajsKKwlpbnQJd2hpY2ggPSAwOworCisJZm9yIChqID0gam9iX2xpc3Q7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpIHsKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJCWlmIChqLT5wcGlkID09IHByb2NwaWQgJiYgai0+c3RhdGUgPT0gUFNUT1BQRUQpCisJCQl3aGljaCB8PSAxOworI2VuZGlmCisJCWlmIChGbGFnKEZMT0dJTikgJiYgIUZsYWcoRk5PSFVQKSAmJiBwcm9jcGlkID09IGtzaHBpZCAmJgorCQkgICAgai0+cHBpZCA9PSBwcm9jcGlkICYmIGotPnN0YXRlID09IFBSVU5OSU5HKQorCQkJd2hpY2ggfD0gMjsKKwl9CisJaWYgKHdoaWNoKSB7CisJCXNoZWxsZigiWW91IGhhdmUgJXMlcyVzIGpvYnNcbiIsCisJCSAgICB3aGljaCAmIDEgPyAic3RvcHBlZCIgOiAiIiwKKwkJICAgIHdoaWNoID09IDMgPyAiIGFuZCAiIDogIiIsCisJCSAgICB3aGljaCAmIDIgPyAicnVubmluZyIgOiAiIik7CisJCXJldHVybiAoMSk7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworaW50CitqX25qb2JzKHZvaWQpCit7CisJSm9iICpqOworCWludCBuaiA9IDA7CisJc2lnc2V0X3Qgb21hc2s7CisKKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOworCWZvciAoaiA9IGpvYl9saXN0OyBqOyBqID0gai0+bmV4dCkKKwkJbmorKzsKKworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCXJldHVybiAobmopOworfQorCisKKy8qIGxpc3Qgam9icyBmb3Igam9icyBidWlsdC1pbiAqLworaW50CitqX2pvYnMoY29uc3QgY2hhciAqY3AsIGludCBzbHAsCisgICAgaW50IG5mbGFnKQkJLyogMDogc2hvcnQsIDE6IGxvbmcsIDI6IHBncnAgKi8KK3sKKwlKb2IJKmosICp0bXA7CisJaW50CWhvdzsKKwlpbnQJemZsYWcgPSAwOworCXNpZ3NldF90IG9tYXNrOworCisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc21fc2lnY2hsZCwgJm9tYXNrKTsKKworCWlmIChuZmxhZyA8IDApIHsgLyoga2x1ZGdlOiBwcmludCB6b21iaWVzICovCisJCW5mbGFnID0gMDsKKwkJemZsYWcgPSAxOworCX0KKwlpZiAoY3ApIHsKKwkJaW50CWVjb2RlOworCisJCWlmICgoaiA9IGpfbG9va3VwKGNwLCAmZWNvZGUpKSA9PSBOVUxMKSB7CisJCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9tYXNrLCBOVUxMKTsKKwkJCWJpX2Vycm9yZigiJXM6ICVzIiwgY3AsIGxvb2t1cF9tc2dzW2Vjb2RlXSk7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfSBlbHNlCisJCWogPSBqb2JfbGlzdDsKKwlob3cgPSBzbHAgPT0gMCA/IEpQX01FRElVTSA6IChzbHAgPT0gMSA/IEpQX0xPTkcgOiBKUF9QR1JQKTsKKwlmb3IgKDsgajsgaiA9IGotPm5leHQpIHsKKwkJaWYgKCghKGotPmZsYWdzICYgSkZfWk9NQklFKSB8fCB6ZmxhZykgJiYKKwkJICAgICghbmZsYWcgfHwgKGotPmZsYWdzICYgSkZfQ0hBTkdFRCkpKSB7CisJCQlqX3ByaW50KGosIGhvdywgc2hsX3N0ZG91dCk7CisJCQlpZiAoai0+c3RhdGUgPT0gUEVYSVRFRCB8fCBqLT5zdGF0ZSA9PSBQU0lHTkFMTEVEKQorCQkJCWotPmZsYWdzIHw9IEpGX1JFTU9WRTsKKwkJfQorCQlpZiAoY3ApCisJCQlicmVhazsKKwl9CisJLyogUmVtb3ZlIGpvYnMgYWZ0ZXIgcHJpbnRpbmcgc28gdGhlcmUgd29uJ3QgYmUgbXVsdGlwbGUgKyBvciAtIGpvYnMgKi8KKwlmb3IgKGogPSBqb2JfbGlzdDsgajsgaiA9IHRtcCkgeworCQl0bXAgPSBqLT5uZXh0OworCQlpZiAoai0+ZmxhZ3MgJiBKRl9SRU1PVkUpCisJCQlyZW1vdmVfam9iKGosICJqb2JzIik7CisJfQorCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCXJldHVybiAoMCk7Cit9CisKKy8qIGxpc3Qgam9icyBmb3IgdG9wLWxldmVsIG5vdGlmaWNhdGlvbiAqLwordm9pZAoral9ub3RpZnkodm9pZCkKK3sKKwlKb2IJKmosICp0bXA7CisJc2lnc2V0X3Qgb21hc2s7CisKKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOworCWZvciAoaiA9IGpvYl9saXN0OyBqOyBqID0gai0+bmV4dCkgeworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkJaWYgKEZsYWcoRk1PTklUT1IpICYmIChqLT5mbGFncyAmIEpGX0NIQU5HRUQpKQorCQkJal9wcmludChqLCBKUF9NRURJVU0sIHNobF9vdXQpOworI2VuZGlmCisJCS8qIFJlbW92ZSBqb2IgYWZ0ZXIgZG9pbmcgcmVwb3J0cyBzbyB0aGVyZSBhcmVuJ3QKKwkJICogbXVsdGlwbGUgKy8tIGpvYnMuCisJCSAqLworCQlpZiAoai0+c3RhdGUgPT0gUEVYSVRFRCB8fCBqLT5zdGF0ZSA9PSBQU0lHTkFMTEVEKQorCQkJai0+ZmxhZ3MgfD0gSkZfUkVNT1ZFOworCX0KKwlmb3IgKGogPSBqb2JfbGlzdDsgajsgaiA9IHRtcCkgeworCQl0bXAgPSBqLT5uZXh0OworCQlpZiAoai0+ZmxhZ3MgJiBKRl9SRU1PVkUpCisJCQlyZW1vdmVfam9iKGosICJub3RpZnkiKTsKKwl9CisJc2hmX2ZsdXNoKHNobF9vdXQpOworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworfQorCisvKiBSZXR1cm4gcGlkIG9mIGxhc3QgcHJvY2VzcyBpbiBsYXN0IGFzeW5jaHJvbm91cyBqb2IgKi8KK3BpZF90CitqX2FzeW5jKHZvaWQpCit7CisJc2lnc2V0X3Qgb21hc2s7CisKKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzbV9zaWdjaGxkLCAmb21hc2spOworCisJaWYgKGFzeW5jX2pvYikKKwkJYXN5bmNfam9iLT5mbGFncyB8PSBKRl9LTk9XTjsKKworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb21hc2ssIE5VTEwpOworCisJcmV0dXJuIChhc3luY19waWQpOworfQorCisvKgorICogTWFrZSBqIHRoZSBsYXN0IGFzeW5jIHByb2Nlc3MKKyAqCisgKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KKyAqLworc3RhdGljIHZvaWQKK2pfc2V0X2FzeW5jKEpvYiAqaikKK3sKKwlKb2IJKmpsLCAqb2xkZXN0OworCisJaWYgKGFzeW5jX2pvYiAmJiAoYXN5bmNfam9iLT5mbGFncyAmIChKRl9LTk9XTnxKRl9aT01CSUUpKSA9PSBKRl9aT01CSUUpCisJCXJlbW92ZV9qb2IoYXN5bmNfam9iLCAiYXN5bmMiKTsKKwlpZiAoIShqLT5mbGFncyAmIEpGX1NUQVJURUQpKSB7CisJCWludGVybmFsX3dhcm5pbmdmKCJqX2FzeW5jOiBqb2Igbm90IHN0YXJ0ZWQiKTsKKwkJcmV0dXJuOworCX0KKwlhc3luY19qb2IgPSBqOworCWFzeW5jX3BpZCA9IGotPmxhc3RfcHJvYy0+cGlkOworCXdoaWxlIChuem9tYmllID4gQ0hJTERfTUFYKSB7CisJCW9sZGVzdCA9IE5VTEw7CisJCWZvciAoamwgPSBqb2JfbGlzdDsgamw7IGpsID0gamwtPm5leHQpCisJCQlpZiAoamwgIT0gYXN5bmNfam9iICYmIChqbC0+ZmxhZ3MgJiBKRl9aT01CSUUpICYmCisJCQkgICAgKCFvbGRlc3QgfHwgamwtPmFnZSA8IG9sZGVzdC0+YWdlKSkKKwkJCQlvbGRlc3QgPSBqbDsKKwkJaWYgKCFvbGRlc3QpIHsKKwkJCS8qIFhYWCBkZWJ1Z2dpbmcgKi8KKwkJCWlmICghKGFzeW5jX2pvYi0+ZmxhZ3MgJiBKRl9aT01CSUUpIHx8IG56b21iaWUgIT0gMSkgeworCQkJCWludGVybmFsX3dhcm5pbmdmKCJqX2FzeW5jOiBiYWQgbnpvbWJpZSAoJWQpIiwKKwkJCQkgICAgbnpvbWJpZSk7CisJCQkJbnpvbWJpZSA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlyZW1vdmVfam9iKG9sZGVzdCwgInpvbWJpZSIpOworCX0KK30KKworLyoKKyAqIFN0YXJ0IGEgam9iOiBzZXQgU1RBUlRFRCwgY2hlY2sgZm9yIGhlbGQgc2lnbmFscyBhbmQgc2V0IGotPmxhc3RfcHJvYworICoKKyAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgorICovCitzdGF0aWMgdm9pZAoral9zdGFydGpvYihKb2IgKmopCit7CisJUHJvYwkqcDsKKworCWotPmZsYWdzIHw9IEpGX1NUQVJURUQ7CisJZm9yIChwID0gai0+cHJvY19saXN0OyBwLT5uZXh0OyBwID0gcC0+bmV4dCkKKwkJOworCWotPmxhc3RfcHJvYyA9IHA7CisKKwlpZiAoaGVsZF9zaWdjaGxkKSB7CisJCWhlbGRfc2lnY2hsZCA9IDA7CisJCS8qIERvbid0IGNhbGwgal9zaWdjaGxkKCkgYXMgaXQgbWF5IHJlbW92ZSBqb2IuLi4gKi8KKwkJa2lsbChwcm9jcGlkLCBTSUdDSExEKTsKKwl9Cit9CisKKy8qCisgKiB3YWl0IGZvciBqb2IgdG8gY29tcGxldGUgb3IgY2hhbmdlIHN0YXRlCisgKgorICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCisgKi8KK3N0YXRpYyBpbnQKK2pfd2FpdGooSm9iICpqLAorICAgIGludCBmbGFncywJCQkvKiBzZWUgSldfKiAqLworICAgIGNvbnN0IGNoYXIgKndoZXJlKQoreworCWludAlydjsKKworCS8qCisJICogTm8gYXV0by1ub3RpZnkgb24gdGhlIGpvYiB3ZSBhcmUgd2FpdGluZyBvbi4KKwkgKi8KKwlqLT5mbGFncyB8PSBKRl9XQUlUSU5HOworCWlmIChmbGFncyAmIEpXX0FTWU5DTk9USUZZKQorCQlqLT5mbGFncyB8PSBKRl9XX0FTWU5DTk9USUZZOworCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCWlmICghRmxhZyhGTU9OSVRPUikpCisjZW5kaWYKKwkJZmxhZ3MgfD0gSldfU1RPUFBFRFdBSVQ7CisKKwl3aGlsZSAoai0+c3RhdGUgPT0gUFJVTk5JTkcgfHwKKwkgICAgKChmbGFncyAmIEpXX1NUT1BQRURXQUlUKSAmJiBqLT5zdGF0ZSA9PSBQU1RPUFBFRCkpIHsKKwkJc2lnc3VzcGVuZCgmc21fZGVmYXVsdCk7CisJCWlmIChmYXRhbF90cmFwKSB7CisJCQlpbnQgb2xkZiA9IGotPmZsYWdzICYgKEpGX1dBSVRJTkd8SkZfV19BU1lOQ05PVElGWSk7CisJCQlqLT5mbGFncyAmPSB+KEpGX1dBSVRJTkd8SkZfV19BU1lOQ05PVElGWSk7CisJCQlydW50cmFwcyhURl9GQVRBTCk7CisJCQlqLT5mbGFncyB8PSBvbGRmOyAvKiBub3QgcmVhY2hlZC4uLiAqLworCQl9CisJCWlmICgoZmxhZ3MgJiBKV19JTlRFUlJVUFQpICYmIChydiA9IHRyYXBfcGVuZGluZygpKSkgeworCQkJai0+ZmxhZ3MgJj0gfihKRl9XQUlUSU5HfEpGX1dfQVNZTkNOT1RJRlkpOworCQkJcmV0dXJuICgtcnYpOworCQl9CisJfQorCWotPmZsYWdzICY9IH4oSkZfV0FJVElOR3xKRl9XX0FTWU5DTk9USUZZKTsKKworCWlmIChqLT5mbGFncyAmIEpGX0ZHKSB7CisJCWotPmZsYWdzICY9IH5KRl9GRzsKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJCWlmIChGbGFnKEZNT05JVE9SKSAmJiB0dHlwZ3JwX29rICYmIGotPnBncnApIHsKKwkJCS8qCisJCQkgKiBTYXZlIHRoZSB0dHkncyBjdXJyZW50IHBncnAgc28gaXQgY2FuIGJlIHJlc3RvcmVkCisJCQkgKiB3aGVuIHRoZSBqb2IgaXMgZm9yZWdyb3VuZGVkLiBUaGlzIGlzIHRvCisJCQkgKiBkZWFsIHdpdGggdGhpbmdzIGxpa2UgdGhlIEdOVSBzdSB3aGljaCBkb2VzCisJCQkgKiBhIGZvcmsvZXhlYyBpbnN0ZWFkIG9mIGFuIGV4ZWMgKHRoZSBmb3JrIG1lYW5zCisJCQkgKiB0aGUgZXhlY2VkIHNoZWxsIGdldHMgYSBkaWZmZXJlbnQgcGlkIGZyb20gaXRzCisJCQkgKiBwZ3JwLCBzbyBuYXR1cmFsbHkgaXQgc2V0cyBpdHMgcGdycCBhbmQgZ2V0cyBob3NlZAorCQkJICogd2hlbiBpdCBnZXRzIGZvcmVncm91bmRlZCBieSB0aGUgcGFyZW50IHNoZWxsIHdoaWNoCisJCQkgKiBoYXMgcmVzdG9yZWQgdGhlIHR0eSdzIHBncnAgdG8gdGhhdCBvZiB0aGUgc3UKKwkJCSAqIHByb2Nlc3MpLgorCQkJICovCisJCQlpZiAoai0+c3RhdGUgPT0gUFNUT1BQRUQgJiYKKwkJCSAgICAoai0+c2F2ZWRfdHR5cGdycCA9IHRjZ2V0cGdycCh0dHlfZmQpKSA+PSAwKQorCQkJCWotPmZsYWdzIHw9IEpGX1NBVkVEVFRZUEdSUDsKKwkJCWlmICh0Y3NldHBncnAodHR5X2ZkLCBrc2hwZ3JwKSA8IDApCisJCQkJd2FybmluZ2YodHJ1ZSwKKwkJCQkgICAgImpfd2FpdGo6IHRjc2V0cGdycCglZCwgJWxkKSBmYWlsZWQ6ICVzIiwKKwkJCQkgICAgdHR5X2ZkLCAobG9uZylrc2hwZ3JwLCBzdHJlcnJvcihlcnJubykpOworCQkJaWYgKGotPnN0YXRlID09IFBTVE9QUEVEKSB7CisJCQkJai0+ZmxhZ3MgfD0gSkZfU0FWRURUVFk7CisJCQkJdGNnZXRhdHRyKHR0eV9mZCwgJmotPnR0eXN0YXRlKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWlmICh0dHlfZmQgPj0gMCkgeworCQkJLyoKKwkJCSAqIE9ubHkgcmVzdG9yZSB0dHkgc2V0dGluZ3MgaWYgam9iIHdhcyBvcmlnaW5hbGx5CisJCQkgKiBzdGFydGVkIGluIHRoZSBmb3JlZ3JvdW5kLiBQcm9ibGVtcyBjYW4gYmUKKwkJCSAqIGNhdXNlZCBieSB0aGluZ3MgbGlrZSAnbW9yZSBmb29iYXIgJicgd2hpY2ggd2lsbAorCQkJICogdHlwaWNhbGx5IGdldCBhbmQgc2F2ZSB0aGUgc2hlbGwncyB2aS9lbWFjcyB0dHkKKwkJCSAqIHNldHRpbmdzIGJlZm9yZSBzZXR0aW5nIHVwIHRoZSB0dHkgZm9yIGl0c2VsZjsKKwkJCSAqIHdoZW4gbW9yZSBleGl0cywgaXQgcmVzdG9yZXMgdGhlICdvcmlnaW5hbCcKKwkJCSAqIHNldHRpbmdzLCBhbmQgdGhpbmdzIGdvIGRvd24gaGlsbCBmcm9tIHRoZXJlLi4uCisJCQkgKi8KKwkJCWlmIChqLT5zdGF0ZSA9PSBQRVhJVEVEICYmIGotPnN0YXR1cyA9PSAwICYmCisJCQkgICAgKGotPmZsYWdzICYgSkZfVVNFVFRZTU9ERSkpIHsKKwkJCQl0Y2dldGF0dHIodHR5X2ZkLCAmdHR5X3N0YXRlKTsKKwkJCX0gZWxzZSB7CisJCQkJdGNzZXRhdHRyKHR0eV9mZCwgVENTQURSQUlOLCAmdHR5X3N0YXRlKTsKKwkJCQkvKi0KKwkJCQkgKiBEb24ndCB1c2UgdHR5IG1vZGUgaWYgam9iIGlzIHN0b3BwZWQgYW5kCisJCQkJICogbGF0ZXIgcmVzdGFydGVkIGFuZCBleGl0cy4gQ29uc2lkZXIKKwkJCQkgKiB0aGUgc2VxdWVuY2U6CisJCQkJICoJdmkgZm9vIChzdG9wcGVkKQorCQkJCSAqCS4uLgorCQkJCSAqCXN0dHkgc29tZXRoaW5nCisJCQkJICoJLi4uCisJCQkJICoJZmcgKHZpOyBaWikKKwkJCQkgKiBtb2RlIHNob3VsZCBiZSB0aGF0IG9mIHRoZSBzdHR5LCBub3Qgd2hhdAorCQkJCSAqIHdhcyBiZWZvcmUgdGhlIHZpIHN0YXJ0ZWQuCisJCQkJICovCisJCQkJaWYgKGotPnN0YXRlID09IFBTVE9QUEVEKQorCQkJCQlqLT5mbGFncyAmPSB+SkZfVVNFVFRZTU9ERTsKKwkJCX0KKwkJfQorI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwkJLyoKKwkJICogSWYgaXQgbG9va3MgbGlrZSB1c2VyIGhpdCBeQyB0byBraWxsIGEgam9iLCBwcmV0ZW5kIHdlIGdvdAorCQkgKiBvbmUgdG9vIHRvIGJyZWFrIG91dCBvZiBmb3IgbG9vcHMsIGV0Yy4gKEFUJlQga3NoIGRvZXMgdGhpcworCQkgKiBldmVuIHdoZW4gbm90IG1vbml0b3JpbmcsIGJ1dCB0aGlzIGRvZXNuJ3QgbWFrZSBzZW5zZSBzaW5jZQorCQkgKiBhIHR0eSBnZW5lcmF0ZWQgXkMgZ29lcyB0byB0aGUgd2hvbGUgcHJvY2VzcyBncm91cCkKKwkJICovCisJCXsKKwkJCWludCBzdGF0dXM7CisKKwkJCXN0YXR1cyA9IGotPmxhc3RfcHJvYy0+c3RhdHVzOworCQkJaWYgKEZsYWcoRk1PTklUT1IpICYmIGotPnN0YXRlID09IFBTSUdOQUxMRUQgJiYKKwkJCSAgICBXSUZTSUdOQUxFRChzdGF0dXMpICYmCisJCQkgICAgKHNpZ3RyYXBzW1dURVJNU0lHKHN0YXR1cyldLmZsYWdzICYgVEZfVFRZX0lOVFIpKQorCQkJCXRyYXBzaWcoV1RFUk1TSUcoc3RhdHVzKSk7CisJCX0KKyNlbmRpZgorCX0KKworCWpfdXNydGltZSA9IGotPnVzcnRpbWU7CisJal9zeXN0aW1lID0gai0+c3lzdGltZTsKKwlydiA9IGotPnN0YXR1czsKKworCWlmICghKGZsYWdzICYgSldfQVNZTkNOT1RJRlkpCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCSAgICAmJiAoIUZsYWcoRk1PTklUT1IpIHx8IGotPnN0YXRlICE9IFBTVE9QUEVEKQorI2VuZGlmCisJICAgICkgeworCQlqX3ByaW50KGosIEpQX1NIT1JULCBzaGxfb3V0KTsKKwkJc2hmX2ZsdXNoKHNobF9vdXQpOworCX0KKwlpZiAoai0+c3RhdGUgIT0gUFNUT1BQRUQKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJICAgICYmICghRmxhZyhGTU9OSVRPUikgfHwgIShmbGFncyAmIEpXX0FTWU5DTk9USUZZKSkKKyNlbmRpZgorCSAgICApCisJCXJlbW92ZV9qb2Ioaiwgd2hlcmUpOworCisJcmV0dXJuIChydik7Cit9CisKKy8qCisgKiBTSUdDSExEIGhhbmRsZXIgdG8gcmVhcCBjaGlsZHJlbiBhbmQgdXBkYXRlIGpvYiBzdGF0ZXMKKyAqCisgKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KKyAqLworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitqX3NpZ2NobGQoaW50IHNpZyBNS1NIX0FfVU5VU0VEKQoreworCS8qIHRoaXMgcnVucyBpbnNpZGUgaW50ZXJydXB0IGNvbnRleHQsIHdpdGggZXJybm8gc2F2ZWQgKi8KKworCUpvYiAqajsKKwlQcm9jICpwID0gTlVMTDsKKwlwaWRfdCBwaWQ7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgcnVzYWdlIHJ1MCwgcnUxOworCisJLyoKKwkgKiBEb24ndCB3YWl0IGZvciBhbnkgcHJvY2Vzc2VzIGlmIGEgam9iIGlzIHBhcnRpYWxseSBzdGFydGVkLgorCSAqIFRoaXMgaXMgc28gd2UgZG9uJ3QgZG8gYXdheSB3aXRoIHRoZSBwcm9jZXNzIGdyb3VwIGxlYWRlcgorCSAqIGJlZm9yZSBhbGwgdGhlIHByb2Nlc3NlcyBpbiBhIHBpcGUgbGluZSBhcmUgc3RhcnRlZCAoc28gdGhlCisJICogc2V0cGdpZCgpIHdvbid0IGZhaWwpCisJICovCisJZm9yIChqID0gam9iX2xpc3Q7IGo7IGogPSBqLT5uZXh0KQorCQlpZiAoai0+cHBpZCA9PSBwcm9jcGlkICYmICEoai0+ZmxhZ3MgJiBKRl9TVEFSVEVEKSkgeworCQkJaGVsZF9zaWdjaGxkID0gMTsKKwkJCXJldHVybjsKKwkJfQorCisJZ2V0cnVzYWdlKFJVU0FHRV9DSElMRFJFTiwgJnJ1MCk7CisJZG8geworCQlwaWQgPSB3YWl0cGlkKC0xLCAmc3RhdHVzLCAoV05PSEFOR3xXVU5UUkFDRUQpKTsKKworCQkvKgorCQkgKiByZXR1cm4gaWYgdGhpcyB3b3VsZCBibG9jayAoMCkgb3Igbm8gY2hpbGRyZW4KKwkJICogb3IgaW50ZXJydXB0ZWQgKC0xKQorCQkgKi8KKwkJaWYgKHBpZCA8PSAwKQorCQkJcmV0dXJuOworCisJCWdldHJ1c2FnZShSVVNBR0VfQ0hJTERSRU4sICZydTEpOworCisJCS8qIGZpbmQgam9iIGFuZCBwcm9jZXNzIHN0cnVjdHVyZXMgZm9yIHRoaXMgcGlkICovCisJCWZvciAoaiA9IGpvYl9saXN0OyBqICE9IE5VTEw7IGogPSBqLT5uZXh0KQorCQkJZm9yIChwID0gai0+cHJvY19saXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorCQkJCWlmIChwLT5waWQgPT0gcGlkKQorCQkJCQlnb3RvIGZvdW5kOworIGZvdW5kOgorCQlpZiAoaiA9PSBOVUxMKSB7CisJCQkvKiBDYW4gb2NjdXIgaWYgcHJvY2VzcyBoYXMga2lkcywgdGhlbiBleGVjcyBzaGVsbAorCQkJd2FybmluZ2YodHJ1ZSwgImJhZCBwcm9jZXNzIHdhaXRlZCBmb3IgKHBpZCA9ICVkKSIsCisJCQkJcGlkKTsKKwkJCSAqLworCQkJcnUwID0gcnUxOworCQkJY29udGludWU7CisJCX0KKworCQl0aW1lcmFkZCgmai0+dXNydGltZSwgJnJ1MS5ydV91dGltZSwgJmotPnVzcnRpbWUpOworCQl0aW1lcnN1Yigmai0+dXNydGltZSwgJnJ1MC5ydV91dGltZSwgJmotPnVzcnRpbWUpOworCQl0aW1lcmFkZCgmai0+c3lzdGltZSwgJnJ1MS5ydV9zdGltZSwgJmotPnN5c3RpbWUpOworCQl0aW1lcnN1Yigmai0+c3lzdGltZSwgJnJ1MC5ydV9zdGltZSwgJmotPnN5c3RpbWUpOworCQlydTAgPSBydTE7CisJCXAtPnN0YXR1cyA9IHN0YXR1czsKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJCWlmIChXSUZTVE9QUEVEKHN0YXR1cykpCisJCQlwLT5zdGF0ZSA9IFBTVE9QUEVEOworCQllbHNlCisjZW5kaWYKKwkJICBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkKKwkJCXAtPnN0YXRlID0gUFNJR05BTExFRDsKKwkJZWxzZQorCQkJcC0+c3RhdGUgPSBQRVhJVEVEOworCisJCWNoZWNrX2pvYihqKTsJLyogY2hlY2sgdG8gc2VlIGlmIGVudGlyZSBqb2IgaXMgZG9uZSAqLworCX0gd2hpbGUgKDEpOworfQorCisvKgorICogQ2FsbGVkIG9ubHkgd2hlbiBhIHByb2Nlc3MgaW4gaiBoYXMgZXhpdGVkL3N0b3BwZWQgKGllLCBjYWxsZWQgb25seQorICogZnJvbSBqX3NpZ2NobGQoKSkuIElmIG5vIHByb2Nlc3NlcyBhcmUgcnVubmluZywgdGhlIGpvYiBzdGF0dXMKKyAqIGFuZCBzdGF0ZSBhcmUgdXBkYXRlZCwgYXN5bmNocm9ub3VzIGpvYiBub3RpZmljYXRpb24gaXMgZG9uZSBhbmQsCisgKiBpZiB1bm5lZWRlZCwgdGhlIGpvYiBpcyByZW1vdmVkLgorICoKKyAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgorICovCitzdGF0aWMgdm9pZAorY2hlY2tfam9iKEpvYiAqaikKK3sKKwlpbnQJanN0YXRlOworCVByb2MJKnA7CisKKwkvKiBYWFggZGVidWdnaW5nIChuYXN0eSAtIGludGVycnVwdCByb3V0aW5lIHVzaW5nIHNobF9vdXQpICovCisJaWYgKCEoai0+ZmxhZ3MgJiBKRl9TVEFSVEVEKSkgeworCQlpbnRlcm5hbF93YXJuaW5nZigiY2hlY2tfam9iOiBqb2Igc3RhcnRlZCAoZmxhZ3MgMHgleCkiLAorCQkgICAgai0+ZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJanN0YXRlID0gUFJVTk5JTkc7CisJZm9yIChwPWotPnByb2NfbGlzdDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkgeworCQlpZiAocC0+c3RhdGUgPT0gUFJVTk5JTkcpCisJCQlyZXR1cm47CS8qIHNvbWUgcHJvY2Vzc2VzIHN0aWxsIHJ1bm5pbmcgKi8KKwkJaWYgKHAtPnN0YXRlID4ganN0YXRlKQorCQkJanN0YXRlID0gcC0+c3RhdGU7CisJfQorCWotPnN0YXRlID0ganN0YXRlOworCisJc3dpdGNoIChqLT5sYXN0X3Byb2MtPnN0YXRlKSB7CisJY2FzZSBQRVhJVEVEOgorCQlqLT5zdGF0dXMgPSBXRVhJVFNUQVRVUyhqLT5sYXN0X3Byb2MtPnN0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgUFNJR05BTExFRDoKKwkJai0+c3RhdHVzID0gMTI4ICsgV1RFUk1TSUcoai0+bGFzdF9wcm9jLT5zdGF0dXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlqLT5zdGF0dXMgPSAwOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIE5vdGUgd2hlbiBjby1wcm9jZXNzIGRpZXM6IGNhbid0IGJlIGRvbmUgaW4gal93YWl0KCkgbm9yCisJICogcmVtb3ZlX2pvYigpIHNpbmNlIG5laXRoZXIgbWF5IGJlIGNhbGxlZCBmb3Igbm9uLWludGVyYWN0aXZlCisJICogc2hlbGxzLgorCSAqLworCWlmIChqLT5zdGF0ZSA9PSBQRVhJVEVEIHx8IGotPnN0YXRlID09IFBTSUdOQUxMRUQpIHsKKwkJLyoKKwkJICogTm8gbmVlZCB0byBrZWVwIGNvLXByb2Nlc3MgaW5wdXQgYW55IG1vcmUKKwkJICogKGF0IGxlYXN0LCB0aGlzIGlzIHdoYXQga3NoOTNkIHRoaW5rcykKKwkJICovCisJCWlmIChjb3Byb2Muam9iID09IGopIHsKKwkJCWNvcHJvYy5qb2IgPSBOVUxMOworCQkJLyoKKwkJCSAqIFhYWCB3b3VsZCBiZSBuaWNlIHRvIGdldCB0aGUgY2xvc2VzIG91dCBvZiBoZXJlCisJCQkgKiBzbyB0aGV5IGFyZW4ndCBkb25lIGluIHRoZSBzaWduYWwgaGFuZGxlci4KKwkJCSAqIFdvdWxkIG1lYW4gYSBjaGVjayBpbiBjb3Byb2NfZ2V0ZmQoKSB0bworCQkJICogZG8gImlmIGpvYiA9PSAwICYmIHdyaXRlID49IDAsIGNsb3NlIHdyaXRlIi4KKwkJCSAqLworCQkJY29wcm9jX3dyaXRlX2Nsb3NlKGNvcHJvYy53cml0ZSk7CisJCX0KKwkJLyogRG8gd2UgbmVlZCB0byBrZWVwIHRoZSBvdXRwdXQ/ICovCisJCWlmIChqLT5jb3Byb2NfaWQgJiYgai0+Y29wcm9jX2lkID09IGNvcHJvYy5pZCAmJgorCQkgICAgLS1jb3Byb2MubmpvYnMgPT0gMCkKKwkJCWNvcHJvY19yZWFkd19jbG9zZShjb3Byb2MucmVhZCk7CisJfQorCisJai0+ZmxhZ3MgfD0gSkZfQ0hBTkdFRDsKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJaWYgKEZsYWcoRk1PTklUT1IpICYmICEoai0+ZmxhZ3MgJiBKRl9YWENPTSkpIHsKKwkJLyoKKwkJICogT25seSBwdXQgc3RvcHBlZCBqb2JzIGF0IHRoZSBmcm9udCB0byBhdm9pZCBjb25mdXNpbmcKKwkJICogdGhlIHVzZXIgKGRvbid0IHdhbnQgZmluaXNoZWQgam9icyBlZmZlY3RpbmcgJSsgb3IgJS0pCisJCSAqLworCQlpZiAoai0+c3RhdGUgPT0gUFNUT1BQRUQpCisJCQlwdXRfam9iKGosIFBKX09OX0ZST05UKTsKKwkJaWYgKEZsYWcoRk5PVElGWSkgJiYKKwkJICAgIChqLT5mbGFncyAmIChKRl9XQUlUSU5HfEpGX1dfQVNZTkNOT1RJRlkpKSAhPSBKRl9XQUlUSU5HKSB7CisJCQkvKiBMb29rIGZvciB0aGUgcmVhbCBmaWxlIGRlc2NyaXB0b3IgMiAqLworCQkJeworCQkJCXN0cnVjdCBlbnYgKmVwOworCQkJCWludCBmZCA9IDI7CisKKwkJCQlmb3IgKGVwID0gZTsgZXA7IGVwID0gZXAtPm9lbnYpCisJCQkJCWlmIChlcC0+c2F2ZWZkICYmIGVwLT5zYXZlZmRbMl0pCisJCQkJCQlmZCA9IGVwLT5zYXZlZmRbMl07CisJCQkJc2hmX3Jlb3BlbihmZCwgU0hGX1dSLCBzaGxfaik7CisJCQl9CisJCQkvKgorCQkJICogQ2FuJ3QgY2FsbCBqX25vdGlmeSgpIGFzIGl0IHJlbW92ZXMgam9icy4gVGhlIGpvYgorCQkJICogbXVzdCBzdGF5IGluIHRoZSBqb2IgbGlzdCBhcyBqX3dhaXRqKCkgbWF5IGJlCisJCQkgKiBydW5uaW5nIHdpdGggdGhpcyBqb2IuCisJCQkgKi8KKwkJCWpfcHJpbnQoaiwgSlBfTUVESVVNLCBzaGxfaik7CisJCQlzaGZfZmx1c2goc2hsX2opOworCQkJaWYgKCEoai0+ZmxhZ3MgJiBKRl9XQUlUSU5HKSAmJiBqLT5zdGF0ZSAhPSBQU1RPUFBFRCkKKwkJCQlyZW1vdmVfam9iKGosICJub3RpZnkiKTsKKwkJfQorCX0KKyNlbmRpZgorCWlmICgKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisJICAgICFGbGFnKEZNT05JVE9SKSAmJgorI2VuZGlmCisJICAgICEoai0+ZmxhZ3MgJiAoSkZfV0FJVElOR3xKRl9GRykpICYmCisJICAgIGotPnN0YXRlICE9IFBTVE9QUEVEKSB7CisJCWlmIChqID09IGFzeW5jX2pvYiB8fCAoai0+ZmxhZ3MgJiBKRl9LTk9XTikpIHsKKwkJCWotPmZsYWdzIHw9IEpGX1pPTUJJRTsKKwkJCWotPmpvYiA9IC0xOworCQkJbnpvbWJpZSsrOworCQl9IGVsc2UKKwkJCXJlbW92ZV9qb2IoaiwgImNoZWNram9iIik7CisJfQorfQorCisvKgorICogUHJpbnQgam9iIHN0YXR1cyBpbiBlaXRoZXIgc2hvcnQsIG1lZGl1bSBvciBsb25nIGZvcm1hdC4KKyAqCisgKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KKyAqLworc3RhdGljIHZvaWQKK2pfcHJpbnQoSm9iICpqLCBpbnQgaG93LCBzdHJ1Y3Qgc2hmICpzaGYpCit7CisJUHJvYwkqcDsKKwlpbnQJc3RhdGU7CisJaW50CXN0YXR1czsKKwlpbnQJY29yZWR1bXBlZDsKKwljaGFyCWpvYmNoYXIgPSAnICc7CisJY2hhcglidWZbNjRdOworCWNvbnN0IGNoYXIgKmZpbGxlcjsKKwlpbnQJb3V0cHV0ID0gMDsKKworCWlmIChob3cgPT0gSlBfUEdSUCkgeworCQkvKgorCQkgKiBQT1NJWCBkb2Vzbid0IHNheSB3aGF0IHRvIGRvIGl0IHRoZXJlIGlzIG5vIHByb2Nlc3MKKwkJICogZ3JvdXAgbGVhZGVyIChpZSwgIUZNT05JVE9SKS4gV2UgYXJiaXRyYXJpbHkgcmV0dXJuCisJCSAqIGxhc3QgcGlkICh3aGljaCBpcyB3aGF0ICQhIHJldHVybnMpLgorCQkgKi8KKwkJc2hmX2ZwcmludGYoc2hmLCAiJWRcbiIsIChpbnQpKGotPnBncnAgPyBqLT5wZ3JwIDoKKwkJICAgIChqLT5sYXN0X3Byb2MgPyBqLT5sYXN0X3Byb2MtPnBpZCA6IDApKSk7CisJCXJldHVybjsKKwl9CisJai0+ZmxhZ3MgJj0gfkpGX0NIQU5HRUQ7CisJZmlsbGVyID0gai0+am9iID4gMTAgPyAiXG4gICAgICAgIiA6ICJcbiAgICAgICI7CisJaWYgKGogPT0gam9iX2xpc3QpCisJCWpvYmNoYXIgPSAnKyc7CisJZWxzZSBpZiAoaiA9PSBqb2JfbGlzdC0+bmV4dCkKKwkJam9iY2hhciA9ICctJzsKKworCWZvciAocCA9IGotPnByb2NfbGlzdDsgcCAhPSBOVUxMOykgeworCQljb3JlZHVtcGVkID0gMDsKKwkJc3dpdGNoIChwLT5zdGF0ZSkgeworCQljYXNlIFBSVU5OSU5HOgorCQkJbWVtY3B5KGJ1ZiwgIlJ1bm5pbmciLCA4KTsKKwkJCWJyZWFrOworCQljYXNlIFBTVE9QUEVEOgorCQkJc3RybGNweShidWYsIHNpZ3RyYXBzW1dTVE9QU0lHKHAtPnN0YXR1cyldLm1lc3MsCisJCQkgICAgc2l6ZW9mKGJ1ZikpOworCQkJYnJlYWs7CisJCWNhc2UgUEVYSVRFRDoKKwkJCWlmIChob3cgPT0gSlBfU0hPUlQpCisJCQkJYnVmWzBdID0gJ1wwJzsKKwkJCWVsc2UgaWYgKFdFWElUU1RBVFVTKHAtPnN0YXR1cykgPT0gMCkKKwkJCQltZW1jcHkoYnVmLCAiRG9uZSIsIDUpOworCQkJZWxzZQorCQkJCXNoZl9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiRG9uZSAoJWQpIiwKKwkJCQkgICAgV0VYSVRTVEFUVVMocC0+c3RhdHVzKSk7CisJCQlicmVhazsKKwkJY2FzZSBQU0lHTkFMTEVEOgorI2lmZGVmIFdDT1JFRFVNUAorCQkJaWYgKFdDT1JFRFVNUChwLT5zdGF0dXMpKQorCQkJCWNvcmVkdW1wZWQgPSAxOworI2VuZGlmCisJCQkvKgorCQkJICoga2x1ZGdlIGZvciBub3QgcmVwb3J0aW5nICdub3JtYWwgdGVybWluYXRpb24KKwkJCSAqIHNpZ25hbHMnIChpLmUuIFNJR0lOVCwgU0lHUElQRSkKKwkJCSAqLworCQkJaWYgKGhvdyA9PSBKUF9TSE9SVCAmJiAhY29yZWR1bXBlZCAmJgorCQkJICAgIChXVEVSTVNJRyhwLT5zdGF0dXMpID09IFNJR0lOVCB8fAorCQkJICAgIFdURVJNU0lHKHAtPnN0YXR1cykgPT0gU0lHUElQRSkpIHsKKwkJCQlidWZbMF0gPSAnXDAnOworCQkJfSBlbHNlCisJCQkJc3RybGNweShidWYsIHNpZ3RyYXBzW1dURVJNU0lHKHAtPnN0YXR1cyldLm1lc3MsCisJCQkJICAgIHNpemVvZihidWYpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGhvdyAhPSBKUF9TSE9SVCkgeworCQkJaWYgKHAgPT0gai0+cHJvY19saXN0KQorCQkJCXNoZl9mcHJpbnRmKHNoZiwgIlslZF0gJWMgIiwgai0+am9iLCBqb2JjaGFyKTsKKwkJCWVsc2UKKwkJCQlzaGZfZnByaW50ZihzaGYsICIlcyIsIGZpbGxlcik7CisJCX0KKworCQlpZiAoaG93ID09IEpQX0xPTkcpCisJCQlzaGZfZnByaW50ZihzaGYsICIlNWQgIiwgKGludClwLT5waWQpOworCisJCWlmIChob3cgPT0gSlBfU0hPUlQpIHsKKwkJCWlmIChidWZbMF0pIHsKKwkJCQlvdXRwdXQgPSAxOworCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiVzJXMgIiwKKwkJCQkgICAgYnVmLCBjb3JlZHVtcGVkID8gIiAoY29yZSBkdW1wZWQpIiA6IG51bGwpOworCQkJfQorCQl9IGVsc2UgeworCQkJb3V0cHV0ID0gMTsKKwkJCXNoZl9mcHJpbnRmKHNoZiwgIiUtMjBzICVzJXMlcyIsIGJ1ZiwgcC0+Y29tbWFuZCwKKwkJCSAgICBwLT5uZXh0ID8gInwiIDogbnVsbCwKKwkJCSAgICBjb3JlZHVtcGVkID8gIiAoY29yZSBkdW1wZWQpIiA6IG51bGwpOworCQl9CisKKwkJc3RhdGUgPSBwLT5zdGF0ZTsKKwkJc3RhdHVzID0gcC0+c3RhdHVzOworCQlwID0gcC0+bmV4dDsKKwkJd2hpbGUgKHAgJiYgcC0+c3RhdGUgPT0gc3RhdGUgJiYgcC0+c3RhdHVzID09IHN0YXR1cykgeworCQkJaWYgKGhvdyA9PSBKUF9MT05HKQorCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiVzJTVkICUtMjBzICVzJXMiLCBmaWxsZXIsCisJCQkJICAgIChpbnQpcC0+cGlkLCAiICIsIHAtPmNvbW1hbmQsCisJCQkJICAgIHAtPm5leHQgPyAifCIgOiBudWxsKTsKKwkJCWVsc2UgaWYgKGhvdyA9PSBKUF9NRURJVU0pCisJCQkJc2hmX2ZwcmludGYoc2hmLCAiICVzJXMiLCBwLT5jb21tYW5kLAorCQkJCSAgICBwLT5uZXh0ID8gInwiIDogbnVsbCk7CisJCQlwID0gcC0+bmV4dDsKKwkJfQorCX0KKwlpZiAob3V0cHV0KQorCQlzaGZfcHV0YygnXG4nLCBzaGYpOworfQorCisvKgorICogQ29udmVydCAlIHNlcXVlbmNlIHRvIGpvYgorICoKKyAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgorICovCitzdGF0aWMgSm9iICoKK2pfbG9va3VwKGNvbnN0IGNoYXIgKmNwLCBpbnQgKmVjb2RlcCkKK3sKKwlKb2IJCSpqLCAqbGFzdF9tYXRjaDsKKwlQcm9jCQkqcDsKKwlpbnQJCWxlbiwgam9iID0gMDsKKworCWlmIChrc2hfaXNkaWdpdCgqY3ApKSB7CisJCWdldG4oY3AsICZqb2IpOworCQkvKiBMb29rIGZvciBsYXN0X3Byb2MtPnBpZCAod2hhdCAkISByZXR1cm5zKSBmaXJzdC4uLiAqLworCQlmb3IgKGogPSBqb2JfbGlzdDsgaiAhPSBOVUxMOyBqID0gai0+bmV4dCkKKwkJCWlmIChqLT5sYXN0X3Byb2MgJiYgai0+bGFzdF9wcm9jLT5waWQgPT0gam9iKQorCQkJCXJldHVybiAoaik7CisJCS8qCisJCSAqIC4uLnRoZW4gbG9vayBmb3IgcHJvY2VzcyBncm91cCAodGhpcyBpcyBub24tUE9TSVgsCisJCSAqIGJ1dCBzaG91bGQgbm90IGJyZWFrIGFueXRoaW5nCisJCSAqLworCQlmb3IgKGogPSBqb2JfbGlzdDsgaiAhPSBOVUxMOyBqID0gai0+bmV4dCkKKwkJCWlmIChqLT5wZ3JwICYmIGotPnBncnAgPT0gam9iKQorCQkJCXJldHVybiAoaik7CisJCWlmIChlY29kZXApCisJCQkqZWNvZGVwID0gSkxfTk9TVUNIOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlpZiAoKmNwICE9ICclJykgeworCQlpZiAoZWNvZGVwKQorCQkJKmVjb2RlcCA9IEpMX0lOVkFMSUQ7CisJCXJldHVybiAoTlVMTCk7CisJfQorCXN3aXRjaCAoKisrY3ApIHsKKwljYXNlICdcMCc6IC8qIG5vbi1zdGFuZGFyZCAqLworCWNhc2UgJysnOgorCWNhc2UgJyUnOgorCQlpZiAoam9iX2xpc3QgIT0gTlVMTCkKKwkJCXJldHVybiAoam9iX2xpc3QpOworCQlicmVhazsKKworCWNhc2UgJy0nOgorCQlpZiAoam9iX2xpc3QgIT0gTlVMTCAmJiBqb2JfbGlzdC0+bmV4dCkKKwkJCXJldHVybiAoam9iX2xpc3QtPm5leHQpOworCQlicmVhazsKKworCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKwljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisJCWdldG4oY3AsICZqb2IpOworCQlmb3IgKGogPSBqb2JfbGlzdDsgaiAhPSBOVUxMOyBqID0gai0+bmV4dCkKKwkJCWlmIChqLT5qb2IgPT0gam9iKQorCQkJCXJldHVybiAoaik7CisJCWJyZWFrOworCisJY2FzZSAnPyc6CQkvKiAlP3N0cmluZyAqLworCQlsYXN0X21hdGNoID0gTlVMTDsKKwkJZm9yIChqID0gam9iX2xpc3Q7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpCisJCQlmb3IgKHAgPSBqLT5wcm9jX2xpc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCisJCQkJaWYgKHN0cnN0cihwLT5jb21tYW5kLCBjcCsxKSAhPSBOVUxMKSB7CisJCQkJCWlmIChsYXN0X21hdGNoKSB7CisJCQkJCQlpZiAoZWNvZGVwKQorCQkJCQkJCSplY29kZXAgPSBKTF9BTUJJRzsKKwkJCQkJCXJldHVybiAoTlVMTCk7CisJCQkJCX0KKwkJCQkJbGFzdF9tYXRjaCA9IGo7CisJCQkJfQorCQlpZiAobGFzdF9tYXRjaCkKKwkJCXJldHVybiAobGFzdF9tYXRjaCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8qICVzdHJpbmcgKi8KKwkJbGVuID0gc3RybGVuKGNwKTsKKwkJbGFzdF9tYXRjaCA9IE5VTEw7CisJCWZvciAoaiA9IGpvYl9saXN0OyBqICE9IE5VTEw7IGogPSBqLT5uZXh0KQorCQkJaWYgKHN0cm5jbXAoY3AsIGotPnByb2NfbGlzdC0+Y29tbWFuZCwgbGVuKSA9PSAwKSB7CisJCQkJaWYgKGxhc3RfbWF0Y2gpIHsKKwkJCQkJaWYgKGVjb2RlcCkKKwkJCQkJCSplY29kZXAgPSBKTF9BTUJJRzsKKwkJCQkJcmV0dXJuIChOVUxMKTsKKwkJCQl9CisJCQkJbGFzdF9tYXRjaCA9IGo7CisJCQl9CisJCWlmIChsYXN0X21hdGNoKQorCQkJcmV0dXJuIChsYXN0X21hdGNoKTsKKwkJYnJlYWs7CisJfQorCWlmIChlY29kZXApCisJCSplY29kZXAgPSBKTF9OT1NVQ0g7CisJcmV0dXJuIChOVUxMKTsKK30KKworc3RhdGljIEpvYgkqZnJlZV9qb2JzOworc3RhdGljIFByb2MJKmZyZWVfcHJvY3M7CisKKy8qCisgKiBhbGxvY2F0ZSBhIG5ldyBqb2IgYW5kIGZpbGwgaW4gdGhlIGpvYiBudW1iZXIuCisgKgorICogSWYgam9icyBhcmUgY29tcGlsZWQgaW4gdGhlbiB0aGlzIHJvdXRpbmUgZXhwZWN0cyBzaWdjaGxkIHRvIGJlIGJsb2NrZWQuCisgKi8KK3N0YXRpYyBKb2IgKgorbmV3X2pvYih2b2lkKQoreworCWludAlpOworCUpvYgkqbmV3aiwgKmo7CisKKwlpZiAoZnJlZV9qb2JzICE9IE5VTEwpIHsKKwkJbmV3aiA9IGZyZWVfam9iczsKKwkJZnJlZV9qb2JzID0gZnJlZV9qb2JzLT5uZXh0OworCX0gZWxzZQorCQluZXdqID0gYWxsb2Moc2l6ZW9mKEpvYiksIEFQRVJNKTsKKworCS8qIGJydXRlIGZvcmNlIG1ldGhvZCAqLworCWZvciAoaSA9IDE7IDsgaSsrKSB7CisJCWZvciAoaiA9IGpvYl9saXN0OyBqICYmIGotPmpvYiAhPSBpOyBqID0gai0+bmV4dCkKKwkJCTsKKwkJaWYgKGogPT0gTlVMTCkKKwkJCWJyZWFrOworCX0KKwluZXdqLT5qb2IgPSBpOworCisJcmV0dXJuIChuZXdqKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIG5ldyBwcm9jZXNzIHN0cnVjdAorICoKKyAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgorICovCitzdGF0aWMgUHJvYyAqCituZXdfcHJvYyh2b2lkKQoreworCVByb2MJKnA7CisKKwlpZiAoZnJlZV9wcm9jcyAhPSBOVUxMKSB7CisJCXAgPSBmcmVlX3Byb2NzOworCQlmcmVlX3Byb2NzID0gZnJlZV9wcm9jcy0+bmV4dDsKKwl9IGVsc2UKKwkJcCA9IGFsbG9jKHNpemVvZihQcm9jKSwgQVBFUk0pOworCisJcmV0dXJuIChwKTsKK30KKworLyoKKyAqIFRha2Ugam9iIG91dCBvZiBqb2JfbGlzdCBhbmQgcHV0IG9sZCBzdHJ1Y3R1cmVzIGludG8gZnJlZSBsaXN0LgorICogS2VlcHMgbnpvbWJpZXMsIGxhc3Rfam9iIGFuZCBhc3luY19qb2IgdXAgdG8gZGF0ZS4KKyAqCisgKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KKyAqLworc3RhdGljIHZvaWQKK3JlbW92ZV9qb2IoSm9iICpqLCBjb25zdCBjaGFyICp3aGVyZSkKK3sKKwlQcm9jCSpwLCAqdG1wOworCUpvYgkqKnByZXYsICpjdXJyOworCisJcHJldiA9ICZqb2JfbGlzdDsKKwljdXJyID0gKnByZXY7CisJZm9yICg7IGN1cnIgIT0gTlVMTCAmJiBjdXJyICE9IGo7IHByZXYgPSAmY3Vyci0+bmV4dCwgY3VyciA9ICpwcmV2KQorCQk7CisJaWYgKGN1cnIgIT0gaikgeworCQlpbnRlcm5hbF93YXJuaW5nZigicmVtb3ZlX2pvYjogam9iIG5vdCBmb3VuZCAoJXMpIiwgd2hlcmUpOworCQlyZXR1cm47CisJfQorCSpwcmV2ID0gY3Vyci0+bmV4dDsKKworCS8qIGZyZWUgdXAgcHJvYyBzdHJ1Y3R1cmVzICovCisJZm9yIChwID0gai0+cHJvY19saXN0OyBwICE9IE5VTEw7ICkgeworCQl0bXAgPSBwOworCQlwID0gcC0+bmV4dDsKKwkJdG1wLT5uZXh0ID0gZnJlZV9wcm9jczsKKwkJZnJlZV9wcm9jcyA9IHRtcDsKKwl9CisKKwlpZiAoKGotPmZsYWdzICYgSkZfWk9NQklFKSAmJiBqLT5wcGlkID09IHByb2NwaWQpCisJCS0tbnpvbWJpZTsKKwlqLT5uZXh0ID0gZnJlZV9qb2JzOworCWZyZWVfam9icyA9IGo7CisKKwlpZiAoaiA9PSBsYXN0X2pvYikKKwkJbGFzdF9qb2IgPSBOVUxMOworCWlmIChqID09IGFzeW5jX2pvYikKKwkJYXN5bmNfam9iID0gTlVMTDsKK30KKworLyoKKyAqIHB1dCBqIGluIGEgcGFydGljdWxhciBsb2NhdGlvbiAodGFraW5nIGl0IG91dCBqb2JfbGlzdCBpZiBpdCBpcyB0aGVyZQorICogYWxyZWFkeSkKKyAqCisgKiBJZiBqb2JzIGFyZSBjb21waWxlZCBpbiB0aGVuIHRoaXMgcm91dGluZSBleHBlY3RzIHNpZ2NobGQgdG8gYmUgYmxvY2tlZC4KKyAqLworc3RhdGljIHZvaWQKK3B1dF9qb2IoSm9iICpqLCBpbnQgd2hlcmUpCit7CisJSm9iCSoqcHJldiwgKmN1cnI7CisKKwkvKiBSZW1vdmUgam9iIGZyb20gbGlzdCAoaWYgdGhlcmUpICovCisJcHJldiA9ICZqb2JfbGlzdDsKKwljdXJyID0gam9iX2xpc3Q7CisJZm9yICg7IGN1cnIgJiYgY3VyciAhPSBqOyBwcmV2ID0gJmN1cnItPm5leHQsIGN1cnIgPSAqcHJldikKKwkJOworCWlmIChjdXJyID09IGopCisJCSpwcmV2ID0gY3Vyci0+bmV4dDsKKworCXN3aXRjaCAod2hlcmUpIHsKKwljYXNlIFBKX09OX0ZST05UOgorCQlqLT5uZXh0ID0gam9iX2xpc3Q7CisJCWpvYl9saXN0ID0gajsKKwkJYnJlYWs7CisKKwljYXNlIFBKX1BBU1RfU1RPUFBFRDoKKwkJcHJldiA9ICZqb2JfbGlzdDsKKwkJY3VyciA9IGpvYl9saXN0OworCQlmb3IgKDsgY3VyciAmJiBjdXJyLT5zdGF0ZSA9PSBQU1RPUFBFRDsgcHJldiA9ICZjdXJyLT5uZXh0LAorCQkgICAgY3VyciA9ICpwcmV2KQorCQkJOworCQlqLT5uZXh0ID0gY3VycjsKKwkJKnByZXYgPSBqOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBudWtlIGEgam9iIChjYWxsZWQgd2hlbiB1bmFibGUgdG8gc3RhcnQgZnVsbCBqb2IpLgorICoKKyAqIElmIGpvYnMgYXJlIGNvbXBpbGVkIGluIHRoZW4gdGhpcyByb3V0aW5lIGV4cGVjdHMgc2lnY2hsZCB0byBiZSBibG9ja2VkLgorICovCitzdGF0aWMgaW50CitraWxsX2pvYihKb2IgKmosIGludCBzaWcpCit7CisJUHJvYwkqcDsKKwlpbnQJcnZhbCA9IDA7CisKKwlmb3IgKHAgPSBqLT5wcm9jX2xpc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCisJCWlmIChwLT5waWQgIT0gMCkKKwkJCWlmIChraWxsKHAtPnBpZCwgc2lnKSA8IDApCisJCQkJcnZhbCA9IC0xOworCXJldHVybiAocnZhbCk7Cit9CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9sYWxsb2MuYyBiL21rc2gvc3JjL2xhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjI3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9sYWxsb2MuYwpAQCAtMCwwICsxLDEyMyBAQAorLyotCisgKiBDb3B5cmlnaHQgwqkgMjAwOQorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1buKAkAorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCDigJxBUyBJU+KAnSBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29u4oCZcyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaW5jbHVkZSAic2guaCIKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvbGFsbG9jLmMsdiAxLjExIDIwMDkvMDgvMDggMTM6MDg6NTEgdGcgRXhwICQiKTsKKworLyogYnVpbGQgd2l0aCBDUFBGTEFHUys9IC1EVVNFX1JFQUxMT0NfTUFMTE9DPTAgb24gYW5jaWVudCBzeXN0ZW1zICovCisjaWYgZGVmaW5lZChVU0VfUkVBTExPQ19NQUxMT0MpICYmIChVU0VfUkVBTExPQ19NQUxMT0MgPT0gMCkKKyNkZWZpbmUgcmVtYWxsb2MocCxuKQkoKHApID09IE5VTEwgPyBtYWxsb2MobikgOiByZWFsbG9jKChwKSwgKG4pKSkKKyNlbHNlCisjZGVmaW5lIHJlbWFsbG9jKHAsbikJcmVhbGxvYygocCksIChuKSkKKyNlbmRpZgorCisjZGVmaW5lIEFMTE9DX0lTVU5BTElHTkVEKHApICgoKHB0cmRpZmZfdCkocCkpICUgQUxMT0NfU0laRSkKKworc3RhdGljIEFMTE9DX0lURU0gKmZpbmRwdHIoQUxMT0NfSVRFTSAqKiwgY2hhciAqLCBBcmVhICopOworCit2b2lkCithaW5pdChBcmVhICphcCkKK3sKKwkvKiBhcmVhIHBvaW50ZXIgaXMgYW4gQUxMT0NfSVRFTSwganVzdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLworCWFwLT5uZXh0ID0gTlVMTDsKK30KKworc3RhdGljIEFMTE9DX0lURU0gKgorZmluZHB0cihBTExPQ19JVEVNICoqbHBwLCBjaGFyICpwdHIsIEFyZWEgKmFwKQoreworCXZvaWQgKmxwOworCisjaWZuZGVmIE1LU0hfU01BTEwKKwlpZiAoQUxMT0NfSVNVTkFMSUdORUQocHRyKSkKKwkJZ290byBmYWlsOworI2VuZGlmCisJLyogZ2V0IGFkZHJlc3Mgb2YgQUxMT0NfSVRFTSBmcm9tIHVzZXIgaXRlbSAqLworCS8qCisJICogbm90ZTogdGhlIGFsaWdubWVudCBvZiAicHRyIiB0byBBTExPQ19TSVpFIGlzIGNoZWNrZWQKKwkgKiBhYm92ZTsgdGhlICJ2b2lkICoiIGdldHMgdXMgcmlkIG9mIGEgZ2NjIDIuOTUgd2FybmluZworCSAqLworCSpscHAgPSAobHAgPSBwdHIgLSBBTExPQ19TSVpFKTsKKwkvKiBzZWFyY2ggZm9yIGFsbG9jYXRpb24gaXRlbSBpbiBncm91cCBsaXN0ICovCisJd2hpbGUgKGFwLT5uZXh0ICE9IGxwKQorCQlpZiAoKGFwID0gYXAtPm5leHQpID09IE5VTEwpIHsKKyNpZm5kZWYgTUtTSF9TTUFMTAorIGZhaWw6CisjZW5kaWYKKwkJCWludGVybmFsX2Vycm9yZigicm9ndWUgcG9pbnRlciAlcCIsIHB0cik7CisJCX0KKwlyZXR1cm4gKGFwKTsKK30KKwordm9pZCAqCithcmVzaXplKHZvaWQgKnB0ciwgc2l6ZV90IG51bWIsIEFyZWEgKmFwKQoreworCUFMTE9DX0lURU0gKmxwID0gTlVMTDsKKworCS8qIHJlc2l6aW5nICh0cnVlKSBvciBuZXdseSBhbGxvY2F0aW5nPyAqLworCWlmIChwdHIgIT0gTlVMTCkgeworCQlBTExPQ19JVEVNICpwcDsKKworCQlwcCA9IGZpbmRwdHIoJmxwLCBwdHIsIGFwKTsKKwkJcHAtPm5leHQgPSBscC0+bmV4dDsKKwl9CisKKwlpZiAoKG51bWIgPj0gU0laRV9NQVggLSBBTExPQ19TSVpFKSB8fAorCSAgICAobHAgPSByZW1hbGxvYyhscCwgbnVtYiArIEFMTE9DX1NJWkUpKSA9PSBOVUxMCisjaWZuZGVmIE1LU0hfU01BTEwKKwkgICAgfHwgQUxMT0NfSVNVTkFMSUdORUQobHApCisjZW5kaWYKKwkgICAgKQorCQlpbnRlcm5hbF9lcnJvcmYoImNhbm5vdCBhbGxvY2F0ZSAlbHUgZGF0YSBieXRlcyIsCisJCSAgICAodW5zaWduZWQgbG9uZyludW1iKTsKKwkvKiB0aGlzIG9ubHkgd29ya3MgYmVjYXVzZSBBcmVhIGlzIGFuIEFMTE9DX0lURU0gKi8KKwlscC0+bmV4dCA9IGFwLT5uZXh0OworCWFwLT5uZXh0ID0gbHA7CisJLyogcmV0dXJuIHVzZXIgaXRlbSBhZGRyZXNzICovCisJcmV0dXJuICgoY2hhciAqKWxwICsgQUxMT0NfU0laRSk7Cit9CisKK3ZvaWQKK2FmcmVlKHZvaWQgKnB0ciwgQXJlYSAqYXApCit7CisJaWYgKHB0ciAhPSBOVUxMKSB7CisJCUFMTE9DX0lURU0gKmxwLCAqcHA7CisKKwkJcHAgPSBmaW5kcHRyKCZscCwgcHRyLCBhcCk7CisJCS8qIHVuaG9vayAqLworCQlwcC0+bmV4dCA9IGxwLT5uZXh0OworCQkvKiBub3cgZnJlZSBBTExPQ19JVEVNICovCisJCWZyZWUobHApOworCX0KK30KKwordm9pZAorYWZyZWVhbGwoQXJlYSAqYXApCit7CisJQUxMT0NfSVRFTSAqbHA7CisKKwkvKiB0cmF2ZXJzZSBncm91cCAobGlua2VkIGxpc3QpICovCisJd2hpbGUgKChscCA9IGFwLT5uZXh0KSAhPSBOVUxMKSB7CisJCS8qIG1ha2UgbmV4dCBBTExPQ19JVEVNIGhlYWQgb2YgbGlzdCAqLworCQlhcC0+bmV4dCA9IGxwLT5uZXh0OworCQkvKiBmcmVlIG9sZCBoZWFkICovCisJCWZyZWUobHApOworCX0KK30KZGlmZiAtLWdpdCBhL21rc2gvc3JjL2xleC5jIGIvbWtzaC9zcmMvbGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyMTllNwotLS0gL2Rldi9udWxsCisrKyBiL21rc2gvc3JjL2xleC5jCkBAIC0wLDAgKzEsMTc4MiBAQAorLyoJJE9wZW5CU0Q6IGxleC5jLHYgMS40NCAyMDA4LzA3LzAzIDE3OjUyOjA4IG90dG8gRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpbmNsdWRlICJzaC5oIgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC9sZXguYyx2IDEuMTE4IDIwMTAvMDcvMjUgMTE6MzU6NDEgdGcgRXhwICQiKTsKKworLyoKKyAqIHN0YXRlcyB3aGlsZSBsZXhpbmcgd29yZAorICovCisjZGVmaW5lIFNCQVNFCQkwCS8qIG91dHNpZGUgYW55IGxleGljYWwgY29uc3RydWN0cyAqLworI2RlZmluZSBTV09SRAkJMQkvKiBpbXBsaWNpdCBxdW90aW5nIGZvciBzdWJzdGl0dXRlKCkgKi8KKyNkZWZpbmUgU0xFVFBBUkVOCTIJLyogaW5zaWRlICgoICkpLCBpbXBsaWNpdCBxdW90aW5nICovCisjZGVmaW5lIFNTUVVPVEUJCTMJLyogaW5zaWRlICcnICovCisjZGVmaW5lIFNEUVVPVEUJCTQJLyogaW5zaWRlICIiICovCisjZGVmaW5lIFNFUVVPVEUJCTUJLyogaW5zaWRlICQnJyAqLworI2RlZmluZSBTQlJBQ0UJCTYJLyogaW5zaWRlICR7fSAqLworI2RlZmluZSBTUUJSQUNFCQk3CS8qIGluc2lkZSAiJHt9IiAqLworI2RlZmluZSBTQ1NQQVJFTgk4CS8qIGluc2lkZSAkKCkgKi8KKyNkZWZpbmUgU0JRVU9URQkJOQkvKiBpbnNpZGUgYGAgKi8KKyNkZWZpbmUgU0FTUEFSRU4JMTAJLyogaW5zaWRlICQoKCApKSAqLworI2RlZmluZSBTSEVSRURFTElNCTExCS8qIHBhcnNpbmcgPDwsPDwtIGRlbGltaXRlciAqLworI2RlZmluZSBTSEVSRURRVU9URQkxMgkvKiBwYXJzaW5nICIgaW4gPDwsPDwtIGRlbGltaXRlciAqLworI2RlZmluZSBTUEFUVEVSTgkxMwkvKiBwYXJzaW5nICooLi4ufC4uLikgcGF0dGVybiAoKis/QCEpICovCisjZGVmaW5lIFNUQlJBQ0UJCTE0CS8qIHBhcnNpbmcgJHsuLi5bIyVdLi4ufSAqLworI2RlZmluZSBTTEVUQVJSQVkJMTUJLyogaW5zaWRlID0oICksIGp1c3QgY29weSAqLworI2RlZmluZSBTQURFTElNCQkxNgkvKiBsaWtlIFNCQVNFLCBsb29raW5nIGZvciBkZWxpbWl0ZXIgKi8KKyNkZWZpbmUgU0hFUkVTVFJJTkcJMTcJLyogcGFyc2luZyA8PDwgc3RyaW5nICovCisKKy8qIFN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIHRoZSBsZXhpbmcgc3RhdGUgYW5kIHRoZSB2YXJpb3VzIHBpZWNlcyBvZiBpbmZvCisgKiBuZWVkZWQgZm9yIGVhY2ggcGFydGljdWxhciBzdGF0ZS4gKi8KK3R5cGVkZWYgc3RydWN0IGxleF9zdGF0ZSBMZXhfc3RhdGU7CitzdHJ1Y3QgbGV4X3N0YXRlIHsKKwlpbnQgbHNfc3RhdGU7CisJdW5pb24geworCQkvKiAkKC4uLikgKi8KKwkJc3RydWN0IHNjc3BhcmVuX2luZm8geworCQkJaW50IG5wYXJlbjsJLyogY291bnQgb3BlbiBwYXJlbnRoZXNpcyAqLworCQkJaW50IGNzc3RhdGU7CS8qIFhYWCByZW1vdmUgKi8KKyNkZWZpbmUgbHNfc2NzcGFyZW4gbHNfaW5mby51X3Njc3BhcmVuCisJCX0gdV9zY3NwYXJlbjsKKworCQkvKiAkKCguLi4pKSAqLworCQlzdHJ1Y3Qgc2FzcGFyZW5faW5mbyB7CisJCQlpbnQgbnBhcmVuOwkvKiBjb3VudCBvcGVuIHBhcmVudGhlc2lzICovCisJCQlpbnQgc3RhcnQ7CS8qIG1hcmtzIHN0YXJ0IG9mICQoKCBpbiBvdXRwdXQgc3RyICovCisjZGVmaW5lIGxzX3Nhc3BhcmVuIGxzX2luZm8udV9zYXNwYXJlbgorCQl9IHVfc2FzcGFyZW47CisKKwkJLyogKCguLi4pKSAqLworCQlzdHJ1Y3Qgc2xldHBhcmVuX2luZm8geworCQkJaW50IG5wYXJlbjsJLyogY291bnQgb3BlbiBwYXJlbnRoZXNpcyAqLworI2RlZmluZSBsc19zbGV0cGFyZW4gbHNfaW5mby51X3NsZXRwYXJlbgorCQl9IHVfc2xldHBhcmVuOworCisJCS8qIGAuLi5gICovCisJCXN0cnVjdCBzYnF1b3RlX2luZm8geworCQkJaW50IGluZHF1b3RlczsJLyogdHJ1ZSBpZiBpbiBkb3VibGUgcXVvdGVzOiAiYC4uLmAiICovCisjZGVmaW5lIGxzX3NicXVvdGUgbHNfaW5mby51X3NicXVvdGUKKwkJfSB1X3NicXVvdGU7CisKKyNpZm5kZWYgTUtTSF9TTUFMTAorCQkvKiA9KC4uLikgKi8KKwkJc3RydWN0IHNsZXRhcnJheV9pbmZvIHsKKwkJCWludCBucGFyZW47CS8qIGNvdW50IG9wZW4gcGFyZW50aGVzZXMgKi8KKyNkZWZpbmUgbHNfc2xldGFycmF5IGxzX2luZm8udV9zbGV0YXJyYXkKKwkJfSB1X3NsZXRhcnJheTsKKyNlbmRpZgorCisJCS8qIEFERUxJTSAqLworCQlzdHJ1Y3Qgc2FkZWxpbV9pbmZvIHsKKwkJCXVuc2lnbmVkIGNoYXIgbnBhcmVuOwkvKiBjb3VudCBvcGVuIHBhcmVudGhlc2VzICovCisjZGVmaW5lIFNBREVMSU1fQkFTSAkwCisjZGVmaW5lIFNBREVMSU1fTUFLRQkxCisJCQl1bnNpZ25lZCBjaGFyIHN0eWxlOworCQkJdW5zaWduZWQgY2hhciBkZWxpbWl0ZXI7CisJCQl1bnNpZ25lZCBjaGFyIG51bTsKKwkJCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CS8qIG9mcy4gaW50byBzYWRlbGltX2ZsYWdzW10gKi8KKyNkZWZpbmUgbHNfc2FkZWxpbSBsc19pbmZvLnVfc2FkZWxpbQorCQl9IHVfc2FkZWxpbTsKKworCQkvKiAkJy4uLicgKi8KKwkJc3RydWN0IHNlcXVvdGVfaW5mbyB7CisJCQlib29sIGdvdF9OVUw7CS8qIGlnbm9yZSByZXN0IG9mIHN0cmluZyAqLworI2RlZmluZSBsc19zZXF1b3RlIGxzX2luZm8udV9zZXF1b3RlCisJCX0gdV9zZXF1b3RlOworCisJCUxleF9zdGF0ZSAqYmFzZTsJLyogdXNlZCB0byBwb2ludCB0byBuZXh0IHN0YXRlIGJsb2NrICovCisJfSBsc19pbmZvOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUxleF9zdGF0ZSAqYmFzZTsKKwlMZXhfc3RhdGUgKmVuZDsKK30gU3RhdGVfaW5mbzsKKworc3RhdGljIHZvaWQgcmVhZGhlcmUoc3RydWN0IGlvd29yZCAqKTsKK3N0YXRpYyBpbnQgZ2V0c2NfXyh2b2lkKTsKK3N0YXRpYyB2b2lkIGdldHNjX2xpbmUoU291cmNlICopOworc3RhdGljIGludCBnZXRzY19ibih2b2lkKTsKK3N0YXRpYyBpbnQgc19nZXQodm9pZCk7CitzdGF0aWMgdm9pZCBzX3B1dChpbnQpOworc3RhdGljIGNoYXIgKmdldF9icmFjZV92YXIoWFN0cmluZyAqLCBjaGFyICopOworc3RhdGljIGludCBhcnJheXN1YihjaGFyICoqKTsKK3N0YXRpYyBjb25zdCBjaGFyICp1bmdldHNjKGludCk7CitzdGF0aWMgdm9pZCBnZXRoZXJlKGJvb2wpOworc3RhdGljIExleF9zdGF0ZSAqcHVzaF9zdGF0ZV8oU3RhdGVfaW5mbyAqLCBMZXhfc3RhdGUgKik7CitzdGF0aWMgTGV4X3N0YXRlICpwb3Bfc3RhdGVfKFN0YXRlX2luZm8gKiwgTGV4X3N0YXRlICopOworCitzdGF0aWMgaW50IGRvcHByb21wdChjb25zdCBjaGFyICosIGludCwgYm9vbCk7CisKK3N0YXRpYyBpbnQgYmFja3NsYXNoX3NraXA7CitzdGF0aWMgaW50IGlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZTsKKworLyogb3B0aW1pc2VkIGdldHNjX2JuKCkgKi8KKyNkZWZpbmUgX2dldHNjKCkJKCpzb3VyY2UtPnN0ciAhPSAnXDAnICYmICpzb3VyY2UtPnN0ciAhPSAnXFwnIFwKKwkJCSAmJiAhYmFja3NsYXNoX3NraXAgJiYgIShzb3VyY2UtPmZsYWdzICYgU0ZfRklSU1QpIFwKKwkJCSA/ICpzb3VyY2UtPnN0cisrIDogZ2V0c2NfYm4oKSkKKy8qIG9wdGltaXNlZCBnZXRzY19fKCkgKi8KKyNkZWZpbmUJX2dldHNjXygpCSgoKnNvdXJjZS0+c3RyICE9ICdcMCcpICYmICEoc291cmNlLT5mbGFncyAmIFNGX0ZJUlNUKSBcCisJCQkgPyAqc291cmNlLT5zdHIrKyA6IGdldHNjX18oKSkKKworI2lmZGVmIE1LU0hfU01BTEwKK3N0YXRpYyBpbnQgZ2V0c2Modm9pZCk7CitzdGF0aWMgaW50IGdldHNjXyh2b2lkKTsKKworc3RhdGljIGludAorZ2V0c2Modm9pZCkKK3sKKwlyZXR1cm4gKF9nZXRzYygpKTsKK30KKworc3RhdGljIGludAorZ2V0c2NfKHZvaWQpCit7CisJcmV0dXJuIChfZ2V0c2NfKCkpOworfQorI2Vsc2UKKy8qICFNS1NIX1NNQUxMOiB1c2UgdGhlbSBpbmxpbmUgKi8KKyNkZWZpbmUgZ2V0c2MoKQkJX2dldHNjKCkKKyNkZWZpbmUgZ2V0c2NfKCkJX2dldHNjXygpCisjZW5kaWYKKworI2RlZmluZSBTVEFURV9CU0laRQkzMgorCisjZGVmaW5lIFBVU0hfU1RBVEUocykJZG8gewkJCQkJXAorCWlmICgrK3N0YXRlcCA9PSBzdGF0ZV9pbmZvLmVuZCkJCQkJXAorCQlzdGF0ZXAgPSBwdXNoX3N0YXRlXygmc3RhdGVfaW5mbywgc3RhdGVwKTsJXAorCXN0YXRlID0gc3RhdGVwLT5sc19zdGF0ZSA9IChzKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBQT1BfU1RBVEUoKQlkbyB7CQkJCQlcCisJaWYgKC0tc3RhdGVwID09IHN0YXRlX2luZm8uYmFzZSkJCQlcCisJCXN0YXRlcCA9IHBvcF9zdGF0ZV8oJnN0YXRlX2luZm8sIHN0YXRlcCk7CVwKKwlzdGF0ZSA9IHN0YXRlcC0+bHNfc3RhdGU7CQkJCVwKK30gd2hpbGUgKDApCisKKy8qKgorICogTGV4aWNhbCBhbmFseXNlcgorICoKKyAqIHRva2VucyBhcmUgbm90IHJlZ3VsYXIgZXhwcmVzc2lvbnMsIHRoZXkgYXJlIExMKDEpLgorICogZm9yIGV4YW1wbGUsICIke3ZhcjotJHtQV0R9fSIsIGFuZCAiJChzaXplICQod2hlbmNlIGtzaCkpIi4KKyAqIGhlbmNlIHRoZSBzdGF0ZSBzdGFjay4KKyAqLworCitpbnQKK3l5bGV4KGludCBjZikKK3sKKwlMZXhfc3RhdGUgc3RhdGVzW1NUQVRFX0JTSVpFXSwgKnN0YXRlcCwgKnMyLCAqYmFzZTsKKwlTdGF0ZV9pbmZvIHN0YXRlX2luZm87CisJaW50IGMsIGMyLCBzdGF0ZTsKKwlYU3RyaW5nIHdzOwkJLyogZXhwYW5kYWJsZSBvdXRwdXQgd29yZCAqLworCWNoYXIgKndwOwkJLyogb3V0cHV0IHdvcmQgcG9pbnRlciAqLworCWNoYXIgKnNwLCAqZHA7CisKKyBBZ2FpbjoKKwlzdGF0ZXNbMF0ubHNfc3RhdGUgPSAtMTsKKwlzdGF0ZXNbMF0ubHNfaW5mby5iYXNlID0gTlVMTDsKKwlzdGF0ZXAgPSAmc3RhdGVzWzFdOworCXN0YXRlX2luZm8uYmFzZSA9IHN0YXRlczsKKwlzdGF0ZV9pbmZvLmVuZCA9ICZzdGF0ZV9pbmZvLmJhc2VbU1RBVEVfQlNJWkVdOworCisJWGluaXQod3MsIHdwLCA2NCwgQVRFTVApOworCisJYmFja3NsYXNoX3NraXAgPSAwOworCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZSA9IDA7CisKKwlpZiAoY2YmT05FV09SRCkKKwkJc3RhdGUgPSBTV09SRDsKKwllbHNlIGlmIChjZiZMRVRFWFBSKSB7CisJCS8qIGVuY2xvc2UgYXJndW1lbnRzIGluIChkb3VibGUpIHF1b3RlcyAqLworCQkqd3ArKyA9IE9RVU9URTsKKwkJc3RhdGUgPSBTTEVUUEFSRU47CisJCXN0YXRlcC0+bHNfc2xldHBhcmVuLm5wYXJlbiA9IDA7CisjaWZuZGVmIE1LU0hfU01BTEwKKwl9IGVsc2UgaWYgKGNmJkxFVEFSUkFZKSB7CisJCXN0YXRlID0gU0xFVEFSUkFZOworCQlzdGF0ZXAtPmxzX3NsZXRhcnJheS5ucGFyZW4gPSAwOworI2VuZGlmCisJfSBlbHNlIHsJCS8qIG5vcm1hbCBsZXhpbmcgKi8KKwkJc3RhdGUgPSAoY2YgJiBIRVJFREVMSU0pID8gU0hFUkVERUxJTSA6IFNCQVNFOworCQl3aGlsZSAoKGMgPSBnZXRzYygpKSA9PSAnICcgfHwgYyA9PSAnXHQnKQorCQkJOworCQlpZiAoYyA9PSAnIycpIHsKKwkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZSsrOworCQkJd2hpbGUgKChjID0gZ2V0c2MoKSkgIT0gJ1wwJyAmJiBjICE9ICdcbicpCisJCQkJOworCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lLS07CisJCX0KKwkJdW5nZXRzYyhjKTsKKwl9CisJaWYgKHNvdXJjZS0+ZmxhZ3MgJiBTRl9BTElBUykgewkvKiB0cmFpbGluZyAnICcgaW4gYWxpYXMgZGVmaW5pdGlvbiAqLworCQlzb3VyY2UtPmZsYWdzICY9IH5TRl9BTElBUzsKKwkJY2YgfD0gQUxJQVM7CisJfQorCisJLyogSW5pdGlhbCBzdGF0ZTogb25lIG9mIFNCQVNFIFNIRVJFREVMSU0gU1dPUkQgU0FTUEFSRU4gKi8KKwlzdGF0ZXAtPmxzX3N0YXRlID0gc3RhdGU7CisKKwkvKiBjaGVjayBmb3IgaGVyZSBzdHJpbmcgKi8KKwlpZiAoc3RhdGUgPT0gU0hFUkVERUxJTSkgeworCQljID0gZ2V0c2MoKTsKKwkJaWYgKGMgPT0gJzwnKSB7CisJCQlzdGF0ZSA9IFNIRVJFU1RSSU5HOworCQkJd2hpbGUgKChjID0gZ2V0c2MoKSkgPT0gJyAnIHx8IGMgPT0gJ1x0JykKKwkJCQk7CisJCQl1bmdldHNjKGMpOworCQkJYyA9ICc8JzsKKwkJCWdvdG8gYWNjZXB0X25vbndvcmQ7CisJCX0KKwkJdW5nZXRzYyhjKTsKKwl9CisKKwkvKiBjb2xsZWN0IG5vbi1zcGVjaWFsIG9yIHF1b3RlZCBjaGFyYWN0ZXJzIHRvIGZvcm0gd29yZCAqLworCXdoaWxlICghKChjID0gZ2V0c2MoKSkgPT0gMCB8fAorCSAgICAoKHN0YXRlID09IFNCQVNFIHx8IHN0YXRlID09IFNIRVJFREVMSU0gfHwgc3RhdGUgPT0gU0hFUkVTVFJJTkcpICYmCisJICAgIGN0eXBlKGMsIENfTEVYMSkpKSkgeworIGFjY2VwdF9ub253b3JkOgorCQlYY2hlY2sod3MsIHdwKTsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFNBREVMSU06CisJCQlpZiAoYyA9PSAnKCcpCisJCQkJc3RhdGVwLT5sc19zYWRlbGltLm5wYXJlbisrOworCQkJZWxzZSBpZiAoYyA9PSAnKScpCisJCQkJc3RhdGVwLT5sc19zYWRlbGltLm5wYXJlbi0tOworCQkJZWxzZSBpZiAoc3RhdGVwLT5sc19zYWRlbGltLm5wYXJlbiA9PSAwICYmCisJCQkgICAgKGMgPT0gLyp7Ki8gJ30nIHx8IGMgPT0gc3RhdGVwLT5sc19zYWRlbGltLmRlbGltaXRlcikpIHsKKwkJCQkqd3ArKyA9IEFERUxJTTsKKwkJCQkqd3ArKyA9IGM7CisJCQkJaWYgKGMgPT0gLyp7Ki8gJ30nIHx8IC0tc3RhdGVwLT5sc19zYWRlbGltLm51bSA9PSAwKQorCQkJCQlQT1BfU1RBVEUoKTsKKwkJCQlpZiAoYyA9PSAvKnsqLyAnfScpCisJCQkJCVBPUF9TVEFURSgpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBTQkFTRToKKwkJCWlmIChjID09ICdbJyAmJiAoY2YgJiAoVkFSQVNOfEFSUkFZVkFSKSkpIHsKKwkJCQkqd3AgPSBFT1M7CS8qIHRlbXBvcmFyeSAqLworCQkJCWlmIChpc193ZHZhcm5hbWUoWHN0cmluZyh3cywgd3ApLCBmYWxzZSkpIHsKKwkJCQkJY2hhciAqcCwgKnRtcDsKKworCQkJCQlpZiAoYXJyYXlzdWIoJnRtcCkpIHsKKwkJCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkJCSp3cCsrID0gYzsKKwkJCQkJCWZvciAocCA9IHRtcDsgKnA7ICkgeworCQkJCQkJCVhjaGVjayh3cywgd3ApOworCQkJCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkJCQkqd3ArKyA9ICpwKys7CisJCQkJCQl9CisJCQkJCQlhZnJlZSh0bXAsIEFURU1QKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9IGVsc2UgeworCQkJCQkJU291cmNlICpzOworCisJCQkJCQlzID0gcHVzaHMoU1JFUkVBRCwKKwkJCQkJCSAgICBzb3VyY2UtPmFyZWFwKTsKKwkJCQkJCXMtPnN0YXJ0ID0gcy0+c3RyID0KKwkJCQkJCSAgICBzLT51LmZyZWVtZSA9IHRtcDsKKwkJCQkJCXMtPm5leHQgPSBzb3VyY2U7CisJCQkJCQlzb3VyY2UgPSBzOworCQkJCQl9CisJCQkJfQorCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkqd3ArKyA9IGM7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBGQUxMVEhST1VHSCAqLworIFNiYXNlMToJCS8qIGluY2x1ZGVzICooLi4ufC4uLikgcGF0dGVybiAoKis/QCEpICovCisJCQlpZiAoYyA9PSAnKicgfHwgYyA9PSAnQCcgfHwgYyA9PSAnKycgfHwgYyA9PSAnPycgfHwKKwkJCSAgICBjID09ICchJykgeworCQkJCWMyID0gZ2V0c2MoKTsKKwkJCQlpZiAoYzIgPT0gJygnIC8qKSovICkgeworCQkJCQkqd3ArKyA9IE9QQVQ7CisJCQkJCSp3cCsrID0gYzsKKwkJCQkJUFVTSF9TVEFURShTUEFUVEVSTik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQl1bmdldHNjKGMyKTsKKwkJCX0KKwkJCS8qIEZBTExUSFJPVUdIICovCisgU2Jhc2UyOgkJLyogZG9lc24ndCBpbmNsdWRlICooLi4ufC4uLikgcGF0dGVybiAoKis/QCEpICovCisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJ1xcJzoKKyBnZXRzY19xY2hhcjoKKwkJCQlpZiAoKGMgPSBnZXRzYygpKSkgeworCQkJCQkvKiB0cmFpbGluZyBcIGlzIGxvc3QgKi8KKwkJCQkJKndwKysgPSBRQ0hBUjsKKwkJCQkJKndwKysgPSBjOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ1wnJzoKKyBvcGVuX3NzcXVvdGU6CisJCQkJKndwKysgPSBPUVVPVEU7CisJCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKys7CisJCQkJUFVTSF9TVEFURShTU1FVT1RFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyInOgorIG9wZW5fc2RxdW90ZToKKwkJCQkqd3ArKyA9IE9RVU9URTsKKwkJCQlQVVNIX1NUQVRFKFNEUVVPVEUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIFN1YnN0OworCQkJfQorCQkJYnJlYWs7CisKKyBTdWJzdDoKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnXFwnOgorCQkJCWMgPSBnZXRzYygpOworCQkJCXN3aXRjaCAoYykgeworCQkJCWNhc2UgJyInOgorCQkJCQlpZiAoKGNmICYgSEVSRURPQykpCisJCQkJCQlnb3RvIGhlcmVkb2NxdW90ZTsKKwkJCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJCQljYXNlICdcXCc6CisJCQkJY2FzZSAnJCc6IGNhc2UgJ2AnOgorIHN0b3JlX3FjaGFyOgorCQkJCQkqd3ArKyA9IFFDSEFSOworCQkJCQkqd3ArKyA9IGM7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisgaGVyZWRvY3F1b3RlOgorCQkJCQlYY2hlY2sod3MsIHdwKTsKKwkJCQkJaWYgKGMpIHsKKwkJCQkJCS8qIHRyYWlsaW5nIFwgaXMgbG9zdCAqLworCQkJCQkJKndwKysgPSBDSEFSOworCQkJCQkJKndwKysgPSAnXFwnOworCQkJCQkJKndwKysgPSBDSEFSOworCQkJCQkJKndwKysgPSBjOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJyQnOgorIHN1YnN0X2RvbGxhcjoKKwkJCQljID0gZ2V0c2MoKTsKKwkJCQlpZiAoYyA9PSAnKCcpIC8qKSovIHsKKwkJCQkJYyA9IGdldHNjKCk7CisJCQkJCWlmIChjID09ICcoJykgLyopKi8geworCQkJCQkJUFVTSF9TVEFURShTQVNQQVJFTik7CisJCQkJCQlzdGF0ZXAtPmxzX3Nhc3BhcmVuLm5wYXJlbiA9IDI7CisJCQkJCQlzdGF0ZXAtPmxzX3Nhc3BhcmVuLnN0YXJ0ID0KKwkJCQkJCSAgICBYc2F2ZXBvcyh3cywgd3ApOworCQkJCQkJKndwKysgPSBFWFBSU1VCOworCQkJCQl9IGVsc2UgeworCQkJCQkJdW5nZXRzYyhjKTsKKwkJCQkJCVBVU0hfU1RBVEUoU0NTUEFSRU4pOworCQkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5ucGFyZW4gPSAxOworCQkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gMDsKKwkJCQkJCSp3cCsrID0gQ09NU1VCOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChjID09ICd7JykgLyp9Ki8geworCQkJCQkqd3ArKyA9IE9TVUJTVDsKKwkJCQkJKndwKysgPSAneyc7IC8qfSovCisJCQkJCXdwID0gZ2V0X2JyYWNlX3Zhcigmd3MsIHdwKTsKKwkJCQkJYyA9IGdldHNjKCk7CisJCQkJCS8qIGFsbG93IDojIGFuZCA6JSAoa3NoODggY29tcGF0KSAqLworCQkJCQlpZiAoYyA9PSAnOicpIHsKKwkJCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkJCSp3cCsrID0gYzsKKwkJCQkJCWMgPSBnZXRzYygpOworCQkJCQkJaWYgKGMgPT0gJzonKSB7CisJCQkJCQkJKndwKysgPSBDSEFSOworCQkJCQkJCSp3cCsrID0gJzAnOworCQkJCQkJCSp3cCsrID0gQURFTElNOworCQkJCQkJCSp3cCsrID0gJzonOworCQkJCQkJCVBVU0hfU1RBVEUoU0JSQUNFKTsKKwkJCQkJCQlQVVNIX1NUQVRFKFNBREVMSU0pOworCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5zdHlsZSA9IFNBREVMSU1fQkFTSDsKKwkJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0uZGVsaW1pdGVyID0gJzonOworCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5udW0gPSAxOworCQkJCQkJCXN0YXRlcC0+bHNfc2FkZWxpbS5ucGFyZW4gPSAwOworCQkJCQkJCWJyZWFrOworCQkJCQkJfSBlbHNlIGlmIChrc2hfaXNkaWdpdChjKSB8fAorCQkJCQkJICAgIGMgPT0gJygnLyopKi8gfHwgYyA9PSAnICcgfHwKKwkJCQkJCSAgICBjID09ICckJyAvKiBYWFggd2hhdCBlbHNlPyAqLykgeworCQkJCQkJCS8qIHN1YnN0cmluZyBzdWJzdC4gKi8KKwkJCQkJCQlpZiAoYyAhPSAnICcpIHsKKwkJCQkJCQkJKndwKysgPSBDSEFSOworCQkJCQkJCQkqd3ArKyA9ICcgJzsKKwkJCQkJCQl9CisJCQkJCQkJdW5nZXRzYyhjKTsKKwkJCQkJCQlQVVNIX1NUQVRFKFNCUkFDRSk7CisJCQkJCQkJUFVTSF9TVEFURShTQURFTElNKTsKKwkJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0uc3R5bGUgPSBTQURFTElNX0JBU0g7CisJCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLmRlbGltaXRlciA9ICc6JzsKKwkJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0ubnVtID0gMjsKKwkJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0ubnBhcmVuID0gMDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmIChjID09ICcvJykgeworCQkJCQkJKndwKysgPSBDSEFSOworCQkJCQkJKndwKysgPSBjOworCQkJCQkJaWYgKChjID0gZ2V0c2MoKSkgPT0gJy8nKSB7CisJCQkJCQkJKndwKysgPSBBREVMSU07CisJCQkJCQkJKndwKysgPSBjOworCQkJCQkJfSBlbHNlCisJCQkJCQkJdW5nZXRzYyhjKTsKKwkJCQkJCVBVU0hfU1RBVEUoU0JSQUNFKTsKKwkJCQkJCVBVU0hfU1RBVEUoU0FERUxJTSk7CisJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0uc3R5bGUgPSBTQURFTElNX0JBU0g7CisJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0uZGVsaW1pdGVyID0gJy8nOworCQkJCQkJc3RhdGVwLT5sc19zYWRlbGltLm51bSA9IDE7CisJCQkJCQlzdGF0ZXAtPmxzX3NhZGVsaW0ubnBhcmVuID0gMDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8qIElmIHRoaXMgaXMgYSB0cmltIG9wZXJhdGlvbiwKKwkJCQkJICogdHJlYXQgKCx8LCkgc3BlY2lhbGx5IGluIFNUQlJBQ0UuCisJCQkJCSAqLworCQkJCQlpZiAoY3R5cGUoYywgQ19TVUJPUDIpKSB7CisJCQkJCQl1bmdldHNjKGMpOworCQkJCQkJUFVTSF9TVEFURShTVEJSQUNFKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXVuZ2V0c2MoYyk7CisJCQkJCQlpZiAoc3RhdGUgPT0gU0RRVU9URSkKKwkJCQkJCQlQVVNIX1NUQVRFKFNRQlJBQ0UpOworCQkJCQkJZWxzZQorCQkJCQkJCVBVU0hfU1RBVEUoU0JSQUNFKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoa3NoX2lzYWxwaHgoYykpIHsKKwkJCQkJKndwKysgPSBPU1VCU1Q7CisJCQkJCSp3cCsrID0gJ1gnOworCQkJCQlkbyB7CisJCQkJCQlYY2hlY2sod3MsIHdwKTsKKwkJCQkJCSp3cCsrID0gYzsKKwkJCQkJCWMgPSBnZXRzYygpOworCQkJCQl9IHdoaWxlIChrc2hfaXNhbG51eChjKSk7CisJCQkJCSp3cCsrID0gJ1wwJzsKKwkJCQkJKndwKysgPSBDU1VCU1Q7CisJCQkJCSp3cCsrID0gJ1gnOworCQkJCQl1bmdldHNjKGMpOworCQkJCX0gZWxzZSBpZiAoY3R5cGUoYywgQ19WQVIxIHwgQ19ESUdJVCkpIHsKKwkJCQkJWGNoZWNrKHdzLCB3cCk7CisJCQkJCSp3cCsrID0gT1NVQlNUOworCQkJCQkqd3ArKyA9ICdYJzsKKwkJCQkJKndwKysgPSBjOworCQkJCQkqd3ArKyA9ICdcMCc7CisJCQkJCSp3cCsrID0gQ1NVQlNUOworCQkJCQkqd3ArKyA9ICdYJzsKKwkJCQl9IGVsc2UgaWYgKGMgPT0gJ1wnJyAmJiAoc3RhdGUgPT0gU0JBU0UpKSB7CisJCQkJCS8qIFhYWCB3aGljaCBvdGhlciBzdGF0ZXMgYXJlIHZhbGlkPyAqLworCQkJCQkqd3ArKyA9IE9RVU9URTsKKwkJCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKys7CisJCQkJCVBVU0hfU1RBVEUoU0VRVU9URSk7CisJCQkJCXN0YXRlcC0+bHNfc2VxdW90ZS5nb3RfTlVMID0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkJKndwKysgPSAnJCc7CisJCQkJCXVuZ2V0c2MoYyk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnYCc6Cisgc3Vic3RfZ3JhdmlzOgorCQkJCVBVU0hfU1RBVEUoU0JRVU9URSk7CisJCQkJKndwKysgPSBDT01TVUI7CisJCQkJLyogTmVlZCB0byBrbm93IGlmIHdlIGFyZSBpbnNpZGUgZG91YmxlIHF1b3RlcworCQkJCSAqIHNpbmNlIHNoL0FUJlQta3NoIHRyYW5zbGF0ZSB0aGUgXCIgdG8gIiBpbgorCQkJCSAqICJgLi4uXCIuLi5gIi4KKwkJCQkgKiBUaGlzIGlzIG5vdCBkb25lIGluIFBPU0lYIG1vZGUgKHNlY3Rpb24KKwkJCQkgKiAzLjIuMywgRG91YmxlIFF1b3RlczogIlRoZSBiYWNrcXVvdGUgc2hhbGwKKwkJCQkgKiByZXRhaW4gaXRzIHNwZWNpYWwgbWVhbmluZyBpbnRyb2R1Y2luZyB0aGUKKwkJCQkgKiBvdGhlciBmb3JtIG9mIGNvbW1hbmQgc3Vic3RpdHV0aW9uIChzZWUKKwkJCQkgKiAzLjYuMykuIFRoZSBwb3J0aW9uIG9mIHRoZSBxdW90ZWQgc3RyaW5nCisJCQkJICogZnJvbSB0aGUgaW5pdGlhbCBiYWNrcXVvdGUgYW5kIHRoZQorCQkJCSAqIGNoYXJhY3RlcnMgdXAgdG8gdGhlIG5leHQgYmFja3F1b3RlIHRoYXQKKwkJCQkgKiBpcyBub3QgcHJlY2VkZWQgYnkgYSBiYWNrc2xhc2ggKGhhdmluZworCQkJCSAqIGVzY2FwZSBjaGFyYWN0ZXJzIHJlbW92ZWQpIGRlZmluZXMgdGhhdAorCQkJCSAqIGNvbW1hbmQgd2hvc2Ugb3V0cHV0IHJlcGxhY2VzIGAuLi5gIHdoZW4KKwkJCQkgKiB0aGUgd29yZCBpcyBleHBhbmRlZC4iCisJCQkJICogU2VjdGlvbiAzLjYuMywgQ29tbWFuZCBTdWJzdGl0dXRpb246CisJCQkJICogIldpdGhpbiB0aGUgYmFja3F1b3RlZCBzdHlsZSBvZiBjb21tYW5kCisJCQkJICogc3Vic3RpdHV0aW9uLCBiYWNrc2xhc2ggc2hhbGwgcmV0YWluIGl0cworCQkJCSAqIGxpdGVyYWwgbWVhbmluZywgZXhjZXB0IHdoZW4gZm9sbG93ZWQgYnkKKwkJCQkgKiAkIGAgXC4iKS4KKwkJCQkgKi8KKwkJCQlzdGF0ZXAtPmxzX3NicXVvdGUuaW5kcXVvdGVzID0gMDsKKwkJCQlzMiA9IHN0YXRlcDsKKwkJCQliYXNlID0gc3RhdGVfaW5mby5iYXNlOworCQkJCXdoaWxlICgxKSB7CisJCQkJCWZvciAoOyBzMiAhPSBiYXNlOyBzMi0tKSB7CisJCQkJCQlpZiAoczItPmxzX3N0YXRlID09IFNEUVVPVEUpIHsKKwkJCQkJCQlzdGF0ZXAtPmxzX3NicXVvdGUuaW5kcXVvdGVzID0gMTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoczIgIT0gYmFzZSkKKwkJCQkJCWJyZWFrOworCQkJCQlpZiAoIShzMiA9IHMyLT5sc19pbmZvLmJhc2UpKQorCQkJCQkJYnJlYWs7CisJCQkJCWJhc2UgPSBzMi0tIC0gU1RBVEVfQlNJWkU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBRQ0hBUjoKKwkJCQlpZiAoY2YgJiBMUUNIQVIpIHsKKwkJCQkJKndwKysgPSBRQ0hBUjsKKwkJCQkJKndwKysgPSBnZXRzYygpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJCWRlZmF1bHQ6Cisgc3RvcmVfY2hhcjoKKwkJCQkqd3ArKyA9IENIQVI7CisJCQkJKndwKysgPSBjOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFVT1RFOgorCQkJaWYgKGMgPT0gJ1wnJykgeworCQkJCVBPUF9TVEFURSgpOworCQkJCSp3cCsrID0gQ1FVT1RFOworCQkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZS0tOworCQkJfSBlbHNlIGlmIChjID09ICdcXCcpIHsKKwkJCQlpZiAoKGMyID0gdW5ia3NsKHRydWUsIHNfZ2V0LCBzX3B1dCkpID09IC0xKQorCQkJCQljMiA9IHNfZ2V0KCk7CisJCQkJaWYgKGMyID09IDApCisJCQkJCXN0YXRlcC0+bHNfc2VxdW90ZS5nb3RfTlVMID0gdHJ1ZTsKKwkJCQlpZiAoIXN0YXRlcC0+bHNfc2VxdW90ZS5nb3RfTlVMKSB7CisJCQkJCWNoYXIgdHNbNF07CisKKwkJCQkJaWYgKCh1bnNpZ25lZCBpbnQpYzIgPCAweDEwMCkgeworCQkJCQkJKndwKysgPSBRQ0hBUjsKKwkJCQkJCSp3cCsrID0gYzI7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljID0gdXRmX3djdG9tYih0cywgYzIgLSAweDEwMCk7CisJCQkJCQl0c1tjXSA9IDA7CisJCQkJCQlmb3IgKGMgPSAwOyB0c1tjXTsgKytjKSB7CisJCQkJCQkJKndwKysgPSBRQ0hBUjsKKwkJCQkJCQkqd3ArKyA9IHRzW2NdOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmICghc3RhdGVwLT5sc19zZXF1b3RlLmdvdF9OVUwpIHsKKwkJCQkqd3ArKyA9IFFDSEFSOworCQkJCSp3cCsrID0gYzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NRVU9URToKKwkJCWlmIChjID09ICdcJycpIHsKKwkJCQlQT1BfU1RBVEUoKTsKKwkJCQkqd3ArKyA9IENRVU9URTsKKwkJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUtLTsKKwkJCX0gZWxzZSB7CisJCQkJKndwKysgPSBRQ0hBUjsKKwkJCQkqd3ArKyA9IGM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNEUVVPVEU6CisJCQlpZiAoYyA9PSAnIicpIHsKKwkJCQlQT1BfU1RBVEUoKTsKKwkJCQkqd3ArKyA9IENRVU9URTsKKwkJCX0gZWxzZQorCQkJCWdvdG8gU3Vic3Q7CisJCQlicmVhazsKKworCQljYXNlIFNDU1BBUkVOOgkvKiAkKCAuLi4gKSAqLworCQkJLyogdG9kbzogZGVhbCB3aXRoICQoLi4uKSBxdW90aW5nIHByb3Blcmx5CisJCQkgKiBrbHVkZ2UgdG8gcGFydGx5IGZha2UgcXVvdGluZyBpbnNpZGUgJCguLi4pOiBkb2Vzbid0CisJCQkgKiByZWFsbHkgd29yayBiZWNhdXNlIG5lc3RlZCAkKC4uLikgb3IgJHsuLi59IGluc2lkZQorCQkJICogZG91YmxlIHF1b3RlcyBhcmVuJ3QgZGVhbHQgd2l0aC4KKwkJCSAqLworCQkJc3dpdGNoIChzdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGUpIHsKKwkJCWNhc2UgMDoJLyogbm9ybWFsICovCisJCQkJc3dpdGNoIChjKSB7CisJCQkJY2FzZSAnKCc6CisJCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4ubnBhcmVuKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJyknOgorCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLm5wYXJlbi0tOworCQkJCQlicmVhazsKKwkJCQljYXNlICdcXCc6CisJCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJyInOgorCQkJCQlzdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGUgPSAyOworCQkJCQlicmVhazsKKwkJCQljYXNlICdcJyc6CisJCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSA9IDQ7CisJCQkJCWlnbm9yZV9iYWNrc2xhc2hfbmV3bGluZSsrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMToJLyogYmFja3NsYXNoIGluIG5vcm1hbCBtb2RlICovCisJCQljYXNlIDM6CS8qIGJhY2tzbGFzaCBpbiBkb3VibGUgcXVvdGVzICovCisJCQkJLS1zdGF0ZXAtPmxzX3Njc3BhcmVuLmNzc3RhdGU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjoJLyogZG91YmxlIHF1b3RlcyAqLworCQkJCWlmIChjID09ICciJykKKwkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gMDsKKwkJCQllbHNlIGlmIChjID09ICdcXCcpCisJCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSA9IDM7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNDoJLyogc2luZ2xlIHF1b3RlcyAqLworCQkJCWlmIChjID09ICdcJycpIHsKKwkJCQkJc3RhdGVwLT5sc19zY3NwYXJlbi5jc3N0YXRlID0gMDsKKwkJCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lLS07CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHN0YXRlcC0+bHNfc2NzcGFyZW4ubnBhcmVuID09IDApIHsKKwkJCQlQT1BfU1RBVEUoKTsKKwkJCQkqd3ArKyA9IDA7CS8qIGVuZCBvZiBDT01TVUIgKi8KKwkJCX0gZWxzZQorCQkJCSp3cCsrID0gYzsKKwkJCWJyZWFrOworCisJCWNhc2UgU0FTUEFSRU46CS8qICQoKCAuLi4gKSkgKi8KKwkJCS8qIFhYWCBzaG91bGQgbmVzdCB1c2luZyBleGlzdGluZyBzdGF0ZSBtYWNoaW5lCisJCQkgKiAoZW1iZWQgIi4uLiIsICQoLi4uKSwgZXRjLikgKi8KKwkJCWlmIChjID09ICcoJykKKwkJCQlzdGF0ZXAtPmxzX3Nhc3BhcmVuLm5wYXJlbisrOworCQkJZWxzZSBpZiAoYyA9PSAnKScpIHsKKwkJCQlzdGF0ZXAtPmxzX3Nhc3BhcmVuLm5wYXJlbi0tOworCQkJCWlmIChzdGF0ZXAtPmxzX3Nhc3BhcmVuLm5wYXJlbiA9PSAxKSB7CisJCQkJCS8qKCovCisJCQkJCWlmICgoYzIgPSBnZXRzYygpKSA9PSAnKScpIHsKKwkJCQkJCVBPUF9TVEFURSgpOworCQkJCQkJLyogZW5kIG9mIEVYUFJTVUIgKi8KKwkJCQkJCSp3cCsrID0gMDsKKwkJCQkJCWJyZWFrOworCQkJCQl9IGVsc2UgeworCQkJCQkJY2hhciAqczsKKworCQkJCQkJdW5nZXRzYyhjMik7CisJCQkJCQkvKiBtaXNtYXRjaGVkIHBhcmVudGhlc2lzIC0KKwkJCQkJCSAqIGFzc3VtZSB3ZSB3ZXJlIHJlYWxseQorCQkJCQkJICogcGFyc2luZyBhICQoLi4uKSBleHByZXNzaW9uCisJCQkJCQkgKi8KKwkJCQkJCXMgPSBYcmVzdHBvcyh3cywgd3AsCisJCQkJCQkgICAgc3RhdGVwLT5sc19zYXNwYXJlbi5zdGFydCk7CisJCQkJCQltZW1tb3ZlKHMgKyAxLCBzLCB3cCAtIHMpOworCQkJCQkJKnMrKyA9IENPTVNVQjsKKwkJCQkJCSpzID0gJygnOyAvKikqLworCQkJCQkJd3ArKzsKKwkJCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4ubnBhcmVuID0gMTsKKwkJCQkJCXN0YXRlcC0+bHNfc2NzcGFyZW4uY3NzdGF0ZSA9IDA7CisJCQkJCQlzdGF0ZSA9IHN0YXRlcC0+bHNfc3RhdGUgPQorCQkJCQkJICAgIFNDU1BBUkVOOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJKndwKysgPSBjOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUUJSQUNFOgorCQkJaWYgKGMgPT0gJ1xcJykgeworCQkJCS8qCisJCQkJICogcGVyZm9ybSBQT1NJWCAicXVvdGUgcmVtb3ZhbCIgaWYgdGhlIGJhY2stCisJCQkJICogc2xhc2ggaXMgInNwZWNpYWwiLCBpLmUuIHNhbWUgY2FzZXMgYXMgdGhlCisJCQkJICoge2Nhc2UgJ1xcJzp9IGluIFN1YnN0OiBwbHVzIGNsb3NpbmcgYnJhY2U7CisJCQkJICogaW4gbWtzaCBjb2RlICJxdW90ZSByZW1vdmFsIiBvbiAnXGMnIG1lYW5zCisJCQkJICogd3JpdGUgUUNIQVIrYywgb3RoZXJ3aXNlIENIQVIrXCtDSEFSK2MgYXJlCisJCQkJICogZW1pdHRlZCAoaW4gaGVyZWRvY3F1b3RlOikKKwkJCQkgKi8KKwkJCQlpZiAoKGMgPSBnZXRzYygpKSA9PSAnIicgfHwgYyA9PSAnXFwnIHx8CisJCQkJICAgIGMgPT0gJyQnIHx8IGMgPT0gJ2AnIHx8IGMgPT0gLyp7Ki8nfScpCisJCQkJCWdvdG8gc3RvcmVfcWNoYXI7CisJCQkJZ290byBoZXJlZG9jcXVvdGU7CisJCQl9CisJCQlnb3RvIGNvbW1vbl9TUUJSQUNFOworCisJCWNhc2UgU0JSQUNFOgorCQkJaWYgKGMgPT0gJ1wnJykKKwkJCQlnb3RvIG9wZW5fc3NxdW90ZTsKKwkJCWVsc2UgaWYgKGMgPT0gJ1xcJykKKwkJCQlnb3RvIGdldHNjX3FjaGFyOworIGNvbW1vbl9TUUJSQUNFOgorCQkJaWYgKGMgPT0gJyInKQorCQkJCWdvdG8gb3Blbl9zZHF1b3RlOworCQkJZWxzZSBpZiAoYyA9PSAnJCcpCisJCQkJZ290byBzdWJzdF9kb2xsYXI7CisJCQllbHNlIGlmIChjID09ICdgJykKKwkJCQlnb3RvIHN1YnN0X2dyYXZpczsKKwkJCWVsc2UgaWYgKGMgIT0gLyp7Ki8gJ30nKQorCQkJCWdvdG8gc3RvcmVfY2hhcjsKKwkJCVBPUF9TVEFURSgpOworCQkJKndwKysgPSBDU1VCU1Q7CisJCQkqd3ArKyA9IC8qeyovICd9JzsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RCUkFDRToKKwkJCS8qIFNhbWUgYXMgU0JBU0UsIGV4Y2VwdCAoLHwsKSB0cmVhdGVkIHNwZWNpYWxseSAqLworCQkJaWYgKGMgPT0gLyp7Ki8gJ30nKSB7CisJCQkJUE9QX1NUQVRFKCk7CisJCQkJKndwKysgPSBDU1VCU1Q7CisJCQkJKndwKysgPSAvKnsqLyAnfSc7CisJCQl9IGVsc2UgaWYgKGMgPT0gJ3wnKSB7CisJCQkJKndwKysgPSBTUEFUOworCQkJfSBlbHNlIGlmIChjID09ICcoJykgeworCQkJCSp3cCsrID0gT1BBVDsKKwkJCQkqd3ArKyA9ICcgJzsJLyogc2ltaWxlIGZvciBAICovCisJCQkJUFVTSF9TVEFURShTUEFUVEVSTik7CisJCQl9IGVsc2UKKwkJCQlnb3RvIFNiYXNlMTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0JRVU9URToKKwkJCWlmIChjID09ICdgJykgeworCQkJCSp3cCsrID0gMDsKKwkJCQlQT1BfU1RBVEUoKTsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnXFwnKSB7CisJCQkJc3dpdGNoIChjID0gZ2V0c2MoKSkgeworCQkJCWNhc2UgJ1xcJzoKKwkJCQljYXNlICckJzogY2FzZSAnYCc6CisJCQkJCSp3cCsrID0gYzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnIic6CisJCQkJCWlmIChzdGF0ZXAtPmxzX3NicXVvdGUuaW5kcXVvdGVzKSB7CisJCQkJCQkqd3ArKyA9IGM7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJCWRlZmF1bHQ6CisJCQkJCWlmIChjKSB7CisJCQkJCQkvKiB0cmFpbGluZyBcIGlzIGxvc3QgKi8KKwkJCQkJCSp3cCsrID0gJ1xcJzsKKwkJCQkJCSp3cCsrID0gYzsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQkqd3ArKyA9IGM7CisJCQlicmVhazsKKworCQljYXNlIFNXT1JEOgkvKiBPTkVXT1JEICovCisJCQlnb3RvIFN1YnN0OworCisJCWNhc2UgU0xFVFBBUkVOOgkvKiBMRVRFWFBSOiAoKCAuLi4gKSkgKi8KKwkJCS8qKCovCisJCQlpZiAoYyA9PSAnKScpIHsKKwkJCQlpZiAoc3RhdGVwLT5sc19zbGV0cGFyZW4ubnBhcmVuID4gMCkKKwkJCQkJLS1zdGF0ZXAtPmxzX3NsZXRwYXJlbi5ucGFyZW47CisJCQkJZWxzZSBpZiAoKGMyID0gZ2V0c2MoKSkgPT0gLyooKi8gJyknKSB7CisJCQkJCWMgPSAwOworCQkJCQkqd3ArKyA9IENRVU9URTsKKwkJCQkJZ290byBEb25lOworCQkJCX0gZWxzZSB7CisJCQkJCVNvdXJjZSAqczsKKworCQkJCQl1bmdldHNjKGMyKTsKKwkJCQkJLyogbWlzbWF0Y2hlZCBwYXJlbnRoZXNpcyAtCisJCQkJCSAqIGFzc3VtZSB3ZSB3ZXJlIHJlYWxseQorCQkJCQkgKiBwYXJzaW5nIGEgJCguLi4pIGV4cHJlc3Npb24KKwkJCQkJICovCisJCQkJCSp3cCA9IEVPUzsKKwkJCQkJc3AgPSBYc3RyaW5nKHdzLCB3cCk7CisJCQkJCWRwID0gd2RzdHJpcChzcCwgdHJ1ZSwgZmFsc2UpOworCQkJCQlzID0gcHVzaHMoU1JFUkVBRCwgc291cmNlLT5hcmVhcCk7CisJCQkJCXMtPnN0YXJ0ID0gcy0+c3RyID0gcy0+dS5mcmVlbWUgPSBkcDsKKwkJCQkJcy0+bmV4dCA9IHNvdXJjZTsKKwkJCQkJc291cmNlID0gczsKKwkJCQkJcmV0dXJuICgnKCcvKikqLyk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChjID09ICcoJykKKwkJCQkvKiBwYXJlbnRoZXNpcyBpbnNpZGUgcXVvdGVzIGFuZCBiYWNrc2xhc2hlcworCQkJCSAqIGFyZSBsb3N0LCBidXQgQVQmVCBrc2ggZG9lc24ndCBjb3VudCB0aGVtCisJCQkJICogZWl0aGVyCisJCQkJICovCisJCQkJKytzdGF0ZXAtPmxzX3NsZXRwYXJlbi5ucGFyZW47CisJCQlnb3RvIFNiYXNlMjsKKworI2lmbmRlZiBNS1NIX1NNQUxMCisJCWNhc2UgU0xFVEFSUkFZOgkvKiBMRVRBUlJBWTogPSggLi4uICkgKi8KKwkJCWlmIChjID09ICcoJy8qKSovKQorCQkJCSsrc3RhdGVwLT5sc19zbGV0YXJyYXkubnBhcmVuOworCQkJZWxzZSBpZiAoYyA9PSAvKigqLycpJykKKwkJCQlpZiAoc3RhdGVwLT5sc19zbGV0YXJyYXkubnBhcmVuLS0gPT0gMCkgeworCQkJCQljID0gMDsKKwkJCQkJZ290byBEb25lOworCQkJCX0KKwkJCSp3cCsrID0gQ0hBUjsKKwkJCSp3cCsrID0gYzsKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJY2FzZSBTSEVSRVNUUklORzoJLyogPDw8IGRlbGltaXRlciAqLworCQkJaWYgKGMgPT0gJ1xcJykgeworCQkJCWMgPSBnZXRzYygpOworCQkJCWlmIChjKSB7CisJCQkJCS8qIHRyYWlsaW5nIFwgaXMgbG9zdCAqLworCQkJCQkqd3ArKyA9IFFDSEFSOworCQkJCQkqd3ArKyA9IGM7CisJCQkJfQorCQkJCS8qIGludm9rZSBxdW90aW5nIG1vZGUgKi8KKwkJCQlYc3RyaW5nKHdzLCB3cClbMF0gPSBRQ0hBUjsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnJCcpIHsKKwkJCQlpZiAoKGMyID0gZ2V0c2MoKSkgPT0gJ1wnJykgeworCQkJCQlQVVNIX1NUQVRFKFNFUVVPVEUpOworCQkJCQlzdGF0ZXAtPmxzX3NlcXVvdGUuZ290X05VTCA9IGZhbHNlOworCQkJCQlnb3RvIHNoZXJlc3RyaW5nX3F1b3RlZDsKKwkJCQl9CisJCQkJdW5nZXRzYyhjMik7CisJCQkJZ290byBzaGVyZXN0cmluZ19yZWd1bGFyOworCQkJfSBlbHNlIGlmIChjID09ICdcJycpIHsKKwkJCQlQVVNIX1NUQVRFKFNTUVVPVEUpOworIHNoZXJlc3RyaW5nX3F1b3RlZDoKKwkJCQkqd3ArKyA9IE9RVU9URTsKKwkJCQlpZ25vcmVfYmFja3NsYXNoX25ld2xpbmUrKzsKKwkJCQkvKiBpbnZva2UgcXVvdGluZyBtb2RlICovCisJCQkJWHN0cmluZyh3cywgd3ApWzBdID0gUUNIQVI7CisJCQl9IGVsc2UgaWYgKGMgPT0gJyInKSB7CisJCQkJc3RhdGUgPSBzdGF0ZXAtPmxzX3N0YXRlID0gU0hFUkVEUVVPVEU7CisJCQkJKndwKysgPSBPUVVPVEU7CisJCQkJLyoganVzdCBkb24ndCBJRlMgc3BsaXQ7IG5vIHF1b3RpbmcgbW9kZSAqLworCQkJfSBlbHNlIHsKKyBzaGVyZXN0cmluZ19yZWd1bGFyOgorCQkJCSp3cCsrID0gQ0hBUjsKKwkJCQkqd3ArKyA9IGM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNIRVJFREVMSU06CS8qIDw8LDw8LSBkZWxpbWl0ZXIgKi8KKwkJCS8qIFhYWCBjaHVjayB0aGlzIHN0YXRlIChhbmQgdGhlIG5leHQpIC0gdXNlCisJCQkgKiB0aGUgZXhpc3Rpbmcgc3RhdGVzICgkIGFuZCBcYC4uLmAgc2hvdWxkIGJlCisJCQkgKiBzdHJpcHBlZCBvZiB0aGVpciBzcGVjaWFsbmVzcyBhZnRlciB0aGUKKwkJCSAqIGZhY3QpLgorCQkJICovCisJCQkvKiBoZXJlIGRlbGltaXRlcnMgbmVlZCBhIHNwZWNpYWwgY2FzZSBzaW5jZQorCQkJICogJCBhbmQgYC4uLmAgYXJlIG5vdCB0byBiZSB0cmVhdGVkIHNwZWNpYWxseQorCQkJICovCisJCQlpZiAoYyA9PSAnXFwnKSB7CisJCQkJYyA9IGdldHNjKCk7CisJCQkJaWYgKGMpIHsKKwkJCQkJLyogdHJhaWxpbmcgXCBpcyBsb3N0ICovCisJCQkJCSp3cCsrID0gUUNIQVI7CisJCQkJCSp3cCsrID0gYzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGMgPT0gJyQnKSB7CisJCQkJaWYgKChjMiA9IGdldHNjKCkpID09ICdcJycpIHsKKwkJCQkJUFVTSF9TVEFURShTRVFVT1RFKTsKKwkJCQkJc3RhdGVwLT5sc19zZXF1b3RlLmdvdF9OVUwgPSBmYWxzZTsKKwkJCQkJZ290byBzaGVyZWRlbGltX3F1b3RlZDsKKwkJCQl9CisJCQkJdW5nZXRzYyhjMik7CisJCQkJZ290byBzaGVyZWRlbGltX3JlZ3VsYXI7CisJCQl9IGVsc2UgaWYgKGMgPT0gJ1wnJykgeworCQkJCVBVU0hfU1RBVEUoU1NRVU9URSk7Cisgc2hlcmVkZWxpbV9xdW90ZWQ6CisJCQkJKndwKysgPSBPUVVPVEU7CisJCQkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKys7CisJCQl9IGVsc2UgaWYgKGMgPT0gJyInKSB7CisJCQkJc3RhdGUgPSBzdGF0ZXAtPmxzX3N0YXRlID0gU0hFUkVEUVVPVEU7CisJCQkJKndwKysgPSBPUVVPVEU7CisJCQl9IGVsc2UgeworIHNoZXJlZGVsaW1fcmVndWxhcjoKKwkJCQkqd3ArKyA9IENIQVI7CisJCQkJKndwKysgPSBjOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTSEVSRURRVU9URToJLyogIiBpbiA8PCw8PC0gZGVsaW1pdGVyICovCisJCQlpZiAoYyA9PSAnIicpIHsKKwkJCQkqd3ArKyA9IENRVU9URTsKKwkJCQlzdGF0ZSA9IHN0YXRlcC0+bHNfc3RhdGUgPQorCQkJCSAgICAvKiBkcFsxXSA9PSAnPCcgbWVhbnMgaGVyZSBzdHJpbmcgKi8KKwkJCQkgICAgWHN0cmluZyh3cywgd3ApWzFdID09ICc8JyA/CisJCQkJICAgIFNIRVJFU1RSSU5HIDogU0hFUkVERUxJTTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGMgPT0gJ1xcJykgeworCQkJCQlzd2l0Y2ggKGMgPSBnZXRzYygpKSB7CisJCQkJCWNhc2UgJ1xcJzogY2FzZSAnIic6CisJCQkJCWNhc2UgJyQnOiBjYXNlICdgJzoKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJaWYgKGMpIHsKKwkJCQkJCQkvKiB0cmFpbGluZyBcIGxvc3QgKi8KKwkJCQkJCQkqd3ArKyA9IENIQVI7CisJCQkJCQkJKndwKysgPSAnXFwnOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJKndwKysgPSBDSEFSOworCQkJCSp3cCsrID0gYzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1BBVFRFUk46CS8qIGluICooLi4ufC4uLikgcGF0dGVybiAoKis/QCEpICovCisJCQlpZiAoIC8qKCovIGMgPT0gJyknKSB7CisJCQkJKndwKysgPSBDUEFUOworCQkJCVBPUF9TVEFURSgpOworCQkJfSBlbHNlIGlmIChjID09ICd8JykgeworCQkJCSp3cCsrID0gU1BBVDsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnKCcpIHsKKwkJCQkqd3ArKyA9IE9QQVQ7CisJCQkJKndwKysgPSAnICc7CS8qIHNpbWlsZSBmb3IgQCAqLworCQkJCVBVU0hfU1RBVEUoU1BBVFRFUk4pOworCQkJfSBlbHNlCisJCQkJZ290byBTYmFzZTE7CisJCQlicmVhazsKKwkJfQorCX0KKyBEb25lOgorCVhjaGVjayh3cywgd3ApOworCWlmIChzdGF0ZXAgIT0gJnN0YXRlc1sxXSkKKwkJLyogWFhYIGZpZ3VyZSBvdXQgd2hhdCBpcyBtaXNzaW5nICovCisJCXl5ZXJyb3IoIm5vIGNsb3NpbmcgcXVvdGVcbiIpOworCisjaWZuZGVmIE1LU0hfU01BTEwKKwlpZiAoc3RhdGUgPT0gU0xFVEFSUkFZICYmIHN0YXRlcC0+bHNfc2xldGFycmF5Lm5wYXJlbiAhPSAtMSkKKwkJeXllcnJvcigiJXM6ICcpJyBtaXNzaW5nXG4iLCBUX3N5bmVycik7CisjZW5kaWYKKworCS8qIFRoaXMgZG9uZSB0byBhdm9pZCB0ZXN0cyBmb3IgU0hFUkVERUxJTSB3aGVyZXZlciBTQkFTRSB0ZXN0ZWQgKi8KKwlpZiAoc3RhdGUgPT0gU0hFUkVERUxJTSB8fCBzdGF0ZSA9PSBTSEVSRVNUUklORykKKwkJc3RhdGUgPSBTQkFTRTsKKworCWRwID0gWHN0cmluZyh3cywgd3ApOworCWlmICgoYyA9PSAnPCcgfHwgYyA9PSAnPicgfHwgYyA9PSAnJicpICYmIHN0YXRlID09IFNCQVNFKSB7CisJCXN0cnVjdCBpb3dvcmQgKmlvcCA9IGFsbG9jKHNpemVvZihzdHJ1Y3QgaW93b3JkKSwgQVRFTVApOworCisJCWlmIChYbGVuZ3RoKHdzLCB3cCkgPT0gMCkKKwkJCWlvcC0+dW5pdCA9IGMgPT0gJzwnID8gMCA6IDE7CisJCWVsc2UgZm9yIChpb3AtPnVuaXQgPSAwLCBjMiA9IDA7IGMyIDwgWGxlbmd0aCh3cywgd3ApOyBjMiArPSAyKSB7CisJCQlpZiAoZHBbYzJdICE9IENIQVIpCisJCQkJZ290byBub19pb3A7CisJCQlpZiAoIWtzaF9pc2RpZ2l0KGRwW2MyICsgMV0pKQorCQkJCWdvdG8gbm9faW9wOworCQkJaW9wLT51bml0ID0gKGlvcC0+dW5pdCAqIDEwKSArIGRwW2MyICsgMV0gLSAnMCc7CisJCX0KKworCQlpZiAoaW9wLT51bml0ID49IEZEQkFTRSkKKwkJCWdvdG8gbm9faW9wOworCisJCWlmIChjID09ICcmJykgeworCQkJaWYgKChjMiA9IGdldHNjKCkpICE9ICc+JykgeworCQkJCXVuZ2V0c2MoYzIpOworCQkJCWdvdG8gbm9faW9wOworCQkJfQorCQkJYyA9IGMyOworCQkJaW9wLT5mbGFnID0gSU9CQVNIOworCQl9IGVsc2UKKwkJCWlvcC0+ZmxhZyA9IDA7CisKKwkJYzIgPSBnZXRzYygpOworCQkvKiA8PCwgPj4sIDw+IGFyZSBvaywgPjwgaXMgbm90ICovCisJCWlmIChjID09IGMyIHx8IChjID09ICc8JyAmJiBjMiA9PSAnPicpKSB7CisJCQlpb3AtPmZsYWcgfD0gYyA9PSBjMiA/CisJCQkgICAgKGMgPT0gJz4nID8gSU9DQVQgOiBJT0hFUkUpIDogSU9SRFdSOworCQkJaWYgKGlvcC0+ZmxhZyA9PSBJT0hFUkUpIHsKKwkJCQlpZiAoKGMyID0gZ2V0c2MoKSkgPT0gJy0nKQorCQkJCQlpb3AtPmZsYWcgfD0gSU9TS0lQOworCQkJCWVsc2UKKwkJCQkJdW5nZXRzYyhjMik7CisJCQl9CisJCX0gZWxzZSBpZiAoYzIgPT0gJyYnKQorCQkJaW9wLT5mbGFnIHw9IElPRFVQIHwgKGMgPT0gJzwnID8gSU9SRFVQIDogMCk7CisJCWVsc2UgeworCQkJaW9wLT5mbGFnIHw9IGMgPT0gJz4nID8gSU9XUklURSA6IElPUkVBRDsKKwkJCWlmIChjID09ICc+JyAmJiBjMiA9PSAnfCcpCisJCQkJaW9wLT5mbGFnIHw9IElPQ0xPQjsKKwkJCWVsc2UKKwkJCQl1bmdldHNjKGMyKTsKKwkJfQorCisJCWlvcC0+bmFtZSA9IE5VTEw7CisJCWlvcC0+ZGVsaW0gPSBOVUxMOworCQlpb3AtPmhlcmVkb2MgPSBOVUxMOworCQlYZnJlZSh3cywgd3ApOwkvKiBmcmVlIHdvcmQgKi8KKwkJeXlsdmFsLmlvcCA9IGlvcDsKKwkJcmV0dXJuIChSRURJUik7Cisgbm9faW9wOgorCQk7CisJfQorCisJaWYgKHdwID09IGRwICYmIHN0YXRlID09IFNCQVNFKSB7CisJCVhmcmVlKHdzLCB3cCk7CS8qIGZyZWUgd29yZCAqLworCQkvKiBubyB3b3JkLCBwcm9jZXNzIExFWDEgY2hhcmFjdGVyICovCisJCWlmICgoYyA9PSAnfCcpIHx8IChjID09ICcmJykgfHwgKGMgPT0gJzsnKSB8fCAoYyA9PSAnKCcvKikqLykpIHsKKwkJCWlmICgoYzIgPSBnZXRzYygpKSA9PSBjKQorCQkJCWMgPSAoYyA9PSAnOycpID8gQlJFQUsgOgorCQkJCSAgICAoYyA9PSAnfCcpID8gTE9HT1IgOgorCQkJCSAgICAoYyA9PSAnJicpID8gTE9HQU5EIDoKKwkJCQkgICAgLyogYyA9PSAnKCcgKSAqLyBNRFBBUkVOOworCQkJZWxzZSBpZiAoYyA9PSAnfCcgJiYgYzIgPT0gJyYnKQorCQkJCWMgPSBDT1BST0M7CisJCQllbHNlCisJCQkJdW5nZXRzYyhjMik7CisJCX0gZWxzZSBpZiAoYyA9PSAnXG4nKSB7CisJCQlnZXRoZXJlKGZhbHNlKTsKKwkJCWlmIChjZiAmIENPTlRJTikKKwkJCQlnb3RvIEFnYWluOworCQl9IGVsc2UgaWYgKGMgPT0gJ1wwJykKKwkJCS8qIG5lZWQgaGVyZSBzdHJpbmdzIGF0IEVPRiAqLworCQkJZ2V0aGVyZSh0cnVlKTsKKwkJcmV0dXJuIChjKTsKKwl9CisKKwkqd3ArKyA9IEVPUzsJCS8qIHRlcm1pbmF0ZSB3b3JkICovCisJeXlsdmFsLmNwID0gWGNsb3NlKHdzLCB3cCk7CisJaWYgKHN0YXRlID09IFNXT1JEIHx8IHN0YXRlID09IFNMRVRQQVJFTgorCSAgICAvKiBYWFggT05FV09SRD8gKi8KKyNpZm5kZWYgTUtTSF9TTUFMTAorCSAgICB8fCBzdGF0ZSA9PSBTTEVUQVJSQVkKKyNlbmRpZgorCSAgICApCisJCXJldHVybiAoTFdPUkQpOworCisJLyogdW5nZXQgdGVybWluYXRvciAqLworCXVuZ2V0c2MoYyk7CisKKwkvKgorCSAqIG5vdGU6IHRoZSBhbGlhcy12cy1mdW5jdGlvbiBjb2RlIGJlbG93IGRlcGVuZHMgb24gc2V2ZXJhbAorCSAqIGludGVybmE6IHN0YXJ0aW5nIGZyb20gaGVyZSwgc291cmNlLT5zdHIgaXMgbm90IG1vZGlmaWVkOworCSAqIHRoZSB3YXkgZ2V0c2MoKSBhbmQgdW5nZXRzYygpIG9wZXJhdGU7IGV0Yy4KKwkgKi8KKworCS8qIGNvcHkgd29yZCB0byB1bnByZWZpeGVkIHN0cmluZyBpZGVudCAqLworCXNwID0geXlsdmFsLmNwOworCWRwID0gaWRlbnQ7CisJaWYgKChjZiAmIEhFUkVERUxJTSkgJiYgKHNwWzFdID09ICc8JykpCisJCXdoaWxlIChkcCA8IGlkZW50K0lERU5UKSB7CisJCQlpZiAoKGMgPSAqc3ArKykgPT0gQ0hBUikKKwkJCQkqZHArKyA9ICpzcCsrOworCQkJZWxzZSBpZiAoKGMgIT0gT1FVT1RFKSAmJiAoYyAhPSBDUVVPVEUpKQorCQkJCWJyZWFrOworCQl9CisJZWxzZQorCQl3aGlsZSAoZHAgPCBpZGVudCtJREVOVCAmJiAoYyA9ICpzcCsrKSA9PSBDSEFSKQorCQkJKmRwKysgPSAqc3ArKzsKKwkvKiBNYWtlIHN1cmUgdGhlIGlkZW50IGFycmF5IHN0YXlzICdcMCcgcGFkZGVkICovCisJbWVtc2V0KGRwLCAwLCAoaWRlbnQrSURFTlQpIC0gZHAgKyAxKTsKKwlpZiAoYyAhPSBFT1MpCisJCSppZGVudCA9ICdcMCc7CS8qIHdvcmQgaXMgbm90IHVucXVvdGVkICovCisKKwlpZiAoKmlkZW50ICE9ICdcMCcgJiYgKGNmJihLRVlXT1JEfEFMSUFTKSkpIHsKKwkJc3RydWN0IHRibCAqcDsKKwkJdWludDMyX3QgaCA9IGhhc2goaWRlbnQpOworCisJCS8qIHsgKi8KKwkJaWYgKChjZiAmIEtFWVdPUkQpICYmIChwID0ga3RzZWFyY2goJmtleXdvcmRzLCBpZGVudCwgaCkpICYmCisJCSAgICAoIShjZiAmIEVTQUNPTkxZKSB8fCBwLT52YWwuaSA9PSBFU0FDIHx8IHAtPnZhbC5pID09ICd9JykpIHsKKwkJCWFmcmVlKHl5bHZhbC5jcCwgQVRFTVApOworCQkJcmV0dXJuIChwLT52YWwuaSk7CisJCX0KKwkJaWYgKChjZiAmIEFMSUFTKSAmJiAocCA9IGt0c2VhcmNoKCZhbGlhc2VzLCBpZGVudCwgaCkpICYmCisJCSAgICAocC0+ZmxhZyAmIElTU0VUKSkgeworCQkJLyoKKwkJCSAqIHRoaXMgc3RpbGwgcG9pbnRzIHRvIHRoZSBzYW1lIGNoYXJhY3RlciBhcyB0aGUKKwkJCSAqIHVuZ2V0c2MnZCB0ZXJtaW5hdG9yIGZyb20gYWJvdmUKKwkJCSAqLworCQkJY29uc3QgY2hhciAqY3AgPSBzb3VyY2UtPnN0cjsKKworCQkJLyogcHJlZmVyIFBPU0lYIGJ1dCBub3QgS29ybiBmdW5jdGlvbnMgb3ZlciBhbGlhc2VzICovCisJCQl3aGlsZSAoKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JykKKwkJCQkvKgorCQkJCSAqIHRoaXMgaXMgbGlrZSBnZXRzYygpIHdpdGhvdXQgc2tpcHBpbmcKKwkJCQkgKiBvdmVyIFNvdXJjZSBib3VuZGFyaWVzIChpbmNsdWRpbmcgbm90CisJCQkJICogcGFyc2luZyB1bmdldHNjJ2QgY2hhcmFjdGVycyB0aGF0IGdvdAorCQkJCSAqIHB1c2hlZCBpbnRvIGFuIFNSRVJFQUQpIHdoaWNoIGlzIHdoYXQKKwkJCQkgKiB3ZSB3YW50IGhlcmUgYW55d2F5OiBmaW5kIG91dCB3aGV0aGVyCisJCQkJICogdGhlIGFsaWFzIG5hbWUgaXMgZm9sbG93ZWQgYnkgYSBQT1NJWAorCQkJCSAqIGZ1bmN0aW9uIGRlZmluaXRpb24gKG9ubHkgdGhlIG9wZW5pbmcKKwkJCQkgKiBwYXJlbnRoZXNpcyBpcyBjaGVja2VkIHRob3VnaCkKKwkJCQkgKi8KKwkJCQkrK2NwOworCQkJLyogcHJlZmVyIGZ1bmN0aW9ucyBvdmVyIGFsaWFzZXMgKi8KKwkJCWlmICgqY3AgPT0gJygnIC8qKSovKQorCQkJCS8qCisJCQkJICogZGVsZXRlIGFsaWFzIHVwb24gZW5jb3VudGVyaW5nIGZ1bmN0aW9uCisJCQkJICogZGVmaW5pdGlvbgorCQkJCSAqLworCQkJCWt0ZGVsZXRlKHApOworCQkJZWxzZSB7CisJCQkJU291cmNlICpzID0gc291cmNlOworCisJCQkJd2hpbGUgKHMgJiYgKHMtPmZsYWdzICYgU0ZfSEFTQUxJQVMpKQorCQkJCQlpZiAocy0+dS50YmxwID09IHApCisJCQkJCQlyZXR1cm4gKExXT1JEKTsKKwkJCQkJZWxzZQorCQkJCQkJcyA9IHMtPm5leHQ7CisJCQkJLyogcHVzaCBhbGlhcyBleHBhbnNpb24gKi8KKwkJCQlzID0gcHVzaHMoU0FMSUFTLCBzb3VyY2UtPmFyZWFwKTsKKwkJCQlzLT5zdGFydCA9IHMtPnN0ciA9IHAtPnZhbC5zOworCQkJCXMtPnUudGJscCA9IHA7CisJCQkJcy0+ZmxhZ3MgfD0gU0ZfSEFTQUxJQVM7CisJCQkJcy0+bmV4dCA9IHNvdXJjZTsKKwkJCQlpZiAoc291cmNlLT50eXBlID09IFNFT0YpIHsKKwkJCQkJLyogcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gYXQgRU9TICovCisJCQkJCXNvdXJjZS0+dS50YmxwID0gcDsKKwkJCQkJc291cmNlLT5mbGFncyB8PSBTRl9IQVNBTElBUzsKKwkJCQl9CisJCQkJc291cmNlID0gczsKKwkJCQlhZnJlZSh5eWx2YWwuY3AsIEFURU1QKTsKKwkJCQlnb3RvIEFnYWluOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIChMV09SRCk7Cit9CisKK3N0YXRpYyB2b2lkCitnZXRoZXJlKGJvb2wgaXNlb2YpCit7CisJc3RydWN0IGlvd29yZCAqKnA7CisKKwlmb3IgKHAgPSBoZXJlczsgcCA8IGhlcmVwOyBwKyspCisJCWlmIChpc2VvZiAmJiAoKnApLT5kZWxpbVsxXSAhPSAnPCcpCisJCQkvKiBvbmx5IGhlcmUgc3RyaW5ncyBhdCBFT0YgKi8KKwkJCXJldHVybjsKKwkJZWxzZQorCQkJcmVhZGhlcmUoKnApOworCWhlcmVwID0gaGVyZXM7Cit9CisKKy8qCisgKiByZWFkICI8PHdvcmQiIHRleHQgaW50byB0ZW1wIGZpbGUKKyAqLworCitzdGF0aWMgdm9pZAorcmVhZGhlcmUoc3RydWN0IGlvd29yZCAqaW9wKQoreworCWludCBjOworCWNoYXIgKnZvbGF0aWxlIGVvZjsKKwljaGFyICplb2ZwOworCWludCBza2lwdGFiczsKKwlYU3RyaW5nIHhzOworCWNoYXIgKnhwOworCWludCB4cG9zOworCisJaWYgKGlvcC0+ZGVsaW1bMV0gPT0gJzwnKSB7CisJCS8qIHByb2Nlc3MgdGhlIGhlcmUgc3RyaW5nICovCisJCXhwID0gaW9wLT5oZXJlZG9jID0gZXZhbHN0cihpb3AtPmRlbGltLCBET0JMQU5LKTsKKwkJYyA9IHN0cmxlbih4cCkgLSAxOworCQltZW1tb3ZlKHhwLCB4cCArIDEsIGMpOworCQl4cFtjXSA9ICdcbic7CisJCXJldHVybjsKKwl9CisKKwllb2YgPSBldmFsc3RyKGlvcC0+ZGVsaW0sIDApOworCisJaWYgKCEoaW9wLT5mbGFnICYgSU9FVkFMKSkKKwkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKys7CisKKwlYaW5pdCh4cywgeHAsIDI1NiwgQVRFTVApOworCisJZm9yICg7OykgeworCQllb2ZwID0gZW9mOworCQlza2lwdGFicyA9IGlvcC0+ZmxhZyAmIElPU0tJUDsKKwkJeHBvcyA9IFhzYXZlcG9zKHhzLCB4cCk7CisJCXdoaWxlICgoYyA9IGdldHNjKCkpICE9IDApIHsKKwkJCWlmIChza2lwdGFicykgeworCQkJCWlmIChjID09ICdcdCcpCisJCQkJCWNvbnRpbnVlOworCQkJCXNraXB0YWJzID0gMDsKKwkJCX0KKwkJCWlmIChjICE9ICplb2ZwKQorCQkJCWJyZWFrOworCQkJWGNoZWNrKHhzLCB4cCk7CisJCQlYcHV0KHhzLCB4cCwgYyk7CisJCQllb2ZwKys7CisJCX0KKwkJLyogQWxsb3cgRU9GIGhlcmUgc28gY29tbWFuZHMgd2l0aCBvdXQgdHJhaWxpbmcgbmV3bGluZXMKKwkJICogd2lsbCB3b3JrIChlZywga3NoIC1jICcuLi4nLCAkKC4uLiksIGV0YykuCisJCSAqLworCQlpZiAoKmVvZnAgPT0gJ1wwJyAmJiAoYyA9PSAwIHx8IGMgPT0gJ1xuJykpIHsKKwkJCXhwID0gWHJlc3Rwb3MoeHMsIHhwLCB4cG9zKTsKKwkJCWJyZWFrOworCQl9CisJCXVuZ2V0c2MoYyk7CisJCXdoaWxlICgoYyA9IGdldHNjKCkpICE9ICdcbicpIHsKKwkJCWlmIChjID09IDApCisJCQkJeXllcnJvcigiaGVyZSBkb2N1bWVudCAnJXMnIHVuY2xvc2VkXG4iLCBlb2YpOworCQkJWGNoZWNrKHhzLCB4cCk7CisJCQlYcHV0KHhzLCB4cCwgYyk7CisJCX0KKwkJWGNoZWNrKHhzLCB4cCk7CisJCVhwdXQoeHMsIHhwLCBjKTsKKwl9CisJWHB1dCh4cywgeHAsICdcMCcpOworCWlvcC0+aGVyZWRvYyA9IFhjbG9zZSh4cywgeHApOworCisJaWYgKCEoaW9wLT5mbGFnICYgSU9FVkFMKSkKKwkJaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lLS07Cit9CisKK3ZvaWQKK3l5ZXJyb3IoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKworCS8qIHBvcCBhbGlhc2VzIGFuZCByZS1yZWFkcyAqLworCXdoaWxlIChzb3VyY2UtPnR5cGUgPT0gU0FMSUFTIHx8IHNvdXJjZS0+dHlwZSA9PSBTUkVSRUFEKQorCQlzb3VyY2UgPSBzb3VyY2UtPm5leHQ7CisJc291cmNlLT5zdHIgPSBudWxsOwkvKiB6YXAgcGVuZGluZyBpbnB1dCAqLworCisJZXJyb3JfcHJlZml4KHRydWUpOworCXZhX3N0YXJ0KHZhLCBmbXQpOworCXNoZl92ZnByaW50ZihzaGxfb3V0LCBmbXQsIHZhKTsKKwl2YV9lbmQodmEpOworCWVycm9yZnooKTsKK30KKworLyoKKyAqIGlucHV0IGZvciB5eWxleCB3aXRoIGFsaWFzIGV4cGFuc2lvbgorICovCisKK1NvdXJjZSAqCitwdXNocyhpbnQgdHlwZSwgQXJlYSAqYXJlYXApCit7CisJU291cmNlICpzOworCisJcyA9IGFsbG9jKHNpemVvZihTb3VyY2UpLCBhcmVhcCk7CisJbWVtc2V0KHMsIDAsIHNpemVvZihTb3VyY2UpKTsKKwlzLT50eXBlID0gdHlwZTsKKwlzLT5zdHIgPSBudWxsOworCXMtPmFyZWFwID0gYXJlYXA7CisJaWYgKHR5cGUgPT0gU0ZJTEUgfHwgdHlwZSA9PSBTU1RESU4pCisJCVhpbml0TihzLT54cywgMjU2LCBzLT5hcmVhcCk7CisJcmV0dXJuIChzKTsKK30KKworc3RhdGljIGludAorZ2V0c2NfXyh2b2lkKQoreworCVNvdXJjZSAqcyA9IHNvdXJjZTsKKwlpbnQgYzsKKworIGdldHNjX2FnYWluOgorCXdoaWxlICgoYyA9ICpzLT5zdHIrKykgPT0gMCkgeworCQlzLT5zdHIgPSBOVUxMOwkJLyogcmV0dXJuIDAgZm9yIEVPRiBieSBkZWZhdWx0ICovCisJCXN3aXRjaCAocy0+dHlwZSkgeworCQljYXNlIFNFT0Y6CisJCQlzLT5zdHIgPSBudWxsOworCQkJcmV0dXJuICgwKTsKKworCQljYXNlIFNTVERJTjoKKwkJY2FzZSBTRklMRToKKwkJCWdldHNjX2xpbmUocyk7CisJCQlicmVhazsKKworCQljYXNlIFNXU1RSOgorCQkJYnJlYWs7CisKKwkJY2FzZSBTU1RSSU5HOgorCQkJYnJlYWs7CisKKwkJY2FzZSBTV09SRFM6CisJCQlzLT5zdGFydCA9IHMtPnN0ciA9ICpzLT51LnN0cnYrKzsKKwkJCXMtPnR5cGUgPSBTV09SRFNFUDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1dPUkRTRVA6CisJCQlpZiAoKnMtPnUuc3RydiA9PSBOVUxMKSB7CisJCQkJcy0+c3RhcnQgPSBzLT5zdHIgPSAiXG4iOworCQkJCXMtPnR5cGUgPSBTRU9GOworCQkJfSBlbHNlIHsKKwkJCQlzLT5zdGFydCA9IHMtPnN0ciA9ICIgIjsKKwkJCQlzLT50eXBlID0gU1dPUkRTOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTQUxJQVM6CisJCQlpZiAocy0+ZmxhZ3MgJiBTRl9BTElBU0VORCkgeworCQkJCS8qIHBhc3Mgb24gYW4gdW51c2VkIFNGX0FMSUFTIGZsYWcgKi8KKwkJCQlzb3VyY2UgPSBzLT5uZXh0OworCQkJCXNvdXJjZS0+ZmxhZ3MgfD0gcy0+ZmxhZ3MgJiBTRl9BTElBUzsKKwkJCQlzID0gc291cmNlOworCQkJfSBlbHNlIGlmICgqcy0+dS50YmxwLT52YWwucyAmJgorCQkJICAgIChjID0gc3RybnVsKHMtPnUudGJscC0+dmFsLnMpWy0xXSwga3NoX2lzc3BhY2UoYykpKSB7CisJCQkJc291cmNlID0gcyA9IHMtPm5leHQ7CS8qIHBvcCBzb3VyY2Ugc3RhY2sgKi8KKwkJCQkvKiBOb3RlIHRoYXQgdGhpcyBhbGlhcyBlbmRlZCB3aXRoIGEgc3BhY2UsCisJCQkJICogZW5hYmxpbmcgYWxpYXMgZXhwYW5zaW9uIG9uIHRoZSBmb2xsb3dpbmcKKwkJCQkgKiB3b3JkLgorCQkJCSAqLworCQkJCXMtPmZsYWdzIHw9IFNGX0FMSUFTOworCQkJfSBlbHNlIHsKKwkJCQkvKiBBdCB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIGtlZXAgdGhlIGN1cnJlbnQKKwkJCQkgKiBhbGlhcyBpbiB0aGUgc291cmNlIGxpc3Qgc28gcmVjdXJzaXZlCisJCQkJICogYWxpYXNlcyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIHdlIGFsc28gbmVlZAorCQkJCSAqIHRvIHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIuIERvIHRoaXMKKwkJCQkgKiBieSB0ZW1wb3JhcmlseSBwb3BwaW5nIHRoZSBhbGlhcyB0byBnZXQKKwkJCQkgKiB0aGUgbmV4dCBjaGFyYWN0ZXIgYW5kIHRoZW4gcHV0IGl0IGJhY2sKKwkJCQkgKiBpbiB0aGUgc291cmNlIGxpc3Qgd2l0aCB0aGUgU0ZfQUxJQVNFTkQKKwkJCQkgKiBmbGFnIHNldC4KKwkJCQkgKi8KKwkJCQlzb3VyY2UgPSBzLT5uZXh0OwkvKiBwb3Agc291cmNlIHN0YWNrICovCisJCQkJc291cmNlLT5mbGFncyB8PSBzLT5mbGFncyAmIFNGX0FMSUFTOworCQkJCWMgPSBnZXRzY19fKCk7CisJCQkJaWYgKGMpIHsKKwkJCQkJcy0+ZmxhZ3MgfD0gU0ZfQUxJQVNFTkQ7CisJCQkJCXMtPnVnYnVmWzBdID0gYzsgcy0+dWdidWZbMV0gPSAnXDAnOworCQkJCQlzLT5zdGFydCA9IHMtPnN0ciA9IHMtPnVnYnVmOworCQkJCQlzLT5uZXh0ID0gc291cmNlOworCQkJCQlzb3VyY2UgPSBzOworCQkJCX0gZWxzZSB7CisJCQkJCXMgPSBzb3VyY2U7CisJCQkJCS8qIGF2b2lkIHJlYWRpbmcgZW9mIHR3aWNlICovCisJCQkJCXMtPnN0ciA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWNvbnRpbnVlOworCisJCWNhc2UgU1JFUkVBRDoKKwkJCWlmIChzLT5zdGFydCAhPSBzLT51Z2J1ZikJLyogeXVjayAqLworCQkJCWFmcmVlKHMtPnUuZnJlZW1lLCBBVEVNUCk7CisJCQlzb3VyY2UgPSBzID0gcy0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzLT5zdHIgPT0gTlVMTCkgeworCQkJcy0+dHlwZSA9IFNFT0Y7CisJCQlzLT5zdGFydCA9IHMtPnN0ciA9IG51bGw7CisJCQlyZXR1cm4gKCdcMCcpOworCQl9CisJCWlmIChzLT5mbGFncyAmIFNGX0VDSE8pIHsKKwkJCXNoZl9wdXRzKHMtPnN0ciwgc2hsX291dCk7CisJCQlzaGZfZmx1c2goc2hsX291dCk7CisJCX0KKwl9CisJLyogY2hlY2sgZm9yIFVURi04IGJ5dGUgb3JkZXIgbWFyayAqLworCWlmIChzLT5mbGFncyAmIFNGX0ZJUlNUKSB7CisJCXMtPmZsYWdzICY9IH5TRl9GSVJTVDsKKwkJaWYgKCgodW5zaWduZWQgY2hhciljID09IDB4RUYpICYmCisJCSAgICAoKChjb25zdCB1bnNpZ25lZCBjaGFyICopKHMtPnN0cikpWzBdID09IDB4QkIpICYmCisJCSAgICAoKChjb25zdCB1bnNpZ25lZCBjaGFyICopKHMtPnN0cikpWzFdID09IDB4QkYpKSB7CisJCQlzLT5zdHIgKz0gMjsKKwkJCVVURk1PREUgPSAxOworCQkJZ290byBnZXRzY19hZ2FpbjsKKwkJfQorCX0KKwlyZXR1cm4gKGMpOworfQorCitzdGF0aWMgdm9pZAorZ2V0c2NfbGluZShTb3VyY2UgKnMpCit7CisJY2hhciAqeHAgPSBYc3RyaW5nKHMtPnhzLCB4cCksICpjcDsKKwlib29sIGludGVyYWN0aXZlID0gRmxhZyhGVEFMS0lORykgJiYgcy0+dHlwZSA9PSBTU1RESU47CisJaW50IGhhdmVfdHR5ID0gaW50ZXJhY3RpdmUgJiYgKHMtPmZsYWdzICYgU0ZfVFRZKTsKKworCS8qIERvbmUgaGVyZSB0byBlbnN1cmUgbm90aGluZyBvZGQgaGFwcGVucyB3aGVuIGEgdGltZW91dCBvY2N1cnMgKi8KKwlYY2hlY2tOKHMtPnhzLCB4cCwgTElORSk7CisJKnhwID0gJ1wwJzsKKwlzLT5zdGFydCA9IHMtPnN0ciA9IHhwOworCisJaWYgKGhhdmVfdHR5ICYmIGtzaF90bW91dCkgeworCQlrc2hfdG1vdXRfc3RhdGUgPSBUTU9VVF9SRUFESU5HOworCQlhbGFybShrc2hfdG1vdXQpOworCX0KKwlpZiAoaW50ZXJhY3RpdmUpCisJCWNoYW5nZV93aW5zeigpOworCWlmIChoYXZlX3R0eSAmJiAoCisjaWYgIU1LU0hfU19OT1ZJCisJICAgIEZsYWcoRlZJKSB8fAorI2VuZGlmCisJICAgIEZsYWcoRkVNQUNTKSB8fCBGbGFnKEZHTUFDUykpKSB7CisJCWludCBucmVhZDsKKworCQlucmVhZCA9IHhfcmVhZCh4cCwgTElORSk7CisJCWlmIChucmVhZCA8IDApCS8qIHJlYWQgZXJyb3IgKi8KKwkJCW5yZWFkID0gMDsKKwkJeHBbbnJlYWRdID0gJ1wwJzsKKwkJeHAgKz0gbnJlYWQ7CisJfSBlbHNlIHsKKwkJaWYgKGludGVyYWN0aXZlKQorCQkJcHByb21wdChwcm9tcHQsIDApOworCQllbHNlCisJCQlzLT5saW5lKys7CisKKwkJd2hpbGUgKDEpIHsKKwkJCWNoYXIgKnAgPSBzaGZfZ2V0c2UoeHAsIFhubGVmdChzLT54cywgeHApLCBzLT51LnNoZik7CisKKwkJCWlmICghcCAmJiBzaGZfZXJyb3Iocy0+dS5zaGYpICYmCisJCQkgICAgc2hmX2Vycm5vKHMtPnUuc2hmKSA9PSBFSU5UUikgeworCQkJCXNoZl9jbGVhcmVycihzLT51LnNoZik7CisJCQkJaWYgKHRyYXApCisJCQkJCXJ1bnRyYXBzKDApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwIHx8ICh4cCA9IHAsIHhwWy0xXSA9PSAnXG4nKSkKKwkJCQlicmVhazsKKwkJCS8qIGRvdWJsZSBidWZmZXIgc2l6ZSAqLworCQkJeHArKzsJLyogbW92ZSBwYXN0IE5VTCBzbyBkb3VibGluZyB3b3Jrcy4uLiAqLworCQkJWGNoZWNrTihzLT54cywgeHAsIFhsZW5ndGgocy0+eHMsIHhwKSk7CisJCQl4cC0tOwkvKiAuLi5hbmQgbW92ZSBiYWNrIGFnYWluICovCisJCX0KKwkJLyogZmx1c2ggYW55IHVud2FudGVkIGlucHV0IHNvIG90aGVyIHByb2dyYW1zL2J1aWx0aW5zCisJCSAqIGNhbiByZWFkIGl0LiBOb3QgdmVyeSBvcHRpbWFsLCBidXQgbGVzcyBlcnJvciBwcm9uZQorCQkgKiB0aGFuIGZsdXNoaW5nIGVsc2Ugd2hlcmUsIGRlYWxpbmcgd2l0aCByZWRpcmVjdGlvbnMsCisJCSAqIGV0Yy4KKwkJICogdG9kbzogcmVkdWNlIHNpemUgb2Ygc2hmIGJ1ZmZlciAofjEyOD8pIGlmIFNTVERJTgorCQkgKi8KKwkJaWYgKHMtPnR5cGUgPT0gU1NURElOKQorCQkJc2hmX2ZsdXNoKHMtPnUuc2hmKTsKKwl9CisJLyogWFhYOiB0ZW1wb3Jhcnkga2x1ZGdlIHRvIHJlc3RvcmUgc291cmNlIGFmdGVyIGEKKwkgKiB0cmFwIG1heSBoYXZlIGJlZW4gZXhlY3V0ZWQuCisJICovCisJc291cmNlID0gczsKKwlpZiAoaGF2ZV90dHkgJiYga3NoX3Rtb3V0KSB7CisJCWtzaF90bW91dF9zdGF0ZSA9IFRNT1VUX0VYRUNVVElORzsKKwkJYWxhcm0oMCk7CisJfQorCWNwID0gWHN0cmluZyhzLT54cywgeHApOworI2lmbmRlZiBNS1NIX1NNQUxMCisJaWYgKGludGVyYWN0aXZlICYmICpjcCA9PSAnIScgJiYgY3VyX3Byb21wdCA9PSBQUzEpIHsKKwkJaW50IGxpbmVsZW47CisKKwkJbGluZWxlbiA9IFhsZW5ndGgocy0+eHMsIHhwKTsKKwkJWGNoZWNrTihzLT54cywgeHAsIGZjX2VfbiArIC8qIE5VTCAqLyAxKTsKKwkJLyogcmVsb2FkIGFmdGVyIHBvdGVudGlhbCByZWFsbG9jICovCisJCWNwID0gWHN0cmluZyhzLT54cywgeHApOworCQkvKiBjaGFuZ2UgaW5pdGlhbCAnIScgaW50byBzcGFjZSAqLworCQkqY3AgPSAnICc7CisJCS8qIE5VTCB0ZXJtaW5hdGUgdGhlIGN1cnJlbnQgc3RyaW5nICovCisJCSp4cCA9ICdcMCc7CisJCS8qIG1vdmUgdGhlIGFjdHVhbCBzdHJpbmcgZm9yd2FyZCAqLworCQltZW1tb3ZlKGNwICsgZmNfZV9uLCBjcCwgbGluZWxlbiArIC8qIE5VTCAqLyAxKTsKKwkJeHAgKz0gZmNfZV9uOworCQkvKiBwcmVwZW5kIGl0IHdpdGggImZjIC1lIC0iICovCisJCW1lbWNweShjcCwgZmNfZV8sIGZjX2Vfbik7CisJfQorI2VuZGlmCisJcy0+c3RhcnQgPSBzLT5zdHIgPSBjcDsKKwlzdHJpcF9udWxzKFhzdHJpbmcocy0+eHMsIHhwKSwgWGxlbmd0aChzLT54cywgeHApKTsKKwkvKiBOb3RlOiBpZiBpbnB1dCBpcyBhbGwgbnVsbHMsIHRoaXMgaXMgbm90IGVvZiAqLworCWlmIChYbGVuZ3RoKHMtPnhzLCB4cCkgPT0gMCkgeworCQkvKiBFT0YgKi8KKwkJaWYgKHMtPnR5cGUgPT0gU0ZJTEUpCisJCQlzaGZfZmRjbG9zZShzLT51LnNoZik7CisJCXMtPnN0ciA9IE5VTEw7CisJfSBlbHNlIGlmIChpbnRlcmFjdGl2ZSAmJiAqcy0+c3RyICYmCisJICAgIChjdXJfcHJvbXB0ICE9IFBTMSB8fCAhY3R5cGUoKnMtPnN0ciwgQ19JRlMgfCBDX0lGU1dTKSkpIHsKKwkJaGlzdHNhdmUoJnMtPmxpbmUsIHMtPnN0ciwgdHJ1ZSwgdHJ1ZSk7CisjaWYgIWRlZmluZWQoTUtTSF9TTUFMTCkgJiYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKKwl9IGVsc2UgaWYgKGludGVyYWN0aXZlICYmIGN1cl9wcm9tcHQgPT0gUFMxKSB7CisJCWNwID0gWHN0cmluZyhzLT54cywgeHApOworCQl3aGlsZSAoKmNwICYmIGN0eXBlKCpjcCwgQ19JRlNXUykpCisJCQkrK2NwOworCQlpZiAoISpjcCkKKwkJCWhpc3RzeW5jKCk7CisjZW5kaWYKKwl9CisJaWYgKGludGVyYWN0aXZlKQorCQlzZXRfcHJvbXB0KFBTMiwgTlVMTCk7Cit9CisKK3ZvaWQKK3NldF9wcm9tcHQoaW50IHRvLCBTb3VyY2UgKnMpCit7CisJY3VyX3Byb21wdCA9IHRvOworCisJc3dpdGNoICh0bykgeworCWNhc2UgUFMxOgkvKiBjb21tYW5kICovCisJCS8qIFN1YnN0aXR1dGUgISBhbmQgISEgaGVyZSwgYmVmb3JlIHN1YnN0aXR1dGlvbnMgYXJlIGRvbmUKKwkJICogc28gISBpbiBleHBhbmRlZCB2YXJpYWJsZXMgYXJlIG5vdCBleHBhbmRlZC4KKwkJICogTk9URTogdGhpcyBpcyBub3Qgd2hhdCBBVCZUIGtzaCBkb2VzIChpdCBkb2VzIGl0IGFmdGVyCisJCSAqIHN1YnN0aXR1dGlvbnMsIFBPU0lYIGRvZXNuJ3Qgc2F5IHdoaWNoIGlzIHRvIGJlIGRvbmUuCisJCSAqLworCQl7CisJCQlzdHJ1Y3Qgc2hmICpzaGY7CisJCQljaGFyICogdm9sYXRpbGUgcHMxOworCQkJQXJlYSAqc2F2ZWRfYXRlbXA7CisKKwkJCXBzMSA9IHN0cl92YWwoZ2xvYmFsKCJQUzEiKSk7CisJCQlzaGYgPSBzaGZfc29wZW4oTlVMTCwgc3RybGVuKHBzMSkgKiAyLAorCQkJICAgIFNIRl9XUiB8IFNIRl9EWU5BTUlDLCBOVUxMKTsKKwkJCXdoaWxlICgqcHMxKQorCQkJCWlmICgqcHMxICE9ICchJyB8fCAqKytwczEgPT0gJyEnKQorCQkJCQlzaGZfcHV0Y2hhcigqcHMxKyssIHNoZik7CisJCQkJZWxzZQorCQkJCQlzaGZfZnByaW50ZihzaGYsICIlZCIsCisJCQkJCQlzID8gcy0+bGluZSArIDEgOiAwKTsKKwkJCXBzMSA9IHNoZl9zY2xvc2Uoc2hmKTsKKwkJCXNhdmVkX2F0ZW1wID0gQVRFTVA7CisJCQluZXdlbnYoRV9FUlJIKTsKKwkJCWlmIChzaWdzZXRqbXAoZS0+amJ1ZiwgMCkpIHsKKwkJCQlwcm9tcHQgPSBzYWZlX3Byb21wdDsKKwkJCQkvKiBEb24ndCBwcmludCBhbiBlcnJvciAtIGFzc3VtZSBpdCBoYXMgYWxyZWFkeQorCQkJCSAqIGJlZW4gcHJpbnRlZC4gUmVhc29uIGlzIHdlIG1heSBoYXZlIGZvcmtlZAorCQkJCSAqIHRvIHJ1biBhIGNvbW1hbmQgYW5kIHRoZSBjaGlsZCBtYXkgYmUKKwkJCQkgKiB1bndpbmRpbmcgaXRzIHN0YWNrIHRocm91Z2ggdGhpcyBjb2RlIGFzIGl0CisJCQkJICogZXhpdHMuCisJCQkJICovCisJCQl9IGVsc2UgeworCQkJCWNoYXIgKmNwID0gc3Vic3RpdHV0ZShwczEsIDApOworCQkJCXN0cmR1cHgocHJvbXB0LCBjcCwgc2F2ZWRfYXRlbXApOworCQkJfQorCQkJcXVpdGVudihOVUxMKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBTMjoJLyogY29tbWFuZCBjb250aW51YXRpb24gKi8KKwkJcHJvbXB0ID0gc3RyX3ZhbChnbG9iYWwoIlBTMiIpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50Citkb3Bwcm9tcHQoY29uc3QgY2hhciAqY3AsIGludCBudHJ1bmNhdGUsIGJvb2wgZG9wcmludCkKK3sKKwlpbnQgY29sdW1ucyA9IDAsIGxpbmVzID0gMCwgaW5kZWxpbWl0ID0gMDsKKwljaGFyIGRlbGltaXRlciA9IDA7CisKKwkvKiBVbmRvY3VtZW50ZWQgQVQmVCBrc2ggZmVhdHVyZToKKwkgKiBJZiB0aGUgc2Vjb25kIGNoYXIgaW4gdGhlIHByb21wdCBzdHJpbmcgaXMgXHIgdGhlbiB0aGUgZmlyc3QgY2hhcgorCSAqIGlzIHRha2VuIHRvIGJlIGEgbm9uLXByaW50aW5nIGRlbGltaXRlciBhbmQgYW55IGNoYXJzIGJldHdlZW4gdHdvCisJICogaW5zdGFuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgYXJlIG5vdCBjb25zaWRlcmVkIHRvIGJlIHBhcnQgb2YgdGhlCisJICogcHJvbXB0IGxlbmd0aAorCSAqLworCWlmICgqY3AgJiYgY3BbMV0gPT0gJ1xyJykgeworCQlkZWxpbWl0ZXIgPSAqY3A7CisJCWNwICs9IDI7CisJfQorCWZvciAoOyAqY3A7IGNwKyspIHsKKwkJaWYgKGluZGVsaW1pdCAmJiAqY3AgIT0gZGVsaW1pdGVyKQorCQkJOworCQllbHNlIGlmICgqY3AgPT0gJ1xuJyB8fCAqY3AgPT0gJ1xyJykgeworCQkJbGluZXMgKz0gY29sdW1ucyAvIHhfY29scyArICgoKmNwID09ICdcbicpID8gMSA6IDApOworCQkJY29sdW1ucyA9IDA7CisJCX0gZWxzZSBpZiAoKmNwID09ICdcdCcpIHsKKwkJCWNvbHVtbnMgPSAoY29sdW1ucyB8IDcpICsgMTsKKwkJfSBlbHNlIGlmICgqY3AgPT0gJ1xiJykgeworCQkJaWYgKGNvbHVtbnMgPiAwKQorCQkJCWNvbHVtbnMtLTsKKwkJfSBlbHNlIGlmICgqY3AgPT0gZGVsaW1pdGVyKQorCQkJaW5kZWxpbWl0ID0gIWluZGVsaW1pdDsKKwkJZWxzZSBpZiAoVVRGTU9ERSAmJiAoKHVuc2lnbmVkIGNoYXIpKmNwID4gMHg3RikpIHsKKwkJCWNvbnN0IGNoYXIgKmNwMjsKKwkJCWNvbHVtbnMgKz0gdXRmX3dpZHRoYWRqKGNwLCAmY3AyKTsKKwkJCWlmIChkb3ByaW50ICYmIChpbmRlbGltaXQgfHwKKwkJCSAgICAobnRydW5jYXRlIDwgKHhfY29scyAqIGxpbmVzICsgY29sdW1ucykpKSkKKwkJCQlzaGZfd3JpdGUoY3AsIGNwMiAtIGNwLCBzaGxfb3V0KTsKKwkJCWNwID0gY3AyIC0gLyogbG9vcCBpbmNyZW1lbnQgKi8gMTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UKKwkJCWNvbHVtbnMrKzsKKwkJaWYgKGRvcHJpbnQgJiYgKCpjcCAhPSBkZWxpbWl0ZXIpICYmCisJCSAgICAoaW5kZWxpbWl0IHx8IChudHJ1bmNhdGUgPCAoeF9jb2xzICogbGluZXMgKyBjb2x1bW5zKSkpKQorCQkJc2hmX3B1dGMoKmNwLCBzaGxfb3V0KTsKKwl9CisJaWYgKGRvcHJpbnQpCisJCXNoZl9mbHVzaChzaGxfb3V0KTsKKwlyZXR1cm4gKHhfY29scyAqIGxpbmVzICsgY29sdW1ucyk7Cit9CisKKwordm9pZAorcHByb21wdChjb25zdCBjaGFyICpjcCwgaW50IG50cnVuY2F0ZSkKK3sKKwlkb3Bwcm9tcHQoY3AsIG50cnVuY2F0ZSwgdHJ1ZSk7Cit9CisKK2ludAorcHJvbXB0bGVuKGNvbnN0IGNoYXIgKmNwKQoreworCXJldHVybiAoZG9wcHJvbXB0KGNwLCAwLCBmYWxzZSkpOworfQorCisvKiBSZWFkIHRoZSB2YXJpYWJsZSBwYXJ0IG9mIGEgJHsuLi59IGV4cHJlc3Npb24gKGllLCB1cCB0byBidXQgbm90IGluY2x1ZGluZworICogdGhlIDpbLSs/PSMlXSBvciBjbG9zZS1icmFjZS4KKyAqLworc3RhdGljIGNoYXIgKgorZ2V0X2JyYWNlX3ZhcihYU3RyaW5nICp3c3AsIGNoYXIgKndwKQoreworCWVudW0gcGFyc2Vfc3RhdGUgeworCQlQU19JTklUSUFMLCBQU19TQVdfSEFTSCwgUFNfSURFTlQsCisJCVBTX05VTUJFUiwgUFNfVkFSMQorCX0gc3RhdGU7CisJY2hhciBjOworCisJc3RhdGUgPSBQU19JTklUSUFMOworCXdoaWxlICgxKSB7CisJCWMgPSBnZXRzYygpOworCQkvKiBTdGF0ZSBtYWNoaW5lIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIHZhcmlhYmxlIHBhcnQgZW5kcy4gKi8KKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFBTX0lOSVRJQUw6CisJCQlpZiAoYyA9PSAnIycgfHwgYyA9PSAnIScgfHwgYyA9PSAnJScpIHsKKwkJCQlzdGF0ZSA9IFBTX1NBV19IQVNIOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBQU19TQVdfSEFTSDoKKwkJCWlmIChrc2hfaXNhbHBoeChjKSkKKwkJCQlzdGF0ZSA9IFBTX0lERU5UOworCQkJZWxzZSBpZiAoa3NoX2lzZGlnaXQoYykpCisJCQkJc3RhdGUgPSBQU19OVU1CRVI7CisJCQllbHNlIGlmIChjdHlwZShjLCBDX1ZBUjEpKQorCQkJCXN0YXRlID0gUFNfVkFSMTsKKwkJCWVsc2UKKwkJCQlnb3RvIG91dDsKKwkJCWJyZWFrOworCQljYXNlIFBTX0lERU5UOgorCQkJaWYgKCFrc2hfaXNhbG51eChjKSkgeworCQkJCWlmIChjID09ICdbJykgeworCQkJCQljaGFyICp0bXAsICpwOworCisJCQkJCWlmICghYXJyYXlzdWIoJnRtcCkpCisJCQkJCQl5eWVycm9yKCJtaXNzaW5nIF1cbiIpOworCQkJCQkqd3ArKyA9IGM7CisJCQkJCWZvciAocCA9IHRtcDsgKnA7ICkgeworCQkJCQkJWGNoZWNrKCp3c3AsIHdwKTsKKwkJCQkJCSp3cCsrID0gKnArKzsKKwkJCQkJfQorCQkJCQlhZnJlZSh0bXAsIEFURU1QKTsKKwkJCQkJYyA9IGdldHNjKCk7CS8qIHRoZSBdICovCisJCQkJfQorCQkJCWdvdG8gb3V0OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUFNfTlVNQkVSOgorCQkJaWYgKCFrc2hfaXNkaWdpdChjKSkKKwkJCQlnb3RvIG91dDsKKwkJCWJyZWFrOworCQljYXNlIFBTX1ZBUjE6CisJCQlnb3RvIG91dDsKKwkJfQorCQlYY2hlY2soKndzcCwgd3ApOworCQkqd3ArKyA9IGM7CisJfQorIG91dDoKKwkqd3ArKyA9ICdcMCc7CS8qIGVuZCBvZiB2YXJpYWJsZSBwYXJ0ICovCisJdW5nZXRzYyhjKTsKKwlyZXR1cm4gKHdwKTsKK30KKworLyoKKyAqIFNhdmUgYW4gYXJyYXkgc3Vic2NyaXB0IC0gcmV0dXJucyB0cnVlIGlmIG1hdGNoaW5nIGJyYWNrZXQgZm91bmQsIGZhbHNlCisgKiBpZiBlb2Ygb3IgbmV3bGluZSB3YXMgZm91bmQuCisgKiAoUmV0dXJuZWQgc3RyaW5nIGRvdWJsZSBudWxsIHRlcm1pbmF0ZWQpCisgKi8KK3N0YXRpYyBpbnQKK2FycmF5c3ViKGNoYXIgKipzdHJwKQoreworCVhTdHJpbmcgd3M7CisJY2hhcgkqd3A7CisJY2hhcgljOworCWludAlkZXB0aCA9IDE7CS8qIHdlIGFyZSBqdXN0IHBhc3QgdGhlIGluaXRpYWwgWyAqLworCisJWGluaXQod3MsIHdwLCAzMiwgQVRFTVApOworCisJZG8geworCQljID0gZ2V0c2MoKTsKKwkJWGNoZWNrKHdzLCB3cCk7CisJCSp3cCsrID0gYzsKKwkJaWYgKGMgPT0gJ1snKQorCQkJZGVwdGgrKzsKKwkJZWxzZSBpZiAoYyA9PSAnXScpCisJCQlkZXB0aC0tOworCX0gd2hpbGUgKGRlcHRoID4gMCAmJiBjICYmIGMgIT0gJ1xuJyk7CisKKwkqd3ArKyA9ICdcMCc7CisJKnN0cnAgPSBYY2xvc2Uod3MsIHdwKTsKKworCXJldHVybiAoZGVwdGggPT0gMCA/IDEgOiAwKTsKK30KKworLyogVW5nZXQgYSBjaGFyOiBoYW5kbGVzIGNhc2Ugd2hlbiB3ZSBhcmUgYWxyZWFkeSBhdCB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciAqLworc3RhdGljIGNvbnN0IGNoYXIgKgordW5nZXRzYyhpbnQgYykKK3sKKwlpZiAoYmFja3NsYXNoX3NraXApCisJCWJhY2tzbGFzaF9za2lwLS07CisJLyogRG9uJ3QgdW5nZXQgZW9mLi4uICovCisJaWYgKHNvdXJjZS0+c3RyID09IG51bGwgJiYgYyA9PSAnXDAnKQorCQlyZXR1cm4gKHNvdXJjZS0+c3RyKTsKKwlpZiAoc291cmNlLT5zdHIgPiBzb3VyY2UtPnN0YXJ0KQorCQlzb3VyY2UtPnN0ci0tOworCWVsc2UgeworCQlTb3VyY2UgKnM7CisKKwkJcyA9IHB1c2hzKFNSRVJFQUQsIHNvdXJjZS0+YXJlYXApOworCQlzLT51Z2J1ZlswXSA9IGM7IHMtPnVnYnVmWzFdID0gJ1wwJzsKKwkJcy0+c3RhcnQgPSBzLT5zdHIgPSBzLT51Z2J1ZjsKKwkJcy0+bmV4dCA9IHNvdXJjZTsKKwkJc291cmNlID0gczsKKwl9CisJcmV0dXJuIChzb3VyY2UtPnN0cik7Cit9CisKKworLyogQ2FsbGVkIHRvIGdldCBhIGNoYXIgdGhhdCBpc24ndCBhIFxuZXdsaW5lIHNlcXVlbmNlLiAqLworc3RhdGljIGludAorZ2V0c2NfYm4odm9pZCkKK3sKKwlpbnQgYywgYzI7CisKKwlpZiAoaWdub3JlX2JhY2tzbGFzaF9uZXdsaW5lKQorCQlyZXR1cm4gKGdldHNjXygpKTsKKworCWlmIChiYWNrc2xhc2hfc2tpcCA9PSAxKSB7CisJCWJhY2tzbGFzaF9za2lwID0gMjsKKwkJcmV0dXJuIChnZXRzY18oKSk7CisJfQorCisJYmFja3NsYXNoX3NraXAgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJYyA9IGdldHNjXygpOworCQlpZiAoYyA9PSAnXFwnKSB7CisJCQlpZiAoKGMyID0gZ2V0c2NfKCkpID09ICdcbicpCisJCQkJLyogaWdub3JlIHRoZSBcbmV3bGluZTsgZ2V0IHRoZSBuZXh0IGNoYXIuLi4gKi8KKwkJCQljb250aW51ZTsKKwkJCXVuZ2V0c2MoYzIpOworCQkJYmFja3NsYXNoX3NraXAgPSAxOworCQl9CisJCXJldHVybiAoYyk7CisJfQorfQorCitzdGF0aWMgTGV4X3N0YXRlICoKK3B1c2hfc3RhdGVfKFN0YXRlX2luZm8gKnNpLCBMZXhfc3RhdGUgKm9sZF9lbmQpCit7CisJTGV4X3N0YXRlICpuZXdzID0gYWxsb2MoU1RBVEVfQlNJWkUgKiBzaXplb2YoTGV4X3N0YXRlKSwgQVRFTVApOworCisJbmV3c1swXS5sc19pbmZvLmJhc2UgPSBvbGRfZW5kOworCXNpLT5iYXNlID0gJm5ld3NbMF07CisJc2ktPmVuZCA9ICZuZXdzW1NUQVRFX0JTSVpFXTsKKwlyZXR1cm4gKCZuZXdzWzFdKTsKK30KKworc3RhdGljIExleF9zdGF0ZSAqCitwb3Bfc3RhdGVfKFN0YXRlX2luZm8gKnNpLCBMZXhfc3RhdGUgKm9sZF9lbmQpCit7CisJTGV4X3N0YXRlICpvbGRfYmFzZSA9IHNpLT5iYXNlOworCisJc2ktPmJhc2UgPSBvbGRfZW5kLT5sc19pbmZvLmJhc2UgLSBTVEFURV9CU0laRTsKKwlzaS0+ZW5kID0gb2xkX2VuZC0+bHNfaW5mby5iYXNlOworCisJYWZyZWUob2xkX2Jhc2UsIEFURU1QKTsKKworCXJldHVybiAoc2ktPmJhc2UgKyBTVEFURV9CU0laRSAtIDEpOworfQorCitzdGF0aWMgaW50CitzX2dldCh2b2lkKQoreworCXJldHVybiAoZ2V0c2MoKSk7Cit9CisKK3N0YXRpYyB2b2lkCitzX3B1dChpbnQgYykKK3sKKwl1bmdldHNjKGMpOworfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvbWFpbi5jIGIvbWtzaC9zcmMvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjJkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9tYWluLmMKQEAgLTAsMCArMSwxNDc5IEBACisvKgkkT3BlbkJTRDogbWFpbi5jLHYgMS40NiAyMDEwLzA1LzE5IDE3OjM2OjA4IGphc3BlciBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IHR0eS5jLHYgMS45IDIwMDYvMDMvMTQgMjI6MDg6MDEgZGVyYWFkdCBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IGlvLmMsdiAxLjIyIDIwMDYvMDMvMTcgMTY6MzA6MTMgbWlsbGVydCBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IHRhYmxlLmMsdiAxLjEzIDIwMDkvMDEvMTcgMjI6MDY6NDQgbWlsbGVydCBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2RlZmluZQlFWFRFUk4KKyNpbmNsdWRlICJzaC5oIgorCisjaWYgSEFWRV9MQU5HSU5GT19DT0RFU0VUCisjaW5jbHVkZSA8bGFuZ2luZm8uaD4KKyNlbmRpZgorI2lmIEhBVkVfU0VUTE9DQUxFX0NUWVBFCisjaW5jbHVkZSA8bG9jYWxlLmg+CisjZW5kaWYKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvbWFpbi5jLHYgMS4xNjcgMjAxMC8wNy8wNCAxNzo0NToxNSB0ZyBFeHAgJCIpOworCitleHRlcm4gY2hhciAqKmVudmlyb247CisKKyNpZiAhSEFWRV9TRVRSRVNVR0lECitleHRlcm4gdWlkX3Qga3NodWlkOworZXh0ZXJuIGdpZF90IGtzaGdpZCwga3NoZWdpZDsKKyNlbmRpZgorCisjaWZuZGVmIE1LU0hSQ19QQVRICisjZGVmaW5lIE1LU0hSQ19QQVRICSJ+Ly5ta3NocmMiCisjZW5kaWYKKworI2lmbmRlZiBNS1NIX0RFRkFVTFRfVE1QRElSCisjZGVmaW5lIE1LU0hfREVGQVVMVF9UTVBESVIJIi90bXAiCisjZW5kaWYKKworc3RhdGljIHZvaWQgcmVjbGFpbSh2b2lkKTsKK3N0YXRpYyB2b2lkIHJlbW92ZV90ZW1wcyhzdHJ1Y3QgdGVtcCAqKTsKK3ZvaWQgY2h2dF9yZWluaXQodm9pZCk7CitTb3VyY2UgKm1rc2hfaW5pdChpbnQsIGNvbnN0IGNoYXIgKltdKTsKKyNpZmRlZiBTSUdXSU5DSAorc3RhdGljIHZvaWQgeF9zaWd3aW5jaChpbnQpOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyIGluaXRpZnNbXSA9ICJJRlM9IFx0XG4iOworCitzdGF0aWMgY29uc3QgY2hhciBpbml0c3Vic1tdID0KKyAgICAiJHtQUzI9PiB9ICR7UFMzPSM/IH0gJHtQUzQ9KyB9ICR7U0VDT05EUz0wfSAke1RNT1VUPTB9IjsKKworc3RhdGljIGNvbnN0IGNoYXIgKmluaXRjb21zW10gPSB7CisJVF90eXBlc2V0LCAiLXIiLCBpbml0dnNuLCBOVUxMLAorCVRfdHlwZXNldCwgIi14IiwgIkhPTUUiLCAiUEFUSCIsICJSQU5ET00iLCAiU0hFTEwiLCBOVUxMLAorCVRfdHlwZXNldCwgIi1pMTAiLCAiQ09MVU1OUyIsICJMSU5FUyIsICJPUFRJTkQiLCAiUEdSUCIsICJQUElEIiwKKwkgICAgIlJBTkRPTSIsICJTRUNPTkRTIiwgIlRNT1VUIiwgIlVTRVJfSUQiLCBOVUxMLAorCSJhbGlhcyIsCisJImludGVnZXI9dHlwZXNldCAtaSIsCisJVF9sb2NhbF90eXBlc2V0LAorCSJoYXNoPWFsaWFzIC10IiwJLyogbm90ICJhbGlhcyAtdCAtLSI6IGhhc2ggLXIgbmVlZHMgdG8gd29yayAqLworCSJ0eXBlPXdoZW5jZSAtdiIsCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCSJzdXNwZW5kPWtpbGwgLVNUT1AgJCQiLAorI2VuZGlmCisJImF1dG9sb2FkPXR5cGVzZXQgLWZ1IiwKKwkiZnVuY3Rpb25zPXR5cGVzZXQgLWYiLAorCSJoaXN0b3J5PWZjIC1sIiwKKwkibmFtZXJlZj10eXBlc2V0IC1uIiwKKwkibm9odXA9bm9odXAgIiwKKwlyX2ZjX2VfLAorCSJzb3VyY2U9UEFUSD0kUEFUSDouIGNvbW1hbmQgLiIsCisJImxvZ2luPWV4ZWMgbG9naW4iLAorCU5VTEwsCisJIC8qIHRoaXMgaXMgd2hhdCBBVCZUIGtzaCBzZWVtcyB0byB0cmFjaywgd2l0aCB0aGUgYWRkaXRpb24gb2YgZW1hY3MgKi8KKwkiYWxpYXMiLCAiLXRVIiwKKwkiY2F0IiwgImNjIiwgImNobW9kIiwgImNwIiwgImRhdGUiLCAiZWQiLCAiZW1hY3MiLCAiZ3JlcCIsICJscyIsCisJIm1ha2UiLCAibXYiLCAicHIiLCAicm0iLCAic2VkIiwgInNoIiwgInZpIiwgIndobyIsIE5VTEwsCisJTlVMTAorfTsKKworc3RhdGljIGludCBpbml0aW9fZG9uZTsKKworc3RydWN0IGVudiAqZSA9ICZrc2hzdGF0ZV92LmVudl87CisKK3ZvaWQKK2NodnRfcmVpbml0KHZvaWQpCit7CisJa3NocGlkID0gcHJvY3BpZCA9IGdldHBpZCgpOworCWtzaGV1aWQgPSBnZXRldWlkKCk7CisJa3NocGdycCA9IGdldHBncnAoKTsKKwlrc2hwcGlkID0gZ2V0cHBpZCgpOworfQorCitTb3VyY2UgKgorbWtzaF9pbml0KGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pCit7CisJaW50IGFyZ2ksIGk7CisJU291cmNlICpzOworCXN0cnVjdCBibG9jayAqbDsKKwl1bnNpZ25lZCBjaGFyIHJlc3RyaWN0ZWQsIGVycmV4aXQsIHV0Zl9mbGFnOworCWNvbnN0IGNoYXIgKip3cDsKKwlzdHJ1Y3QgdGJsICp2cDsKKwlzdHJ1Y3Qgc3RhdCBzX3N0ZGluOworI2lmICFkZWZpbmVkKF9QQVRIX0RFRlBBVEgpICYmIGRlZmluZWQoX0NTX1BBVEgpCisJc2l6ZV90IGs7CisJY2hhciAqY3A7CisjZW5kaWYKKworCS8qIGRvIHRoaW5ncyBsaWtlIGdldHBncnAoKSBldCBhbC4gKi8KKwljaHZ0X3JlaW5pdCgpOworCisJLyogbWFrZSBzdXJlIGFyZ3ZbXSBpcyBzYW5lICovCisJaWYgKCEqYXJndikgeworCQlzdGF0aWMgY29uc3QgY2hhciAqZW1wdHlfYXJndltdID0geworCQkJIm1rc2giLCBOVUxMCisJCX07CisKKwkJYXJndiA9IGVtcHR5X2FyZ3Y7CisJCWFyZ2MgPSAxOworCX0KKwlrc2huYW1lID0gKmFyZ3Y7CisKKwlhaW5pdCgmYXBlcm0pOwkJLyogaW5pdGlhbGlzZSBwZXJtYW5lbnQgQXJlYSAqLworCisJLyogc2V0IHVwIGJhc2UgZW52aXJvbm1lbnQgKi8KKwlrc2hzdGF0ZV92LmVudl8udHlwZSA9IEVfTk9ORTsKKwlhaW5pdCgma3Noc3RhdGVfdi5lbnZfLmFyZWEpOworCW5ld2Jsb2NrKCk7CQkvKiBzZXQgdXAgZ2xvYmFsIGwtPnZhcnMgYW5kIGwtPmZ1bnMgKi8KKworCS8qIERvIHRoaXMgZmlyc3Qgc28gb3V0cHV0IHJvdXRpbmVzIChlZywgZXJyb3JmLCBzaGVsbGYpIGNhbiB3b3JrICovCisJaW5pdGlvKCk7CisKKwlhcmdpID0gcGFyc2VfYXJncyhhcmd2LCBPRl9GSVJTVFRJTUUsIE5VTEwpOworCWlmIChhcmdpIDwgMCkKKwkJcmV0dXJuIChOVUxMKTsKKworCWluaXR2YXIoKTsKKworCWluaXRjdHlwZXMoKTsKKworCWluaXR0cmFwcygpOworCisJY29wcm9jX2luaXQoKTsKKworCS8qIHNldCB1cCB2YXJpYWJsZSBhbmQgY29tbWFuZCBkaWN0aW9uYXJpZXMgKi8KKwlrdGluaXQoJnRhbGlhc2VzLCBBUEVSTSwgMCk7CisJa3Rpbml0KCZhbGlhc2VzLCBBUEVSTSwgMCk7CisjaWZuZGVmIE1LU0hfTk9QV05BTQorCWt0aW5pdCgmaG9tZWRpcnMsIEFQRVJNLCAwKTsKKyNlbmRpZgorCisJLyogZGVmaW5lIHNoZWxsIGtleXdvcmRzICovCisJaW5pdGtleXdvcmRzKCk7CisKKwkvKiBkZWZpbmUgYnVpbHQtaW4gY29tbWFuZHMgKi8KKwlrdGluaXQoJmJ1aWx0aW5zLCBBUEVSTSwKKwkgICAgLyogbXVzdCBiZSA4MCUgb2YgMl5uIChjdXJyZW50bHkgNDQgYnVpbHRpbnMpICovIDY0KTsKKwlmb3IgKGkgPSAwOyBta3NoYnVpbHRpbnNbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJCWJ1aWx0aW4obWtzaGJ1aWx0aW5zW2ldLm5hbWUsIG1rc2hidWlsdGluc1tpXS5mdW5jKTsKKworCWluaXRfaGlzdHZlYygpOworCisjaWZkZWYgX1BBVEhfREVGUEFUSAorCWRlZl9wYXRoID0gX1BBVEhfREVGUEFUSDsKKyNlbHNlCisjaWZkZWYgX0NTX1BBVEgKKwlpZiAoKGsgPSBjb25mc3RyKF9DU19QQVRILCBOVUxMLCAwKSkgIT0gKHNpemVfdCktMSAmJiBrID4gMCAmJgorCSAgICBjb25mc3RyKF9DU19QQVRILCBjcCA9IGFsbG9jKGsgKyAxLCBBUEVSTSksIGsgKyAxKSA9PSBrICsgMSkKKwkJZGVmX3BhdGggPSBjcDsKKwllbHNlCisjZW5kaWYKKwkJLyoKKwkJICogdGhpcyBpcyB1bmlmb3JtIGFjcm9zcyBhbGwgT1NlcyB1bmxlc3MgaXQKKwkJICogYnJlYWtzIHNvbWV3aGVyZTsgZG9uJ3QgdHJ5IHRvIG9wdGltaXNlLAorCQkgKiBlLmcuIGFkZCBzdHVmZiBmb3IgSW50ZXJpeCBvciByZW1vdmUgL3VzcgorCQkgKiBmb3IgSFVSRCwgYmVjYXVzZSBlLmcuIERlYmlhbiBHTlUvSFVSRCBpcworCQkgKiAia2VlcGluZyBhIHJlZ3VsYXIgL3VzciI7IHRoaXMgaXMgc3VwcG9zZWQKKwkJICogdG8gYmUgYSBzYW5lICdiYXNpYycgZGVmYXVsdCBQQVRICisJCSAqLworCQlkZWZfcGF0aCA9ICIvYmluOi91c3IvYmluOi9zYmluOi91c3Ivc2JpbiI7CisjZW5kaWYKKworCS8qIFNldCBQQVRIIHRvIGRlZl9wYXRoICh3aWxsIHNldCB0aGUgcGF0aCBnbG9iYWwgdmFyaWFibGUpLgorCSAqIChpbXBvcnQgb2YgZW52aXJvbm1lbnQgYmVsb3cgd2lsbCBwcm9iYWJseSBjaGFuZ2UgdGhpcyBzZXR0aW5nKS4KKwkgKi8KKwl2cCA9IGdsb2JhbCgiUEFUSCIpOworCS8qIHNldHN0ciBjYW4ndCBmYWlsIGhlcmUgKi8KKwlzZXRzdHIodnAsIGRlZl9wYXRoLCBLU0hfUkVUVVJOX0VSUk9SKTsKKworCS8qIFR1cm4gb24gbm9odXAgYnkgZGVmYXVsdCBmb3Igbm93IC0gd2lsbCBjaGFuZ2UgdG8gb2ZmCisJICogYnkgZGVmYXVsdCBvbmNlIHBlb3BsZSBhcmUgYXdhcmUgb2YgaXRzIGV4aXN0ZW5jZQorCSAqIChBVCZUIGtzaCBkb2VzIG5vdCBoYXZlIGEgbm9odXAgb3B0aW9uIC0gaXQgYWx3YXlzIHNlbmRzCisJICogdGhlIGh1cCkuCisJICovCisJRmxhZyhGTk9IVVApID0gMTsKKworCS8qIFR1cm4gb24gYnJhY2UgZXhwYW5zaW9uIGJ5IGRlZmF1bHQuIEFUJlQga3NocyB0aGF0IGhhdmUKKwkgKiBhbHRlcm5hdGlvbiBhbHdheXMgaGF2ZSBpdCBvbi4KKwkgKi8KKwlGbGFnKEZCUkFDRUVYUEFORCkgPSAxOworCisJLyogU2V0IGVkaXQgbW9kZSB0byBlbWFjcyBieSBkZWZhdWx0LCBtYXkgYmUgb3ZlcnJpZGRlbgorCSAqIGJ5IHRoZSBlbnZpcm9ubWVudCBvciB0aGUgdXNlci4gQWxzbywgd2Ugd2FudCB0YWIgY29tcGxldGlvbgorCSAqIG9uIGluIHZpIGJ5IGRlZmF1bHQuICovCisJY2hhbmdlX2ZsYWcoRkVNQUNTLCBPRl9TUEVDSUFMLCAxKTsKKyNpZiAhTUtTSF9TX05PVkkKKwlGbGFnKEZWSVRBQkNPTVBMRVRFKSA9IDE7CisjZW5kaWYKKworI2lmZGVmIE1LU0hfQklOU0hSRURVQ0VECisJLyogc2V0IEZTSCBpZiB3ZSdyZSBjYWxsZWQgYXMgLXNoIG9yIC9iaW4vc2ggb3Igc28gKi8KKwl7CisJCWNvbnN0IGNoYXIgKmNjOworCisJCWNjID0ga3NobmFtZTsKKwkJaSA9IDA7IGFyZ2kgPSAwOworCQl3aGlsZSAoY2NbaV0gIT0gJ1wwJykKKwkJCS8qIHRoZSBmb2xsb3dpbmcgbGluZSBtYXRjaGVzICctJyBhbmQgJy8nIDstKSAqLworCQkJaWYgKChjY1tpKytdIHwgMikgPT0gJy8nKQorCQkJCWFyZ2kgPSBpOworCQlpZiAoKChjY1thcmdpXSB8IDB4MjApID09ICdzJykgJiYgKChjY1thcmdpICsgMV0gfCAweDIwKSA9PSAnaCcpKQorCQkJY2hhbmdlX2ZsYWcoRlNILCBPRl9GSVJTVFRJTUUsIDEpOworCX0KKyNlbmRpZgorCisJLyogaW1wb3J0IGVudmlyb25tZW50ICovCisJaWYgKGVudmlyb24gIT0gTlVMTCkKKwkJZm9yICh3cCA9IChjb25zdCBjaGFyICoqKWVudmlyb247ICp3cCAhPSBOVUxMOyB3cCsrKQorCQkJdHlwZXNldCgqd3AsIElNUE9SVCB8IEVYUE9SVCwgMCwgMCwgMCk7CisKKwl0eXBlc2V0KGluaXRpZnMsIDAsIDAsIDAsIDApOwkvKiBmb3Igc2VjdXJpdHkgKi8KKworCS8qIGFzc2lnbiBkZWZhdWx0IHNoZWxsIHZhcmlhYmxlIHZhbHVlcyAqLworCXN1YnN0aXR1dGUoaW5pdHN1YnMsIDApOworCisJLyogRmlndXJlIG91dCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBhbmQgc2V0ICRQV0QgKi8KKwl7CisJCXN0cnVjdCBzdGF0IHNfcHdkLCBzX2RvdDsKKwkJc3RydWN0IHRibCAqcHdkX3YgPSBnbG9iYWwoIlBXRCIpOworCQljaGFyICpwd2QgPSBzdHJfdmFsKHB3ZF92KTsKKwkJY2hhciAqcHdkeCA9IHB3ZDsKKworCQkvKiBUcnkgdG8gdXNlIGV4aXN0aW5nICRQV0QgaWYgaXQgaXMgdmFsaWQgKi8KKwkJaWYgKHB3ZFswXSAhPSAnLycgfHwKKwkJICAgIHN0YXQocHdkLCAmc19wd2QpIDwgMCB8fCBzdGF0KCIuIiwgJnNfZG90KSA8IDAgfHwKKwkJICAgIHNfcHdkLnN0X2RldiAhPSBzX2RvdC5zdF9kZXYgfHwKKwkJICAgIHNfcHdkLnN0X2lubyAhPSBzX2RvdC5zdF9pbm8pCisJCQlwd2R4ID0gTlVMTDsKKwkJc2V0X2N1cnJlbnRfd2QocHdkeCk7CisJCWlmIChjdXJyZW50X3dkWzBdKQorCQkJc2ltcGxpZnlfcGF0aChjdXJyZW50X3dkKTsKKwkJLyogT25seSBzZXQgcHdkIGlmIHdlIGtub3cgd2hlcmUgd2UgYXJlIG9yIGlmIGl0IGhhZCBhCisJCSAqIGJvZ3VzIHZhbHVlCisJCSAqLworCQlpZiAoY3VycmVudF93ZFswXSB8fCBwd2QgIT0gbnVsbCkKKwkJCS8qIHNldHN0ciBjYW4ndCBmYWlsIGhlcmUgKi8KKwkJCXNldHN0cihwd2RfdiwgY3VycmVudF93ZCwgS1NIX1JFVFVSTl9FUlJPUik7CisJfQorCisJZm9yICh3cCA9IGluaXRjb21zOyAqd3AgIT0gTlVMTDsgd3ArKykgeworCQlzaGNvbWV4ZWMod3ApOworCQl3aGlsZSAoKndwICE9IE5VTEwpCisJCQl3cCsrOworCX0KKwlzZXRpbnQoZ2xvYmFsKCJDT0xVTU5TIiksIDApOworCXNldGludChnbG9iYWwoIkxJTkVTIiksIDApOworCXNldGludChnbG9iYWwoIk9QVElORCIpLCAxKTsKKworCXNhZmVfcHJvbXB0ID0ga3NoZXVpZCA/ICIkICIgOiAiIyAiOworCXZwID0gZ2xvYmFsKCJQUzEiKTsKKwkvKiBTZXQgUFMxIGlmIHVuc2V0IG9yIHdlIGFyZSByb290IGFuZCBwcm9tcHQgZG9lc24ndCBjb250YWluIGEgIyAqLworCWlmICghKHZwLT5mbGFnICYgSVNTRVQpIHx8CisJICAgICgha3NoZXVpZCAmJiAhc3RyY2hyKHN0cl92YWwodnApLCAnIycpKSkKKwkJLyogc2V0c3RyIGNhbid0IGZhaWwgaGVyZSAqLworCQlzZXRzdHIodnAsIHNhZmVfcHJvbXB0LCBLU0hfUkVUVVJOX0VSUk9SKTsKKwlzZXRpbnQoKHZwID0gZ2xvYmFsKCJQR1JQIikpLCAobWtzaF91YXJpX3Qpa3NocGdycCk7CisJdnAtPmZsYWcgfD0gSU5UX1U7CisJc2V0aW50KCh2cCA9IGdsb2JhbCgiUFBJRCIpKSwgKG1rc2hfdWFyaV90KWtzaHBwaWQpOworCXZwLT5mbGFnIHw9IElOVF9VOworCXNldGludCgodnAgPSBnbG9iYWwoIlJBTkRPTSIpKSwgKG1rc2hfdWFyaV90KWV2aWxoYXNoKGtzaG5hbWUpKTsKKwl2cC0+ZmxhZyB8PSBJTlRfVTsKKwlzZXRpbnQoKHZwID0gZ2xvYmFsKCJVU0VSX0lEIikpLCAobWtzaF91YXJpX3Qpa3NoZXVpZCk7CisJdnAtPmZsYWcgfD0gSU5UX1U7CisKKwkvKiBTZXQgdGhpcyBiZWZvcmUgcGFyc2luZyBhcmd1bWVudHMgKi8KKyNpZiBIQVZFX1NFVFJFU1VHSUQKKwlGbGFnKEZQUklWSUxFR0VEKSA9IGdldHVpZCgpICE9IGtzaGV1aWQgfHwgZ2V0Z2lkKCkgIT0gZ2V0ZWdpZCgpOworI2Vsc2UKKwlGbGFnKEZQUklWSUxFR0VEKSA9IChrc2h1aWQgPSBnZXR1aWQoKSkgIT0ga3NoZXVpZCB8fAorCSAgICAoa3NoZ2lkID0gZ2V0Z2lkKCkpICE9IChrc2hlZ2lkID0gZ2V0ZWdpZCgpKTsKKyNlbmRpZgorCisJLyogdGhpcyB0byBub3RlIGlmIG1vbml0b3IgaXMgc2V0IG9uIGNvbW1hbmQgbGluZSAoc2VlIGJlbG93KSAqLworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKwlGbGFnKEZNT05JVE9SKSA9IDEyNzsKKyNlbmRpZgorCS8qIHRoaXMgdG8gbm90ZSBpZiB1dGYtOCBtb2RlIGlzIHNldCBvbiBjb21tYW5kIGxpbmUgKHNlZSBiZWxvdykgKi8KKwlVVEZNT0RFID0gMjsKKworCWFyZ2kgPSBwYXJzZV9hcmdzKGFyZ3YsIE9GX0NNRExJTkUsIE5VTEwpOworCWlmIChhcmdpIDwgMCkKKwkJcmV0dXJuIChOVUxMKTsKKworCS8qIHByb2Nlc3MgdGhpcyBsYXRlciBvbmx5LCBkZWZhdWx0IHRvIG9mZiAoaHlzdGVyaWNhbCByYWlzaW5zKSAqLworCXV0Zl9mbGFnID0gVVRGTU9ERTsKKwlVVEZNT0RFID0gMDsKKworCWlmIChGbGFnKEZDT01NQU5EKSkgeworCQlzID0gcHVzaHMoU1NUUklORywgQVRFTVApOworCQlpZiAoIShzLT5zdGFydCA9IHMtPnN0ciA9IGFyZ3ZbYXJnaSsrXSkpCisJCQllcnJvcmYoIi1jIHJlcXVpcmVzIGFuIGFyZ3VtZW50Iik7CisjaWZkZWYgTUtTSF9NSUROSUdIVEJTRDAxQVNIX0NPTVBBVAorCQkvKiBjb21wYXRpYmlsaXR5IHRvIE1pZG5pZ2h0QlNEIDAuMSAvYmluL3NoIChrbHVkZ2UpICovCisJCWlmIChGbGFnKEZTSCkgJiYgYXJndlthcmdpXSAmJiAhc3RyY21wKGFyZ3ZbYXJnaV0sICItLSIpKQorCQkJKythcmdpOworI2VuZGlmCisJCWlmIChhcmd2W2FyZ2ldKQorCQkJa3NobmFtZSA9IGFyZ3ZbYXJnaSsrXTsKKwl9IGVsc2UgaWYgKGFyZ2kgPCBhcmdjICYmICFGbGFnKEZTVERJTikpIHsKKwkJcyA9IHB1c2hzKFNGSUxFLCBBVEVNUCk7CisJCXMtPmZpbGUgPSBhcmd2W2FyZ2krK107CisJCXMtPnUuc2hmID0gc2hmX29wZW4ocy0+ZmlsZSwgT19SRE9OTFksIDAsCisJCSAgICBTSEZfTUFQSEkgfCBTSEZfQ0xFWEVDKTsKKwkJaWYgKHMtPnUuc2hmID09IE5VTEwpIHsKKwkJCXNobF9zdGRvdXRfb2sgPSAwOworCQkJd2FybmluZ2YodHJ1ZSwgIiVzOiAlcyIsIHMtPmZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJCQkvKiBtYW5kYXRlZCBieSBTVVN2NCAqLworCQkJZXhzdGF0ID0gMTI3OworCQkJdW53aW5kKExFUlJPUik7CisJCX0KKwkJa3NobmFtZSA9IHMtPmZpbGU7CisJfSBlbHNlIHsKKwkJRmxhZyhGU1RESU4pID0gMTsKKwkJcyA9IHB1c2hzKFNTVERJTiwgQVRFTVApOworCQlzLT5maWxlID0gIjxzdGRpbj4iOworCQlzLT51LnNoZiA9IHNoZl9mZG9wZW4oMCwgU0hGX1JEIHwgY2FuX3NlZWsoMCksCisJCSAgICBOVUxMKTsKKwkJaWYgKGlzYXR0eSgwKSAmJiBpc2F0dHkoMikpIHsKKwkJCUZsYWcoRlRBTEtJTkcpID0gRmxhZyhGVEFMS0lOR19JKSA9IDE7CisJCQkvKiBUaGUgZm9sbG93aW5nIG9ubHkgaWYgaXNhdHR5KDApICovCisJCQlzLT5mbGFncyB8PSBTRl9UVFk7CisJCQlzLT51LnNoZi0+ZmxhZ3MgfD0gU0hGX0lOVEVSUlVQVDsKKwkJCXMtPmZpbGUgPSBOVUxMOworCQl9CisJfQorCisJLyogdGhpcyBiaXphcnJlbmVzcyBpcyBtYW5kYXRlZCBieSBQT1NJWCAqLworCWlmIChmc3RhdCgwLCAmc19zdGRpbikgPj0gMCAmJiBTX0lTQ0hSKHNfc3RkaW4uc3RfbW9kZSkgJiYKKwkgICAgRmxhZyhGVEFMS0lORykpCisJCXJlc2V0X25vbmJsb2NrKDApOworCisJLyogaW5pdGlhbGlzZSBqb2IgY29udHJvbCAqLworCWpfaW5pdCgpOworCS8qIHNldDogMC8xOyB1bnNldDogMi0+MCAqLworCVVURk1PREUgPSB1dGZfZmxhZyAmIDE7CisJLyogRG8gdGhpcyBhZnRlciBqX2luaXQoKSwgYXMgdHR5X2ZkIGlzIG5vdCBpbml0aWFsaXNlZCB1bnRpbCB0aGVuICovCisJaWYgKEZsYWcoRlRBTEtJTkcpKSB7CisJCWlmICh1dGZfZmxhZyA9PSAyKSB7CisjaWZuZGVmIE1LU0hfQVNTVU1FX1VURjgKKyNkZWZpbmUgaXN1Yyh4KQkoKCh4KSAhPSBOVUxMKSAmJiBcCisJCSAgICAoc3RyaXN0cigoeCksICJVVEYtOCIpIHx8IHN0cmlzdHIoKHgpLCAidXRmOCIpKSkKKwkJLyogQ2hlY2sgaWYgd2UncmUgaW4gYSBVVEYtOCBsb2NhbGUgKi8KKwkJCWNvbnN0IGNoYXIgKmNjcDsKKworI2lmIEhBVkVfU0VUTE9DQUxFX0NUWVBFCisJCQljY3AgPSBzZXRsb2NhbGUoTENfQ1RZUEUsICIiKTsKKyNpZiBIQVZFX0xBTkdJTkZPX0NPREVTRVQKKwkJCWlmICghaXN1YyhjY3ApKQorCQkJCWNjcCA9IG5sX2xhbmdpbmZvKENPREVTRVQpOworI2VuZGlmCisjZWxzZQorCQkJLyogdGhlc2Ugd2VyZSBpbXBvcnRlZCBmcm9tIGVudmlyb24gZWFybGllciAqLworCQkJY2NwID0gc3RyX3ZhbChnbG9iYWwoIkxDX0FMTCIpKTsKKwkJCWlmIChjY3AgPT0gbnVsbCkKKwkJCQljY3AgPSBzdHJfdmFsKGdsb2JhbCgiTENfQ1RZUEUiKSk7CisJCQlpZiAoY2NwID09IG51bGwpCisJCQkJY2NwID0gc3RyX3ZhbChnbG9iYWwoIkxBTkciKSk7CisjZW5kaWYKKwkJCVVURk1PREUgPSBpc3VjKGNjcCk7CisjdW5kZWYgaXN1YworI2VsaWYgTUtTSF9BU1NVTUVfVVRGOAorCQkJVVRGTU9ERSA9IDE7CisjZWxzZQorCQkJVVRGTU9ERSA9IDA7CisjZW5kaWYKKwkJfQorCQl4X2luaXQoKTsKKwl9CisKKyNpZmRlZiBTSUdXSU5DSAorCXNpZ3RyYXBzW1NJR1dJTkNIXS5mbGFncyB8PSBURl9TSEVMTF9VU0VTOworCXNldHNpZygmc2lndHJhcHNbU0lHV0lOQ0hdLCB4X3NpZ3dpbmNoLAorCSAgICBTU19SRVNUT1JFX09SSUd8U1NfRk9SQ0V8U1NfU0hUUkFQKTsKKyNlbmRpZgorCisJbCA9IGUtPmxvYzsKKwlsLT5hcmd2ID0gJmFyZ3ZbYXJnaSAtIDFdOworCWwtPmFyZ2MgPSBhcmdjIC0gYXJnaTsKKwlsLT5hcmd2WzBdID0ga3NobmFtZTsKKwlnZXRvcHRzX3Jlc2V0KDEpOworCisJLyogRGlzYWJsZSBkdXJpbmcgLnByb2ZpbGUvRU5WIHJlYWRpbmcgKi8KKwlyZXN0cmljdGVkID0gRmxhZyhGUkVTVFJJQ1RFRCk7CisJRmxhZyhGUkVTVFJJQ1RFRCkgPSAwOworCWVycmV4aXQgPSBGbGFnKEZFUlJFWElUKTsKKwlGbGFnKEZFUlJFWElUKSA9IDA7CisKKwkvKiBEbyB0aGlzIGJlZm9yZSBwcm9maWxlLyRFTlYgc28gdGhhdCBpZiBpdCBjYXVzZXMgcHJvYmxlbXMgaW4gdGhlbSwKKwkgKiB1c2VyIHdpbGwga25vdyB3aHkgdGhpbmdzIGJyb2tlLgorCSAqLworCWlmICghY3VycmVudF93ZFswXSAmJiBGbGFnKEZUQUxLSU5HKSkKKwkJd2FybmluZ2YoZmFsc2UsICJDYW5ub3QgZGV0ZXJtaW5lIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkiKTsKKworCWlmIChGbGFnKEZMT0dJTikpIHsKKwkJaW5jbHVkZShLU0hfU1lTVEVNX1BST0ZJTEUsIDAsIE5VTEwsIDEpOworCQlpZiAoIUZsYWcoRlBSSVZJTEVHRUQpKQorCQkJaW5jbHVkZShzdWJzdGl0dXRlKCIkSE9NRS8ucHJvZmlsZSIsIDApLCAwLAorCQkJICAgIE5VTEwsIDEpOworCX0KKwlpZiAoRmxhZyhGUFJJVklMRUdFRCkpCisJCWluY2x1ZGUoIi9ldGMvc3VpZF9wcm9maWxlIiwgMCwgTlVMTCwgMSk7CisJZWxzZSBpZiAoRmxhZyhGVEFMS0lORykpIHsKKwkJY2hhciAqZW52X2ZpbGU7CisKKwkJLyogaW5jbHVkZSAkRU5WICovCisJCWVudl9maWxlID0gc3Vic3RpdHV0ZShzdWJzdGl0dXRlKCIke0VOVjotIiBNS1NIUkNfUEFUSCAifSIsIDApLAorCQkgICAgRE9USUxERSk7CisJCWlmICgqZW52X2ZpbGUgIT0gJ1wwJykKKwkJCWluY2x1ZGUoZW52X2ZpbGUsIDAsIE5VTEwsIDEpOworCX0KKworCWlmIChyZXN0cmljdGVkKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICpyZXN0cl9jb21bXSA9IHsKKwkJCVRfdHlwZXNldCwgIi1yIiwgIlBBVEgiLAorCQkJIkVOViIsICJTSEVMTCIsCisJCQlOVUxMCisJCX07CisJCXNoY29tZXhlYyhyZXN0cl9jb20pOworCQkvKiBBZnRlciB0eXBlc2V0IGNvbW1hbmQuLi4gKi8KKwkJRmxhZyhGUkVTVFJJQ1RFRCkgPSAxOworCX0KKwlGbGFnKEZFUlJFWElUKSA9IGVycmV4aXQ7CisKKwlpZiAoRmxhZyhGVEFMS0lORykpIHsKKwkJaGlzdF9pbml0KHMpOworCQlhbGFybV9pbml0KCk7CisJfSBlbHNlCisJCUZsYWcoRlRSQUNLQUxMKSA9IDE7CS8qIHNldCBhZnRlciBFTlYgKi8KKworCXJldHVybiAocyk7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKQoreworCVNvdXJjZSAqczsKKworCWtzaHN0YXRlX3YubGNnX3N0YXRlXyA9IDUzODE7CisKKwlpZiAoKHMgPSBta3NoX2luaXQoYXJnYywgYXJndikpKSB7CisJCS8qIHB1dCBtb3JlIGVudHJvcHkgaW50byB0aGUgTENHICovCisJCWNoYW5nZV9yYW5kb20ocywgc2l6ZW9mKCpzKSk7CisJCS8qIGRvZXNu4oCZdCByZXR1cm4gKi8KKwkJc2hlbGwocywgdHJ1ZSk7CisJfQorCXJldHVybiAoMSk7Cit9CisKK2ludAoraW5jbHVkZShjb25zdCBjaGFyICpuYW1lLCBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGludCBpbnRyX29rKQoreworCVNvdXJjZSAqdm9sYXRpbGUgcyA9IE5VTEw7CisJc3RydWN0IHNoZiAqc2hmOworCWNvbnN0IGNoYXIgKip2b2xhdGlsZSBvbGRfYXJndjsKKwl2b2xhdGlsZSBpbnQgb2xkX2FyZ2M7CisJaW50IGk7CisKKwlzaGYgPSBzaGZfb3BlbihuYW1lLCBPX1JET05MWSwgMCwgU0hGX01BUEhJIHwgU0hGX0NMRVhFQyk7CisJaWYgKHNoZiA9PSBOVUxMKQorCQlyZXR1cm4gKC0xKTsKKworCWlmIChhcmd2KSB7CisJCW9sZF9hcmd2ID0gZS0+bG9jLT5hcmd2OworCQlvbGRfYXJnYyA9IGUtPmxvYy0+YXJnYzsKKwl9IGVsc2UgeworCQlvbGRfYXJndiA9IE5VTEw7CisJCW9sZF9hcmdjID0gMDsKKwl9CisJbmV3ZW52KEVfSU5DTCk7CisJaSA9IHNpZ3NldGptcChlLT5qYnVmLCAwKTsKKwlpZiAoaSkgeworCQlxdWl0ZW52KHMgPyBzLT51LnNoZiA6IE5VTEwpOworCQlpZiAob2xkX2FyZ3YpIHsKKwkJCWUtPmxvYy0+YXJndiA9IG9sZF9hcmd2OworCQkJZS0+bG9jLT5hcmdjID0gb2xkX2FyZ2M7CisJCX0KKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgTFJFVFVSTjoKKwkJY2FzZSBMRVJST1I6CisJCQlyZXR1cm4gKGV4c3RhdCAmIDB4ZmYpOyAvKiBzZWUgYmVsb3cgKi8KKwkJY2FzZSBMSU5UUjoKKwkJCS8qIGludHJfb2sgaXMgc2V0IGlmIHdlIGFyZSBpbmNsdWRpbmcgLnByb2ZpbGUgb3IgJEVOVi4KKwkJCSAqIElmIHVzZXIgXkNzIG91dCwgd2UgZG9uJ3Qgd2FudCB0byBraWxsIHRoZSBzaGVsbC4uLgorCQkJICovCisJCQlpZiAoaW50cl9vayAmJiAoZXhzdGF0IC0gMTI4KSAhPSBTSUdURVJNKQorCQkJCXJldHVybiAoMSk7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlIExFWElUOgorCQljYXNlIExMRUFWRToKKwkJY2FzZSBMU0hFTEw6CisJCQl1bndpbmQoaSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCWRlZmF1bHQ6CisJCQlpbnRlcm5hbF9lcnJvcmYoImluY2x1ZGU6ICVkIiwgaSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwl9CisJaWYgKGFyZ3YpIHsKKwkJZS0+bG9jLT5hcmd2ID0gYXJndjsKKwkJZS0+bG9jLT5hcmdjID0gYXJnYzsKKwl9CisJcyA9IHB1c2hzKFNGSUxFLCBBVEVNUCk7CisJcy0+dS5zaGYgPSBzaGY7CisJc3RyZHVweChzLT5maWxlLCBuYW1lLCBBVEVNUCk7CisJaSA9IHNoZWxsKHMsIGZhbHNlKTsKKwlxdWl0ZW52KHMtPnUuc2hmKTsKKwlpZiAob2xkX2FyZ3YpIHsKKwkJZS0+bG9jLT5hcmd2ID0gb2xkX2FyZ3Y7CisJCWUtPmxvYy0+YXJnYyA9IG9sZF9hcmdjOworCX0KKwlyZXR1cm4gKGkgJiAweGZmKTsJLyogJiAweGZmIHRvIGVuc3VyZSB2YWx1ZSBub3QgLTEgKi8KK30KKworLyogc3Bhd24gYSBjb21tYW5kIGludG8gYSBzaGVsbCBvcHRpb25hbGx5IGtlZXBpbmcgdHJhY2sgb2YgdGhlIGxpbmUgbnVtYmVyICovCitpbnQKK2NvbW1hbmQoY29uc3QgY2hhciAqY29tbSwgaW50IGxpbmUpCit7CisJU291cmNlICpzOworCisJcyA9IHB1c2hzKFNTVFJJTkcsIEFURU1QKTsKKwlzLT5zdGFydCA9IHMtPnN0ciA9IGNvbW07CisJcy0+bGluZSA9IGxpbmU7CisJcmV0dXJuIChzaGVsbChzLCBmYWxzZSkpOworfQorCisvKgorICogcnVuIHRoZSBjb21tYW5kcyBmcm9tIHRoZSBpbnB1dCBzb3VyY2UsIHJldHVybmluZyBzdGF0dXMuCisgKi8KK2ludAorc2hlbGwoU291cmNlICogdm9sYXRpbGUgcywgdm9sYXRpbGUgaW50IHRvcGxldmVsKQoreworCXN0cnVjdCBvcCAqdDsKKwl2b2xhdGlsZSBpbnQgd2FzdHR5ID0gcy0+ZmxhZ3MgJiBTRl9UVFk7CisJdm9sYXRpbGUgaW50IGF0dGVtcHRzID0gMTM7CisJdm9sYXRpbGUgaW50IGludGVyYWN0aXZlID0gRmxhZyhGVEFMS0lORykgJiYgdG9wbGV2ZWw7CisJU291cmNlICp2b2xhdGlsZSBvbGRfc291cmNlID0gc291cmNlOworCWludCBpOworCisJcy0+ZmxhZ3MgfD0gU0ZfRklSU1Q7CS8qIGVuYWJsZSBVVEYtOCBCT00gY2hlY2sgKi8KKworCW5ld2VudihFX1BBUlNFKTsKKwlpZiAoaW50ZXJhY3RpdmUpCisJCXJlYWxseV9leGl0ID0gMDsKKwlpID0gc2lnc2V0am1wKGUtPmpidWYsIDApOworCWlmIChpKSB7CisJCXN3aXRjaCAoaSkgeworCQljYXNlIExJTlRSOiAvKiB3ZSBnZXQgaGVyZSBpZiBTSUdJTlQgbm90IGNhdWdodCBvciBpZ25vcmVkICovCisJCWNhc2UgTEVSUk9SOgorCQljYXNlIExTSEVMTDoKKwkJCWlmIChpbnRlcmFjdGl2ZSkgeworCQkJCWlmIChpID09IExJTlRSKQorCQkJCQlzaGVsbGYoIlxuIik7CisJCQkJLyogUmVzZXQgYW55IGVvZiB0aGF0IHdhcyByZWFkIGFzIHBhcnQgb2YgYQorCQkJCSAqIG11bHRpbGluZSBjb21tYW5kLgorCQkJCSAqLworCQkJCWlmIChGbGFnKEZJR05PUkVFT0YpICYmIHMtPnR5cGUgPT0gU0VPRiAmJgorCQkJCSAgICB3YXN0dHkpCisJCQkJCXMtPnR5cGUgPSBTU1RESU47CisJCQkJLyogVXNlZCBieSBleGl0IGNvbW1hbmQgdG8gZ2V0IGJhY2sgdG8KKwkJCQkgKiB0b3AgbGV2ZWwgc2hlbGwuIEtpbmQgb2Ygc3RyYW5nZSBzaW5jZQorCQkJCSAqIGludGVyYWN0aXZlIGlzIHNldCBpZiB3ZSBhcmUgcmVhZGluZyBmcm9tCisJCQkJICogYSB0dHksIGJ1dCB0byBoYXZlIHN0b3BwZWQgam9icywgb25lIG9ubHkKKwkJCQkgKiBuZWVkcyBGTU9OSVRPUiBzZXQgKG5vdCBGVEFMS0lORy9TRl9UVFkpLi4uCisJCQkJICovCisJCQkJLyogdG9zcyBhbnkgaW5wdXQgd2UgaGF2ZSBzbyBmYXIgKi8KKwkJCQlzLT5zdGFydCA9IHMtPnN0ciA9IG51bGw7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlIExFWElUOgorCQljYXNlIExMRUFWRToKKwkJY2FzZSBMUkVUVVJOOgorCQkJc291cmNlID0gb2xkX3NvdXJjZTsKKwkJCXF1aXRlbnYoTlVMTCk7CisJCQl1bndpbmQoaSk7CS8qIGtlZXAgb24gZ29pbmcgKi8KKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJZGVmYXVsdDoKKwkJCXNvdXJjZSA9IG9sZF9zb3VyY2U7CisJCQlxdWl0ZW52KE5VTEwpOworCQkJaW50ZXJuYWxfZXJyb3JmKCJzaGVsbDogJWQiLCBpKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCX0KKwl3aGlsZSAoMSkgeworCQlpZiAodHJhcCkKKwkJCXJ1bnRyYXBzKDApOworCisJCWlmIChzLT5uZXh0ID09IE5VTEwpIHsKKwkJCWlmIChGbGFnKEZWRVJCT1NFKSkKKwkJCQlzLT5mbGFncyB8PSBTRl9FQ0hPOworCQkJZWxzZQorCQkJCXMtPmZsYWdzICY9IH5TRl9FQ0hPOworCQl9CisJCWlmIChpbnRlcmFjdGl2ZSkgeworCQkJal9ub3RpZnkoKTsKKwkJCXNldF9wcm9tcHQoUFMxLCBzKTsKKwkJfQorCQl0ID0gY29tcGlsZShzKTsKKwkJaWYgKHQgIT0gTlVMTCAmJiB0LT50eXBlID09IFRFT0YpIHsKKwkJCWlmICh3YXN0dHkgJiYgRmxhZyhGSUdOT1JFRU9GKSAmJiAtLWF0dGVtcHRzID4gMCkgeworCQkJCXNoZWxsZigiVXNlICdleGl0JyB0byBsZWF2ZSBrc2hcbiIpOworCQkJCXMtPnR5cGUgPSBTU1RESU47CisJCQl9IGVsc2UgaWYgKHdhc3R0eSAmJiAhcmVhbGx5X2V4aXQgJiYKKwkJCSAgICBqX3N0b3BwZWRfcnVubmluZygpKSB7CisJCQkJcmVhbGx5X2V4aXQgPSAxOworCQkJCXMtPnR5cGUgPSBTU1RESU47CisJCQl9IGVsc2UgeworCQkJCS8qIHRoaXMgZm9yIFBPU0lYIHdoaWNoIHNheXMgRVhJVCB0cmFwcworCQkJCSAqIHNoYWxsIGJlIHRha2VuIGluIHRoZSBlbnZpcm9ubWVudAorCQkJCSAqIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsYXN0IGNvbW1hbmQKKwkJCQkgKiBleGVjdXRlZC4KKwkJCQkgKi8KKwkJCQlpZiAodG9wbGV2ZWwpCisJCQkJCXVud2luZChMRVhJVCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHQgJiYgKCFGbGFnKEZOT0VYRUMpIHx8IChzLT5mbGFncyAmIFNGX1RUWSkpKQorCQkJZXhzdGF0ID0gZXhlY3V0ZSh0LCAwLCBOVUxMKTsKKworCQlpZiAodCAhPSBOVUxMICYmIHQtPnR5cGUgIT0gVEVPRiAmJiBpbnRlcmFjdGl2ZSAmJiByZWFsbHlfZXhpdCkKKwkJCXJlYWxseV9leGl0ID0gMDsKKworCQlyZWNsYWltKCk7CisJfQorCXF1aXRlbnYoTlVMTCk7CisJc291cmNlID0gb2xkX3NvdXJjZTsKKwlyZXR1cm4gKGV4c3RhdCk7Cit9CisKKy8qIHJldHVybiB0byBjbG9zZXN0IGVycm9yIGhhbmRsZXIgb3Igc2hlbGwoKSwgZXhpdCBpZiBub25lIGZvdW5kICovCit2b2lkCit1bndpbmQoaW50IGkpCit7CisJLyogb3JkZXJpbmcgZm9yIEVYSVQgdnMgRVJSIGlzIGEgYml0IG9kZCAodGhpcyBpcyB3aGF0IEFUJlQga3NoIGRvZXMpICovCisJaWYgKGkgPT0gTEVYSVQgfHwgKEZsYWcoRkVSUkVYSVQpICYmIChpID09IExFUlJPUiB8fCBpID09IExJTlRSKSAmJgorCSAgICBzaWd0cmFwc1tTSUdFWElUX10udHJhcCkpIHsKKwkJcnVudHJhcCgmc2lndHJhcHNbU0lHRVhJVF9dKTsKKwkJaSA9IExMRUFWRTsKKwl9IGVsc2UgaWYgKEZsYWcoRkVSUkVYSVQpICYmIChpID09IExFUlJPUiB8fCBpID09IExJTlRSKSkgeworCQlydW50cmFwKCZzaWd0cmFwc1tTSUdFUlJfXSk7CisJCWkgPSBMTEVBVkU7CisJfQorCXdoaWxlICgxKSB7CisJCXN3aXRjaCAoZS0+dHlwZSkgeworCQljYXNlIEVfUEFSU0U6CisJCWNhc2UgRV9GVU5DOgorCQljYXNlIEVfSU5DTDoKKwkJY2FzZSBFX0xPT1A6CisJCWNhc2UgRV9FUlJIOgorCQkJc2lnbG9uZ2ptcChlLT5qYnVmLCBpKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJY2FzZSBFX05PTkU6CisJCQlpZiAoaSA9PSBMSU5UUikKKwkJCQllLT5mbGFncyB8PSBFRl9GQUtFX1NJR0RJRTsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWRlZmF1bHQ6CisJCQlxdWl0ZW52KE5VTEwpOworCQl9CisJfQorfQorCit2b2lkCituZXdlbnYoaW50IHR5cGUpCit7CisJc3RydWN0IGVudiAqZXA7CisJY2hhciAqY3A7CisKKwkvKgorCSAqIHN0cnVjdCBlbnYgaW5jbHVkZXMgQUxMT0NfSVRFTSBmb3IgYWxpZ25tZW50IGNvbnN0cmFpbnRzCisJICogc28gZmlyc3QgZ2V0IHRoZSBhY3R1YWxseSB1c2VkIG1lbW9yeSwgdGhlbiBhc3NpZ24gaXQKKwkgKi8KKwljcCA9IGFsbG9jKHNpemVvZihzdHJ1Y3QgZW52KSAtIEFMTE9DX1NJWkUsIEFURU1QKTsKKwllcCA9ICh2b2lkICopKGNwIC0gQUxMT0NfU0laRSk7CS8qIHVuZG8gd2hhdCBhbGxvYygpIGRpZCAqLworCS8qIGluaXRpYWxpc2UgcHVibGljIG1lbWJlcnMgb2Ygc3RydWN0IGVudiAobm90IHRoZSBBTExPQ19JVEVNKSAqLworCWFpbml0KCZlcC0+YXJlYSk7CisJZXAtPm9lbnYgPSBlOworCWVwLT5sb2MgPSBlLT5sb2M7CisJZXAtPnNhdmVmZCA9IE5VTEw7CisJZXAtPnRlbXBzID0gTlVMTDsKKwllcC0+dHlwZSA9IHR5cGU7CisJZXAtPmZsYWdzID0gMDsKKwkvKiBqdW1wIGJ1ZmZlciBpcyBpbnZhbGlkIGJlY2F1c2UgZmxhZ3MgPT0gMCAqLworCWUgPSBlcDsKK30KKwordm9pZAorcXVpdGVudihzdHJ1Y3Qgc2hmICpzaGYpCit7CisJc3RydWN0IGVudiAqZXAgPSBlOworCWNoYXIgKmNwOworCWludCBmZDsKKworCWlmIChlcC0+b2VudiAmJiBlcC0+b2Vudi0+bG9jICE9IGVwLT5sb2MpCisJCXBvcGJsb2NrKCk7CisJaWYgKGVwLT5zYXZlZmQgIT0gTlVMTCkgeworCQlmb3IgKGZkID0gMDsgZmQgPCBOVUZJTEU7IGZkKyspCisJCQkvKiBpZiBlcC0+c2F2ZWZkW2ZkXSA8IDAsIG1lYW5zIGZkIHdhcyBjbG9zZWQgKi8KKwkJCWlmIChlcC0+c2F2ZWZkW2ZkXSkKKwkJCQlyZXN0ZmQoZmQsIGVwLT5zYXZlZmRbZmRdKTsKKwkJaWYgKGVwLT5zYXZlZmRbMl0pCS8qIENsZWFyIGFueSB3cml0ZSBlcnJvcnMgKi8KKwkJCXNoZl9yZW9wZW4oMiwgU0hGX1dSLCBzaGxfb3V0KTsKKwl9CisJLyogQm90dG9tIG9mIHRoZSBzdGFjay4KKwkgKiBFaXRoZXIgbWFpbiBzaGVsbCBpcyBleGl0aW5nIG9yIGNsZWFudXBfcGFyZW50c19lbnYoKSB3YXMgY2FsbGVkLgorCSAqLworCWlmIChlcC0+b2VudiA9PSBOVUxMKSB7CisJCWlmIChlcC0+dHlwZSA9PSBFX05PTkUpIHsJLyogTWFpbiBzaGVsbCBleGl0aW5nPyAqLworI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCisJCQlpZiAoRmxhZyhGVEFMS0lORykpCisJCQkJaGlzdF9maW5pc2goKTsKKyNlbmRpZgorCQkJal9leGl0KCk7CisJCQlpZiAoZXAtPmZsYWdzICYgRUZfRkFLRV9TSUdESUUpIHsKKwkJCQlpbnQgc2lnID0gZXhzdGF0IC0gMTI4OworCisJCQkJLyogaGFtIHVwIG91ciBkZWF0aCBhIGJpdCAoQVQmVCBrc2gKKwkJCQkgKiBvbmx5IHNlZW1zIHRvIGRvIHRoaXMgZm9yIFNJR1RFUk0pCisJCQkJICogRG9uJ3QgZG8gaXQgZm9yIFNJR1FVSVQsIHNpbmNlIHdlJ2QKKwkJCQkgKiBkdW1wIGEgY29yZS4uCisJCQkJICovCisJCQkJaWYgKChzaWcgPT0gU0lHSU5UIHx8IHNpZyA9PSBTSUdURVJNKSAmJgorCQkJCSAgICAoa3NocGdycCA9PSBrc2hwaWQpKSB7CisJCQkJCXNldHNpZygmc2lndHJhcHNbc2lnXSwgU0lHX0RGTCwKKwkJCQkJICAgIFNTX1JFU1RPUkVfQ1VSUiB8IFNTX0ZPUkNFKTsKKwkJCQkJa2lsbCgwLCBzaWcpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoc2hmKQorCQkJc2hmX2Nsb3NlKHNoZik7CisJCXJlY2xhaW0oKTsKKwkJZXhpdChleHN0YXQpOworCX0KKwlpZiAoc2hmKQorCQlzaGZfY2xvc2Uoc2hmKTsKKwlyZWNsYWltKCk7CisKKwllID0gZS0+b2VudjsKKworCS8qIGZyZWUgdGhlIHN0cnVjdCBlbnYgLSB0cmlja3kgZHVlIHRvIHRoZSBBTExPQ19JVEVNIGluc2lkZSAqLworCWNwID0gKHZvaWQgKillcDsKKwlhZnJlZShjcCArIEFMTE9DX1NJWkUsIEFURU1QKTsKK30KKworLyogQ2FsbGVkIGFmdGVyIGEgZm9yayB0byBjbGVhbnVwIHN0dWZmIGxlZnQgb3ZlciBmcm9tIHBhcmVudHMgZW52aXJvbm1lbnQgKi8KK3ZvaWQKK2NsZWFudXBfcGFyZW50c19lbnYodm9pZCkKK3sKKwlzdHJ1Y3QgZW52ICplcDsKKwlpbnQgZmQ7CisKKwlta3NzZXJ0KGUgIT0gTlVMTCk7CisKKwkvKgorCSAqIERvbid0IGNsZWFuIHVwIHRlbXBvcmFyeSBmaWxlcyAtIHBhcmVudCB3aWxsIHByb2JhYmx5IG5lZWQgdGhlbS4KKwkgKiBBbHNvLCBjYW4ndCBlYXNpbHkgcmVjbGFpbSBtZW1vcnkgc2luY2UgdmFyaWFibGVzLCBldGMuIGNvdWxkIGJlCisJICogYW55d2hlcmUuCisJICovCisKKwkvKiBjbG9zZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBoaWRpbmcgaW4gc2F2ZWZkICovCisJZm9yIChlcCA9IGU7IGVwOyBlcCA9IGVwLT5vZW52KSB7CisJCWlmIChlcC0+c2F2ZWZkKSB7CisJCQlmb3IgKGZkID0gMDsgZmQgPCBOVUZJTEU7IGZkKyspCisJCQkJaWYgKGVwLT5zYXZlZmRbZmRdID4gMCkKKwkJCQkJY2xvc2UoZXAtPnNhdmVmZFtmZF0pOworCQkJYWZyZWUoZXAtPnNhdmVmZCwgJmVwLT5hcmVhKTsKKwkJCWVwLT5zYXZlZmQgPSBOVUxMOworCQl9CisJfQorCWUtPm9lbnYgPSBOVUxMOworfQorCisvKiBDYWxsZWQganVzdCBiZWZvcmUgYW4gZXhlY3ZlIGNsZWFudXAgc3R1ZmYgdGVtcG9yYXJ5IGZpbGVzICovCit2b2lkCitjbGVhbnVwX3Byb2NfZW52KHZvaWQpCit7CisJc3RydWN0IGVudiAqZXA7CisKKwlmb3IgKGVwID0gZTsgZXA7IGVwID0gZXAtPm9lbnYpCisJCXJlbW92ZV90ZW1wcyhlcC0+dGVtcHMpOworfQorCisvKiByZW1vdmUgdGVtcCBmaWxlcyBhbmQgZnJlZSBBVEVNUCBBcmVhICovCitzdGF0aWMgdm9pZAorcmVjbGFpbSh2b2lkKQoreworCXJlbW92ZV90ZW1wcyhlLT50ZW1wcyk7CisJZS0+dGVtcHMgPSBOVUxMOworCWFmcmVlYWxsKCZlLT5hcmVhKTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV90ZW1wcyhzdHJ1Y3QgdGVtcCAqdHApCit7CisJZm9yICg7IHRwICE9IE5VTEw7IHRwID0gdHAtPm5leHQpCisJCWlmICh0cC0+cGlkID09IHByb2NwaWQpCisJCQl1bmxpbmsodHAtPm5hbWUpOworfQorCisvKiBJbml0aWFsaXNlIHR0eV9mZC4gVXNlZCBmb3Igc2F2aW5nL3Jlc2V0aW5nIHR0eSBtb2RlcyB1cG9uCisgKiBmb3JlZ3JvdW5kIGpvYiBjb21wbGV0aW9uIGFuZCBmb3Igc2V0dGluZyB1cCB0dHkgcHJvY2VzcyBncm91cC4KKyAqLwordm9pZAordHR5X2luaXQoYm9vbCBpbml0X3R0eXN0YXRlLCBib29sIG5lZWRfdHR5KQoreworCWJvb2wgZG9fY2xvc2UgPSB0cnVlOworCWludCB0ZmQ7CisKKwlpZiAodHR5X2ZkID49IDApIHsKKwkJY2xvc2UodHR5X2ZkKTsKKwkJdHR5X2ZkID0gLTE7CisJfQorCXR0eV9kZXZ0dHkgPSAxOworCisjaWZkZWYgX1VXSU4KKwkvKiBYWFggaW1ha2Ugc3R5bGUgKi8KKwlpZiAoaXNhdHR5KDMpKQorCQl0ZmQgPSAzOworCWVsc2UKKyNlbmRpZgorCWlmICgodGZkID0gb3BlbigiL2Rldi90dHkiLCBPX1JEV1IsIDApKSA8IDApIHsKKwkJdHR5X2RldnR0eSA9IDA7CisJCWlmIChuZWVkX3R0eSkKKwkJCXdhcm5pbmdmKGZhbHNlLAorCQkJICAgICJObyBjb250cm9sbGluZyB0dHkgKG9wZW4gL2Rldi90dHk6ICVzKSIsCisJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJaWYgKHRmZCA8IDApIHsKKwkJZG9fY2xvc2UgPSBmYWxzZTsKKwkJaWYgKGlzYXR0eSgwKSkKKwkJCXRmZCA9IDA7CisJCWVsc2UgaWYgKGlzYXR0eSgyKSkKKwkJCXRmZCA9IDI7CisJCWVsc2UgeworCQkJaWYgKG5lZWRfdHR5KQorCQkJCXdhcm5pbmdmKGZhbHNlLAorCQkJCSAgICAiQ2FuJ3QgZmluZCB0dHkgZmlsZSBkZXNjcmlwdG9yIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKCh0dHlfZmQgPSBmY250bCh0ZmQsIEZfRFVQRkQsIEZEQkFTRSkpIDwgMCkgeworCQlpZiAobmVlZF90dHkpCisJCQl3YXJuaW5nZihmYWxzZSwgImpfdHR5aW5pdDogZHVwIG9mIHR0eSBmZCBmYWlsZWQ6ICVzIiwKKwkJCSAgICBzdHJlcnJvcihlcnJubykpOworCX0gZWxzZSBpZiAoZmNudGwodHR5X2ZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKSA8IDApIHsKKwkJaWYgKG5lZWRfdHR5KQorCQkJd2FybmluZ2YoZmFsc2UsCisJCQkgICAgImpfdHR5aW5pdDogY2FuJ3Qgc2V0IGNsb3NlLW9uLWV4ZWMgZmxhZzogJXMiLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKHR0eV9mZCk7CisJCXR0eV9mZCA9IC0xOworCX0gZWxzZSBpZiAoaW5pdF90dHlzdGF0ZSkKKwkJdGNnZXRhdHRyKHR0eV9mZCwgJnR0eV9zdGF0ZSk7CisJaWYgKGRvX2Nsb3NlKQorCQljbG9zZSh0ZmQpOworfQorCit2b2lkCit0dHlfY2xvc2Uodm9pZCkKK3sKKwlpZiAodHR5X2ZkID49IDApIHsKKwkJY2xvc2UodHR5X2ZkKTsKKwkJdHR5X2ZkID0gLTE7CisJfQorfQorCisvKiBBIHNoZWxsIGVycm9yIG9jY3VycmVkIChlZywgc3ludGF4IGVycm9yLCBldGMuKSAqLwordm9pZAorZXJyb3JmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisKKwlzaGxfc3Rkb3V0X29rID0gMDsJLyogZGVidWdnaW5nOiBub3RlIHRoYXQgc3Rkb3V0IG5vdCB2YWxpZCAqLworCWV4c3RhdCA9IDE7CisJaWYgKCpmbXQgIT0gMSkgeworCQllcnJvcl9wcmVmaXgodHJ1ZSk7CisJCXZhX3N0YXJ0KHZhLCBmbXQpOworCQlzaGZfdmZwcmludGYoc2hsX291dCwgZm10LCB2YSk7CisJCXZhX2VuZCh2YSk7CisJCXNoZl9wdXRjaGFyKCdcbicsIHNobF9vdXQpOworCX0KKwlzaGZfZmx1c2goc2hsX291dCk7CisJdW53aW5kKExFUlJPUik7Cit9CisKKy8qIGxpa2UgZXJyb3JmKCksIGJ1dCBubyB1bndpbmQgaXMgZG9uZSAqLwordm9pZAord2FybmluZ2YoYm9vbCBmaWxlbGluZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKworCWVycm9yX3ByZWZpeChmaWxlbGluZSk7CisJdmFfc3RhcnQodmEsIGZtdCk7CisJc2hmX3ZmcHJpbnRmKHNobF9vdXQsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7CisJc2hmX3B1dGNoYXIoJ1xuJywgc2hsX291dCk7CisJc2hmX2ZsdXNoKHNobF9vdXQpOworfQorCisvKiBVc2VkIGJ5IGJ1aWx0LWluIHV0aWxpdGllcyB0byBwcmVmaXggc2hlbGwgYW5kIHV0aWxpdHkgbmFtZSB0byBtZXNzYWdlCisgKiAoYWxzbyB1bndpbmRzIGVudmlyb25tZW50cyBmb3Igc3BlY2lhbCBidWlsdGlucykuCisgKi8KK3ZvaWQKK2JpX2Vycm9yZihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCisJc2hsX3N0ZG91dF9vayA9IDA7CS8qIGRlYnVnZ2luZzogbm90ZSB0aGF0IHN0ZG91dCBub3QgdmFsaWQgKi8KKwlleHN0YXQgPSAxOworCWlmICgqZm10ICE9IDEpIHsKKwkJZXJyb3JfcHJlZml4KHRydWUpOworCQkvKiBub3Qgc2V0IHdoZW4gbWFpbigpIGNhbGxzIHBhcnNlX2FyZ3MoKSAqLworCQlpZiAoYnVpbHRpbl9hcmd2MCkKKwkJCXNoZl9mcHJpbnRmKHNobF9vdXQsICIlczogIiwgYnVpbHRpbl9hcmd2MCk7CisJCXZhX3N0YXJ0KHZhLCBmbXQpOworCQlzaGZfdmZwcmludGYoc2hsX291dCwgZm10LCB2YSk7CisJCXZhX2VuZCh2YSk7CisJCXNoZl9wdXRjaGFyKCdcbicsIHNobF9vdXQpOworCX0KKwlzaGZfZmx1c2goc2hsX291dCk7CisJLyogUE9TSVggc3BlY2lhbCBidWlsdGlucyBhbmQga3NoIHNwZWNpYWwgYnVpbHRpbnMgY2F1c2UKKwkgKiBub24taW50ZXJhY3RpdmUgc2hlbGxzIHRvIGV4aXQuCisJICogWFhYIG9kZCB1c2Ugb2YgS0VFUEFTTjsgYWxzbyBtYXkgbm90IHdhbnQgTEVSUk9SIGhlcmUKKwkgKi8KKwlpZiAoYnVpbHRpbl9mbGFnICYgU1BFQ19CSSkgeworCQlidWlsdGluX2FyZ3YwID0gTlVMTDsKKwkJdW53aW5kKExFUlJPUik7CisJfQorfQorCisvKiBDYWxsZWQgd2hlbiBzb21ldGhpbmcgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIGRvZXMgKi8KK3ZvaWQKK2ludGVybmFsX3ZlcnJvcmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworCXNoZl9mcHJpbnRmKHNobF9vdXQsICJpbnRlcm5hbCBlcnJvcjogIik7CisJc2hmX3ZmcHJpbnRmKHNobF9vdXQsIGZtdCwgYXApOworCXNoZl9wdXRjaGFyKCdcbicsIHNobF9vdXQpOworCXNoZl9mbHVzaChzaGxfb3V0KTsKK30KKwordm9pZAoraW50ZXJuYWxfZXJyb3JmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisKKwl2YV9zdGFydCh2YSwgZm10KTsKKwlpbnRlcm5hbF92ZXJyb3JmKGZtdCwgdmEpOworCXZhX2VuZCh2YSk7CisJdW53aW5kKExFUlJPUik7Cit9CisKK3ZvaWQKK2ludGVybmFsX3dhcm5pbmdmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisKKwl2YV9zdGFydCh2YSwgZm10KTsKKwlpbnRlcm5hbF92ZXJyb3JmKGZtdCwgdmEpOworCXZhX2VuZCh2YSk7Cit9CisKKy8qIHVzZWQgYnkgZXJyb3IgcmVwb3J0aW5nIGZ1bmN0aW9ucyB0byBwcmludCAia3NoOiAua3NocmNbMjVdOiAiICovCit2b2lkCitlcnJvcl9wcmVmaXgoYm9vbCBmaWxlbGluZSkKK3sKKwkvKiBBdm9pZCBmb286IGZvb1syXTogLi4uICovCisJaWYgKCFmaWxlbGluZSB8fCAhc291cmNlIHx8ICFzb3VyY2UtPmZpbGUgfHwKKwkgICAgc3RyY21wKHNvdXJjZS0+ZmlsZSwga3NobmFtZSkgIT0gMCkKKwkJc2hmX2ZwcmludGYoc2hsX291dCwgIiVzOiAiLCBrc2huYW1lICsgKCprc2huYW1lID09ICctJykpOworCWlmIChmaWxlbGluZSAmJiBzb3VyY2UgJiYgc291cmNlLT5maWxlICE9IE5VTEwpIHsKKwkJc2hmX2ZwcmludGYoc2hsX291dCwgIiVzWyVkXTogIiwgc291cmNlLT5maWxlLAorCQkgICAgc291cmNlLT5lcnJsaW5lID4gMCA/IHNvdXJjZS0+ZXJybGluZSA6IHNvdXJjZS0+bGluZSk7CisJCXNvdXJjZS0+ZXJybGluZSA9IDA7CisJfQorfQorCisvKiBwcmludGYgdG8gc2hsX291dCAoc3RkZXJyKSB3aXRoIGZsdXNoICovCit2b2lkCitzaGVsbGYoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKworCWlmICghaW5pdGlvX2RvbmUpIC8qIHNobF9vdXQgbWF5IG5vdCBiZSBzZXQgdXAgeWV0Li4uICovCisJCXJldHVybjsKKwl2YV9zdGFydCh2YSwgZm10KTsKKwlzaGZfdmZwcmludGYoc2hsX291dCwgZm10LCB2YSk7CisJdmFfZW5kKHZhKTsKKwlzaGZfZmx1c2goc2hsX291dCk7Cit9CisKKy8qIHByaW50ZiB0byBzaGxfc3Rkb3V0IChzdGRvdXQpICovCit2b2lkCitzaHByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCisJaWYgKCFzaGxfc3Rkb3V0X29rKQorCQlpbnRlcm5hbF9lcnJvcmYoInNobF9zdGRvdXQgbm90IHZhbGlkIik7CisJdmFfc3RhcnQodmEsIGZtdCk7CisJc2hmX3ZmcHJpbnRmKHNobF9zdGRvdXQsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7Cit9CisKKy8qIHRlc3QgaWYgd2UgY2FuIHNlZWsgYmFja3dhcmRzIGZkIChyZXR1cm5zIDAgb3IgU0hGX1VOQlVGKSAqLworaW50CitjYW5fc2VlayhpbnQgZmQpCit7CisJc3RydWN0IHN0YXQgc3RhdGI7CisKKwlyZXR1cm4gKGZzdGF0KGZkLCAmc3RhdGIpID09IDAgJiYgIVNfSVNSRUcoc3RhdGIuc3RfbW9kZSkgPworCSAgICBTSEZfVU5CVUYgOiAwKTsKK30KKworc3RydWN0IHNoZiBzaGZfaW9iWzNdOworCit2b2lkCitpbml0aW8odm9pZCkKK3sKKwlzaGZfZmRvcGVuKDEsIFNIRl9XUiwgc2hsX3N0ZG91dCk7CS8qIGZvcmNlIGJ1ZmZlciBhbGxvY2F0aW9uICovCisJc2hmX2Zkb3BlbigyLCBTSEZfV1IsIHNobF9vdXQpOworCXNoZl9mZG9wZW4oMiwgU0hGX1dSLCBzaGxfc3BhcmUpOwkvKiBmb3JjZSBidWZmZXIgYWxsb2NhdGlvbiAqLworCWluaXRpb19kb25lID0gMTsKK30KKworLyogQSBkdXAyKCkgd2l0aCBlcnJvciBjaGVja2luZyAqLworaW50Citrc2hfZHVwMihpbnQgb2ZkLCBpbnQgbmZkLCBib29sIGVycm9rKQoreworCWludCBydjsKKworCWlmICgoKHJ2ID0gZHVwMihvZmQsIG5mZCkpIDwgMCkgJiYgIWVycm9rICYmIChlcnJubyAhPSBFQkFERikpCisJCWVycm9yZigidG9vIG1hbnkgZmlsZXMgb3BlbiBpbiBzaGVsbCIpOworCisjaWZkZWYgX191bHRyaXgKKwkvKiBYWFggaW1ha2Ugc3R5bGUgKi8KKwlpZiAocnYgPj0gMCkKKwkJZmNudGwobmZkLCBGX1NFVEZELCAwKTsKKyNlbmRpZgorCisJcmV0dXJuIChydik7Cit9CisKKy8qCisgKiBtb3ZlIGZkIGZyb20gdXNlciBzcGFjZSAoMDw9ZmQ8MTApIHRvIHNoZWxsIHNwYWNlIChmZD49MTApLAorICogc2V0IGNsb3NlLW9uLWV4ZWMgZmxhZy4KKyAqLworc2hvcnQKK3NhdmVmZChpbnQgZmQpCit7CisJaW50IG5mZCA9IGZkOworCisJaWYgKGZkIDwgRkRCQVNFICYmIChuZmQgPSBmY250bChmZCwgRl9EVVBGRCwgRkRCQVNFKSkgPCAwICYmCisJICAgIGVycm5vID09IEVCQURGKQorCQlyZXR1cm4gKC0xKTsKKwlpZiAobmZkIDwgMCB8fCBuZmQgPiBTSFJUX01BWCkKKwkJZXJyb3JmKCJ0b28gbWFueSBmaWxlcyBvcGVuIGluIHNoZWxsIik7CisJZmNudGwobmZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKwlyZXR1cm4gKChzaG9ydCluZmQpOworfQorCit2b2lkCityZXN0ZmQoaW50IGZkLCBpbnQgb2ZkKQoreworCWlmIChmZCA9PSAyKQorCQlzaGZfZmx1c2goJnNoZl9pb2JbZmRdKTsKKwlpZiAob2ZkIDwgMCkJCS8qIG9yaWdpbmFsIGZkIGNsb3NlZCAqLworCQljbG9zZShmZCk7CisJZWxzZSBpZiAoZmQgIT0gb2ZkKSB7CisJCWtzaF9kdXAyKG9mZCwgZmQsIHRydWUpOyAvKiBYWFg6IHdoYXQgdG8gZG8gaWYgdGhpcyBmYWlscz8gKi8KKwkJY2xvc2Uob2ZkKTsKKwl9Cit9CisKK3ZvaWQKK29wZW5waXBlKGludCAqcHYpCit7CisJaW50IGxwdlsyXTsKKworCWlmIChwaXBlKGxwdikgPCAwKQorCQllcnJvcmYoImNhbid0IGNyZWF0ZSBwaXBlIC0gdHJ5IGFnYWluIik7CisJcHZbMF0gPSBzYXZlZmQobHB2WzBdKTsKKwlpZiAocHZbMF0gIT0gbHB2WzBdKQorCQljbG9zZShscHZbMF0pOworCXB2WzFdID0gc2F2ZWZkKGxwdlsxXSk7CisJaWYgKHB2WzFdICE9IGxwdlsxXSkKKwkJY2xvc2UobHB2WzFdKTsKK30KKwordm9pZAorY2xvc2VwaXBlKGludCAqcHYpCit7CisJY2xvc2UocHZbMF0pOworCWNsb3NlKHB2WzFdKTsKK30KKworLyogQ2FsbGVkIGJ5IGlvc2V0dXAoKSAoZGVhbHMgd2l0aCAyPiY0LCBldGMuKSwgY19yZWFkLCBjX3ByaW50IHRvIHR1cm4KKyAqIGEgc3RyaW5nICh0aGUgWCBpbiAyPiZYLCByZWFkIC11WCwgcHJpbnQgLXVYKSBpbnRvIGEgZmlsZSBkZXNjcmlwdG9yLgorICovCitpbnQKK2NoZWNrX2ZkKGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlLCBjb25zdCBjaGFyICoqZW1zZ3ApCit7CisJaW50IGZkLCBmbDsKKworCWlmIChuYW1lWzBdID09ICdwJyAmJiAhbmFtZVsxXSkKKwkJcmV0dXJuIChjb3Byb2NfZ2V0ZmQobW9kZSwgZW1zZ3ApKTsKKwlmb3IgKGZkID0gMDsga3NoX2lzZGlnaXQoKm5hbWUpOyArK25hbWUpCisJCWZkID0gKGZkICogMTApICsgKm5hbWUgLSAnMCc7CisJaWYgKCpuYW1lIHx8IGZkID49IEZEQkFTRSkgeworCQlpZiAoZW1zZ3ApCisJCQkqZW1zZ3AgPSAiaWxsZWdhbCBmaWxlIGRlc2NyaXB0b3IgbmFtZSI7CisJCXJldHVybiAoLTEpOworCX0KKwlpZiAoKGZsID0gZmNudGwoZmQsIEZfR0VURkwsIDApKSA8IDApIHsKKwkJaWYgKGVtc2dwKQorCQkJKmVtc2dwID0gImJhZCBmaWxlIGRlc2NyaXB0b3IiOworCQlyZXR1cm4gKC0xKTsKKwl9CisJZmwgJj0gT19BQ0NNT0RFOworCS8qIFhfT0sgaXMgYSBrbHVkZ2UgdG8gZGlzYWJsZSB0aGlzIGNoZWNrIGZvciBkdXBzICh4PCYxKToKKwkgKiBoaXN0b3JpY2FsIHNoZWxscyBuZXZlciBkaWQgdGhpcyBjaGVjayAoWFhYIGRvbid0IGtub3cgd2hhdAorCSAqIFBPU0lYIGhhcyB0byBzYXkpLgorCSAqLworCWlmICghKG1vZGUgJiBYX09LKSAmJiBmbCAhPSBPX1JEV1IgJiYgKAorCSAgICAoKG1vZGUgJiBSX09LKSAmJiBmbCAhPSBPX1JET05MWSkgfHwKKwkgICAgKChtb2RlICYgV19PSykgJiYgZmwgIT0gT19XUk9OTFkpKSkgeworCQlpZiAoZW1zZ3ApCisJCQkqZW1zZ3AgPSAoZmwgPT0gT19XUk9OTFkpID8KKwkJCSAgICAiZmQgbm90IG9wZW4gZm9yIHJlYWRpbmciIDoKKwkJCSAgICAiZmQgbm90IG9wZW4gZm9yIHdyaXRpbmciOworCQlyZXR1cm4gKC0xKTsKKwl9CisJcmV0dXJuIChmZCk7Cit9CisKKy8qIENhbGxlZCBvbmNlIGZyb20gbWFpbiAqLwordm9pZAorY29wcm9jX2luaXQodm9pZCkKK3sKKwljb3Byb2MucmVhZCA9IGNvcHJvYy5yZWFkdyA9IGNvcHJvYy53cml0ZSA9IC0xOworCWNvcHJvYy5uam9icyA9IDA7CisJY29wcm9jLmlkID0gMDsKK30KKworLyogQ2FsbGVkIGJ5IGNfcmVhZCgpIHdoZW4gZW9mIGlzIHJlYWQgLSBjbG9zZSBmZCBpZiBpdCBpcyB0aGUgY28tcHJvY2VzcyBmZCAqLwordm9pZAorY29wcm9jX3JlYWRfY2xvc2UoaW50IGZkKQoreworCWlmIChjb3Byb2MucmVhZCA+PSAwICYmIGZkID09IGNvcHJvYy5yZWFkKSB7CisJCWNvcHJvY19yZWFkd19jbG9zZShmZCk7CisJCWNsb3NlKGNvcHJvYy5yZWFkKTsKKwkJY29wcm9jLnJlYWQgPSAtMTsKKwl9Cit9CisKKy8qIENhbGxlZCBieSBjX3JlYWQoKSBhbmQgYnkgaW9zZXR1cCgpIHRvIGNsb3NlIHRoZSBvdGhlciBzaWRlIG9mIHRoZQorICogcmVhZCBwaXBlLCBzbyByZWFkcyB3aWxsIGFjdHVhbGx5IHRlcm1pbmF0ZS4KKyAqLwordm9pZAorY29wcm9jX3JlYWR3X2Nsb3NlKGludCBmZCkKK3sKKwlpZiAoY29wcm9jLnJlYWR3ID49IDAgJiYgY29wcm9jLnJlYWQgPj0gMCAmJiBmZCA9PSBjb3Byb2MucmVhZCkgeworCQljbG9zZShjb3Byb2MucmVhZHcpOworCQljb3Byb2MucmVhZHcgPSAtMTsKKwl9Cit9CisKKy8qIENhbGxlZCBieSBjX3ByaW50IHdoZW4gYSB3cml0ZSB0byBhIGZkIGZhaWxzIHdpdGggRVBJUEUgYW5kIGJ5IGlvc2V0dXAKKyAqIHdoZW4gY28tcHJvY2VzcyBpbnB1dCBpcyBkdXAnZAorICovCit2b2lkCitjb3Byb2Nfd3JpdGVfY2xvc2UoaW50IGZkKQoreworCWlmIChjb3Byb2Mud3JpdGUgPj0gMCAmJiBmZCA9PSBjb3Byb2Mud3JpdGUpIHsKKwkJY2xvc2UoY29wcm9jLndyaXRlKTsKKwkJY29wcm9jLndyaXRlID0gLTE7CisJfQorfQorCisvKiBDYWxsZWQgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZi92YWx1ZSBvZiB0aGUgY28tcHJvY2VzcyBmaWxlIGRlc2NyaXB0b3IuCisgKiAoVXNlZCBieSBjaGVja19mZCgpIGFuZCBieSBjX3JlYWQvY19wcmludCB0byBkZWFsIHdpdGggLXAgb3B0aW9uKS4KKyAqLworaW50Citjb3Byb2NfZ2V0ZmQoaW50IG1vZGUsIGNvbnN0IGNoYXIgKiplbXNncCkKK3sKKwlpbnQgZmQgPSAobW9kZSAmIFJfT0spID8gY29wcm9jLnJlYWQgOiBjb3Byb2Mud3JpdGU7CisKKwlpZiAoZmQgPj0gMCkKKwkJcmV0dXJuIChmZCk7CisJaWYgKGVtc2dwKQorCQkqZW1zZ3AgPSAibm8gY29wcm9jZXNzIjsKKwlyZXR1cm4gKC0xKTsKK30KKworLyogY2FsbGVkIHRvIGNsb3NlIGZpbGUgZGVzY3JpcHRvcnMgcmVsYXRlZCB0byB0aGUgY29wcm9jZXNzIChpZiBhbnkpCisgKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggU0lHQ0hMRCBibG9ja2VkLgorICovCit2b2lkCitjb3Byb2NfY2xlYW51cChpbnQgcmV1c2UpCit7CisJLyogVGhpcyB0byBhbGxvdyBjby1wcm9jZXNzZXMgdG8gc2hhcmUgb3V0cHV0IHBpcGUgKi8KKwlpZiAoIXJldXNlIHx8IGNvcHJvYy5yZWFkdyA8IDAgfHwgY29wcm9jLnJlYWQgPCAwKSB7CisJCWlmIChjb3Byb2MucmVhZCA+PSAwKSB7CisJCQljbG9zZShjb3Byb2MucmVhZCk7CisJCQljb3Byb2MucmVhZCA9IC0xOworCQl9CisJCWlmIChjb3Byb2MucmVhZHcgPj0gMCkgeworCQkJY2xvc2UoY29wcm9jLnJlYWR3KTsKKwkJCWNvcHJvYy5yZWFkdyA9IC0xOworCQl9CisJfQorCWlmIChjb3Byb2Mud3JpdGUgPj0gMCkgeworCQljbG9zZShjb3Byb2Mud3JpdGUpOworCQljb3Byb2Mud3JpdGUgPSAtMTsKKwl9Cit9CisKK3N0cnVjdCB0ZW1wICoKK21ha2V0ZW1wKEFyZWEgKmFwLCBUZW1wX3R5cGUgdHlwZSwgc3RydWN0IHRlbXAgKip0bGlzdCkKK3sKKwlzdHJ1Y3QgdGVtcCAqdHA7CisJaW50IGxlbjsKKwlpbnQgZmQ7CisJY2hhciAqcGF0aG5hbWU7CisJY29uc3QgY2hhciAqZGlyOworCisJZGlyID0gdG1wZGlyID8gdG1wZGlyIDogTUtTSF9ERUZBVUxUX1RNUERJUjsKKyNpZiBIQVZFX01LU1RFTVAKKwlsZW4gPSBzdHJsZW4oZGlyKSArIDYgKyAxMCArIDE7CisjZWxzZQorCXBhdGhuYW1lID0gdGVtcG5hbShkaXIsICJta3NoLiIpOworCWxlbiA9ICgocGF0aG5hbWUgPT0gTlVMTCkgPyAwIDogc3RybGVuKHBhdGhuYW1lKSkgKyAxOworI2VuZGlmCisJdHAgPSBhbGxvYyhzaXplb2Yoc3RydWN0IHRlbXApICsgbGVuLCBhcCk7CisJdHAtPm5hbWUgPSAoY2hhciAqKSZ0cFsxXTsKKyNpZiAhSEFWRV9NS1NURU1QCisJaWYgKHBhdGhuYW1lID09IE5VTEwpCisJCXRwLT5uYW1lWzBdID0gJ1wwJzsKKwllbHNlIHsKKwkJbWVtY3B5KHRwLT5uYW1lLCBwYXRobmFtZSwgbGVuKTsKKwkJZnJlZShwYXRobmFtZSk7CisJfQorI2VuZGlmCisJcGF0aG5hbWUgPSB0cC0+bmFtZTsKKwl0cC0+c2hmID0gTlVMTDsKKwl0cC0+dHlwZSA9IHR5cGU7CisjaWYgSEFWRV9NS1NURU1QCisJc2hmX3NucHJpbnRmKHBhdGhuYW1lLCBsZW4sICIlcy9ta3NoLlhYWFhYWFhYWFgiLCBkaXIpOworCWlmICgoZmQgPSBta3N0ZW1wKHBhdGhuYW1lKSkgPj0gMCkKKyNlbHNlCisJaWYgKHRwLT5uYW1lWzBdICYmIChmZCA9IG9wZW4odHAtPm5hbWUsIE9fQ1JFQVQgfCBPX1JEV1IsIDA2MDApKSA+PSAwKQorI2VuZGlmCisJCXRwLT5zaGYgPSBzaGZfZmRvcGVuKGZkLCBTSEZfV1IsIE5VTEwpOworCXRwLT5waWQgPSBwcm9jcGlkOworCisJdHAtPm5leHQgPSAqdGxpc3Q7CisJKnRsaXN0ID0gdHA7CisJcmV0dXJuICh0cCk7Cit9CisKKy8qCisgKiBXZSB1c2UgYSBzaW1pbGFyIGNvbGxpc2lvbiByZXNvbHV0aW9uIGFsZ29yaXRobSBhcyBQeXRob24gMi41LjQKKyAqIGJ1dCB3aXRoIGEgc2xpZ2h0bHkgdHdlYWtlZCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGZyb20gc2NyYXRjaC4KKyAqLworCisjZGVmaW5lCUlOSVRfVEJMUwk4CS8qIGluaXRpYWwgdGFibGUgc2l6ZSAocG93ZXIgb2YgMikgKi8KKyNkZWZpbmUgUEVSVFVSQl9TSElGVAk1CS8qIHNlZSBQeXRob24gMi41LjQgT2JqZWN0cy9kaWN0b2JqZWN0LmMgKi8KKworc3RhdGljIHZvaWQgdGV4cGFuZChzdHJ1Y3QgdGFibGUgKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgdG5hbWVjbXAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOworc3RhdGljIHN0cnVjdCB0YmwgKmt0c2NhbihzdHJ1Y3QgdGFibGUgKiwgY29uc3QgY2hhciAqLCB1aW50MzJfdCwKKyAgICBzdHJ1Y3QgdGJsICoqKik7CisKK3N0YXRpYyB2b2lkCit0ZXhwYW5kKHN0cnVjdCB0YWJsZSAqdHAsIHNpemVfdCBuc2l6ZSkKK3sKKwlzaXplX3QgaSwgaiwgb3NpemUgPSB0cC0+c2l6ZSwgcGVydHVyYjsKKwlzdHJ1Y3QgdGJsICp0YmxwLCAqKnBwOworCXN0cnVjdCB0YmwgKipudGJscCwgKipvdGJscCA9IHRwLT50YmxzOworCisJbnRibHAgPSBhbGxvYyhuc2l6ZSAqIHNpemVvZihzdHJ1Y3QgdGJsICopLCB0cC0+YXJlYXApOworCWZvciAoaSA9IDA7IGkgPCBuc2l6ZTsgaSsrKQorCQludGJscFtpXSA9IE5VTEw7CisJdHAtPnNpemUgPSBuc2l6ZTsKKwl0cC0+bmZyZWUgPSAobnNpemUgKiA0KSAvIDU7CS8qIHRhYmxlIGNhbiBnZXQgODAlIGZ1bGwgKi8KKwl0cC0+dGJscyA9IG50YmxwOworCWlmIChvdGJscCA9PSBOVUxMKQorCQlyZXR1cm47CisJbnNpemUtLTsJCQkvKiBmcm9tIGhlcmUgb24gbnNpemUgOj0gbWFzayAqLworCWZvciAoaSA9IDA7IGkgPCBvc2l6ZTsgaSsrKQorCQlpZiAoKHRibHAgPSBvdGJscFtpXSkgIT0gTlVMTCkgeworCQkJaWYgKCh0YmxwLT5mbGFnICYgREVGSU5FRCkpIHsKKwkJCQkvKiBzZWFyY2ggZm9yIGZyZWUgaGFzaCB0YWJsZSBzbG90ICovCisJCQkJaiA9IChwZXJ0dXJiID0gdGJscC0+dWEuaHZhbCkgJiBuc2l6ZTsKKwkJCQlnb3RvIGZpbmRfZmlyc3RfZW1wdHlfc2xvdDsKKyBmaW5kX25leHRfZW1wdHlfc2xvdDoKKwkJCQlqID0gKGogPDwgMikgKyBqICsgcGVydHVyYiArIDE7CisJCQkJcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVDsKKyBmaW5kX2ZpcnN0X2VtcHR5X3Nsb3Q6CisJCQkJcHAgPSAmbnRibHBbaiAmIG5zaXplXTsKKwkJCQlpZiAoKnBwICE9IE5VTEwpCisJCQkJCWdvdG8gZmluZF9uZXh0X2VtcHR5X3Nsb3Q7CisJCQkJLyogZm91bmQgYW4gZW1wdHkgaGFzaCB0YWJsZSBzbG90ICovCisJCQkJKnBwID0gdGJscDsKKwkJCQl0cC0+bmZyZWUtLTsKKwkJCX0gZWxzZSBpZiAoISh0YmxwLT5mbGFnICYgRklOVVNFKSkgeworCQkJCWFmcmVlKHRibHAsIHRwLT5hcmVhcCk7CisJCQl9CisJCX0KKwlhZnJlZShvdGJscCwgdHAtPmFyZWFwKTsKK30KKwordm9pZAora3Rpbml0KHN0cnVjdCB0YWJsZSAqdHAsIEFyZWEgKmFwLCBzaXplX3QgdHNpemUpCit7CisJdHAtPmFyZWFwID0gYXA7CisJdHAtPnRibHMgPSBOVUxMOworCXRwLT5zaXplID0gdHAtPm5mcmVlID0gMDsKKwlpZiAodHNpemUpCisJCXRleHBhbmQodHAsIHRzaXplKTsKK30KKworLyogdGFibGUsIG5hbWUgKGtleSkgdG8gc2VhcmNoIGZvciwgaGFzaChuYW1lKSwgcnYgcG9pbnRlciB0byB0YmwgcHRyICovCitzdGF0aWMgc3RydWN0IHRibCAqCitrdHNjYW4oc3RydWN0IHRhYmxlICp0cCwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgaCwgc3RydWN0IHRibCAqKipwcHApCit7CisJc2l6ZV90IGosIHBlcnR1cmIsIG1hc2s7CisJc3RydWN0IHRibCAqKnBwLCAqcDsKKworCW1hc2sgPSB0cC0+c2l6ZSAtIDE7CisJLyogc2VhcmNoIGZvciBoYXNoIHRhYmxlIHNsb3QgbWF0Y2hpbmcgbmFtZSAqLworCWogPSAocGVydHVyYiA9IGgpICYgbWFzazsKKwlnb3RvIGZpbmRfZmlyc3Rfc2xvdDsKKyBmaW5kX25leHRfc2xvdDoKKwlqID0gKGogPDwgMikgKyBqICsgcGVydHVyYiArIDE7CisJcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVDsKKyBmaW5kX2ZpcnN0X3Nsb3Q6CisJcHAgPSAmdHAtPnRibHNbaiAmIG1hc2tdOworCWlmICgocCA9ICpwcCkgIT0gTlVMTCAmJiAocC0+dWEuaHZhbCAhPSBoIHx8ICEocC0+ZmxhZyAmIERFRklORUQpIHx8CisJICAgIHN0cmNtcChwLT5uYW1lLCBuYW1lKSkpCisJCWdvdG8gZmluZF9uZXh0X3Nsb3Q7CisJLyogcCA9PSBOVUxMIGlmIG5vdCBmb3VuZCwgY29ycmVjdCBmb3VuZCBlbnRyeSBvdGhlcndpc2UgKi8KKwlpZiAocHBwKQorCQkqcHBwID0gcHA7CisJcmV0dXJuIChwKTsKK30KKworLyogdGFibGUsIG5hbWUgKGtleSkgdG8gc2VhcmNoIGZvciwgaGFzaChuKSAqLworc3RydWN0IHRibCAqCitrdHNlYXJjaChzdHJ1Y3QgdGFibGUgKnRwLCBjb25zdCBjaGFyICpuLCB1aW50MzJfdCBoKQoreworCXJldHVybiAodHAtPnNpemUgPyBrdHNjYW4odHAsIG4sIGgsIE5VTEwpIDogTlVMTCk7Cit9CisKKy8qIHRhYmxlLCBuYW1lIChrZXkpIHRvIGVudGVyLCBoYXNoKG4pICovCitzdHJ1Y3QgdGJsICoKK2t0ZW50ZXIoc3RydWN0IHRhYmxlICp0cCwgY29uc3QgY2hhciAqbiwgdWludDMyX3QgaCkKK3sKKwlzdHJ1Y3QgdGJsICoqcHAsICpwOworCWludCBsZW47CisKKwlpZiAodHAtPnNpemUgPT0gMCkKKwkJdGV4cGFuZCh0cCwgSU5JVF9UQkxTKTsKKyBTZWFyY2g6CisJaWYgKChwID0ga3RzY2FuKHRwLCBuLCBoLCAmcHApKSkKKwkJcmV0dXJuIChwKTsKKworCWlmICh0cC0+bmZyZWUgPD0gMCkgeworCQkvKiB0b28gZnVsbCAqLworCQl0ZXhwYW5kKHRwLCAyICogdHAtPnNpemUpOworCQlnb3RvIFNlYXJjaDsKKwl9CisKKwkvKiBjcmVhdGUgbmV3IHRibCBlbnRyeSAqLworCWxlbiA9IHN0cmxlbihuKSArIDE7CisJcCA9IGFsbG9jKG9mZnNldG9mKHN0cnVjdCB0YmwsIG5hbWVbMF0pICsgbGVuLCB0cC0+YXJlYXApOworCXAtPmZsYWcgPSAwOworCXAtPnR5cGUgPSAwOworCXAtPmFyZWFwID0gdHAtPmFyZWFwOworCXAtPnVhLmh2YWwgPSBoOworCXAtPnUyLmZpZWxkID0gMDsKKwlwLT51LmFycmF5ID0gTlVMTDsKKwltZW1jcHkocC0+bmFtZSwgbiwgbGVuKTsKKworCS8qIGVudGVyIGluIHRwLT50YmxzICovCisJdHAtPm5mcmVlLS07CisJKnBwID0gcDsKKwlyZXR1cm4gKHApOworfQorCit2b2lkCitrdHdhbGsoc3RydWN0IHRzdGF0ZSAqdHMsIHN0cnVjdCB0YWJsZSAqdHApCit7CisJdHMtPmxlZnQgPSB0cC0+c2l6ZTsKKwl0cy0+bmV4dCA9IHRwLT50YmxzOworfQorCitzdHJ1Y3QgdGJsICoKK2t0bmV4dChzdHJ1Y3QgdHN0YXRlICp0cykKK3sKKwl3aGlsZSAoLS10cy0+bGVmdCA+PSAwKSB7CisJCXN0cnVjdCB0YmwgKnAgPSAqdHMtPm5leHQrKzsKKwkJaWYgKHAgIT0gTlVMTCAmJiAocC0+ZmxhZyAmIERFRklORUQpKQorCQkJcmV0dXJuIChwKTsKKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworc3RhdGljIGludAordG5hbWVjbXAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQoreworCWNvbnN0IHN0cnVjdCB0YmwgKmEgPSAqKChjb25zdCBzdHJ1Y3QgdGJsICogY29uc3QgKilwMSk7CisJY29uc3Qgc3RydWN0IHRibCAqYiA9ICooKGNvbnN0IHN0cnVjdCB0YmwgKiBjb25zdCAqKXAyKTsKKworCXJldHVybiAoc3RyY21wKGEtPm5hbWUsIGItPm5hbWUpKTsKK30KKworc3RydWN0IHRibCAqKgora3Rzb3J0KHN0cnVjdCB0YWJsZSAqdHApCit7CisJc2l6ZV90IGk7CisJc3RydWN0IHRibCAqKnAsICoqc3AsICoqZHA7CisKKwlwID0gYWxsb2MoKHRwLT5zaXplICsgMSkgKiBzaXplb2Yoc3RydWN0IHRibCAqKSwgQVRFTVApOworCXNwID0gdHAtPnRibHM7CQkvKiBzb3VyY2UgKi8KKwlkcCA9IHA7CQkJLyogZGVzdCAqLworCWkgPSAoc2l6ZV90KXRwLT5zaXplOworCXdoaWxlIChpLS0pCisJCWlmICgoKmRwID0gKnNwKyspICE9IE5VTEwgJiYgKCgoKmRwKS0+ZmxhZyAmIERFRklORUQpIHx8CisJCSAgICAoKCpkcCktPmZsYWcgJiBBUlJBWSkpKQorCQkJZHArKzsKKwlxc29ydChwLCAoaSA9IGRwIC0gcCksIHNpemVvZih2b2lkICopLCB0bmFtZWNtcCk7CisJcFtpXSA9IE5VTEw7CisJcmV0dXJuIChwKTsKK30KKworI2lmZGVmIFNJR1dJTkNICitzdGF0aWMgdm9pZAoreF9zaWd3aW5jaChpbnQgc2lnIE1LU0hfQV9VTlVTRUQpCit7CisJLyogdGhpcyBydW5zIGluc2lkZSBpbnRlcnJ1cHQgY29udGV4dCwgd2l0aCBlcnJubyBzYXZlZCAqLworCisJZ290X3dpbmNoID0gMTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvbWlzYy5jIGIvbWtzaC9zcmMvbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YTRkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9taXNjLmMKQEAgLTAsMCArMSwxNTc5IEBACisvKgkkT3BlbkJTRDogbWlzYy5jLHYgMS4zNyAyMDA5LzA0LzE5IDIwOjM0OjA1IHN0aGVuIEV4cCAkCSovCisvKgkkT3BlbkJTRDogcGF0aC5jLHYgMS4xMiAyMDA1LzAzLzMwIDE3OjE2OjM3IGRlcmFhZHQgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAqCVRob3JzdGVuIEdsYXNlciA8dGdAbWlyYnNkLm9yZz4KKyAqCisgKiBQcm92aWRlZCB0aGF0IHRoZXNlIHRlcm1zIGFuZCBkaXNjbGFpbWVyIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMKKyAqIGFyZSByZXRhaW5lZCBvciByZXByb2R1Y2VkIGluIGFuIGFjY29tcGFueWluZyBkb2N1bWVudCwgcGVybWlzc2lvbgorICogaXMgZ3JhbnRlZCB0byBkZWFsIGluIHRoaXMgd29yayB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgdW4tCisgKiBsaW1pdGVkIHJpZ2h0cyB0byB1c2UsIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUsIHNlbGwsIG1vZGlmeSwKKyAqIG1lcmdlLCBnaXZlIGF3YXksIG9yIHN1YmxpY2VuY2UuCisgKgorICogVGhpcyB3b3JrIGlzIHByb3ZpZGVkICJBUyBJUyIgYW5kIFdJVEhPVVQgV0FSUkFOVFkgb2YgYW55IGtpbmQsIHRvCisgKiB0aGUgdXRtb3N0IGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIG5laXRoZXIgZXhwcmVzcyBub3IKKyAqIGltcGxpZWQ7IHdpdGhvdXQgbWFsaWNpb3VzIGludGVudCBvciBncm9zcyBuZWdsaWdlbmNlLiBJbiBubyBldmVudAorICogbWF5IGEgbGljZW5zb3IsIGF1dGhvciBvciBjb250cmlidXRvciBiZSBoZWxkIGxpYWJsZSBmb3IgaW5kaXJlY3QsCisgKiBkaXJlY3QsIG90aGVyIGRhbWFnZSwgbG9zcywgb3Igb3RoZXIgaXNzdWVzIGFyaXNpbmcgaW4gYW55IHdheSBvdXQKKyAqIG9mIGRlYWxpbmcgaW4gdGhlIHdvcmssIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaAorICogZGFtYWdlIG9yIGV4aXN0ZW5jZSBvZiBhIGRlZmVjdCwgZXhjZXB0IHByb3ZlbiB0aGF0IGl0IHJlc3VsdHMgb3V0CisgKiBvZiBzYWlkIHBlcnNvbidzIGltbWVkaWF0ZSBmYXVsdCB3aGVuIHVzaW5nIHRoZSB3b3JrIGFzIGludGVuZGVkLgorICovCisKKyNpbmNsdWRlICJzaC5oIgorI2lmICFIQVZFX0dFVFJVU0FHRQorI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorI2VuZGlmCisjaWYgSEFWRV9HUlBfSAorI2luY2x1ZGUgPGdycC5oPgorI2VuZGlmCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL21pc2MuYyx2IDEuMTQxIDIwMTAvMDcvMTcgMjI6MDk6MzYgdGcgRXhwICQiKTsKKwordW5zaWduZWQgY2hhciBjaHR5cGVzW1VDSEFSX01BWCArIDFdOwkvKiB0eXBlIGJpdHMgZm9yIHVuc2lnbmVkIGNoYXIgKi8KKworI2lmICFIQVZFX1NFVFJFU1VHSUQKK3VpZF90IGtzaHVpZDsKK2dpZF90IGtzaGdpZCwga3NoZWdpZDsKKyNlbmRpZgorCitzdGF0aWMgaW50IGRvX2dtYXRjaChjb25zdCB1bnNpZ25lZCBjaGFyICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKik7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAqY2NsYXNzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKyNpZmRlZiBUSU9DU0NUVFkKK3N0YXRpYyB2b2lkIGNodnQoY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisvKgorICogRmFzdCBjaGFyYWN0ZXIgY2xhc3NlcworICovCit2b2lkCitzZXRjdHlwZXMoY29uc3QgY2hhciAqcywgaW50IHQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAodCAmIENfSUZTKSB7CisJCWZvciAoaSA9IDA7IGkgPCBVQ0hBUl9NQVggKyAxOyBpKyspCisJCQljaHR5cGVzW2ldICY9IH5DX0lGUzsKKwkJY2h0eXBlc1swXSB8PSBDX0lGUzsgLyogaW5jbHVkZSBcMCBpbiBDX0lGUyAqLworCX0KKwl3aGlsZSAoKnMgIT0gMCkKKwkJY2h0eXBlc1sodW5zaWduZWQgY2hhcikqcysrXSB8PSB0OworfQorCit2b2lkCitpbml0Y3R5cGVzKHZvaWQpCit7CisJaW50IGM7CisKKwlmb3IgKGMgPSAnYSc7IGMgPD0gJ3onOyBjKyspCisJCWNodHlwZXNbY10gfD0gQ19BTFBIQTsKKwlmb3IgKGMgPSAnQSc7IGMgPD0gJ1onOyBjKyspCisJCWNodHlwZXNbY10gfD0gQ19BTFBIQTsKKwljaHR5cGVzWydfJ10gfD0gQ19BTFBIQTsKKwlzZXRjdHlwZXMoIjAxMjM0NTY3ODkiLCBDX0RJR0lUKTsKKwlzZXRjdHlwZXMoIiBcdFxufCY7PD4oKSIsIENfTEVYMSk7IC8qIFwwIGFkZGVkIGF1dG9tYXRpY2FsbHkgKi8KKwlzZXRjdHlwZXMoIipAIyEkLT8iLCBDX1ZBUjEpOworCXNldGN0eXBlcygiIFx0XG4iLCBDX0lGU1dTKTsKKwlzZXRjdHlwZXMoIj0tKz8iLCBDX1NVQk9QMSk7CisJc2V0Y3R5cGVzKCJcdFxuIFwiIyQmJygpKjs8PT4/W1xcXWB8IiwgQ19RVU9URSk7Cit9CisKKy8qIGNhbGxlZCBmcm9tIFhjaGVja04oKSB0byBncm93IGJ1ZmZlciAqLworY2hhciAqCitYY2hlY2tfZ3Jvd18oWFN0cmluZyAqeHNwLCBjb25zdCBjaGFyICp4cCwgdW5zaWduZWQgaW50IG1vcmUpCit7CisJY29uc3QgY2hhciAqb2xkX2JlZyA9IHhzcC0+YmVnOworCisJeHNwLT5sZW4gKz0gbW9yZSA+IHhzcC0+bGVuID8gbW9yZSA6IHhzcC0+bGVuOworCXhzcC0+YmVnID0gYXJlc2l6ZSh4c3AtPmJlZywgeHNwLT5sZW4gKyA4LCB4c3AtPmFyZWFwKTsKKwl4c3AtPmVuZCA9IHhzcC0+YmVnICsgeHNwLT5sZW47CisJcmV0dXJuICh4c3AtPmJlZyArICh4cCAtIG9sZF9iZWcpKTsKK30KKworI2RlZmluZSBTSEZMQUdTX0RFRk5TCisjaW5jbHVkZSAic2hfZmxhZ3MuaCIKKworY29uc3Qgc3RydWN0IHNob3B0aW9uIG9wdGlvbnNbXSA9IHsKKyNkZWZpbmUgU0hGTEFHU19JVEVNUworI2luY2x1ZGUgInNoX2ZsYWdzLmgiCit9OworCisvKgorICogdHJhbnNsYXRlIC1vIG9wdGlvbiBpbnRvIEYqIGNvbnN0YW50IChhbHNvIHVzZWQgZm9yIHRlc3QgLW8gb3B0aW9uKQorICovCitzaXplX3QKK29wdGlvbihjb25zdCBjaGFyICpuKQoreworCXNpemVfdCBpOworCisJaWYgKChuWzBdID09ICctJyB8fCBuWzBdID09ICcrJykgJiYgblsxXSAmJiAhblsyXSkgeworCQlmb3IgKGkgPSAwOyBpIDwgTkVMRU0ob3B0aW9ucyk7IGkrKykKKwkJCWlmIChvcHRpb25zW2ldLmMgPT0gblsxXSkKKwkJCQlyZXR1cm4gKGkpOworCX0gZWxzZSBmb3IgKGkgPSAwOyBpIDwgTkVMRU0ob3B0aW9ucyk7IGkrKykKKwkJaWYgKG9wdGlvbnNbaV0ubmFtZSAmJiBzdHJjbXAob3B0aW9uc1tpXS5uYW1lLCBuKSA9PSAwKQorCQkJcmV0dXJuIChpKTsKKworCXJldHVybiAoKHNpemVfdCktMSk7Cit9CisKK3N0cnVjdCBvcHRpb25zX2luZm8geworCWludCBvcHRfd2lkdGg7CisJaW50IG9wdHNbTkVMRU0ob3B0aW9ucyldOworfTsKKworc3RhdGljIGNoYXIgKm9wdGlvbnNfZm10X2VudHJ5KGNoYXIgKiwgaW50LCBpbnQsIGNvbnN0IHZvaWQgKik7CitzdGF0aWMgdm9pZCBwcmludG9wdGlvbnMoYm9vbCk7CisKKy8qIGZvcm1hdCBhIHNpbmdsZSBzZWxlY3QgbWVudSBpdGVtICovCitzdGF0aWMgY2hhciAqCitvcHRpb25zX2ZtdF9lbnRyeShjaGFyICpidWYsIGludCBidWZsZW4sIGludCBpLCBjb25zdCB2b2lkICphcmcpCit7CisJY29uc3Qgc3RydWN0IG9wdGlvbnNfaW5mbyAqb2kgPSAoY29uc3Qgc3RydWN0IG9wdGlvbnNfaW5mbyAqKWFyZzsKKworCXNoZl9zbnByaW50ZihidWYsIGJ1ZmxlbiwgIiUtKnMgJXMiLAorCSAgICBvaS0+b3B0X3dpZHRoLCBvcHRpb25zW29pLT5vcHRzW2ldXS5uYW1lLAorCSAgICBGbGFnKG9pLT5vcHRzW2ldKSA/ICJvbiIgOiAib2ZmIik7CisJcmV0dXJuIChidWYpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRvcHRpb25zKGJvb2wgdmVyYm9zZSkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAodmVyYm9zZSkgeworCQlpbnQgbiA9IDAsIGxlbiwgb2N0cyA9IDA7CisJCXN0cnVjdCBvcHRpb25zX2luZm8gb2k7CisKKwkJLyogdmVyYm9zZSB2ZXJzaW9uICovCisJCXNoZl9wdXRzKCJDdXJyZW50IG9wdGlvbiBzZXR0aW5nc1xuIiwgc2hsX3N0ZG91dCk7CisKKwkJb2kub3B0X3dpZHRoID0gMDsKKwkJd2hpbGUgKGkgPCAoaW50KU5FTEVNKG9wdGlvbnMpKSB7CisJCQlpZiAob3B0aW9uc1tpXS5uYW1lKSB7CisJCQkJb2kub3B0c1tuKytdID0gaTsKKwkJCQlsZW4gPSBzdHJsZW4ob3B0aW9uc1tpXS5uYW1lKTsKKwkJCQlpZiAobGVuID4gb2N0cykKKwkJCQkJb2N0cyA9IGxlbjsKKwkJCQlsZW4gPSB1dGZfbWJzd2lkdGgob3B0aW9uc1tpXS5uYW1lKTsKKwkJCQlpZiAobGVuID4gb2kub3B0X3dpZHRoKQorCQkJCQlvaS5vcHRfd2lkdGggPSBsZW47CisJCQl9CisJCQkrK2k7CisJCX0KKwkJcHJpbnRfY29sdW1ucyhzaGxfc3Rkb3V0LCBuLCBvcHRpb25zX2ZtdF9lbnRyeSwgJm9pLAorCQkgICAgb2N0cyArIDQsIG9pLm9wdF93aWR0aCArIDQsIHRydWUpOworCX0gZWxzZSB7CisJCS8qIHNob3J0IHZlcnNpb24gw6EgbGEgQVQmVCBrc2g5MyAqLworCQlzaGZfcHV0cygic2V0Iiwgc2hsX3N0ZG91dCk7CisJCXdoaWxlIChpIDwgKGludClORUxFTShvcHRpb25zKSkgeworCQkJaWYgKEZsYWcoaSkgJiYgb3B0aW9uc1tpXS5uYW1lKQorCQkJCXNocHJpbnRmKCIgLW8gJXMiLCBvcHRpb25zW2ldLm5hbWUpOworCQkJKytpOworCQl9CisJCXNoZl9wdXRjKCdcbicsIHNobF9zdGRvdXQpOworCX0KK30KKworY2hhciAqCitnZXRvcHRpb25zKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJY2hhciBtWyhpbnQpIEZORkxBR1MgKyAxXTsKKwljaGFyICpjcCA9IG07CisKKwlmb3IgKGkgPSAwOyBpIDwgTkVMRU0ob3B0aW9ucyk7IGkrKykKKwkJaWYgKG9wdGlvbnNbaV0uYyAmJiBGbGFnKGkpKQorCQkJKmNwKysgPSBvcHRpb25zW2ldLmM7CisJc3RybmR1cHgoY3AsIG0sIGNwIC0gbSwgQVRFTVApOworCXJldHVybiAoY3ApOworfQorCisvKiBjaGFuZ2UgYSBGbGFnKCopIHZhbHVlOyB0YWtlcyBjYXJlIG9mIHNwZWNpYWwgYWN0aW9ucyAqLwordm9pZAorY2hhbmdlX2ZsYWcoZW51bSBzaF9mbGFnIGYsIGludCB3aGF0LCB1bnNpZ25lZCBpbnQgbmV3dmFsKQoreworCXVuc2lnbmVkIGNoYXIgb2xkdmFsOworCisJb2xkdmFsID0gRmxhZyhmKTsKKwlGbGFnKGYpID0gbmV3dmFsID8gMSA6IDA7CS8qIG5lZWRlZCBmb3IgdHJpc3RhdGVzICovCisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAorCWlmIChmID09IEZNT05JVE9SKSB7CisJCWlmICh3aGF0ICE9IE9GX0NNRExJTkUgJiYgbmV3dmFsICE9IG9sZHZhbCkKKwkJCWpfY2hhbmdlKCk7CisJfSBlbHNlCisjZW5kaWYKKwkgIGlmICgoCisjaWYgIU1LU0hfU19OT1ZJCisJICAgIGYgPT0gRlZJIHx8CisjZW5kaWYKKwkgICAgZiA9PSBGRU1BQ1MgfHwgZiA9PSBGR01BQ1MpICYmIG5ld3ZhbCkgeworI2lmICFNS1NIX1NfTk9WSQorCQlGbGFnKEZWSSkgPQorI2VuZGlmCisJCSAgICBGbGFnKEZFTUFDUykgPSBGbGFnKEZHTUFDUykgPSAwOworCQlGbGFnKGYpID0gKHVuc2lnbmVkIGNoYXIpbmV3dmFsOworCX0gZWxzZSBpZiAoZiA9PSBGUFJJVklMRUdFRCAmJiBvbGR2YWwgJiYgIW5ld3ZhbCkgeworCQkvKiBUdXJuaW5nIG9mZiAtcD8gKi8KKyNpZiBIQVZFX1NFVFJFU1VHSUQKKwkJZ2lkX3Qga3NoZWdpZCA9IGdldGdpZCgpOworCisJCXNldHJlc2dpZChrc2hlZ2lkLCBrc2hlZ2lkLCBrc2hlZ2lkKTsKKyNpZiBIQVZFX1NFVEdST1VQUworCQlzZXRncm91cHMoMSwgJmtzaGVnaWQpOworI2VuZGlmCisJCXNldHJlc3VpZChrc2hldWlkLCBrc2hldWlkLCBrc2hldWlkKTsKKyNlbHNlCisJCXNldGV1aWQoa3NoZXVpZCA9IGtzaHVpZCA9IGdldHVpZCgpKTsKKwkJc2V0dWlkKGtzaGV1aWQpOworCQlzZXRlZ2lkKGtzaGVnaWQgPSBrc2hnaWQgPSBnZXRnaWQoKSk7CisJCXNldGdpZChrc2hlZ2lkKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoKGYgPT0gRlBPU0lYIHx8IGYgPT0gRlNIKSAmJiBuZXd2YWwpIHsKKwkJRmxhZyhGUE9TSVgpID0gRmxhZyhGU0gpID0gRmxhZyhGQlJBQ0VFWFBBTkQpID0gMDsKKwkJRmxhZyhmKSA9ICh1bnNpZ25lZCBjaGFyKW5ld3ZhbDsKKwl9CisJLyogQ2hhbmdpbmcgaW50ZXJhY3RpdmUgZmxhZz8gKi8KKwlpZiAoZiA9PSBGVEFMS0lORykgeworCQlpZiAoKHdoYXQgPT0gT0ZfQ01ETElORSB8fCB3aGF0ID09IE9GX1NFVCkgJiYgcHJvY3BpZCA9PSBrc2hwaWQpCisJCQlGbGFnKEZUQUxLSU5HX0kpID0gKHVuc2lnbmVkIGNoYXIpbmV3dmFsOworCX0KK30KKworLyogUGFyc2UgY29tbWFuZCBsaW5lICYgc2V0IGNvbW1hbmQgYXJndW1lbnRzLiBSZXR1cm5zIHRoZSBpbmRleCBvZgorICogbm9uLW9wdGlvbiBhcmd1bWVudHMsIC0xIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICovCitpbnQKK3BhcnNlX2FyZ3MoY29uc3QgY2hhciAqKmFyZ3YsCisgICAgaW50IHdoYXQsCQkJLyogT0ZfQ01ETElORSBvciBPRl9TRVQgKi8KKyAgICBib29sICpzZXRhcmdzcCkKK3sKKwlzdGF0aWMgY2hhciBjbWRfb3B0c1tORUxFTShvcHRpb25zKSArIDVdOyAvKiBvOlQ6XDAgKi8KKwlzdGF0aWMgY2hhciBzZXRfb3B0c1tORUxFTShvcHRpb25zKSArIDZdOyAvKiBBOm87c1wwICovCisJY2hhciBzZXQsICpvcHRzOworCWNvbnN0IGNoYXIgKmFycmF5ID0gTlVMTDsKKwlHZXRvcHQgZ287CisJc2l6ZV90IGk7CisJaW50IG9wdGMsIHNvcnRhcmdzID0gMCwgYXJyYXlzZXQgPSAwOworCisJLyogRmlyc3QgY2FsbD8gQnVpbGQgb3B0aW9uIHN0cmluZ3MuLi4gKi8KKwlpZiAoY21kX29wdHNbMF0gPT0gJ1wwJykgeworCQljaGFyICpwID0gY21kX29wdHMsICpxID0gc2V0X29wdHM7CisKKwkJLyogc2VlIGNtZF9vcHRzW10gZGVjbGFyYXRpb24gKi8KKwkJKnArKyA9ICdvJzsKKwkJKnArKyA9ICc6JzsKKyNpZiAhZGVmaW5lZChNS1NIX1NNQUxMKSB8fCBkZWZpbmVkKFRJT0NTQ1RUWSkKKwkJKnArKyA9ICdUJzsKKwkJKnArKyA9ICc6JzsKKyNlbmRpZgorCQkvKiBzZWUgc2V0X29wdHNbXSBkZWNsYXJhdGlvbiAqLworCQkqcSsrID0gJ0EnOworCQkqcSsrID0gJzonOworCQkqcSsrID0gJ28nOworCQkqcSsrID0gJzsnOworCQkqcSsrID0gJ3MnOworCisJCWZvciAoaSA9IDA7IGkgPCBORUxFTShvcHRpb25zKTsgaSsrKSB7CisJCQlpZiAob3B0aW9uc1tpXS5jKSB7CisJCQkJaWYgKG9wdGlvbnNbaV0uZmxhZ3MgJiBPRl9DTURMSU5FKQorCQkJCQkqcCsrID0gb3B0aW9uc1tpXS5jOworCQkJCWlmIChvcHRpb25zW2ldLmZsYWdzICYgT0ZfU0VUKQorCQkJCQkqcSsrID0gb3B0aW9uc1tpXS5jOworCQkJfQorCQl9CisJCSpwID0gJ1wwJzsKKwkJKnEgPSAnXDAnOworCX0KKworCWlmICh3aGF0ID09IE9GX0NNRExJTkUpIHsKKwkJY29uc3QgY2hhciAqcCA9IGFyZ3ZbMF0sICpxOworCQkvKiBTZXQgRkxPR0lOIGJlZm9yZSBwYXJzaW5nIG9wdGlvbnMgc28gdXNlciBjYW4gY2xlYXIKKwkJICogZmxhZyB1c2luZyArbC4KKwkJICovCisJCWlmICgqcCAhPSAnLScpCisJCQlmb3IgKHEgPSBwOyAqcTsgKQorCQkJCWlmICgqcSsrID09ICcvJykKKwkJCQkJcCA9IHE7CisJCUZsYWcoRkxPR0lOKSA9ICgqcCA9PSAnLScpOworCQlvcHRzID0gY21kX29wdHM7CisJfSBlbHNlIGlmICh3aGF0ID09IE9GX0ZJUlNUVElNRSkgeworCQlvcHRzID0gY21kX29wdHM7CisJfSBlbHNlCisJCW9wdHMgPSBzZXRfb3B0czsKKwlrc2hfZ2V0b3B0X3Jlc2V0KCZnbywgR0ZfRVJST1J8R0ZfUExVU09QVCk7CisJd2hpbGUgKChvcHRjID0ga3NoX2dldG9wdChhcmd2LCAmZ28sIG9wdHMpKSAhPSAtMSkgeworCQlzZXQgPSAoZ28uaW5mbyAmIEdJX1BMVVMpID8gMCA6IDE7CisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdBJzoKKwkJCWlmICh3aGF0ID09IE9GX0ZJUlNUVElNRSkKKwkJCQlicmVhazsKKwkJCWFycmF5c2V0ID0gc2V0ID8gMSA6IC0xOworCQkJYXJyYXkgPSBnby5vcHRhcmc7CisJCQlicmVhazsKKworCQljYXNlICdvJzoKKwkJCWlmICh3aGF0ID09IE9GX0ZJUlNUVElNRSkKKwkJCQlicmVhazsKKwkJCWlmIChnby5vcHRhcmcgPT0gTlVMTCkgeworCQkJCS8qIGxvbmUgLW86IHByaW50IG9wdGlvbnMKKwkJCQkgKgorCQkJCSAqIE5vdGUgdGhhdCBvbiB0aGUgY29tbWFuZCBsaW5lLCAtbyByZXF1aXJlcworCQkJCSAqIGFuIG9wdGlvbiAoaWUsIGNhbid0IGdldCBoZXJlIGlmIHdoYXQgaXMKKwkJCQkgKiBPRl9DTURMSU5FKS4KKwkJCQkgKi8KKwkJCQlwcmludG9wdGlvbnMoc2V0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWkgPSBvcHRpb24oZ28ub3B0YXJnKTsKKwkJCWlmICgoZW51bSBzaF9mbGFnKWkgPT0gRkFSQzRSQU5ET00pIHsKKwkJCQl3YXJuaW5nZih0cnVlLCAiRG8gbm90IHVzZSBzZXQgwrFvIGFyYzRyYW5kb20sIgorCQkJCSAgICAiIGl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCB2ZXJzaW9uIgorCQkJCSAgICAiIG9mIG1rc2ghIik7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWlmICgoaSAhPSAoc2l6ZV90KS0xKSAmJiBzZXQgPT0gRmxhZyhpKSkKKwkJCQkvKiBEb24ndCBjaGVjayB0aGUgY29udGV4dCBpZiB0aGUgZmxhZworCQkJCSAqIGlzbid0IGNoYW5naW5nIC0gbWFrZXMgInNldCAtbyBpbnRlcmFjdGl2ZSIKKwkJCQkgKiB3b3JrIGlmIHlvdSdyZSBhbHJlYWR5IGludGVyYWN0aXZlLiBOZWVkZWQKKwkJCQkgKiBpZiB0aGUgb3V0cHV0IG9mICJzZXQgK28iIGlzIHRvIGJlIHVzZWQuCisJCQkJICovCisJCQkJOworCQkJZWxzZSBpZiAoKGkgIT0gKHNpemVfdCktMSkgJiYgKG9wdGlvbnNbaV0uZmxhZ3MgJiB3aGF0KSkKKwkJCQljaGFuZ2VfZmxhZygoZW51bSBzaF9mbGFnKWksIHdoYXQsIHNldCk7CisJCQllbHNlIHsKKwkJCQliaV9lcnJvcmYoIiVzOiBiYWQgb3B0aW9uIiwgZ28ub3B0YXJnKTsKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkJCWJyZWFrOworCisjaWYgIWRlZmluZWQoTUtTSF9TTUFMTCkgfHwgZGVmaW5lZChUSU9DU0NUVFkpCisJCWNhc2UgJ1QnOgorCQkJaWYgKHdoYXQgIT0gT0ZfRklSU1RUSU1FKQorCQkJCWJyZWFrOworI2lmbmRlZiBUSU9DU0NUVFkKKwkJCWVycm9yZigibm8gVElPQ1NDVFRZIGlvY3RsIik7CisjZWxzZQorCQkJY2hhbmdlX2ZsYWcoRlRBTEtJTkcsIE9GX0NNRExJTkUsIDEpOworCQkJY2h2dChnby5vcHRhcmcpOworCQkJYnJlYWs7CisjZW5kaWYKKyNlbmRpZgorCisJCWNhc2UgJz8nOgorCQkJcmV0dXJuICgtMSk7CisKKwkJZGVmYXVsdDoKKwkJCWlmICh3aGF0ID09IE9GX0ZJUlNUVElNRSkKKwkJCQlicmVhazsKKwkJCS8qIC1zOiBzb3J0IHBvc2l0aW9uYWwgcGFyYW1zIChBVCZUIGtzaCBzdHVwaWRpdHkpICovCisJCQlpZiAod2hhdCA9PSBPRl9TRVQgJiYgb3B0YyA9PSAncycpIHsKKwkJCQlzb3J0YXJncyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgTkVMRU0ob3B0aW9ucyk7IGkrKykKKwkJCQlpZiAob3B0YyA9PSBvcHRpb25zW2ldLmMgJiYKKwkJCQkgICAgKHdoYXQgJiBvcHRpb25zW2ldLmZsYWdzKSkgeworCQkJCQljaGFuZ2VfZmxhZygoZW51bSBzaF9mbGFnKWksIHdoYXQsIHNldCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWlmIChpID09IE5FTEVNKG9wdGlvbnMpKQorCQkJCWludGVybmFsX2Vycm9yZigicGFyc2VfYXJnczogJyVjJyIsIG9wdGMpOworCQl9CisJfQorCWlmICghKGdvLmluZm8gJiBHSV9NSU5VU01JTlVTKSAmJiBhcmd2W2dvLm9wdGluZF0gJiYKKwkgICAgKGFyZ3ZbZ28ub3B0aW5kXVswXSA9PSAnLScgfHwgYXJndltnby5vcHRpbmRdWzBdID09ICcrJykgJiYKKwkgICAgYXJndltnby5vcHRpbmRdWzFdID09ICdcMCcpIHsKKwkJLyogbG9uZSAtIGNsZWFycyAtdiBhbmQgLXggZmxhZ3MgKi8KKwkJaWYgKGFyZ3ZbZ28ub3B0aW5kXVswXSA9PSAnLScpCisJCQlGbGFnKEZWRVJCT1NFKSA9IEZsYWcoRlhUUkFDRSkgPSAwOworCQkvKiBzZXQgc2tpcHMgbG9uZSAtIG9yICsgb3B0aW9uICovCisJCWdvLm9wdGluZCsrOworCX0KKwlpZiAoc2V0YXJnc3ApCisJCS8qIC0tIG1lYW5zIHNldCAkIy8kKiBldmVuIGlmIHRoZXJlIGFyZSBubyBhcmd1bWVudHMgKi8KKwkJKnNldGFyZ3NwID0gIWFycmF5c2V0ICYmICgoZ28uaW5mbyAmIEdJX01JTlVTTUlOVVMpIHx8CisJCSAgICBhcmd2W2dvLm9wdGluZF0pOworCisJaWYgKGFycmF5c2V0ICYmICghKmFycmF5IHx8ICpza2lwX3Zhcm5hbWUoYXJyYXksIGZhbHNlKSkpIHsKKwkJYmlfZXJyb3JmKCIlczogaXMgbm90IGFuIGlkZW50aWZpZXIiLCBhcnJheSk7CisJCXJldHVybiAoLTEpOworCX0KKwlpZiAoc29ydGFyZ3MpIHsKKwkJZm9yIChpID0gZ28ub3B0aW5kOyBhcmd2W2ldOyBpKyspCisJCQk7CisJCXFzb3J0KCZhcmd2W2dvLm9wdGluZF0sIGkgLSBnby5vcHRpbmQsIHNpemVvZih2b2lkICopLAorCQkgICAgeHN0cmNtcCk7CisJfQorCWlmIChhcnJheXNldCkKKwkJZ28ub3B0aW5kICs9IHNldF9hcnJheShhcnJheSwgYXJyYXlzZXQgPiAwID8gdHJ1ZSA6IGZhbHNlLAorCQkgICAgYXJndiArIGdvLm9wdGluZCk7CisKKwlyZXR1cm4gKGdvLm9wdGluZCk7Cit9CisKKy8qIHBhcnNlIGEgZGVjaW1hbCBudW1iZXI6IHJldHVybnMgMCBpZiBzdHJpbmcgaXNuJ3QgYSBudW1iZXIsIDEgb3RoZXJ3aXNlICovCitpbnQKK2dldG4oY29uc3QgY2hhciAqcywgaW50ICphaSkKK3sKKwlpbnQgaSwgYywgcnYgPSAwOworCWJvb2wgbmVnID0gZmFsc2U7CisKKwlkbyB7CisJCWMgPSAqcysrOworCX0gd2hpbGUgKGtzaF9pc3NwYWNlKGMpKTsKKwlpZiAoYyA9PSAnLScpIHsKKwkJbmVnID0gdHJ1ZTsKKwkJYyA9ICpzKys7CisJfSBlbHNlIGlmIChjID09ICcrJykKKwkJYyA9ICpzKys7CisJKmFpID0gaSA9IDA7CisJZG8geworCQlpZiAoIWtzaF9pc2RpZ2l0KGMpKQorCQkJZ290byBnZXRuX291dDsKKwkJaSAqPSAxMDsKKwkJaWYgKGkgPCAqYWkpCisJCQkvKiBvdmVyZmxvdyAqLworCQkJZ290byBnZXRuX291dDsKKwkJaSArPSBjIC0gJzAnOworCQkqYWkgPSBpOworCX0gd2hpbGUgKChjID0gKnMrKykpOworCXJ2ID0gMTsKKworIGdldG5fb3V0OgorCWlmIChuZWcpCisJCSphaSA9IC0qYWk7CisJcmV0dXJuIChydik7Cit9CisKKy8qIGdldG4oKSB0aGF0IHByaW50cyBlcnJvciAqLworaW50CitiaV9nZXRuKGNvbnN0IGNoYXIgKmFzLCBpbnQgKmFpKQoreworCWludCBydjsKKworCWlmICghKHJ2ID0gZ2V0bihhcywgYWkpKSkKKwkJYmlfZXJyb3JmKCIlczogYmFkIG51bWJlciIsIGFzKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyogLS0tLS0tLS0gZ21hdGNoLmMgLS0tLS0tLS0gKi8KKworLyoKKyAqIGludCBnbWF0Y2goc3RyaW5nLCBwYXR0ZXJuKQorICogY2hhciAqc3RyaW5nLCAqcGF0dGVybjsKKyAqCisgKiBNYXRjaCBhIHBhdHRlcm4gYXMgaW4gc2goMSkuCisgKiBwYXR0ZXJuIGNoYXJhY3RlciBhcmUgcHJlZml4ZWQgd2l0aCBNQUdJQyBieSBleHBhbmQuCisgKi8KKworaW50CitnbWF0Y2h4KGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnAsIGJvb2wgaXNmaWxlKQoreworCWNvbnN0IGNoYXIgKnNlLCAqcGU7CisKKwlpZiAocyA9PSBOVUxMIHx8IHAgPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKworCXNlID0gcyArIHN0cmxlbihzKTsKKwlwZSA9IHAgKyBzdHJsZW4ocCk7CisJLyogaXNmaWxlIGlzIGZhbHNlIGlmZiBubyBzeW50YXggY2hlY2sgaGFzIGJlZW4gZG9uZSBvbgorCSAqIHRoZSBwYXR0ZXJuLiBJZiBjaGVjayBmYWlscywganVzdCB0byBhIHN0cmNtcCgpLgorCSAqLworCWlmICghaXNmaWxlICYmICFoYXNfZ2xvYmJpbmcocCwgcGUpKSB7CisJCXNpemVfdCBsZW4gPSBwZSAtIHAgKyAxOworCQljaGFyIHRidWZbNjRdOworCQljaGFyICp0ID0gbGVuIDw9IHNpemVvZih0YnVmKSA/IHRidWYgOiBhbGxvYyhsZW4sIEFURU1QKTsKKwkJZGVidW5rKHQsIHAsIGxlbik7CisJCXJldHVybiAoIXN0cmNtcCh0LCBzKSk7CisJfQorCXJldHVybiAoZG9fZ21hdGNoKChjb25zdCB1bnNpZ25lZCBjaGFyICopIHMsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIHNlLAorCSAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBwLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBwZSkpOworfQorCisvKiBSZXR1cm5zIGlmIHAgaXMgYSBzeW50YWN0aWNseSBjb3JyZWN0IGdsb2JiaW5nIHBhdHRlcm4sIGZhbHNlCisgKiBpZiBpdCBjb250YWlucyBubyBwYXR0ZXJuIGNoYXJhY3RlcnMgb3IgaWYgdGhlcmUgaXMgYSBzeW50YXggZXJyb3IuCisgKiBTeW50YXggZXJyb3JzIGFyZToKKyAqCS0gWyB3aXRoIG5vIGNsb3NpbmcgXQorICoJLSBpbWJhbGFuY2VkICQoLi4uKSBleHByZXNzaW9uCisgKgktIFsuLi5dIGFuZCAqKC4uLikgbm90IG5lc3RlZCAoZWcsIFthJChifF1jKSwgKihhW2J8Y11kKSkKKyAqLworLypYWFgKKy0gaWYgbm8gbWFnaWMsCisJaWYgZGVzdCBnaXZlbiwgY29weSB0byBkc3QKKwlyZXR1cm4gPworLSBpZiBtYWdpYyAmJiAobm8gZ2xvYmJpbmcgfHwgc3ludGF4IGVycm9yKQorCWRlYnVuayB0byBkc3QKKwlyZXR1cm4gPworLSByZXR1cm4gPworKi8KK2ludAoraGFzX2dsb2JiaW5nKGNvbnN0IGNoYXIgKnhwLCBjb25zdCBjaGFyICp4cGUpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHhwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgeHBlOworCWludCBjOworCWludCBuZXN0ID0gMCwgYm5lc3QgPSAwOworCWludCBzYXdfZ2xvYiA9IDA7CisJaW50IGluX2JyYWNrZXQgPSAwOyAvKiBpbnNpZGUgWy4uLl0gKi8KKworCWZvciAoOyBwIDwgcGU7IHArKykgeworCQlpZiAoIUlTTUFHSUMoKnApKQorCQkJY29udGludWU7CisJCWlmICgoYyA9ICorK3ApID09ICcqJyB8fCBjID09ICc/JykKKwkJCXNhd19nbG9iID0gMTsKKwkJZWxzZSBpZiAoYyA9PSAnWycpIHsKKwkJCWlmICghaW5fYnJhY2tldCkgeworCQkJCXNhd19nbG9iID0gMTsKKwkJCQlpbl9icmFja2V0ID0gMTsKKwkJCQlpZiAoSVNNQUdJQyhwWzFdKSAmJiBwWzJdID09IE5PVCkKKwkJCQkJcCArPSAyOworCQkJCWlmIChJU01BR0lDKHBbMV0pICYmIHBbMl0gPT0gJ10nKQorCQkJCQlwICs9IDI7CisJCQl9CisJCQkvKiBYWFggRG8gd2UgbmVlZCB0byBjaGVjayByYW5nZXMgaGVyZT8gUE9TSVggUSAqLworCQl9IGVsc2UgaWYgKGMgPT0gJ10nKSB7CisJCQlpZiAoaW5fYnJhY2tldCkgeworCQkJCWlmIChibmVzdCkJCS8qIFthKihiXSkgKi8KKwkJCQkJcmV0dXJuICgwKTsKKwkJCQlpbl9icmFja2V0ID0gMDsKKwkJCX0KKwkJfSBlbHNlIGlmICgoYyAmIDB4ODApICYmIHZzdHJjaHIoIiorP0AhICIsIGMgJiAweDdmKSkgeworCQkJc2F3X2dsb2IgPSAxOworCQkJaWYgKGluX2JyYWNrZXQpCisJCQkJYm5lc3QrKzsKKwkJCWVsc2UKKwkJCQluZXN0Kys7CisJCX0gZWxzZSBpZiAoYyA9PSAnfCcpIHsKKwkJCWlmIChpbl9icmFja2V0ICYmICFibmVzdCkJLyogKihhW2Zvb3xiYXJdKSAqLworCQkJCXJldHVybiAoMCk7CisJCX0gZWxzZSBpZiAoYyA9PSAvKigqLyAnKScpIHsKKwkJCWlmIChpbl9icmFja2V0KSB7CisJCQkJaWYgKCFibmVzdC0tKQkJLyogKihhW2IpY10gKi8KKwkJCQkJcmV0dXJuICgwKTsKKwkJCX0gZWxzZSBpZiAobmVzdCkKKwkJCQluZXN0LS07CisJCX0KKwkJLyoKKwkJICogZWxzZSBtdXN0IGJlIGEgTUFHSUMtTUFHSUMsIG9yIE1BR0lDLSEsCisJCSAqIE1BR0lDLS0sIE1BR0lDLV0sIE1BR0lDLXssIE1BR0lDLSwgTUFHSUMtfQorCQkgKi8KKwl9CisJcmV0dXJuIChzYXdfZ2xvYiAmJiAhaW5fYnJhY2tldCAmJiAhbmVzdCk7Cit9CisKKy8qIEZ1bmN0aW9uIG11c3QgcmV0dXJuIGVpdGhlciAwIG9yIDEgKGFzc3VtZWQgYnkgY29kZSBmb3IgMHg4MHwnIScpICovCitzdGF0aWMgaW50Citkb19nbWF0Y2goY29uc3QgdW5zaWduZWQgY2hhciAqcywgY29uc3QgdW5zaWduZWQgY2hhciAqc2UsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcGUpCit7CisJaW50IHNjLCBwYzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwcmVzdCwgKnBzdWIsICpwbmV4dDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzcmVzdDsKKworCWlmIChzID09IE5VTEwgfHwgcCA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCXdoaWxlIChwIDwgcGUpIHsKKwkJcGMgPSAqcCsrOworCQlzYyA9IHMgPCBzZSA/ICpzIDogJ1wwJzsKKwkJcysrOworCQlpZiAoIUlTTUFHSUMocGMpKSB7CisJCQlpZiAoc2MgIT0gcGMpCisJCQkJcmV0dXJuICgwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN3aXRjaCAoKnArKykgeworCQljYXNlICdbJzoKKwkJCWlmIChzYyA9PSAwIHx8IChwID0gY2NsYXNzKHAsIHNjKSkgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJYnJlYWs7CisKKwkJY2FzZSAnPyc6CisJCQlpZiAoc2MgPT0gMCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKFVURk1PREUpIHsKKwkJCQktLXM7CisJCQkJcyArPSB1dGZfcHRyYWRqKChjb25zdCB2b2lkICopcyk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICcqJzoKKwkJCWlmIChwID09IHBlKQorCQkJCXJldHVybiAoMSk7CisJCQlzLS07CisJCQlkbyB7CisJCQkJaWYgKGRvX2dtYXRjaChzLCBzZSwgcCwgcGUpKQorCQkJCQlyZXR1cm4gKDEpOworCQkJfSB3aGlsZSAocysrIDwgc2UpOworCQkJcmV0dXJuICgwKTsKKworCQkvKioKKwkJICogWyorP0AhXShwYXR0ZXJufHBhdHRlcm58Li4pCisJCSAqIFRoaXMgaXMgYWxzbyBuZWVkZWQgZm9yICR7Li4lLi59LCBldGMuCisJCSAqLworCQljYXNlIDB4ODB8JysnOiAvKiBtYXRjaGVzIG9uZSBvciBtb3JlIHRpbWVzICovCisJCWNhc2UgMHg4MHwnKic6IC8qIG1hdGNoZXMgemVybyBvciBtb3JlIHRpbWVzICovCisJCQlpZiAoIShwcmVzdCA9IHBhdF9zY2FuKHAsIHBlLCAwKSkpCisJCQkJcmV0dXJuICgwKTsKKwkJCXMtLTsKKwkJCS8qIHRha2UgY2FyZSBvZiB6ZXJvIG1hdGNoZXMgKi8KKwkJCWlmIChwWy0xXSA9PSAoMHg4MCB8ICcqJykgJiYKKwkJCSAgICBkb19nbWF0Y2gocywgc2UsIHByZXN0LCBwZSkpCisJCQkJcmV0dXJuICgxKTsKKwkJCWZvciAocHN1YiA9IHA7IDsgcHN1YiA9IHBuZXh0KSB7CisJCQkJcG5leHQgPSBwYXRfc2Nhbihwc3ViLCBwZSwgMSk7CisJCQkJZm9yIChzcmVzdCA9IHM7IHNyZXN0IDw9IHNlOyBzcmVzdCsrKSB7CisJCQkJCWlmIChkb19nbWF0Y2gocywgc3Jlc3QsIHBzdWIsIHBuZXh0IC0gMikgJiYKKwkJCQkJICAgIChkb19nbWF0Y2goc3Jlc3QsIHNlLCBwcmVzdCwgcGUpIHx8CisJCQkJCSAgICAocyAhPSBzcmVzdCAmJiBkb19nbWF0Y2goc3Jlc3QsCisJCQkJCSAgICBzZSwgcCAtIDIsIHBlKSkpKQorCQkJCQkJcmV0dXJuICgxKTsKKwkJCQl9CisJCQkJaWYgKHBuZXh0ID09IHByZXN0KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXJldHVybiAoMCk7CisKKwkJY2FzZSAweDgwfCc/JzogLyogbWF0Y2hlcyB6ZXJvIG9yIG9uY2UgKi8KKwkJY2FzZSAweDgwfCdAJzogLyogbWF0Y2hlcyBvbmUgb2YgdGhlIHBhdHRlcm5zICovCisJCWNhc2UgMHg4MHwnICc6IC8qIHNpbWlsZSBmb3IgQCAqLworCQkJaWYgKCEocHJlc3QgPSBwYXRfc2NhbihwLCBwZSwgMCkpKQorCQkJCXJldHVybiAoMCk7CisJCQlzLS07CisJCQkvKiBUYWtlIGNhcmUgb2YgemVybyBtYXRjaGVzICovCisJCQlpZiAocFstMV0gPT0gKDB4ODAgfCAnPycpICYmCisJCQkgICAgZG9fZ21hdGNoKHMsIHNlLCBwcmVzdCwgcGUpKQorCQkJCXJldHVybiAoMSk7CisJCQlmb3IgKHBzdWIgPSBwOyA7IHBzdWIgPSBwbmV4dCkgeworCQkJCXBuZXh0ID0gcGF0X3NjYW4ocHN1YiwgcGUsIDEpOworCQkJCXNyZXN0ID0gcHJlc3QgPT0gcGUgPyBzZSA6IHM7CisJCQkJZm9yICg7IHNyZXN0IDw9IHNlOyBzcmVzdCsrKSB7CisJCQkJCWlmIChkb19nbWF0Y2gocywgc3Jlc3QsIHBzdWIsIHBuZXh0IC0gMikgJiYKKwkJCQkJICAgIGRvX2dtYXRjaChzcmVzdCwgc2UsIHByZXN0LCBwZSkpCisJCQkJCQlyZXR1cm4gKDEpOworCQkJCX0KKwkJCQlpZiAocG5leHQgPT0gcHJlc3QpCisJCQkJCWJyZWFrOworCQkJfQorCQkJcmV0dXJuICgwKTsKKworCQljYXNlIDB4ODB8JyEnOiAvKiBtYXRjaGVzIG5vbmUgb2YgdGhlIHBhdHRlcm5zICovCisJCQlpZiAoIShwcmVzdCA9IHBhdF9zY2FuKHAsIHBlLCAwKSkpCisJCQkJcmV0dXJuICgwKTsKKwkJCXMtLTsKKwkJCWZvciAoc3Jlc3QgPSBzOyBzcmVzdCA8PSBzZTsgc3Jlc3QrKykgeworCQkJCWludCBtYXRjaGVkID0gMDsKKworCQkJCWZvciAocHN1YiA9IHA7IDsgcHN1YiA9IHBuZXh0KSB7CisJCQkJCXBuZXh0ID0gcGF0X3NjYW4ocHN1YiwgcGUsIDEpOworCQkJCQlpZiAoZG9fZ21hdGNoKHMsIHNyZXN0LCBwc3ViLAorCQkJCQkgICAgcG5leHQgLSAyKSkgeworCQkJCQkJbWF0Y2hlZCA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAocG5leHQgPT0gcHJlc3QpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCFtYXRjaGVkICYmCisJCQkJICAgIGRvX2dtYXRjaChzcmVzdCwgc2UsIHByZXN0LCBwZSkpCisJCQkJCXJldHVybiAoMSk7CisJCQl9CisJCQlyZXR1cm4gKDApOworCisJCWRlZmF1bHQ6CisJCQlpZiAoc2MgIT0gcFstMV0pCisJCQkJcmV0dXJuICgwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAocyA9PSBzZSk7Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICoKK2NjbGFzcyhjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgc3ViKQoreworCWludCBjLCBkLCBub3RwLCBmb3VuZCA9IDA7CisJY29uc3QgdW5zaWduZWQgY2hhciAqb3JpZ19wID0gcDsKKworCWlmICgobm90cCA9IChJU01BR0lDKCpwKSAmJiAqKytwID09IE5PVCkpKQorCQlwKys7CisJZG8geworCQljID0gKnArKzsKKwkJaWYgKElTTUFHSUMoYykpIHsKKwkJCWMgPSAqcCsrOworCQkJaWYgKChjICYgMHg4MCkgJiYgIUlTTUFHSUMoYykpIHsKKwkJCQljICY9IDB4N2Y7LyogZXh0ZW5kZWQgcGF0dGVybiBtYXRjaGluZzogKis/QCEgKi8KKwkJCQkvKiBYWFggdGhlICggY2hhciBpc24ndCBoYW5kbGVkIGFzIHBhcnQgb2YgW10gKi8KKwkJCQlpZiAoYyA9PSAnICcpIC8qIHNpbWlsZSBmb3IgQDogcGxhaW4gKC4uKSAqLworCQkJCQljID0gJygnIC8qKSovOworCQkJfQorCQl9CisJCWlmIChjID09ICdcMCcpCisJCQkvKiBObyBjbG9zaW5nIF0gLSBhY3QgYXMgaWYgdGhlIG9wZW5pbmcgWyB3YXMgcXVvdGVkICovCisJCQlyZXR1cm4gKHN1YiA9PSAnWycgPyBvcmlnX3AgOiBOVUxMKTsKKwkJaWYgKElTTUFHSUMocFswXSkgJiYgcFsxXSA9PSAnLScgJiYKKwkJICAgICghSVNNQUdJQyhwWzJdKSB8fCBwWzNdICE9ICddJykpIHsKKwkJCXAgKz0gMjsgLyogTUFHSUMtICovCisJCQlkID0gKnArKzsKKwkJCWlmIChJU01BR0lDKGQpKSB7CisJCQkJZCA9ICpwKys7CisJCQkJaWYgKChkICYgMHg4MCkgJiYgIUlTTUFHSUMoZCkpCisJCQkJCWQgJj0gMHg3ZjsKKwkJCX0KKwkJCS8qIFBPU0lYIHNheXMgdGhpcyBpcyBhbiBpbnZhbGlkIGV4cHJlc3Npb24gKi8KKwkJCWlmIChjID4gZCkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQl9IGVsc2UKKwkJCWQgPSBjOworCQlpZiAoYyA9PSBzdWIgfHwgKGMgPD0gc3ViICYmIHN1YiA8PSBkKSkKKwkJCWZvdW5kID0gMTsKKwl9IHdoaWxlICghKElTTUFHSUMocFswXSkgJiYgcFsxXSA9PSAnXScpKTsKKworCXJldHVybiAoKGZvdW5kICE9IG5vdHApID8gcCsyIDogTlVMTCk7Cit9CisKKy8qIExvb2sgZm9yIG5leHQgKSBvciB8IChpZiBtYXRjaF9zZXApIGluICooZm9vfGJhcikgcGF0dGVybiAqLworY29uc3QgdW5zaWduZWQgY2hhciAqCitwYXRfc2Nhbihjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwZSwgaW50IG1hdGNoX3NlcCkKK3sKKwlpbnQgbmVzdCA9IDA7CisKKwlmb3IgKDsgcCA8IHBlOyBwKyspIHsKKwkJaWYgKCFJU01BR0lDKCpwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKCorK3AgPT0gLyooKi8gJyknICYmIG5lc3QtLSA9PSAwKSB8fAorCQkgICAgKCpwID09ICd8JyAmJiBtYXRjaF9zZXAgJiYgbmVzdCA9PSAwKSkKKwkJCXJldHVybiAocCArIDEpOworCQlpZiAoKCpwICYgMHg4MCkgJiYgdnN0cmNocigiKis/QCEgIiwgKnAgJiAweDdmKSkKKwkJCW5lc3QrKzsKKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworaW50Cit4c3RyY21wKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKwlyZXR1cm4gKHN0cmNtcCgqKGNvbnN0IGNoYXIgKiBjb25zdCAqKXAxLCAqKGNvbnN0IGNoYXIgKiBjb25zdCAqKXAyKSk7Cit9CisKKy8qIEluaXRpYWxpc2UgYSBHZXRvcHQgc3RydWN0dXJlICovCit2b2lkCitrc2hfZ2V0b3B0X3Jlc2V0KEdldG9wdCAqZ28sIGludCBmbGFncykKK3sKKwlnby0+b3B0aW5kID0gMTsKKwlnby0+b3B0YXJnID0gTlVMTDsKKwlnby0+cCA9IDA7CisJZ28tPmZsYWdzID0gZmxhZ3M7CisJZ28tPmluZm8gPSAwOworCWdvLT5idWZbMV0gPSAnXDAnOworfQorCisKKy8qIGdldG9wdCgpIHVzZWQgZm9yIHNoZWxsIGJ1aWx0LWluIGNvbW1hbmRzLCB0aGUgZ2V0b3B0cyBjb21tYW5kLCBhbmQKKyAqIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICogQSBsZWFkaW5nICc6JyBpbiBvcHRpb25zIG1lYW5zIGRvbid0IHByaW50IGVycm9ycywgaW5zdGVhZCByZXR1cm4gJz8nCisgKiBvciAnOicgYW5kIHNldCBnby0+b3B0YXJnIHRvIHRoZSBvZmZlbmRpbmcgb3B0aW9uIGNoYXJhY3Rlci4KKyAqIElmIEdGX0VSUk9SIGlzIHNldCAoYW5kIG9wdGlvbiBkb2Vzbid0IHN0YXJ0IHdpdGggOiksIGVycm9ycyByZXN1bHQgaW4KKyAqIGEgY2FsbCB0byBiaV9lcnJvcmYoKS4KKyAqCisgKiBOb24tc3RhbmRhcmQgZmVhdHVyZXM6CisgKgktICc7JyBpcyBsaWtlICc6JyBpbiBvcHRpb25zLCBleGNlcHQgdGhlIGFyZ3VtZW50IGlzIG9wdGlvbmFsCisgKgkgIChpZiBpdCBpc24ndCBwcmVzZW50LCBvcHRhcmcgaXMgc2V0IHRvIDApLgorICoJICBVc2VkIGZvciAnc2V0IC1vJy4KKyAqCS0gJywnIGlzIGxpa2UgJzonIGluIG9wdGlvbnMsIGV4Y2VwdCB0aGUgYXJndW1lbnQgYWx3YXlzIGltbWVkaWF0ZWx5CisgKgkgIGZvbGxvd3MgdGhlIG9wdGlvbiBjaGFyYWN0ZXIgKG9wdGFyZyBpcyBzZXQgdG8gdGhlIG51bGwgc3RyaW5nIGlmCisgKgkgIHRoZSBvcHRpb24gaXMgbWlzc2luZykuCisgKgkgIFVzZWQgZm9yICdyZWFkIC11MicsICdwcmludCAtdTInIGFuZCBmYyAtNDAuCisgKgktICcjJyBpcyBsaWtlICc6JyBpbiBvcHRpb25zLCBleHBlY3QgdGhhdCB0aGUgYXJndW1lbnQgaXMgb3B0aW9uYWwKKyAqCSAgYW5kIG11c3Qgc3RhcnQgd2l0aCBhIGRpZ2l0LiBJZiB0aGUgYXJndW1lbnQgZG9lc24ndCBzdGFydCB3aXRoIGEKKyAqCSAgZGlnaXQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgbWlzc2luZyBhbmQgbm9ybWFsIG9wdGlvbiBwcm9jZXNzaW5nCisgKgkgIGNvbnRpbnVlcyAob3B0YXJnIGlzIHNldCB0byAwIGlmIHRoZSBvcHRpb24gaXMgbWlzc2luZykuCisgKgkgIFVzZWQgZm9yICd0eXBlc2V0IC1MWjQnLgorICoJLSBhY2NlcHRzICtjIGFzIHdlbGwgYXMgLWMgSUYgdGhlIEdGX1BMVVNPUFQgZmxhZyBpcyBwcmVzZW50LiBJZiBhbgorICoJICBvcHRpb24gc3RhcnRpbmcgd2l0aCArIGlzIGFjY2VwdGVkLCB0aGUgR0lfUExVUyBmbGFnIHdpbGwgYmUgc2V0CisgKgkgIGluIGdvLT5pbmZvLgorICovCitpbnQKK2tzaF9nZXRvcHQoY29uc3QgY2hhciAqKmFyZ3YsIEdldG9wdCAqZ28sIGNvbnN0IGNoYXIgKm9wdGlvbnNwKQoreworCWNoYXIgYzsKKwljb25zdCBjaGFyICpvOworCisJaWYgKGdvLT5wID09IDAgfHwgKGMgPSBhcmd2W2dvLT5vcHRpbmQgLSAxXVtnby0+cF0pID09ICdcMCcpIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltnby0+b3B0aW5kXSwgZmxhZyA9IGFyZyA/ICphcmcgOiAnXDAnOworCisJCWdvLT5wID0gMTsKKwkJaWYgKGZsYWcgPT0gJy0nICYmIGFyZ1sxXSA9PSAnLScgJiYgYXJnWzJdID09ICdcMCcpIHsKKwkJCWdvLT5vcHRpbmQrKzsKKwkJCWdvLT5wID0gMDsKKwkJCWdvLT5pbmZvIHw9IEdJX01JTlVTTUlOVVM7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlpZiAoYXJnID09IE5VTEwgfHwKKwkJICAgICgoZmxhZyAhPSAnLScgKSAmJiAvKiBuZWl0aGVyIGEgLSBub3IgYSArIChpZiArIGFsbG93ZWQpICovCisJCSAgICAoIShnby0+ZmxhZ3MgJiBHRl9QTFVTT1BUKSB8fCBmbGFnICE9ICcrJykpIHx8CisJCSAgICAoYyA9IGFyZ1sxXSkgPT0gJ1wwJykgeworCQkJZ28tPnAgPSAwOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJZ28tPm9wdGluZCsrOworCQlnby0+aW5mbyAmPSB+KEdJX01JTlVTfEdJX1BMVVMpOworCQlnby0+aW5mbyB8PSBmbGFnID09ICctJyA/IEdJX01JTlVTIDogR0lfUExVUzsKKwl9CisJZ28tPnArKzsKKwlpZiAoYyA9PSAnPycgfHwgYyA9PSAnOicgfHwgYyA9PSAnOycgfHwgYyA9PSAnLCcgfHwgYyA9PSAnIycgfHwKKwkgICAgIShvID0gY3N0cmNocihvcHRpb25zcCwgYykpKSB7CisJCWlmIChvcHRpb25zcFswXSA9PSAnOicpIHsKKwkJCWdvLT5idWZbMF0gPSBjOworCQkJZ28tPm9wdGFyZyA9IGdvLT5idWY7CisJCX0gZWxzZSB7CisJCQl3YXJuaW5nZih0cnVlLCAiJXMlcy0lYzogdW5rbm93biBvcHRpb24iLAorCQkJICAgIChnby0+ZmxhZ3MgJiBHRl9OT05BTUUpID8gIiIgOiBhcmd2WzBdLAorCQkJICAgIChnby0+ZmxhZ3MgJiBHRl9OT05BTUUpID8gIiIgOiAiOiAiLCBjKTsKKwkJCWlmIChnby0+ZmxhZ3MgJiBHRl9FUlJPUikKKwkJCQliaV9lcnJvcmZ6KCk7CisJCX0KKwkJcmV0dXJuICgnPycpOworCX0KKwkvKiA6IG1lYW5zIGFyZ3VtZW50IG11c3QgYmUgcHJlc2VudCwgbWF5IGJlIHBhcnQgb2Ygb3B0aW9uIGFyZ3VtZW50CisJICogICBvciB0aGUgbmV4dCBhcmd1bWVudAorCSAqIDsgc2FtZSBhcyA6IGJ1dCBhcmd1bWVudCBtYXkgYmUgbWlzc2luZworCSAqICwgbWVhbnMgYXJndW1lbnQgaXMgcGFydCBvZiBvcHRpb24gYXJndW1lbnQsIGFuZCBtYXkgYmUgbnVsbC4KKwkgKi8KKwlpZiAoKisrbyA9PSAnOicgfHwgKm8gPT0gJzsnKSB7CisJCWlmIChhcmd2W2dvLT5vcHRpbmQgLSAxXVtnby0+cF0pCisJCQlnby0+b3B0YXJnID0gYXJndltnby0+b3B0aW5kIC0gMV0gKyBnby0+cDsKKwkJZWxzZSBpZiAoYXJndltnby0+b3B0aW5kXSkKKwkJCWdvLT5vcHRhcmcgPSBhcmd2W2dvLT5vcHRpbmQrK107CisJCWVsc2UgaWYgKCpvID09ICc7JykKKwkJCWdvLT5vcHRhcmcgPSBOVUxMOworCQllbHNlIHsKKwkJCWlmIChvcHRpb25zcFswXSA9PSAnOicpIHsKKwkJCQlnby0+YnVmWzBdID0gYzsKKwkJCQlnby0+b3B0YXJnID0gZ28tPmJ1ZjsKKwkJCQlyZXR1cm4gKCc6Jyk7CisJCQl9CisJCQl3YXJuaW5nZih0cnVlLCAiJXMlcy0nJWMnIHJlcXVpcmVzIGFyZ3VtZW50IiwKKwkJCSAgICAoZ28tPmZsYWdzICYgR0ZfTk9OQU1FKSA/ICIiIDogYXJndlswXSwKKwkJCSAgICAoZ28tPmZsYWdzICYgR0ZfTk9OQU1FKSA/ICIiIDogIjogIiwgYyk7CisJCQlpZiAoZ28tPmZsYWdzICYgR0ZfRVJST1IpCisJCQkJYmlfZXJyb3JmeigpOworCQkJcmV0dXJuICgnPycpOworCQl9CisJCWdvLT5wID0gMDsKKwl9IGVsc2UgaWYgKCpvID09ICcsJykgeworCQkvKiBhcmd1bWVudCBpcyBhdHRhY2hlZCB0byBvcHRpb24gY2hhcmFjdGVyLCBldmVuIGlmIG51bGwgKi8KKwkJZ28tPm9wdGFyZyA9IGFyZ3ZbZ28tPm9wdGluZCAtIDFdICsgZ28tPnA7CisJCWdvLT5wID0gMDsKKwl9IGVsc2UgaWYgKCpvID09ICcjJykgeworCQkvKiBhcmd1bWVudCBpcyBvcHRpb25hbCBhbmQgbWF5IGJlIGF0dGFjaGVkIG9yIHVuYXR0YWNoZWQKKwkJICogYnV0IG11c3Qgc3RhcnQgd2l0aCBhIGRpZ2l0LiBvcHRhcmcgaXMgc2V0IHRvIDAgaWYgdGhlCisJCSAqIGFyZ3VtZW50IGlzIG1pc3NpbmcuCisJCSAqLworCQlpZiAoYXJndltnby0+b3B0aW5kIC0gMV1bZ28tPnBdKSB7CisJCQlpZiAoa3NoX2lzZGlnaXQoYXJndltnby0+b3B0aW5kIC0gMV1bZ28tPnBdKSkgeworCQkJCWdvLT5vcHRhcmcgPSBhcmd2W2dvLT5vcHRpbmQgLSAxXSArIGdvLT5wOworCQkJCWdvLT5wID0gMDsKKwkJCX0gZWxzZQorCQkJCWdvLT5vcHRhcmcgPSBOVUxMOworCQl9IGVsc2UgeworCQkJaWYgKGFyZ3ZbZ28tPm9wdGluZF0gJiYga3NoX2lzZGlnaXQoYXJndltnby0+b3B0aW5kXVswXSkpIHsKKwkJCQlnby0+b3B0YXJnID0gYXJndltnby0+b3B0aW5kKytdOworCQkJCWdvLT5wID0gMDsKKwkJCX0gZWxzZQorCQkJCWdvLT5vcHRhcmcgPSBOVUxMOworCQl9CisJfQorCXJldHVybiAoYyk7Cit9CisKKy8qIHByaW50IHZhcmlhYmxlL2FsaWFzIHZhbHVlIHVzaW5nIG5lY2Vzc2FyeSBxdW90ZXMKKyAqIChQT1NJWCBzYXlzIHRoZXkgc2hvdWxkIGJlIHN1aXRhYmxlIGZvciByZS1lbnRyeS4uLikKKyAqIE5vIHRyYWlsaW5nIG5ld2xpbmUgaXMgcHJpbnRlZC4KKyAqLwordm9pZAorcHJpbnRfdmFsdWVfcXVvdGVkKGNvbnN0IGNoYXIgKnMpCit7CisJY29uc3QgY2hhciAqcDsKKwlpbnQgaW5xdW90ZSA9IDA7CisKKwkvKiBUZXN0IGlmIGFueSBxdW90ZXMgYXJlIG5lZWRlZCAqLworCWZvciAocCA9IHM7ICpwOyBwKyspCisJCWlmIChjdHlwZSgqcCwgQ19RVU9URSkpCisJCQlicmVhazsKKwlpZiAoISpwKSB7CisJCXNoZl9wdXRzKHMsIHNobF9zdGRvdXQpOworCQlyZXR1cm47CisJfQorCWZvciAocCA9IHM7ICpwOyBwKyspIHsKKwkJaWYgKCpwID09ICdcJycpIHsKKwkJCWlmIChpbnF1b3RlKQorCQkJCXNoZl9wdXRjKCdcJycsIHNobF9zdGRvdXQpOworCQkJc2hmX3B1dGMoJ1xcJywgc2hsX3N0ZG91dCk7CisJCQlpbnF1b3RlID0gMDsKKwkJfSBlbHNlIGlmICghaW5xdW90ZSkgeworCQkJc2hmX3B1dGMoJ1wnJywgc2hsX3N0ZG91dCk7CisJCQlpbnF1b3RlID0gMTsKKwkJfQorCQlzaGZfcHV0YygqcCwgc2hsX3N0ZG91dCk7CisJfQorCWlmIChpbnF1b3RlKQorCQlzaGZfcHV0YygnXCcnLCBzaGxfc3Rkb3V0KTsKK30KKworLyoKKyAqIFByaW50IHRoaW5ncyBpbiBjb2x1bW5zIGFuZCByb3dzIC0gZnVuYygpIGlzIGNhbGxlZCB0byBmb3JtYXQKKyAqIHRoZSBpLXRoIGVsZW1lbnQKKyAqLwordm9pZAorcHJpbnRfY29sdW1ucyhzdHJ1Y3Qgc2hmICpzaGYsIGludCBuLAorICAgIGNoYXIgKigqZnVuYykoY2hhciAqLCBpbnQsIGludCwgY29uc3Qgdm9pZCAqKSwKKyAgICBjb25zdCB2b2lkICphcmcsIGludCBtYXhfb2N0LCBpbnQgbWF4X2NvbCwgYm9vbCBwcmVmY29sKQoreworCWludCBpLCByLCBjLCByb3dzLCBjb2xzLCBuc3BhY2U7CisJY2hhciAqc3RyOworCisJaWYgKG4gPD0gMCkgeworI2lmbmRlZiBNS1NIX1NNQUxMCisJCWludGVybmFsX3dhcm5pbmdmKCJwcmludF9jb2x1bW5zIGNhbGxlZCB3aXRoIG49JWQgPD0gMCIsIG4pOworI2VuZGlmCisJCXJldHVybjsKKwl9CisKKwkrK21heF9vY3Q7CisJc3RyID0gYWxsb2MobWF4X29jdCwgQVRFTVApOworCisJLyogZW5zdXJlIHhfY29scyBpcyB2YWxpZCBmaXJzdCAqLworCWlmICh4X2NvbHMgPCBNSU5fQ09MUykKKwkJY2hhbmdlX3dpbnN6KCk7CisKKwkvKgorCSAqIFdlIHVzZSAobWF4X2NvbCArIDEpIHRvIGNvbnNpZGVyIHRoZSBzcGFjZSBzZXBhcmF0b3IuCisJICogTm90ZSB0aGF0IG5vIHNwYWNlIGlzIHByaW50ZWQgYWZ0ZXIgdGhlIGxhc3QgY29sdW1uCisJICogdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0ZXJtaW5hbHMgdGhhdCBoYXZlIGF1dG8td3JhcC4KKwkgKi8KKwljb2xzID0geF9jb2xzIC8gKG1heF9jb2wgKyAxKTsKKworCS8qIGlmIHdlIGNhbiBvbmx5IHByaW50IG9uZSBjb2x1bW4gYW55d2F5LCBza2lwIHRoZSBnb28gKi8KKwlpZiAoY29scyA8IDIpIHsKKwkJZm9yIChpID0gMDsgaSA8IG47ICsraSkKKwkJCXNoZl9mcHJpbnRmKHNoZiwgIiVzIFxuIiwKKwkJCSAgICAoKmZ1bmMpKHN0ciwgbWF4X29jdCwgaSwgYXJnKSk7CisJCWdvdG8gb3V0OworCX0KKworCXJvd3MgPSAobiArIGNvbHMgLSAxKSAvIGNvbHM7CisJaWYgKHByZWZjb2wgJiYgY29scyA+IHJvd3MpIHsKKwkJaSA9IHJvd3M7CisJCXJvd3MgPSBjb2xzID4gbiA/IG4gOiBjb2xzOworCQljb2xzID0gaTsKKwl9CisKKwltYXhfY29sID0gLW1heF9jb2w7CisJbnNwYWNlID0gKHhfY29scyArIG1heF9jb2wgKiBjb2xzKSAvIGNvbHM7CisJaWYgKG5zcGFjZSA8PSAwKQorCQluc3BhY2UgPSAxOworCWZvciAociA9IDA7IHIgPCByb3dzOyByKyspIHsKKwkJZm9yIChjID0gMDsgYyA8IGNvbHM7IGMrKykgeworCQkJaSA9IGMgKiByb3dzICsgcjsKKwkJCWlmIChpIDwgbikgeworCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiUqcyIsIG1heF9jb2wsCisJCQkJICAgICgqZnVuYykoc3RyLCBtYXhfb2N0LCBpLCBhcmcpKTsKKwkJCQlpZiAoYyArIDEgPCBjb2xzKQorCQkJCQlzaGZfZnByaW50ZihzaGYsICIlKnMiLCBuc3BhY2UsIG51bGwpOworCQkJfQorCQl9CisJCXNoZl9wdXRjaGFyKCdcbicsIHNoZik7CisJfQorIG91dDoKKwlhZnJlZShzdHIsIEFURU1QKTsKK30KKworLyogU3RyaXAgYW55IG51bCBieXRlcyBmcm9tIGJ1ZiAtIHJldHVybnMgbmV3IGxlbmd0aCAobmJ5dGVzIC0gIyBvZiBudWxzKSAqLwordm9pZAorc3RyaXBfbnVscyhjaGFyICpidWYsIGludCBuYnl0ZXMpCit7CisJY2hhciAqZHN0OworCisJLyogbmJ5dGVzIGNoZWNrIGJlY2F1c2Ugc29tZSBzeXN0ZW1zIChvbGRlciBGcmVlQlNEcykgaGF2ZSBhIGJ1Z2d5CisJICogbWVtY2hyKCkKKwkgKi8KKwlpZiAobmJ5dGVzICYmIChkc3QgPSBtZW1jaHIoYnVmLCAnXDAnLCBuYnl0ZXMpKSkgeworCQljaGFyICplbmQgPSBidWYgKyBuYnl0ZXM7CisJCWNoYXIgKnAsICpxOworCisJCWZvciAocCA9IGRzdDsgcCA8IGVuZDsgcCA9IHEpIHsKKwkJCS8qIHNraXAgYSBibG9jayBvZiBudWxscyAqLworCQkJd2hpbGUgKCsrcCA8IGVuZCAmJiAqcCA9PSAnXDAnKQorCQkJCTsKKwkJCS8qIGZpbmQgZW5kIG9mIG5vbi1udWxsIGJsb2NrICovCisJCQlpZiAoIShxID0gbWVtY2hyKHAsICdcMCcsIGVuZCAtIHApKSkKKwkJCQlxID0gZW5kOworCQkJbWVtbW92ZShkc3QsIHAsIHEgLSBwKTsKKwkJCWRzdCArPSBxIC0gcDsKKwkJfQorCQkqZHN0ID0gJ1wwJzsKKwl9Cit9CisKKy8qIExpa2UgcmVhZCgyKSwgYnV0IGlmIHJlYWQgZmFpbHMgZHVlIHRvIG5vbi1ibG9ja2luZyBmbGFnLCByZXNldHMgZmxhZworICogYW5kIHJlc3RhcnRzIHJlYWQuCisgKi8KK2ludAorYmxvY2tpbmdfcmVhZChpbnQgZmQsIGNoYXIgKmJ1ZiwgaW50IG5ieXRlcykKK3sKKwlpbnQgcmV0OworCWludCB0cmllZF9yZXNldCA9IDA7CisKKwl3aGlsZSAoKHJldCA9IHJlYWQoZmQsIGJ1ZiwgbmJ5dGVzKSkgPCAwKSB7CisJCWlmICghdHJpZWRfcmVzZXQgJiYgZXJybm8gPT0gRUFHQUlOKSB7CisJCQlpZiAocmVzZXRfbm9uYmxvY2soZmQpID4gMCkgeworCQkJCXRyaWVkX3Jlc2V0ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVycm5vID0gRUFHQUlOOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qIFJlc2V0IHRoZSBub24tYmxvY2tpbmcgZmxhZyBvbiB0aGUgc3BlY2lmaWVkIGZpbGUgZGVzY3JpcHRvci4KKyAqIFJldHVybnMgLTEgaWYgdGhlcmUgd2FzIGFuIGVycm9yLCAwIGlmIG5vbi1ibG9ja2luZyB3YXNuJ3Qgc2V0LAorICogMSBpZiBpdCB3YXMuCisgKi8KK2ludAorcmVzZXRfbm9uYmxvY2soaW50IGZkKQoreworCWludCBmbGFnczsKKworCWlmICgoZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCwgMCkpIDwgMCkKKwkJcmV0dXJuICgtMSk7CisJaWYgKCEoZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJcmV0dXJuICgwKTsKKwlmbGFncyAmPSB+T19OT05CTE9DSzsKKwlpZiAoZmNudGwoZmQsIEZfU0VURkwsIGZsYWdzKSA8IDApCisJCXJldHVybiAoLTEpOworCXJldHVybiAoMSk7Cit9CisKKworLyogTGlrZSBnZXRjd2QoKSwgZXhjZXB0IGJzaXplIGlzIGlnbm9yZWQgaWYgYnVmIGlzIDAgKFBBVEhfTUFYIGlzIHVzZWQpICovCitjaGFyICoKK2tzaF9nZXRfd2Qoc2l6ZV90ICpkbGVuKQoreworCWNoYXIgKnJldCwgKmI7CisJc2l6ZV90IGxlbiA9IDE7CisKKyNpZmRlZiBOT19QQVRIX01BWAorCWlmICgoYiA9IGdldF9jdXJyZW50X2Rpcl9uYW1lKCkpKSB7CisJCWxlbiA9IHN0cmxlbihiKSArIDE7CisJCXN0cm5kdXB4KHJldCwgYiwgbGVuIC0gMSwgQVRFTVApOworCQlmcmVlKGIpOworCX0gZWxzZQorCQlyZXQgPSBOVUxMOworI2Vsc2UKKwlpZiAoKHJldCA9IGdldGN3ZCgoYiA9IGFsbG9jKFBBVEhfTUFYICsgMSwgQVRFTVApKSwgUEFUSF9NQVgpKSkKKwkJcmV0ID0gYXJlc2l6ZShiLCBsZW4gPSAoc3RybGVuKGIpICsgMSksIEFURU1QKTsKKwllbHNlCisJCWFmcmVlKGIsIEFURU1QKTsKKyNlbmRpZgorCisJaWYgKGRsZW4pCisJCSpkbGVuID0gbGVuOworCXJldHVybiAocmV0KTsKK30KKworLyoKKyAqCU1ha2VzIGEgZmlsZW5hbWUgaW50byByZXN1bHQgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG0uCisgKgktIG1ha2UgcmVzdWx0IE5VTEwKKyAqCS0gaWYgZmlsZSBzdGFydHMgd2l0aCAnLycsIGFwcGVuZCBmaWxlIHRvIHJlc3VsdCAmIHNldCBjZHBhdGhwIHRvIE5VTEwKKyAqCS0gaWYgZmlsZSBzdGFydHMgd2l0aCAuLyBvciAuLi8gYXBwZW5kIGN3ZCBhbmQgZmlsZSB0byByZXN1bHQKKyAqCSAgYW5kIHNldCBjZHBhdGhwIHRvIE5VTEwKKyAqCS0gaWYgdGhlIGZpcnN0IGVsZW1lbnQgb2YgY2RwYXRocCBkb2VzbnQgc3RhcnQgd2l0aCBhICcvJyB4eCBvciAnLicgeHgKKyAqCSAgdGhlbiBjd2QgaXMgYXBwZW5kZWQgdG8gcmVzdWx0LgorICoJLSB0aGUgZmlyc3QgZWxlbWVudCBvZiBjZHBhdGhwIGlzIGFwcGVuZGVkIHRvIHJlc3VsdAorICoJLSBmaWxlIGlzIGFwcGVuZGVkIHRvIHJlc3VsdAorICoJLSBjZHBhdGhwIGlzIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZWxlbWVudCBpbiBjZHBhdGhwIChvciBOVUxMCisgKgkgIGlmIHRoZXJlIGFyZSBubyBtb3JlIGVsZW1lbnRzLgorICoJVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciBhIG5vbi1udWxsIGVsZW1lbnQgZnJvbSBjZHBhdGhwCisgKgl3YXMgYXBwZW5kZWQgdG8gcmVzdWx0LgorICovCitpbnQKK21ha2VfcGF0aChjb25zdCBjaGFyICpjd2QsIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgY2hhciAqKmNkcGF0aHAsCQkvKiAmIG9mIDogc2VwYXJhdGVkIGxpc3QgKi8KKyAgICBYU3RyaW5nICp4c3AsCisgICAgaW50ICpwaHlzX3BhdGhwKQoreworCWludCBydmFsID0gMDsKKwlib29sIHVzZV9jZHBhdGggPSB0cnVlOworCWNoYXIgKnBsaXN0OworCWludCBsZW4sIHBsZW4gPSAwOworCWNoYXIgKnhwID0gWHN0cmluZygqeHNwLCB4cCk7CisKKwlpZiAoIWZpbGUpCisJCWZpbGUgPSBudWxsOworCisJaWYgKGZpbGVbMF0gPT0gJy8nKSB7CisJCSpwaHlzX3BhdGhwID0gMDsKKwkJdXNlX2NkcGF0aCA9IGZhbHNlOworCX0gZWxzZSB7CisJCWlmIChmaWxlWzBdID09ICcuJykgeworCQkJY2hhciBjID0gZmlsZVsxXTsKKworCQkJaWYgKGMgPT0gJy4nKQorCQkJCWMgPSBmaWxlWzJdOworCQkJaWYgKGMgPT0gJy8nIHx8IGMgPT0gJ1wwJykKKwkJCQl1c2VfY2RwYXRoID0gZmFsc2U7CisJCX0KKworCQlwbGlzdCA9ICpjZHBhdGhwOworCQlpZiAoIXBsaXN0KQorCQkJdXNlX2NkcGF0aCA9IGZhbHNlOworCQllbHNlIGlmICh1c2VfY2RwYXRoKSB7CisJCQljaGFyICpwZW5kOworCisJCQlmb3IgKHBlbmQgPSBwbGlzdDsgKnBlbmQgJiYgKnBlbmQgIT0gJzonOyBwZW5kKyspCisJCQkJOworCQkJcGxlbiA9IHBlbmQgLSBwbGlzdDsKKwkJCSpjZHBhdGhwID0gKnBlbmQgPyBwZW5kICsgMSA6IE5VTEw7CisJCX0KKworCQlpZiAoKCF1c2VfY2RwYXRoIHx8ICFwbGVuIHx8IHBsaXN0WzBdICE9ICcvJykgJiYKKwkJICAgIChjd2QgJiYgKmN3ZCkpIHsKKwkJCWxlbiA9IHN0cmxlbihjd2QpOworCQkJWGNoZWNrTigqeHNwLCB4cCwgbGVuKTsKKwkJCW1lbWNweSh4cCwgY3dkLCBsZW4pOworCQkJeHAgKz0gbGVuOworCQkJaWYgKGN3ZFtsZW4gLSAxXSAhPSAnLycpCisJCQkJWHB1dCgqeHNwLCB4cCwgJy8nKTsKKwkJfQorCQkqcGh5c19wYXRocCA9IFhsZW5ndGgoKnhzcCwgeHApOworCQlpZiAodXNlX2NkcGF0aCAmJiBwbGVuKSB7CisJCQlYY2hlY2tOKCp4c3AsIHhwLCBwbGVuKTsKKwkJCW1lbWNweSh4cCwgcGxpc3QsIHBsZW4pOworCQkJeHAgKz0gcGxlbjsKKwkJCWlmIChwbGlzdFtwbGVuIC0gMV0gIT0gJy8nKQorCQkJCVhwdXQoKnhzcCwgeHAsICcvJyk7CisJCQlydmFsID0gMTsKKwkJfQorCX0KKworCWxlbiA9IHN0cmxlbihmaWxlKSArIDE7CisJWGNoZWNrTigqeHNwLCB4cCwgbGVuKTsKKwltZW1jcHkoeHAsIGZpbGUsIGxlbik7CisKKwlpZiAoIXVzZV9jZHBhdGgpCisJCSpjZHBhdGhwID0gTlVMTDsKKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qCisgKiBTaW1wbGlmeSBwYXRobmFtZXMgY29udGFpbmluZyAiLiIgYW5kICIuLiIgZW50cmllcy4KKyAqIGllLCBzaW1wbGlmeV9wYXRoKCIvYS9iL2MvLi8uLi9kLy4uIikgcmV0dXJucyAiL2EvYiIKKyAqLwordm9pZAorc2ltcGxpZnlfcGF0aChjaGFyICpwYXRobCkKK3sKKwljaGFyICpjdXIsICp0OworCWJvb2wgaXNyb290ZWQ7CisJY2hhciAqdmVyeV9zdGFydCA9IHBhdGhsLCAqc3RhcnQ7CisKKwlpZiAoISpwYXRobCkKKwkJcmV0dXJuOworCisJaWYgKChpc3Jvb3RlZCA9IHBhdGhsWzBdID09ICcvJykpCisJCXZlcnlfc3RhcnQrKzsKKworCS8qIEJlZm9yZQkJCUFmdGVyCisJICogL2Zvby8JCQkvZm9vCisJICogL2Zvby8uLi8uLi9iYXIJCS9iYXIKKwkgKiAvZm9vLy4vYmxhaC8uLgkJL2ZvbworCSAqIC4JCQkJLgorCSAqIC4uCQkJCS4uCisJICogLi9mb28JCQlmb28KKwkgKiBmb28vLi4vLi4vLi4vYmFyCQkuLi8uLi9iYXIKKwkgKi8KKworCWZvciAoY3VyID0gdCA9IHN0YXJ0ID0gdmVyeV9zdGFydDsgOyApIHsKKwkJLyogdHJlYXQgbXVsdGlwbGUgJy8ncyBhcyBvbmUgJy8nICovCisJCXdoaWxlICgqdCA9PSAnLycpCisJCQl0Kys7CisKKwkJaWYgKCp0ID09ICdcMCcpIHsKKwkJCWlmIChjdXIgPT0gcGF0aGwpCisJCQkJLyogY29udmVydCBlbXB0eSBwYXRoIHRvIGRvdCAqLworCQkJCSpjdXIrKyA9ICcuJzsKKwkJCSpjdXIgPSAnXDAnOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodFswXSA9PSAnLicpIHsKKwkJCWlmICghdFsxXSB8fCB0WzFdID09ICcvJykgeworCQkJCXQgKz0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAodFsxXSA9PSAnLicgJiYgKCF0WzJdIHx8IHRbMl0gPT0gJy8nKSkgeworCQkJCWlmICghaXNyb290ZWQgJiYgY3VyID09IHN0YXJ0KSB7CisJCQkJCWlmIChjdXIgIT0gdmVyeV9zdGFydCkKKwkJCQkJCSpjdXIrKyA9ICcvJzsKKwkJCQkJKmN1cisrID0gJy4nOworCQkJCQkqY3VyKysgPSAnLic7CisJCQkJCXN0YXJ0ID0gY3VyOworCQkJCX0gZWxzZSBpZiAoY3VyICE9IHN0YXJ0KQorCQkJCQl3aGlsZSAoLS1jdXIgPiBzdGFydCAmJiAqY3VyICE9ICcvJykKKwkJCQkJCTsKKwkJCQl0ICs9IDI7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlpZiAoY3VyICE9IHZlcnlfc3RhcnQpCisJCQkqY3VyKysgPSAnLyc7CisKKwkJLyogZmluZC9jb3B5IG5leHQgY29tcG9uZW50IG9mIHBhdGhuYW1lICovCisJCXdoaWxlICgqdCAmJiAqdCAhPSAnLycpCisJCQkqY3VyKysgPSAqdCsrOworCX0KK30KKworCit2b2lkCitzZXRfY3VycmVudF93ZChjaGFyICpwYXRobCkKK3sKKwlzaXplX3QgbGVuID0gMTsKKwljaGFyICpwID0gcGF0aGw7CisKKwlpZiAocCA9PSBOVUxMKSB7CisJCWlmICgocCA9IGtzaF9nZXRfd2QoJmxlbikpID09IE5VTEwpCisJCQlwID0gbnVsbDsKKwl9IGVsc2UKKwkJbGVuID0gc3RybGVuKHApICsgMTsKKworCWlmIChsZW4gPiBjdXJyZW50X3dkX3NpemUpIHsKKwkJYWZyZWUoY3VycmVudF93ZCwgQVBFUk0pOworCQljdXJyZW50X3dkID0gYWxsb2MoY3VycmVudF93ZF9zaXplID0gbGVuLCBBUEVSTSk7CisJfQorCW1lbWNweShjdXJyZW50X3dkLCBwLCBsZW4pOworCWlmIChwICE9IHBhdGhsICYmIHAgIT0gbnVsbCkKKwkJYWZyZWUocCwgQVRFTVApOworfQorCisjaWZkZWYgVElPQ1NDVFRZCitleHRlcm4gdm9pZCBjaHZ0X3JlaW5pdCh2b2lkKTsKKworc3RhdGljIHZvaWQKK2NodnQoY29uc3QgY2hhciAqZm4pCit7CisJY2hhciBkdlsyMF07CisJc3RydWN0IHN0YXQgc2I7CisJaW50IGZkOworCisJLyogZm9yIGVudHJvcHkgKi8KKwlrc2hzdGF0ZV9mLmggPSBldmlsaGFzaChmbik7CisKKwlpZiAoKmZuID09ICctJykgeworCQltZW1jcHkoZHYsICItL2Rldi9udWxsIiwgc2l6ZW9mKCItL2Rldi9udWxsIikpOworCQlmbiA9IGR2ICsgMTsKKwl9IGVsc2UgeworCQlpZiAoc3RhdChmbiwgJnNiKSkgeworCQkJbWVtY3B5KGR2LCAiL2Rldi90dHlDIiwgOSk7CisJCQlzdHJsY3B5KGR2ICsgOSwgZm4sIHNpemVvZihkdikgLSA5KTsKKwkJCWlmIChzdGF0KGR2LCAmc2IpKSB7CisJCQkJc3RybGNweShkdiArIDgsIGZuLCBzaXplb2YoZHYpIC0gOCk7CisJCQkJaWYgKHN0YXQoZHYsICZzYikpCisJCQkJCWVycm9yZigiY2h2dDogY2FuJ3QgZmluZCB0dHkgJXMiLCBmbik7CisJCQl9CisJCQlmbiA9IGR2OworCQl9CisJCWlmICghKHNiLnN0X21vZGUgJiBTX0lGQ0hSKSkKKwkJCWVycm9yZigiY2h2dDogbm90IGEgY2hhciBkZXZpY2U6ICVzIiwgZm4pOworCQlpZiAoKHNiLnN0X3VpZCAhPSAwKSAmJiBjaG93bihmbiwgMCwgMCkpCisJCQl3YXJuaW5nZihmYWxzZSwgImNodnQ6IGNhbm5vdCBjaG93biByb290ICVzIiwgZm4pOworCQlpZiAoKChzYi5zdF9tb2RlICYgMDc3NzcpICE9IDA2MDApICYmIGNobW9kKGZuLCAobW9kZV90KTA2MDApKQorCQkJd2FybmluZ2YoZmFsc2UsICJjaHZ0OiBjYW5ub3QgY2htb2QgMDYwMCAlcyIsIGZuKTsKKyNpZiBIQVZFX1JFVk9LRQorCQlpZiAocmV2b2tlKGZuKSkKKyNlbmRpZgorCQkJd2FybmluZ2YoZmFsc2UsICJjaHZ0OiBjYW5ub3QgcmV2b2tlICVzLCBuZXcgc2hlbGwgaXMiCisJCQkgICAgIiBwb3RlbnRpYWxseSBpbnNlY3VyZSIsIGZuKTsKKwl9CisJaWYgKChmZCA9IG9wZW4oZm4sIE9fUkRXUikpID09IC0xKSB7CisJCXNsZWVwKDEpOworCQlpZiAoKGZkID0gb3BlbihmbiwgT19SRFdSKSkgPT0gLTEpCisJCQllcnJvcmYoImNodnQ6IGNhbm5vdCBvcGVuICVzIiwgZm4pOworCX0KKwlzd2l0Y2ggKGZvcmsoKSkgeworCWNhc2UgLTE6CisJCWVycm9yZigiY2h2dDogJXMgZmFpbGVkIiwgImZvcmsiKTsKKwljYXNlIDA6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWV4aXQoMCk7CisJfQorCWlmIChzZXRzaWQoKSA9PSAtMSkKKwkJZXJyb3JmKCJjaHZ0OiAlcyBmYWlsZWQiLCAic2V0c2lkIik7CisJaWYgKGZuICE9IGR2ICsgMSkgeworCQlpZiAoaW9jdGwoZmQsIFRJT0NTQ1RUWSwgTlVMTCkgPT0gLTEpCisJCQllcnJvcmYoImNodnQ6ICVzIGZhaWxlZCIsICJUSU9DU0NUVFkiKTsKKwkJaWYgKHRjZmx1c2goZmQsIFRDSU9GTFVTSCkpCisJCQllcnJvcmYoImNodnQ6ICVzIGZhaWxlZCIsICJUQ0lPRkxVU0giKTsKKwl9CisJa3NoX2R1cDIoZmQsIDAsIGZhbHNlKTsKKwlrc2hfZHVwMihmZCwgMSwgZmFsc2UpOworCWtzaF9kdXAyKGZkLCAyLCBmYWxzZSk7CisJaWYgKGZkID4gMikKKwkJY2xvc2UoZmQpOworCWNodnRfcmVpbml0KCk7Cit9CisjZW5kaWYKKworI2lmZGVmIERFQlVHCitjaGFyIGxvbmdzaXplc19hcmVfb2theVtzaXplb2YobG9uZykgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID8gMSA6IC0xXTsKK2NoYXIgYXJpc2l6ZV9pc19va2F5W3NpemVvZihta3NoX2FyaV90KSA9PSA0ID8gMSA6IC0xXTsKK2NoYXIgdWFyaXNpemVfaXNfb2theVtzaXplb2YobWtzaF91YXJpX3QpID09IDQgPyAxIDogLTFdOworCitjaGFyICoKK3N0cmNocihjaGFyICpwLCBpbnQgY2gpCit7CisJZm9yICg7OyArK3ApIHsKKwkJaWYgKCpwID09IGNoKQorCQkJcmV0dXJuIChwKTsKKwkJaWYgKCEqcCkKKwkJCXJldHVybiAoTlVMTCk7CisJfQorCS8qIE5PVFJFQUNIRUQgKi8KK30KKworY2hhciAqCitzdHJzdHIoY2hhciAqYiwgY29uc3QgY2hhciAqbCkKK3sKKwljaGFyIGZpcnN0LCBjOworCXNpemVfdCBuOworCisJaWYgKChmaXJzdCA9ICpsKyspID09ICdcMCcpCisJCXJldHVybiAoYik7CisJbiA9IHN0cmxlbihsKTsKKyBzdHJzdHJfbG9vazoKKwl3aGlsZSAoKGMgPSAqYisrKSAhPSBmaXJzdCkKKwkJaWYgKGMgPT0gJ1wwJykKKwkJCXJldHVybiAoTlVMTCk7CisJaWYgKHN0cm5jbXAoYiwgbCwgbikpCisJCWdvdG8gc3Ryc3RyX2xvb2s7CisJcmV0dXJuIChiIC0gMSk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBNS1NIX0FTU1VNRV9VVEY4CisjaWYgIUhBVkVfU1RSQ0FTRVNUUgorY29uc3QgY2hhciAqCitzdHJpc3RyKGNvbnN0IGNoYXIgKmIsIGNvbnN0IGNoYXIgKmwpCit7CisJY2hhciBmaXJzdCwgYzsKKwlzaXplX3QgbjsKKworCWlmICgoZmlyc3QgPSAqbCsrKSwgKChmaXJzdCA9IGtzaF90b2xvd2VyKGZpcnN0KSkgPT0gJ1wwJykpCisJCXJldHVybiAoYik7CisJbiA9IHN0cmxlbihsKTsKKyBzdHJpc3RyX2xvb2s6CisJd2hpbGUgKChjID0gKmIrKyksICgoYyA9IGtzaF90b2xvd2VyKGMpKSAhPSBmaXJzdCkpCisJCWlmIChjID09ICdcMCcpCisJCQlyZXR1cm4gKE5VTEwpOworCWlmIChzdHJuY2FzZWNtcChiLCBsLCBuKSkKKwkJZ290byBzdHJpc3RyX2xvb2s7CisJcmV0dXJuIChiIC0gMSk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgTUtTSF9TTUFMTAorY2hhciAqCitzdHJuZHVwXyhjb25zdCBjaGFyICpzcmMsIHNpemVfdCBsZW4sIEFyZWEgKmFwKQoreworCWNoYXIgKmRzdCA9IE5VTEw7CisKKwlpZiAoc3JjICE9IE5VTEwpIHsKKwkJZHN0ID0gYWxsb2MobGVuICsgMSwgYXApOworCQltZW1jcHkoZHN0LCBzcmMsIGxlbik7CisJCWRzdFtsZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIChkc3QpOworfQorCitjaGFyICoKK3N0cmR1cF8oY29uc3QgY2hhciAqc3JjLCBBcmVhICphcCkKK3sKKwlyZXR1cm4gKHNyYyA9PSBOVUxMID8gTlVMTCA6IHN0cm5kdXBfKHNyYywgc3RybGVuKHNyYyksIGFwKSk7Cit9CisjZW5kaWYKKworI2lmICFIQVZFX0dFVFJVU0FHRQorI2RlZmluZSBJTlZUQ0socix0KQlkbyB7CQkJCQkJXAorCXIudHZfdXNlYyA9ICgodCkgJSAoMTAwMDAwMCAvIENMS19UQ0spKSAqICgxMDAwMDAwIC8gQ0xLX1RDSyk7CVwKKwlyLnR2X3NlYyA9ICh0KSAvIENMS19UQ0s7CQkJCQlcCit9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKworaW50CitnZXRydXNhZ2UoaW50IHdoYXQsIHN0cnVjdCBydXNhZ2UgKnJ1KQoreworCXN0cnVjdCB0bXMgdG1zOworCWNsb2NrX3QgdSwgczsKKworCWlmICgvKiBydSA9PSBOVUxMIHx8ICovIHRpbWVzKCZ0bXMpID09IChjbG9ja190KS0xKQorCQlyZXR1cm4gKC0xKTsKKworCXN3aXRjaCAod2hhdCkgeworCWNhc2UgUlVTQUdFX1NFTEY6CisJCXUgPSB0bXMudG1zX3V0aW1lOworCQlzID0gdG1zLnRtc19zdGltZTsKKwkJYnJlYWs7CisJY2FzZSBSVVNBR0VfQ0hJTERSRU46CisJCXUgPSB0bXMudG1zX2N1dGltZTsKKwkJcyA9IHRtcy50bXNfY3N0aW1lOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuICgtMSk7CisJfQorCUlOVlRDSyhydS0+cnVfdXRpbWUsIHUpOworCUlOVlRDSyhydS0+cnVfc3RpbWUsIHMpOworCXJldHVybiAoMCk7Cit9CisjZW5kaWYKKworLyoKKyAqIHByb2Nlc3MgdGhlIHN0cmluZyBhdmFpbGFibGUgdmlhIGZnIChnZXQgYSBjaGFyKQorICogYW5kIGZwIChwdXQgYmFjayBhIGNoYXIpIGZvciBiYWNrc2xhc2ggZXNjYXBlcywKKyAqIGFzc3VtaW5nIHRoZSBmaXJzdCBjYWxsIHRvICpmZyBnZXRzIHRoZSBjaGFyIGRpLQorICogcmVjdGx5IGFmdGVyIHRoZSBiYWNrc2xhc2g7IHJldHVybiB0aGUgY2hhcmFjdGVyCisgKiAoMC4uMHhGRiksIFVuaWNvZGUgKHdjICsgMHgxMDApLCBvciAtMSBpZiBubyBrbm93bgorICogZXNjYXBlIHNlcXVlbmNlIHdhcyBmb3VuZAorICovCitpbnQKK3VuYmtzbChib29sIGNzdHlsZSwgaW50ICgqZmcpKHZvaWQpLCB2b2lkICgqZnApKGludCkpCit7CisJaW50IHdjLCBpLCBjLCBmYzsKKworCWZjID0gKCpmZykoKTsKKwlzd2l0Y2ggKGZjKSB7CisJY2FzZSAnYSc6CisJCS8qCisJCSAqIGFjY29yZGluZyB0byB0aGUgY29tbWVudHMgaW4gcGRrc2gsIFwwMDcgc2VlbXMKKwkJICogdG8gYmUgbW9yZSBwb3J0YWJsZSB0aGFuIFxhIChkdWUgdG8gSFAtVVggY2MsCisJCSAqIFVsdHJpeCBjYywgb2xkIHBjYywgZXRjLikgc28gd2UgYXZvaWQgdGhlIGVzY2FwZQorCQkgKiBzZXF1ZW5jZSBhbHRvZ2V0aGVyIGluIG1rc2ggYW5kIGFzc3VtZSBBU0NJSQorCQkgKi8KKwkJd2MgPSA3OworCQlicmVhazsKKwljYXNlICdiJzoKKwkJd2MgPSAnXGInOworCQlicmVhazsKKwljYXNlICdjJzoKKwkJaWYgKCFjc3R5bGUpCisJCQlnb3RvIHVua25vd25fZXNjYXBlOworCQljID0gKCpmZykoKTsKKwkJd2MgPSBDVFJMKGMpOworCQlicmVhazsKKwljYXNlICdFJzoKKwljYXNlICdlJzoKKwkJd2MgPSAwMzM7CisJCWJyZWFrOworCWNhc2UgJ2YnOgorCQl3YyA9ICdcZic7CisJCWJyZWFrOworCWNhc2UgJ24nOgorCQl3YyA9ICdcbic7CisJCWJyZWFrOworCWNhc2UgJ3InOgorCQl3YyA9ICdccic7CisJCWJyZWFrOworCWNhc2UgJ3QnOgorCQl3YyA9ICdcdCc7CisJCWJyZWFrOworCWNhc2UgJ3YnOgorCQkvKiBhc3N1bWUgQVNDSUkgaGVyZSBhcyB3ZWxsICovCisJCXdjID0gMTE7CisJCWJyZWFrOworCWNhc2UgJzEnOgorCWNhc2UgJzInOgorCWNhc2UgJzMnOgorCWNhc2UgJzQnOgorCWNhc2UgJzUnOgorCWNhc2UgJzYnOgorCWNhc2UgJzcnOgorCQlpZiAoIWNzdHlsZSkKKwkJCWdvdG8gdW5rbm93bl9lc2NhcGU7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSAnMCc6CisJCWlmIChjc3R5bGUpCisJCQkoKmZwKShmYyk7CisJCS8qCisJCSAqIGxvb2sgZm9yIGFuIG9jdGFsIG51bWJlciB3aXRoIHVwIHRvIHRocmVlCisJCSAqIGRpZ2l0cywgbm90IGNvdW50aW5nIHRoZSBsZWFkaW5nIHplcm87CisJCSAqIGNvbnZlcnQgaXQgdG8gYSByYXcgb2N0ZXQKKwkJICovCisJCXdjID0gMDsKKwkJaSA9IDM7CisJCXdoaWxlIChpLS0pCisJCQlpZiAoKGMgPSAoKmZnKSgpKSA+PSAnMCcgJiYgYyA8PSAnNycpCisJCQkJd2MgPSAod2MgPDwgMykgKyAoYyAtICcwJyk7CisJCQllbHNlIHsKKwkJCQkoKmZwKShjKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJYnJlYWs7CisJY2FzZSAnVSc6CisJCWkgPSA4OworCQlpZiAoMCkKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlICd1JzoKKwkJaSA9IDQ7CisJCWlmICgwKQorCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgJ3gnOgorCQlpID0gY3N0eWxlID8gLTEgOiAyOworCQkvKgorCQkgKiB4Oglsb29rIGZvciBhIGhleGFkZWNpbWFsIG51bWJlciB3aXRoIHVwIHRvCisJCSAqCXR3byAoQyBzdHlsZTogYXJiaXRyYXJ5KSBkaWdpdHM7IGNvbnZlcnQKKwkJICoJdG8gcmF3IG9jdGV0IChDIHN0eWxlOiBVbmljb2RlIGlmID4weEZGKQorCQkgKiB1L1U6CWxvb2sgZm9yIGEgaGV4YWRlY2ltYWwgbnVtYmVyIHdpdGggdXAgdG8KKwkJICoJZm91ciAoVTogZWlnaHQpIGRpZ2l0czsgY29udmVydCB0byBVbmljb2RlCisJCSAqLworCQl3YyA9IDA7CisJCXdoaWxlIChpLS0pIHsKKwkJCXdjIDw8PSA0OworCQkJaWYgKChjID0gKCpmZykoKSkgPj0gJzAnICYmIGMgPD0gJzknKQorCQkJCXdjICs9IGMgLSAnMCc7CisJCQllbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKwkJCQl3YyArPSBjIC0gJ0EnICsgMTA7CisJCQllbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKwkJCQl3YyArPSBjIC0gJ2EnICsgMTA7CisJCQllbHNlIHsKKwkJCQl3YyA+Pj0gNDsKKwkJCQkoKmZwKShjKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoKGNzdHlsZSAmJiB3YyA+IDB4RkYpIHx8IGZjICE9ICd4JykKKwkJCS8qIFVuaWNvZGUgbWFya2VyICovCisJCQl3YyArPSAweDEwMDsKKwkJYnJlYWs7CisJY2FzZSAnXCcnOgorCQlpZiAoIWNzdHlsZSkKKwkJCWdvdG8gdW5rbm93bl9lc2NhcGU7CisJCXdjID0gJ1wnJzsKKwkJYnJlYWs7CisJY2FzZSAnXFwnOgorCQl3YyA9ICdcXCc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisgdW5rbm93bl9lc2NhcGU6CisJCSgqZnApKGZjKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJcmV0dXJuICh3Yyk7Cit9CmRpZmYgLS1naXQgYS9ta3NoL3NyYy9zaC5oIGIvbWtzaC9zcmMvc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTU4OGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvc2guaApAQCAtMCwwICsxLDE3NTIgQEAKKy8qCSRPcGVuQlNEOiBzaC5oLHYgMS4zMCAyMDEwLzAxLzA0IDE4OjA3OjExIGRlcmFhZHQgRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBzaGYuaCx2IDEuNiAyMDA1LzEyLzExIDE4OjUzOjUxIGRlcmFhZHQgRXhwICQJKi8KKy8qCSRPcGVuQlNEOiB0YWJsZS5oLHYgMS43IDIwMDUvMTIvMTEgMjA6MzE6MjEgb3R0byBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IHRyZWUuaCx2IDEuMTAgMjAwNS8wMy8yOCAyMToyODoyMiBkZXJhYWR0IEV4cCAkCSovCisvKgkkT3BlbkJTRDogZXhwYW5kLmgsdiAxLjYgMjAwNS8wMy8zMCAxNzoxNjozNyBkZXJhYWR0IEV4cCAkCSovCisvKgkkT3BlbkJTRDogbGV4LmgsdiAxLjExIDIwMDYvMDUvMjkgMTg6MjI6MjQgb3R0byBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IHByb3RvLmgsdiAxLjMzIDIwMTAvMDUvMTkgMTc6MzY6MDggamFzcGVyIEV4cCAkCSovCisvKgkkT3BlbkJTRDogY190ZXN0LmgsdiAxLjQgMjAwNC8xMi8yMCAxMTozNDoyNiBvdHRvIEV4cCAkCSovCisvKgkkT3BlbkJTRDogdHR5LmgsdiAxLjUgMjAwNC8xMi8yMCAxMTozNDoyNiBvdHRvIEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaWZkZWYgX19kaWV0bGliY19fCisvKiBYWFggaW1ha2Ugc3R5bGUgKi8KKyNkZWZpbmUgX0JTRF9TT1VSQ0UJLyogbGl2ZSwgQlNELCBsaXZlISAqLworI2VuZGlmCisKKyNpZiBIQVZFX1NZU19QQVJBTV9ICisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2lmIEhBVkVfU1lTX1NZU01BQ1JPU19ICisjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfTUtERVZfSAorI2luY2x1ZGUgPHN5cy9ta2Rldi5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfTU1BTl9ICisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWYgSEFWRV9MSUJHRU5fSAorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2VuZGlmCisjaWYgSEFWRV9MSUJVVElMX0gKKyNpbmNsdWRlIDxsaWJ1dGlsLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZiBIQVZFX1BBVEhTX0gKKyNpbmNsdWRlIDxwYXRocy5oPgorI2VuZGlmCisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaWYgSEFWRV9TVERCT09MX0gKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1VMSU1JVF9ICisjaW5jbHVkZSA8dWxpbWl0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZiBIQVZFX1ZBTFVFU19ICisjaW5jbHVkZSA8dmFsdWVzLmg+CisjZW5kaWYKKworI3VuZGVmIF9fYXR0cmlidXRlX18KKyNpZiBIQVZFX0FUVFJJQlVURV9CT1VOREVECisjZGVmaW5lIE1LU0hfQV9CT1VOREVEKHgseSx6KQlfX2F0dHJpYnV0ZV9fKChib3VuZGVkICh4LCB5LCB6KSkpCisjZWxzZQorI2RlZmluZSBNS1NIX0FfQk9VTkRFRCh4LHkseikJLyogbm90aGluZyAqLworI2VuZGlmCisjaWYgSEFWRV9BVFRSSUJVVEVfRk9STUFUCisjZGVmaW5lIE1LU0hfQV9GT1JNQVQoeCx5LHopCV9fYXR0cmlidXRlX18oKGZvcm1hdCAoeCwgeSwgeikpKQorI2Vsc2UKKyNkZWZpbmUgTUtTSF9BX0ZPUk1BVCh4LHkseikJLyogbm90aGluZyAqLworI2VuZGlmCisjaWYgSEFWRV9BVFRSSUJVVEVfTk9OTlVMTAorI2RlZmluZSBNS1NIX0FfTk9OTlVMTChhKQlfX2F0dHJpYnV0ZV9fKGEpCisjZWxzZQorI2RlZmluZSBNS1NIX0FfTk9OTlVMTChhKQkvKiBub3RoaW5nICovCisjZW5kaWYKKyNpZiBIQVZFX0FUVFJJQlVURV9OT1JFVFVSTgorI2RlZmluZSBNS1NIX0FfTk9SRVRVUk4JCV9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKKyNlbHNlCisjZGVmaW5lIE1LU0hfQV9OT1JFVFVSTgkJLyogbm90aGluZyAqLworI2VuZGlmCisjaWYgSEFWRV9BVFRSSUJVVEVfVU5VU0VECisjZGVmaW5lIE1LU0hfQV9VTlVTRUQJCV9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZWxzZQorI2RlZmluZSBNS1NIX0FfVU5VU0VECQkvKiBub3RoaW5nICovCisjZW5kaWYKKyNpZiBIQVZFX0FUVFJJQlVURV9VU0VECisjZGVmaW5lIE1LU0hfQV9VU0VECQlfX2F0dHJpYnV0ZV9fKCh1c2VkKSkKKyNlbHNlCisjZGVmaW5lIE1LU0hfQV9VU0VECQkvKiBub3RoaW5nICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoTWlyQlNEKSAmJiAoTWlyQlNEID49IDB4MDlBMSkgJiYgXAorICAgIGRlZmluZWQoX19FTEZfXykgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgXAorICAgICFkZWZpbmVkKF9fbGx2bV9fKSAmJiAhZGVmaW5lZChfX05XQ0NfXykKKy8qCisgKiBXZSBnb3QgdXNhYmxlIF9fSURTVFJJTkcgX19DT1BZUklHSFQgX19SQ1NJRCBfX1NDQ1NJRCBtYWNyb3MKKyAqIHdoaWNoIHdvcmsgZm9yIGFsbCBjYXNlczsgbm8gbmVlZCB0byByZWRlZmluZSB0aGVtIHVzaW5nIHRoZQorICogInBvcnRhYmxlIiBtYWNyb3MgZnJvbSBiZWxvdyB3aGVuIHdlIG1pZ2h0IGhhdmUgdGhlICJiZXR0ZXIiCisgKiBnY2MrRUxGIHNwZWNpZmljIG1hY3JvcyBvciBvdGhlciBzeXN0ZW0gZGVwZW5kZW50IG9uZXMuCisgKi8KKyNlbHNlCisjdW5kZWYgX19JRFNUUklORworI3VuZGVmIF9fSURTVFJJTkdfQ09OQ0FUCisjdW5kZWYgX19JRFNUUklOR19FWFBBTkQKKyN1bmRlZiBfX0NPUFlSSUdIVAorI3VuZGVmIF9fUkNTSUQKKyN1bmRlZiBfX1NDQ1NJRAorI2RlZmluZSBfX0lEU1RSSU5HX0NPTkNBVChsLHApCQlfX0xJTlRFRF9fICMjIGwgIyMgXyAjIyBwCisjZGVmaW5lIF9fSURTVFJJTkdfRVhQQU5EKGwscCkJCV9fSURTVFJJTkdfQ09OQ0FUKGwscCkKKyNkZWZpbmUgX19JRFNUUklORyhwcmVmaXgsIHN0cmluZykJCQkJXAorCXN0YXRpYyBjb25zdCBjaGFyIF9fSURTVFJJTkdfRVhQQU5EKF9fTElORV9fLHByZWZpeCkgW10JXAorCSAgICBNS1NIX0FfVVNFRCA9ICJAKCIiIykiICNwcmVmaXggIjogIiBzdHJpbmcKKyNkZWZpbmUgX19DT1BZUklHSFQoeCkJCV9fSURTVFJJTkcoY29weXJpZ2h0LHgpCisjZGVmaW5lIF9fUkNTSUQoeCkJCV9fSURTVFJJTkcocmNzaWQseCkKKyNkZWZpbmUgX19TQ0NTSUQoeCkJCV9fSURTVFJJTkcoc2Njc2lkLHgpCisjZW5kaWYKKworI2lmZGVmIEVYVEVSTgorX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvc2guaCx2IDEuNDA1IDIwMTAvMDgvMjQgMTU6MTk6NTQgdGcgRXhwICQiKTsKKyNlbmRpZgorI2RlZmluZSBNS1NIX1ZFUlNJT04gIlIzOSAyMDEwLzA4LzI0IgorCisjaWZuZGVmIE1LU0hfSU5DTFVERVNfT05MWQorCisvKiBleHRyYSB0eXBlcyAqLworCisjaWYgIUhBVkVfR0VUUlVTQUdFCisjdW5kZWYgcnVzYWdlCisjdW5kZWYgUlVTQUdFX1NFTEYKKyN1bmRlZiBSVVNBR0VfQ0hJTERSRU4KKyNkZWZpbmUgcnVzYWdlIG1rc2hfcnVzYWdlCisjZGVmaW5lIFJVU0FHRV9TRUxGCTAKKyNkZWZpbmUgUlVTQUdFX0NISUxEUkVOCS0xCisKK3N0cnVjdCBydXNhZ2UgeworCXN0cnVjdCB0aW1ldmFsIHJ1X3V0aW1lOworCXN0cnVjdCB0aW1ldmFsIHJ1X3N0aW1lOworfTsKKyNlbmRpZgorCisjaWYgIUhBVkVfUkxJTV9UCit0eXBlZGVmIGxvbmcgcmxpbV90OworI2VuZGlmCisKKyNpZiAhSEFWRV9TSUdfVAorI3VuZGVmIHNpZ190Cit0eXBlZGVmIHZvaWQgKCpzaWdfdCkoaW50KTsKKyNlbmRpZgorCisjaWYgIUhBVkVfU1REQk9PTF9ICisvKiBrbHVkZ2UsIGJ1dCBlbm91Z2ggZm9yIG1rc2ggKi8KK3R5cGVkZWYgaW50IGJvb2w7CisjZGVmaW5lIGZhbHNlIDAKKyNkZWZpbmUgdHJ1ZSAxCisjZW5kaWYKKworI2lmICFIQVZFX0NBTl9JTlRUWVBFUworI2lmICFIQVZFX0NBTl9VQ0JJTlRTCit0eXBlZGVmIHNpZ25lZCBpbnQgaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OworI2Vsc2UKK3R5cGVkZWYgdV9pbnQzMl90IHVpbnQzMl90OworI2VuZGlmCisjZW5kaWYKKworI2lmICFIQVZFX0NBTl9JTlQ4VFlQRQorI2lmICFIQVZFX0NBTl9VQ0JJTlQ4Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKKyNlbHNlCit0eXBlZGVmIHVfaW50OF90IHVpbnQ4X3Q7CisjZW5kaWYKKyNlbmRpZgorCisvKiBleHRyYSBtYWNyb3MgKi8KKworI2lmbmRlZiB0aW1lcmNsZWFyCisjZGVmaW5lIHRpbWVyY2xlYXIodHZwKQkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQkodHZwKS0+dHZfc2VjID0gKHR2cCktPnR2X3VzZWMgPSAwOwkJCVwKKwl9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKyNlbmRpZgorI2lmbmRlZiB0aW1lcmFkZAorI2RlZmluZSB0aW1lcmFkZCh0dnAsIHV2cCwgdnZwKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCSh2dnApLT50dl9zZWMgPSAodHZwKS0+dHZfc2VjICsgKHV2cCktPnR2X3NlYzsJCVwKKwkJKHZ2cCktPnR2X3VzZWMgPSAodHZwKS0+dHZfdXNlYyArICh1dnApLT50dl91c2VjOwlcCisJCWlmICgodnZwKS0+dHZfdXNlYyA+PSAxMDAwMDAwKSB7CQkJXAorCQkJKHZ2cCktPnR2X3NlYysrOwkJCQlcCisJCQkodnZwKS0+dHZfdXNlYyAtPSAxMDAwMDAwOwkJCVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisjZW5kaWYKKyNpZm5kZWYgdGltZXJzdWIKKyNkZWZpbmUgdGltZXJzdWIodHZwLCB1dnAsIHZ2cCkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQkodnZwKS0+dHZfc2VjID0gKHR2cCktPnR2X3NlYyAtICh1dnApLT50dl9zZWM7CQlcCisJCSh2dnApLT50dl91c2VjID0gKHR2cCktPnR2X3VzZWMgLSAodXZwKS0+dHZfdXNlYzsJXAorCQlpZiAoKHZ2cCktPnR2X3VzZWMgPCAwKSB7CQkJCVwKKwkJCSh2dnApLT50dl9zZWMtLTsJCQkJXAorCQkJKHZ2cCktPnR2X3VzZWMgKz0gMTAwMDAwMDsJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorI2VuZGlmCisKKyNkZWZpbmUga3NoX2lzZGlnaXQoYykJKCgoYykgPj0gJzAnKSAmJiAoKGMpIDw9ICc5JykpCisjZGVmaW5lIGtzaF9pc2xvd2VyKGMpCSgoKGMpID49ICdhJykgJiYgKChjKSA8PSAneicpKQorI2RlZmluZSBrc2hfaXN1cHBlcihjKQkoKChjKSA+PSAnQScpICYmICgoYykgPD0gJ1onKSkKKyNkZWZpbmUga3NoX3RvbG93ZXIoYykJKCgoYykgPj0gJ0EnKSAmJiAoKGMpIDw9ICdaJykgPyAoYykgLSAnQScgKyAnYScgOiAoYykpCisjZGVmaW5lIGtzaF90b3VwcGVyKGMpCSgoKGMpID49ICdhJykgJiYgKChjKSA8PSAneicpID8gKGMpIC0gJ2EnICsgJ0EnIDogKGMpKQorI2RlZmluZSBrc2hfaXNkYXNoKHMpCSgoKHMpICE9IE5VTEwpICYmICgocylbMF0gPT0gJy0nKSAmJiAoKHMpWzFdID09ICdcMCcpKQorI2RlZmluZSBrc2hfaXNzcGFjZShjKQkoKCgoYykgPj0gMHgwOSkgJiYgKChjKSA8PSAweDBEKSkgfHwgKChjKSA9PSAweDIwKSkKKworI2lmZGVmIE5PX1BBVEhfTUFYCisjdW5kZWYgUEFUSF9NQVgKKyNlbHNlCisjaWZuZGVmIFBBVEhfTUFYCisjZGVmaW5lIFBBVEhfTUFYCTEwMjQKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNJWkVfTUFYCisjaWZkZWYgU0laRV9UX01BWAorI2RlZmluZSBTSVpFX01BWAlTSVpFX1RfTUFYCisjZWxzZQorI2RlZmluZSBTSVpFX01BWAkoKHNpemVfdCktMSkKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNfSVNMTksKKyNkZWZpbmUgU19JU0xOSyhtKQkoKG0gJiAwMTcwMDAwKSA9PSAwMTIwMDAwKQorI2VuZGlmCisjaWZuZGVmIFNfSVNTT0NLCisjZGVmaW5lIFNfSVNTT0NLKG0pCSgobSAmIDAxNzAwMDApID09IDAxNDAwMDApCisjZW5kaWYKKyNpZm5kZWYgREVGRklMRU1PREUKKyNkZWZpbmUgREVGRklMRU1PREUJKFNfSVJVU1J8U19JV1VTUnxTX0lSR1JQfFNfSVdHUlB8U19JUk9USHxTX0lXT1RIKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChNQVBfRkFJTEVEKQorLyogWFhYIGltYWtlIHN0eWxlICovCisjICBpZiBkZWZpbmVkKF9fbGludXgpCisjZGVmaW5lIE1BUF9GQUlMRUQJKCh2b2lkICopLTEpCisjICBlbGlmIGRlZmluZWQoX19ic2RpX18pIHx8IGRlZmluZWQoX19vc2ZfXykgfHwgZGVmaW5lZChfX3VsdHJpeCkKKyNkZWZpbmUgTUFQX0ZBSUxFRAkoKGNhZGRyX3QpLTEpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgTlNJRworI2lmIGRlZmluZWQoX05TSUcpCisjZGVmaW5lIE5TSUcJCV9OU0lHCisjZWxpZiBkZWZpbmVkKFNJR01BWCkKKyNkZWZpbmUgTlNJRwkJKFNJR01BWCsxKQorI2VuZGlmCisjZW5kaWYKKworI3VuZGVmIEJBRAkJLyogQUlYIGRlZmluZXMgdGhhdCBzb21ld2hlcmUgKi8KKworLyogT1MtZGVwZW5kZW50IGFkZGl0aW9ucyAoZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGJ5IE9TKSAqLworCisjaWYgIUhBVkVfRkxPQ0tfREVDTAorZXh0ZXJuIGludCBmbG9jayhpbnQsIGludCk7CisjZW5kaWYKKworI2lmICFIQVZFX0dFVFJVU0FHRQorZXh0ZXJuIGludCBnZXRydXNhZ2UoaW50LCBzdHJ1Y3QgcnVzYWdlICopOworI2VuZGlmCisKKyNpZiAhSEFWRV9SRVZPS0VfREVDTAorZXh0ZXJuIGludCByZXZva2UoY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisjaWYgIUhBVkVfU0VUTU9ERQorbW9kZV90IGdldG1vZGUoY29uc3Qgdm9pZCAqLCBtb2RlX3QpOwordm9pZCAqc2V0bW9kZShjb25zdCBjaGFyICopOworI2VuZGlmCisKKyNpZmRlZiBfX3VsdHJpeAorLyogWFhYIGltYWtlIHN0eWxlICovCitpbnQgc3RyY2FzZWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKworI2lmICFIQVZFX1NUUkNBU0VTVFIKK2NvbnN0IGNoYXIgKnN0cmlzdHIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworI2VuZGlmCisKKyNpZiAhSEFWRV9TVFJMQ1BZCitzaXplX3Qgc3RybGNweShjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKKyNlbmRpZgorCisjaWYgIUhBVkVfU1lTX1NJR0xJU1RfREVDTAorZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHN5c19zaWdsaXN0W107CisjZW5kaWYKKworI2lmZGVmIF9fSU5URVJJWAorLyogWFhYIGltYWtlIHN0eWxlICovCisjZGVmaW5lIG1ha2VkZXYgbWtkZXYKK2V4dGVybiBpbnQgX19jZGVjbCBzZXRldWlkKHVpZF90KTsKK2V4dGVybiBpbnQgX19jZGVjbCBzZXRlZ2lkKGdpZF90KTsKKyNlbmRpZgorCisvKiByZW1vdmUgcmVkdW5kYW5jZXMgKi8KKworI2lmIGRlZmluZWQoTWlyQlNEKSAmJiAoTWlyQlNEID49IDB4MDhBOCkKKyNkZWZpbmUgTUtTSF9taXJic2Rfd2N3aWR0aAorI2RlZmluZSB1dGZfd2N3aWR0aChpKSB3Y3dpZHRoKChfX1dDSEFSX1RZUEVfXylpKQorZXh0ZXJuIGludCB3Y3dpZHRoKF9fV0NIQVJfVFlQRV9fKTsKKyNlbmRpZgorCisKKy8qIHNvbWUgdXNlZnVsICNkZWZpbmVzICovCisjaWZkZWYgRVhURVJOCisjIGRlZmluZSBJX18oaSkgPSBpCisjZWxzZQorIyBkZWZpbmUgSV9fKGkpCisjIGRlZmluZSBFWFRFUk4gZXh0ZXJuCisjIGRlZmluZSBFWFRFUk5fREVGSU5FRAorI2VuZGlmCisKKyNkZWZpbmUgTkVMRU0oYSkJKHNpemVvZihhKSAvIHNpemVvZigoYSlbMF0pKQorI2RlZmluZSBCSVQoaSkJCSgxIDw8IChpKSkJLyogZGVmaW5lIGJpdCBpbiBmbGFnICovCisKKy8qIFRhYmxlIGZsYWcgdHlwZSAtIG5lZWRzID4gMTYgYW5kIDwgMzIgYml0cyAqLwordHlwZWRlZiBpbnQzMl90IFRmbGFnOworCisvKiBhcml0aG1ldGljcyB0eXBlcyAqLwordHlwZWRlZiBpbnQzMl90IG1rc2hfYXJpX3Q7Cit0eXBlZGVmIHVpbnQzMl90IG1rc2hfdWFyaV90OworCisvKiB0aGVzZSBzaGFsbCBiZSBzbWFsbGVyIHRoYW4gMTAwICovCisjaWZkZWYgTUtTSF9DT05TRVJWQVRJVkVfRkRTCisjZGVmaW5lIE5VRklMRQkJMzIJLyogTnVtYmVyIG9mIHVzZXItYWNjZXNzaWJsZSBmaWxlcyAqLworI2RlZmluZSBGREJBU0UJCTEwCS8qIEZpcnN0IGZpbGUgdXNhYmxlIGJ5IFNoZWxsICovCisjZWxzZQorI2RlZmluZSBOVUZJTEUJCTU2CS8qIE51bWJlciBvZiB1c2VyLWFjY2Vzc2libGUgZmlsZXMgKi8KKyNkZWZpbmUgRkRCQVNFCQkyNAkvKiBGaXJzdCBmaWxlIHVzYWJsZSBieSBTaGVsbCAqLworI2VuZGlmCisKKy8qIE1ha2UgTUFHSUMgYSBjaGFyIHRoYXQgbWlnaHQgYmUgcHJpbnRlZCB0byBtYWtlIGJ1Z3MgbW9yZSBvYnZpb3VzLCBidXQKKyAqIG5vdCBhIGNoYXIgdGhhdCBpcyB1c2VkIG9mdGVuLiBBbHNvLCBjYW4ndCB1c2UgdGhlIGhpZ2ggYml0IGFzIGl0IGNhdXNlcworICogcG9ydGFiaWxpdHkgcHJvYmxlbXMgKGNhbGxpbmcgc3RyY2hyKHgsIDB4ODB8J3gnKSBpcyBlcnJvciBwcm9uZSkuCisgKi8KKyNkZWZpbmUgTUFHSUMJCSg3KQkvKiBwcmVmaXggZm9yICo/WyF7LH0gZHVyaW5nIGV4cGFuZCAqLworI2RlZmluZSBJU01BR0lDKGMpCSgodW5zaWduZWQgY2hhcikoYykgPT0gTUFHSUMpCisjZGVmaW5lIE5PVAkJJyEnCS8qIG1pZ2h0IHVzZSBeIChpZSwgWyEuLi5dIHZzIFteLi5dKSAqLworCisjZGVmaW5lIExJTkUJCTQwOTYJLyogaW5wdXQgbGluZSBzaXplICovCisKK0VYVEVSTiBjb25zdCBjaGFyICpzYWZlX3Byb21wdDsgLyogc2FmZSBwcm9tcHQgaWYgUFMxIHN1YnN0aXR1dGlvbiBmYWlscyAqLworRVhURVJOIGNvbnN0IGNoYXIgaW5pdHZzbltdIElfXygiS1NIX1ZFUlNJT049QCgjKU1JUkJTRCBLU0ggIiBNS1NIX1ZFUlNJT04pOworI2RlZmluZSBLU0hfVkVSU0lPTgkoaW5pdHZzbiArIC8qICJLU0hfVkVSU0lPTj1AKCMpIiAqLyAxNikKKworRVhURVJOIGNvbnN0IGNoYXIgZGlnaXRzX3VjW10gSV9fKCIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiKTsKK0VYVEVSTiBjb25zdCBjaGFyIGRpZ2l0c19sY1tdIElfXygiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Iik7CisKKy8qCisgKiBFdmlsIGhhY2sgZm9yIGNvbnN0IGNvcnJlY3RuZXNzIGR1ZSB0byBBUEkgYnJva2VubmVzcworICovCit1bmlvbiBta3NoX2NjaGFjayB7CisJY2hhciAqcnc7CisJY29uc3QgY2hhciAqcm87Cit9OwordW5pb24gbWtzaF9jY3BoYWNrIHsKKwljaGFyICoqcnc7CisJY29uc3QgY2hhciAqKnJvOworfTsKKworLyogZm9yIGNvbnN0IGRlYnVnZ2luZyAqLworI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fSUNDKSAmJiBcCisgICAgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgIWRlZmluZWQoX19TVU5QUk9fQykKK2NoYXIgKnVjc3RyY2hyKGNoYXIgKiwgaW50KTsKK2NoYXIgKnVjc3Ryc3RyKGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyN1bmRlZiBzdHJjaHIKKyNkZWZpbmUgc3RyY2hyIHVjc3RyY2hyCisjZGVmaW5lIHN0cnN0ciB1Y3N0cnN0cgorI2RlZmluZSBjc3RyY2hyKHMsYykgKHsJCQlcCisJdW5pb24gbWtzaF9jY2hhY2sgaW4sIG91dDsJXAorCQkJCQlcCisJaW4ucm8gPSAocyk7CQkJXAorCW91dC5ydyA9IHVjc3RyY2hyKGluLnJ3LCAoYykpOwlcCisJKG91dC5ybyk7CQkJXAorfSkKKyNkZWZpbmUgY3N0cnN0cihiLGwpICh7CQkJXAorCXVuaW9uIG1rc2hfY2NoYWNrIGluLCBvdXQ7CVwKKwkJCQkJXAorCWluLnJvID0gKGIpOwkJCVwKKwlvdXQucncgPSB1Y3N0cnN0cihpbi5ydywgKGwpKTsJXAorCShvdXQucm8pOwkJCVwKK30pCisjZGVmaW5lIHZzdHJjaHIocyxjKQkoY3N0cmNocigocyksIChjKSkgIT0gTlVMTCkKKyNkZWZpbmUgdnN0cnN0cihiLGwpCShjc3Ryc3RyKChiKSwgKGwpKSAhPSBOVUxMKQorI2RlZmluZSBta3NzZXJ0KGUpCSgoZSkgPyAodm9pZCkwIDogZXhpdCgyNTUpKQorI2Vsc2UgLyogIURFQlVHLCAhZ2NjICovCisjZGVmaW5lIGNzdHJjaHIocyxjKQkoKGNvbnN0IGNoYXIgKilzdHJjaHIoKHMpLCAoYykpKQorI2RlZmluZSBjc3Ryc3RyKHMsYykJKChjb25zdCBjaGFyICopc3Ryc3RyKChzKSwgKGMpKSkKKyNkZWZpbmUgdnN0cmNocihzLGMpCShzdHJjaHIoKHMpLCAoYykpICE9IE5VTEwpCisjZGVmaW5lIHZzdHJzdHIoYixsKQkoc3Ryc3RyKChiKSwgKGwpKSAhPSBOVUxMKQorI2RlZmluZSBta3NzZXJ0KGUpCSgodm9pZCkwKQorI2VuZGlmCisKKy8qIHVzZSB0aGlzIGlwdiBzdHJjaHIocywgMCkgYnV0IG5vIHNpZGUgZWZmZWN0cyBpbiBzISAqLworI2RlZmluZSBzdHJudWwocykJKChzKSArIHN0cmxlbihzKSkKKworI2RlZmluZSB1dGZfcHRyYWRqeChzcmMsIGRzdCkgZG8gewkJCQkJXAorCShkc3QpID0gKHNyYykgKyB1dGZfcHRyYWRqKHNyYyk7CQkJCVwKK30gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorCisjaWZkZWYgTUtTSF9TTUFMTAorI2RlZmluZSBzdHJkdXB4KGQsIHMsIGFwKSBkbyB7IFwKKwkoZCkgPSBzdHJkdXBfKChzKSwgKGFwKSk7IFwKK30gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorI2RlZmluZSBzdHJuZHVweChkLCBzLCBuLCBhcCkgZG8geyBcCisJKGQpID0gc3RybmR1cF8oKHMpLCAobiksIChhcCkpOyBcCit9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKyNlbHNlCisvKiBiZSBjYXJlZnVsIHRvIGV2YWx1YXRlIGFyZ3VtZW50cyBvbmx5IG9uY2UhICovCisjZGVmaW5lIHN0cmR1cHgoZCwgcywgYXApIGRvIHsJCQkJCQlcCisJY29uc3QgY2hhciAqc3RyZHVwX3NyYyA9IChzKTsJCQkJCVwKKwljaGFyICpzdHJkdXBfZHN0ID0gTlVMTDsJCQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAoc3RyZHVwX3NyYyAhPSBOVUxMKSB7CQkJCQlcCisJCXNpemVfdCBzdHJkdXBfbGVuID0gc3RybGVuKHN0cmR1cF9zcmMpICsgMTsJCVwKKwkJc3RyZHVwX2RzdCA9IGFsbG9jKHN0cmR1cF9sZW4sIChhcCkpOwkJCVwKKwkJbWVtY3B5KHN0cmR1cF9kc3QsIHN0cmR1cF9zcmMsIHN0cmR1cF9sZW4pOwkJXAorCX0JCQkJCQkJCVwKKwkoZCkgPSBzdHJkdXBfZHN0OwkJCQkJCVwKK30gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorI2RlZmluZSBzdHJuZHVweChkLCBzLCBuLCBhcCkgZG8gewkJCQkJXAorCWNvbnN0IGNoYXIgKnN0cmR1cF9zcmMgPSAocyk7CQkJCQlcCisJY2hhciAqc3RyZHVwX2RzdCA9IE5VTEw7CQkJCQlcCisJCQkJCQkJCQlcCisJaWYgKHN0cmR1cF9zcmMgIT0gTlVMTCkgewkJCQkJXAorCQlzaXplX3Qgc3RybmR1cF9sZW4gPSAobik7CQkJCVwKKwkJc3RyZHVwX2RzdCA9IGFsbG9jKHN0cm5kdXBfbGVuICsgMSwgKGFwKSk7CQlcCisJCW1lbWNweShzdHJkdXBfZHN0LCBzdHJkdXBfc3JjLCBzdHJuZHVwX2xlbik7CQlcCisJCXN0cmR1cF9kc3Rbc3RybmR1cF9sZW5dID0gJ1wwJzsJCQkJXAorCX0JCQkJCQkJCVwKKwkoZCkgPSBzdHJkdXBfZHN0OwkJCQkJCVwKK30gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorI2VuZGlmCisKKyNpZiBIQVZFX1NUUkNBU0VTVFIKKyNkZWZpbmUgc3RyaXN0cihiLGwpCSgoY29uc3QgY2hhciAqKXN0cmNhc2VzdHIoKGIpLCAobCkpKQorI2VuZGlmCisKKyNpZmRlZiBNS1NIX1NNQUxMCisjaWZuZGVmIE1LU0hfQ09OU0VSVkFUSVZFX0ZEUworI2RlZmluZSBNS1NIX0NPTlNFUlZBVElWRV9GRFMJLyogZGVmaW5lZCAqLworI2VuZGlmCisjaWZuZGVmIE1LU0hfTk9QV05BTQorI2RlZmluZSBNS1NIX05PUFdOQU0JCS8qIGRlZmluZWQgKi8KKyNlbmRpZgorI2lmbmRlZiBNS1NIX1NfTk9WSQorI2RlZmluZSBNS1NIX1NfTk9WSQkJMQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBNS1NIX1NfTk9WSQorI2RlZmluZSBNS1NIX1NfTk9WSQkJMAorI2VuZGlmCisKKy8qCisgKiBzaW1wbGUgZ3JvdXBpbmcgYWxsb2NhdG9yCisgKi8KKworLyogMS4gaW50ZXJuYWwgc3RydWN0dXJlICovCitzdHJ1Y3QgbGFsbG9jIHsKKwlzdHJ1Y3QgbGFsbG9jICpuZXh0OworfTsKKworLyogMi4gc2l6ZXMgKi8KKyNkZWZpbmUgQUxMT0NfSVRFTQlzdHJ1Y3QgbGFsbG9jCisjZGVmaW5lIEFMTE9DX1NJWkUJKHNpemVvZihBTExPQ19JVEVNKSkKKworLyogMy4gZ3JvdXAgc3RydWN0dXJlIChvbmx5IHRoZSBzYW1lIGZvciBsYWxsb2MuYykgKi8KK3R5cGVkZWYgc3RydWN0IGxhbGxvYyBBcmVhOworCisKK0VYVEVSTiBBcmVhIGFwZXJtOwkJLyogcGVybWFuZW50IG9iamVjdCBzcGFjZSAqLworI2RlZmluZSBBUEVSTQkmYXBlcm0KKyNkZWZpbmUgQVRFTVAJJmUtPmFyZWEKKworLyoKKyAqIGZsYWdzICh0aGUgb3JkZXIgb2YgdGhlc2UgZW51bXMgTVVTVCBtYXRjaCB0aGUgb3JkZXIgaW4gbWlzYy5jKG9wdGlvbnNbXSkpCisgKi8KK2VudW0gc2hfZmxhZyB7CisjZGVmaW5lIFNIRkxBR1NfRU5VTVMKKyNpbmNsdWRlICJzaF9mbGFncy5oIgorCUZORkxBR1MJCS8qIChwbGFjZSBob2xkZXI6IGhvdyBtYW55IGZsYWdzIGFyZSB0aGVyZSkgKi8KK307CisKKyNkZWZpbmUgRmxhZyhmKQkoa3Noc3RhdGVfdi5zaGVsbF9mbGFnc19bKGludCkoZildKQorI2RlZmluZSBVVEZNT0RFCUZsYWcoRlVOSUNPREUpCisKKy8qCisgKiBwYXJzaW5nICYgZXhlY3V0aW9uIGVudmlyb25tZW50CisgKi8KK2V4dGVybiBzdHJ1Y3QgZW52IHsKKwlBTExPQ19JVEVNIF9fYWxsb2NfaTsJLyogaW50ZXJuYWwsIGRvIG5vdCB0b3VjaCAqLworCUFyZWEgYXJlYTsJCS8qIHRlbXBvcmFyeSBhbGxvY2F0aW9uIGFyZWEgKi8KKwlzdHJ1Y3QgZW52ICpvZW52OwkvKiBsaW5rIHRvIHByZXZpb3VzIGVudmlyb25tZW50ICovCisJc3RydWN0IGJsb2NrICpsb2M7CS8qIGxvY2FsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zICovCisJc2hvcnQgKnNhdmVmZDsJCS8qIG9yaWdpbmFsIHJlZGlyZWN0ZWQgZmRzICovCisJc3RydWN0IHRlbXAgKnRlbXBzOwkvKiB0ZW1wIGZpbGVzICovCisJc2lnam1wX2J1ZiBqYnVmOwkvKiBsb25nIGp1bXAgYmFjayB0byBlbnYgY3JlYXRvciAqLworCXNob3J0IHR5cGU7CQkvKiBlbnZpcm9ubWVudCB0eXBlIC0gc2VlIGJlbG93ICovCisJc2hvcnQgZmxhZ3M7CQkvKiBFRl8qICovCit9ICplOworCisvKiBzdHJ1Y3QgZW52LnR5cGUgdmFsdWVzICovCisjZGVmaW5lIEVfTk9ORQkwCS8qIGR1bW15IGVudmlyb25tZW50ICovCisjZGVmaW5lIEVfUEFSU0UJMQkvKiBwYXJzaW5nIGNvbW1hbmQgIyAqLworI2RlZmluZSBFX0ZVTkMJMgkvKiBleGVjdXRpbmcgZnVuY3Rpb24gIyAqLworI2RlZmluZSBFX0lOQ0wJMwkvKiBpbmNsdWRpbmcgYSBmaWxlIHZpYSAuICMgKi8KKyNkZWZpbmUgRV9FWEVDCTQJLyogZXhlY3V0aW5nIGNvbW1hbmQgdHJlZSAqLworI2RlZmluZSBFX0xPT1AJNQkvKiBleGVjdXRpbmcgZm9yL3doaWxlICMgKi8KKyNkZWZpbmUgRV9FUlJICTYJLyogZ2VuZXJhbCBlcnJvciBoYW5kbGVyICMgKi8KKy8qICMgaW5kaWNhdGVzIGVudiBoYXMgdmFsaWQgamJ1ZiAoc2VlIHVud2luZCgpKSAqLworCisvKiBzdHJ1Y3QgZW52LmZsYWcgdmFsdWVzICovCisjZGVmaW5lIEVGX0ZVTkNfUEFSU0UJQklUKDApCS8qIGZ1bmN0aW9uIGJlaW5nIHBhcnNlZCAqLworI2RlZmluZSBFRl9CUktDT05UX1BBU1MJQklUKDEpCS8qIHNldCBpZiBFX0xPT1AgbXVzdCBwYXNzIGJyZWFrL2NvbnRpbnVlIG9uICovCisjZGVmaW5lIEVGX0ZBS0VfU0lHRElFCUJJVCgyKQkvKiBoYWNrIHRvIGdldCBpbmZvIGZyb20gdW53aW5kIHRvIHF1aXRlbnYgKi8KKworLyogRG8gYnJlYWtzL2NvbnRpbnVlcyBzdG9wIGF0IGVudiB0eXBlIGU/ICovCisjZGVmaW5lIFNUT1BfQlJLQ09OVCh0KQkoKHQpID09IEVfTk9ORSB8fCAodCkgPT0gRV9QQVJTRSBcCisJCQkgfHwgKHQpID09IEVfRlVOQyB8fCAodCkgPT0gRV9JTkNMKQorLyogRG8gcmV0dXJucyBzdG9wIGF0IGVudiB0eXBlIGU/ICovCisjZGVmaW5lIFNUT1BfUkVUVVJOKHQpCSgodCkgPT0gRV9GVU5DIHx8ICh0KSA9PSBFX0lOQ0wpCisKKy8qIHZhbHVlcyBmb3Igc2lnbG9uZ2ptcChlLT5qYnVmLCAwKSAqLworI2RlZmluZSBMUkVUVVJOCTEJLyogcmV0dXJuIHN0YXRlbWVudCAqLworI2RlZmluZSBMRVhJVAkyCS8qIGV4aXQgc3RhdGVtZW50ICovCisjZGVmaW5lIExFUlJPUgkzCS8qIGVycm9yZigpIGNhbGxlZCAqLworI2RlZmluZSBMTEVBVkUJNAkvKiB1bnRyYXBwYWJsZSBleGl0L2Vycm9yICovCisjZGVmaW5lIExJTlRSCTUJLyogXkMgbm90aWNlZCAqLworI2RlZmluZSBMQlJFQUsJNgkvKiBicmVhayBzdGF0ZW1lbnQgKi8KKyNkZWZpbmUgTENPTlRJTgk3CS8qIGNvbnRpbnVlIHN0YXRlbWVudCAqLworI2RlZmluZSBMU0hFTEwJOAkvKiByZXR1cm4gdG8gaW50ZXJhY3RpdmUgc2hlbGwoKSAqLworI2RlZmluZSBMQUVYUFIJOQkvKiBlcnJvciBpbiBhcml0aG1ldGljIGV4cHJlc3Npb24gKi8KKworLyoKKyAqIHNvbWUga2luZCBvZiBnbG9iYWwgc2hlbGwgc3RhdGUsIGZvciBjaGFuZ2VfcmFuZG9tKCkgbW9zdGx5CisgKi8KKworRVhURVJOIHN0cnVjdCBta3NoX2tzaHN0YXRlX3YgeworCS8qIGZvciBjaGFuZ2VfcmFuZG9tICovCisJc3RydWN0IHRpbWV2YWwgY3JfdHY7CS8qIHRpbWVzdGFtcCAqLworCWNvbnN0IHZvaWQgKmNyX2RwOwkvKiBhcmd1bWVudCBhZGRyZXNzICovCisJc2l6ZV90IGNyX2RzejsJCS8qIGFyZ3VtZW50IGxlbmd0aCAqLworCXVpbnQzMl90IGxjZ19zdGF0ZV87CS8qIHByZXZpb3VzIExDRyBzdGF0ZSAqLworCS8qIGdsb2JhbCBzdGF0ZSAqLworCXBpZF90IHByb2NwaWRfOwkJLyogUElEIG9mIGV4ZWN1dGluZyBwcm9jZXNzICovCisJaW50IGV4c3RhdF87CQkvKiBleGl0IHN0YXR1cyAqLworCWludCBzdWJzdF9leHN0YXRfOwkvKiBleGl0IHN0YXR1cyBvZiBsYXN0ICQoLi4pL2AuLmAgKi8KKwlzdHJ1Y3QgZW52IGVudl87CS8qIHRvcC1sZXZlbCBwYXJzaW5nICYgZXhlY3V0aW9uIGVudi4gKi8KKwl1aW50OF90IHNoZWxsX2ZsYWdzX1tGTkZMQUdTXTsKK30ga3Noc3RhdGVfdjsKK0VYVEVSTiBzdHJ1Y3QgbWtzaF9rc2hzdGF0ZV9mIHsKKwljb25zdCBjaGFyICprc2huYW1lXzsJLyogJDAgKi8KKwlwaWRfdCBrc2hwaWRfOwkJLyogJCQsIHNoZWxsIFBJRCAqLworCXBpZF90IGtzaHBncnBfOwkJLyogcHJvY2VzcyBncm91cCBvZiBzaGVsbCAqLworCXVpZF90IGtzaGV1aWRfOwkJLyogZWZmZWN0aXZlIFVJRCBvZiBzaGVsbCAqLworCXBpZF90IGtzaHBwaWRfOwkJLyogUElEIG9mIHBhcmVudCBvZiBzaGVsbCAqLworCXVpbnQzMl90IGg7CQkvKiBzb21lIGtpbmQgb2YgaGFzaCAqLworfSBrc2hzdGF0ZV9mOworI2RlZmluZSBrc2huYW1lCQlrc2hzdGF0ZV9mLmtzaG5hbWVfCisjZGVmaW5lIGtzaHBpZAkJa3Noc3RhdGVfZi5rc2hwaWRfCisjZGVmaW5lIHByb2NwaWQJCWtzaHN0YXRlX3YucHJvY3BpZF8KKyNkZWZpbmUga3NocGdycAkJa3Noc3RhdGVfZi5rc2hwZ3JwXworI2RlZmluZSBrc2hldWlkCQlrc2hzdGF0ZV9mLmtzaGV1aWRfCisjZGVmaW5lIGtzaHBwaWQJCWtzaHN0YXRlX2Yua3NocHBpZF8KKyNkZWZpbmUgZXhzdGF0CQlrc2hzdGF0ZV92LmV4c3RhdF8KKyNkZWZpbmUgc3Vic3RfZXhzdGF0CWtzaHN0YXRlX3Yuc3Vic3RfZXhzdGF0XworCisvKiBldmlsIGhhY2s6IHJldHVybiBoYXNoKGtzaHN0YXRlX2YgY29uY2F0IChrc2hzdGF0ZV9mJy5oOj1oYXNoKGFyZykpKSAqLwordWludDMyX3QgZXZpbGhhc2goY29uc3QgY2hhciAqKTsKKworCisvKiBvcHRpb24gcHJvY2Vzc2luZyAqLworI2RlZmluZSBPRl9DTURMSU5FCTB4MDEJLyogY29tbWFuZCBsaW5lICovCisjZGVmaW5lIE9GX1NFVAkJMHgwMgkvKiBzZXQgYnVpbHRpbiAqLworI2RlZmluZSBPRl9TUEVDSUFMCTB4MDQJLyogYSBzcGVjaWFsIHZhcmlhYmxlIGNoYW5naW5nICovCisjZGVmaW5lIE9GX0lOVEVSTkFMCTB4MDgJLyogc2V0IGludGVybmFsbHkgYnkgc2hlbGwgKi8KKyNkZWZpbmUgT0ZfRklSU1RUSU1FCTB4MTAJLyogYXMgZWFybHkgYXMgcG9zc2libGUsIG9uY2UgKi8KKyNkZWZpbmUgT0ZfQU5ZCQkoT0ZfQ01ETElORSB8IE9GX1NFVCB8IE9GX1NQRUNJQUwgfCBPRl9JTlRFUk5BTCkKKworc3RydWN0IHNob3B0aW9uIHsKKwljb25zdCBjaGFyICpuYW1lOwkvKiBsb25nIG5hbWUgb2Ygb3B0aW9uICovCisJY2hhciBjOwkJCS8qIGNoYXJhY3RlciBmbGFnIChpZiBhbnkpICovCisJdW5zaWduZWQgY2hhciBmbGFnczsJLyogT0ZfKiAqLworfTsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc2hvcHRpb24gb3B0aW9uc1tdOworCisvKiBudWxsIHZhbHVlIGZvciB2YXJpYWJsZTsgY29tcGFyaXNpb24gcG9pbnRlciBmb3IgdW5zZXQgKi8KK0VYVEVSTiBjaGFyIG51bGxbXSBJX18oIiIpOworLyogaGVscGVycyBmb3Igc3RyaW5nIHBvb2xpbmcgKi8KKyNkZWZpbmUgVF9zeW5lcnIgInN5bnRheCBlcnJvciIKK0VYVEVSTiBjb25zdCBjaGFyIHJfZmNfZV9bXSBJX18oInI9ZmMgLWUgLSIpOworI2RlZmluZSBmY19lXwkJKHJfZmNfZV8gKyAyKQkJLyogImZjIC1lIC0iICovCisjZGVmaW5lIGZjX2VfbgkJNwkJCS8qIHN0cmxlbihmY19lXykgKi8KK0VYVEVSTiBjb25zdCBjaGFyIFRfbG9jYWxfdHlwZXNldFtdIElfXygibG9jYWw9dHlwZXNldCIpOworI2RlZmluZSBUX190eXBlc2V0CShUX2xvY2FsX3R5cGVzZXQgKyA1KQkvKiAiPXR5cGVzZXQiICovCisjZGVmaW5lIFRfdHlwZXNldAkoVF9sb2NhbF90eXBlc2V0ICsgNikJLyogInR5cGVzZXQiICovCisKK2VudW0gdGVtcF90eXBlIHsKKwlUVF9IRVJFRE9DX0VYUCwJLyogZXhwYW5kZWQgaGVyZWRvYyAqLworCVRUX0hJU1RfRURJVAkvKiB0ZW1wIGZpbGUgdXNlZCBmb3IgaGlzdG9yeSBlZGl0aW5nIChmYyAtZSkgKi8KK307Cit0eXBlZGVmIGVudW0gdGVtcF90eXBlIFRlbXBfdHlwZTsKKy8qIHRlbXAvaGVyZWRvYyBmaWxlcy4gVGhlIGZpbGUgaXMgcmVtb3ZlZCB3aGVuIHRoZSBzdHJ1Y3QgaXMgZnJlZWQuICovCitzdHJ1Y3QgdGVtcCB7CisJc3RydWN0IHRlbXAgKm5leHQ7CisJc3RydWN0IHNoZiAqc2hmOworCWNoYXIgKm5hbWU7CisJaW50IHBpZDsJLyogcGlkIG9mIHByb2Nlc3MgcGFyc2VkIGhlcmUtZG9jICovCisJVGVtcF90eXBlIHR5cGU7Cit9OworCisvKgorICogc3RkaW8gYW5kIG91ciBJTyByb3V0aW5lcworICovCisKKyNkZWZpbmUgc2hsX3NwYXJlCSgmc2hmX2lvYlswXSkJLyogZm9yIGNfcmVhZCgpL2NfcHJpbnQoKSAqLworI2RlZmluZSBzaGxfc3Rkb3V0CSgmc2hmX2lvYlsxXSkKKyNkZWZpbmUgc2hsX291dAkJKCZzaGZfaW9iWzJdKQorRVhURVJOIGludCBzaGxfc3Rkb3V0X29rOworCisvKgorICogdHJhcCBoYW5kbGVycworICovCit0eXBlZGVmIHN0cnVjdCB0cmFwIHsKKwljb25zdCBjaGFyICpuYW1lOwkvKiBzaG9ydCBuYW1lICovCisJY29uc3QgY2hhciAqbWVzczsJLyogZGVzY3JpcHRpdmUgbmFtZSAqLworCWNoYXIgKnRyYXA7CQkvKiB0cmFwIGNvbW1hbmQgKi8KKwlzaWdfdCBjdXJzaWc7CQkvKiBjdXJyZW50IGhhbmRsZXIgKHZhbGlkIGlmIFRGX09SSUdfKiBzZXQpICovCisJc2lnX3Qgc2h0cmFwOwkJLyogc2hlbGwgc2lnbmFsIGhhbmRsZXIgKi8KKwlpbnQgc2lnbmFsOwkJLyogc2lnbmFsIG51bWJlciAqLworCWludCBmbGFnczsJCS8qIFRGXyogKi8KKwl2b2xhdGlsZSBzaWdfYXRvbWljX3Qgc2V0OyAvKiB0cmFwIHBlbmRpbmcgKi8KK30gVHJhcDsKKworLyogdmFsdWVzIGZvciBUcmFwLmZsYWdzICovCisjZGVmaW5lIFRGX1NIRUxMX1VTRVMJQklUKDApCS8qIHNoZWxsIHVzZXMgc2lnbmFsLCB1c2VyIGNhbid0IGNoYW5nZSAqLworI2RlZmluZSBURl9VU0VSX1NFVAlCSVQoMSkJLyogdXNlciBoYXMgKHRyaWVkIHRvKSBzZXQgdHJhcCAqLworI2RlZmluZSBURl9PUklHX0lHTglCSVQoMikJLyogb3JpZ2luYWwgYWN0aW9uIHdhcyBTSUdfSUdOICovCisjZGVmaW5lIFRGX09SSUdfREZMCUJJVCgzKQkvKiBvcmlnaW5hbCBhY3Rpb24gd2FzIFNJR19ERkwgKi8KKyNkZWZpbmUgVEZfRVhFQ19JR04JQklUKDQpCS8qIHJlc3RvcmUgU0lHX0lHTiBqdXN0IGJlZm9yZSBleGVjICovCisjZGVmaW5lIFRGX0VYRUNfREZMCUJJVCg1KQkvKiByZXN0b3JlIFNJR19ERkwganVzdCBiZWZvcmUgZXhlYyAqLworI2RlZmluZSBURl9ERkxfSU5UUglCSVQoNikJLyogd2hlbiByZWNlaXZlZCwgZGVmYXVsdCBhY3Rpb24gaXMgTElOVFIgKi8KKyNkZWZpbmUgVEZfVFRZX0lOVFIJQklUKDcpCS8qIHR0eSBnZW5lcmF0ZWQgc2lnbmFsIChzZWUgal93YWl0aikgKi8KKyNkZWZpbmUgVEZfQ0hBTkdFRAlCSVQoOCkJLyogdXNlZCBieSBydW50cmFwKCkgdG8gZGV0ZWN0IHRyYXAgY2hhbmdlcyAqLworI2RlZmluZSBURl9GQVRBTAlCSVQoOSkJLyogY2F1c2VzIHRlcm1pbmF0aW9uIGlmIG5vdCB0cmFwcGVkICovCisKKy8qIHZhbHVlcyBmb3Igc2V0c2lnKCkvc2V0ZXhlY3NpZygpIGZsYWdzIGFyZ3VtZW50ICovCisjZGVmaW5lIFNTX1JFU1RPUkVfTUFTSwkweDMJLyogaG93IHRvIHJlc3RvcmUgYSBzaWduYWwgYmVmb3JlIGFuIGV4ZWMoKSAqLworI2RlZmluZSBTU19SRVNUT1JFX0NVUlIJMAkvKiBsZWF2ZSBjdXJyZW50IGhhbmRsZXIgaW4gcGxhY2UgKi8KKyNkZWZpbmUgU1NfUkVTVE9SRV9PUklHCTEJLyogcmVzdG9yZSBvcmlnaW5hbCBoYW5kbGVyICovCisjZGVmaW5lIFNTX1JFU1RPUkVfREZMCTIJLyogcmVzdG9yZSB0byBTSUdfREZMICovCisjZGVmaW5lIFNTX1JFU1RPUkVfSUdOCTMJLyogcmVzdG9yZSB0byBTSUdfSUdOICovCisjZGVmaW5lIFNTX0ZPUkNFCUJJVCgzKQkvKiBzZXQgc2lnbmFsIGV2ZW4gaWYgb3JpZ2luYWwgc2lnbmFsIGlnbm9yZWQgKi8KKyNkZWZpbmUgU1NfVVNFUgkJQklUKDQpCS8qIHVzZXIgaXMgZG9pbmcgdGhlIHNldCAoaWUsIHRyYXAgY29tbWFuZCkgKi8KKyNkZWZpbmUgU1NfU0hUUkFQCUJJVCg1KQkvKiB0cmFwIGZvciBpbnRlcm5hbCB1c2UgKEFMUk0sIENITEQsIFdJTkNIKSAqLworCisjZGVmaW5lIFNJR0VYSVRfCTAJLyogZm9yIHRyYXAgRVhJVCAqLworI2RlZmluZSBTSUdFUlJfCQlOU0lHCS8qIGZvciB0cmFwIEVSUiAqLworCitFWFRFUk4gdm9sYXRpbGUgc2lnX2F0b21pY190IHRyYXA7CS8qIHRyYXBzIHBlbmRpbmc/ICovCitFWFRFUk4gdm9sYXRpbGUgc2lnX2F0b21pY190IGludHJzaWc7CS8qIHBlbmRpbmcgdHJhcCBpbnRlcnJ1cHRzIGNvbW1hbmQgKi8KK0VYVEVSTiB2b2xhdGlsZSBzaWdfYXRvbWljX3QgZmF0YWxfdHJhcDsvKiByZWNlaXZlZCBhIGZhdGFsIHNpZ25hbCAqLworZXh0ZXJuCVRyYXAJc2lndHJhcHNbTlNJRysxXTsKKworLyogZ290X3dpbmNoID0gMSB3aGVuIHdlIG5lZWQgdG8gcmUtYWRqdXN0IHRoZSB3aW5kb3cgc2l6ZSAqLworI2lmZGVmIFNJR1dJTkNICitFWFRFUk4gdm9sYXRpbGUgc2lnX2F0b21pY190IGdvdF93aW5jaCBJX18oMSk7CisjZWxzZQorI2RlZmluZSBnb3Rfd2luY2gJdHJ1ZQorI2VuZGlmCisKKy8qCisgKiBUTU9VVCBzdXBwb3J0CisgKi8KKy8qIHZhbHVlcyBmb3Iga3NoX3Rtb3V0X3N0YXRlICovCitlbnVtIHRtb3V0X2VudW0geworCVRNT1VUX0VYRUNVVElORyA9IDAsCS8qIGV4ZWN1dGluZyBjb21tYW5kcyAqLworCVRNT1VUX1JFQURJTkcsCQkvKiB3YWl0aW5nIGZvciBpbnB1dCAqLworCVRNT1VUX0xFQVZJTkcJCS8qIGhhdmUgdGltZWQgb3V0ICovCit9OworRVhURVJOIHVuc2lnbmVkIGludCBrc2hfdG1vdXQ7CitFWFRFUk4gZW51bSB0bW91dF9lbnVtIGtzaF90bW91dF9zdGF0ZSBJX18oVE1PVVRfRVhFQ1VUSU5HKTsKKworLyogRm9yICJZb3UgaGF2ZSBzdG9wcGVkIGpvYnMiIG1lc3NhZ2UgKi8KK0VYVEVSTiBpbnQgcmVhbGx5X2V4aXQ7CisKKy8qCisgKiBmYXN0IGNoYXJhY3RlciBjbGFzc2VzCisgKi8KKyNkZWZpbmUgQ19BTFBIQQkgQklUKDApCQkvKiBhLXpfQS1aICovCisjZGVmaW5lIENfRElHSVQJIEJJVCgxKQkJLyogMC05ICovCisjZGVmaW5lIENfTEVYMQkgQklUKDIpCQkvKiBcdCBcblwwfCY7PD4oKSAqLworI2RlZmluZSBDX1ZBUjEJIEJJVCgzKQkJLyogKkAjISQtPyAqLworI2RlZmluZSBDX0lGU1dTCSBCSVQoNCkJCS8qIFx0IFxuIChJRlMgd2hpdGUgc3BhY2UpICovCisjZGVmaW5lIENfU1VCT1AxIEJJVCg1KQkJLyogIj0tKz8iICovCisjZGVmaW5lIENfUVVPVEUJIEJJVCg2KQkJLyogXHRcbiAiIyQmJygpKjs8PT4/W1xdYHwgKG5lZWRpbmcgcXVvdGluZykgKi8KKyNkZWZpbmUgQ19JRlMJIEJJVCg3KQkJLyogJElGUyAqLworI2RlZmluZSBDX1NVQk9QMiBCSVQoOCkJCS8qICIjJSIgKG1hZ2ljLCBzZWUgYmVsb3cpICovCisKK2V4dGVybiB1bnNpZ25lZCBjaGFyIGNodHlwZXNbXTsKKworI2RlZmluZSBjdHlwZShjLCB0KQkhISggKCh0KSA9PSBDX1NVQk9QMikgPwkJCQlcCisJCQkgICAgKCgoYykgPT0gJyMnIHx8IChjKSA9PSAnJScpID8gMSA6IDApIDoJXAorCQkJICAgIChjaHR5cGVzWyh1bnNpZ25lZCBjaGFyKShjKV0mKHQpKSApCisjZGVmaW5lIGtzaF9pc2FscGh4KGMpCWN0eXBlKChjKSwgQ19BTFBIQSkKKyNkZWZpbmUga3NoX2lzYWxudXgoYykJY3R5cGUoKGMpLCBDX0FMUEhBIHwgQ19ESUdJVCkKKworRVhURVJOIGludCBpZnMwIElfXygnICcpOwkvKiBmb3IgIiQqIiAqLworCisvKiBBcmd1bWVudCBwYXJzaW5nIGZvciBidWlsdC1pbiBjb21tYW5kcyBhbmQgZ2V0b3B0cyBjb21tYW5kICovCisKKy8qIFZhbHVlcyBmb3IgR2V0b3B0LmZsYWdzICovCisjZGVmaW5lIEdGX0VSUk9SCUJJVCgwKQkvKiBjYWxsIGVycm9yZigpIGlmIHRoZXJlIGlzIGFuIGVycm9yICovCisjZGVmaW5lIEdGX1BMVVNPUFQJQklUKDEpCS8qIGFsbG93ICtjIGFzIGFuIG9wdGlvbiAqLworI2RlZmluZSBHRl9OT05BTUUJQklUKDIpCS8qIGRvbid0IHByaW50IGFyZ3ZbMF0gaW4gZXJyb3JzICovCisKKy8qIFZhbHVlcyBmb3IgR2V0b3B0LmluZm8gKi8KKyNkZWZpbmUgR0lfTUlOVVMJQklUKDApCS8qIGFuIG9wdGlvbiBzdGFydGVkIHdpdGggLS4uLiAqLworI2RlZmluZSBHSV9QTFVTCQlCSVQoMSkJLyogYW4gb3B0aW9uIHN0YXJ0ZWQgd2l0aCArLi4uICovCisjZGVmaW5lIEdJX01JTlVTTUlOVVMJQklUKDIpCS8qIGFyZ3VtZW50cyB3ZXJlIGVuZGVkIHdpdGggLS0gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWNvbnN0IGNoYXIJKm9wdGFyZzsKKwlpbnQJCW9wdGluZDsKKwlpbnQJCXVvcHRpbmQ7Lyogd2hhdCB1c2VyIHNlZXMgaW4gJE9QVElORCAqLworCWludAkJZmxhZ3M7CS8qIHNlZSBHRl8qICovCisJaW50CQlpbmZvOwkvKiBzZWUgR0lfKiAqLworCXVuc2lnbmVkIGludAlwOwkvKiAwIG9yIGluZGV4IGludG8gYXJndltvcHRpbmQgLSAxXSAqLworCWNoYXIJCWJ1ZlsyXTsJLyogZm9yIGJhZCBvcHRpb24gT1BUQVJHIHZhbHVlICovCit9IEdldG9wdDsKKworRVhURVJOIEdldG9wdCBidWlsdGluX29wdDsJLyogZm9yIHNoZWxsIGJ1aWx0aW4gY29tbWFuZHMgKi8KK0VYVEVSTiBHZXRvcHQgdXNlcl9vcHQ7CQkvKiBwYXJzaW5nIHN0YXRlIGZvciBnZXRvcHRzIGJ1aWx0aW4gY29tbWFuZCAqLworCisvKiBUaGlzIGZvciBjby1wcm9jZXNzZXMgKi8KKwordHlwZWRlZiBpbnQzMl90IENvcHJvY19pZDsgLyogc29tZXRoaW5nIHRoYXQgd29uJ3QgKHJlYWxpc3RpY2x5KSB3cmFwICovCitzdHJ1Y3QgY29wcm9jIHsKKwl2b2lkICpqb2I7CS8qIDAgb3Igam9iIG9mIGNvLXByb2Nlc3MgdXNpbmcgaW5wdXQgcGlwZSAqLworCWludCByZWFkOwkvKiBwaXBlIGZyb20gY28tcHJvY2VzcydzIHN0ZG91dCAqLworCWludCByZWFkdzsJLyogb3RoZXIgc2lkZSBvZiByZWFkIChzYXZlZCB0ZW1wb3JhcmlseSkgKi8KKwlpbnQgd3JpdGU7CS8qIHBpcGUgdG8gY28tcHJvY2VzcydzIHN0ZGluICovCisJaW50IG5qb2JzOwkvKiBudW1iZXIgb2YgbGl2ZSBqb2JzIHVzaW5nIG91dHB1dCBwaXBlICovCisJQ29wcm9jX2lkIGlkOwkvKiBpZCBvZiBjdXJyZW50IG91dHB1dCBwaXBlICovCit9OworRVhURVJOIHN0cnVjdCBjb3Byb2MgY29wcm9jOworCisvKiBVc2VkIGluIGpvYnMuYyBhbmQgYnkgY29wcm9jZXNzIHN0dWZmIGluIGV4ZWMuYyAqLworRVhURVJOIHNpZ3NldF90CQlzbV9kZWZhdWx0LCBzbV9zaWdjaGxkOworCisvKiBuYW1lIG9mIGNhbGxlZCBidWlsdGluIGZ1bmN0aW9uICh1c2VkIGJ5IGVycm9yIGZ1bmN0aW9ucykgKi8KK0VYVEVSTiBjb25zdCBjaGFyICpidWlsdGluX2FyZ3YwOworRVhURVJOIFRmbGFnIGJ1aWx0aW5fZmxhZzsJLyogZmxhZ3Mgb2YgY2FsbGVkIGJ1aWx0aW4gKFNQRUNfQkksIGV0Yy4pICovCisKKy8qIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBzaXplIG9mIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHNhbWUgKi8KK0VYVEVSTiBjaGFyCSpjdXJyZW50X3dkOworRVhURVJOIHNpemVfdAljdXJyZW50X3dkX3NpemU7CisKKy8qIE1pbmltdW0gcmVxdWlyZWQgc3BhY2UgdG8gd29yayB3aXRoIG9uIGEgbGluZSAtIGlmIHRoZSBwcm9tcHQgbGVhdmVzIGxlc3MKKyAqIHNwYWNlIHRoYW4gdGhpcyBvbiBhIGxpbmUsIHRoZSBwcm9tcHQgaXMgdHJ1bmNhdGVkLgorICovCisjZGVmaW5lIE1JTl9FRElUX1NQQUNFCTcKKy8qIE1pbmltdW0gYWxsb3dlZCB2YWx1ZSBmb3IgeF9jb2xzOiAyIGZvciBwcm9tcHQsIDMgZm9yICIgPCAiIGF0IGVuZCBvZiBsaW5lCisgKi8KKyNkZWZpbmUgTUlOX0NPTFMJKDIgKyBNSU5fRURJVF9TUEFDRSArIDMpCisjZGVmaW5lIE1JTl9MSU5TCTMKK0VYVEVSTiBta3NoX2FyaV90IHhfY29scyBJX18oODApOwkvKiB0dHkgY29sdW1ucyAqLworRVhURVJOIG1rc2hfYXJpX3QgeF9saW5zIElfXygtMSk7CS8qIHR0eSBsaW5lcyAqLworCisvKiBUaGVzZSB0byBhdm9pZCBicmFja2V0IG1hdGNoaW5nIHByb2JsZW1zICovCisjZGVmaW5lIE9QQVJFTgknKCcKKyNkZWZpbmUgQ1BBUkVOCScpJworI2RlZmluZSBPQlJBQ0sJJ1snCisjZGVmaW5lIENCUkFDSwknXScKKyNkZWZpbmUgT0JSQUNFCSd7JworI2RlZmluZSBDQlJBQ0UJJ30nCisKKy8qIERldGVybWluZSB0aGUgbG9jYXRpb24gb2YgdGhlIHN5c3RlbSAoY29tbW9uKSBwcm9maWxlICovCisjZGVmaW5lIEtTSF9TWVNURU1fUFJPRklMRSAiL2V0Yy9wcm9maWxlIgorCisvKiBVc2VkIGJ5IHZfZXZhbHVhdGUoKSBhbmQgc2V0c3RyKCkgdG8gY29udHJvbCBhY3Rpb24gd2hlbiBlcnJvciBvY2N1cnMgKi8KKyNkZWZpbmUgS1NIX1VOV0lORF9FUlJPUgkwCS8qIHVud2luZCB0aGUgc3RhY2sgKGxvbmdqbXApICovCisjZGVmaW5lIEtTSF9SRVRVUk5fRVJST1IJMQkvKiByZXR1cm4gMS8wIGZvciBzdWNjZXNzL2ZhaWx1cmUgKi8KKworLyoKKyAqIFNoZWxsIGZpbGUgSS9PIHJvdXRpbmVzCisgKi8KKworI2RlZmluZSBTSEZfQlNJWkUJNTEyCisKKyNkZWZpbmUgc2hmX2ZpbGVubyhzaGYpCSgoc2hmKS0+ZmQpCisjZGVmaW5lIHNoZl9zZXRmaWxlbm8oc2hmLG5mZCkJKChzaGYpLT5mZCA9IChuZmQpKQorI2lmZGVmIE1LU0hfU01BTEwKK2ludCBzaGZfZ2V0YyhzdHJ1Y3Qgc2hmICopOworaW50IHNoZl9wdXRjKGludCwgc3RydWN0IHNoZiAqKTsKKyNlbHNlCisjZGVmaW5lIHNoZl9nZXRjKHNoZikJCSgoc2hmKS0+cm5sZWZ0ID4gMCA/IFwKKwkJCQkgICAgKHNoZiktPnJubGVmdC0tLCAqKHNoZiktPnJwKysgOiBcCisJCQkJICAgIHNoZl9nZXRjaGFyKHNoZikpCisjZGVmaW5lIHNoZl9wdXRjKGMsIHNoZikJKChzaGYpLT53bmxlZnQgPT0gMCA/IFwKKwkJCQkgICAgc2hmX3B1dGNoYXIoKGMpLCAoc2hmKSkgOiBcCisJCQkJICAgICgoc2hmKS0+d25sZWZ0LS0sICooc2hmKS0+d3ArKyA9IChjKSkpCisjZW5kaWYKKyNkZWZpbmUgc2hmX2VvZihzaGYpCQkoKHNoZiktPmZsYWdzICYgU0hGX0VPRikKKyNkZWZpbmUgc2hmX2Vycm9yKHNoZikJCSgoc2hmKS0+ZmxhZ3MgJiBTSEZfRVJST1IpCisjZGVmaW5lIHNoZl9lcnJubyhzaGYpCQkoKHNoZiktPmVycm5vXykKKyNkZWZpbmUgc2hmX2NsZWFyZXJyKHNoZikJKChzaGYpLT5mbGFncyAmPSB+KFNIRl9FT0YgfCBTSEZfRVJST1IpKQorCisvKiBGbGFncyBwYXNzZWQgdG8gc2hmXypvcGVuKCkgKi8KKyNkZWZpbmUgU0hGX1JECQkweDAwMDEKKyNkZWZpbmUgU0hGX1dSCQkweDAwMDIKKyNkZWZpbmUgU0hGX1JEV1IJKFNIRl9SRHxTSEZfV1IpCisjZGVmaW5lIFNIRl9BQ0NNT0RFCTB4MDAwMwkJLyogbWFzayAqLworI2RlZmluZSBTSEZfR0VURkwJMHgwMDA0CQkvKiB1c2UgZmNudGwoKSB0byBmaWd1cmUgUkQvV1IgZmxhZ3MgKi8KKyNkZWZpbmUgU0hGX1VOQlVGCTB4MDAwOAkJLyogdW5idWZmZXJlZCBJL08gKi8KKyNkZWZpbmUgU0hGX0NMRVhFQwkweDAwMTAJCS8qIHNldCBjbG9zZSBvbiBleGVjIGZsYWcgKi8KKyNkZWZpbmUgU0hGX01BUEhJCTB4MDAyMAkJLyogbWFrZSBmZCA+IEZEQkFTRSAoYW5kIGNsb3NlIG9yaWcpCisJCQkJCSAqIChzaGZfb3BlbigpIG9ubHkpICovCisjZGVmaW5lIFNIRl9EWU5BTUlDCTB4MDA0MAkJLyogc3RyaW5nOiBpbmNyZWFzZSBidWZmZXIgYXMgbmVlZGVkICovCisjZGVmaW5lIFNIRl9JTlRFUlJVUFQJMHgwMDgwCQkvKiBFSU5UUiBpbiByZWFkL3dyaXRlIGNhdXNlcyBlcnJvciAqLworLyogRmxhZ3MgdXNlZCBpbnRlcm5hbGx5ICovCisjZGVmaW5lIFNIRl9TVFJJTkcJMHgwMTAwCQkvKiBhIHN0cmluZywgbm90IGEgZmlsZSAqLworI2RlZmluZSBTSEZfQUxMT0NTCTB4MDIwMAkJLyogc2hmIGFuZCBzaGYtPmJ1ZiB3ZXJlIGFsbG9jKCllZCAqLworI2RlZmluZSBTSEZfQUxMT0NCCTB4MDQwMAkJLyogc2hmLT5idWYgd2FzIGFsbG9jKCllZCAqLworI2RlZmluZSBTSEZfRVJST1IJMHgwODAwCQkvKiByZWFkKCkvd3JpdGUoKSBlcnJvciAqLworI2RlZmluZSBTSEZfRU9GCQkweDEwMDAJCS8qIHJlYWQgZW9mIChzdGlja3kpICovCisjZGVmaW5lIFNIRl9SRUFESU5HCTB4MjAwMAkJLyogY3VycmVudGx5IHJlYWRpbmc6IHJubGVmdCxycCB2YWxpZCAqLworI2RlZmluZSBTSEZfV1JJVElORwkweDQwMDAJCS8qIGN1cnJlbnRseSB3cml0aW5nOiB3bmxlZnQsd3AgdmFsaWQgKi8KKworCitzdHJ1Y3Qgc2hmIHsKKwlBcmVhICphcmVhcDsJCS8qIGFyZWEgc2hmL2J1ZiB3ZXJlIGFsbG9jYXRlZCBpbiAqLworCXVuc2lnbmVkIGNoYXIgKnJwOwkvKiByZWFkOiBjdXJyZW50IHBvc2l0aW9uIGluIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKndwOwkvKiB3cml0ZTogY3VycmVudCBwb3NpdGlvbiBpbiBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyICpidWY7CS8qIGJ1ZmZlciAqLworCWludCBmbGFnczsJCS8qIHNlZSBTSEZfKiAqLworCWludCByYnNpemU7CQkvKiBzaXplIG9mIGJ1ZmZlciAoMSBpZiBTSEZfVU5CVUYpICovCisJaW50IHJubGVmdDsJCS8qIHJlYWQ6IGhvdyBtdWNoIGRhdGEgbGVmdCBpbiBidWZmZXIgKi8KKwlpbnQgd2JzaXplOwkJLyogc2l6ZSBvZiBidWZmZXIgKDAgaWYgU0hGX1VOQlVGKSAqLworCWludCB3bmxlZnQ7CQkvKiB3cml0ZTogaG93IG11Y2ggc3BhY2UgbGVmdCBpbiBidWZmZXIgKi8KKwlpbnQgZmQ7CQkJLyogZmlsZSBkZXNjcmlwdG9yICovCisJaW50IGVycm5vXzsJCS8qIHNhdmVkIHZhbHVlIG9mIGVycm5vIGFmdGVyIGVycm9yICovCisJaW50IGJzaXplOwkJLyogYWN0dWFsIHNpemUgb2YgYnVmICovCit9OworCitleHRlcm4gc3RydWN0IHNoZiBzaGZfaW9iW107CisKK3N0cnVjdCB0YWJsZSB7CisJQXJlYSAqYXJlYXA7CQkvKiBhcmVhIHRvIGFsbG9jYXRlIGVudHJpZXMgKi8KKwlzdHJ1Y3QgdGJsICoqdGJsczsJLyogaGFzaGVkIHRhYmxlIGl0ZW1zICovCisJc2hvcnQgc2l6ZSwgbmZyZWU7CS8qIGhhc2ggc2l6ZSAoYWx3YXlzIDJeXm4pLCBmcmVlIGVudHJpZXMgKi8KK307CisKK3N0cnVjdCB0YmwgewkJCS8qIHRhYmxlIGl0ZW0gKi8KKwlBcmVhICphcmVhcDsJCS8qIGFyZWEgdG8gYWxsb2NhdGUgZnJvbSAqLworCXVuaW9uIHsKKwkJY2hhciAqczsJCS8qIHN0cmluZyAqLworCQlta3NoX2FyaV90IGk7CQkvKiBpbnRlZ2VyICovCisJCW1rc2hfdWFyaV90IHU7CQkvKiB1bnNpZ25lZCBpbnRlZ2VyICovCisJCWludCAoKmYpKGNvbnN0IGNoYXIgKiopOy8qIGludCBmdW5jdGlvbiAqLworCQlzdHJ1Y3Qgb3AgKnQ7CQkvKiAiZnVuY3Rpb24iIHRyZWUgKi8KKwl9IHZhbDsJCQkvKiB2YWx1ZSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHRibCAqYXJyYXk7CS8qIGFycmF5IHZhbHVlcyAqLworCQljb25zdCBjaGFyICpmcGF0aDsJLyogdGVtcG9yYXJ5IHBhdGggdG8gdW5kZWYgZnVuY3Rpb24gKi8KKwl9IHU7CisJdW5pb24geworCQlpbnQgZmllbGQ7CS8qIGZpZWxkIHdpdGggZm9yIC1MLy1SLy1aICovCisJCWludCBlcnJub187CS8qIENFWEVDL0NUQUxJQVMgKi8KKwl9IHUyOworCWludCB0eXBlOwkJLyogY29tbWFuZCB0eXBlIChzZWUgYmVsb3cpLCBiYXNlIChpZiBJTlRFR0VSKSwKKwkJCQkgKiBvciBvZmZzZXQgZnJvbSB2YWwucyBvZiB2YWx1ZSAoaWYgRVhQT1JUKSAqLworCVRmbGFnIGZsYWc7CQkvKiBmbGFncyAqLworCXVuaW9uIHsKKwkJdWludDMyX3QgaHZhbDsJCS8qIGhhc2gobmFtZSkgKi8KKwkJdWludDMyX3QgaW5kZXg7CQkvKiBpbmRleCBmb3IgYW4gYXJyYXkgKi8KKwl9IHVhOworCWNoYXIgbmFtZVs0XTsJCS8qIG5hbWUgLS0gdmFyaWFibGUgbGVuZ3RoICovCit9OworCisvKiBjb21tb24gZmxhZyBiaXRzICovCisjZGVmaW5lIEFMTE9DCQlCSVQoMCkJLyogdmFsLnMgaGFzIGJlZW4gYWxsb2NhdGVkICovCisjZGVmaW5lIERFRklORUQJCUJJVCgxKQkvKiBpcyBkZWZpbmVkIGluIGJsb2NrICovCisjZGVmaW5lIElTU0VUCQlCSVQoMikJLyogaGFzIHZhbHVlLCB2cC0+dmFsLltzaV0gKi8KKyNkZWZpbmUgRVhQT1JUCQlCSVQoMykJLyogZXhwb3J0ZWQgdmFyaWFibGUvZnVuY3Rpb24gKi8KKyNkZWZpbmUgVFJBQ0UJCUJJVCg0KQkvKiB2YXI6IHVzZXIgZmxhZ2dlZCwgZnVuYzogZXhlY3V0aW9uIHRyYWNpbmcgKi8KKy8qIChzdGFydCBub24tY29tbW9uIGZsYWdzIGF0IDgpICovCisvKiBmbGFnIGJpdHMgdXNlZCBmb3IgdmFyaWFibGVzICovCisjZGVmaW5lIFNQRUNJQUwJCUJJVCg4KQkvKiBQQVRILCBJRlMsIFNFQ09ORFMsIGV0YyAqLworI2RlZmluZSBJTlRFR0VSCQlCSVQoOSkJLyogdmFsLmkgY29udGFpbnMgaW50ZWdlciB2YWx1ZSAqLworI2RlZmluZSBSRE9OTFkJCUJJVCgxMCkJLyogcmVhZC1vbmx5IHZhcmlhYmxlICovCisjZGVmaW5lIExPQ0FMCQlCSVQoMTEpCS8qIGZvciBsb2NhbCB0eXBlc2V0KCkgKi8KKyNkZWZpbmUgQVJSQVkJCUJJVCgxMykJLyogYXJyYXkgKi8KKyNkZWZpbmUgTEpVU1QJCUJJVCgxNCkJLyogbGVmdCBqdXN0aWZ5ICovCisjZGVmaW5lIFJKVVNUCQlCSVQoMTUpCS8qIHJpZ2h0IGp1c3RpZnkgKi8KKyNkZWZpbmUgWkVST0ZJTAkJQklUKDE2KQkvKiAwIGZpbGxlZCBpZiBSSlVTVElGWSwgc3RyaXAgMHMgaWYgTEpVU1RJRlkgKi8KKyNkZWZpbmUgTENBU0VWCQlCSVQoMTcpCS8qIGNvbnZlcnQgdG8gbG93ZXIgY2FzZSAqLworI2RlZmluZSBVQ0FTRVZfQUwJQklUKDE4KSAvKiBjb252ZXJ0IHRvIHVwcGVyIGNhc2UgLyBhdXRvbG9hZCBmdW5jdGlvbiAqLworI2RlZmluZSBJTlRfVQkJQklUKDE5KQkvKiB1bnNpZ25lZCBpbnRlZ2VyICovCisjZGVmaW5lIElOVF9MCQlCSVQoMjApCS8qIGxvbmcgaW50ZWdlciAobm8tb3ApICovCisjZGVmaW5lIElNUE9SVAkJQklUKDIxKQkvKiBmbGFnIHRvIHR5cGVzZXQoKTogbm8gYXJyYXlzLCBtdXN0IGhhdmUgPSAqLworI2RlZmluZSBMT0NBTF9DT1BZCUJJVCgyMikJLyogd2l0aCBMT0NBTCAtIGNvcHkgYXR0cnMgZnJvbSBleGlzdGluZyB2YXIgKi8KKyNkZWZpbmUgRVhQUklORVZBTAlCSVQoMjMpCS8qIGNvbnRlbnRzIGN1cnJlbnRseSBiZWluZyBldmFsdWF0ZWQgKi8KKyNkZWZpbmUgRVhQUkxWQUxVRQlCSVQoMjQpCS8qIHVzZWFibGUgYXMgbHZhbHVlICh0ZW1wIGZsYWcpICovCisjZGVmaW5lIEFJTkRFWAkJQklUKDI1KSAvKiBhcnJheSBpbmRleCA+MCA9IHVhLmluZGV4IGZpbGxlZCBpbiAqLworI2RlZmluZSBBU1NPQwkJQklUKDI2KSAvKiBBUlJBWSA/IGFzc29jaWF0aXZlIDogcmVmZXJlbmNlICovCisvKiBmbGFnIGJpdHMgdXNlZCBmb3IgdGFsaWFzZXMvYnVpbHRpbnMvYWxpYXNlcy9rZXl3b3Jkcy9mdW5jdGlvbnMgKi8KKyNkZWZpbmUgS0VFUEFTTgkJQklUKDgpCS8qIGtlZXAgY29tbWFuZCBhc3NpZ25tZW50cyAoZWcsIHZhcj14IGNtZCkgKi8KKyNkZWZpbmUgRklOVVNFCQlCSVQoOSkJLyogZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQgKi8KKyNkZWZpbmUgRkRFTEVURQkJQklUKDEwKQkvKiBmdW5jdGlvbiBkZWxldGVkIHdoaWxlIGl0IHdhcyBleGVjdXRpbmcgKi8KKyNkZWZpbmUgRktTSAkJQklUKDExKQkvKiBmdW5jdGlvbiBkZWZpbmVkIHdpdGggZnVuY3Rpb24geCAodnMgeCgpKSAqLworI2RlZmluZSBTUEVDX0JJCQlCSVQoMTIpCS8qIGEgUE9TSVggc3BlY2lhbCBidWlsdGluICovCisjZGVmaW5lIFJFR19CSQkJQklUKDEzKQkvKiBhIFBPU0lYIHJlZ3VsYXIgYnVpbHRpbiAqLworLyogQXR0cmlidXRlcyB0aGF0IGNhbiBiZSBzZXQgYnkgdGhlIHVzZXIgKHVzZWQgdG8gZGVjaWRlIGlmIGFuIHVuc2V0IHBhcmFtCisgKiBzaG91bGQgYmUgcmVwb3RlZCBieSBzZXQvdHlwZXNldCkuIERvZXMgbm90IGluY2x1ZGUgQVJSQVkgb3IgTE9DQUwuCisgKi8KKyNkZWZpbmUgVVNFUkFUVFJJQgkoRVhQT1JUfElOVEVHRVJ8UkRPTkxZfExKVVNUfFJKVVNUfFpFUk9GSUx8XAorCQkJICAgIExDQVNFVnxVQ0FTRVZfQUx8SU5UX1V8SU5UX0wpCisKKyNkZWZpbmUgYXJyYXlpbmRleCh2cCkJKCh1bnNpZ25lZCBsb25nKSgodnApLT5mbGFnICYgQUlOREVYID8gXAorCQkJICAgICh2cCktPnVhLmluZGV4IDogMCkpCisKKy8qIGNvbW1hbmQgdHlwZXMgKi8KKyNkZWZpbmUgQ05PTkUJCTAJLyogdW5kZWZpbmVkICovCisjZGVmaW5lIENTSEVMTAkJMQkvKiBidWlsdC1pbiAqLworI2RlZmluZSBDRlVOQwkJMgkvKiBmdW5jdGlvbiAqLworI2RlZmluZSBDRVhFQwkJNAkvKiBleGVjdXRhYmxlIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ0FMSUFTCQk1CS8qIGFsaWFzICovCisjZGVmaW5lIENLRVlXRAkJNgkvKiBrZXl3b3JkICovCisjZGVmaW5lIENUQUxJQVMJCTcJLyogdHJhY2tlZCBhbGlhcyAqLworCisvKiBGbGFncyBmb3IgZmluZGNvbSgpL2NvbWV4ZWMoKSAqLworI2RlZmluZSBGQ19TUEVDQkkJQklUKDApCS8qIHNwZWNpYWwgYnVpbHRpbiAqLworI2RlZmluZSBGQ19GVU5DCQlCSVQoMSkJLyogZnVuY3Rpb24gYnVpbHRpbiAqLworI2RlZmluZSBGQ19SRUdCSQlCSVQoMikJLyogcmVndWxhciBidWlsdGluICovCisjZGVmaW5lIEZDX1VOUkVHQkkJQklUKDMpCS8qIHVuLXJlZ3VsYXIgYnVpbHRpbiAoIXNwZWNpYWwsIXJlZ3VsYXIpICovCisjZGVmaW5lIEZDX0JJCQkoRkNfU1BFQ0JJfEZDX1JFR0JJfEZDX1VOUkVHQkkpCisjZGVmaW5lIEZDX1BBVEgJCUJJVCg0KQkvKiBkbyBwYXRoIHNlYXJjaCAqLworI2RlZmluZSBGQ19ERUZQQVRICUJJVCg1KQkvKiB1c2UgZGVmYXVsdCBwYXRoIGluIHBhdGggc2VhcmNoICovCisKKworI2RlZmluZSBBRl9BUkdWX0FMTE9DCTB4MQkvKiBhcmd2W10gYXJyYXkgYWxsb2NhdGVkICovCisjZGVmaW5lIEFGX0FSR1NfQUxMT0NFRAkweDIJLyogYXJndW1lbnQgc3RyaW5ncyBhbGxvY2F0ZWQgKi8KKyNkZWZpbmUgQUlfQVJHVihhLCBpKQkoKGkpID09IDAgPyAoYSkuYXJndlswXSA6IChhKS5hcmd2WyhpKSAtIChhKS5za2lwXSkKKyNkZWZpbmUgQUlfQVJHQyhhKQkoKGEpLmFyZ2NfIC0gKGEpLnNraXApCisKKy8qIEFyZ3VtZW50IGluZm8uIFVzZWQgZm9yICQjLCAkKiBmb3Igc2hlbGwsIGZ1bmN0aW9ucywgaW5jbHVkZXMsIGV0Yy4gKi8KK3N0cnVjdCBhcmdfaW5mbyB7CisJY29uc3QgY2hhciAqKmFyZ3Y7CisJaW50IGZsYWdzOwkvKiBBRl8qICovCisJaW50IGFyZ2NfOworCWludCBza2lwOwkvKiBmaXJzdCBhcmcgaXMgYXJndlswXSwgc2Vjb25kIGlzIGFyZ3ZbMSArIHNraXBdICovCit9OworCisvKgorICogYWN0aXZhdGlvbiByZWNvcmQgZm9yIGZ1bmN0aW9uIGJsb2NrcworICovCitzdHJ1Y3QgYmxvY2sgeworCUFyZWEgYXJlYTsJCS8qIGFyZWEgdG8gYWxsb2NhdGUgdGhpbmdzICovCisJY29uc3QgY2hhciAqKmFyZ3Y7CisJY2hhciAqZXJyb3I7CQkvKiBlcnJvciBoYW5kbGVyICovCisJY2hhciAqZXhpdDsJCS8qIGV4aXQgaGFuZGxlciAqLworCXN0cnVjdCBibG9jayAqbmV4dDsJLyogZW5jbG9zaW5nIGJsb2NrICovCisJc3RydWN0IHRhYmxlIHZhcnM7CS8qIGxvY2FsIHZhcmlhYmxlcyAqLworCXN0cnVjdCB0YWJsZSBmdW5zOwkvKiBsb2NhbCBmdW5jdGlvbnMgKi8KKwlHZXRvcHQgZ2V0b3B0c19zdGF0ZTsKKwlpbnQgYXJnYzsKKwlpbnQgZmxhZ3M7CQkvKiBzZWUgQkZfKiAqLworfTsKKworLyogVmFsdWVzIGZvciBzdHJ1Y3QgYmxvY2suZmxhZ3MgKi8KKyNkZWZpbmUgQkZfRE9HRVRPUFRTCUJJVCgwKQkvKiBzYXZlL3Jlc3RvcmUgZ2V0b3B0cyBzdGF0ZSAqLworCisvKgorICogVXNlZCBieSBrdHdhbGsoKSBhbmQga3RuZXh0KCkgcm91dGluZXMuCisgKi8KK3N0cnVjdCB0c3RhdGUgeworCXN0cnVjdCB0YmwgKipuZXh0OworCXNzaXplX3QgbGVmdDsKK307CisKK0VYVEVSTiBzdHJ1Y3QgdGFibGUgdGFsaWFzZXM7CS8qIHRyYWNrZWQgYWxpYXNlcyAqLworRVhURVJOIHN0cnVjdCB0YWJsZSBidWlsdGluczsJLyogYnVpbHQtaW4gY29tbWFuZHMgKi8KK0VYVEVSTiBzdHJ1Y3QgdGFibGUgYWxpYXNlczsJLyogYWxpYXNlcyAqLworRVhURVJOIHN0cnVjdCB0YWJsZSBrZXl3b3JkczsJLyoga2V5d29yZHMgKi8KKyNpZm5kZWYgTUtTSF9OT1BXTkFNCitFWFRFUk4gc3RydWN0IHRhYmxlIGhvbWVkaXJzOwkvKiBob21lZGlyKCkgY2FjaGUgKi8KKyNlbmRpZgorCitzdHJ1Y3QgYnVpbHRpbiB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCpmdW5jKShjb25zdCBjaGFyICoqKTsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYnVpbHRpbiBta3NoYnVpbHRpbnNbXTsKKworLyogdmFsdWVzIGZvciBzZXRfcHJvbXB0KCkgKi8KKyNkZWZpbmUgUFMxCTAJLyogY29tbWFuZCAqLworI2RlZmluZSBQUzIJMQkvKiBjb21tYW5kIGNvbnRpbnVhdGlvbiAqLworCitFWFRFUk4gY2hhciAqcGF0aDsJCS8qIGNvcHkgb2YgZWl0aGVyIFBBVEggb3IgZGVmX3BhdGggKi8KK0VYVEVSTiBjb25zdCBjaGFyICpkZWZfcGF0aDsJLyogcGF0aCB0byB1c2UgaWYgUEFUSCBub3Qgc2V0ICovCitFWFRFUk4gY2hhciAqdG1wZGlyOwkJLyogVE1QRElSIHZhbHVlICovCitFWFRFUk4gY29uc3QgY2hhciAqcHJvbXB0OworRVhURVJOIGludCBjdXJfcHJvbXB0OwkJLyogUFMxIG9yIFBTMiAqLworRVhURVJOIGludCBjdXJyZW50X2xpbmVubzsJLyogTElORU5PIHZhbHVlICovCisKKyNkZWZpbmUgTk9CTE9DSwkoKHN0cnVjdCBvcCAqKU5VTEwpCisjZGVmaW5lIE5PV09SRAkoKGNoYXIgKilOVUxMKQorI2RlZmluZSBOT1dPUkRTCSgoY2hhciAqKilOVUxMKQorCisvKgorICogRGVzY3JpcHRpb24gb2YgYSBjb21tYW5kIG9yIGFuIG9wZXJhdGlvbiBvbiBjb21tYW5kcy4KKyAqLworc3RydWN0IG9wIHsKKwljb25zdCBjaGFyICoqYXJnczsJCS8qIGFyZ3VtZW50cyB0byBhIGNvbW1hbmQgKi8KKwljaGFyICoqdmFyczsJCQkvKiB2YXJpYWJsZSBhc3NpZ25tZW50cyAqLworCXN0cnVjdCBpb3dvcmQgKippb2FjdDsJCS8qIElPIGFjdGlvbnMgKGVnLCA8ID4gPj4pICovCisJc3RydWN0IG9wICpsZWZ0LCAqcmlnaHQ7CS8qIGRlc2NlbmRlbnRzICovCisJY2hhciAqc3RyOwkJCS8qIHdvcmQgZm9yIGNhc2U7IGlkZW50aWZpZXIgZm9yIGZvciwKKwkJCQkJICogc2VsZWN0LCBhbmQgZnVuY3Rpb25zOworCQkJCQkgKiBwYXRoIHRvIGV4ZWN1dGUgZm9yIFRFWEVDOworCQkJCQkgKiB0aW1lIGhvb2sgZm9yIFRDT00uCisJCQkJCSAqLworCWludCBsaW5lbm87CQkJLyogVENPTS9URlVOQzogTElORU5PIGZvciB0aGlzICovCisJc2hvcnQgdHlwZTsJCQkvKiBvcGVyYXRpb24gdHlwZSwgc2VlIGJlbG93ICovCisJdW5pb24geyAvKiBXQVJOSU5HOiBuZXd0cCgpLCB0Y29weSgpIHVzZSBldmFsZmxhZ3MgPSAwIHRvIGNsZWFyIHVuaW9uICovCisJCXNob3J0IGV2YWxmbGFnczsJLyogVENPTTogYXJnIGV4cGFuc2lvbiBldmFsKCkgZmxhZ3MgKi8KKwkJc2hvcnQga3NoX2Z1bmM7CQkvKiBURlVOQzogZnVuY3Rpb24geCAodnMgeCgpKSAqLworCX0gdTsKK307CisKKy8qIFRyZWUudHlwZSB2YWx1ZXMgKi8KKyNkZWZpbmUgVEVPRgkJMAorI2RlZmluZSBUQ09NCQkxCS8qIGNvbW1hbmQgKi8KKyNkZWZpbmUgVFBBUkVOCQkyCS8qIChjLWxpc3QpICovCisjZGVmaW5lIFRQSVBFCQkzCS8qIGEgfCBiICovCisjZGVmaW5lIFRMSVNUCQk0CS8qIGEgOyBiICovCisjZGVmaW5lIFRPUgkJNQkvKiB8fCAqLworI2RlZmluZSBUQU5ECQk2CS8qICYmICovCisjZGVmaW5lIFRCQU5HCQk3CS8qICEgKi8KKyNkZWZpbmUgVERCUkFDS0VUCTgJLyogW1sgLi4gXV0gKi8KKyNkZWZpbmUgVEZPUgkJOQorI2RlZmluZSBUU0VMRUNUCQkxMAorI2RlZmluZSBUQ0FTRQkJMTEKKyNkZWZpbmUgVElGCQkxMgorI2RlZmluZSBUV0hJTEUJCTEzCisjZGVmaW5lIFRVTlRJTAkJMTQKKyNkZWZpbmUgVEVMSUYJCTE1CisjZGVmaW5lIFRQQVQJCTE2CS8qIHBhdHRlcm4gaW4gY2FzZSAqLworI2RlZmluZSBUQlJBQ0UJCTE3CS8qIHtjLWxpc3R9ICovCisjZGVmaW5lIFRBU1lOQwkJMTgJLyogYyAmICovCisjZGVmaW5lIFRGVU5DVAkJMTkJLyogZnVuY3Rpb24gbmFtZSB7IGNvbW1hbmQ7IH0gKi8KKyNkZWZpbmUgVFRJTUUJCTIwCS8qIHRpbWUgcGlwZWxpbmUgKi8KKyNkZWZpbmUgVEVYRUMJCTIxCS8qIGZvcmsvZXhlYyBldmFsJ2QgVENPTSAqLworI2RlZmluZSBUQ09QUk9DCQkyMgkvKiBjb3Byb2Nlc3MgfCYgKi8KKworLyoKKyAqIHByZWZpeCBjb2RlcyBmb3Igd29yZHMgaW4gY29tbWFuZCB0cmVlCisgKi8KKyNkZWZpbmUgRU9TCTAJLyogZW5kIG9mIHN0cmluZyAqLworI2RlZmluZSBDSEFSCTEJLyogdW5xdW90ZWQgY2hhcmFjdGVyICovCisjZGVmaW5lIFFDSEFSCTIJLyogcXVvdGVkIGNoYXJhY3RlciAqLworI2RlZmluZSBDT01TVUIJMwkvKiAkKCkgc3Vic3RpdHV0aW9uICgwIHRlcm1pbmF0ZWQpICovCisjZGVmaW5lIEVYUFJTVUIJNAkvKiAkKCgpKSBzdWJzdGl0dXRpb24gKDAgdGVybWluYXRlZCkgKi8KKyNkZWZpbmUgT1FVT1RFCTUJLyogb3BlbmluZyAiIG9yICcgKi8KKyNkZWZpbmUgQ1FVT1RFCTYJLyogY2xvc2luZyAiIG9yICcgKi8KKyNkZWZpbmUgT1NVQlNUCTcJLyogb3BlbmluZyAkeyBzdWJzdCAoZm9sbG93ZWQgYnkgeyBvciBYKSAqLworI2RlZmluZSBDU1VCU1QJOAkvKiBjbG9zaW5nIH0gb2YgYWJvdmUgKGZvbGxvd2VkIGJ5IH0gb3IgWCkgKi8KKyNkZWZpbmUgT1BBVAk5CS8qIG9wZW4gcGF0dGVybjogKigsIEAoLCBldGMuICovCisjZGVmaW5lIFNQQVQJMTAJLyogc2VwYXJhdGUgcGF0dGVybjogfCAqLworI2RlZmluZSBDUEFUCTExCS8qIGNsb3NlIHBhdHRlcm46ICkgKi8KKyNkZWZpbmUgQURFTElNCTEyCS8qIGFyYml0cmFyeSBkZWxpbWl0ZXI6ICR7Zm9vOjI6M30gJHtmb28vYmFyL2Jhen0gKi8KKworLyoKKyAqIElPIHJlZGlyZWN0aW9uCisgKi8KK3N0cnVjdCBpb3dvcmQgeworCWludAl1bml0OwkvKiB1bml0IGFmZmVjdGVkICovCisJaW50CWZsYWc7CS8qIGFjdGlvbiAoYmVsb3cpICovCisJY2hhcgkqbmFtZTsJLyogZmlsZSBuYW1lICh1bnVzZWQgaWYgaGVyZWRvYykgKi8KKwljaGFyCSpkZWxpbTsJLyogZGVsaW1pdGVyIGZvciA8PCw8PC0gKi8KKwljaGFyCSpoZXJlZG9jOy8qIGNvbnRlbnQgb2YgaGVyZWRvYyAqLworfTsKKworLyogaW93b3JkLmZsYWcgLSB0eXBlIG9mIHJlZGlyZWN0aW9uICovCisjZGVmaW5lIElPVFlQRQkweEYJLyogdHlwZTogYml0cyAwOjMgKi8KKyNkZWZpbmUgSU9SRUFECTB4MQkvKiA8ICovCisjZGVmaW5lIElPV1JJVEUJMHgyCS8qID4gKi8KKyNkZWZpbmUgSU9SRFdSCTB4MwkvKiA8PjogdG9kbyAqLworI2RlZmluZSBJT0hFUkUJMHg0CS8qIDw8IChoZXJlIGZpbGUpICovCisjZGVmaW5lIElPQ0FUCTB4NQkvKiA+PiAqLworI2RlZmluZSBJT0RVUAkweDYJLyogPCYvPiYgKi8KKyNkZWZpbmUgSU9FVkFMCUJJVCg0KQkvKiBleHBhbmQgaW4gPDwgKi8KKyNkZWZpbmUgSU9TS0lQCUJJVCg1KQkvKiA8PC0sIHNraXAgXlx0KiAqLworI2RlZmluZSBJT0NMT0IJQklUKDYpCS8qID58LCBvdmVycmlkZSAtbyBub2Nsb2JiZXIgKi8KKyNkZWZpbmUgSU9SRFVQCUJJVCg3KQkvKiB4PCZ5IChhcyBvcHBvc2VkIHRvIHg+JnkpICovCisjZGVmaW5lIElPTkFNRVhQIEJJVCg4KQkvKiBuYW1lIGhhcyBiZWVuIGV4cGFuZGVkICovCisjZGVmaW5lIElPQkFTSAlCSVQoOSkJLyogJj4gZXRjLiAqLworCisvKiBleGVjdXRlL2V4Y2hpbGQgZmxhZ3MgKi8KKyNkZWZpbmUgWEVYRUMJQklUKDApCQkvKiBleGVjdXRlIHdpdGhvdXQgZm9ya2luZyAqLworI2RlZmluZSBYRk9SSwlCSVQoMSkJCS8qIGZvcmsgYmVmb3JlIGV4ZWN1dGluZyAqLworI2RlZmluZSBYQkdORAlCSVQoMikJCS8qIGNvbW1hbmQgJiAqLworI2RlZmluZSBYUElQRUkJQklUKDMpCQkvKiBpbnB1dCBpcyBwaXBlICovCisjZGVmaW5lIFhQSVBFTwlCSVQoNCkJCS8qIG91dHB1dCBpcyBwaXBlICovCisjZGVmaW5lIFhQSVBFCShYUElQRUl8WFBJUEVPKQkvKiBtZW1iZXIgb2YgcGlwZSAqLworI2RlZmluZSBYWENPTQlCSVQoNSkJCS8qIGAuLi5gIGNvbW1hbmQgKi8KKyNkZWZpbmUgWFBDTE9TRQlCSVQoNikJCS8qIGV4Y2hpbGQ6IGNsb3NlIGNsb3NlX2ZkIGluIHBhcmVudCAqLworI2RlZmluZSBYQ0NMT1NFCUJJVCg3KQkJLyogZXhjaGlsZDogY2xvc2UgY2xvc2VfZmQgaW4gY2hpbGQgKi8KKyNkZWZpbmUgWEVSUk9LCUJJVCg4KQkJLyogbm9uLXplcm8gZXhpdCBvayAoZm9yIHNldCAtZSkgKi8KKyNkZWZpbmUgWENPUFJPQyBCSVQoOSkJCS8qIHN0YXJ0aW5nIGEgY28tcHJvY2VzcyAqLworI2RlZmluZSBYVElNRQlCSVQoMTApCQkvKiB0aW1pbmcgVENPTSBjb21tYW5kICovCisKKy8qCisgKiBmbGFncyB0byBjb250cm9sIGV4cGFuc2lvbiBvZiB3b3JkcyAoYXNzdW1lZCBieSB0LT5ldmFsZmxhZ3MgdG8gZml0CisgKiBpbiBhIHNob3J0KQorICovCisjZGVmaW5lIERPQkxBTksJQklUKDApCQkvKiBwZXJmb3JtIGJsYW5rIGludGVycHJldGF0aW9uICovCisjZGVmaW5lIERPR0xPQglCSVQoMSkJCS8qIGV4cGFuZCBbPyogKi8KKyNkZWZpbmUgRE9QQVQJQklUKDIpCQkvKiBxdW90ZSAqP1sgKi8KKyNkZWZpbmUgRE9USUxERQlCSVQoMykJCS8qIG5vcm1hbCB+IGV4cGFuc2lvbiAoZmlyc3QgY2hhcikgKi8KKyNkZWZpbmUgRE9OVFJVTkNPTU1BTkQgQklUKDQpCS8qIGRvIG5vdCBydW4gJChjb21tYW5kKSB0aGluZ3MgKi8KKyNkZWZpbmUgRE9BU05USUxERSBCSVQoNSkJLyogYXNzaWdubWVudCB+IGV4cGFuc2lvbiAoYWZ0ZXIgPSwgOikgKi8KKyNkZWZpbmUgRE9CUkFDRV8gQklUKDYpCQkvKiB1c2VkIGJ5IGV4cGFuZCgpOiBkbyBicmFjZSBleHBhbnNpb24gKi8KKyNkZWZpbmUgRE9NQUdJQ18gQklUKDcpCQkvKiB1c2VkIGJ5IGV4cGFuZCgpOiBzdHJpbmcgY29udGFpbnMgTUFHSUMgKi8KKyNkZWZpbmUgRE9URU1QXwlCSVQoOCkJCS8qIGRpdHRvIDogaW4gd29yZCBwYXJ0IG9mICR7Li5bJSM9P10uLn0gKi8KKyNkZWZpbmUgRE9WQUNIRUNLIEJJVCg5KQkvKiB2YXIgYXNzaWduIGNoZWNrIChmb3IgdHlwZXNldCwgc2V0LCBldGMpICovCisjZGVmaW5lIERPTUFSS0RJUlMgQklUKDEwKQkvKiBmb3JjZSBtYXJrZGlycyBiZWhhdmlvdXIgKi8KKworLyoKKyAqIFRoZSBhcmd1bWVudHMgb2YgW1sgLi4gXV0gZXhwcmVzc2lvbnMgYXJlIGtlcHQgaW4gdC0+YXJnc1tdIGFuZCBmbGFncworICogaW5kaWNhdGluZyBob3cgdGhlIGFyZ3VtZW50cyBoYXZlIGJlZW4gbXVuZ2VkIGFyZSBrZXB0IGluIHQtPnZhcnNbXS4KKyAqIFRoZSBjb250ZW50cyBvZiB0LT52YXJzW10gYXJlIHN0dWZmZWQgc3RyaW5ncyAoc28gdGhleSBjYW4gYmUgdHJlYXRlZAorICogbGlrZSBhbGwgb3RoZXIgdC0+dmFyc1tdKSBpbiB3aGljaCB0aGUgc2Vjb25kIGNoYXJhY3RlciBpcyB0aGUgb25lIHRoYXQKKyAqIGlzIGV4YW1pbmVkLiBUaGUgREJfKiBkZWZpbmVzIGFyZSB0aGUgdmFsdWVzIGZvciB0aGVzZSBzZWNvbmQgY2hhcmFjdGVycy4KKyAqLworI2RlZmluZSBEQl9OT1JNCTEJLyogbm9ybWFsIGFyZ3VtZW50ICovCisjZGVmaW5lIERCX09SCTIJLyogfHwgLT4gLW8gY29udmVyc2lvbiAqLworI2RlZmluZSBEQl9BTkQJMwkvKiAmJiAtPiAtYSBjb252ZXJzaW9uICovCisjZGVmaW5lIERCX0JFCTQJLyogYW4gaW5zZXJ0ZWQgLUJFICovCisjZGVmaW5lIERCX1BBVAk1CS8qIGEgcGF0dGVybiBhcmd1bWVudCAqLworCisjZGVmaW5lIFhfRVhUUkEJOAkvKiB0aGlzIG1hbnkgZXh0cmEgYnl0ZXMgaW4gWCBzdHJpbmcgKi8KKwordHlwZWRlZiBzdHJ1Y3QgWFN0cmluZyB7CisJY2hhciAqZW5kLCAqYmVnOwkvKiBlbmQsIGJlZ2luIG9mIHN0cmluZyAqLworCXNpemVfdCBsZW47CQkvKiBsZW5ndGggKi8KKwlBcmVhICphcmVhcDsJCS8qIGFyZWEgdG8gYWxsb2NhdGUvZnJlZSBmcm9tICovCit9IFhTdHJpbmc7CisKK3R5cGVkZWYgY2hhciAqWFN0cmluZ1A7CisKKy8qIGluaXRpYWxpc2UgZXhwYW5kYWJsZSBzdHJpbmcgKi8KKyNkZWZpbmUgWGluaXROKHhzLCBsZW5ndGgsIGFyZWEpIGRvIHsJCQkJXAorCSh4cykubGVuID0gKGxlbmd0aCk7CQkJCQlcCisJKHhzKS5hcmVhcCA9IChhcmVhKTsJCQkJCVwKKwkoeHMpLmJlZyA9IGFsbG9jKCh4cykubGVuICsgWF9FWFRSQSwgKHhzKS5hcmVhcCk7CVwKKwkoeHMpLmVuZCA9ICh4cykuYmVnICsgKHhzKS5sZW47CQkJCVwKK30gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorI2RlZmluZSBYaW5pdCh4cywgeHAsIGxlbmd0aCwgYXJlYSkgZG8gewkJCVwKKwlYaW5pdE4oKHhzKSwgKGxlbmd0aCksIChhcmVhKSk7CQkJCVwKKwkoeHApID0gKHhzKS5iZWc7CQkJCQlcCit9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKworLyogc3R1ZmYgY2hhciBpbnRvIHN0cmluZyAqLworI2RlZmluZSBYcHV0KHhzLCB4cCwgYykJKCp4cCsrID0gKGMpKQorCisvKiBjaGVjayBpZiB0aGVyZSBhcmUgYXQgbGVhc3QgbiBieXRlcyBsZWZ0ICovCisjZGVmaW5lIFhjaGVja04oeHMsIHhwLCBuKSBkbyB7CQkJCQlcCisJaW50IG1vcmUgPSAoKHhwKSArIChuKSkgLSAoeHMpLmVuZDsJCQlcCisJaWYgKG1vcmUgPiAwKQkJCQkJCVwKKwkJKHhwKSA9IFhjaGVja19ncm93XygmKHhzKSwgKHhwKSwgbW9yZSk7CQlcCit9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKKworLyogY2hlY2sgZm9yIG92ZXJmbG93LCBleHBhbmQgc3RyaW5nICovCisjZGVmaW5lIFhjaGVjayh4cywgeHApCVhjaGVja04oKHhzKSwgKHhwKSwgMSkKKworLyogZnJlZSBzdHJpbmcgKi8KKyNkZWZpbmUgWGZyZWUoeHMsIHhwKQlhZnJlZSgoeHMpLmJlZywgKHhzKS5hcmVhcCkKKworLyogY2xvc2UsIHJldHVybiBzdHJpbmcgKi8KKyNkZWZpbmUgWGNsb3NlKHhzLCB4cCkJYXJlc2l6ZSgoeHMpLmJlZywgKHhwKSAtICh4cykuYmVnLCAoeHMpLmFyZWFwKQorCisvKiBiZWdpbiBvZiBzdHJpbmcgKi8KKyNkZWZpbmUgWHN0cmluZyh4cywgeHApCSgoeHMpLmJlZykKKworI2RlZmluZSBYbmxlZnQoeHMsIHhwKQkoKHhzKS5lbmQgLSAoeHApKQkvKiBtYXkgYmUgbGVzcyB0aGFuIDAgKi8KKyNkZWZpbmUgWGxlbmd0aCh4cywgeHApCSgoeHApIC0gKHhzKS5iZWcpCisjZGVmaW5lIFhzaXplKHhzLCB4cCkJKCh4cykuZW5kIC0gKHhzKS5iZWcpCisjZGVmaW5lIFhzYXZlcG9zKHhzLCB4cCkJKCh4cCkgLSAoeHMpLmJlZykKKyNkZWZpbmUgWHJlc3Rwb3MoeHMsIHhwLCBuKQkoKHhzKS5iZWcgKyAobikpCisKK2NoYXIgKlhjaGVja19ncm93XyhYU3RyaW5nICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50KTsKKworLyoKKyAqIGV4cGFuZGFibGUgdmVjdG9yIG9mIGdlbmVyaWMgcG9pbnRlcnMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBYUHRyViB7CisJdm9pZCAqKmN1cjsJCS8qIG5leHQgYXZhaWwgcG9pbnRlciAqLworCXZvaWQgKipiZWcsICoqZW5kOwkvKiBiZWdpbiwgZW5kIG9mIHZlY3RvciAqLworfSBYUHRyVjsKKworI2RlZmluZSBYUGluaXQoeCwgbikgZG8gewkJCQkJXAorCXZvaWQgKip2cF9fOwkJCQkJCVwKKwl2cF9fID0gYWxsb2MoKG4pICogc2l6ZW9mKHZvaWQgKiksIEFURU1QKTsJCVwKKwkoeCkuY3VyID0gKHgpLmJlZyA9IHZwX187CQkJCVwKKwkoeCkuZW5kID0gdnBfXyArIChuKTsJCQkJCVwKK30gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQorCisjZGVmaW5lIFhQcHV0KHgsIHApIGRvIHsJCQkJCVwKKwlpZiAoKHgpLmN1ciA+PSAoeCkuZW5kKSB7CQkJCVwKKwkJc2l6ZV90IG4gPSBYUHNpemUoeCk7CQkJCVwKKwkJKHgpLmJlZyA9IGFyZXNpemUoKHgpLmJlZywJCQlcCisJCSAgICBuICogMiAqIHNpemVvZih2b2lkICopLCBBVEVNUCk7CQlcCisJCSh4KS5jdXIgPSAoeCkuYmVnICsgbjsJCQkJXAorCQkoeCkuZW5kID0gKHgpLmN1ciArIG47CQkJCVwKKwl9CQkJCQkJCVwKKwkqKHgpLmN1cisrID0gKHApOwkJCQkJXAorfSB3aGlsZSAoLyogQ09OU1RDT05EICovIDApCisKKyNkZWZpbmUgWFBwdHJ2KHgpCSgoeCkuYmVnKQorI2RlZmluZSBYUHNpemUoeCkJKCh4KS5jdXIgLSAoeCkuYmVnKQorI2RlZmluZSBYUGNsb3NlKHgpCWFyZXNpemUoKHgpLmJlZywgWFBzaXplKHgpICogc2l6ZW9mKHZvaWQgKiksIEFURU1QKQorI2RlZmluZSBYUGZyZWUoeCkJYWZyZWUoKHgpLmJlZywgQVRFTVApCisKKyNkZWZpbmUgSURFTlQJNjQKKwordHlwZWRlZiBzdHJ1Y3Qgc291cmNlIFNvdXJjZTsKK3N0cnVjdCBzb3VyY2UgeworCWNvbnN0IGNoYXIgKnN0cjsJLyogaW5wdXQgcG9pbnRlciAqLworCWNvbnN0IGNoYXIgKnN0YXJ0OwkvKiBzdGFydCBvZiBjdXJyZW50IGJ1ZmZlciAqLworCXVuaW9uIHsKKwkJY29uc3QgY2hhciAqKnN0cnY7CS8qIHN0cmluZyBbXSAqLworCQlzdHJ1Y3Qgc2hmICpzaGY7CS8qIHNoZWxsIGZpbGUgKi8KKwkJc3RydWN0IHRibCAqdGJscDsJLyogYWxpYXMgKFNGX0hBU0FMSUFTKSAqLworCQljaGFyICpmcmVlbWU7CQkvKiBhbHNvIGZvciBTUkVSRUFEICovCisJfSB1OworCWNvbnN0IGNoYXIgKmZpbGU7CS8qIGlucHV0IGZpbGUgbmFtZSAqLworCWludAl0eXBlOwkJLyogaW5wdXQgdHlwZSAqLworCWludAlsaW5lOwkJLyogbGluZSBudW1iZXIgKi8KKwlpbnQJZXJybGluZTsJLyogbGluZSB0aGUgZXJyb3Igb2NjdXJyZWQgb24gKDAgaWYgbm90IHNldCkgKi8KKwlpbnQJZmxhZ3M7CQkvKiBTRl8qICovCisJQXJlYQkqYXJlYXA7CisJU291cmNlICpuZXh0OwkJLyogc3RhY2tlZCBzb3VyY2UgKi8KKwlYU3RyaW5nCXhzOwkJLyogaW5wdXQgYnVmZmVyICovCisJY2hhcgl1Z2J1ZlsyXTsJLyogYnVmZmVyIGZvciB1bmdldHNjKCkgKFNSRVJFQUQpIGFuZAorCQkJCSAqIGFsaWFzIChTQUxJQVMpICovCit9OworCisvKiBTb3VyY2UudHlwZSB2YWx1ZXMgKi8KKyNkZWZpbmUgU0VPRgkJMAkvKiBpbnB1dCBFT0YgKi8KKyNkZWZpbmUgU0ZJTEUJCTEJLyogZmlsZSBpbnB1dCAqLworI2RlZmluZSBTU1RESU4JCTIJLyogcmVhZCBzdGRpbiAqLworI2RlZmluZSBTU1RSSU5HCQkzCS8qIHN0cmluZyAqLworI2RlZmluZSBTV1NUUgkJNAkvKiBzdHJpbmcgd2l0aG91dCBcbiAqLworI2RlZmluZSBTV09SRFMJCTUJLyogc3RyaW5nW10gKi8KKyNkZWZpbmUgU1dPUkRTRVAJNgkvKiBzdHJpbmdbXSBzZXBhcmF0b3IgKi8KKyNkZWZpbmUgU0FMSUFTCQk3CS8qIGFsaWFzIGV4cGFuc2lvbiAqLworI2RlZmluZSBTUkVSRUFECQk4CS8qIHJlYWQgYWhlYWQgdG8gYmUgcmUtc2Nhbm5lZCAqLworCisvKiBTb3VyY2UuZmxhZ3MgdmFsdWVzICovCisjZGVmaW5lIFNGX0VDSE8JCUJJVCgwKQkvKiBlY2hvIGlucHV0IHRvIHNobG91dCAqLworI2RlZmluZSBTRl9BTElBUwlCSVQoMSkJLyogZmFraW5nIHNwYWNlIGF0IGVuZCBvZiBhbGlhcyAqLworI2RlZmluZSBTRl9BTElBU0VORAlCSVQoMikJLyogZmFraW5nIHNwYWNlIGF0IGVuZCBvZiBhbGlhcyAqLworI2RlZmluZSBTRl9UVFkJCUJJVCgzKQkvKiB0eXBlID09IFNTVERJTiAmIGl0IGlzIGEgdHR5ICovCisjZGVmaW5lIFNGX0ZJUlNUCUJJVCg0KQkvKiBpbml0aWFsIHN0YXRlICh0byBpZ25vcmUgVVRGLTggQk9NKSAqLworI2RlZmluZSBTRl9IQVNBTElBUwlCSVQoNSkJLyogdS50YmxwIHZhbGlkIChTQUxJQVMsIFNFT0YpICovCisKK3R5cGVkZWYgdW5pb24geworCWludCBpOworCWNoYXIgKmNwOworCWNoYXIgKip3cDsKKwlzdHJ1Y3Qgb3AgKm87CisJc3RydWN0IGlvd29yZCAqaW9wOworfSBZWVNUWVBFOworCisvKiBJZiBzb21ldGhpbmcgaXMgYWRkZWQgaGVyZSwgYWRkIGl0IHRvIHRva2VudGFiW10gaW4gc3luLmMgYXMgd2VsbCAqLworI2RlZmluZSBMV09SRAkJMjU2CisjZGVmaW5lIExPR0FORAkJMjU3CS8qICYmICovCisjZGVmaW5lIExPR09SCQkyNTgJLyogfHwgKi8KKyNkZWZpbmUgQlJFQUsJCTI1OQkvKiA7OyAqLworI2RlZmluZSBJRgkJMjYwCisjZGVmaW5lIFRIRU4JCTI2MQorI2RlZmluZSBFTFNFCQkyNjIKKyNkZWZpbmUgRUxJRgkJMjYzCisjZGVmaW5lIEZJCQkyNjQKKyNkZWZpbmUgQ0FTRQkJMjY1CisjZGVmaW5lIEVTQUMJCTI2NgorI2RlZmluZSBGT1IJCTI2NworI2RlZmluZSBTRUxFQ1QJCTI2OAorI2RlZmluZSBXSElMRQkJMjY5CisjZGVmaW5lIFVOVElMCQkyNzAKKyNkZWZpbmUgRE8JCTI3MQorI2RlZmluZSBET05FCQkyNzIKKyNkZWZpbmUgSU4JCTI3MworI2RlZmluZSBGVU5DVElPTgkyNzQKKyNkZWZpbmUgVElNRQkJMjc1CisjZGVmaW5lIFJFRElSCQkyNzYKKyNkZWZpbmUgTURQQVJFTgkJMjc3CS8qICgoICkpICovCisjZGVmaW5lIEJBTkcJCTI3OAkvKiAhICovCisjZGVmaW5lIERCUkFDS0VUCTI3OQkvKiBbWyAuLiBdXSAqLworI2RlZmluZSBDT1BST0MJCTI4MAkvKiB8JiAqLworI2RlZmluZSBZWUVSUkNPREUJMzAwCisKKy8qIGZsYWdzIHRvIHl5bGV4ICovCisjZGVmaW5lIENPTlRJTgkJQklUKDApCS8qIHNraXAgbmV3IGxpbmVzIHRvIGNvbXBsZXRlIGNvbW1hbmQgKi8KKyNkZWZpbmUgT05FV09SRAkJQklUKDEpCS8qIHNpbmdsZSB3b3JkIGZvciBzdWJzdGl0dXRlKCkgKi8KKyNkZWZpbmUgQUxJQVMJCUJJVCgyKQkvKiByZWNvZ25pc2UgYWxpYXMgKi8KKyNkZWZpbmUgS0VZV09SRAkJQklUKDMpCS8qIHJlY29nbmlzZSBrZXl3b3JkcyAqLworI2RlZmluZSBMRVRFWFBSCQlCSVQoNCkJLyogZ2V0IGV4cHJlc3Npb24gaW5zaWRlICgoICkpICovCisjZGVmaW5lIFZBUkFTTgkJQklUKDUpCS8qIGNoZWNrIGZvciB2YXI9d29yZCAqLworI2RlZmluZSBBUlJBWVZBUglCSVQoNikJLyogcGFyc2UgeFsxICYgMl0gYXMgb25lIHdvcmQgKi8KKyNkZWZpbmUgRVNBQ09OTFkJQklUKDcpCS8qIG9ubHkgYWNjZXB0IGVzYWMga2V5d29yZCAqLworI2RlZmluZSBDTURXT1JECQlCSVQoOCkJLyogcGFyc2luZyBzaW1wbGUgY29tbWFuZCAoYWxpYXMgcmVsYXRlZCkgKi8KKyNkZWZpbmUgSEVSRURFTElNCUJJVCg5KQkvKiBwYXJzaW5nIDw8LDw8LSBkZWxpbWl0ZXIgKi8KKyNkZWZpbmUgTFFDSEFSCQlCSVQoMTApCS8qIHNvdXJjZSBzdHJpbmcgY29udGFpbnMgUUNIQVIgKi8KKyNkZWZpbmUgSEVSRURPQwkJQklUKDExKQkvKiBwYXJzaW5nIGEgaGVyZSBkb2N1bWVudCAqLworI2RlZmluZSBMRVRBUlJBWQlCSVQoMTIpCS8qIGNvcHkgZXhwcmVzc2lvbiBpbnNpZGUgPSggKSAqLworCisjZGVmaW5lIEhFUkVTCTEwCQkvKiBtYXggPDwgaW4gbGluZSAqLworCisjdW5kZWYgQ1RSTAorI2RlZmluZQlDVFJMKHgpCQkoKHgpID09ICc/JyA/IDB4N0YgOiAoeCkgJiAweDFGKQkvKiBBU0NJSSAqLworI2RlZmluZQlVTkNUUkwoeCkJKCh4KSBeIDB4NDApCQkJCS8qIEFTQ0lJICovCisKK0VYVEVSTiBTb3VyY2UgKnNvdXJjZTsJCS8qIHl5cGFyc2UveXlsZXggc291cmNlICovCitFWFRFUk4gWVlTVFlQRQl5eWx2YWw7CQkvKiByZXN1bHQgZnJvbSB5eWxleCAqLworRVhURVJOIHN0cnVjdCBpb3dvcmQgKmhlcmVzIFtIRVJFU10sICoqaGVyZXA7CitFWFRFUk4gY2hhcglpZGVudCBbSURFTlQrMV07CisKKyNkZWZpbmUgSElTVE9SWVNJWkUJNTAwCS8qIHNpemUgb2Ygc2F2ZWQgaGlzdG9yeSAqLworCitFWFRFUk4gY2hhciAqKmhpc3Rvcnk7CS8qIHNhdmVkIGNvbW1hbmRzICovCitFWFRFUk4gY2hhciAqKmhpc3RwdHI7CS8qIGxhc3QgaGlzdG9yeSBpdGVtICovCitFWFRFUk4gaW50IGhpc3RzaXplOwkvKiBoaXN0b3J5IHNpemUgKi8KKworLyogdXNlciBhbmQgc3lzdGVtIHRpbWUgb2YgbGFzdCBqX3dhaXRqZWQgam9iICovCitFWFRFUk4gc3RydWN0IHRpbWV2YWwgal91c3J0aW1lLCBqX3N5c3RpbWU7CisKKy8qIGxhbGxvYy5jICovCit2b2lkIGFpbml0KEFyZWEgKik7Cit2b2lkIGFmcmVlYWxsKEFyZWEgKik7CisvKiB0aGVzZSBjYW5ub3QgZmFpbCBhbmQgY2FuIHRha2UgTlVMTCAobm90IGZvciBhcCkgKi8KKyNkZWZpbmUgYWxsb2MobiwgYXApCWFyZXNpemUoTlVMTCwgKG4pLCAoYXApKQordm9pZCAqYXJlc2l6ZSh2b2lkICosIHNpemVfdCwgQXJlYSAqKTsKK3ZvaWQgYWZyZWUodm9pZCAqLCBBcmVhICopOwkvKiBjYW4gdGFrZSBOVUxMICovCisvKiBlZGl0LmMgKi8KKyNpZm5kZWYgTUtTSF9TTUFMTAoraW50IHhfYmluZChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbCwgYm9vbCk7CisjZWxzZQoraW50IHhfYmluZChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbCk7CisjZW5kaWYKK3ZvaWQgeF9pbml0KHZvaWQpOworaW50IHhfcmVhZChjaGFyICosIHNpemVfdCk7CisvKiBldmFsLmMgKi8KK2NoYXIgKnN1YnN0aXR1dGUoY29uc3QgY2hhciAqLCBpbnQpOworY2hhciAqKmV2YWwoY29uc3QgY2hhciAqKiwgaW50KTsKK2NoYXIgKmV2YWxzdHIoY29uc3QgY2hhciAqY3AsIGludCk7CitjaGFyICpldmFsb25lc3RyKGNvbnN0IGNoYXIgKmNwLCBpbnQpOworY2hhciAqZGVidW5rKGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwordm9pZCBleHBhbmQoY29uc3QgY2hhciAqLCBYUHRyViAqLCBpbnQpOworaW50IGdsb2Jfc3RyKGNoYXIgKiwgWFB0clYgKiwgaW50KTsKKy8qIGV4ZWMuYyAqLworaW50IGV4ZWN1dGUoc3RydWN0IG9wICogdm9sYXRpbGUsIHZvbGF0aWxlIGludCwgdm9sYXRpbGUgaW50ICogdm9sYXRpbGUpOworaW50IHNoY29tZXhlYyhjb25zdCBjaGFyICoqKTsKK3N0cnVjdCB0YmwgKmZpbmRmdW5jKGNvbnN0IGNoYXIgKiwgdWludDMyX3QsIGJvb2wpOworaW50IGRlZmluZShjb25zdCBjaGFyICosIHN0cnVjdCBvcCAqKTsKK3ZvaWQgYnVpbHRpbihjb25zdCBjaGFyICosIGludCAoKikoY29uc3QgY2hhciAqKikpOworc3RydWN0IHRibCAqZmluZGNvbShjb25zdCBjaGFyICosIGludCk7Cit2b2lkIGZsdXNoY29tKGludCk7Citjb25zdCBjaGFyICpzZWFyY2goY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgaW50ICopOworaW50IHNlYXJjaF9hY2Nlc3MoY29uc3QgY2hhciAqLCBpbnQsIGludCAqKTsKK2ludCBwcl9tZW51KGNvbnN0IGNoYXIgKiBjb25zdCAqKTsKK2ludCBwcl9saXN0KGNoYXIgKiBjb25zdCAqKTsKKy8qIGV4cHIuYyAqLworaW50IGV2YWx1YXRlKGNvbnN0IGNoYXIgKiwgbWtzaF9hcmlfdCAqLCBpbnQsIGJvb2wpOworaW50IHZfZXZhbHVhdGUoc3RydWN0IHRibCAqLCBjb25zdCBjaGFyICosIHZvbGF0aWxlIGludCwgYm9vbCk7CisvKiBVVEYtOCBzdHVmZiAqLworc2l6ZV90IHV0Zl9tYnRvd2ModW5zaWduZWQgaW50ICosIGNvbnN0IGNoYXIgKik7CitzaXplX3QgdXRmX3djdG9tYihjaGFyICosIHVuc2lnbmVkIGludCk7CitpbnQgdXRmX3dpZHRoYWRqKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKik7CitpbnQgdXRmX21ic3dpZHRoKGNvbnN0IGNoYXIgKik7Citjb25zdCBjaGFyICp1dGZfc2tpcGNvbHMoY29uc3QgY2hhciAqLCBpbnQpOworc2l6ZV90IHV0Zl9wdHJhZGooY29uc3QgY2hhciAqKTsKKyNpZm5kZWYgTUtTSF9taXJic2Rfd2N3aWR0aAoraW50IHV0Zl93Y3dpZHRoKHVuc2lnbmVkIGludCk7CisjZW5kaWYKKy8qIGZ1bmNzLmMgKi8KK2ludCBjX2hhc2goY29uc3QgY2hhciAqKik7CitpbnQgY19jZChjb25zdCBjaGFyICoqKTsKK2ludCBjX3B3ZChjb25zdCBjaGFyICoqKTsKK2ludCBjX3ByaW50KGNvbnN0IGNoYXIgKiopOworI2lmZGVmIE1LU0hfUFJJTlRGX0JVSUxUSU4KK2ludCBjX3ByaW50Zihjb25zdCBjaGFyICoqKTsKKyNlbmRpZgoraW50IGNfd2hlbmNlKGNvbnN0IGNoYXIgKiopOworaW50IGNfY29tbWFuZChjb25zdCBjaGFyICoqKTsKK2ludCBjX3R5cGVzZXQoY29uc3QgY2hhciAqKik7CitpbnQgY19hbGlhcyhjb25zdCBjaGFyICoqKTsKK2ludCBjX3VuYWxpYXMoY29uc3QgY2hhciAqKik7CitpbnQgY19sZXQoY29uc3QgY2hhciAqKik7CitpbnQgY19qb2JzKGNvbnN0IGNoYXIgKiopOworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKK2ludCBjX2ZnYmcoY29uc3QgY2hhciAqKik7CisjZW5kaWYKK2ludCBjX2tpbGwoY29uc3QgY2hhciAqKik7Cit2b2lkIGdldG9wdHNfcmVzZXQoaW50KTsKK2ludCBjX2dldG9wdHMoY29uc3QgY2hhciAqKik7CitpbnQgY19iaW5kKGNvbnN0IGNoYXIgKiopOworaW50IGNfbGFiZWwoY29uc3QgY2hhciAqKik7CitpbnQgY19zaGlmdChjb25zdCBjaGFyICoqKTsKK2ludCBjX3VtYXNrKGNvbnN0IGNoYXIgKiopOworaW50IGNfZG90KGNvbnN0IGNoYXIgKiopOworaW50IGNfd2FpdChjb25zdCBjaGFyICoqKTsKK2ludCBjX3JlYWQoY29uc3QgY2hhciAqKik7CitpbnQgY19ldmFsKGNvbnN0IGNoYXIgKiopOworaW50IGNfdHJhcChjb25zdCBjaGFyICoqKTsKK2ludCBjX2Jya2NvbnQoY29uc3QgY2hhciAqKik7CitpbnQgY19leGl0cmV0dXJuKGNvbnN0IGNoYXIgKiopOworaW50IGNfc2V0KGNvbnN0IGNoYXIgKiopOworaW50IGNfdW5zZXQoY29uc3QgY2hhciAqKik7CitpbnQgY191bGltaXQoY29uc3QgY2hhciAqKik7CitpbnQgY190aW1lcyhjb25zdCBjaGFyICoqKTsKK2ludCB0aW1leChzdHJ1Y3Qgb3AgKiwgaW50LCB2b2xhdGlsZSBpbnQgKik7Cit2b2lkIHRpbWV4X2hvb2soc3RydWN0IG9wICosIGNoYXIgKiogdm9sYXRpbGUgKik7CitpbnQgY19leGVjKGNvbnN0IGNoYXIgKiopOworaW50IGNfYnVpbHRpbihjb25zdCBjaGFyICoqKTsKK2ludCBjX3Rlc3QoY29uc3QgY2hhciAqKik7CisjaWYgSEFWRV9NS05PRAoraW50IGNfbWtub2QoY29uc3QgY2hhciAqKik7CisjZW5kaWYKK2ludCBjX3JlYWxwYXRoKGNvbnN0IGNoYXIgKiopOworaW50IGNfcmVuYW1lKGNvbnN0IGNoYXIgKiopOworLyogaGlzdHJhcC5jICovCit2b2lkIGluaXRfaGlzdHZlYyh2b2lkKTsKK3ZvaWQgaGlzdF9pbml0KFNvdXJjZSAqKTsKKyNpZiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQordm9pZCBoaXN0X2ZpbmlzaCh2b2lkKTsKKyNlbmRpZgordm9pZCBoaXN0c2F2ZShpbnQgKiwgY29uc3QgY2hhciAqLCBib29sLCBib29sKTsKKyNpZiAhZGVmaW5lZChNS1NIX1NNQUxMKSAmJiBIQVZFX1BFUlNJU1RFTlRfSElTVE9SWQorYm9vbCBoaXN0c3luYyh2b2lkKTsKKyNlbmRpZgoraW50IGNfZmMoY29uc3QgY2hhciAqKik7Cit2b2lkIHNldGhpc3RzaXplKGludCk7CisjaWYgSEFWRV9QRVJTSVNURU5UX0hJU1RPUlkKK3ZvaWQgc2V0aGlzdGZpbGUoY29uc3QgY2hhciAqKTsKKyNlbmRpZgorY2hhciAqKmhpc3Rwb3Modm9pZCk7CitpbnQgaGlzdG51bShpbnQpOworaW50IGZpbmRoaXN0KGludCwgaW50LCBjb25zdCBjaGFyICosIGludCk7CitpbnQgZmluZGhpc3RyZWwoY29uc3QgY2hhciAqKTsKK2NoYXIgKipoaXN0X2dldF9uZXdlc3QoYm9vbCk7Cit2b2lkIGluaXR0cmFwcyh2b2lkKTsKK3ZvaWQgYWxhcm1faW5pdCh2b2lkKTsKK1RyYXAgKmdldHRyYXAoY29uc3QgY2hhciAqLCBpbnQpOwordm9pZCB0cmFwc2lnKGludCk7Cit2b2lkIGludHJjaGVjayh2b2lkKTsKK2ludCBmYXRhbF90cmFwX2NoZWNrKHZvaWQpOworaW50IHRyYXBfcGVuZGluZyh2b2lkKTsKK3ZvaWQgcnVudHJhcHMoaW50IGludHIpOwordm9pZCBydW50cmFwKFRyYXAgKik7Cit2b2lkIGNsZWFydHJhcHModm9pZCk7Cit2b2lkIHJlc3RvcmVzaWdzKHZvaWQpOwordm9pZCBzZXR0cmFwKFRyYXAgKiwgY29uc3QgY2hhciAqKTsKK2ludCBibG9ja19waXBlKHZvaWQpOwordm9pZCByZXN0b3JlX3BpcGUoaW50KTsKK2ludCBzZXRzaWcoVHJhcCAqLCBzaWdfdCwgaW50KTsKK3ZvaWQgc2V0ZXhlY3NpZyhUcmFwICosIGludCk7CisvKiBqb2JzLmMgKi8KK3ZvaWQgal9pbml0KHZvaWQpOwordm9pZCBqX2V4aXQodm9pZCk7CisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAordm9pZCBqX2NoYW5nZSh2b2lkKTsKKyNlbmRpZgoraW50IGV4Y2hpbGQoc3RydWN0IG9wICosIGludCwgdm9sYXRpbGUgaW50ICosIGludCk7Cit2b2lkIHN0YXJ0bGFzdCh2b2lkKTsKK2ludCB3YWl0bGFzdCh2b2lkKTsKK2ludCB3YWl0Zm9yKGNvbnN0IGNoYXIgKiwgaW50ICopOworaW50IGpfa2lsbChjb25zdCBjaGFyICosIGludCk7CisjaWZuZGVmIE1LU0hfVU5FTVBMT1lFRAoraW50IGpfcmVzdW1lKGNvbnN0IGNoYXIgKiwgaW50KTsKKyNlbmRpZgoraW50IGpfam9icyhjb25zdCBjaGFyICosIGludCwgaW50KTsKK2ludCBqX25qb2JzKHZvaWQpOwordm9pZCBqX25vdGlmeSh2b2lkKTsKK3BpZF90IGpfYXN5bmModm9pZCk7CitpbnQgal9zdG9wcGVkX3J1bm5pbmcodm9pZCk7CisvKiBsZXguYyAqLworaW50IHl5bGV4KGludCk7Cit2b2lkIHl5ZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pCisgICAgTUtTSF9BX05PUkVUVVJOCisgICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDIpOworU291cmNlICpwdXNocyhpbnQsIEFyZWEgKik7Cit2b2lkIHNldF9wcm9tcHQoaW50LCBTb3VyY2UgKik7Cit2b2lkIHBwcm9tcHQoY29uc3QgY2hhciAqLCBpbnQpOworaW50IHByb21wdGxlbihjb25zdCBjaGFyICopOworLyogbWFpbi5jICovCitpbnQgaW5jbHVkZShjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKiwgaW50KTsKK2ludCBjb21tYW5kKGNvbnN0IGNoYXIgKiwgaW50KTsKK2ludCBzaGVsbChTb3VyY2UgKnZvbGF0aWxlLCBpbnQgdm9sYXRpbGUpOwordm9pZCB1bndpbmQoaW50KSBNS1NIX0FfTk9SRVRVUk47Cit2b2lkIG5ld2VudihpbnQpOwordm9pZCBxdWl0ZW52KHN0cnVjdCBzaGYgKik7Cit2b2lkIGNsZWFudXBfcGFyZW50c19lbnYodm9pZCk7Cit2b2lkIGNsZWFudXBfcHJvY19lbnYodm9pZCk7Cit2b2lkIGVycm9yZihjb25zdCBjaGFyICosIC4uLikKKyAgICBNS1NIX0FfTk9SRVRVUk4KKyAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMSwgMik7Cit2b2lkIHdhcm5pbmdmKGJvb2wsIGNvbnN0IGNoYXIgKiwgLi4uKQorICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAyLCAzKTsKK3ZvaWQgYmlfZXJyb3JmKGNvbnN0IGNoYXIgKiwgLi4uKQorICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAyKTsKKyNkZWZpbmUgZXJyb3JmeigpCWVycm9yZigiXDEiKQorI2RlZmluZSBiaV9lcnJvcmZ6KCkJYmlfZXJyb3JmKCJcMSIpCit2b2lkIGludGVybmFsX3ZlcnJvcmYoY29uc3QgY2hhciAqLCB2YV9saXN0KQorICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAwKTsKK3ZvaWQgaW50ZXJuYWxfZXJyb3JmKGNvbnN0IGNoYXIgKiwgLi4uKQorICAgIE1LU0hfQV9OT1JFVFVSTgorICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAyKTsKK3ZvaWQgaW50ZXJuYWxfd2FybmluZ2YoY29uc3QgY2hhciAqLCAuLi4pCisgICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDIpOwordm9pZCBlcnJvcl9wcmVmaXgoYm9vbCk7Cit2b2lkIHNoZWxsZihjb25zdCBjaGFyICosIC4uLikKKyAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMSwgMik7Cit2b2lkIHNocHJpbnRmKGNvbnN0IGNoYXIgKiwgLi4uKQorICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAxLCAyKTsKK2ludCBjYW5fc2VlayhpbnQpOwordm9pZCBpbml0aW8odm9pZCk7CitpbnQga3NoX2R1cDIoaW50LCBpbnQsIGJvb2wpOworc2hvcnQgc2F2ZWZkKGludCk7Cit2b2lkIHJlc3RmZChpbnQsIGludCk7Cit2b2lkIG9wZW5waXBlKGludCAqKTsKK3ZvaWQgY2xvc2VwaXBlKGludCAqKTsKK2ludCBjaGVja19mZChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKik7Cit2b2lkIGNvcHJvY19pbml0KHZvaWQpOwordm9pZCBjb3Byb2NfcmVhZF9jbG9zZShpbnQpOwordm9pZCBjb3Byb2NfcmVhZHdfY2xvc2UoaW50KTsKK3ZvaWQgY29wcm9jX3dyaXRlX2Nsb3NlKGludCk7CitpbnQgY29wcm9jX2dldGZkKGludCwgY29uc3QgY2hhciAqKik7Cit2b2lkIGNvcHJvY19jbGVhbnVwKGludCk7CitzdHJ1Y3QgdGVtcCAqbWFrZXRlbXAoQXJlYSAqLCBUZW1wX3R5cGUsIHN0cnVjdCB0ZW1wICoqKTsKKyNkZWZpbmUgaGFzaChzKSBvYWF0aGFzaF9mdWxsKChjb25zdCB1aW50OF90ICopKHMpKQordWludDMyX3Qgb2FhdGhhc2hfZnVsbChyZWdpc3RlciBjb25zdCB1aW50OF90ICopOwordWludDMyX3QgaGFzaG1lbShjb25zdCB2b2lkICosIHNpemVfdCk7Cit2b2lkIGt0aW5pdChzdHJ1Y3QgdGFibGUgKiwgQXJlYSAqLCBzaXplX3QpOworc3RydWN0IHRibCAqa3RzZWFyY2goc3RydWN0IHRhYmxlICosIGNvbnN0IGNoYXIgKiwgdWludDMyX3QpOworc3RydWN0IHRibCAqa3RlbnRlcihzdHJ1Y3QgdGFibGUgKiwgY29uc3QgY2hhciAqLCB1aW50MzJfdCk7CisjZGVmaW5lIGt0ZGVsZXRlKHApCWRvIHsgcC0+ZmxhZyA9IDA7IH0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQordm9pZCBrdHdhbGsoc3RydWN0IHRzdGF0ZSAqLCBzdHJ1Y3QgdGFibGUgKik7CitzdHJ1Y3QgdGJsICprdG5leHQoc3RydWN0IHRzdGF0ZSAqKTsKK3N0cnVjdCB0YmwgKiprdHNvcnQoc3RydWN0IHRhYmxlICopOworLyogbWlzYy5jICovCit2b2lkIHNldGN0eXBlcyhjb25zdCBjaGFyICosIGludCk7Cit2b2lkIGluaXRjdHlwZXModm9pZCk7CitzaXplX3Qgb3B0aW9uKGNvbnN0IGNoYXIgKik7CitjaGFyICpnZXRvcHRpb25zKHZvaWQpOwordm9pZCBjaGFuZ2VfZmxhZyhlbnVtIHNoX2ZsYWcsIGludCwgdW5zaWduZWQgaW50KTsKK2ludCBwYXJzZV9hcmdzKGNvbnN0IGNoYXIgKiosIGludCwgYm9vbCAqKTsKK2ludCBnZXRuKGNvbnN0IGNoYXIgKiwgaW50ICopOworaW50IGJpX2dldG4oY29uc3QgY2hhciAqLCBpbnQgKik7CitpbnQgZ21hdGNoeChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbCk7CitpbnQgaGFzX2dsb2JiaW5nKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgKnBhdF9zY2FuKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQpOworaW50IHhzdHJjbXAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOwordm9pZCBrc2hfZ2V0b3B0X3Jlc2V0KEdldG9wdCAqLCBpbnQpOworaW50IGtzaF9nZXRvcHQoY29uc3QgY2hhciAqKiwgR2V0b3B0ICosIGNvbnN0IGNoYXIgKik7Cit2b2lkIHByaW50X3ZhbHVlX3F1b3RlZChjb25zdCBjaGFyICopOwordm9pZCBwcmludF9jb2x1bW5zKHN0cnVjdCBzaGYgKiwgaW50LAorICAgIGNoYXIgKigqKShjaGFyICosIGludCwgaW50LCBjb25zdCB2b2lkICopLAorICAgIGNvbnN0IHZvaWQgKiwgaW50LCBpbnQsIGJvb2wpOwordm9pZCBzdHJpcF9udWxzKGNoYXIgKiwgaW50KTsKK2ludCBibG9ja2luZ19yZWFkKGludCwgY2hhciAqLCBpbnQpCisgICAgTUtTSF9BX0JPVU5ERUQoYnVmZmVyLCAyLCAzKTsKK2ludCByZXNldF9ub25ibG9jayhpbnQpOworY2hhciAqa3NoX2dldF93ZChzaXplX3QgKik7CitpbnQgbWFrZV9wYXRoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjaGFyICoqLCBYU3RyaW5nICosIGludCAqKTsKK3ZvaWQgc2ltcGxpZnlfcGF0aChjaGFyICopOwordm9pZCBzZXRfY3VycmVudF93ZChjaGFyICopOworI2lmZGVmIE1LU0hfU01BTEwKK2NoYXIgKnN0cmR1cF8oY29uc3QgY2hhciAqLCBBcmVhICopOworY2hhciAqc3RybmR1cF8oY29uc3QgY2hhciAqLCBzaXplX3QsIEFyZWEgKik7CisjZW5kaWYKK2ludCB1bmJrc2woYm9vbCwgaW50ICgqKSh2b2lkKSwgdm9pZCAoKikoaW50KSk7CisvKiBzaGYuYyAqLworc3RydWN0IHNoZiAqc2hmX29wZW4oY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50KTsKK3N0cnVjdCBzaGYgKnNoZl9mZG9wZW4oaW50LCBpbnQsIHN0cnVjdCBzaGYgKik7CitzdHJ1Y3Qgc2hmICpzaGZfcmVvcGVuKGludCwgaW50LCBzdHJ1Y3Qgc2hmICopOworc3RydWN0IHNoZiAqc2hmX3NvcGVuKGNoYXIgKiwgaW50LCBpbnQsIHN0cnVjdCBzaGYgKik7CitpbnQgc2hmX2Nsb3NlKHN0cnVjdCBzaGYgKik7CitpbnQgc2hmX2ZkY2xvc2Uoc3RydWN0IHNoZiAqKTsKK2NoYXIgKnNoZl9zY2xvc2Uoc3RydWN0IHNoZiAqKTsKK2ludCBzaGZfZmx1c2goc3RydWN0IHNoZiAqKTsKK2ludCBzaGZfcmVhZChjaGFyICosIGludCwgc3RydWN0IHNoZiAqKTsKK2NoYXIgKnNoZl9nZXRzZShjaGFyICosIGludCwgc3RydWN0IHNoZiAqKTsKK2ludCBzaGZfZ2V0Y2hhcihzdHJ1Y3Qgc2hmICpzKTsKK2ludCBzaGZfdW5nZXRjKGludCwgc3RydWN0IHNoZiAqKTsKK2ludCBzaGZfcHV0Y2hhcihpbnQsIHN0cnVjdCBzaGYgKik7CitpbnQgc2hmX3B1dHMoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc2hmICopOworaW50IHNoZl93cml0ZShjb25zdCBjaGFyICosIGludCwgc3RydWN0IHNoZiAqKTsKK2ludCBzaGZfZnByaW50ZihzdHJ1Y3Qgc2hmICosIGNvbnN0IGNoYXIgKiwgLi4uKQorICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAyLCAzKTsKK2ludCBzaGZfc25wcmludGYoY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgLi4uKQorICAgIE1LU0hfQV9GT1JNQVQocHJpbnRmLCAzLCA0KQorICAgIE1LU0hfQV9CT1VOREVEKHN0cmluZywgMSwgMik7CitjaGFyICpzaGZfc21wcmludGYoY29uc3QgY2hhciAqLCAuLi4pCisgICAgTUtTSF9BX0ZPUk1BVChwcmludGYsIDEsIDIpOworaW50IHNoZl92ZnByaW50ZihzdHJ1Y3Qgc2hmICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkKKyAgICBNS1NIX0FfRk9STUFUKHByaW50ZiwgMiwgMCk7CisvKiBzeW4uYyAqLwordm9pZCBpbml0a2V5d29yZHModm9pZCk7CitzdHJ1Y3Qgb3AgKmNvbXBpbGUoU291cmNlICopOworLyogdHJlZS5jICovCitpbnQgZnB0cmVlZihzdHJ1Y3Qgc2hmICosIGludCwgY29uc3QgY2hhciAqLCAuLi4pOworY2hhciAqc25wdHJlZWYoY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgLi4uKTsKK3N0cnVjdCBvcCAqdGNvcHkoc3RydWN0IG9wICosIEFyZWEgKik7CitjaGFyICp3ZGNvcHkoY29uc3QgY2hhciAqLCBBcmVhICopOworY29uc3QgY2hhciAqd2RzY2FuKGNvbnN0IGNoYXIgKiwgaW50KTsKK2NoYXIgKndkc3RyaXAoY29uc3QgY2hhciAqLCBib29sLCBib29sKTsKK3ZvaWQgdGZyZWUoc3RydWN0IG9wICosIEFyZWEgKik7CisvKiB2YXIuYyAqLwordm9pZCBuZXdibG9jayh2b2lkKTsKK3ZvaWQgcG9wYmxvY2sodm9pZCk7Cit2b2lkIGluaXR2YXIodm9pZCk7CitzdHJ1Y3QgdGJsICpnbG9iYWwoY29uc3QgY2hhciAqKTsKK3N0cnVjdCB0YmwgKmxvY2FsKGNvbnN0IGNoYXIgKiwgYm9vbCk7CitjaGFyICpzdHJfdmFsKHN0cnVjdCB0YmwgKik7CitpbnQgc2V0c3RyKHN0cnVjdCB0YmwgKiwgY29uc3QgY2hhciAqLCBpbnQpOworc3RydWN0IHRibCAqc2V0aW50X3Yoc3RydWN0IHRibCAqLCBzdHJ1Y3QgdGJsICosIGJvb2wpOwordm9pZCBzZXRpbnQoc3RydWN0IHRibCAqLCBta3NoX2FyaV90KTsKK3N0cnVjdCB0YmwgKnR5cGVzZXQoY29uc3QgY2hhciAqLCBUZmxhZywgVGZsYWcsIGludCwgaW50KQorICAgIE1LU0hfQV9OT05OVUxMKChub25udWxsICgxKSkpOwordm9pZCB1bnNldChzdHJ1Y3QgdGJsICosIGludCk7Citjb25zdCBjaGFyICpza2lwX3Zhcm5hbWUoY29uc3QgY2hhciAqLCBpbnQpOworY29uc3QgY2hhciAqc2tpcF93ZHZhcm5hbWUoY29uc3QgY2hhciAqLCBpbnQpOworaW50IGlzX3dkdmFybmFtZShjb25zdCBjaGFyICosIGludCk7CitpbnQgaXNfd2R2YXJhc3NpZ24oY29uc3QgY2hhciAqKTsKK2NoYXIgKiptYWtlbnYodm9pZCk7Cit2b2lkIGNoYW5nZV9yYW5kb20oY29uc3Qgdm9pZCAqLCBzaXplX3QpOwordm9pZCBjaGFuZ2Vfd2luc3oodm9pZCk7CitpbnQgYXJyYXlfcmVmX2xlbihjb25zdCBjaGFyICopOworY2hhciAqYXJyYXluYW1lKGNvbnN0IGNoYXIgKik7Citta3NoX3VhcmlfdCBzZXRfYXJyYXkoY29uc3QgY2hhciAqLCBib29sLCBjb25zdCBjaGFyICoqKTsKKworZW51bSBUZXN0X29wIHsKKwlUT19OT05PUCA9IDAsCS8qIG5vbi1vcGVyYXRvciAqLworCS8qIHVuYXJ5IG9wZXJhdG9ycyAqLworCVRPX1NUTlpFLCBUT19TVFpFUiwgVE9fT1BUSU9OLAorCVRPX0ZJTEFYU1QsCisJVE9fRklMRVhTVCwKKwlUT19GSUxSRUcsIFRPX0ZJTEJERVYsIFRPX0ZJTENERVYsIFRPX0ZJTFNZTSwgVE9fRklMRklGTywgVE9fRklMU09DSywKKwlUT19GSUxDREYsIFRPX0ZJTElELCBUT19GSUxHSUQsIFRPX0ZJTFNFVEcsIFRPX0ZJTFNUQ0ssIFRPX0ZJTFVJRCwKKwlUT19GSUxSRCwgVE9fRklMR1osIFRPX0ZJTFRULCBUT19GSUxTRVRVLCBUT19GSUxXUiwgVE9fRklMRVgsCisJLyogYmluYXJ5IG9wZXJhdG9ycyAqLworCVRPX1NURVFMLCBUT19TVE5FUSwgVE9fU1RMVCwgVE9fU1RHVCwgVE9fSU5URVEsIFRPX0lOVE5FLCBUT19JTlRHVCwKKwlUT19JTlRHRSwgVE9fSU5UTFQsIFRPX0lOVExFLCBUT19GSUxFUSwgVE9fRklMTlQsIFRPX0ZJTE9ULAorCS8qIG5vdCBhbiBvcGVyYXRvciAqLworCVRPX05PTk5VTEwJLyogIVRPX05PTk9QICovCit9OwordHlwZWRlZiBlbnVtIFRlc3Rfb3AgVGVzdF9vcDsKKworLyogVXNlZCBieSBUZXN0X2Vudi5pc2EoKSAob3JkZXIgaW1wb3J0YW50IC0gdXNlZCB0byBpbmRleCAqX3Rva2Vuc1tdIGFycmF5cykgKi8KK2VudW0gVGVzdF9tZXRhIHsKKwlUTV9PUiwJCS8qIC1vIG9yIHx8ICovCisJVE1fQU5ELAkJLyogLWEgb3IgJiYgKi8KKwlUTV9OT1QsCQkvKiAhICovCisJVE1fT1BBUkVOLAkvKiAoICovCisJVE1fQ1BBUkVOLAkvKiApICovCisJVE1fVU5PUCwJLyogdW5hcnkgb3BlcmF0b3IgKi8KKwlUTV9CSU5PUCwJLyogYmluYXJ5IG9wZXJhdG9yICovCisJVE1fRU5ECQkvKiBlbmQgb2YgaW5wdXQgKi8KK307Cit0eXBlZGVmIGVudW0gVGVzdF9tZXRhIFRlc3RfbWV0YTsKKworI2RlZmluZSBURUZfRVJST1IJQklUKDApCQkvKiBzZXQgaWYgd2UndmUgaGl0IGFuIGVycm9yICovCisjZGVmaW5lIFRFRl9EQlJBQ0tFVAlCSVQoMSkJCS8qIHNldCBpZiBbWyAuLiBdXSB0ZXN0ICovCisKK3R5cGVkZWYgc3RydWN0IHRlc3RfZW52IHsKKwl1bmlvbiB7CisJCWNvbnN0IGNoYXIgKip3cDsvKiB1c2VkIGJ5IHB0ZXN0XyogKi8KKwkJWFB0clYgKmF2OwkvKiB1c2VkIGJ5IGRidGVzdHBfKiAqLworCX0gcG9zOworCWNvbnN0IGNoYXIgKip3cF9lbmQ7CS8qIHVzZWQgYnkgcHRlc3RfKiAqLworCVRlc3Rfb3AgKCppc2EpKHN0cnVjdCB0ZXN0X2VudiAqLCBUZXN0X21ldGEpOworCWNvbnN0IGNoYXIgKigqZ2V0b3BuZCkgKHN0cnVjdCB0ZXN0X2VudiAqLCBUZXN0X29wLCBib29sKTsKKwlpbnQgKCpldmFsKShzdHJ1Y3QgdGVzdF9lbnYgKiwgVGVzdF9vcCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2wpOworCXZvaWQgKCplcnJvcikoc3RydWN0IHRlc3RfZW52ICosIGludCwgY29uc3QgY2hhciAqKTsKKwlpbnQgZmxhZ3M7CQkvKiBURUZfKiAqLworfSBUZXN0X2VudjsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IGRidGVzdF90b2tlbnNbXTsKKworVGVzdF9vcAl0ZXN0X2lzb3AoVGVzdF9tZXRhLCBjb25zdCBjaGFyICopOworaW50IHRlc3RfZXZhbChUZXN0X2VudiAqLCBUZXN0X29wLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbCk7CitpbnQgdGVzdF9wYXJzZShUZXN0X2VudiAqKTsKKworRVhURVJOIGludCB0dHlfZmQgSV9fKC0xKTsJLyogZHVwJ2QgdHR5IGZpbGUgZGVzY3JpcHRvciAqLworRVhURVJOIGludCB0dHlfZGV2dHR5OwkJLyogdHJ1ZSBpZiB0dHlfZmQgaXMgZnJvbSAvZGV2L3R0eSAqLworRVhURVJOIHN0cnVjdCB0ZXJtaW9zIHR0eV9zdGF0ZTsJLyogc2F2ZWQgdHR5IHN0YXRlICovCisKK2V4dGVybiB2b2lkIHR0eV9pbml0KGJvb2wsIGJvb2wpOworZXh0ZXJuIHZvaWQgdHR5X2Nsb3NlKHZvaWQpOworCisvKiBiZSBzdXJlIG5vdCB0byBpbnRlcmZlcmUgd2l0aCBhbnlvbmUgZWxzZSdzIGlkZWEgYWJvdXQgRVhURVJOICovCisjaWZkZWYgRVhURVJOX0RFRklORUQKKyMgdW5kZWYgRVhURVJOX0RFRklORUQKKyMgdW5kZWYgRVhURVJOCisjZW5kaWYKKyN1bmRlZiBJX18KKworI2VuZGlmIC8qICFNS1NIX0lOQ0xVREVTX09OTFkgKi8KZGlmZiAtLWdpdCBhL21rc2gvc3JjL3NoX2ZsYWdzLmggYi9ta3NoL3NyYy9zaF9mbGFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNTQ4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9ta3NoL3NyYy9zaF9mbGFncy5oCkBAIC0wLDAgKzEsMTQ1IEBACisjaWYgZGVmaW5lZChTSEZMQUdTX0RFRk5TKQorX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvc2hfZmxhZ3MuaCx2IDEuNyAyMDEwLzA3LzEzIDEzOjA3OjU4IHRnIEV4cCAkIik7CisjZGVmaW5lIEZOKHNuYW1lLGNuYW1lLG9jaGFyLGZsYWdzKQkvKiBub3RoaW5nICovCisjZWxpZiBkZWZpbmVkKFNIRkxBR1NfRU5VTVMpCisjZGVmaW5lIEZOKHNuYW1lLGNuYW1lLG9jaGFyLGZsYWdzKQljbmFtZSwKKyNkZWZpbmUgRjAoc25hbWUsY25hbWUsb2NoYXIsZmxhZ3MpCWNuYW1lID0gMCwKKyNlbGlmIGRlZmluZWQoU0hGTEFHU19JVEVNUykKKyNkZWZpbmUgRk4oc25hbWUsY25hbWUsb2NoYXIsZmxhZ3MpCXsgc25hbWUsIG9jaGFyLCBmbGFncyB9LAorI2VuZGlmCisKKyNpZm5kZWYgRjAKKyNkZWZpbmUgRjAgRk4KKyNlbmRpZgorCisvKgorICogc3BlY2lhbCBjYXNlcyAoc2VlIHBhcnNlX2FyZ3MoKSk6IC1BLCAtbywgLXMKKyAqCisgKiBvcHRpb25zIGFyZSBzb3J0ZWQgYnkgdGhlaXIgbG9uZ25hbWVzCisgKi8KKworLyogLWEJYWxsIG5ldyBwYXJhbWV0ZXJzIGFyZSBjcmVhdGVkIHdpdGggdGhlIGV4cG9ydCBhdHRyaWJ1dGUgKi8KK0YwKCJhbGxleHBvcnQiLCBGRVhQT1JULCAnYScsIE9GX0FOWSkKKworLyogLi8uCWJhY2t3YXJkcyBjb21wYXQ6IGR1bW15LCBlbWl0cyBhIHdhcm5pbmcgKi8KK0ZOKCJhcmM0cmFuZG9tIiwgRkFSQzRSQU5ET00sIDAsIE9GX0FOWSkKKworI2lmIEhBVkVfTklDRQorLyogLi8uCWJnbmljZSAqLworRk4oImJnbmljZSIsIEZCR05JQ0UsIDAsIE9GX0FOWSkKKyNlbmRpZgorCisvKiAuLy4JZW5hYmxlIHt9IGdsb2JiaW5nIChub24tc3RhbmRhcmQpICovCitGTigiYnJhY2VleHBhbmQiLCBGQlJBQ0VFWFBBTkQsIDAsIE9GX0FOWSkKKworLyogLi8uCUVtYWNzIGNvbW1hbmQgbGluZSBlZGl0aW5nIG1vZGUgKi8KK0ZOKCJlbWFjcyIsIEZFTUFDUywgMCwgT0ZfQU5ZKQorCisvKiAtZQlxdWl0IG9uIGVycm9yICovCitGTigiZXJyZXhpdCIsIEZFUlJFWElULCAnZScsIE9GX0FOWSkKKworLyogLi8uCUVtYWNzIGNvbW1hbmQgbGluZSBlZGl0aW5nIG1vZGUsIGdtYWNzIHZhcmlhbnQgKi8KK0ZOKCJnbWFjcyIsIEZHTUFDUywgMCwgT0ZfQU5ZKQorCisvKiAuLy4JcmVhZGluZyBFT0YgZG9lcyBub3QgZXhpdCAqLworRk4oImlnbm9yZWVvZiIsIEZJR05PUkVFT0YsIDAsIE9GX0FOWSkKKworLyogLWkJaW50ZXJhY3RpdmUgc2hlbGwgKi8KK0ZOKCJpbnRlcmFjdGl2ZSIsIEZUQUxLSU5HLCAnaScsIE9GX0NNRExJTkUpCisKKy8qIC1rCW5hbWU9dmFsdWUgYXJlIHJlY29nbmlzZWQgYW55d2hlcmUgKi8KK0ZOKCJrZXl3b3JkIiwgRktFWVdPUkQsICdrJywgT0ZfQU5ZKQorCisvKiAtbAlsb2dpbiBzaGVsbCAqLworRk4oImxvZ2luIiwgRkxPR0lOLCAnbCcsIE9GX0NNRExJTkUpCisKKy8qIC1YCW1hcmsgZGlycyB3aXRoIC8gaW4gZmlsZSBuYW1lIGNvbXBsZXRpb24gKi8KK0ZOKCJtYXJrZGlycyIsIEZNQVJLRElSUywgJ1gnLCBPRl9BTlkpCisKKyNpZm5kZWYgTUtTSF9VTkVNUExPWUVECisvKiAtbQlqb2IgY29udHJvbCBtb25pdG9yaW5nICovCitGTigibW9uaXRvciIsIEZNT05JVE9SLCAnbScsIE9GX0FOWSkKKyNlbmRpZgorCisvKiAtQwlkb24ndCBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgKi8KK0ZOKCJub2Nsb2JiZXIiLCBGTk9DTE9CQkVSLCAnQycsIE9GX0FOWSkKKworLyogLW4JZG9uJ3QgZXhlY3V0ZSBhbnkgY29tbWFuZHMgKi8KK0ZOKCJub2V4ZWMiLCBGTk9FWEVDLCAnbicsIE9GX0FOWSkKKworLyogLWYJZG9uJ3QgZG8gZmlsZSBnbG9iYmluZyAqLworRk4oIm5vZ2xvYiIsIEZOT0dMT0IsICdmJywgT0ZfQU5ZKQorCisvKiAuLy4JZG9uJ3Qga2lsbCBydW5uaW5nIGpvYnMgd2hlbiBsb2dpbiBzaGVsbCBleGl0cyAqLworRk4oIm5vaHVwIiwgRk5PSFVQLCAwLCBPRl9BTlkpCisKKy8qIC4vLglkb24ndCBzYXZlIGZ1bmN0aW9ucyBpbiBoaXN0b3J5IChubyBlZmZlY3QpICovCitGTigibm9sb2ciLCBGTk9MT0csIDAsIE9GX0FOWSkKKworI2lmbmRlZiBNS1NIX1VORU1QTE9ZRUQKKy8qIC1iCWFzeW5jaHJvbm91cyBqb2IgY29tcGxldGlvbiBub3RpZmljYXRpb24gKi8KK0ZOKCJub3RpZnkiLCBGTk9USUZZLCAnYicsIE9GX0FOWSkKKyNlbmRpZgorCisvKiAtdQl1c2luZyBhbiB1bnNldCB2YXJpYWJsZSBpcyBhbiBlcnJvciAqLworRk4oIm5vdW5zZXQiLCBGTk9VTlNFVCwgJ3UnLCBPRl9BTlkpCisKKy8qIC4vLglkb24ndCBkbyBsb2dpY2FsIGNkcy9wd2RzIChub24tc3RhbmRhcmQpICovCitGTigicGh5c2ljYWwiLCBGUEhZU0lDQUwsIDAsIE9GX0FOWSkKKworLyogLi8uCXBka3NoIGNvbXBhdDogc29tZXdoYXQgbW9yZSBQT1NJWGlzaCBtb2RlIChub24tc3RhbmRhcmQpICovCitGTigicG9zaXgiLCBGUE9TSVgsIDAsIE9GX0FOWSkKKworLyogLXAJdXNlIHN1aWRfcHJvZmlsZTsgcHJpdmlsZWdlZCBzaGVsbCAqLworRk4oInByaXZpbGVnZWQiLCBGUFJJVklMRUdFRCwgJ3AnLCBPRl9BTlkpCisKKy8qIC1yCXJlc3RyaWN0ZWQgc2hlbGwgKi8KK0ZOKCJyZXN0cmljdGVkIiwgRlJFU1RSSUNURUQsICdyJywgT0ZfQ01ETElORSkKKworLyogLi8uCXBka3NoIGNvbXBhdDogY2FsbGVkIGFzIHNoIG5vdCBta3NoOyBrbHVkZ2UgbW9kZSAobm9uLXN0YW5kYXJkKSAqLworRk4oInNoIiwgRlNILCAwLCBPRl9BTlkpCisKKy8qIC1zCShpbnZvY2F0aW9uKSBwYXJzZSBzdGRpbiAocHNldWRvIG5vbi1zdGFuZGFyZCkgKi8KK0ZOKCJzdGRpbiIsIEZTVERJTiwgJ3MnLCBPRl9DTURMSU5FKQorCisvKiAtaAljcmVhdGUgdHJhY2tlZCBhbGlhc2VzIGZvciBhbGwgY29tbWFuZHMgKi8KK0ZOKCJ0cmFja2FsbCIsIEZUUkFDS0FMTCwgJ2gnLCBPRl9BTlkpCisKKy8qIC1VCWVuYWJsZSBVVEYtOCBwcm9jZXNzaW5nIChub24tc3RhbmRhcmQpICovCitGTigidXRmOC1tb2RlIiwgRlVOSUNPREUsICdVJywgT0ZfQU5ZKQorCisvKiAtdgllY2hvIGlucHV0ICovCitGTigidmVyYm9zZSIsIEZWRVJCT1NFLCAndicsIE9GX0FOWSkKKworI2lmICFNS1NIX1NfTk9WSQorLyogLi8uCVZpIGNvbW1hbmQgbGluZSBlZGl0aW5nIG1vZGUgKi8KK0ZOKCJ2aSIsIEZWSSwgMCwgT0ZfQU5ZKQorCisvKiAuLy4JZW5hYmxlIEVTQyBhcyBmaWxlIG5hbWUgY29tcGxldGlvbiBjaGFyYWN0ZXIgKG5vbi1zdGFuZGFyZCkgKi8KK0ZOKCJ2aS1lc2Njb21wbGV0ZSIsIEZWSUVTQ0NPTVBMRVRFLCAwLCBPRl9BTlkpCisKKy8qIC4vLgllbmFibGUgVGFiIGFzIGZpbGUgbmFtZSBjb21wbGV0aW9uIGNoYXJhY3RlciAobm9uLXN0YW5kYXJkKSAqLworRk4oInZpLXRhYmNvbXBsZXRlIiwgRlZJVEFCQ09NUExFVEUsIDAsIE9GX0FOWSkKKworLyogLi8uCWFsd2F5cyByZWFkIGluIHJhdyBtb2RlIChubyBlZmZlY3QpICovCitGTigidmlyYXciLCBGVklSQVcsIDAsIE9GX0FOWSkKKyNlbmRpZgorCisvKiAteAlleGVjdXRpb24gdHJhY2UgKGRpc3BsYXkgY29tbWFuZHMgYXMgdGhleSBhcmUgcnVuKSAqLworRk4oInh0cmFjZSIsIEZYVFJBQ0UsICd4JywgT0ZfQU5ZKQorCisvKiAtYwkoaW52b2NhdGlvbikgZXhlY3V0ZSBzcGVjaWZpZWQgY29tbWFuZCAqLworRk4oTlVMTCwgRkNPTU1BTkQsICdjJywgT0ZfQ01ETElORSkKKworLyoKKyAqIGFub255bW91cyBmbGFnczogdXNlZCBpbnRlcm5hbGx5IGJ5IHNoZWxsIG9ubHkgKG5vdCB2aXNpYmxlIHRvIHVzZXIpCisgKi8KKworLyogLi8uCShpbnRlcm5hbCkgaW5pdGlhbCBzaGVsbCB3YXMgaW50ZXJhY3RpdmUgKi8KK0ZOKE5VTEwsIEZUQUxLSU5HX0ksIDAsIE9GX0lOVEVSTkFMKQorCisjdW5kZWYgRk4KKyN1bmRlZiBGMAorI3VuZGVmIFNIRkxBR1NfREVGTlMKKyN1bmRlZiBTSEZMQUdTX0VOVU1TCisjdW5kZWYgU0hGTEFHU19JVEVNUwpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvc2hmLmMgYi9ta3NoL3NyYy9zaGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTYyNzUyCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvc2hmLmMKQEAgLTAsMCArMSwxMDQyIEBACisvKgkkT3BlbkJTRDogc2hmLmMsdiAxLjE1IDIwMDYvMDQvMDIgMDA6NDg6MzMgZGVyYWFkdCBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOQorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2luY2x1ZGUgInNoLmgiCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL3NoZi5jLHYgMS4zNiAyMDEwLzA3LzE5IDIyOjQxOjA0IHRnIEV4cCAkIik7CisKKy8qIGZsYWdzIHRvIHNoZl9lbXB0eWJ1ZigpICovCisjZGVmaW5lIEVCX1JFQURTVwkweDAxCS8qIGFib3V0IHRvIHN3aXRjaCB0byByZWFkaW5nICovCisjZGVmaW5lIEVCX0dST1cJCTB4MDIJLyogZ3JvdyBidWZmZXIgaWYgbmVjZXNzYXJ5IChTVFJJTkcrRFlOQU1JQykgKi8KKworLyoKKyAqIFJlcGxhY2VtZW50IHN0ZGlvIHJvdXRpbmVzLiBTdGRpbyBpcyB0b28gZmxha2V5IG9uIHRvbyBtYW55IG1hY2hpbmVzCisgKiB0byBiZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBwcm9jZXNzZXMgdXNpbmcgdGhlIHNhbWUgdW5kZXJseWluZworICogZmlsZSBkZXNjcmlwdG9ycy4KKyAqLworCitzdGF0aWMgaW50IHNoZl9maWxsYnVmKHN0cnVjdCBzaGYgKik7CitzdGF0aWMgaW50IHNoZl9lbXB0eWJ1ZihzdHJ1Y3Qgc2hmICosIGludCk7CisKKy8qIE9wZW4gYSBmaWxlLiBGaXJzdCB0aHJlZSBhcmdzIGFyZSBmb3Igb3BlbigpLCBsYXN0IGFyZyBpcyBmbGFncyBmb3IKKyAqIHRoaXMgcGFja2FnZS4gUmV0dXJucyBOVUxMIGlmIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCwgb3IgaWYgYSBkdXAKKyAqIGZhaWxzLgorICovCitzdHJ1Y3Qgc2hmICoKK3NoZl9vcGVuKGNvbnN0IGNoYXIgKm5hbWUsIGludCBvZmxhZ3MsIGludCBtb2RlLCBpbnQgc2ZsYWdzKQoreworCXN0cnVjdCBzaGYgKnNoZjsKKwlpbnQgYnNpemUgPSBzZmxhZ3MgJiBTSEZfVU5CVUYgPyAoc2ZsYWdzICYgU0hGX1JEID8gMSA6IDApIDogU0hGX0JTSVpFOworCWludCBmZDsKKworCS8qIERvbmUgYmVmb3JlIG9wZW4gc28gaWYgYWxsb2NhIGZhaWxzLCBmZCB3b24ndCBiZSBsb3N0LiAqLworCXNoZiA9IGFsbG9jKHNpemVvZihzdHJ1Y3Qgc2hmKSArIGJzaXplLCBBVEVNUCk7CisJc2hmLT5hcmVhcCA9IEFURU1QOworCXNoZi0+YnVmID0gKHVuc2lnbmVkIGNoYXIgKikmc2hmWzFdOworCXNoZi0+YnNpemUgPSBic2l6ZTsKKwlzaGYtPmZsYWdzID0gU0hGX0FMTE9DUzsKKwkvKiBSZXN0IGZpbGxlZCBpbiBieSByZW9wZW4uICovCisKKwlmZCA9IG9wZW4obmFtZSwgb2ZsYWdzLCBtb2RlKTsKKwlpZiAoZmQgPCAwKSB7CisJCWFmcmVlKHNoZiwgc2hmLT5hcmVhcCk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCWlmICgoc2ZsYWdzICYgU0hGX01BUEhJKSAmJiBmZCA8IEZEQkFTRSkgeworCQlpbnQgbmZkOworCisJCW5mZCA9IGZjbnRsKGZkLCBGX0RVUEZELCBGREJBU0UpOworCQljbG9zZShmZCk7CisJCWlmIChuZmQgPCAwKSB7CisJCQlhZnJlZShzaGYsIHNoZi0+YXJlYXApOworCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCQlmZCA9IG5mZDsKKwl9CisJc2ZsYWdzICY9IH5TSEZfQUNDTU9ERTsKKwlzZmxhZ3MgfD0gKG9mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRE9OTFkgPyBTSEZfUkQgOgorCSAgICAoKG9mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19XUk9OTFkgPyBTSEZfV1IgOiBTSEZfUkRXUik7CisKKwlyZXR1cm4gKHNoZl9yZW9wZW4oZmQsIHNmbGFncywgc2hmKSk7Cit9CisKKy8qIFNldCB1cCB0aGUgc2hmIHN0cnVjdHVyZSBmb3IgYSBmaWxlIGRlc2NyaXB0b3IuIERvZXNuJ3QgZmFpbC4gKi8KK3N0cnVjdCBzaGYgKgorc2hmX2Zkb3BlbihpbnQgZmQsIGludCBzZmxhZ3MsIHN0cnVjdCBzaGYgKnNoZikKK3sKKwlpbnQgYnNpemUgPSBzZmxhZ3MgJiBTSEZfVU5CVUYgPyAoc2ZsYWdzICYgU0hGX1JEID8gMSA6IDApIDogU0hGX0JTSVpFOworCisJLyogdXNlIGZjbnRsKCkgdG8gZmlndXJlIG91dCBjb3JyZWN0IHJlYWQvd3JpdGUgZmxhZ3MgKi8KKwlpZiAoc2ZsYWdzICYgU0hGX0dFVEZMKSB7CisJCWludCBmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMLCAwKTsKKworCQlpZiAoZmxhZ3MgPCAwKQorCQkJLyogd2lsbCBnZXQgYW4gZXJyb3Igb24gZmlyc3QgcmVhZC93cml0ZSAqLworCQkJc2ZsYWdzIHw9IFNIRl9SRFdSOworCQllbHNlIHsKKwkJCXN3aXRjaCAoZmxhZ3MgJiBPX0FDQ01PREUpIHsKKwkJCWNhc2UgT19SRE9OTFk6CisJCQkJc2ZsYWdzIHw9IFNIRl9SRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgT19XUk9OTFk6CisJCQkJc2ZsYWdzIHw9IFNIRl9XUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT19SRFdSOgorCQkJCXNmbGFncyB8PSBTSEZfUkRXUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICghKHNmbGFncyAmIChTSEZfUkQgfCBTSEZfV1IpKSkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfZmRvcGVuOiBtaXNzaW5nIHJlYWQvd3JpdGUiKTsKKworCWlmIChzaGYpIHsKKwkJaWYgKGJzaXplKSB7CisJCQlzaGYtPmJ1ZiA9IGFsbG9jKGJzaXplLCBBVEVNUCk7CisJCQlzZmxhZ3MgfD0gU0hGX0FMTE9DQjsKKwkJfSBlbHNlCisJCQlzaGYtPmJ1ZiA9IE5VTEw7CisJfSBlbHNlIHsKKwkJc2hmID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBzaGYpICsgYnNpemUsIEFURU1QKTsKKwkJc2hmLT5idWYgPSAodW5zaWduZWQgY2hhciAqKSZzaGZbMV07CisJCXNmbGFncyB8PSBTSEZfQUxMT0NTOworCX0KKwlzaGYtPmFyZWFwID0gQVRFTVA7CisJc2hmLT5mZCA9IGZkOworCXNoZi0+cnAgPSBzaGYtPndwID0gc2hmLT5idWY7CisJc2hmLT5ybmxlZnQgPSAwOworCXNoZi0+cmJzaXplID0gYnNpemU7CisJc2hmLT53bmxlZnQgPSAwOyAvKiBmb3JjZSBjYWxsIHRvIHNoZl9lbXB0eWJ1ZigpICovCisJc2hmLT53YnNpemUgPSBzZmxhZ3MgJiBTSEZfVU5CVUYgPyAwIDogYnNpemU7CisJc2hmLT5mbGFncyA9IHNmbGFnczsKKwlzaGYtPmVycm5vXyA9IDA7CisJc2hmLT5ic2l6ZSA9IGJzaXplOworCWlmIChzZmxhZ3MgJiBTSEZfQ0xFWEVDKQorCQlmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisJcmV0dXJuIChzaGYpOworfQorCisvKiBTZXQgdXAgYW4gZXhpc3Rpbmcgc2hmIChhbmQgYnVmZmVyKSB0byB1c2UgdGhlIGdpdmVuIGZkICovCitzdHJ1Y3Qgc2hmICoKK3NoZl9yZW9wZW4oaW50IGZkLCBpbnQgc2ZsYWdzLCBzdHJ1Y3Qgc2hmICpzaGYpCit7CisJaW50IGJzaXplID0gc2ZsYWdzICYgU0hGX1VOQlVGID8gKHNmbGFncyAmIFNIRl9SRCA/IDEgOiAwKSA6IFNIRl9CU0laRTsKKworCS8qIHVzZSBmY250bCgpIHRvIGZpZ3VyZSBvdXQgY29ycmVjdCByZWFkL3dyaXRlIGZsYWdzICovCisJaWYgKHNmbGFncyAmIFNIRl9HRVRGTCkgeworCQlpbnQgZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCwgMCk7CisKKwkJaWYgKGZsYWdzIDwgMCkKKwkJCS8qIHdpbGwgZ2V0IGFuIGVycm9yIG9uIGZpcnN0IHJlYWQvd3JpdGUgKi8KKwkJCXNmbGFncyB8PSBTSEZfUkRXUjsKKwkJZWxzZSB7CisJCQlzd2l0Y2ggKGZsYWdzICYgT19BQ0NNT0RFKSB7CisJCQljYXNlIE9fUkRPTkxZOgorCQkJCXNmbGFncyB8PSBTSEZfUkQ7CisJCQkJYnJlYWs7CisJCQljYXNlIE9fV1JPTkxZOgorCQkJCXNmbGFncyB8PSBTSEZfV1I7CisJCQkJYnJlYWs7CisJCQljYXNlIE9fUkRXUjoKKwkJCQlzZmxhZ3MgfD0gU0hGX1JEV1I7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIShzZmxhZ3MgJiAoU0hGX1JEIHwgU0hGX1dSKSkpCisJCWludGVybmFsX2Vycm9yZigic2hmX3Jlb3BlbjogbWlzc2luZyByZWFkL3dyaXRlIik7CisJaWYgKCFzaGYgfHwgIXNoZi0+YnVmIHx8IHNoZi0+YnNpemUgPCBic2l6ZSkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfcmVvcGVuOiBiYWQgc2hmL2J1Zi9ic2l6ZSIpOworCisJLyogYXNzdW1lcyBzaGYtPmJ1ZiBhbmQgc2hmLT5ic2l6ZSBhbHJlYWR5IHNldCB1cCAqLworCXNoZi0+ZmQgPSBmZDsKKwlzaGYtPnJwID0gc2hmLT53cCA9IHNoZi0+YnVmOworCXNoZi0+cm5sZWZ0ID0gMDsKKwlzaGYtPnJic2l6ZSA9IGJzaXplOworCXNoZi0+d25sZWZ0ID0gMDsgLyogZm9yY2UgY2FsbCB0byBzaGZfZW1wdHlidWYoKSAqLworCXNoZi0+d2JzaXplID0gc2ZsYWdzICYgU0hGX1VOQlVGID8gMCA6IGJzaXplOworCXNoZi0+ZmxhZ3MgPSAoc2hmLT5mbGFncyAmIChTSEZfQUxMT0NTIHwgU0hGX0FMTE9DQikpIHwgc2ZsYWdzOworCXNoZi0+ZXJybm9fID0gMDsKKwlpZiAoc2ZsYWdzICYgU0hGX0NMRVhFQykKKwkJZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworCXJldHVybiAoc2hmKTsKK30KKworLyogT3BlbiBhIHN0cmluZyBmb3IgcmVhZGluZyBvciB3cml0aW5nLiBJZiByZWFkaW5nLCBic2l6ZSBpcyB0aGUgbnVtYmVyCisgKiBvZiBieXRlcyB0aGF0IGNhbiBiZSByZWFkLiBJZiB3cml0aW5nLCBic2l6ZSBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKKyAqIGJ5dGVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4uIElmIHNoZiBpcyBub3QgbnVsbCwgaXQgaXMgZmlsbGVkIGluIGFuZAorICogcmV0dXJuZWQsIGlmIGl0IGlzIG51bGwsIHNoZiBpcyBhbGxvY2F0ZWQuIElmIHdyaXRpbmcgYW5kIGJ1ZiBpcyBudWxsCisgKiBhbmQgU0hGX0RZTkFNSUMgaXMgc2V0LCB0aGUgYnVmZmVyIGlzIGFsbG9jYXRlZCAoaWYgYnNpemUgPiAwLCBpdCBpcworICogdXNlZCBmb3IgdGhlIGluaXRpYWwgc2l6ZSkuIERvZXNuJ3QgZmFpbC4KKyAqIFdoZW4gd3JpdGluZywgYSBieXRlIGlzIHJlc2VydmVkIGZvciBhIHRyYWlsaW5nIG51bGwgLSBzZWUgc2hmX3NjbG9zZSgpLgorICovCitzdHJ1Y3Qgc2hmICoKK3NoZl9zb3BlbihjaGFyICpidWYsIGludCBic2l6ZSwgaW50IHNmbGFncywgc3RydWN0IHNoZiAqc2hmKQoreworCS8qIGNhbid0IGhhdmUgYSByZWFkK3dyaXRlIHN0cmluZyAqLworCWlmICghKCEoc2ZsYWdzICYgU0hGX1JEKSBeICEoc2ZsYWdzICYgU0hGX1dSKSkpCisJCWludGVybmFsX2Vycm9yZigic2hmX3NvcGVuOiBmbGFncyAweCV4Iiwgc2ZsYWdzKTsKKworCWlmICghc2hmKSB7CisJCXNoZiA9IGFsbG9jKHNpemVvZihzdHJ1Y3Qgc2hmKSwgQVRFTVApOworCQlzZmxhZ3MgfD0gU0hGX0FMTE9DUzsKKwl9CisJc2hmLT5hcmVhcCA9IEFURU1QOworCWlmICghYnVmICYmIChzZmxhZ3MgJiBTSEZfV1IpICYmIChzZmxhZ3MgJiBTSEZfRFlOQU1JQykpIHsKKwkJaWYgKGJzaXplIDw9IDApCisJCQlic2l6ZSA9IDY0OworCQlzZmxhZ3MgfD0gU0hGX0FMTE9DQjsKKwkJYnVmID0gYWxsb2MoYnNpemUsIHNoZi0+YXJlYXApOworCX0KKwlzaGYtPmZkID0gLTE7CisJc2hmLT5idWYgPSBzaGYtPnJwID0gc2hmLT53cCA9ICh1bnNpZ25lZCBjaGFyICopYnVmOworCXNoZi0+cm5sZWZ0ID0gYnNpemU7CisJc2hmLT5yYnNpemUgPSBic2l6ZTsKKwlzaGYtPndubGVmdCA9IGJzaXplIC0gMTsJLyogc3BhY2UgZm9yIGEgJ1wwJyAqLworCXNoZi0+d2JzaXplID0gYnNpemU7CisJc2hmLT5mbGFncyA9IHNmbGFncyB8IFNIRl9TVFJJTkc7CisJc2hmLT5lcnJub18gPSAwOworCXNoZi0+YnNpemUgPSBic2l6ZTsKKworCXJldHVybiAoc2hmKTsKK30KKworLyogRmx1c2ggYW5kIGNsb3NlIGZpbGUgZGVzY3JpcHRvciwgZnJlZSB0aGUgc2hmIHN0cnVjdHVyZSAqLworaW50CitzaGZfY2xvc2Uoc3RydWN0IHNoZiAqc2hmKQoreworCWludCByZXQgPSAwOworCisJaWYgKHNoZi0+ZmQgPj0gMCkgeworCQlyZXQgPSBzaGZfZmx1c2goc2hmKTsKKwkJaWYgKGNsb3NlKHNoZi0+ZmQpIDwgMCkKKwkJCXJldCA9IEVPRjsKKwl9CisJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfQUxMT0NTKQorCQlhZnJlZShzaGYsIHNoZi0+YXJlYXApOworCWVsc2UgaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfQUxMT0NCKQorCQlhZnJlZShzaGYtPmJ1Ziwgc2hmLT5hcmVhcCk7CisKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qIEZsdXNoIGFuZCBjbG9zZSBmaWxlIGRlc2NyaXB0b3IsIGRvbid0IGZyZWUgZmlsZSBzdHJ1Y3R1cmUgKi8KK2ludAorc2hmX2ZkY2xvc2Uoc3RydWN0IHNoZiAqc2hmKQoreworCWludCByZXQgPSAwOworCisJaWYgKHNoZi0+ZmQgPj0gMCkgeworCQlyZXQgPSBzaGZfZmx1c2goc2hmKTsKKwkJaWYgKGNsb3NlKHNoZi0+ZmQpIDwgMCkKKwkJCXJldCA9IEVPRjsKKwkJc2hmLT5ybmxlZnQgPSAwOworCQlzaGYtPnJwID0gc2hmLT5idWY7CisJCXNoZi0+d25sZWZ0ID0gMDsKKwkJc2hmLT5mZCA9IC0xOworCX0KKworCXJldHVybiAocmV0KTsKK30KKworLyogQ2xvc2UgYSBzdHJpbmcgLSBpZiBpdCB3YXMgb3BlbmVkIGZvciB3cml0aW5nLCBpdCBpcyBudWxsIHRlcm1pbmF0ZWQ7CisgKiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIGFuZCBmcmVlcyBzaGYgaWYgaXQgd2FzIGFsbG9jYXRlZAorICogKGRvZXMgbm90IGZyZWUgc3RyaW5nIGlmIGl0IHdhcyBhbGxvY2F0ZWQpLgorICovCitjaGFyICoKK3NoZl9zY2xvc2Uoc3RydWN0IHNoZiAqc2hmKQoreworCXVuc2lnbmVkIGNoYXIgKnMgPSBzaGYtPmJ1ZjsKKworCS8qIG51bGwgdGVybWluYXRlICovCisJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfV1IpIHsKKwkJc2hmLT53bmxlZnQrKzsKKwkJc2hmX3B1dGMoJ1wwJywgc2hmKTsKKwl9CisJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfQUxMT0NTKQorCQlhZnJlZShzaGYsIHNoZi0+YXJlYXApOworCXJldHVybiAoKGNoYXIgKilzKTsKK30KKworLyogVW4tcmVhZCB3aGF0IGhhcyBiZWVuIHJlYWQgYnV0IG5vdCBleGFtaW5lZCwgb3Igd3JpdGUgd2hhdCBoYXMgYmVlbgorICogYnVmZmVyZWQuIFJldHVybnMgMCBmb3Igc3VjY2VzcywgRU9GIGZvciAod3JpdGUpIGVycm9yLgorICovCitpbnQKK3NoZl9mbHVzaChzdHJ1Y3Qgc2hmICpzaGYpCit7CisJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfU1RSSU5HKQorCQlyZXR1cm4gKChzaGYtPmZsYWdzICYgU0hGX1dSKSA/IEVPRiA6IDApOworCisJaWYgKHNoZi0+ZmQgPCAwKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9mbHVzaDogbm8gZmQiKTsKKworCWlmIChzaGYtPmZsYWdzICYgU0hGX0VSUk9SKSB7CisJCWVycm5vID0gc2hmLT5lcnJub187CisJCXJldHVybiAoRU9GKTsKKwl9CisKKwlpZiAoc2hmLT5mbGFncyAmIFNIRl9SRUFESU5HKSB7CisJCXNoZi0+ZmxhZ3MgJj0gfihTSEZfRU9GIHwgU0hGX1JFQURJTkcpOworCQlpZiAoc2hmLT5ybmxlZnQgPiAwKSB7CisJCQlsc2VlayhzaGYtPmZkLCAob2ZmX3QpLXNoZi0+cm5sZWZ0LCBTRUVLX0NVUik7CisJCQlzaGYtPnJubGVmdCA9IDA7CisJCQlzaGYtPnJwID0gc2hmLT5idWY7CisJCX0KKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfV1JJVElORykKKwkJcmV0dXJuIChzaGZfZW1wdHlidWYoc2hmLCAwKSk7CisKKwlyZXR1cm4gKDApOworfQorCisvKiBXcml0ZSBvdXQgYW55IGJ1ZmZlcmVkIGRhdGEuIElmIGN1cnJlbnRseSByZWFkaW5nLCBmbHVzaGVzIHRoZSByZWFkCisgKiBidWZmZXIuIFJldHVybnMgMCBmb3Igc3VjY2VzcywgRU9GIGZvciAod3JpdGUpIGVycm9yLgorICovCitzdGF0aWMgaW50CitzaGZfZW1wdHlidWYoc3RydWN0IHNoZiAqc2hmLCBpbnQgZmxhZ3MpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIShzaGYtPmZsYWdzICYgU0hGX1NUUklORykgJiYgc2hmLT5mZCA8IDApCisJCWludGVybmFsX2Vycm9yZigic2hmX2VtcHR5YnVmOiBubyBmZCIpOworCisJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfRVJST1IpIHsKKwkJZXJybm8gPSBzaGYtPmVycm5vXzsKKwkJcmV0dXJuIChFT0YpOworCX0KKworCWlmIChzaGYtPmZsYWdzICYgU0hGX1JFQURJTkcpIHsKKwkJaWYgKGZsYWdzICYgRUJfUkVBRFNXKSAvKiBkb2Vzbid0IGhhcHBlbiAqLworCQkJcmV0dXJuICgwKTsKKwkJcmV0ID0gc2hmX2ZsdXNoKHNoZik7CisJCXNoZi0+ZmxhZ3MgJj0gflNIRl9SRUFESU5HOworCX0KKwlpZiAoc2hmLT5mbGFncyAmIFNIRl9TVFJJTkcpIHsKKwkJdW5zaWduZWQgY2hhciAqbmJ1ZjsKKworCQkvKiBOb3RlIHRoYXQgd2UgYXNzdW1lIFNIRl9BTExPQ1MgaXMgbm90IHNldCBpZiBTSEZfQUxMT0NCCisJCSAqIGlzIHNldC4uLiAoY2hhbmdpbmcgdGhlIHNoZiBwb2ludGVyIGNvdWxkIGNhdXNlIHByb2JsZW1zKQorCQkgKi8KKwkJaWYgKCEoZmxhZ3MgJiBFQl9HUk9XKSB8fCAhKHNoZi0+ZmxhZ3MgJiBTSEZfRFlOQU1JQykgfHwKKwkJICAgICEoc2hmLT5mbGFncyAmIFNIRl9BTExPQ0IpKQorCQkJcmV0dXJuIChFT0YpOworCQkvKiBhbGxvY2F0ZSBtb3JlIHNwYWNlIGZvciBidWZmZXIgKi8KKwkJbmJ1ZiA9IGFyZXNpemUoc2hmLT5idWYsIDIgKiBzaGYtPndic2l6ZSwgc2hmLT5hcmVhcCk7CisJCXNoZi0+cnAgPSBuYnVmICsgKHNoZi0+cnAgLSBzaGYtPmJ1Zik7CisJCXNoZi0+d3AgPSBuYnVmICsgKHNoZi0+d3AgLSBzaGYtPmJ1Zik7CisJCXNoZi0+cmJzaXplICs9IHNoZi0+d2JzaXplOworCQlzaGYtPndubGVmdCArPSBzaGYtPndic2l6ZTsKKwkJc2hmLT53YnNpemUgKj0gMjsKKwkJc2hmLT5idWYgPSBuYnVmOworCX0gZWxzZSB7CisJCWlmIChzaGYtPmZsYWdzICYgU0hGX1dSSVRJTkcpIHsKKwkJCWludCBudG93cml0ZSA9IHNoZi0+d3AgLSBzaGYtPmJ1ZjsKKwkJCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHNoZi0+YnVmOworCQkJaW50IG47CisKKwkJCXdoaWxlIChudG93cml0ZSA+IDApIHsKKwkJCQluID0gd3JpdGUoc2hmLT5mZCwgYnVmLCBudG93cml0ZSk7CisJCQkJaWYgKG4gPCAwKSB7CisJCQkJCWlmIChlcnJubyA9PSBFSU5UUiAmJgorCQkJCQkgICAgIShzaGYtPmZsYWdzICYgU0hGX0lOVEVSUlVQVCkpCisJCQkJCQljb250aW51ZTsKKwkJCQkJc2hmLT5mbGFncyB8PSBTSEZfRVJST1I7CisJCQkJCXNoZi0+ZXJybm9fID0gZXJybm87CisJCQkJCXNoZi0+d25sZWZ0ID0gMDsKKwkJCQkJaWYgKGJ1ZiAhPSBzaGYtPmJ1ZikgeworCQkJCQkJLyogYWxsb3cgYSBzZWNvbmQgZmx1c2gKKwkJCQkJCSAqIHRvIHdvcmsgKi8KKwkJCQkJCW1lbW1vdmUoc2hmLT5idWYsIGJ1ZiwKKwkJCQkJCSAgICBudG93cml0ZSk7CisJCQkJCQlzaGYtPndwID0gc2hmLT5idWYgKyBudG93cml0ZTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gKEVPRik7CisJCQkJfQorCQkJCWJ1ZiArPSBuOworCQkJCW50b3dyaXRlIC09IG47CisJCQl9CisJCQlpZiAoZmxhZ3MgJiBFQl9SRUFEU1cpIHsKKwkJCQlzaGYtPndwID0gc2hmLT5idWY7CisJCQkJc2hmLT53bmxlZnQgPSAwOworCQkJCXNoZi0+ZmxhZ3MgJj0gflNIRl9XUklUSU5HOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCX0KKwkJc2hmLT53cCA9IHNoZi0+YnVmOworCQlzaGYtPndubGVmdCA9IHNoZi0+d2JzaXplOworCX0KKwlzaGYtPmZsYWdzIHw9IFNIRl9XUklUSU5HOworCisJcmV0dXJuIChyZXQpOworfQorCisvKiBGaWxsIHVwIGEgcmVhZCBidWZmZXIuIFJldHVybnMgRU9GIGZvciBhIHJlYWQgZXJyb3IsIDAgb3RoZXJ3aXNlLiAqLworc3RhdGljIGludAorc2hmX2ZpbGxidWYoc3RydWN0IHNoZiAqc2hmKQoreworCWlmIChzaGYtPmZsYWdzICYgU0hGX1NUUklORykKKwkJcmV0dXJuICgwKTsKKworCWlmIChzaGYtPmZkIDwgMCkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfZmlsbGJ1Zjogbm8gZmQiKTsKKworCWlmIChzaGYtPmZsYWdzICYgKFNIRl9FT0YgfCBTSEZfRVJST1IpKSB7CisJCWlmIChzaGYtPmZsYWdzICYgU0hGX0VSUk9SKQorCQkJZXJybm8gPSBzaGYtPmVycm5vXzsKKwkJcmV0dXJuIChFT0YpOworCX0KKworCWlmICgoc2hmLT5mbGFncyAmIFNIRl9XUklUSU5HKSAmJiBzaGZfZW1wdHlidWYoc2hmLCBFQl9SRUFEU1cpID09IEVPRikKKwkJcmV0dXJuIChFT0YpOworCisJc2hmLT5mbGFncyB8PSBTSEZfUkVBRElORzsKKworCXNoZi0+cnAgPSBzaGYtPmJ1ZjsKKwl3aGlsZSAoMSkgeworCQlzaGYtPnJubGVmdCA9IGJsb2NraW5nX3JlYWQoc2hmLT5mZCwgKGNoYXIgKikgc2hmLT5idWYsCisJCSAgICBzaGYtPnJic2l6ZSk7CisJCWlmIChzaGYtPnJubGVmdCA8IDAgJiYgZXJybm8gPT0gRUlOVFIgJiYKKwkJICAgICEoc2hmLT5mbGFncyAmIFNIRl9JTlRFUlJVUFQpKQorCQkJY29udGludWU7CisJCWJyZWFrOworCX0KKwlpZiAoc2hmLT5ybmxlZnQgPD0gMCkgeworCQlpZiAoc2hmLT5ybmxlZnQgPCAwKSB7CisJCQlzaGYtPmZsYWdzIHw9IFNIRl9FUlJPUjsKKwkJCXNoZi0+ZXJybm9fID0gZXJybm87CisJCQlzaGYtPnJubGVmdCA9IDA7CisJCQlzaGYtPnJwID0gc2hmLT5idWY7CisJCQlyZXR1cm4gKEVPRik7CisJCX0KKwkJc2hmLT5mbGFncyB8PSBTSEZfRU9GOworCX0KKwlyZXR1cm4gKDApOworfQorCisvKiBSZWFkIGEgYnVmZmVyIGZyb20gc2hmLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpbnRvIGJ1ZiwKKyAqIGlmIG5vIGJ5dGVzIHdlcmUgcmVhZCwgcmV0dXJucyAwIGlmIGVuZCBvZiBmaWxlIHdhcyBzZWVuLCBFT0YgaWYKKyAqIGEgcmVhZCBlcnJvciBvY2N1cnJlZC4KKyAqLworaW50CitzaGZfcmVhZChjaGFyICpidWYsIGludCBic2l6ZSwgc3RydWN0IHNoZiAqc2hmKQoreworCWludCBvcmlnX2JzaXplID0gYnNpemU7CisJaW50IG5jb3B5OworCisJaWYgKCEoc2hmLT5mbGFncyAmIFNIRl9SRCkpCisJCWludGVybmFsX2Vycm9yZigic2hmX3JlYWQ6IGZsYWdzICV4Iiwgc2hmLT5mbGFncyk7CisKKwlpZiAoYnNpemUgPD0gMCkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfcmVhZDogYnNpemUgJWQiLCBic2l6ZSk7CisKKwl3aGlsZSAoYnNpemUgPiAwKSB7CisJCWlmIChzaGYtPnJubGVmdCA9PSAwICYmCisJCSAgICAoc2hmX2ZpbGxidWYoc2hmKSA9PSBFT0YgfHwgc2hmLT5ybmxlZnQgPT0gMCkpCisJCQlicmVhazsKKwkJbmNvcHkgPSBzaGYtPnJubGVmdDsKKwkJaWYgKG5jb3B5ID4gYnNpemUpCisJCQluY29weSA9IGJzaXplOworCQltZW1jcHkoYnVmLCBzaGYtPnJwLCBuY29weSk7CisJCWJ1ZiArPSBuY29weTsKKwkJYnNpemUgLT0gbmNvcHk7CisJCXNoZi0+cnAgKz0gbmNvcHk7CisJCXNoZi0+cm5sZWZ0IC09IG5jb3B5OworCX0KKwkvKiBOb3RlOiBmcmVhZCgzUykgcmV0dXJucyAwIGZvciBlcnJvcnMgLSB0aGlzIGRvZXNuJ3QgKi8KKwlyZXR1cm4gKG9yaWdfYnNpemUgPT0gYnNpemUgPyAoc2hmX2Vycm9yKHNoZikgPyBFT0YgOiAwKSA6CisJICAgIG9yaWdfYnNpemUgLSBic2l6ZSk7Cit9CisKKy8qIFJlYWQgdXAgdG8gYSBuZXdsaW5lIG9yIEVPRi4gVGhlIG5ld2xpbmUgaXMgcHV0IGluIGJ1ZjsgYnVmIGlzIGFsd2F5cworICogbnVsbCB0ZXJtaW5hdGVkLiBSZXR1cm5zIE5VTEwgb24gcmVhZCBlcnJvciBvciBpZiBub3RoaW5nIHdhcyByZWFkIGJlZm9yZQorICogZW5kIG9mIGZpbGUsIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBudWxsIGJ5dGUgaW4gYnVmIG90aGVyd2lzZS4KKyAqLworY2hhciAqCitzaGZfZ2V0c2UoY2hhciAqYnVmLCBpbnQgYnNpemUsIHN0cnVjdCBzaGYgKnNoZikKK3sKKwl1bnNpZ25lZCBjaGFyICplbmQ7CisJaW50IG5jb3B5OworCWNoYXIgKm9yaWdfYnVmID0gYnVmOworCisJaWYgKCEoc2hmLT5mbGFncyAmIFNIRl9SRCkpCisJCWludGVybmFsX2Vycm9yZigic2hmX2dldHNlOiBmbGFncyAleCIsIHNoZi0+ZmxhZ3MpOworCisJaWYgKGJzaXplIDw9IDApCisJCXJldHVybiAoTlVMTCk7CisKKwktLWJzaXplOwkvKiBzYXZlIHJvb20gZm9yIG51bGwgKi8KKwlkbyB7CisJCWlmIChzaGYtPnJubGVmdCA9PSAwKSB7CisJCQlpZiAoc2hmX2ZpbGxidWYoc2hmKSA9PSBFT0YpCisJCQkJcmV0dXJuIChOVUxMKTsKKwkJCWlmIChzaGYtPnJubGVmdCA9PSAwKSB7CisJCQkJKmJ1ZiA9ICdcMCc7CisJCQkJcmV0dXJuIChidWYgPT0gb3JpZ19idWYgPyBOVUxMIDogYnVmKTsKKwkJCX0KKwkJfQorCQllbmQgPSAodW5zaWduZWQgY2hhciAqKW1lbWNocigoY2hhciAqKSBzaGYtPnJwLCAnXG4nLAorCQkgICAgc2hmLT5ybmxlZnQpOworCQluY29weSA9IGVuZCA/IGVuZCAtIHNoZi0+cnAgKyAxIDogc2hmLT5ybmxlZnQ7CisJCWlmIChuY29weSA+IGJzaXplKQorCQkJbmNvcHkgPSBic2l6ZTsKKwkJbWVtY3B5KGJ1ZiwgKGNoYXIgKikgc2hmLT5ycCwgbmNvcHkpOworCQlzaGYtPnJwICs9IG5jb3B5OworCQlzaGYtPnJubGVmdCAtPSBuY29weTsKKwkJYnVmICs9IG5jb3B5OworCQlic2l6ZSAtPSBuY29weTsKKwl9IHdoaWxlICghZW5kICYmIGJzaXplKTsKKwkqYnVmID0gJ1wwJzsKKwlyZXR1cm4gKGJ1Zik7Cit9CisKKy8qIFJldHVybnMgdGhlIGNoYXIgcmVhZC4gUmV0dXJucyBFT0YgZm9yIGVycm9yIGFuZCBlbmQgb2YgZmlsZS4gKi8KK2ludAorc2hmX2dldGNoYXIoc3RydWN0IHNoZiAqc2hmKQoreworCWlmICghKHNoZi0+ZmxhZ3MgJiBTSEZfUkQpKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9nZXRjaGFyOiBmbGFncyAleCIsIHNoZi0+ZmxhZ3MpOworCisJaWYgKHNoZi0+cm5sZWZ0ID09IDAgJiYgKHNoZl9maWxsYnVmKHNoZikgPT0gRU9GIHx8IHNoZi0+cm5sZWZ0ID09IDApKQorCQlyZXR1cm4gKEVPRik7CisJLS1zaGYtPnJubGVmdDsKKwlyZXR1cm4gKCpzaGYtPnJwKyspOworfQorCisvKiBQdXQgYSBjaGFyYWN0ZXIgYmFjayBpbiB0aGUgaW5wdXQgc3RyZWFtLiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaWYKKyAqIHN1Y2Nlc3NmdWwsIEVPRiBpZiB0aGVyZSBpcyBubyByb29tLgorICovCitpbnQKK3NoZl91bmdldGMoaW50IGMsIHN0cnVjdCBzaGYgKnNoZikKK3sKKwlpZiAoIShzaGYtPmZsYWdzICYgU0hGX1JEKSkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfdW5nZXRjOiBmbGFncyAleCIsIHNoZi0+ZmxhZ3MpOworCisJaWYgKChzaGYtPmZsYWdzICYgU0hGX0VSUk9SKSB8fCBjID09IEVPRiB8fAorCSAgICAoc2hmLT5ycCA9PSBzaGYtPmJ1ZiAmJiBzaGYtPnJubGVmdCkpCisJCXJldHVybiAoRU9GKTsKKworCWlmICgoc2hmLT5mbGFncyAmIFNIRl9XUklUSU5HKSAmJiBzaGZfZW1wdHlidWYoc2hmLCBFQl9SRUFEU1cpID09IEVPRikKKwkJcmV0dXJuIChFT0YpOworCisJaWYgKHNoZi0+cnAgPT0gc2hmLT5idWYpCisJCXNoZi0+cnAgPSBzaGYtPmJ1ZiArIHNoZi0+cmJzaXplOworCWlmIChzaGYtPmZsYWdzICYgU0hGX1NUUklORykgeworCQkvKiBDYW4gdW5nZXQgd2hhdCB3YXMgcmVhZCwgYnV0IG5vdCBzb21ldGhpbmcgZGlmZmVyZW50IC0gd2UKKwkJICogZG9uJ3Qgd2FudCB0byBtb2RpZnkgYSBzdHJpbmcuCisJCSAqLworCQlpZiAoc2hmLT5ycFstMV0gIT0gYykKKwkJCXJldHVybiAoRU9GKTsKKwkJc2hmLT5mbGFncyAmPSB+U0hGX0VPRjsKKwkJc2hmLT5ycC0tOworCQlzaGYtPnJubGVmdCsrOworCQlyZXR1cm4gKGMpOworCX0KKwlzaGYtPmZsYWdzICY9IH5TSEZfRU9GOworCSotLShzaGYtPnJwKSA9IGM7CisJc2hmLT5ybmxlZnQrKzsKKwlyZXR1cm4gKGMpOworfQorCisvKiBXcml0ZSBhIGNoYXJhY3Rlci4gUmV0dXJucyB0aGUgY2hhcmFjdGVyIGlmIHN1Y2Nlc3NmdWwsIEVPRiBpZgorICogdGhlIGNoYXIgY291bGQgbm90IGJlIHdyaXR0ZW4uCisgKi8KK2ludAorc2hmX3B1dGNoYXIoaW50IGMsIHN0cnVjdCBzaGYgKnNoZikKK3sKKwlpZiAoIShzaGYtPmZsYWdzICYgU0hGX1dSKSkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfcHV0Y2hhcjogZmxhZ3MgJXgiLCBzaGYtPmZsYWdzKTsKKworCWlmIChjID09IEVPRikKKwkJcmV0dXJuIChFT0YpOworCisJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfVU5CVUYpIHsKKwkJdW5zaWduZWQgY2hhciBjYyA9ICh1bnNpZ25lZCBjaGFyKWM7CisJCWludCBuOworCisJCWlmIChzaGYtPmZkIDwgMCkKKwkJCWludGVybmFsX2Vycm9yZigic2hmX3B1dGNoYXI6IG5vIGZkIik7CisJCWlmIChzaGYtPmZsYWdzICYgU0hGX0VSUk9SKSB7CisJCQllcnJubyA9IHNoZi0+ZXJybm9fOworCQkJcmV0dXJuIChFT0YpOworCQl9CisJCXdoaWxlICgobiA9IHdyaXRlKHNoZi0+ZmQsICZjYywgMSkpICE9IDEpCisJCQlpZiAobiA8IDApIHsKKwkJCQlpZiAoZXJybm8gPT0gRUlOVFIgJiYKKwkJCQkgICAgIShzaGYtPmZsYWdzICYgU0hGX0lOVEVSUlVQVCkpCisJCQkJCWNvbnRpbnVlOworCQkJCXNoZi0+ZmxhZ3MgfD0gU0hGX0VSUk9SOworCQkJCXNoZi0+ZXJybm9fID0gZXJybm87CisJCQkJcmV0dXJuIChFT0YpOworCQkJfQorCX0gZWxzZSB7CisJCS8qIEZsdXNoIGRlYWxzIHdpdGggc3RyaW5ncyBhbmQgc3RpY2t5IGVycm9ycyAqLworCQlpZiAoc2hmLT53bmxlZnQgPT0gMCAmJiBzaGZfZW1wdHlidWYoc2hmLCBFQl9HUk9XKSA9PSBFT0YpCisJCQlyZXR1cm4gKEVPRik7CisJCXNoZi0+d25sZWZ0LS07CisJCSpzaGYtPndwKysgPSBjOworCX0KKworCXJldHVybiAoYyk7Cit9CisKKy8qIFdyaXRlIGEgc3RyaW5nLiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpZiBzdWNjZXNzZnVsLCBFT0YgaWYKKyAqIHRoZSBzdHJpbmcgY291bGQgbm90IGJlIHdyaXR0ZW4uCisgKi8KK2ludAorc2hmX3B1dHMoY29uc3QgY2hhciAqcywgc3RydWN0IHNoZiAqc2hmKQoreworCWlmICghcykKKwkJcmV0dXJuIChFT0YpOworCisJcmV0dXJuIChzaGZfd3JpdGUocywgc3RybGVuKHMpLCBzaGYpKTsKK30KKworLyogV3JpdGUgYSBidWZmZXIuIFJldHVybnMgbmJ5dGVzIGlmIHN1Y2Nlc3NmdWwsIEVPRiBpZiB0aGVyZSBpcyBhbiBlcnJvci4gKi8KK2ludAorc2hmX3dyaXRlKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG5ieXRlcywgc3RydWN0IHNoZiAqc2hmKQoreworCWludCBuLCBuY29weSwgb3JpZ19uYnl0ZXMgPSBuYnl0ZXM7CisKKwlpZiAoIShzaGYtPmZsYWdzICYgU0hGX1dSKSkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfd3JpdGU6IGZsYWdzICV4Iiwgc2hmLT5mbGFncyk7CisKKwlpZiAobmJ5dGVzIDwgMCkKKwkJaW50ZXJuYWxfZXJyb3JmKCJzaGZfd3JpdGU6IG5ieXRlcyAlZCIsIG5ieXRlcyk7CisKKwkvKiBEb24ndCBidWZmZXIgaWYgYnVmZmVyIGlzIGVtcHR5IGFuZCB3ZSdyZSB3cml0dGluZyBhIGxhcmdlIGFtb3VudC4gKi8KKwlpZiAoKG5jb3B5ID0gc2hmLT53bmxlZnQpICYmCisJICAgIChzaGYtPndwICE9IHNoZi0+YnVmIHx8IG5ieXRlcyA8IHNoZi0+d25sZWZ0KSkgeworCQlpZiAobmNvcHkgPiBuYnl0ZXMpCisJCQluY29weSA9IG5ieXRlczsKKwkJbWVtY3B5KHNoZi0+d3AsIGJ1ZiwgbmNvcHkpOworCQluYnl0ZXMgLT0gbmNvcHk7CisJCWJ1ZiArPSBuY29weTsKKwkJc2hmLT53cCArPSBuY29weTsKKwkJc2hmLT53bmxlZnQgLT0gbmNvcHk7CisJfQorCWlmIChuYnl0ZXMgPiAwKSB7CisJCWlmIChzaGYtPmZsYWdzICYgU0hGX1NUUklORykgeworCQkJLyogcmVzaXplIGJ1ZmZlciB1bnRpbCB0aGVyZSdzIGVub3VnaCBzcGFjZSBsZWZ0ICovCisJCQl3aGlsZSAobmJ5dGVzID4gc2hmLT53bmxlZnQpCisJCQkJaWYgKHNoZl9lbXB0eWJ1ZihzaGYsIEVCX0dST1cpID09IEVPRikKKwkJCQkJcmV0dXJuIChFT0YpOworCQkJLyogdGhlbiB3cml0ZSBldmVyeXRoaW5nIGludG8gdGhlIGJ1ZmZlciAqLworCQl9IGVsc2UgeworCQkJLyogZmx1c2ggZGVhbHMgd2l0aCBzdGlja3kgZXJyb3JzICovCisJCQlpZiAoc2hmX2VtcHR5YnVmKHNoZiwgRUJfR1JPVykgPT0gRU9GKQorCQkJCXJldHVybiAoRU9GKTsKKwkJCS8qIHdyaXRlIGNodW5rcyBsYXJnZXIgdGhhbiB3aW5kb3cgc2l6ZSBkaXJlY3RseSAqLworCQkJaWYgKG5ieXRlcyA+IHNoZi0+d2JzaXplKSB7CisJCQkJbmNvcHkgPSBuYnl0ZXM7CisJCQkJaWYgKHNoZi0+d2JzaXplKQorCQkJCQluY29weSAtPSBuYnl0ZXMgJSBzaGYtPndic2l6ZTsKKwkJCQluYnl0ZXMgLT0gbmNvcHk7CisJCQkJd2hpbGUgKG5jb3B5ID4gMCkgeworCQkJCQluID0gd3JpdGUoc2hmLT5mZCwgYnVmLCBuY29weSk7CisJCQkJCWlmIChuIDwgMCkgeworCQkJCQkJaWYgKGVycm5vID09IEVJTlRSICYmCisJCQkJCQkgICAgIShzaGYtPmZsYWdzICYgU0hGX0lOVEVSUlVQVCkpCisJCQkJCQkJY29udGludWU7CisJCQkJCQlzaGYtPmZsYWdzIHw9IFNIRl9FUlJPUjsKKwkJCQkJCXNoZi0+ZXJybm9fID0gZXJybm87CisJCQkJCQlzaGYtPndubGVmdCA9IDA7CisJCQkJCQkvKgorCQkJCQkJICogTm90ZTogZndyaXRlKDMpIHJldHVybnMgMAorCQkJCQkJICogZm9yIGVycm9ycyAtIHRoaXMgZG9lc24ndAorCQkJCQkJICovCisJCQkJCQlyZXR1cm4gKEVPRik7CisJCQkJCX0KKwkJCQkJYnVmICs9IG47CisJCQkJCW5jb3B5IC09IG47CisJCQkJfQorCQkJfQorCQkJLyogLi4uIGFuZCBidWZmZXIgdGhlIHJlc3QgKi8KKwkJfQorCQlpZiAobmJ5dGVzID4gMCkgeworCQkJLyogd3JpdGUgcmVtYWluaW5nIGJ5dGVzIHRvIGJ1ZmZlciAqLworCQkJbWVtY3B5KHNoZi0+d3AsIGJ1ZiwgbmJ5dGVzKTsKKwkJCXNoZi0+d3AgKz0gbmJ5dGVzOworCQkJc2hmLT53bmxlZnQgLT0gbmJ5dGVzOworCQl9CisJfQorCisJcmV0dXJuIChvcmlnX25ieXRlcyk7Cit9CisKK2ludAorc2hmX2ZwcmludGYoc3RydWN0IHNoZiAqc2hmLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IG47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCW4gPSBzaGZfdmZwcmludGYoc2hmLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXJldHVybiAobik7Cit9CisKK2ludAorc2hmX3NucHJpbnRmKGNoYXIgKmJ1ZiwgaW50IGJzaXplLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlzdHJ1Y3Qgc2hmIHNoZjsKKwl2YV9saXN0IGFyZ3M7CisJaW50IG47CisKKwlpZiAoIWJ1ZiB8fCBic2l6ZSA8PSAwKQorCQlpbnRlcm5hbF9lcnJvcmYoInNoZl9zbnByaW50ZjogYnVmICVwLCBic2l6ZSAlZCIsIGJ1ZiwgYnNpemUpOworCisJc2hmX3NvcGVuKGJ1ZiwgYnNpemUsIFNIRl9XUiwgJnNoZik7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwluID0gc2hmX3ZmcHJpbnRmKCZzaGYsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXNoZl9zY2xvc2UoJnNoZik7IC8qIG51bGwgdGVybWluYXRlcyAqLworCXJldHVybiAobik7Cit9CisKK2NoYXIgKgorc2hmX3NtcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0cnVjdCBzaGYgc2hmOworCXZhX2xpc3QgYXJnczsKKworCXNoZl9zb3BlbihOVUxMLCAwLCBTSEZfV1J8U0hGX0RZTkFNSUMsICZzaGYpOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJc2hmX3ZmcHJpbnRmKCZzaGYsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiAoc2hmX3NjbG9zZSgmc2hmKSk7IC8qIG51bGwgdGVybWluYXRlcyAqLworfQorCisjdW5kZWYgRlAJCQkvKiBpZiB5b3Ugd2FudCBmbG9hdGluZyBwb2ludCBzdHVmZiAqLworCisjaWZuZGVmIERNQVhFWFAKKyMgZGVmaW5lIERNQVhFWFAJMTI4CS8qIHNob3VsZCBiZSBiaWcgZW5vdWdoICovCisjZW5kaWYKKworI2RlZmluZSBCVUZfU0laRQkxMjgKKy8qIG11c3QgYmUgPiBNQVgoRE1BWEVYUCwgbG9nMTAocG93KDIsIERTSUdOSUYpKSkgKyBjZWlsKGxvZzEwKERNQVhFWFApKSArIDgKKyAqIChJIHRoaW5rKTsgc2luY2UgaXQncyBoYXJkIHRvIGV4cHJlc3MgYXMgYSBjb25zdGFudCwganVzdCB1c2UgYSBsYXJnZSBidWZmZXIKKyAqLworI2RlZmluZSBGUEJVRl9TSVpFCShETUFYRVhQKzE2KQorCisjZGVmaW5lCUZMX0hBU0gJCTB4MDAxCS8qICcjJyBzZWVuICovCisjZGVmaW5lIEZMX1BMVVMJCTB4MDAyCS8qICcrJyBzZWVuICovCisjZGVmaW5lIEZMX1JJR0hUCTB4MDA0CS8qICctJyBzZWVuICovCisjZGVmaW5lIEZMX0JMQU5LCTB4MDA4CS8qICcgJyBzZWVuICovCisjZGVmaW5lIEZMX1NIT1JUCTB4MDEwCS8qICdoJyBzZWVuICovCisjZGVmaW5lIEZMX0xPTkcJCTB4MDIwCS8qICdsJyBzZWVuICovCisjZGVmaW5lIEZMX1pFUk8JCTB4MDQwCS8qICcwJyBzZWVuICovCisjZGVmaW5lIEZMX0RPVAkJMHgwODAJLyogJy4nIHNlZW4gKi8KKyNkZWZpbmUgRkxfVVBQRVIJMHgxMDAJLyogZm9ybWF0IGNoYXJhY3RlciB3YXMgdXBwZXJjYXNlICovCisjZGVmaW5lIEZMX05VTUJFUgkweDIwMAkvKiBhIG51bWJlciB3YXMgZm9ybWF0ZWQgJVtkb3V4ZWZnXSAqLworCisKK2ludAorc2hmX3ZmcHJpbnRmKHN0cnVjdCBzaGYgKnNoZiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisJY29uc3QgY2hhciAqczsKKwljaGFyIGMsICpjcDsKKwlpbnQgdG1wID0gMCwgZmllbGQsIHByZWNpc2lvbiwgbGVuLCBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGxudW07CisJLyogJSNvIHByb2R1Y2VzIHRoZSBsb25nZXN0IG91dHB1dCAqLworCWNoYXIgbnVtYnVmWyg4ICogc2l6ZW9mKGxvbmcpICsgMikgLyAzICsgMV07CisJLyogdGhpcyBzdHVmZiBmb3IgZGVhbGluZyB3aXRoIHRoZSBidWZmZXIgKi8KKwlpbnQgbndyaXR0ZW4gPSAwOworCisJaWYgKCFmbXQpCisJCXJldHVybiAoMCk7CisKKwl3aGlsZSAoKGMgPSAqZm10KyspKSB7CisJCWlmIChjICE9ICclJykgeworCQkJc2hmX3B1dGMoYywgc2hmKTsKKwkJCW53cml0dGVuKys7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBUaGlzIHdpbGwgYWNjZXB0IGZsYWdzL2ZpZWxkcyBpbiBhbnkgb3JkZXIgLSBub3QKKwkJICoganVzdCB0aGUgb3JkZXIgc3BlY2lmaWVkIGluIHByaW50ZigzKSwgYnV0IHRoaXMgaXMKKwkJICogdGhlIHdheSBfZG9wcm50KCkgc2VlbXMgdG8gd29yayAob24gYnNkIGFuZCBzeXNWKS4KKwkJICogVGhlIG9ubHkgcmVzdHJpY3Rpb24gaXMgdGhhdCB0aGUgZm9ybWF0IGNoYXJhY3RlciBtdXN0CisJCSAqIGNvbWUgbGFzdCA6LSkuCisJCSAqLworCQlmbGFncyA9IGZpZWxkID0gcHJlY2lzaW9uID0gMDsKKwkJZm9yICggOyAoYyA9ICpmbXQrKykgOyApIHsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnIyc6CisJCQkJZmxhZ3MgfD0gRkxfSEFTSDsKKwkJCQljb250aW51ZTsKKworCQkJY2FzZSAnKyc6CisJCQkJZmxhZ3MgfD0gRkxfUExVUzsKKwkJCQljb250aW51ZTsKKworCQkJY2FzZSAnLSc6CisJCQkJZmxhZ3MgfD0gRkxfUklHSFQ7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgJyAnOgorCQkJCWZsYWdzIHw9IEZMX0JMQU5LOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlICcwJzoKKwkJCQlpZiAoIShmbGFncyAmIEZMX0RPVCkpCisJCQkJCWZsYWdzIHw9IEZMX1pFUk87CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgJy4nOgorCQkJCWZsYWdzIHw9IEZMX0RPVDsKKwkJCQlwcmVjaXNpb24gPSAwOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlICcqJzoKKwkJCQl0bXAgPSB2YV9hcmcoYXJncywgaW50KTsKKwkJCQlpZiAoZmxhZ3MgJiBGTF9ET1QpCisJCQkJCXByZWNpc2lvbiA9IHRtcDsKKwkJCQllbHNlIGlmICgoZmllbGQgPSB0bXApIDwgMCkgeworCQkJCQlmaWVsZCA9IC1maWVsZDsKKwkJCQkJZmxhZ3MgfD0gRkxfUklHSFQ7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCisJCQljYXNlICdsJzoKKwkJCQlmbGFncyB8PSBGTF9MT05HOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlICdoJzoKKwkJCQlmbGFncyB8PSBGTF9TSE9SVDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChrc2hfaXNkaWdpdChjKSkgeworCQkJCXRtcCA9IGMgLSAnMCc7CisJCQkJd2hpbGUgKGMgPSAqZm10KyssIGtzaF9pc2RpZ2l0KGMpKQorCQkJCQl0bXAgPSB0bXAgKiAxMCArIGMgLSAnMCc7CisJCQkJLS1mbXQ7CisJCQkJaWYgKHRtcCA8IDApCQkvKiBvdmVyZmxvdz8gKi8KKwkJCQkJdG1wID0gMDsKKwkJCQlpZiAoZmxhZ3MgJiBGTF9ET1QpCisJCQkJCXByZWNpc2lvbiA9IHRtcDsKKwkJCQllbHNlCisJCQkJCWZpZWxkID0gdG1wOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlpZiAocHJlY2lzaW9uIDwgMCkKKwkJCXByZWNpc2lvbiA9IDA7CisKKwkJaWYgKCFjKQkJLyogbmFzdHkgZm9ybWF0ICovCisJCQlicmVhazsKKworCQlpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKwkJCWZsYWdzIHw9IEZMX1VQUEVSOworCQkJYyA9IGtzaF90b2xvd2VyKGMpOworCQl9CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ3AnOiAvKiBwb2ludGVyICovCisJCQlmbGFncyAmPSB+KEZMX0xPTkcgfCBGTF9TSE9SVCk7CisJCQlmbGFncyB8PSAoc2l6ZW9mKGNoYXIgKikgPiBzaXplb2YoaW50KSkgPworCQkJICAgIC8qIGhvcGUgaXQgZml0cy4uICovIEZMX0xPTkcgOiAwOworCQkJLyogYWFhaGhoLi4uICovCisJCWNhc2UgJ2QnOgorCQljYXNlICdpJzoKKwkJY2FzZSAnbyc6CisJCWNhc2UgJ3UnOgorCQljYXNlICd4JzoKKwkJCWZsYWdzIHw9IEZMX05VTUJFUjsKKwkJCWNwID0gbnVtYnVmICsgc2l6ZW9mKG51bWJ1Zik7CisJCQkvKi0KKwkJCSAqIFhYWCBhbnkgYmV0dGVyIHdheSB0byBkbyB0aGlzPworCQkJICogWFhYIGhvcGVmdWxseSB0aGUgY29tcGlsZXIgb3B0aW1pc2VzIHRoaXMgb3V0CisJCQkgKgorCQkJICogRm9yIHNob3J0cywgd2Ugd2FudCBzaWduIGV4dGVuZCBmb3IgJWQgYnV0IG5vdAorCQkJICogZm9yICVbb3h1XSAtIG9uIDE2IGJpdCBtYWNoaW5lcyBpdCBkb2Vzbid0IG1hdHRlci4KKwkJCSAqIEFzc3VtZXMgQyBjb21waWxlciBoYXMgY29udmVydGVkIHNob3J0cyB0byBpbnRzCisJCQkgKiBiZWZvcmUgcHVzaGluZyB0aGVtLiBYWFggb3B0aW1pc2UgdGhpcyAtdGcKKwkJCSAqLworCQkJaWYgKGZsYWdzICYgRkxfTE9ORykKKwkJCQlsbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGxvbmcpOworCQkJZWxzZSBpZiAoKHNpemVvZihpbnQpIDwgc2l6ZW9mKGxvbmcpKSAmJiAoYyA9PSAnZCcpKQorCQkJCWxudW0gPSAobG9uZyl2YV9hcmcoYXJncywgaW50KTsKKwkJCWVsc2UKKwkJCQlsbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7CisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJ2QnOgorCQkJY2FzZSAnaSc6CisJCQkJaWYgKDAgPiAobG9uZylsbnVtKSB7CisJCQkJCWxudW0gPSAtKGxvbmcpbG51bTsKKwkJCQkJdG1wID0gMTsKKwkJCQl9IGVsc2UKKwkJCQkJdG1wID0gMDsKKwkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJY2FzZSAndSc6CisJCQkJZG8geworCQkJCQkqLS1jcCA9IGxudW0gJSAxMCArICcwJzsKKwkJCQkJbG51bSAvPSAxMDsKKwkJCQl9IHdoaWxlIChsbnVtKTsKKworCQkJCWlmIChjICE9ICd1JykgeworCQkJCQlpZiAodG1wKQorCQkJCQkJKi0tY3AgPSAnLSc7CisJCQkJCWVsc2UgaWYgKGZsYWdzICYgRkxfUExVUykKKwkJCQkJCSotLWNwID0gJysnOworCQkJCQllbHNlIGlmIChmbGFncyAmIEZMX0JMQU5LKQorCQkJCQkJKi0tY3AgPSAnICc7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlICdvJzoKKwkJCQlkbyB7CisJCQkJCSotLWNwID0gKGxudW0gJiAweDcpICsgJzAnOworCQkJCQlsbnVtID4+PSAzOworCQkJCX0gd2hpbGUgKGxudW0pOworCisJCQkJaWYgKChmbGFncyAmIEZMX0hBU0gpICYmICpjcCAhPSAnMCcpCisJCQkJCSotLWNwID0gJzAnOworCQkJCWJyZWFrOworCisJCQljYXNlICdwJzoKKwkJCWNhc2UgJ3gnOiB7CisJCQkJY29uc3QgY2hhciAqZGlnaXRzID0gKGZsYWdzICYgRkxfVVBQRVIpID8KKwkJCQkgICAgZGlnaXRzX3VjIDogZGlnaXRzX2xjOworCQkJCWRvIHsKKwkJCQkJKi0tY3AgPSBkaWdpdHNbbG51bSAmIDB4Zl07CisJCQkJCWxudW0gPj49IDQ7CisJCQkJfSB3aGlsZSAobG51bSk7CisKKwkJCQlpZiAoZmxhZ3MgJiBGTF9IQVNIKSB7CisJCQkJCSotLWNwID0gKGZsYWdzICYgRkxfVVBQRVIpID8gJ1gnIDogJ3gnOworCQkJCQkqLS1jcCA9ICcwJzsKKwkJCQl9CisJCQl9CisJCQl9CisJCQlsZW4gPSBudW1idWYgKyBzaXplb2YobnVtYnVmKSAtIChzID0gY3ApOworCQkJaWYgKGZsYWdzICYgRkxfRE9UKSB7CisJCQkJaWYgKHByZWNpc2lvbiA+IGxlbikgeworCQkJCQlmaWVsZCA9IHByZWNpc2lvbjsKKwkJCQkJZmxhZ3MgfD0gRkxfWkVSTzsKKwkJCQl9IGVsc2UKKwkJCQkJcHJlY2lzaW9uID0gbGVuOyAvKiBubyBsb3NzICovCisJCQl9CisJCQlicmVhazsKKworCQljYXNlICdzJzoKKwkJCWlmICghKHMgPSB2YV9hcmcoYXJncywgY29uc3QgY2hhciAqKSkpCisJCQkJcyA9ICIobnVsbCkiOworCQkJbGVuID0gdXRmX21ic3dpZHRoKHMpOworCQkJYnJlYWs7CisKKwkJY2FzZSAnYyc6CisJCQlmbGFncyAmPSB+RkxfRE9UOworCQkJbnVtYnVmWzBdID0gKGNoYXIpKHZhX2FyZyhhcmdzLCBpbnQpKTsKKwkJCXMgPSBudW1idWY7CisJCQlsZW4gPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSAnJSc6CisJCWRlZmF1bHQ6CisJCQludW1idWZbMF0gPSBjOworCQkJcyA9IG51bWJ1ZjsKKwkJCWxlbiA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIEF0IHRoaXMgcG9pbnQgcyBzaG91bGQgcG9pbnQgdG8gYSBzdHJpbmcgdGhhdCBpcyB0byBiZQorCQkgKiBmb3JtYXR0ZWQsIGFuZCBsZW4gc2hvdWxkIGJlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4KKwkJICovCisJCWlmICghKGZsYWdzICYgRkxfRE9UKSB8fCBsZW4gPCBwcmVjaXNpb24pCisJCQlwcmVjaXNpb24gPSBsZW47CisJCWlmIChmaWVsZCA+IHByZWNpc2lvbikgeworCQkJZmllbGQgLT0gcHJlY2lzaW9uOworCQkJaWYgKCEoZmxhZ3MgJiBGTF9SSUdIVCkpIHsKKwkJCQlmaWVsZCA9IC1maWVsZDsKKwkJCQkvKiBza2lwIHBhc3Qgc2lnbiBvciAweCB3aGVuIHBhZGRpbmcgd2l0aCAwICovCisJCQkJaWYgKChmbGFncyAmIEZMX1pFUk8pICYmIChmbGFncyAmIEZMX05VTUJFUikpIHsKKwkJCQkJaWYgKCpzID09ICcrJyB8fCAqcyA9PSAnLScgfHwKKwkJCQkJICAgICpzID09ICcgJykgeworCQkJCQkJc2hmX3B1dGMoKnMsIHNoZik7CisJCQkJCQlzKys7CisJCQkJCQlwcmVjaXNpb24tLTsKKwkJCQkJCW53cml0dGVuKys7CisJCQkJCX0gZWxzZSBpZiAoKnMgPT0gJzAnKSB7CisJCQkJCQlzaGZfcHV0Yygqcywgc2hmKTsKKwkJCQkJCXMrKzsKKwkJCQkJCW53cml0dGVuKys7CisJCQkJCQlpZiAoLS1wcmVjaXNpb24gPiAwICYmCisJCQkJCQkgICAgKCpzIHwgMHgyMCkgPT0gJ3gnKSB7CisJCQkJCQkJc2hmX3B1dGMoKnMsIHNoZik7CisJCQkJCQkJcysrOworCQkJCQkJCXByZWNpc2lvbi0tOworCQkJCQkJCW53cml0dGVuKys7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYyA9ICcwJzsKKwkJCQl9IGVsc2UKKwkJCQkJYyA9IGZsYWdzICYgRkxfWkVSTyA/ICcwJyA6ICcgJzsKKwkJCQlpZiAoZmllbGQgPCAwKSB7CisJCQkJCW53cml0dGVuICs9IC1maWVsZDsKKwkJCQkJZm9yICggOyBmaWVsZCA8IDAgOyBmaWVsZCsrKQorCQkJCQkJc2hmX3B1dGMoYywgc2hmKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQljID0gJyAnOworCQl9IGVsc2UKKwkJCWZpZWxkID0gMDsKKworCQlpZiAocHJlY2lzaW9uID4gMCkgeworCQkJY29uc3QgY2hhciAqcTsKKworCQkJbndyaXR0ZW4gKz0gcHJlY2lzaW9uOworCQkJcSA9IHV0Zl9za2lwY29scyhzLCBwcmVjaXNpb24pOworCQkJZG8geworCQkJCXNoZl9wdXRjKCpzLCBzaGYpOworCQkJfSB3aGlsZSAoKytzIDwgcSk7CisJCX0KKwkJaWYgKGZpZWxkID4gMCkgeworCQkJbndyaXR0ZW4gKz0gZmllbGQ7CisJCQlmb3IgKCA7IGZpZWxkID4gMCA7IC0tZmllbGQpCisJCQkJc2hmX3B1dGMoYywgc2hmKTsKKwkJfQorCX0KKworCXJldHVybiAoc2hmX2Vycm9yKHNoZikgPyBFT0YgOiBud3JpdHRlbik7Cit9CisKKyNpZmRlZiBNS1NIX1NNQUxMCitpbnQKK3NoZl9nZXRjKHN0cnVjdCBzaGYgKnNoZikKK3sKKwlyZXR1cm4gKChzaGYpLT5ybmxlZnQgPiAwID8gKHNoZiktPnJubGVmdC0tLCAqKHNoZiktPnJwKysgOgorCSAgICBzaGZfZ2V0Y2hhcihzaGYpKTsKK30KKworaW50CitzaGZfcHV0YyhpbnQgYywgc3RydWN0IHNoZiAqc2hmKQoreworCXJldHVybiAoKHNoZiktPndubGVmdCA9PSAwID8gc2hmX3B1dGNoYXIoKGMpLCAoc2hmKSkgOgorCSAgICAoKHNoZiktPndubGVmdC0tLCAqKHNoZiktPndwKysgPSAoYykpKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvc3luLmMgYi9ta3NoL3NyYy9zeW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGIyODY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvc3luLmMKQEAgLTAsMCArMSwxMDA0IEBACisvKgkkT3BlbkJTRDogc3luLmMsdiAxLjI4IDIwMDgvMDcvMjMgMTY6MzQ6MzggamFyZWR5IEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5CisgKglUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5vcmc+CisgKgorICogUHJvdmlkZWQgdGhhdCB0aGVzZSB0ZXJtcyBhbmQgZGlzY2xhaW1lciBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzCisgKiBhcmUgcmV0YWluZWQgb3IgcmVwcm9kdWNlZCBpbiBhbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnQsIHBlcm1pc3Npb24KKyAqIGlzIGdyYW50ZWQgdG8gZGVhbCBpbiB0aGlzIHdvcmsgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHVuLQorICogbGltaXRlZCByaWdodHMgdG8gdXNlLCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlLCBzZWxsLCBtb2RpZnksCisgKiBtZXJnZSwgZ2l2ZSBhd2F5LCBvciBzdWJsaWNlbmNlLgorICoKKyAqIFRoaXMgd29yayBpcyBwcm92aWRlZCAiQVMgSVMiIGFuZCBXSVRIT1VUIFdBUlJBTlRZIG9mIGFueSBraW5kLCB0bworICogdGhlIHV0bW9zdCBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBuZWl0aGVyIGV4cHJlc3Mgbm9yCisgKiBpbXBsaWVkOyB3aXRob3V0IG1hbGljaW91cyBpbnRlbnQgb3IgZ3Jvc3MgbmVnbGlnZW5jZS4gSW4gbm8gZXZlbnQKKyAqIG1heSBhIGxpY2Vuc29yLCBhdXRob3Igb3IgY29udHJpYnV0b3IgYmUgaGVsZCBsaWFibGUgZm9yIGluZGlyZWN0LAorICogZGlyZWN0LCBvdGhlciBkYW1hZ2UsIGxvc3MsIG9yIG90aGVyIGlzc3VlcyBhcmlzaW5nIGluIGFueSB3YXkgb3V0CisgKiBvZiBkZWFsaW5nIGluIHRoZSB3b3JrLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2gKKyAqIGRhbWFnZSBvciBleGlzdGVuY2Ugb2YgYSBkZWZlY3QsIGV4Y2VwdCBwcm92ZW4gdGhhdCBpdCByZXN1bHRzIG91dAorICogb2Ygc2FpZCBwZXJzb24ncyBpbW1lZGlhdGUgZmF1bHQgd2hlbiB1c2luZyB0aGUgd29yayBhcyBpbnRlbmRlZC4KKyAqLworCisjaW5jbHVkZSAic2guaCIKKworX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvc3luLmMsdiAxLjQ5IDIwMTAvMDcvMTcgMjI6MDk6MzkgdGcgRXhwICQiKTsKKworc3RydWN0IG5lc3Rpbmdfc3RhdGUgeworCWludCBzdGFydF90b2tlbjsJLyogdG9rZW4gdGhhbiBiZWdhbiBuZXN0aW5nIChlZywgRk9SKSAqLworCWludCBzdGFydF9saW5lOwkJLyogbGluZSBuZXN0aW5nIGJlZ2FuIG9uICovCit9OworCitzdGF0aWMgdm9pZCB5eXBhcnNlKHZvaWQpOworc3RhdGljIHN0cnVjdCBvcCAqcGlwZWxpbmUoaW50KTsKK3N0YXRpYyBzdHJ1Y3Qgb3AgKmFuZG9yKHZvaWQpOworc3RhdGljIHN0cnVjdCBvcCAqY19saXN0KGludCk7CitzdGF0aWMgc3RydWN0IGlvd29yZCAqc3luaW8oaW50KTsKK3N0YXRpYyBzdHJ1Y3Qgb3AgKm5lc3RlZChpbnQsIGludCwgaW50KTsKK3N0YXRpYyBzdHJ1Y3Qgb3AgKmdldF9jb21tYW5kKGludCk7CitzdGF0aWMgc3RydWN0IG9wICpkb2dyb3VwKHZvaWQpOworc3RhdGljIHN0cnVjdCBvcCAqdGhlbnBhcnQodm9pZCk7CitzdGF0aWMgc3RydWN0IG9wICplbHNlcGFydCh2b2lkKTsKK3N0YXRpYyBzdHJ1Y3Qgb3AgKmNhc2VsaXN0KHZvaWQpOworc3RhdGljIHN0cnVjdCBvcCAqY2FzZXBhcnQoaW50KTsKK3N0YXRpYyBzdHJ1Y3Qgb3AgKmZ1bmN0aW9uX2JvZHkoY2hhciAqLCBib29sKTsKK3N0YXRpYyBjaGFyICoqd29yZGxpc3Qodm9pZCk7CitzdGF0aWMgc3RydWN0IG9wICpibG9jayhpbnQsIHN0cnVjdCBvcCAqLCBzdHJ1Y3Qgb3AgKiwgY2hhciAqKik7CitzdGF0aWMgc3RydWN0IG9wICpuZXd0cChpbnQpOworc3RhdGljIHZvaWQgc3ludGF4ZXJyKGNvbnN0IGNoYXIgKikgTUtTSF9BX05PUkVUVVJOOworc3RhdGljIHZvaWQgbmVzdGluZ19wdXNoKHN0cnVjdCBuZXN0aW5nX3N0YXRlICosIGludCk7CitzdGF0aWMgdm9pZCBuZXN0aW5nX3BvcChzdHJ1Y3QgbmVzdGluZ19zdGF0ZSAqKTsKK3N0YXRpYyBpbnQgYXNzaWduX2NvbW1hbmQoY2hhciAqKTsKK3N0YXRpYyBpbnQgaW5hbGlhcyhzdHJ1Y3Qgc291cmNlICopOworc3RhdGljIFRlc3Rfb3AgZGJ0ZXN0cF9pc2EoVGVzdF9lbnYgKiwgVGVzdF9tZXRhKTsKK3N0YXRpYyBjb25zdCBjaGFyICpkYnRlc3RwX2dldG9wbmQoVGVzdF9lbnYgKiwgVGVzdF9vcCwgYm9vbCk7CitzdGF0aWMgaW50IGRidGVzdHBfZXZhbChUZXN0X2VudiAqLCBUZXN0X29wLCBjb25zdCBjaGFyICosCisgICAgY29uc3QgY2hhciAqLCBib29sKTsKK3N0YXRpYyB2b2lkIGRidGVzdHBfZXJyb3IoVGVzdF9lbnYgKiwgaW50LCBjb25zdCBjaGFyICopIE1LU0hfQV9OT1JFVFVSTjsKKworc3RhdGljIHN0cnVjdCBvcCAqb3V0dHJlZTsJCS8qIHl5cGFyc2Ugb3V0cHV0ICovCitzdGF0aWMgc3RydWN0IG5lc3Rpbmdfc3RhdGUgbmVzdGluZzsJLyogXG4gY2hhbmdlZCB0byA7ICovCisKK3N0YXRpYyBpbnQgcmVqZWN0OwkJLyogdG9rZW4oY2YpIGdldHMgc3ltYm9sIGFnYWluICovCitzdGF0aWMgaW50IHN5bWJvbDsJCS8qIHl5bGV4IHZhbHVlICovCisKKyNkZWZpbmUgUkVKRUNUCQkocmVqZWN0ID0gMSkKKyNkZWZpbmUgQUNDRVBUCQkocmVqZWN0ID0gMCkKKyNkZWZpbmUgdG9rZW4oY2YpCSgocmVqZWN0KSA/IChBQ0NFUFQsIHN5bWJvbCkgOiAoc3ltYm9sID0geXlsZXgoY2YpKSkKKyNkZWZpbmUgdHBlZWsoY2YpCSgocmVqZWN0KSA/IChzeW1ib2wpIDogKFJFSkVDVCwgc3ltYm9sID0geXlsZXgoY2YpKSkKKyNkZWZpbmUgbXVzdGhhdmUoYyxjZikJZG8geyBpZiAodG9rZW4oY2YpICE9IChjKSkgc3ludGF4ZXJyKE5VTEwpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZAoreXlwYXJzZSh2b2lkKQoreworCWludCBjOworCisJQUNDRVBUOworCisJb3V0dHJlZSA9IGNfbGlzdChzb3VyY2UtPnR5cGUgPT0gU1NUUklORyk7CisJYyA9IHRwZWVrKDApOworCWlmIChjID09IDAgJiYgIW91dHRyZWUpCisJCW91dHRyZWUgPSBuZXd0cChURU9GKTsKKwllbHNlIGlmIChjICE9ICdcbicgJiYgYyAhPSAwKQorCQlzeW50YXhlcnIoTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3AgKgorcGlwZWxpbmUoaW50IGNmKQoreworCXN0cnVjdCBvcCAqdCwgKnAsICp0bCA9IE5VTEw7CisKKwl0ID0gZ2V0X2NvbW1hbmQoY2YpOworCWlmICh0ICE9IE5VTEwpIHsKKwkJd2hpbGUgKHRva2VuKDApID09ICd8JykgeworCQkJaWYgKChwID0gZ2V0X2NvbW1hbmQoQ09OVElOKSkgPT0gTlVMTCkKKwkJCQlzeW50YXhlcnIoTlVMTCk7CisJCQlpZiAodGwgPT0gTlVMTCkKKwkJCQl0ID0gdGwgPSBibG9jayhUUElQRSwgdCwgcCwgTk9XT1JEUyk7CisJCQllbHNlCisJCQkJdGwgPSB0bC0+cmlnaHQgPSBibG9jayhUUElQRSwgdGwtPnJpZ2h0LCBwLCBOT1dPUkRTKTsKKwkJfQorCQlSRUpFQ1Q7CisJfQorCXJldHVybiAodCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3AgKgorYW5kb3Iodm9pZCkKK3sKKwlzdHJ1Y3Qgb3AgKnQsICpwOworCWludCBjOworCisJdCA9IHBpcGVsaW5lKDApOworCWlmICh0ICE9IE5VTEwpIHsKKwkJd2hpbGUgKChjID0gdG9rZW4oMCkpID09IExPR0FORCB8fCBjID09IExPR09SKSB7CisJCQlpZiAoKHAgPSBwaXBlbGluZShDT05USU4pKSA9PSBOVUxMKQorCQkJCXN5bnRheGVycihOVUxMKTsKKwkJCXQgPSBibG9jayhjID09IExPR0FORD8gVEFORDogVE9SLCB0LCBwLCBOT1dPUkRTKTsKKwkJfQorCQlSRUpFQ1Q7CisJfQorCXJldHVybiAodCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3AgKgorY19saXN0KGludCBtdWx0aSkKK3sKKwlzdHJ1Y3Qgb3AgKnQgPSBOVUxMLCAqcCwgKnRsID0gTlVMTDsKKwlpbnQgYywgaGF2ZV9zZXA7CisKKwl3aGlsZSAoMSkgeworCQlwID0gYW5kb3IoKTsKKwkJLyogVG9rZW4gaGFzIGFsd2F5cyBiZWVuIHJlYWQvcmVqZWN0ZWQgYXQgdGhpcyBwb2ludCwgc28KKwkJICogd2UgZG9uJ3Qgd29ycnkgYWJvdXQgd2hhdCBmbGFncyB0byBwYXNzIHRva2VuKCkKKwkJICovCisJCWMgPSB0b2tlbigwKTsKKwkJaGF2ZV9zZXAgPSAxOworCQlpZiAoYyA9PSAnXG4nICYmIChtdWx0aSB8fCBpbmFsaWFzKHNvdXJjZSkpKSB7CisJCQlpZiAoIXApIC8qIGlnbm9yZSBibGFuayBsaW5lcyAqLworCQkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKCFwKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKGMgPT0gJyYnIHx8IGMgPT0gQ09QUk9DKQorCQkJcCA9IGJsb2NrKGMgPT0gJyYnID8gVEFTWU5DIDogVENPUFJPQywKKwkJCSAgICBwLCBOT0JMT0NLLCBOT1dPUkRTKTsKKwkJZWxzZSBpZiAoYyAhPSAnOycpCisJCQloYXZlX3NlcCA9IDA7CisJCWlmICghdCkKKwkJCXQgPSBwOworCQllbHNlIGlmICghdGwpCisJCQl0ID0gdGwgPSBibG9jayhUTElTVCwgdCwgcCwgTk9XT1JEUyk7CisJCWVsc2UKKwkJCXRsID0gdGwtPnJpZ2h0ID0gYmxvY2soVExJU1QsIHRsLT5yaWdodCwgcCwgTk9XT1JEUyk7CisJCWlmICghaGF2ZV9zZXApCisJCQlicmVhazsKKwl9CisJUkVKRUNUOworCXJldHVybiAodCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW93b3JkICoKK3N5bmlvKGludCBjZikKK3sKKwlzdHJ1Y3QgaW93b3JkICppb3A7CisJc3RhdGljIHN0cnVjdCBpb3dvcmQgKm5leHRpb3AgPSBOVUxMOworCWJvb2wgaXNoZXJlOworCisJaWYgKG5leHRpb3AgIT0gTlVMTCkgeworCQlpb3AgPSBuZXh0aW9wOworCQluZXh0aW9wID0gTlVMTDsKKwkJcmV0dXJuIChpb3ApOworCX0KKworCWlmICh0cGVlayhjZikgIT0gUkVESVIpCisJCXJldHVybiAoTlVMTCk7CisJQUNDRVBUOworCWlvcCA9IHl5bHZhbC5pb3A7CisJaXNoZXJlID0gKGlvcC0+ZmxhZyZJT1RZUEUpID09IElPSEVSRTsKKwltdXN0aGF2ZShMV09SRCwgaXNoZXJlID8gSEVSRURFTElNIDogMCk7CisJaWYgKGlzaGVyZSkgeworCQlpb3AtPmRlbGltID0geXlsdmFsLmNwOworCQlpZiAoKmlkZW50ICE9IDApIC8qIHVucXVvdGVkICovCisJCQlpb3AtPmZsYWcgfD0gSU9FVkFMOworCQlpZiAoaGVyZXAgPiAmaGVyZXNbSEVSRVMgLSAxXSkKKwkJCXl5ZXJyb3IoInRvbyBtYW55IDw8c1xuIik7CisJCSpoZXJlcCsrID0gaW9wOworCX0gZWxzZQorCQlpb3AtPm5hbWUgPSB5eWx2YWwuY3A7CisKKwlpZiAoaW9wLT5mbGFnICYgSU9CQVNIKSB7CisJCWNoYXIgKmNwOworCisJCW5leHRpb3AgPSBhbGxvYyhzaXplb2YoKmlvcCksIEFURU1QKTsKKwkJbmV4dGlvcC0+bmFtZSA9IGNwID0gYWxsb2MoNSwgQVRFTVApOworCisJCWlmIChpb3AtPnVuaXQgPiA5KSB7CisJCQkqY3ArKyA9IENIQVI7CisJCQkqY3ArKyA9ICcwJyArIChpb3AtPnVuaXQgLyAxMCk7CisJCX0KKwkJKmNwKysgPSBDSEFSOworCQkqY3ArKyA9ICcwJyArIChpb3AtPnVuaXQgJSAxMCk7CisJCSpjcCA9IEVPUzsKKworCQlpb3AtPmZsYWcgJj0gfklPQkFTSDsKKwkJbmV4dGlvcC0+dW5pdCA9IDI7CisJCW5leHRpb3AtPmZsYWcgPSBJT0RVUDsKKwkJbmV4dGlvcC0+ZGVsaW0gPSBOVUxMOworCQluZXh0aW9wLT5oZXJlZG9jID0gTlVMTDsKKwl9CisJcmV0dXJuIChpb3ApOworfQorCitzdGF0aWMgc3RydWN0IG9wICoKK25lc3RlZChpbnQgdHlwZSwgaW50IHNtYXJrLCBpbnQgZW1hcmspCit7CisJc3RydWN0IG9wICp0OworCXN0cnVjdCBuZXN0aW5nX3N0YXRlIG9sZF9uZXN0aW5nOworCisJbmVzdGluZ19wdXNoKCZvbGRfbmVzdGluZywgc21hcmspOworCXQgPSBjX2xpc3QodHJ1ZSk7CisJbXVzdGhhdmUoZW1hcmssIEtFWVdPUkR8QUxJQVMpOworCW5lc3RpbmdfcG9wKCZvbGRfbmVzdGluZyk7CisJcmV0dXJuIChibG9jayh0eXBlLCB0LCBOT0JMT0NLLCBOT1dPUkRTKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3AgKgorZ2V0X2NvbW1hbmQoaW50IGNmKQoreworCXN0cnVjdCBvcCAqdDsKKwlpbnQgYywgaW9wbiA9IDAsIHN5bmlvY2Y7CisJc3RydWN0IGlvd29yZCAqaW9wLCAqKmlvcHM7CisJWFB0clYgYXJncywgdmFyczsKKwlzdHJ1Y3QgbmVzdGluZ19zdGF0ZSBvbGRfbmVzdGluZzsKKworCWlvcHMgPSBhbGxvYygoTlVGSUxFICsgMSkgKiBzaXplb2Yoc3RydWN0IGlvd29yZCAqKSwgQVRFTVApOworCVhQaW5pdChhcmdzLCAxNik7CisJWFBpbml0KHZhcnMsIDE2KTsKKworCXN5bmlvY2YgPSBLRVlXT1JEfEFMSUFTOworCXN3aXRjaCAoYyA9IHRva2VuKGNmfEtFWVdPUkR8QUxJQVN8VkFSQVNOKSkgeworCWRlZmF1bHQ6CisJCVJFSkVDVDsKKwkJYWZyZWUoaW9wcywgQVRFTVApOworCQlYUGZyZWUoYXJncyk7CisJCVhQZnJlZSh2YXJzKTsKKwkJcmV0dXJuIChOVUxMKTsgLyogZW1wdHkgbGluZSAqLworCisJY2FzZSBMV09SRDoKKwljYXNlIFJFRElSOgorCQlSRUpFQ1Q7CisJCXN5bmlvY2YgJj0gfihLRVlXT1JEfEFMSUFTKTsKKwkJdCA9IG5ld3RwKFRDT00pOworCQl0LT5saW5lbm8gPSBzb3VyY2UtPmxpbmU7CisJCXdoaWxlICgxKSB7CisJCQljZiA9ICh0LT51LmV2YWxmbGFncyA/IEFSUkFZVkFSIDogMCkgfAorCQkJICAgIChYUHNpemUoYXJncykgPT0gMCA/IEFMSUFTfFZBUkFTTiA6IENNRFdPUkQpOworCQkJc3dpdGNoICh0cGVlayhjZikpIHsKKwkJCWNhc2UgUkVESVI6CisJCQkJd2hpbGUgKChpb3AgPSBzeW5pbyhjZikpICE9IE5VTEwpIHsKKwkJCQkJaWYgKGlvcG4gPj0gTlVGSUxFKQorCQkJCQkJeXllcnJvcigidG9vIG1hbnkgcmVkaXJlY3Rpb25zXG4iKTsKKwkJCQkJaW9wc1tpb3BuKytdID0gaW9wOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBMV09SRDoKKwkJCQlBQ0NFUFQ7CisJCQkJLyogdGhlIGlvcG4gPT0gMCBhbmQgWFBzaXplKHZhcnMpID09IDAgYXJlCisJCQkJICogZHViaW91cyBidXQgQVQmVCBrc2ggYWN0cyB0aGlzIHdheQorCQkJCSAqLworCQkJCWlmIChpb3BuID09IDAgJiYgWFBzaXplKHZhcnMpID09IDAgJiYKKwkJCQkgICAgWFBzaXplKGFyZ3MpID09IDAgJiYKKwkJCQkgICAgYXNzaWduX2NvbW1hbmQoaWRlbnQpKQorCQkJCQl0LT51LmV2YWxmbGFncyA9IERPVkFDSEVDSzsKKwkJCQlpZiAoKFhQc2l6ZShhcmdzKSA9PSAwIHx8IEZsYWcoRktFWVdPUkQpKSAmJgorCQkJCSAgICBpc193ZHZhcmFzc2lnbih5eWx2YWwuY3ApKQorCQkJCQlYUHB1dCh2YXJzLCB5eWx2YWwuY3ApOworCQkJCWVsc2UKKwkJCQkJWFBwdXQoYXJncywgeXlsdmFsLmNwKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnKCc6CisJCQkJLyogQ2hlY2sgZm9yICI+IGZvbyAoZWNobyBoaSkiIHdoaWNoIEFUJlQga3NoCisJCQkJICogYWxsb3dzIChub3QgUE9TSVgsIGJ1dCBub3QgZGlzYWxsb3dlZCkKKwkJCQkgKi8KKwkJCQlhZnJlZSh0LCBBVEVNUCk7CisJCQkJaWYgKFhQc2l6ZShhcmdzKSA9PSAwICYmIFhQc2l6ZSh2YXJzKSA9PSAwKSB7CisJCQkJCUFDQ0VQVDsKKwkJCQkJZ290byBTdWJzaGVsbDsKKwkJCQl9CisjaWZuZGVmIE1LU0hfU01BTEwKKwkJCQlpZiAoKFhQc2l6ZShhcmdzKSA9PSAwIHx8IEZsYWcoRktFWVdPUkQpKSAmJgorCQkJCSAgICBYUHNpemUodmFycykgPT0gMSAmJiBpc193ZHZhcmFzc2lnbih5eWx2YWwuY3ApKQorCQkJCQlnb3RvIGlzX3dkYXJyYXNzaWduOworI2VuZGlmCisJCQkJLyogTXVzdCBiZSBhIGZ1bmN0aW9uICovCisJCQkJaWYgKGlvcG4gIT0gMCB8fCBYUHNpemUoYXJncykgIT0gMSB8fAorCQkJCSAgICBYUHNpemUodmFycykgIT0gMCkKKwkJCQkJc3ludGF4ZXJyKE5VTEwpOworCQkJCUFDQ0VQVDsKKwkJCQkvKigqLworCQkJCW11c3RoYXZlKCcpJywgMCk7CisJCQkJdCA9IGZ1bmN0aW9uX2JvZHkoWFBwdHJ2KGFyZ3MpWzBdLCBmYWxzZSk7CisJCQkJZ290byBMZWF2ZTsKKyNpZm5kZWYgTUtTSF9TTUFMTAorIGlzX3dkYXJyYXNzaWduOgorCQkJeworCQkJCXN0YXRpYyBjb25zdCBjaGFyIHNldF9jbWQwW10gPSB7CisJCQkJCUNIQVIsICdlJywgQ0hBUiwgJ3YnLAorCQkJCQlDSEFSLCAnYScsIENIQVIsICdsJywgRU9TCisJCQkJfTsKKwkJCQlzdGF0aWMgY29uc3QgY2hhciBzZXRfY21kMVtdID0geworCQkJCQlDSEFSLCAncycsIENIQVIsICdlJywKKwkJCQkJQ0hBUiwgJ3QnLCBDSEFSLCAnICcsCisJCQkJCUNIQVIsICctJywgQ0hBUiwgJ0EnLCBFT1MKKwkJCQl9OworCQkJCXN0YXRpYyBjb25zdCBjaGFyIHNldF9jbWQyW10gPSB7CisJCQkJCUNIQVIsICctJywgQ0hBUiwgJy0nLCBFT1MKKwkJCQl9OworCQkJCWNoYXIgKnRjcDsKKwkJCQlYUGZyZWUodmFycyk7CisJCQkJWFBpbml0KHZhcnMsIDE2KTsKKwkJCQkvKgorCQkJCSAqIHdlIGtub3cgKG9yIHJhdGhlciBob3BlKSB0aGF0IHl5bHZhbC5jcAorCQkJCSAqIGNvbnRhaW5zIGEgc3RyaW5nICJ2YXJuYW1lPSIKKwkJCQkgKi8KKwkJCQl0Y3AgPSB3ZGNvcHkoeXlsdmFsLmNwLCBBVEVNUCk7CisJCQkJdGNwW3dkc2Nhbih0Y3AsIEVPUykgLSB0Y3AgLSAzXSA9IEVPUzsKKwkJCQkvKiBub3cgbWFrZSBhbiBhcnJheSBhc3NpZ25tZW50IGNvbW1hbmQgKi8KKwkJCQl0ID0gbmV3dHAoVENPTSk7CisJCQkJdC0+bGluZW5vID0gc291cmNlLT5saW5lOworCQkJCUFDQ0VQVDsKKwkJCQlYUHB1dChhcmdzLCB3ZGNvcHkoc2V0X2NtZDAsIEFURU1QKSk7CisJCQkJWFBwdXQoYXJncywgd2Rjb3B5KHNldF9jbWQxLCBBVEVNUCkpOworCQkJCVhQcHV0KGFyZ3MsIHRjcCk7CisJCQkJWFBwdXQoYXJncywgd2Rjb3B5KHNldF9jbWQyLCBBVEVNUCkpOworCQkJCW11c3RoYXZlKExXT1JELExFVEFSUkFZKTsKKwkJCQlYUHB1dChhcmdzLCB5eWx2YWwuY3ApOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBMZWF2ZTsKKwkJCX0KKwkJfQorIExlYXZlOgorCQlicmVhazsKKworCWNhc2UgJygnOgorIFN1YnNoZWxsOgorCQl0ID0gbmVzdGVkKFRQQVJFTiwgJygnLCAnKScpOworCQlicmVhazsKKworCWNhc2UgJ3snOiAvKn0qLworCQl0ID0gbmVzdGVkKFRCUkFDRSwgJ3snLCAnfScpOworCQlicmVhazsKKworCWNhc2UgTURQQVJFTjogeworCQlpbnQgbG5vOworCQlzdGF0aWMgY29uc3QgY2hhciBsZXRfY21kW10gPSB7CisJCQlDSEFSLCAnbCcsIENIQVIsICdlJywKKwkJCUNIQVIsICd0JywgRU9TCisJCX07CisKKwkJLyogTGVhdmUgS0VZV09SRCBpbiBzeW5pb2NmIChhbGxvdyBpZiAoKCAxICkpIHRoZW4gLi4uKSAqLworCQlsbm8gPSBzb3VyY2UtPmxpbmU7CisJCUFDQ0VQVDsKKwkJc3dpdGNoICh0b2tlbihMRVRFWFBSKSkgeworCQljYXNlIExXT1JEOgorCQkJYnJlYWs7CisJCWNhc2UgJygnOgkvKiApICovCisJCQlnb3RvIFN1YnNoZWxsOworCQlkZWZhdWx0OgorCQkJc3ludGF4ZXJyKE5VTEwpOworCQl9CisJCXQgPSBuZXd0cChUQ09NKTsKKwkJdC0+bGluZW5vID0gbG5vOworCQlYUHB1dChhcmdzLCB3ZGNvcHkobGV0X2NtZCwgQVRFTVApKTsKKwkJWFBwdXQoYXJncywgeXlsdmFsLmNwKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBEQlJBQ0tFVDogLyogW1sgLi4gXV0gKi8KKwkJLyogTGVhdmUgS0VZV09SRCBpbiBzeW5pb2NmIChhbGxvdyBpZiBbWyAtbiAxIF1dIHRoZW4gLi4uKSAqLworCQl0ID0gbmV3dHAoVERCUkFDS0VUKTsKKwkJQUNDRVBUOworCQl7CisJCQlUZXN0X2VudiB0ZTsKKworCQkJdGUuZmxhZ3MgPSBURUZfREJSQUNLRVQ7CisJCQl0ZS5wb3MuYXYgPSAmYXJnczsKKwkJCXRlLmlzYSA9IGRidGVzdHBfaXNhOworCQkJdGUuZ2V0b3BuZCA9IGRidGVzdHBfZ2V0b3BuZDsKKwkJCXRlLmV2YWwgPSBkYnRlc3RwX2V2YWw7CisJCQl0ZS5lcnJvciA9IGRidGVzdHBfZXJyb3I7CisKKwkJCXRlc3RfcGFyc2UoJnRlKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgRk9SOgorCWNhc2UgU0VMRUNUOgorCQl0ID0gbmV3dHAoKGMgPT0gRk9SKSA/IFRGT1IgOiBUU0VMRUNUKTsKKwkJbXVzdGhhdmUoTFdPUkQsIEFSUkFZVkFSKTsKKwkJaWYgKCFpc193ZHZhcm5hbWUoeXlsdmFsLmNwLCB0cnVlKSkKKwkJCXl5ZXJyb3IoIiVzOiBiYWQgaWRlbnRpZmllclxuIiwKKwkJCSAgICBjID09IEZPUiA/ICJmb3IiIDogInNlbGVjdCIpOworCQlzdHJkdXB4KHQtPnN0ciwgaWRlbnQsIEFURU1QKTsKKwkJbmVzdGluZ19wdXNoKCZvbGRfbmVzdGluZywgYyk7CisJCXQtPnZhcnMgPSB3b3JkbGlzdCgpOworCQl0LT5sZWZ0ID0gZG9ncm91cCgpOworCQluZXN0aW5nX3BvcCgmb2xkX25lc3RpbmcpOworCQlicmVhazsKKworCWNhc2UgV0hJTEU6CisJY2FzZSBVTlRJTDoKKwkJbmVzdGluZ19wdXNoKCZvbGRfbmVzdGluZywgYyk7CisJCXQgPSBuZXd0cCgoYyA9PSBXSElMRSkgPyBUV0hJTEUgOiBUVU5USUwpOworCQl0LT5sZWZ0ID0gY19saXN0KHRydWUpOworCQl0LT5yaWdodCA9IGRvZ3JvdXAoKTsKKwkJbmVzdGluZ19wb3AoJm9sZF9uZXN0aW5nKTsKKwkJYnJlYWs7CisKKwljYXNlIENBU0U6CisJCXQgPSBuZXd0cChUQ0FTRSk7CisJCW11c3RoYXZlKExXT1JELCAwKTsKKwkJdC0+c3RyID0geXlsdmFsLmNwOworCQluZXN0aW5nX3B1c2goJm9sZF9uZXN0aW5nLCBjKTsKKwkJdC0+bGVmdCA9IGNhc2VsaXN0KCk7CisJCW5lc3RpbmdfcG9wKCZvbGRfbmVzdGluZyk7CisJCWJyZWFrOworCisJY2FzZSBJRjoKKwkJbmVzdGluZ19wdXNoKCZvbGRfbmVzdGluZywgYyk7CisJCXQgPSBuZXd0cChUSUYpOworCQl0LT5sZWZ0ID0gY19saXN0KHRydWUpOworCQl0LT5yaWdodCA9IHRoZW5wYXJ0KCk7CisJCW11c3RoYXZlKEZJLCBLRVlXT1JEfEFMSUFTKTsKKwkJbmVzdGluZ19wb3AoJm9sZF9uZXN0aW5nKTsKKwkJYnJlYWs7CisKKwljYXNlIEJBTkc6CisJCXN5bmlvY2YgJj0gfihLRVlXT1JEfEFMSUFTKTsKKwkJdCA9IHBpcGVsaW5lKDApOworCQlpZiAodCA9PSBOVUxMKQorCQkJc3ludGF4ZXJyKE5VTEwpOworCQl0ID0gYmxvY2soVEJBTkcsIE5PQkxPQ0ssIHQsIE5PV09SRFMpOworCQlicmVhazsKKworCWNhc2UgVElNRToKKwkJc3luaW9jZiAmPSB+KEtFWVdPUkR8QUxJQVMpOworCQl0ID0gcGlwZWxpbmUoMCk7CisJCWlmICh0KSB7CisJCQl0LT5zdHIgPSBhbGxvYygyLCBBVEVNUCk7CisJCQl0LT5zdHJbMF0gPSAnXDAnOwkvKiBURl8qIGZsYWdzICovCisJCQl0LT5zdHJbMV0gPSAnXDAnOworCQl9CisJCXQgPSBibG9jayhUVElNRSwgdCwgTk9CTE9DSywgTk9XT1JEUyk7CisJCWJyZWFrOworCisJY2FzZSBGVU5DVElPTjoKKwkJbXVzdGhhdmUoTFdPUkQsIDApOworCQl0ID0gZnVuY3Rpb25fYm9keSh5eWx2YWwuY3AsIHRydWUpOworCQlicmVhazsKKwl9CisKKwl3aGlsZSAoKGlvcCA9IHN5bmlvKHN5bmlvY2YpKSAhPSBOVUxMKSB7CisJCWlmIChpb3BuID49IE5VRklMRSkKKwkJCXl5ZXJyb3IoInRvbyBtYW55IHJlZGlyZWN0aW9uc1xuIik7CisJCWlvcHNbaW9wbisrXSA9IGlvcDsKKwl9CisKKwlpZiAoaW9wbiA9PSAwKSB7CisJCWFmcmVlKGlvcHMsIEFURU1QKTsKKwkJdC0+aW9hY3QgPSBOVUxMOworCX0gZWxzZSB7CisJCWlvcHNbaW9wbisrXSA9IE5VTEw7CisJCWlvcHMgPSBhcmVzaXplKGlvcHMsIGlvcG4gKiBzaXplb2Yoc3RydWN0IGlvd29yZCAqKSwgQVRFTVApOworCQl0LT5pb2FjdCA9IGlvcHM7CisJfQorCisJaWYgKHQtPnR5cGUgPT0gVENPTSB8fCB0LT50eXBlID09IFREQlJBQ0tFVCkgeworCQlYUHB1dChhcmdzLCBOVUxMKTsKKwkJdC0+YXJncyA9IChjb25zdCBjaGFyICoqKVhQY2xvc2UoYXJncyk7CisJCVhQcHV0KHZhcnMsIE5VTEwpOworCQl0LT52YXJzID0gKGNoYXIgKiopIFhQY2xvc2UodmFycyk7CisJfSBlbHNlIHsKKwkJWFBmcmVlKGFyZ3MpOworCQlYUGZyZWUodmFycyk7CisJfQorCisJcmV0dXJuICh0KTsKK30KKworc3RhdGljIHN0cnVjdCBvcCAqCitkb2dyb3VwKHZvaWQpCit7CisJaW50IGM7CisJc3RydWN0IG9wICpsaXN0OworCisJYyA9IHRva2VuKENPTlRJTnxLRVlXT1JEfEFMSUFTKTsKKwkvKiBBIHsuLi59IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgZG8uLi5kb25lIGZvciBmb3Ivc2VsZWN0IGxvb3BzCisJICogYnV0IG5vdCBmb3Igd2hpbGUvdW50aWwgbG9vcHMgLSB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGlmIGl0CisJICogaXMgYSB3aGlsZSBsb29wIGJlY2F1c2UgaXQgd291bGQgaGF2ZSBiZWVuIHBhcnNlZCBhcyBwYXJ0IG9mCisJICogdGhlIGNvbmRpdGlvbmFsIGNvbW1hbmQgbGlzdC4uLgorCSAqLworCWlmIChjID09IERPKQorCQljID0gRE9ORTsKKwllbHNlIGlmIChjID09ICd7JykKKwkJYyA9ICd9JzsKKwllbHNlCisJCXN5bnRheGVycihOVUxMKTsKKwlsaXN0ID0gY19saXN0KHRydWUpOworCW11c3RoYXZlKGMsIEtFWVdPUkR8QUxJQVMpOworCXJldHVybiAobGlzdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3AgKgordGhlbnBhcnQodm9pZCkKK3sKKwlzdHJ1Y3Qgb3AgKnQ7CisKKwltdXN0aGF2ZShUSEVOLCBLRVlXT1JEfEFMSUFTKTsKKwl0ID0gbmV3dHAoMCk7CisJdC0+bGVmdCA9IGNfbGlzdCh0cnVlKTsKKwlpZiAodC0+bGVmdCA9PSBOVUxMKQorCQlzeW50YXhlcnIoTlVMTCk7CisJdC0+cmlnaHQgPSBlbHNlcGFydCgpOworCXJldHVybiAodCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3AgKgorZWxzZXBhcnQodm9pZCkKK3sKKwlzdHJ1Y3Qgb3AgKnQ7CisKKwlzd2l0Y2ggKHRva2VuKEtFWVdPUkR8QUxJQVN8VkFSQVNOKSkgeworCWNhc2UgRUxTRToKKwkJaWYgKCh0ID0gY19saXN0KHRydWUpKSA9PSBOVUxMKQorCQkJc3ludGF4ZXJyKE5VTEwpOworCQlyZXR1cm4gKHQpOworCisJY2FzZSBFTElGOgorCQl0ID0gbmV3dHAoVEVMSUYpOworCQl0LT5sZWZ0ID0gY19saXN0KHRydWUpOworCQl0LT5yaWdodCA9IHRoZW5wYXJ0KCk7CisJCXJldHVybiAodCk7CisKKwlkZWZhdWx0OgorCQlSRUpFQ1Q7CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3AgKgorY2FzZWxpc3Qodm9pZCkKK3sKKwlzdHJ1Y3Qgb3AgKnQsICp0bDsKKwlpbnQgYzsKKworCWMgPSB0b2tlbihDT05USU58S0VZV09SRHxBTElBUyk7CisJLyogQSB7Li4ufSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGluLi4uZXNhYyBmb3IgY2FzZSBzdGF0ZW1lbnRzICovCisJaWYgKGMgPT0gSU4pCisJCWMgPSBFU0FDOworCWVsc2UgaWYgKGMgPT0gJ3snKQorCQljID0gJ30nOworCWVsc2UKKwkJc3ludGF4ZXJyKE5VTEwpOworCXQgPSB0bCA9IE5VTEw7CisJd2hpbGUgKCh0cGVlayhDT05USU58S0VZV09SRHxFU0FDT05MWSkpICE9IGMpIHsgLyogbm8gQUxJQVMgaGVyZSAqLworCQlzdHJ1Y3Qgb3AgKnRjID0gY2FzZXBhcnQoYyk7CisJCWlmICh0bCA9PSBOVUxMKQorCQkJdCA9IHRsID0gdGMsIHRsLT5yaWdodCA9IE5VTEw7CisJCWVsc2UKKwkJCXRsLT5yaWdodCA9IHRjLCB0bCA9IHRjOworCX0KKwltdXN0aGF2ZShjLCBLRVlXT1JEfEFMSUFTKTsKKwlyZXR1cm4gKHQpOworfQorCitzdGF0aWMgc3RydWN0IG9wICoKK2Nhc2VwYXJ0KGludCBlbmR0b2spCit7CisJc3RydWN0IG9wICp0OworCVhQdHJWIHB0bnM7CisKKwlYUGluaXQocHRucywgMTYpOworCXQgPSBuZXd0cChUUEFUKTsKKwkvKiBubyBBTElBUyBoZXJlICovCisJaWYgKHRva2VuKENPTlRJTiB8IEtFWVdPUkQpICE9ICcoJykKKwkJUkVKRUNUOworCWRvIHsKKwkJbXVzdGhhdmUoTFdPUkQsIDApOworCQlYUHB1dChwdG5zLCB5eWx2YWwuY3ApOworCX0gd2hpbGUgKHRva2VuKDApID09ICd8Jyk7CisJUkVKRUNUOworCVhQcHV0KHB0bnMsIE5VTEwpOworCXQtPnZhcnMgPSAoY2hhciAqKikgWFBjbG9zZShwdG5zKTsKKwltdXN0aGF2ZSgnKScsIDApOworCisJdC0+bGVmdCA9IGNfbGlzdCh0cnVlKTsKKwkvKiBOb3RlOiBQT1NJWCByZXF1aXJlcyB0aGUgOzsgKi8KKwlpZiAoKHRwZWVrKENPTlRJTnxLRVlXT1JEfEFMSUFTKSkgIT0gZW5kdG9rKQorCQltdXN0aGF2ZShCUkVBSywgQ09OVElOfEtFWVdPUkR8QUxJQVMpOworCXJldHVybiAodCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3AgKgorZnVuY3Rpb25fYm9keShjaGFyICpuYW1lLAorICAgIGJvb2wga3NoX2Z1bmMpCQkvKiBmdW5jdGlvbiBmb28geyAuLi4gfSB2cyBmb28oKSB7IC4uIH0gKi8KK3sKKwljaGFyICpzbmFtZSwgKnA7CisJc3RydWN0IG9wICp0OworCWJvb2wgb2xkX2Z1bmNfcGFyc2U7CisKKwlzbmFtZSA9IHdkc3RyaXAobmFtZSwgZmFsc2UsIGZhbHNlKTsKKwkvKiBDaGVjayBmb3IgdmFsaWQgY2hhcmFjdGVycyBpbiBuYW1lLiBQT1NJWCBhbmQgQVQmVCBrc2g5MyBzYXkgb25seQorCSAqIGFsbG93IFthLXpBLVpfMC05XSBidXQgdGhpcyBhbGxvd3MgbW9yZSBhcyBvbGQgcGRrc2hzIGhhdmUKKwkgKiBhbGxvd2VkIG1vcmUgKHRoZSBmb2xsb3dpbmcgd2VyZSBuZXZlciBhbGxvd2VkOgorCSAqCU5VTCBUQUIgTkwgU1AgIiAkICYgJyAoICkgOyA8ID0gPiBcIGAgfAorCSAqIENfUVVPVEUgY292ZXJzIGFsbCBidXQgYWRkcyAjICogPyBbIF0KKwkgKi8KKwlmb3IgKHAgPSBzbmFtZTsgKnA7IHArKykKKwkJaWYgKGN0eXBlKCpwLCBDX1FVT1RFKSkKKwkJCXl5ZXJyb3IoIiVzOiBpbnZhbGlkIGZ1bmN0aW9uIG5hbWVcbiIsIHNuYW1lKTsKKworCS8qIE5vdGUgdGhhdCBQT1NJWCBhbGxvd3Mgb25seSBjb21wb3VuZCBzdGF0ZW1lbnRzIGFmdGVyIGZvbygpLCBzaCBhbmQKKwkgKiBBVCZUIGtzaCBhbGxvdyBhbnkgY29tbWFuZCwgZ28gd2l0aCB0aGUgbGF0ZXIgc2luY2UgaXQgc2hvdWxkbid0CisJICogYnJlYWsgYW55dGhpbmcuIEhvd2V2ZXIsIGZvciBmdW5jdGlvbiBmb28sIEFUJlQga3NoIG9ubHkgYWNjZXB0cworCSAqIGFuIG9wZW4tYnJhY2UuCisJICovCisJaWYgKGtzaF9mdW5jKSB7CisJCWlmICh0cGVlayhDT05USU58S0VZV09SRHxBTElBUykgPT0gJygnIC8qICkgKi8pIHsKKwkJCXN0cnVjdCB0YmwgKnRwOworCisJCQkvKiBmdW5jdGlvbiBmb28gKCkgeyAqLworCQkJQUNDRVBUOworCQkJbXVzdGhhdmUoJyknLCAwKTsKKwkJCS8qIGRlZ3JhZGUgdG8gUE9TSVggZnVuY3Rpb24gKi8KKwkJCWtzaF9mdW5jID0gZmFsc2U7CisJCQlpZiAoKHRwID0ga3RzZWFyY2goJmFsaWFzZXMsIHNuYW1lLCBoYXNoKHNuYW1lKSkpKQorCQkJCWt0ZGVsZXRlKHRwKTsKKwkJfQorCQltdXN0aGF2ZSgneycsIENPTlRJTnxLRVlXT1JEfEFMSUFTKTsgLyogfSAqLworCQlSRUpFQ1Q7CisJfQorCisJdCA9IG5ld3RwKFRGVU5DVCk7CisJdC0+c3RyID0gc25hbWU7CisJdC0+dS5rc2hfZnVuYyA9IGtzaF9mdW5jOworCXQtPmxpbmVubyA9IHNvdXJjZS0+bGluZTsKKworCW9sZF9mdW5jX3BhcnNlID0gZS0+ZmxhZ3MgJiBFRl9GVU5DX1BBUlNFOworCWUtPmZsYWdzIHw9IEVGX0ZVTkNfUEFSU0U7CisJaWYgKCh0LT5sZWZ0ID0gZ2V0X2NvbW1hbmQoQ09OVElOKSkgPT0gTlVMTCkgeworCQljaGFyICp0djsKKwkJLyoKKwkJICogUHJvYmFibHkgc29tZXRoaW5nIGxpa2UgZm9vKCkgZm9sbG93ZWQgYnkgZW9mIG9yIDsuCisJCSAqIFRoaXMgaXMgYWNjZXB0ZWQgYnkgc2ggYW5kIGtzaDg4LgorCQkgKiBUbyBtYWtlICJ0eXBlc2V0IC1mIGZvbyIgd29yayByZWxpYWJseSAoc28gaXRzIG91dHB1dCBjYW4KKwkJICogYmUgdXNlZCBhcyBpbnB1dCksIHdlIHByZXRlbmQgdGhlcmUgaXMgYSBjb2xvbiBoZXJlLgorCQkgKi8KKwkJdC0+bGVmdCA9IG5ld3RwKFRDT00pOworCQl0LT5sZWZ0LT5hcmdzID0gYWxsb2MoMiAqIHNpemVvZihjaGFyICopLCBBVEVNUCk7CisJCXQtPmxlZnQtPmFyZ3NbMF0gPSB0diA9IGFsbG9jKDMsIEFURU1QKTsKKwkJdHZbMF0gPSBDSEFSOworCQl0dlsxXSA9ICc6JzsKKwkJdHZbMl0gPSBFT1M7CisJCXQtPmxlZnQtPmFyZ3NbMV0gPSBOVUxMOworCQl0LT5sZWZ0LT52YXJzID0gYWxsb2Moc2l6ZW9mKGNoYXIgKiksIEFURU1QKTsKKwkJdC0+bGVmdC0+dmFyc1swXSA9IE5VTEw7CisJCXQtPmxlZnQtPmxpbmVubyA9IDE7CisJfQorCWlmICghb2xkX2Z1bmNfcGFyc2UpCisJCWUtPmZsYWdzICY9IH5FRl9GVU5DX1BBUlNFOworCisJcmV0dXJuICh0KTsKK30KKworc3RhdGljIGNoYXIgKioKK3dvcmRsaXN0KHZvaWQpCit7CisJaW50IGM7CisJWFB0clYgYXJnczsKKworCVhQaW5pdChhcmdzLCAxNik7CisJLyogUE9TSVggZG9lcyBub3QgZG8gYWxpYXMgZXhwYW5zaW9uIGhlcmUuLi4gKi8KKwlpZiAoKGMgPSB0b2tlbihDT05USU58S0VZV09SRHxBTElBUykpICE9IElOKSB7CisJCWlmIChjICE9ICc7JykgLyogbm9uLVBPU0lYLCBidXQgQVQmVCBrc2ggYWNjZXB0cyBhIDsgaGVyZSAqLworCQkJUkVKRUNUOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwl3aGlsZSAoKGMgPSB0b2tlbigwKSkgPT0gTFdPUkQpCisJCVhQcHV0KGFyZ3MsIHl5bHZhbC5jcCk7CisJaWYgKGMgIT0gJ1xuJyAmJiBjICE9ICc7JykKKwkJc3ludGF4ZXJyKE5VTEwpOworCWlmIChYUHNpemUoYXJncykgPT0gMCkgeworCQlYUGZyZWUoYXJncyk7CisJCXJldHVybiAoTlVMTCk7CisJfSBlbHNlIHsKKwkJWFBwdXQoYXJncywgTlVMTCk7CisJCXJldHVybiAoKGNoYXIgKiopWFBjbG9zZShhcmdzKSk7CisJfQorfQorCisvKgorICogc3VwcG9ydGluZyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgc3RydWN0IG9wICoKK2Jsb2NrKGludCB0eXBlLCBzdHJ1Y3Qgb3AgKnQxLCBzdHJ1Y3Qgb3AgKnQyLCBjaGFyICoqd3ApCit7CisJc3RydWN0IG9wICp0OworCisJdCA9IG5ld3RwKHR5cGUpOworCXQtPmxlZnQgPSB0MTsKKwl0LT5yaWdodCA9IHQyOworCXQtPnZhcnMgPSB3cDsKKwlyZXR1cm4gKHQpOworfQorCitjb25zdCBzdHJ1Y3QgdG9rZW5pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXNob3J0IHZhbDsKKwlzaG9ydCByZXNlcnZlZDsKK30gdG9rZW50YWJbXSA9IHsKKwkvKiBSZXNlcnZlZCB3b3JkcyAqLworCXsgImlmIiwJCUlGLAl0cnVlIH0sCisJeyAidGhlbiIsCVRIRU4sCXRydWUgfSwKKwl7ICJlbHNlIiwJRUxTRSwJdHJ1ZSB9LAorCXsgImVsaWYiLAlFTElGLAl0cnVlIH0sCisJeyAiZmkiLAkJRkksCXRydWUgfSwKKwl7ICJjYXNlIiwJQ0FTRSwJdHJ1ZSB9LAorCXsgImVzYWMiLAlFU0FDLAl0cnVlIH0sCisJeyAiZm9yIiwJRk9SLAl0cnVlIH0sCisJeyAic2VsZWN0IiwJU0VMRUNULAl0cnVlIH0sCisJeyAid2hpbGUiLAlXSElMRSwJdHJ1ZSB9LAorCXsgInVudGlsIiwJVU5USUwsCXRydWUgfSwKKwl7ICJkbyIsCQlETywJdHJ1ZSB9LAorCXsgImRvbmUiLAlET05FLAl0cnVlIH0sCisJeyAiaW4iLAkJSU4sCXRydWUgfSwKKwl7ICJmdW5jdGlvbiIsCUZVTkNUSU9OLCB0cnVlIH0sCisJeyAidGltZSIsCVRJTUUsCXRydWUgfSwKKwl7ICJ7IiwJCSd7JywJdHJ1ZSB9LAorCXsgIn0iLAkJJ30nLAl0cnVlIH0sCisJeyAiISIsCQlCQU5HLAl0cnVlIH0sCisJeyAiW1siLAkJREJSQUNLRVQsIHRydWUgfSwKKwkvKiBMZXhpY2FsIHRva2VucyAoMFtFT0ZdLCBMV09SRCBhbmQgUkVESVIgaGFuZGxlZCBzcGVjaWFsbHkpICovCisJeyAiJiYiLAkJTE9HQU5ELAlmYWxzZSB9LAorCXsgInx8IiwJCUxPR09SLAlmYWxzZSB9LAorCXsgIjs7IiwJCUJSRUFLLAlmYWxzZSB9LAorCXsgIigoIiwJCU1EUEFSRU4sIGZhbHNlIH0sCisJeyAifCYiLAkJQ09QUk9DLAlmYWxzZSB9LAorCS8qIGFuZCBzb21lIHNwZWNpYWwgY2FzZXMuLi4gKi8KKwl7ICJuZXdsaW5lIiwJJ1xuJywJZmFsc2UgfSwKKwl7IE5VTEwsCQkwLAlmYWxzZSB9Cit9OworCit2b2lkCitpbml0a2V5d29yZHModm9pZCkKK3sKKwlzdHJ1Y3QgdG9rZW5pbmZvIGNvbnN0ICp0dDsKKwlzdHJ1Y3QgdGJsICpwOworCisJa3Rpbml0KCZrZXl3b3JkcywgQVBFUk0sCisJICAgIC8qIG11c3QgYmUgODAlIG9mIDJebiAoY3VycmVudGx5IDIwIGtleXdvcmRzKSAqLyAzMik7CisJZm9yICh0dCA9IHRva2VudGFiOyB0dC0+bmFtZTsgdHQrKykgeworCQlpZiAodHQtPnJlc2VydmVkKSB7CisJCQlwID0ga3RlbnRlcigma2V5d29yZHMsIHR0LT5uYW1lLCBoYXNoKHR0LT5uYW1lKSk7CisJCQlwLT5mbGFnIHw9IERFRklORUR8SVNTRVQ7CisJCQlwLT50eXBlID0gQ0tFWVdEOworCQkJcC0+dmFsLmkgPSB0dC0+dmFsOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorc3ludGF4ZXJyKGNvbnN0IGNoYXIgKndoYXQpCit7CisJY2hhciByZWRpcls2XTsJLyogMjw8LSBpcyB0aGUgbG9uZ2VzdCByZWRpcmVjdGlvbiwgSSB0aGluayAqLworCWNvbnN0IGNoYXIgKnM7CisJc3RydWN0IHRva2VuaW5mbyBjb25zdCAqdHQ7CisJaW50IGM7CisKKwlpZiAoIXdoYXQpCisJCXdoYXQgPSAidW5leHBlY3RlZCI7CisJUkVKRUNUOworCWMgPSB0b2tlbigwKTsKKyBBZ2FpbjoKKwlzd2l0Y2ggKGMpIHsKKwljYXNlIDA6CisJCWlmIChuZXN0aW5nLnN0YXJ0X3Rva2VuKSB7CisJCQljID0gbmVzdGluZy5zdGFydF90b2tlbjsKKwkJCXNvdXJjZS0+ZXJybGluZSA9IG5lc3Rpbmcuc3RhcnRfbGluZTsKKwkJCXdoYXQgPSAidW5tYXRjaGVkIjsKKwkJCWdvdG8gQWdhaW47CisJCX0KKwkJLyogZG9uJ3QgcXVvdGUgdGhlIEVPRiAqLworCQl5eWVycm9yKCIlczogdW5leHBlY3RlZCBFT0ZcbiIsIFRfc3luZXJyKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCisJY2FzZSBMV09SRDoKKwkJcyA9IHNucHRyZWVmKE5VTEwsIDMyLCAiJVMiLCB5eWx2YWwuY3ApOworCQlicmVhazsKKworCWNhc2UgUkVESVI6CisJCXMgPSBzbnB0cmVlZihyZWRpciwgc2l6ZW9mKHJlZGlyKSwgIiVSIiwgeXlsdmFsLmlvcCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZm9yICh0dCA9IHRva2VudGFiOyB0dC0+bmFtZTsgdHQrKykKKwkJCWlmICh0dC0+dmFsID09IGMpCisJCQkgICAgYnJlYWs7CisJCWlmICh0dC0+bmFtZSkKKwkJCXMgPSB0dC0+bmFtZTsKKwkJZWxzZSB7CisJCQlpZiAoYyA+IDAgJiYgYyA8IDI1NikgeworCQkJCXJlZGlyWzBdID0gYzsKKwkJCQlyZWRpclsxXSA9ICdcMCc7CisJCQl9IGVsc2UKKwkJCQlzaGZfc25wcmludGYocmVkaXIsIHNpemVvZihyZWRpciksCisJCQkJCSI/JWQiLCBjKTsKKwkJCXMgPSByZWRpcjsKKwkJfQorCX0KKwl5eWVycm9yKCIlczogJyVzJyAlc1xuIiwgVF9zeW5lcnIsIHMsIHdoYXQpOworfQorCitzdGF0aWMgdm9pZAorbmVzdGluZ19wdXNoKHN0cnVjdCBuZXN0aW5nX3N0YXRlICpzYXZlLCBpbnQgdG9rKQoreworCSpzYXZlID0gbmVzdGluZzsKKwluZXN0aW5nLnN0YXJ0X3Rva2VuID0gdG9rOworCW5lc3Rpbmcuc3RhcnRfbGluZSA9IHNvdXJjZS0+bGluZTsKK30KKworc3RhdGljIHZvaWQKK25lc3RpbmdfcG9wKHN0cnVjdCBuZXN0aW5nX3N0YXRlICpzYXZlZCkKK3sKKwluZXN0aW5nID0gKnNhdmVkOworfQorCitzdGF0aWMgc3RydWN0IG9wICoKK25ld3RwKGludCB0eXBlKQoreworCXN0cnVjdCBvcCAqdDsKKworCXQgPSBhbGxvYyhzaXplb2Yoc3RydWN0IG9wKSwgQVRFTVApOworCXQtPnR5cGUgPSB0eXBlOworCXQtPnUuZXZhbGZsYWdzID0gMDsKKwl0LT5hcmdzID0gTlVMTDsKKwl0LT52YXJzID0gTlVMTDsKKwl0LT5pb2FjdCA9IE5VTEw7CisJdC0+bGVmdCA9IHQtPnJpZ2h0ID0gTlVMTDsKKwl0LT5zdHIgPSBOVUxMOworCXJldHVybiAodCk7Cit9CisKK3N0cnVjdCBvcCAqCitjb21waWxlKFNvdXJjZSAqcykKK3sKKwluZXN0aW5nLnN0YXJ0X3Rva2VuID0gMDsKKwluZXN0aW5nLnN0YXJ0X2xpbmUgPSAwOworCWhlcmVwID0gaGVyZXM7CisJc291cmNlID0gczsKKwl5eXBhcnNlKCk7CisJcmV0dXJuIChvdXR0cmVlKTsKK30KKworLyogVGhpcyBrbHVkZ2UgZXhpc3RzIHRvIHRha2UgY2FyZSBvZiBzaC9BVCZUIGtzaCBvZGRpdHkgaW4gd2hpY2gKKyAqIHRoZSBhcmd1bWVudHMgb2YgYWxpYXMvZXhwb3J0L3JlYWRvbmx5L3R5cGVzZXQgaGF2ZSBubyBmaWVsZAorICogc3BsaXR0aW5nLCBmaWxlIGdsb2JiaW5nLCBvciAobm9ybWFsKSB0aWxkZSBleHBhbnNpb24gZG9uZS4KKyAqIEFUJlQga3NoIHNlZW1zIHRvIGRvIHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoaXMgc2luY2UKKyAqCSQgdG91Y2ggYT1hOyB0eXBlc2V0IGE9W2FiXTsgZWNobyAiJGEiCisgKglhPVthYl0KKyAqCSQgeD10eXBlc2V0OyAkeCBhPVthYl07IGVjaG8gIiRhIgorICoJYT1hCisgKgkkCisgKi8KK3N0YXRpYyBpbnQKK2Fzc2lnbl9jb21tYW5kKGNoYXIgKnMpCit7CisJaWYgKCEqcykKKwkJcmV0dXJuICgwKTsKKwlyZXR1cm4gKChzdHJjbXAocywgImFsaWFzIikgPT0gMCkgfHwKKwkgICAgKHN0cmNtcChzLCAiZXhwb3J0IikgPT0gMCkgfHwKKwkgICAgKHN0cmNtcChzLCAicmVhZG9ubHkiKSA9PSAwKSB8fAorCSAgICAoc3RyY21wKHMsIFRfdHlwZXNldCkgPT0gMCkpOworfQorCisvKiBDaGVjayBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiByZWFkaW5nIGFuIGFsaWFzICovCitzdGF0aWMgaW50CitpbmFsaWFzKHN0cnVjdCBzb3VyY2UgKnMpCit7CisJZm9yICg7IHMgJiYgcy0+dHlwZSA9PSBTQUxJQVM7IHMgPSBzLT5uZXh0KQorCQlpZiAoIShzLT5mbGFncyAmIFNGX0FMSUFTRU5EKSkKKwkJCXJldHVybiAoMSk7CisJcmV0dXJuICgwKTsKK30KKworCisvKiBPcmRlciBpbXBvcnRhbnQgLSBpbmRleGVkIGJ5IFRlc3RfbWV0YSB2YWx1ZXMKKyAqIE5vdGUgdGhhdCB8fCwgJiYsICggYW5kICkgY2FuJ3QgYXBwZWFyIGluIGFzIHVucXVvdGVkIHN0cmluZ3MKKyAqIGluIG5vcm1hbCBzaGVsbCBpbnB1dCwgc28gdGhlc2UgY2FuIGJlIGludGVycHJldGVkIHVuYW1iaWd1b3VzbHkKKyAqIGluIHRoZSBldmFsdWF0aW9uIHBhc3MuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGRidGVzdF9vcltdID0geyBDSEFSLCAnfCcsIENIQVIsICd8JywgRU9TIH07CitzdGF0aWMgY29uc3QgY2hhciBkYnRlc3RfYW5kW10gPSB7IENIQVIsICcmJywgQ0hBUiwgJyYnLCBFT1MgfTsKK3N0YXRpYyBjb25zdCBjaGFyIGRidGVzdF9ub3RbXSA9IHsgQ0hBUiwgJyEnLCBFT1MgfTsKK3N0YXRpYyBjb25zdCBjaGFyIGRidGVzdF9vcGFyZW5bXSA9IHsgQ0hBUiwgJygnLCBFT1MgfTsKK3N0YXRpYyBjb25zdCBjaGFyIGRidGVzdF9jcGFyZW5bXSA9IHsgQ0hBUiwgJyknLCBFT1MgfTsKK2NvbnN0IGNoYXIgKmNvbnN0IGRidGVzdF90b2tlbnNbXSA9IHsKKwlkYnRlc3Rfb3IsIGRidGVzdF9hbmQsIGRidGVzdF9ub3QsCisJZGJ0ZXN0X29wYXJlbiwgZGJ0ZXN0X2NwYXJlbgorfTsKK2NvbnN0IGNoYXIgZGJfY2xvc2VbXSA9IHsgQ0hBUiwgJ10nLCBDSEFSLCAnXScsIEVPUyB9OworY29uc3QgY2hhciBkYl9sdGhhbltdID0geyBDSEFSLCAnPCcsIEVPUyB9OworY29uc3QgY2hhciBkYl9ndGhhbltdID0geyBDSEFSLCAnPicsIEVPUyB9OworCisvKgorICogVGVzdCBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhIHdoYXRldmVyLiBBY2NlcHRzIHRoZSBjdXJyZW50IHRva2VuIGlmCisgKiBpdCBpcy4gUmV0dXJucyAwIGlmIGl0IGlzIG5vdCwgbm9uLXplcm8gaWYgaXQgaXMgKGluIHRoZSBjYXNlIG9mCisgKiBUTV9VTk9QIGFuZCBUTV9CSU5PUCwgdGhlIHJldHVybmVkIHZhbHVlIGlzIGEgVGVzdF9vcCkuCisgKi8KK3N0YXRpYyBUZXN0X29wCitkYnRlc3RwX2lzYShUZXN0X2VudiAqdGUsIFRlc3RfbWV0YSBtZXRhKQoreworCWludCBjID0gdHBlZWsoQVJSQVlWQVIgfCAobWV0YSA9PSBUTV9CSU5PUCA/IDAgOiBDT05USU4pKTsKKwlpbnQgdXF3b3JkOworCWNoYXIgKnNhdmUgPSBOVUxMOworCVRlc3Rfb3AgcmV0ID0gVE9fTk9OT1A7CisKKwkvKiB1bnF1b3RlZCB3b3JkPyAqLworCXVxd29yZCA9IGMgPT0gTFdPUkQgJiYgKmlkZW50OworCisJaWYgKG1ldGEgPT0gVE1fT1IpCisJCXJldCA9IGMgPT0gTE9HT1IgPyBUT19OT05OVUxMIDogVE9fTk9OT1A7CisJZWxzZSBpZiAobWV0YSA9PSBUTV9BTkQpCisJCXJldCA9IGMgPT0gTE9HQU5EID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QOworCWVsc2UgaWYgKG1ldGEgPT0gVE1fTk9UKQorCQlyZXQgPSAodXF3b3JkICYmICFzdHJjbXAoeXlsdmFsLmNwLAorCQkgICAgZGJ0ZXN0X3Rva2Vuc1soaW50KVRNX05PVF0pKSA/IFRPX05PTk5VTEwgOiBUT19OT05PUDsKKwllbHNlIGlmIChtZXRhID09IFRNX09QQVJFTikKKwkJcmV0ID0gYyA9PSAnKCcgLyopKi8gPyBUT19OT05OVUxMIDogVE9fTk9OT1A7CisJZWxzZSBpZiAobWV0YSA9PSBUTV9DUEFSRU4pCisJCXJldCA9IGMgPT0gLyooKi8gJyknID8gVE9fTk9OTlVMTCA6IFRPX05PTk9QOworCWVsc2UgaWYgKG1ldGEgPT0gVE1fVU5PUCB8fCBtZXRhID09IFRNX0JJTk9QKSB7CisJCWlmIChtZXRhID09IFRNX0JJTk9QICYmIGMgPT0gUkVESVIgJiYKKwkJICAgICh5eWx2YWwuaW9wLT5mbGFnID09IElPUkVBRCB8fCB5eWx2YWwuaW9wLT5mbGFnID09IElPV1JJVEUpKSB7CisJCQlyZXQgPSBUT19OT05OVUxMOworCQkJc2F2ZSA9IHdkY29weSh5eWx2YWwuaW9wLT5mbGFnID09IElPUkVBRCA/CisJCQkgICAgZGJfbHRoYW4gOiBkYl9ndGhhbiwgQVRFTVApOworCQl9IGVsc2UgaWYgKHVxd29yZCAmJiAocmV0ID0gdGVzdF9pc29wKG1ldGEsIGlkZW50KSkpCisJCQlzYXZlID0geXlsdmFsLmNwOworCX0gZWxzZSAvKiBtZXRhID09IFRNX0VORCAqLworCQlyZXQgPSAodXF3b3JkICYmICFzdHJjbXAoeXlsdmFsLmNwLAorCQkgICAgZGJfY2xvc2UpKSA/IFRPX05PTk5VTEwgOiBUT19OT05PUDsKKwlpZiAocmV0ICE9IFRPX05PTk9QKSB7CisJCUFDQ0VQVDsKKwkJaWYgKG1ldGEgPCBORUxFTShkYnRlc3RfdG9rZW5zKSkKKwkJCXNhdmUgPSB3ZGNvcHkoZGJ0ZXN0X3Rva2Vuc1soaW50KW1ldGFdLCBBVEVNUCk7CisJCWlmIChzYXZlKQorCQkJWFBwdXQoKnRlLT5wb3MuYXYsIHNhdmUpOworCX0KKwlyZXR1cm4gKHJldCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RidGVzdHBfZ2V0b3BuZChUZXN0X2VudiAqdGUsIFRlc3Rfb3Agb3AgTUtTSF9BX1VOVVNFRCwKKyAgICBib29sIGRvX2V2YWwgTUtTSF9BX1VOVVNFRCkKK3sKKwlpbnQgYyA9IHRwZWVrKEFSUkFZVkFSKTsKKworCWlmIChjICE9IExXT1JEKQorCQlyZXR1cm4gKE5VTEwpOworCisJQUNDRVBUOworCVhQcHV0KCp0ZS0+cG9zLmF2LCB5eWx2YWwuY3ApOworCisJcmV0dXJuIChudWxsKTsKK30KKworc3RhdGljIGludAorZGJ0ZXN0cF9ldmFsKFRlc3RfZW52ICp0ZSBNS1NIX0FfVU5VU0VELCBUZXN0X29wIG9wIE1LU0hfQV9VTlVTRUQsCisgICAgY29uc3QgY2hhciAqb3BuZDEgTUtTSF9BX1VOVVNFRCwgY29uc3QgY2hhciAqb3BuZDIgTUtTSF9BX1VOVVNFRCwKKyAgICBib29sIGRvX2V2YWwgTUtTSF9BX1VOVVNFRCkKK3sKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdm9pZAorZGJ0ZXN0cF9lcnJvcihUZXN0X2VudiAqdGUsIGludCBvZmZzZXQsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwl0ZS0+ZmxhZ3MgfD0gVEVGX0VSUk9SOworCisJaWYgKG9mZnNldCA8IDApIHsKKwkJUkVKRUNUOworCQkvKiBLbHVkZ3kgdG8gc2F5IHRoZSBsZWFzdC4uLiAqLworCQlzeW1ib2wgPSBMV09SRDsKKwkJeXlsdmFsLmNwID0gKihYUHB0cnYoKnRlLT5wb3MuYXYpICsgWFBzaXplKCp0ZS0+cG9zLmF2KSArCisJCSAgICBvZmZzZXQpOworCX0KKwlzeW50YXhlcnIobXNnKTsKK30KZGlmZiAtLWdpdCBhL21rc2gvc3JjL3RyZWUuYyBiL21rc2gvc3JjL3RyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTg2MWRiCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvdHJlZS5jCkBAIC0wLDAgKzEsNzE2IEBACisvKgkkT3BlbkJTRDogdHJlZS5jLHYgMS4xOSAyMDA4LzA4LzExIDIxOjUwOjM1IGphcmVkeSBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2luY2x1ZGUgInNoLmgiCisKK19fUkNTSUQoIiRNaXJPUzogc3JjL2Jpbi9ta3NoL3RyZWUuYyx2IDEuMzAgMjAxMC8wMi8yNSAyMDoxODoxOSB0ZyBFeHAgJCIpOworCisjZGVmaW5lIElOREVOVAk0CisKKyNkZWZpbmUgdHB1dGMoYywgc2hmKSBzaGZfcHV0Y2hhcihjLCBzaGYpOworc3RhdGljIHZvaWQgcHRyZWUoc3RydWN0IG9wICosIGludCwgc3RydWN0IHNoZiAqKTsKK3N0YXRpYyB2b2lkIHBpb2FjdChzdHJ1Y3Qgc2hmICosIGludCwgc3RydWN0IGlvd29yZCAqKTsKK3N0YXRpYyB2b2lkIHRwdXRDKGludCwgc3RydWN0IHNoZiAqKTsKK3N0YXRpYyB2b2lkIHRwdXRTKGNoYXIgKiwgc3RydWN0IHNoZiAqKTsKK3N0YXRpYyB2b2lkIHZmcHRyZWVmKHN0cnVjdCBzaGYgKiwgaW50LCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworc3RhdGljIHN0cnVjdCBpb3dvcmQgKippb2NvcHkoc3RydWN0IGlvd29yZCAqKiwgQXJlYSAqKTsKK3N0YXRpYyB2b2lkIGlvZnJlZShzdHJ1Y3QgaW93b3JkICoqLCBBcmVhICopOworCisvKgorICogcHJpbnQgYSBjb21tYW5kIHRyZWUKKyAqLworc3RhdGljIHZvaWQKK3B0cmVlKHN0cnVjdCBvcCAqdCwgaW50IGluZGVudCwgc3RydWN0IHNoZiAqc2hmKQoreworCWNvbnN0IGNoYXIgKip3OworCXN0cnVjdCBpb3dvcmQgKippb2FjdDsKKwlzdHJ1Y3Qgb3AgKnQxOworCisgQ2hhaW46CisJaWYgKHQgPT0gTlVMTCkKKwkJcmV0dXJuOworCXN3aXRjaCAodC0+dHlwZSkgeworCWNhc2UgVENPTToKKwkJaWYgKHQtPnZhcnMpCisJCQlmb3IgKHcgPSAoY29uc3QgY2hhciAqKil0LT52YXJzOyAqdyAhPSBOVUxMOyApCisJCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVTICIsICp3KyspOworCQllbHNlCisJCQlzaGZfcHV0cygiI25vLXZhcnMjICIsIHNoZik7CisJCWlmICh0LT5hcmdzKQorCQkJZm9yICh3ID0gdC0+YXJnczsgKncgIT0gTlVMTDsgKQorCQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlUyAiLCAqdysrKTsKKwkJZWxzZQorCQkJc2hmX3B1dHMoIiNuby1hcmdzIyAiLCBzaGYpOworCQlicmVhazsKKwljYXNlIFRFWEVDOgorCQl0ID0gdC0+bGVmdDsKKwkJZ290byBDaGFpbjsKKwljYXNlIFRQQVJFTjoKKwkJZnB0cmVlZihzaGYsIGluZGVudCArIDIsICIoICVUKSAiLCB0LT5sZWZ0KTsKKwkJYnJlYWs7CisJY2FzZSBUUElQRToKKwkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVUfCAiLCB0LT5sZWZ0KTsKKwkJdCA9IHQtPnJpZ2h0OworCQlnb3RvIENoYWluOworCWNhc2UgVExJU1Q6CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlVCU7IiwgdC0+bGVmdCk7CisJCXQgPSB0LT5yaWdodDsKKwkJZ290byBDaGFpbjsKKwljYXNlIFRPUjoKKwljYXNlIFRBTkQ6CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlVCVzICVUIiwKKwkJICAgIHQtPmxlZnQsICh0LT50eXBlPT1UT1IpID8gInx8IiA6ICImJiIsIHQtPnJpZ2h0KTsKKwkJYnJlYWs7CisJY2FzZSBUQkFORzoKKwkJc2hmX3B1dHMoIiEgIiwgc2hmKTsKKwkJdCA9IHQtPnJpZ2h0OworCQlnb3RvIENoYWluOworCWNhc2UgVERCUkFDS0VUOiB7CisJCWludCBpOworCisJCXNoZl9wdXRzKCJbWyIsIHNoZik7CisJCWZvciAoaSA9IDA7IHQtPmFyZ3NbaV07IGkrKykKKwkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIgJVMiLCB0LT5hcmdzW2ldKTsKKwkJc2hmX3B1dHMoIiBdXSAiLCBzaGYpOworCQlicmVhazsKKwl9CisJY2FzZSBUU0VMRUNUOgorCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAic2VsZWN0ICVzICIsIHQtPnN0cik7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBURk9SOgorCQlpZiAodC0+dHlwZSA9PSBURk9SKQorCQkJZnB0cmVlZihzaGYsIGluZGVudCwgImZvciAlcyAiLCB0LT5zdHIpOworCQlpZiAodC0+dmFycyAhPSBOVUxMKSB7CisJCQlzaGZfcHV0cygiaW4gIiwgc2hmKTsKKwkJCWZvciAodyA9IChjb25zdCBjaGFyICoqKXQtPnZhcnM7ICp3OyApCisJCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVTICIsICp3KyspOworCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7Iik7CisJCX0KKwkJZnB0cmVlZihzaGYsIGluZGVudCArIElOREVOVCwgImRvJU4lVCIsIHQtPmxlZnQpOworCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJTtkb25lICIpOworCQlicmVhazsKKwljYXNlIFRDQVNFOgorCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiY2FzZSAlUyBpbiIsIHQtPnN0cik7CisJCWZvciAodDEgPSB0LT5sZWZ0OyB0MSAhPSBOVUxMOyB0MSA9IHQxLT5yaWdodCkgeworCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVOKCIpOworCQkJZm9yICh3ID0gKGNvbnN0IGNoYXIgKiopdDEtPnZhcnM7ICp3ICE9IE5VTEw7IHcrKykKKwkJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJVMlYyIsICp3LAorCQkJCSAgICAod1sxXSAhPSBOVUxMKSA/ICd8JyA6ICcpJyk7CisJCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgSU5ERU5ULCAiJTslVCVOOzsiLCB0MS0+bGVmdCk7CisJCX0KKwkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVOZXNhYyAiKTsKKwkJYnJlYWs7CisJY2FzZSBUSUY6CisJY2FzZSBURUxJRjoKKwkJLyogMyA9PSBzdHJsZW4oImlmICIpICovCisJCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyAzLCAiaWYgJVQiLCB0LT5sZWZ0KTsKKwkJZm9yICg7OykgeworCQkJdCA9IHQtPnJpZ2h0OworCQkJaWYgKHQtPmxlZnQgIT0gTlVMTCkgeworCQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlOyIpOworCQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyBJTkRFTlQsICJ0aGVuJU4lVCIsCisJCQkJICAgIHQtPmxlZnQpOworCQkJfQorCQkJaWYgKHQtPnJpZ2h0ID09IE5VTEwgfHwgdC0+cmlnaHQtPnR5cGUgIT0gVEVMSUYpCisJCQkJYnJlYWs7CisJCQl0ID0gdC0+cmlnaHQ7CisJCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJTsiKTsKKwkJCS8qIDUgPT0gc3RybGVuKCJlbGlmICIpICovCisJCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgNSwgImVsaWYgJVQiLCB0LT5sZWZ0KTsKKwkJfQorCQlpZiAodC0+cmlnaHQgIT0gTlVMTCkgeworCQkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7Iik7CisJCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgSU5ERU5ULCAiZWxzZSU7JVQiLCB0LT5yaWdodCk7CisJCX0KKwkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7ZmkgIik7CisJCWJyZWFrOworCWNhc2UgVFdISUxFOgorCWNhc2UgVFVOVElMOgorCQkvKiA2ID09IHN0cmxlbigid2hpbGUiLyJ1bnRpbCIpICovCisJCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyA2LCAiJXMgJVQiLAorCQkgICAgKHQtPnR5cGU9PVRXSElMRSkgPyAid2hpbGUiIDogInVudGlsIiwKKwkJICAgIHQtPmxlZnQpOworCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJTtkbyIpOworCQlmcHRyZWVmKHNoZiwgaW5kZW50ICsgSU5ERU5ULCAiJTslVCIsIHQtPnJpZ2h0KTsKKwkJZnB0cmVlZihzaGYsIGluZGVudCwgIiU7ZG9uZSAiKTsKKwkJYnJlYWs7CisJY2FzZSBUQlJBQ0U6CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQgKyBJTkRFTlQsICJ7JTslVCIsIHQtPmxlZnQpOworCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAiJTt9ICIpOworCQlicmVhazsKKwljYXNlIFRDT1BST0M6CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlVHwmICIsIHQtPmxlZnQpOworCQlicmVhazsKKwljYXNlIFRBU1lOQzoKKwkJZnB0cmVlZihzaGYsIGluZGVudCwgIiVUJiAiLCB0LT5sZWZ0KTsKKwkJYnJlYWs7CisJY2FzZSBURlVOQ1Q6CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsCisJCSAgICB0LT51LmtzaF9mdW5jID8gImZ1bmN0aW9uICVzICVUIiA6ICIlcygpICVUIiwKKwkJICAgIHQtPnN0ciwgdC0+bGVmdCk7CisJCWJyZWFrOworCWNhc2UgVFRJTUU6CisJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICJ0aW1lICVUIiwgdC0+bGVmdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNoZl9wdXRzKCI8Ym90Y2g+Iiwgc2hmKTsKKwkJYnJlYWs7CisJfQorCWlmICgoaW9hY3QgPSB0LT5pb2FjdCkgIT0gTlVMTCkgeworCQlpbnQJbmVlZF9ubCA9IDA7CisKKwkJd2hpbGUgKCppb2FjdCAhPSBOVUxMKQorCQkJcGlvYWN0KHNoZiwgaW5kZW50LCAqaW9hY3QrKyk7CisJCS8qIFByaW50IGhlcmUgZG9jdW1lbnRzIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZS4uLiAqLworCQlmb3IgKGlvYWN0ID0gdC0+aW9hY3Q7ICppb2FjdCAhPSBOVUxMOyApIHsKKwkJCXN0cnVjdCBpb3dvcmQgKmlvcCA9ICppb2FjdCsrOworCisJCQkvKiBoZXJlZG9jIGlzIDAgd2hlbiB0cmFjaW5nIChzZXQgLXgpICovCisJCQlpZiAoKGlvcC0+ZmxhZyAmIElPVFlQRSkgPT0gSU9IRVJFICYmIGlvcC0+aGVyZWRvYyAmJgorCQkJICAgIC8qIGlvcC0+ZGVsaW1bMV0gPT0gJzwnIG1lYW5zIGhlcmUgc3RyaW5nICovCisJCQkgICAgKCFpb3AtPmRlbGltIHx8IGlvcC0+ZGVsaW1bMV0gIT0gJzwnKSkgeworCQkJCXRwdXRjKCdcbicsIHNoZik7CisJCQkJc2hmX3B1dHMoaW9wLT5oZXJlZG9jLCBzaGYpOworCQkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlcyIsCisJCQkJICAgIGV2YWxzdHIoaW9wLT5kZWxpbSwgMCkpOworCQkJCW5lZWRfbmwgPSAxOworCQkJfQorCQl9CisJCS8qIExhc3QgZGVsaW1pdGVyIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBuZXdsaW5lICh0aGlzIG9mdGVuCisJCSAqIGxlYWRzIHRvIGFuIGV4dHJhIGJsYW5rIGxpbmUsIGJ1dCBpdHMgbm90IHdvcnRoIHdvcnJ5aW5nCisJCSAqIGFib3V0KQorCQkgKi8KKwkJaWYgKG5lZWRfbmwpCisJCQl0cHV0YygnXG4nLCBzaGYpOworCX0KK30KKworc3RhdGljIHZvaWQKK3Bpb2FjdChzdHJ1Y3Qgc2hmICpzaGYsIGludCBpbmRlbnQsIHN0cnVjdCBpb3dvcmQgKmlvcCkKK3sKKwlpbnQgZmxhZyA9IGlvcC0+ZmxhZzsKKwlpbnQgdHlwZSA9IGZsYWcgJiBJT1RZUEU7CisJaW50IGV4cGVjdGVkOworCisJZXhwZWN0ZWQgPSAodHlwZSA9PSBJT1JFQUQgfHwgdHlwZSA9PSBJT1JEV1IgfHwgdHlwZSA9PSBJT0hFUkUpID8gMCA6CisJICAgICh0eXBlID09IElPQ0FUIHx8IHR5cGUgPT0gSU9XUklURSkgPyAxIDoKKwkgICAgKHR5cGUgPT0gSU9EVVAgJiYgKGlvcC0+dW5pdCA9PSAhKGZsYWcgJiBJT1JEVVApKSkgPyBpb3AtPnVuaXQgOgorCSAgICBpb3AtPnVuaXQgKyAxOworCWlmIChpb3AtPnVuaXQgIT0gZXhwZWN0ZWQpCisJCXNoZl9mcHJpbnRmKHNoZiwgIiVkIiwgaW9wLT51bml0KTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSU9SRUFEOgorCQlzaGZfcHV0cygiPCAiLCBzaGYpOworCQlicmVhazsKKwljYXNlIElPSEVSRToKKwkJc2hmX3B1dHMoZmxhZyAmIElPU0tJUCA/ICI8PC0iIDogIjw8Iiwgc2hmKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NBVDoKKwkJc2hmX3B1dHMoIj4+ICIsIHNoZik7CisJCWJyZWFrOworCWNhc2UgSU9XUklURToKKwkJc2hmX3B1dHMoZmxhZyAmIElPQ0xPQiA/ICI+fCAiIDogIj4gIiwgc2hmKTsKKwkJYnJlYWs7CisJY2FzZSBJT1JEV1I6CisJCXNoZl9wdXRzKCI8PiAiLCBzaGYpOworCQlicmVhazsKKwljYXNlIElPRFVQOgorCQlzaGZfcHV0cyhmbGFnICYgSU9SRFVQID8gIjwmIiA6ICI+JiIsIHNoZik7CisJCWJyZWFrOworCX0KKwkvKiBuYW1lL2RlbGltIGFyZSAwIHdoZW4gcHJpbnRpbmcgc3ludGF4IGVycm9ycyAqLworCWlmICh0eXBlID09IElPSEVSRSkgeworCQlpZiAoaW9wLT5kZWxpbSkKKwkJCWZwdHJlZWYoc2hmLCBpbmRlbnQsICIlcyVTICIsCisJCQkgICAgLyogaGVyZSBzdHJpbmcgKi8gaW9wLT5kZWxpbVsxXSA9PSAnPCcgPyAiIiA6ICIgIiwKKwkJCSAgICBpb3AtPmRlbGltKTsKKwkJZWxzZQorCQkJdHB1dGMoJyAnLCBzaGYpOworCX0gZWxzZSBpZiAoaW9wLT5uYW1lKQorCQlmcHRyZWVmKHNoZiwgaW5kZW50LCAoaW9wLT5mbGFnICYgSU9OQU1FWFApID8gIiVzICIgOiAiJVMgIiwKKwkJICAgIGlvcC0+bmFtZSk7Cit9CisKKworLyoKKyAqIHZhcmlhbnRzIG9mIGZwdXRjLCBmcHV0cyBmb3IgcHRyZWVmIGFuZCBzbnB0cmVlZgorICovCitzdGF0aWMgdm9pZAordHB1dEMoaW50IGMsIHN0cnVjdCBzaGYgKnNoZikKK3sKKwlpZiAoKGMmMHg2MCkgPT0gMCkgewkJLyogQzB8QzEgKi8KKwkJdHB1dGMoKGMmMHg4MCkgPyAnJCcgOiAnXicsIHNoZik7CisJCXRwdXRjKCgoYyYweDdGKXwweDQwKSwgc2hmKTsKKwl9IGVsc2UgaWYgKChjJjB4N0YpID09IDB4N0YpIHsJLyogREVMICovCisJCXRwdXRjKChjJjB4ODApID8gJyQnIDogJ14nLCBzaGYpOworCQl0cHV0YygnPycsIHNoZik7CisJfSBlbHNlCisJCXRwdXRjKGMsIHNoZik7Cit9CisKK3N0YXRpYyB2b2lkCit0cHV0UyhjaGFyICp3cCwgc3RydWN0IHNoZiAqc2hmKQoreworCWludCBjLCBxdW90ZWxldmVsID0gMDsKKworCS8qIHByb2JsZW1zOgorCSAqCWAuLi5gIC0+ICQoLi4uKQorCSAqCSdmb28nIC0+ICJmb28iCisJICogY291bGQgY2hhbmdlIGVuY29kaW5nIHRvOgorCSAqCU9RVU9URSBbIiddIC4uLiBDUVVPVEUgWyInXQorCSAqCUNPTVNVQiBbKGBdIC4uLlwwCShoYW5kbGUgJCBgIFwgYW5kIG1heWJlICIgaW4gYC4uLmAgY2FzZSkKKwkgKi8KKwl3aGlsZSAoMSkKKwkJc3dpdGNoICgqd3ArKykgeworCQljYXNlIEVPUzoKKwkJCXJldHVybjsKKwkJY2FzZSBBREVMSU06CisJCWNhc2UgQ0hBUjoKKwkJCXRwdXRDKCp3cCsrLCBzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgUUNIQVI6CisJCQljID0gKndwKys7CisJCQlpZiAoIXF1b3RlbGV2ZWwgfHwgKGMgPT0gJyInIHx8IGMgPT0gJ2AnIHx8IGMgPT0gJyQnKSkKKwkJCQl0cHV0YygnXFwnLCBzaGYpOworCQkJdHB1dEMoYywgc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVNVQjoKKwkJCXNoZl9wdXRzKCIkKCIsIHNoZik7CisJCQl3aGlsZSAoKndwICE9IDApCisJCQkJdHB1dEMoKndwKyssIHNoZik7CisJCQl0cHV0YygnKScsIHNoZik7CisJCQl3cCsrOworCQkJYnJlYWs7CisJCWNhc2UgRVhQUlNVQjoKKwkJCXNoZl9wdXRzKCIkKCgiLCBzaGYpOworCQkJd2hpbGUgKCp3cCAhPSAwKQorCQkJCXRwdXRDKCp3cCsrLCBzaGYpOworCQkJc2hmX3B1dHMoIikpIiwgc2hmKTsKKwkJCXdwKys7CisJCQlicmVhazsKKwkJY2FzZSBPUVVPVEU6CisJCQlxdW90ZWxldmVsKys7CisJCQl0cHV0YygnIicsIHNoZik7CisJCQlicmVhazsKKwkJY2FzZSBDUVVPVEU6CisJCQlpZiAocXVvdGVsZXZlbCkKKwkJCQlxdW90ZWxldmVsLS07CisJCQl0cHV0YygnIicsIHNoZik7CisJCQlicmVhazsKKwkJY2FzZSBPU1VCU1Q6CisJCQl0cHV0YygnJCcsIHNoZik7CisJCQlpZiAoKndwKysgPT0gJ3snKQorCQkJCXRwdXRjKCd7Jywgc2hmKTsKKwkJCXdoaWxlICgoYyA9ICp3cCsrKSAhPSAwKQorCQkJCXRwdXRDKGMsIHNoZik7CisJCQlicmVhazsKKwkJY2FzZSBDU1VCU1Q6CisJCQlpZiAoKndwKysgPT0gJ30nKQorCQkJCXRwdXRjKCd9Jywgc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIE9QQVQ6CisJCQl0cHV0Yygqd3ArKywgc2hmKTsKKwkJCXRwdXRjKCcoJywgc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIFNQQVQ6CisJCQl0cHV0YygnfCcsIHNoZik7CisJCQlicmVhazsKKwkJY2FzZSBDUEFUOgorCQkJdHB1dGMoJyknLCBzaGYpOworCQkJYnJlYWs7CisJCX0KK30KKworLyoKKyAqIHRoaXMgaXMgdGhlIF9vbmx5XyB3YXkgdG8gcmVsaWFibHkgaGFuZGxlCisgKiB2YXJpYWJsZSBhcmdzIHdpdGggYW4gQU5TSSBjb21waWxlcgorICovCisvKiBWQVJBUkdTICovCitpbnQKK2ZwdHJlZWYoc3RydWN0IHNoZiAqc2hmLCBpbnQgaW5kZW50LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCisJdmFfc3RhcnQodmEsIGZtdCk7CisKKwl2ZnB0cmVlZihzaGYsIGluZGVudCwgZm10LCB2YSk7CisJdmFfZW5kKHZhKTsKKwlyZXR1cm4gKDApOworfQorCisvKiBWQVJBUkdTICovCitjaGFyICoKK3NucHRyZWVmKGNoYXIgKnMsIGludCBuLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCXN0cnVjdCBzaGYgc2hmOworCisJc2hmX3NvcGVuKHMsIG4sIFNIRl9XUiB8IChzID8gMCA6IFNIRl9EWU5BTUlDKSwgJnNoZik7CisKKwl2YV9zdGFydCh2YSwgZm10KTsKKwl2ZnB0cmVlZigmc2hmLCAwLCBmbXQsIHZhKTsKKwl2YV9lbmQodmEpOworCisJcmV0dXJuIChzaGZfc2Nsb3NlKCZzaGYpKTsgLyogbnVsbCB0ZXJtaW5hdGVzICovCit9CisKK3N0YXRpYyB2b2lkCit2ZnB0cmVlZihzdHJ1Y3Qgc2hmICpzaGYsIGludCBpbmRlbnQsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2YSkKK3sKKwlpbnQgYzsKKworCXdoaWxlICgoYyA9ICpmbXQrKykpIHsKKwkJaWYgKGMgPT0gJyUnKSB7CisJCQlzd2l0Y2ggKChjID0gKmZtdCsrKSkgeworCQkJY2FzZSAnYyc6CisJCQkJdHB1dGModmFfYXJnKHZhLCBpbnQpLCBzaGYpOworCQkJCWJyZWFrOworCQkJY2FzZSAncyc6CisJCQkJc2hmX3B1dHModmFfYXJnKHZhLCBjaGFyICopLCBzaGYpOworCQkJCWJyZWFrOworCQkJY2FzZSAnUyc6CS8qIHdvcmQgKi8KKwkJCQl0cHV0Uyh2YV9hcmcodmEsIGNoYXIgKiksIHNoZik7CisJCQkJYnJlYWs7CisJCQljYXNlICdkJzoJLyogZGVjaW1hbCAqLworCQkJCXNoZl9mcHJpbnRmKHNoZiwgIiVkIiwgdmFfYXJnKHZhLCBpbnQpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3UnOgkvKiBkZWNpbWFsICovCisJCQkJc2hmX2ZwcmludGYoc2hmLCAiJXUiLCB2YV9hcmcodmEsIHVuc2lnbmVkIGludCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAnVCc6CS8qIGZvcm1hdCB0cmVlICovCisJCQkJcHRyZWUodmFfYXJnKHZhLCBzdHJ1Y3Qgb3AgKiksIGluZGVudCwgc2hmKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJzsnOgkvKiBuZXdsaW5lIG9yIDsgKi8KKwkJCWNhc2UgJ04nOgkvKiBuZXdsaW5lIG9yIHNwYWNlICovCisJCQkJaWYgKHNoZi0+ZmxhZ3MgJiBTSEZfU1RSSU5HKSB7CisJCQkJCWlmIChjID09ICc7JykKKwkJCQkJCXRwdXRjKCc7Jywgc2hmKTsKKwkJCQkJdHB1dGMoJyAnLCBzaGYpOworCQkJCX0gZWxzZSB7CisJCQkJCWludCBpOworCisJCQkJCXRwdXRjKCdcbicsIHNoZik7CisJCQkJCWZvciAoaSA9IGluZGVudDsgaSA+PSA4OyBpIC09IDgpCisJCQkJCQl0cHV0YygnXHQnLCBzaGYpOworCQkJCQlmb3IgKDsgaSA+IDA7IC0taSkKKwkJCQkJCXRwdXRjKCcgJywgc2hmKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdSJzoKKwkJCQlwaW9hY3Qoc2hmLCBpbmRlbnQsIHZhX2FyZyh2YSwgc3RydWN0IGlvd29yZCAqKSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXRwdXRjKGMsIHNoZik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZQorCQkJdHB1dGMoYywgc2hmKTsKKwl9Cit9CisKKy8qCisgKiBjb3B5IHRyZWUgKGZvciBmdW5jdGlvbiBkZWZpbml0aW9uKQorICovCitzdHJ1Y3Qgb3AgKgordGNvcHkoc3RydWN0IG9wICp0LCBBcmVhICphcCkKK3sKKwlzdHJ1Y3Qgb3AgKnI7CisJY29uc3QgY2hhciAqKnR3OworCWNoYXIgKipydzsKKworCWlmICh0ID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlyID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBvcCksIGFwKTsKKworCXItPnR5cGUgPSB0LT50eXBlOworCXItPnUuZXZhbGZsYWdzID0gdC0+dS5ldmFsZmxhZ3M7CisKKwlpZiAodC0+dHlwZSA9PSBUQ0FTRSkKKwkJci0+c3RyID0gd2Rjb3B5KHQtPnN0ciwgYXApOworCWVsc2UKKwkJc3RyZHVweChyLT5zdHIsIHQtPnN0ciwgYXApOworCisJaWYgKHQtPnZhcnMgPT0gTlVMTCkKKwkJci0+dmFycyA9IE5VTEw7CisJZWxzZSB7CisJCWZvciAodHcgPSAoY29uc3QgY2hhciAqKil0LT52YXJzOyAqdHcrKyAhPSBOVUxMOyApCisJCQk7CisJCXJ3ID0gci0+dmFycyA9IGFsbG9jKCh0dyAtIChjb25zdCBjaGFyICoqKXQtPnZhcnMgKyAxKSAqCisJCSAgICBzaXplb2YoKnR3KSwgYXApOworCQlmb3IgKHR3ID0gKGNvbnN0IGNoYXIgKiopdC0+dmFyczsgKnR3ICE9IE5VTEw7ICkKKwkJCSpydysrID0gd2Rjb3B5KCp0dysrLCBhcCk7CisJCSpydyA9IE5VTEw7CisJfQorCisJaWYgKHQtPmFyZ3MgPT0gTlVMTCkKKwkJci0+YXJncyA9IE5VTEw7CisJZWxzZSB7CisJCWZvciAodHcgPSB0LT5hcmdzOyAqdHcrKyAhPSBOVUxMOyApCisJCQk7CisJCXItPmFyZ3MgPSAoY29uc3QgY2hhciAqKikocncgPSBhbGxvYygodHcgLSB0LT5hcmdzICsgMSkgKgorCQkgICAgc2l6ZW9mKCp0dyksIGFwKSk7CisJCWZvciAodHcgPSB0LT5hcmdzOyAqdHcgIT0gTlVMTDsgKQorCQkJKnJ3KysgPSB3ZGNvcHkoKnR3KyssIGFwKTsKKwkJKnJ3ID0gTlVMTDsKKwl9CisKKwlyLT5pb2FjdCA9ICh0LT5pb2FjdCA9PSBOVUxMKSA/IE5VTEwgOiBpb2NvcHkodC0+aW9hY3QsIGFwKTsKKworCXItPmxlZnQgPSB0Y29weSh0LT5sZWZ0LCBhcCk7CisJci0+cmlnaHQgPSB0Y29weSh0LT5yaWdodCwgYXApOworCXItPmxpbmVubyA9IHQtPmxpbmVubzsKKworCXJldHVybiAocik7Cit9CisKK2NoYXIgKgord2Rjb3B5KGNvbnN0IGNoYXIgKndwLCBBcmVhICphcCkKK3sKKwlzaXplX3QgbGVuID0gd2RzY2FuKHdwLCBFT1MpIC0gd3A7CisJcmV0dXJuIChtZW1jcHkoYWxsb2MobGVuLCBhcCksIHdwLCBsZW4pKTsKK30KKworLyogcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiBwcmVmaXggYyBpbiB3cCBwbHVzIDEgKi8KK2NvbnN0IGNoYXIgKgord2RzY2FuKGNvbnN0IGNoYXIgKndwLCBpbnQgYykKK3sKKwlpbnQgbmVzdCA9IDA7CisKKwl3aGlsZSAoMSkKKwkJc3dpdGNoICgqd3ArKykgeworCQljYXNlIEVPUzoKKwkJCXJldHVybiAod3ApOworCQljYXNlIEFERUxJTToKKwkJCWlmIChjID09IEFERUxJTSkKKwkJCQlyZXR1cm4gKHdwICsgMSk7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlIENIQVI6CisJCWNhc2UgUUNIQVI6CisJCQl3cCsrOworCQkJYnJlYWs7CisJCWNhc2UgQ09NU1VCOgorCQljYXNlIEVYUFJTVUI6CisJCQl3aGlsZSAoKndwKysgIT0gMCkKKwkJCQk7CisJCQlicmVhazsKKwkJY2FzZSBPUVVPVEU6CisJCWNhc2UgQ1FVT1RFOgorCQkJYnJlYWs7CisJCWNhc2UgT1NVQlNUOgorCQkJbmVzdCsrOworCQkJd2hpbGUgKCp3cCsrICE9ICdcMCcpCisJCQkJOworCQkJYnJlYWs7CisJCWNhc2UgQ1NVQlNUOgorCQkJd3ArKzsKKwkJCWlmIChjID09IENTVUJTVCAmJiBuZXN0ID09IDApCisJCQkJcmV0dXJuICh3cCk7CisJCQluZXN0LS07CisJCQlicmVhazsKKwkJY2FzZSBPUEFUOgorCQkJbmVzdCsrOworCQkJd3ArKzsKKwkJCWJyZWFrOworCQljYXNlIFNQQVQ6CisJCWNhc2UgQ1BBVDoKKwkJCWlmIChjID09IHdwWy0xXSAmJiBuZXN0ID09IDApCisJCQkJcmV0dXJuICh3cCk7CisJCQlpZiAod3BbLTFdID09IENQQVQpCisJCQkJbmVzdC0tOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpbnRlcm5hbF93YXJuaW5nZigKKwkJCSAgICAid2RzY2FuOiB1bmtub3duIGNoYXIgMHgleCAoY2Fycnlpbmcgb24pIiwKKwkJCSAgICB3cFstMV0pOworCQl9Cit9CisKKy8qIHJldHVybiBhIGNvcHkgb2Ygd3Agd2l0aG91dCBhbnkgb2YgdGhlIG1hcmsgdXAgY2hhcmFjdGVycyBhbmQKKyAqIHdpdGggcXVvdGUgY2hhcmFjdGVycyAoIiAnIFwpIHN0cmlwcGVkLgorICogKHN0cmluZyBpcyBhbGxvY2F0ZWQgZnJvbSBBVEVNUCkKKyAqLworY2hhciAqCit3ZHN0cmlwKGNvbnN0IGNoYXIgKndwLCBib29sIGtlZXBxLCBib29sIG1ha2VfbWFnaWMpCit7CisJc3RydWN0IHNoZiBzaGY7CisJaW50IGM7CisKKwlzaGZfc29wZW4oTlVMTCwgMzIsIFNIRl9XUiB8IFNIRl9EWU5BTUlDLCAmc2hmKTsKKworCS8qIHByb2JsZW1zOgorCSAqCWAuLi5gIC0+ICQoLi4uKQorCSAqCXgke2ZvbzotImhpIn0gLT4geCR7Zm9vOi1oaX0KKwkgKgl4JHtmb286LSdoaSd9IC0+IHgke2ZvbzotaGl9IHVubGVzcyBrZWVwcQorCSAqLworCXdoaWxlICgxKQorCQlzd2l0Y2ggKCp3cCsrKSB7CisJCWNhc2UgRU9TOgorCQkJcmV0dXJuIChzaGZfc2Nsb3NlKCZzaGYpKTsgLyogbnVsbCB0ZXJtaW5hdGVzICovCisJCWNhc2UgQURFTElNOgorCQljYXNlIENIQVI6CisJCQljID0gKndwKys7CisJCQlpZiAobWFrZV9tYWdpYyAmJiAoSVNNQUdJQyhjKSB8fCBjID09ICdbJyB8fCBjID09IE5PVCB8fAorCQkJICAgIGMgPT0gJy0nIHx8IGMgPT0gJ10nIHx8IGMgPT0gJyonIHx8IGMgPT0gJz8nKSkKKwkJCQlzaGZfcHV0Y2hhcihNQUdJQywgJnNoZik7CisJCQlzaGZfcHV0Y2hhcihjLCAmc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIFFDSEFSOgorCQkJYyA9ICp3cCsrOworCQkJaWYgKGtlZXBxICYmIChjID09ICciJyB8fCBjID09ICdgJyB8fCBjID09ICckJyB8fCBjID09ICdcXCcpKQorCQkJCXNoZl9wdXRjaGFyKCdcXCcsICZzaGYpOworCQkJc2hmX3B1dGNoYXIoYywgJnNoZik7CisJCQlicmVhazsKKwkJY2FzZSBDT01TVUI6CisJCQlzaGZfcHV0cygiJCgiLCAmc2hmKTsKKwkJCXdoaWxlICgqd3AgIT0gMCkKKwkJCQlzaGZfcHV0Y2hhcigqd3ArKywgJnNoZik7CisJCQlzaGZfcHV0Y2hhcignKScsICZzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgRVhQUlNVQjoKKwkJCXNoZl9wdXRzKCIkKCgiLCAmc2hmKTsKKwkJCXdoaWxlICgqd3AgIT0gMCkKKwkJCQlzaGZfcHV0Y2hhcigqd3ArKywgJnNoZik7CisJCQlzaGZfcHV0cygiKSkiLCAmc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIE9RVU9URToKKwkJCWJyZWFrOworCQljYXNlIENRVU9URToKKwkJCWJyZWFrOworCQljYXNlIE9TVUJTVDoKKwkJCXNoZl9wdXRjaGFyKCckJywgJnNoZik7CisJCQlpZiAoKndwKysgPT0gJ3snKQorCQkJICAgIHNoZl9wdXRjaGFyKCd7JywgJnNoZik7CisJCQl3aGlsZSAoKGMgPSAqd3ArKykgIT0gMCkKKwkJCQlzaGZfcHV0Y2hhcihjLCAmc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIENTVUJTVDoKKwkJCWlmICgqd3ArKyA9PSAnfScpCisJCQkJc2hmX3B1dGNoYXIoJ30nLCAmc2hmKTsKKwkJCWJyZWFrOworCQljYXNlIE9QQVQ6CisJCQlpZiAobWFrZV9tYWdpYykgeworCQkJCXNoZl9wdXRjaGFyKE1BR0lDLCAmc2hmKTsKKwkJCQlzaGZfcHV0Y2hhcigqd3ArKyB8IDB4ODAsICZzaGYpOworCQkJfSBlbHNlIHsKKwkJCQlzaGZfcHV0Y2hhcigqd3ArKywgJnNoZik7CisJCQkJc2hmX3B1dGNoYXIoJygnLCAmc2hmKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNQQVQ6CisJCQlpZiAobWFrZV9tYWdpYykKKwkJCQlzaGZfcHV0Y2hhcihNQUdJQywgJnNoZik7CisJCQlzaGZfcHV0Y2hhcignfCcsICZzaGYpOworCQkJYnJlYWs7CisJCWNhc2UgQ1BBVDoKKwkJCWlmIChtYWtlX21hZ2ljKQorCQkJCXNoZl9wdXRjaGFyKE1BR0lDLCAmc2hmKTsKKwkJCXNoZl9wdXRjaGFyKCcpJywgJnNoZik7CisJCQlicmVhazsKKwkJfQorfQorCitzdGF0aWMgc3RydWN0IGlvd29yZCAqKgoraW9jb3B5KHN0cnVjdCBpb3dvcmQgKippb3csIEFyZWEgKmFwKQoreworCXN0cnVjdCBpb3dvcmQgKippb3I7CisJaW50IGk7CisKKwlmb3IgKGlvciA9IGlvdzsgKmlvcisrICE9IE5VTEw7ICkKKwkJOworCWlvciA9IGFsbG9jKChpb3IgLSBpb3cgKyAxKSAqIHNpemVvZihzdHJ1Y3QgaW93b3JkICopLCBhcCk7CisKKwlmb3IgKGkgPSAwOyBpb3dbaV0gIT0gTlVMTDsgaSsrKSB7CisJCXN0cnVjdCBpb3dvcmQgKnAsICpxOworCisJCXAgPSBpb3dbaV07CisJCXEgPSBhbGxvYyhzaXplb2Yoc3RydWN0IGlvd29yZCksIGFwKTsKKwkJaW9yW2ldID0gcTsKKwkJKnEgPSAqcDsKKwkJaWYgKHAtPm5hbWUgIT0gTlVMTCkKKwkJCXEtPm5hbWUgPSB3ZGNvcHkocC0+bmFtZSwgYXApOworCQlpZiAocC0+ZGVsaW0gIT0gTlVMTCkKKwkJCXEtPmRlbGltID0gd2Rjb3B5KHAtPmRlbGltLCBhcCk7CisJCWlmIChwLT5oZXJlZG9jICE9IE5VTEwpCisJCQlzdHJkdXB4KHEtPmhlcmVkb2MsIHAtPmhlcmVkb2MsIGFwKTsKKwl9CisJaW9yW2ldID0gTlVMTDsKKworCXJldHVybiAoaW9yKTsKK30KKworLyoKKyAqIGZyZWUgdHJlZSAoZm9yIGZ1bmN0aW9uIGRlZmluaXRpb24pCisgKi8KK3ZvaWQKK3RmcmVlKHN0cnVjdCBvcCAqdCwgQXJlYSAqYXApCit7CisJY2hhciAqKnc7CisKKwlpZiAodCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAodC0+c3RyICE9IE5VTEwpCisJCWFmcmVlKHQtPnN0ciwgYXApOworCisJaWYgKHQtPnZhcnMgIT0gTlVMTCkgeworCQlmb3IgKHcgPSB0LT52YXJzOyAqdyAhPSBOVUxMOyB3KyspCisJCQlhZnJlZSgqdywgYXApOworCQlhZnJlZSh0LT52YXJzLCBhcCk7CisJfQorCisJaWYgKHQtPmFyZ3MgIT0gTlVMTCkgeworCQl1bmlvbiBta3NoX2NjcGhhY2sgY3c7CisJCS8qIFhYWCB3ZSBhc3N1bWUgdGhlIGNhbGxlciBpcyByaWdodCAqLworCQljdy5ybyA9IHQtPmFyZ3M7CisJCWZvciAodyA9IGN3LnJ3OyAqdyAhPSBOVUxMOyB3KyspCisJCQlhZnJlZSgqdywgYXApOworCQlhZnJlZSh0LT5hcmdzLCBhcCk7CisJfQorCisJaWYgKHQtPmlvYWN0ICE9IE5VTEwpCisJCWlvZnJlZSh0LT5pb2FjdCwgYXApOworCisJdGZyZWUodC0+bGVmdCwgYXApOworCXRmcmVlKHQtPnJpZ2h0LCBhcCk7CisKKwlhZnJlZSh0LCBhcCk7Cit9CisKK3N0YXRpYyB2b2lkCitpb2ZyZWUoc3RydWN0IGlvd29yZCAqKmlvdywgQXJlYSAqYXApCit7CisJc3RydWN0IGlvd29yZCAqKmlvcDsKKwlzdHJ1Y3QgaW93b3JkICpwOworCisJZm9yIChpb3AgPSBpb3c7IChwID0gKmlvcCsrKSAhPSBOVUxMOyApIHsKKwkJaWYgKHAtPm5hbWUgIT0gTlVMTCkKKwkJCWFmcmVlKHAtPm5hbWUsIGFwKTsKKwkJaWYgKHAtPmRlbGltICE9IE5VTEwpCisJCQlhZnJlZShwLT5kZWxpbSwgYXApOworCQlpZiAocC0+aGVyZWRvYyAhPSBOVUxMKQorCQkJYWZyZWUocC0+aGVyZWRvYywgYXApOworCQlhZnJlZShwLCBhcCk7CisJfQorCWFmcmVlKGlvdywgYXApOworfQpkaWZmIC0tZ2l0IGEvbWtzaC9zcmMvdmFyLmMgYi9ta3NoL3NyYy92YXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTk3MjllCi0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvdmFyLmMKQEAgLTAsMCArMSwxNDkwIEBACisvKgkkT3BlbkJTRDogdmFyLmMsdiAxLjM0IDIwMDcvMTAvMTUgMDI6MTY6MzUgZGVyYWFkdCBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorICoJVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2Qub3JnPgorICoKKyAqIFByb3ZpZGVkIHRoYXQgdGhlc2UgdGVybXMgYW5kIGRpc2NsYWltZXIgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcworICogYXJlIHJldGFpbmVkIG9yIHJlcHJvZHVjZWQgaW4gYW4gYWNjb21wYW55aW5nIGRvY3VtZW50LCBwZXJtaXNzaW9uCisgKiBpcyBncmFudGVkIHRvIGRlYWwgaW4gdGhpcyB3b3JrIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB1bi0KKyAqIGxpbWl0ZWQgcmlnaHRzIHRvIHVzZSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgc2VsbCwgbW9kaWZ5LAorICogbWVyZ2UsIGdpdmUgYXdheSwgb3Igc3VibGljZW5jZS4KKyAqCisgKiBUaGlzIHdvcmsgaXMgcHJvdmlkZWQgIkFTIElTIiBhbmQgV0lUSE9VVCBXQVJSQU5UWSBvZiBhbnkga2luZCwgdG8KKyAqIHRoZSB1dG1vc3QgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgbmVpdGhlciBleHByZXNzIG5vcgorICogaW1wbGllZDsgd2l0aG91dCBtYWxpY2lvdXMgaW50ZW50IG9yIGdyb3NzIG5lZ2xpZ2VuY2UuIEluIG5vIGV2ZW50CisgKiBtYXkgYSBsaWNlbnNvciwgYXV0aG9yIG9yIGNvbnRyaWJ1dG9yIGJlIGhlbGQgbGlhYmxlIGZvciBpbmRpcmVjdCwKKyAqIGRpcmVjdCwgb3RoZXIgZGFtYWdlLCBsb3NzLCBvciBvdGhlciBpc3N1ZXMgYXJpc2luZyBpbiBhbnkgd2F5IG91dAorICogb2YgZGVhbGluZyBpbiB0aGUgd29yaywgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoCisgKiBkYW1hZ2Ugb3IgZXhpc3RlbmNlIG9mIGEgZGVmZWN0LCBleGNlcHQgcHJvdmVuIHRoYXQgaXQgcmVzdWx0cyBvdXQKKyAqIG9mIHNhaWQgcGVyc29uJ3MgaW1tZWRpYXRlIGZhdWx0IHdoZW4gdXNpbmcgdGhlIHdvcmsgYXMgaW50ZW5kZWQuCisgKi8KKworI2luY2x1ZGUgInNoLmgiCisKKyNpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQorI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KKyNlbmRpZgorCitfX1JDU0lEKCIkTWlyT1M6IHNyYy9iaW4vbWtzaC92YXIuYyx2IDEuMTEwIDIwMTAvMDcvMjUgMTE6MzU6NDMgdGcgRXhwICQiKTsKKworLyoKKyAqIFZhcmlhYmxlcworICoKKyAqIFdBUk5JTkc6IHVucmVhZGFibGUgY29kZSwgbmVlZHMgYSByZXdyaXRlCisgKgorICogaWYgKGZsYWcmSU5URUdFUiksIHZhbC5pIGNvbnRhaW5zIGludGVnZXIgdmFsdWUsIGFuZCB0eXBlIGNvbnRhaW5zIGJhc2UuCisgKiBvdGhlcndpc2UsICh2YWwucyArIHR5cGUpIGNvbnRhaW5zIHN0cmluZyB2YWx1ZS4KKyAqIGlmIChmbGFnJkVYUE9SVCksIHZhbC5zIGNvbnRhaW5zICJuYW1lPXZhbHVlIiBmb3IgRS1aIGV4cG9ydGluZy4KKyAqLworc3RhdGljIHN0cnVjdCB0YmwgdnRlbXA7CitzdGF0aWMgc3RydWN0IHRhYmxlIHNwZWNpYWxzOworc3RhdGljIGNoYXIgKmZvcm1hdHN0cihzdHJ1Y3QgdGJsICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgdm9pZCBleHBvcnRwcmVwKHN0cnVjdCB0YmwgKiwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyBpbnQgc3BlY2lhbChjb25zdCBjaGFyICopOworc3RhdGljIHZvaWQgdW5zcGVjaWFsKGNvbnN0IGNoYXIgKik7CitzdGF0aWMgdm9pZCBnZXRzcGVjKHN0cnVjdCB0YmwgKik7CitzdGF0aWMgdm9pZCBzZXRzcGVjKHN0cnVjdCB0YmwgKik7CitzdGF0aWMgdm9pZCB1bnNldHNwZWMoc3RydWN0IHRibCAqKTsKK3N0YXRpYyBpbnQgZ2V0aW50KHN0cnVjdCB0YmwgKiwgbWtzaF9hcmlfdCAqLCBib29sKTsKK3N0YXRpYyBta3NoX2FyaV90IGludHZhbChzdHJ1Y3QgdGJsICopOworc3RhdGljIHN0cnVjdCB0YmwgKmFycmF5c2VhcmNoKHN0cnVjdCB0YmwgKiwgdWludDMyX3QpOworc3RhdGljIGNvbnN0IGNoYXIgKmFycmF5X2luZGV4X2NhbGMoY29uc3QgY2hhciAqLCBib29sICosIHVpbnQzMl90ICopOworc3RhdGljIHVpbnQzMl90IG9hYXRoYXNoX3VwZGF0ZShyZWdpc3RlciB1aW50MzJfdCwgcmVnaXN0ZXIgY29uc3QgdWludDhfdCAqLAorICAgIHJlZ2lzdGVyIHNpemVfdCk7CitzdGF0aWMgdWludDMyX3Qgb2FhdGhhc2hfZmluYWxpc2UocmVnaXN0ZXIgdWludDMyX3QpOworCit1aW50OF90IHNldF9yZWZmbGFnID0gMDsKKworLyoKKyAqIGNyZWF0ZSBhIG5ldyBibG9jayBmb3IgZnVuY3Rpb24gY2FsbHMgYW5kIHNpbXBsZSBjb21tYW5kcworICogYXNzdW1lIGNhbGxlciBoYXMgYWxsb2NhdGVkIGFuZCBzZXQgdXAgZS0+bG9jCisgKi8KK3ZvaWQKK25ld2Jsb2NrKHZvaWQpCit7CisJc3RydWN0IGJsb2NrICpsOworCXN0YXRpYyBjb25zdCBjaGFyICplbXB0eVtdID0geyBudWxsIH07CisKKwlsID0gYWxsb2Moc2l6ZW9mKHN0cnVjdCBibG9jayksIEFURU1QKTsKKwlsLT5mbGFncyA9IDA7CisJYWluaXQoJmwtPmFyZWEpOyAvKiB0b2RvOiBjb3VsZCB1c2UgZS0+YXJlYSAobC0+YXJlYSA9PiBsLT5hcmVhcCkgKi8KKwlpZiAoIWUtPmxvYykgeworCQlsLT5hcmdjID0gMDsKKwkJbC0+YXJndiA9IGVtcHR5OworCX0gZWxzZSB7CisJCWwtPmFyZ2MgPSBlLT5sb2MtPmFyZ2M7CisJCWwtPmFyZ3YgPSBlLT5sb2MtPmFyZ3Y7CisJfQorCWwtPmV4aXQgPSBsLT5lcnJvciA9IE5VTEw7CisJa3Rpbml0KCZsLT52YXJzLCAmbC0+YXJlYSwgMCk7CisJa3Rpbml0KCZsLT5mdW5zLCAmbC0+YXJlYSwgMCk7CisJbC0+bmV4dCA9IGUtPmxvYzsKKwllLT5sb2MgPSBsOworfQorCisvKgorICogcG9wIGEgYmxvY2sgaGFuZGxpbmcgc3BlY2lhbCB2YXJpYWJsZXMKKyAqLwordm9pZAorcG9wYmxvY2sodm9pZCkKK3sKKwlzdHJ1Y3QgYmxvY2sgKmwgPSBlLT5sb2M7CisJc3RydWN0IHRibCAqdnAsICoqdnBwID0gbC0+dmFycy50YmxzLCAqdnE7CisJaW50IGk7CisKKwllLT5sb2MgPSBsLT5uZXh0OwkvKiBwb3AgYmxvY2sgKi8KKwlmb3IgKGkgPSBsLT52YXJzLnNpemU7IC0taSA+PSAwOyApCisJCWlmICgodnAgPSAqdnBwKyspICE9IE5VTEwgJiYgKHZwLT5mbGFnJlNQRUNJQUwpKSB7CisJCQlpZiAoKHZxID0gZ2xvYmFsKHZwLT5uYW1lKSktPmZsYWcgJiBJU1NFVCkKKwkJCQlzZXRzcGVjKHZxKTsKKwkJCWVsc2UKKwkJCQl1bnNldHNwZWModnEpOworCQl9CisJaWYgKGwtPmZsYWdzICYgQkZfRE9HRVRPUFRTKQorCQl1c2VyX29wdCA9IGwtPmdldG9wdHNfc3RhdGU7CisJYWZyZWVhbGwoJmwtPmFyZWEpOworCWFmcmVlKGwsIEFURU1QKTsKK30KKworLyogY2FsbGVkIGJ5IG1haW4oKSB0byBpbml0aWFsaXNlIHZhcmlhYmxlIGRhdGEgc3RydWN0dXJlcyAqLworI2RlZmluZSBWQVJTUEVDX0RFRk5TCisjaW5jbHVkZSAidmFyX3NwZWMuaCIKKworZW51bSB2YXJfc3BlY3MgeworI2RlZmluZSBWQVJTUEVDX0VOVU1TCisjaW5jbHVkZSAidmFyX3NwZWMuaCIKKwlWX01BWAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbml0dmFyX25hbWVzW10gPSB7CisjZGVmaW5lIFZBUlNQRUNfSVRFTVMKKyNpbmNsdWRlICJ2YXJfc3BlYy5oIgorfTsKKwordm9pZAoraW5pdHZhcih2b2lkKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgdGJsICp0cDsKKworCWt0aW5pdCgmc3BlY2lhbHMsIEFQRVJNLAorCSAgICAvKiBtdXN0IGJlIDgwJSBvZiAyXm4gKGN1cnJlbnRseSAxMiBzcGVjaWFscykgKi8gMTYpOworCXdoaWxlIChpIDwgVl9NQVggLSAxKSB7CisJCXRwID0ga3RlbnRlcigmc3BlY2lhbHMsIGluaXR2YXJfbmFtZXNbaV0sCisJCSAgICBoYXNoKGluaXR2YXJfbmFtZXNbaV0pKTsKKwkJdHAtPmZsYWcgPSBERUZJTkVEfElTU0VUOworCQl0cC0+dHlwZSA9ICsraTsKKwl9Cit9CisKKy8qIFVzZWQgdG8gY2FsY3VsYXRlIGFuIGFycmF5IGluZGV4IGZvciBnbG9iYWwoKS9sb2NhbCgpLiBTZXRzICphcnJheXAgdG8KKyAqIHRydWUgaWYgdGhpcyBpcyBhbiBhcnJheSwgc2V0cyAqdmFscCB0byB0aGUgYXJyYXkgaW5kZXgsIHJldHVybnMKKyAqIHRoZSBiYXNlbmFtZSBvZiB0aGUgYXJyYXkuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2FycmF5X2luZGV4X2NhbGMoY29uc3QgY2hhciAqbiwgYm9vbCAqYXJyYXlwLCB1aW50MzJfdCAqdmFscCkKK3sKKwljb25zdCBjaGFyICpwOworCWludCBsZW47CisJY2hhciAqYXAgPSBOVUxMOworCisJKmFycmF5cCA9IGZhbHNlOworIHJlZG9fZnJvbV9yZWY6CisJcCA9IHNraXBfdmFybmFtZShuLCBmYWxzZSk7CisJaWYgKCFzZXRfcmVmZmxhZyAmJiAocCAhPSBuKSAmJiBrc2hfaXNhbHBoeChuWzBdKSkgeworCQlzdHJ1Y3QgYmxvY2sgKmwgPSBlLT5sb2M7CisJCXN0cnVjdCB0YmwgKnZwOworCQljaGFyICp2bjsKKwkJdWludDMyX3QgaDsKKworCQlzdHJuZHVweCh2biwgbiwgcCAtIG4sIEFURU1QKTsKKwkJaCA9IGhhc2godm4pOworCQkvKiBjaGVjayBpZiB0aGlzIGlzIGEgcmVmZXJlbmNlICovCisJCWRvIHsKKwkJCXZwID0ga3RzZWFyY2goJmwtPnZhcnMsIHZuLCBoKTsKKwkJfSB3aGlsZSAoIXZwICYmIChsID0gbC0+bmV4dCkpOworCQlhZnJlZSh2biwgQVRFTVApOworCQlpZiAodnAgJiYgKHZwLT5mbGFnICYgKERFRklORUR8QVNTT0N8QVJSQVkpKSA9PQorCQkgICAgKERFRklORUR8QVNTT0MpKSB7CisJCQljaGFyICpjcDsKKworCQkJLyogZ290Y2hhISAqLworCQkJY3AgPSBzaGZfc21wcmludGYoIiVzJXMiLCBzdHJfdmFsKHZwKSwgcCk7CisJCQlhZnJlZShhcCwgQVRFTVApOworCQkJbiA9IGFwID0gY3A7CisJCQlnb3RvIHJlZG9fZnJvbV9yZWY7CisJCX0KKwl9CisKKwlpZiAocCAhPSBuICYmICpwID09ICdbJyAmJiAobGVuID0gYXJyYXlfcmVmX2xlbihwKSkpIHsKKwkJY2hhciAqc3ViLCAqdG1wOworCQlta3NoX2FyaV90IHJ2YWw7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSB2YWx1ZSBvZiB0aGUgc3Vic2NyaXB0ICovCisJCSphcnJheXAgPSB0cnVlOworCQlzdHJuZHVweCh0bXAsIHAgKyAxLCBsZW4gLSAyLCBBVEVNUCk7CisJCXN1YiA9IHN1YnN0aXR1dGUodG1wLCAwKTsKKwkJYWZyZWUodG1wLCBBVEVNUCk7CisJCXN0cm5kdXB4KG4sIG4sIHAgLSBuLCBBVEVNUCk7CisJCWV2YWx1YXRlKHN1YiwgJnJ2YWwsIEtTSF9VTldJTkRfRVJST1IsIHRydWUpOworCQkqdmFscCA9ICh1aW50MzJfdClydmFsOworCQlhZnJlZShzdWIsIEFURU1QKTsKKwl9CisJcmV0dXJuIChuKTsKK30KKworLyoKKyAqIFNlYXJjaCBmb3IgdmFyaWFibGUsIGlmIG5vdCBmb3VuZCBjcmVhdGUgZ2xvYmFsbHkuCisgKi8KK3N0cnVjdCB0YmwgKgorZ2xvYmFsKGNvbnN0IGNoYXIgKm4pCit7CisJc3RydWN0IGJsb2NrICpsID0gZS0+bG9jOworCXN0cnVjdCB0YmwgKnZwOworCWludCBjOworCWJvb2wgYXJyYXk7CisJdWludDMyX3QgaCwgdmFsOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYW4gYXJyYXkgKi8KKwluID0gYXJyYXlfaW5kZXhfY2FsYyhuLCAmYXJyYXksICZ2YWwpOworCWggPSBoYXNoKG4pOworCWMgPSBuWzBdOworCWlmICgha3NoX2lzYWxwaHgoYykpIHsKKwkJaWYgKGFycmF5KQorCQkJZXJyb3JmKCJiYWQgc3Vic3RpdHV0aW9uIik7CisJCXZwID0gJnZ0ZW1wOworCQl2cC0+ZmxhZyA9IERFRklORUQ7CisJCXZwLT50eXBlID0gMDsKKwkJdnAtPmFyZWFwID0gQVRFTVA7CisJCSp2cC0+bmFtZSA9IGM7CisJCWlmIChrc2hfaXNkaWdpdChjKSkgeworCQkJZm9yIChjID0gMDsga3NoX2lzZGlnaXQoKm4pOyBuKyspCisJCQkJYyA9IGMqMTAgKyAqbi0nMCc7CisJCQlpZiAoYyA8PSBsLT5hcmdjKQorCQkJCS8qIHNldHN0ciBjYW4ndCBmYWlsIGhlcmUgKi8KKwkJCQlzZXRzdHIodnAsIGwtPmFyZ3ZbY10sIEtTSF9SRVRVUk5fRVJST1IpOworCQkJdnAtPmZsYWcgfD0gUkRPTkxZOworCQkJcmV0dXJuICh2cCk7CisJCX0KKwkJdnAtPmZsYWcgfD0gUkRPTkxZOworCQlpZiAoblsxXSAhPSAnXDAnKQorCQkJcmV0dXJuICh2cCk7CisJCXZwLT5mbGFnIHw9IElTU0VUfElOVEVHRVI7CisJCXN3aXRjaCAoYykgeworCQljYXNlICckJzoKKwkJCXZwLT52YWwuaSA9IGtzaHBpZDsKKwkJCWJyZWFrOworCQljYXNlICchJzoKKwkJCS8qIElmIG5vIGpvYiwgZXhwYW5kIHRvIG5vdGhpbmcgKi8KKwkJCWlmICgodnAtPnZhbC5pID0gal9hc3luYygpKSA9PSAwKQorCQkJCXZwLT5mbGFnICY9IH4oSVNTRVR8SU5URUdFUik7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQl2cC0+dmFsLmkgPSBleHN0YXQ7CisJCQlicmVhazsKKwkJY2FzZSAnIyc6CisJCQl2cC0+dmFsLmkgPSBsLT5hcmdjOworCQkJYnJlYWs7CisJCWNhc2UgJy0nOgorCQkJdnAtPmZsYWcgJj0gfklOVEVHRVI7CisJCQl2cC0+dmFsLnMgPSBnZXRvcHRpb25zKCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXZwLT5mbGFnICY9IH4oSVNTRVR8SU5URUdFUik7CisJCX0KKwkJcmV0dXJuICh2cCk7CisJfQorCWZvciAobCA9IGUtPmxvYzsgOyBsID0gbC0+bmV4dCkgeworCQl2cCA9IGt0c2VhcmNoKCZsLT52YXJzLCBuLCBoKTsKKwkJaWYgKHZwICE9IE5VTEwpIHsKKwkJCWlmIChhcnJheSkKKwkJCQlyZXR1cm4gKGFycmF5c2VhcmNoKHZwLCB2YWwpKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKHZwKTsKKwkJfQorCQlpZiAobC0+bmV4dCA9PSBOVUxMKQorCQkJYnJlYWs7CisJfQorCXZwID0ga3RlbnRlcigmbC0+dmFycywgbiwgaCk7CisJaWYgKGFycmF5KQorCQl2cCA9IGFycmF5c2VhcmNoKHZwLCB2YWwpOworCXZwLT5mbGFnIHw9IERFRklORUQ7CisJaWYgKHNwZWNpYWwobikpCisJCXZwLT5mbGFnIHw9IFNQRUNJQUw7CisJcmV0dXJuICh2cCk7Cit9CisKKy8qCisgKiBTZWFyY2ggZm9yIGxvY2FsIHZhcmlhYmxlLCBpZiBub3QgZm91bmQgY3JlYXRlIGxvY2FsbHkuCisgKi8KK3N0cnVjdCB0YmwgKgorbG9jYWwoY29uc3QgY2hhciAqbiwgYm9vbCBjb3B5KQoreworCXN0cnVjdCBibG9jayAqbCA9IGUtPmxvYzsKKwlzdHJ1Y3QgdGJsICp2cDsKKwlib29sIGFycmF5OworCXVpbnQzMl90IGgsIHZhbDsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGFycmF5ICovCisJbiA9IGFycmF5X2luZGV4X2NhbGMobiwgJmFycmF5LCAmdmFsKTsKKwloID0gaGFzaChuKTsKKwlpZiAoIWtzaF9pc2FscGh4KCpuKSkgeworCQl2cCA9ICZ2dGVtcDsKKwkJdnAtPmZsYWcgPSBERUZJTkVEfFJET05MWTsKKwkJdnAtPnR5cGUgPSAwOworCQl2cC0+YXJlYXAgPSBBVEVNUDsKKwkJcmV0dXJuICh2cCk7CisJfQorCXZwID0ga3RlbnRlcigmbC0+dmFycywgbiwgaCk7CisJaWYgKGNvcHkgJiYgISh2cC0+ZmxhZyAmIERFRklORUQpKSB7CisJCXN0cnVjdCBibG9jayAqbGwgPSBsOworCQlzdHJ1Y3QgdGJsICp2cSA9IE5VTEw7CisKKwkJd2hpbGUgKChsbCA9IGxsLT5uZXh0KSAmJiAhKHZxID0ga3RzZWFyY2goJmxsLT52YXJzLCBuLCBoKSkpCisJCQk7CisJCWlmICh2cSkgeworCQkJdnAtPmZsYWcgfD0gdnEtPmZsYWcgJgorCQkJICAgIChFWFBPUlQgfCBJTlRFR0VSIHwgUkRPTkxZIHwgTEpVU1QgfCBSSlVTVCB8CisJCQkgICAgWkVST0ZJTCB8IExDQVNFViB8IFVDQVNFVl9BTCB8IElOVF9VIHwgSU5UX0wpOworCQkJaWYgKHZxLT5mbGFnICYgSU5URUdFUikKKwkJCQl2cC0+dHlwZSA9IHZxLT50eXBlOworCQkJdnAtPnUyLmZpZWxkID0gdnEtPnUyLmZpZWxkOworCQl9CisJfQorCWlmIChhcnJheSkKKwkJdnAgPSBhcnJheXNlYXJjaCh2cCwgdmFsKTsKKwl2cC0+ZmxhZyB8PSBERUZJTkVEOworCWlmIChzcGVjaWFsKG4pKQorCQl2cC0+ZmxhZyB8PSBTUEVDSUFMOworCXJldHVybiAodnApOworfQorCisvKiBnZXQgdmFyaWFibGUgc3RyaW5nIHZhbHVlICovCitjaGFyICoKK3N0cl92YWwoc3RydWN0IHRibCAqdnApCit7CisJY2hhciAqczsKKworCWlmICgodnAtPmZsYWcmU1BFQ0lBTCkpCisJCWdldHNwZWModnApOworCWlmICghKHZwLT5mbGFnJklTU0VUKSkKKwkJcyA9IG51bGw7CQkvKiBzcGVjaWFsIHRvIGRvbGxhcigpICovCisJZWxzZSBpZiAoISh2cC0+ZmxhZyZJTlRFR0VSKSkJLyogc3RyaW5nIHNvdXJjZSAqLworCQlzID0gdnAtPnZhbC5zICsgdnAtPnR5cGU7CisJZWxzZSB7CQkJCS8qIGludGVnZXIgc291cmNlICovCisJCS8qIHdvcnN0IGNhc2UgbnVtYmVyIGxlbmd0aCBpcyB3aGVuIGJhc2U9MiAqLworCQkvKiAxIChtaW51cykgKyAyIChiYXNlLCB1cCB0byAzNikgKyAxICgnIycpICsgbnVtYmVyIG9mIGJpdHMKKwkJICogaW4gdGhlIG1rc2hfdWFyaV90ICsgMSAoTlVMKSAqLworCQljaGFyIHN0cmJ1ZlsxICsgMiArIDEgKyA4ICogc2l6ZW9mKG1rc2hfdWFyaV90KSArIDFdOworCQljb25zdCBjaGFyICpkaWdpdHMgPSAodnAtPmZsYWcgJiBVQ0FTRVZfQUwpID8KKwkJICAgIGRpZ2l0c191YyA6IGRpZ2l0c19sYzsKKwkJbWtzaF91YXJpX3QgbjsKKwkJaW50IGJhc2U7CisKKwkJcyA9IHN0cmJ1ZiArIHNpemVvZihzdHJidWYpOworCQlpZiAodnAtPmZsYWcgJiBJTlRfVSkKKwkJCW4gPSB2cC0+dmFsLnU7CisJCWVsc2UKKwkJCW4gPSAodnAtPnZhbC5pIDwgMCkgPyAtdnAtPnZhbC5pIDogdnAtPnZhbC5pOworCQliYXNlID0gKHZwLT50eXBlID09IDApID8gMTAgOiB2cC0+dHlwZTsKKworCQlpZiAoYmFzZSA9PSAxKSB7CisJCQlzaXplX3Qgc3ogPSAxOworCisJCQkqKHMgPSBzdHJidWYpID0gJzEnOworCQkJc1sxXSA9ICcjJzsKKwkJCWlmICghVVRGTU9ERSB8fCAoKG4gJiAweEZGODApID09IDB4RUY4MCkpCisJCQkJLyogT1BUVS0xNiAtPiByYXcgb2N0ZXQgKi8KKwkJCQlzWzJdID0gbiAmIDB4RkY7CisJCQllbHNlCisJCQkJc3ogPSB1dGZfd2N0b21iKHMgKyAyLCBuKTsKKwkJCXNbMiArIHN6XSA9ICdcMCc7CisJCX0gZWxzZSB7CisJCQkqLS1zID0gJ1wwJzsKKwkJCWRvIHsKKwkJCQkqLS1zID0gZGlnaXRzW24gJSBiYXNlXTsKKwkJCQluIC89IGJhc2U7CisJCQl9IHdoaWxlIChuICE9IDApOworCQkJaWYgKGJhc2UgIT0gMTApIHsKKwkJCQkqLS1zID0gJyMnOworCQkJCSotLXMgPSBkaWdpdHNbYmFzZSAlIDEwXTsKKwkJCQlpZiAoYmFzZSA+PSAxMCkKKwkJCQkJKi0tcyA9IGRpZ2l0c1tiYXNlIC8gMTBdOworCQkJfQorCQkJaWYgKCEodnAtPmZsYWcgJiBJTlRfVSkgJiYgdnAtPnZhbC5pIDwgMCkKKwkJCQkqLS1zID0gJy0nOworCQl9CisJCWlmICh2cC0+ZmxhZyAmIChSSlVTVHxMSlVTVCkpIC8qIGNhc2UgYWxyZWFkeSBkZWFsdCB3aXRoICovCisJCQlzID0gZm9ybWF0c3RyKHZwLCBzKTsKKwkJZWxzZQorCQkJc3RyZHVweChzLCBzLCBBVEVNUCk7CisJfQorCXJldHVybiAocyk7Cit9CisKKy8qIGdldCB2YXJpYWJsZSBpbnRlZ2VyIHZhbHVlLCB3aXRoIGVycm9yIGNoZWNraW5nICovCitzdGF0aWMgbWtzaF9hcmlfdAoraW50dmFsKHN0cnVjdCB0YmwgKnZwKQoreworCW1rc2hfYXJpX3QgbnVtOworCWludCBiYXNlOworCisJYmFzZSA9IGdldGludCh2cCwgJm51bSwgZmFsc2UpOworCWlmIChiYXNlID09IC0xKQorCQkvKiBYWFggY2hlY2sgY2FsbHMgLSBpcyBlcnJvciBoZXJlIG9rIGJ5IFBPU0lYPyAqLworCQllcnJvcmYoIiVzOiBiYWQgbnVtYmVyIiwgc3RyX3ZhbCh2cCkpOworCXJldHVybiAobnVtKTsKK30KKworLyogc2V0IHZhcmlhYmxlIHRvIHN0cmluZyB2YWx1ZSAqLworaW50CitzZXRzdHIoc3RydWN0IHRibCAqdnEsIGNvbnN0IGNoYXIgKnMsIGludCBlcnJvcl9vaykKK3sKKwljaGFyICpzYWxsb2MgPSBOVUxMOworCWludCBub19yb19jaGVjayA9IGVycm9yX29rICYgMHg0OworCisJZXJyb3Jfb2sgJj0gfjB4NDsKKwlpZiAoKHZxLT5mbGFnICYgUkRPTkxZKSAmJiAhbm9fcm9fY2hlY2spIHsKKwkJd2FybmluZ2YodHJ1ZSwgIiVzOiBpcyByZWFkIG9ubHkiLCB2cS0+bmFtZSk7CisJCWlmICghZXJyb3Jfb2spCisJCQllcnJvcmZ6KCk7CisJCXJldHVybiAoMCk7CisJfQorCWlmICghKHZxLT5mbGFnJklOVEVHRVIpKSB7IC8qIHN0cmluZyBkZXN0ICovCisJCWlmICgodnEtPmZsYWcmQUxMT0MpKSB7CisJCQkvKiBkZWJ1Z2dpbmcgKi8KKwkJCWlmIChzID49IHZxLT52YWwucyAmJgorCQkJICAgIHMgPD0gdnEtPnZhbC5zICsgc3RybGVuKHZxLT52YWwucykpCisJCQkJaW50ZXJuYWxfZXJyb3JmKAorCQkJCSAgICAic2V0c3RyOiAlcz0lczogYXNzaWduaW5nIHRvIHNlbGYiLAorCQkJCSAgICB2cS0+bmFtZSwgcyk7CisJCQlhZnJlZSh2cS0+dmFsLnMsIHZxLT5hcmVhcCk7CisJCX0KKwkJdnEtPmZsYWcgJj0gfihJU1NFVHxBTExPQyk7CisJCXZxLT50eXBlID0gMDsKKwkJaWYgKHMgJiYgKHZxLT5mbGFnICYgKFVDQVNFVl9BTHxMQ0FTRVZ8TEpVU1R8UkpVU1QpKSkKKwkJCXMgPSBzYWxsb2MgPSBmb3JtYXRzdHIodnEsIHMpOworCQlpZiAoKHZxLT5mbGFnJkVYUE9SVCkpCisJCQlleHBvcnRwcmVwKHZxLCBzKTsKKwkJZWxzZSB7CisJCQlzdHJkdXB4KHZxLT52YWwucywgcywgdnEtPmFyZWFwKTsKKwkJCXZxLT5mbGFnIHw9IEFMTE9DOworCQl9CisJfSBlbHNlIHsJCS8qIGludGVnZXIgZGVzdCAqLworCQlpZiAoIXZfZXZhbHVhdGUodnEsIHMsIGVycm9yX29rLCB0cnVlKSkKKwkJCXJldHVybiAoMCk7CisJfQorCXZxLT5mbGFnIHw9IElTU0VUOworCWlmICgodnEtPmZsYWcmU1BFQ0lBTCkpCisJCXNldHNwZWModnEpOworCWFmcmVlKHNhbGxvYywgQVRFTVApOworCXJldHVybiAoMSk7Cit9CisKKy8qIHNldCB2YXJpYWJsZSB0byBpbnRlZ2VyICovCit2b2lkCitzZXRpbnQoc3RydWN0IHRibCAqdnEsIG1rc2hfYXJpX3QgbikKK3sKKwlpZiAoISh2cS0+ZmxhZyZJTlRFR0VSKSkgeworCQlzdHJ1Y3QgdGJsICp2cCA9ICZ2dGVtcDsKKwkJdnAtPmZsYWcgPSAoSVNTRVR8SU5URUdFUik7CisJCXZwLT50eXBlID0gMDsKKwkJdnAtPmFyZWFwID0gQVRFTVA7CisJCXZwLT52YWwuaSA9IG47CisJCS8qIHNldHN0ciBjYW4ndCBmYWlsIGhlcmUgKi8KKwkJc2V0c3RyKHZxLCBzdHJfdmFsKHZwKSwgS1NIX1JFVFVSTl9FUlJPUik7CisJfSBlbHNlCisJCXZxLT52YWwuaSA9IG47CisJdnEtPmZsYWcgfD0gSVNTRVQ7CisJaWYgKCh2cS0+ZmxhZyZTUEVDSUFMKSkKKwkJc2V0c3BlYyh2cSk7Cit9CisKK3N0YXRpYyBpbnQKK2dldGludChzdHJ1Y3QgdGJsICp2cCwgbWtzaF9hcmlfdCAqbnVtcCwgYm9vbCBhcml0aCkKK3sKKwljaGFyICpzOworCWludCBjLCBiYXNlLCBuZWc7CisJYm9vbCBoYXZlX2Jhc2UgPSBmYWxzZTsKKwlta3NoX2FyaV90IG51bTsKKworCWlmICh2cC0+ZmxhZyZTUEVDSUFMKQorCQlnZXRzcGVjKHZwKTsKKwkvKiBYWFggaXMgaXQgcG9zc2libGUgZm9yIElTU0VUIHRvIGJlIHNldCBhbmQgdmFsLnMgdG8gYmUgMD8gKi8KKwlpZiAoISh2cC0+ZmxhZyZJU1NFVCkgfHwgKCEodnAtPmZsYWcmSU5URUdFUikgJiYgdnAtPnZhbC5zID09IE5VTEwpKQorCQlyZXR1cm4gKC0xKTsKKwlpZiAodnAtPmZsYWcmSU5URUdFUikgeworCQkqbnVtcCA9IHZwLT52YWwuaTsKKwkJcmV0dXJuICh2cC0+dHlwZSk7CisJfQorCXMgPSB2cC0+dmFsLnMgKyB2cC0+dHlwZTsKKwlpZiAocyA9PSBOVUxMKQkvKiByZWR1bmRhbnQgZ2l2ZW4gaW5pdGlhbCB0ZXN0ICovCisJCXMgPSBudWxsOworCWJhc2UgPSAxMDsKKwludW0gPSAwOworCW5lZyA9IDA7CisJaWYgKGFyaXRoICYmICpzID09ICcwJyAmJiAqKHMrMSkpIHsKKwkJcysrOworCQlpZiAoKnMgPT0gJ3gnIHx8ICpzID09ICdYJykgeworCQkJcysrOworCQkJYmFzZSA9IDE2OworCQl9IGVsc2UgaWYgKHZwLT5mbGFnICYgWkVST0ZJTCkgeworCQkJd2hpbGUgKCpzID09ICcwJykKKwkJCQlzKys7CisJCX0gZWxzZQorCQkJYmFzZSA9IDg7CisJCWhhdmVfYmFzZSA9IHRydWU7CisJfQorCWZvciAoYyA9ICpzKys7IGMgOyBjID0gKnMrKykgeworCQlpZiAoYyA9PSAnLScpIHsKKwkJCW5lZysrOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoYyA9PSAnIycpIHsKKwkJCWJhc2UgPSAoaW50KW51bTsKKwkJCWlmIChoYXZlX2Jhc2UgfHwgYmFzZSA8IDEgfHwgYmFzZSA+IDM2KQorCQkJCXJldHVybiAoLTEpOworCQkJaWYgKGJhc2UgPT0gMSkgeworCQkJCXVuc2lnbmVkIGludCB3YzsKKworCQkJCWlmICghVVRGTU9ERSkKKwkJCQkJd2MgPSAqKHVuc2lnbmVkIGNoYXIgKilzOworCQkJCWVsc2UgaWYgKHV0Zl9tYnRvd2MoJndjLCBzKSA9PSAoc2l6ZV90KS0xKQorCQkJCQkvKiBPUFRVLTggLT4gT1BUVS0xNiAqLworCQkJCQkvKgorCQkJCQkgKiAod2l0aCBhIHR3aXN0OiAxI1x1RUY4MCBjb252ZXJ0cworCQkJCQkgKiB0aGUgc2FtZSBhcyAxI1x4ODAgZG9lcywgdGh1cyBpcworCQkJCQkgKiBub3Qgcm91bmQtdHJpcHBpbmcgY29ycmVjdGx5IFhYWCkKKwkJCQkJICovCisJCQkJCXdjID0gMHhFRjAwICsgKih1bnNpZ25lZCBjaGFyICopczsKKwkJCQkqbnVtcCA9IChta3NoX2FyaV90KXdjOworCQkJCXJldHVybiAoMSk7CisJCQl9CisJCQludW0gPSAwOworCQkJaGF2ZV9iYXNlID0gdHJ1ZTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKGtzaF9pc2RpZ2l0KGMpKQorCQkJYyAtPSAnMCc7CisJCWVsc2UgaWYgKGtzaF9pc2xvd2VyKGMpKQorCQkJYyAtPSAnYScgLSAxMDsKKwkJZWxzZSBpZiAoa3NoX2lzdXBwZXIoYykpCisJCQljIC09ICdBJyAtIDEwOworCQllbHNlCisJCQlyZXR1cm4gKC0xKTsKKwkJaWYgKGMgPCAwIHx8IGMgPj0gYmFzZSkKKwkJCXJldHVybiAoLTEpOworCQludW0gPSBudW0gKiBiYXNlICsgYzsKKwl9CisJaWYgKG5lZykKKwkJbnVtID0gLW51bTsKKwkqbnVtcCA9IG51bTsKKwlyZXR1cm4gKGJhc2UpOworfQorCisvKiBjb252ZXJ0IHZhcmlhYmxlIHZxIHRvIGludGVnZXIgdmFyaWFibGUsIHNldHRpbmcgaXRzIHZhbHVlIGZyb20gdnAKKyAqICh2cSBhbmQgdnAgbWF5IGJlIHRoZSBzYW1lKQorICovCitzdHJ1Y3QgdGJsICoKK3NldGludF92KHN0cnVjdCB0YmwgKnZxLCBzdHJ1Y3QgdGJsICp2cCwgYm9vbCBhcml0aCkKK3sKKwlpbnQgYmFzZTsKKwlta3NoX2FyaV90IG51bTsKKworCWlmICgoYmFzZSA9IGdldGludCh2cCwgJm51bSwgYXJpdGgpKSA9PSAtMSkKKwkJcmV0dXJuIChOVUxMKTsKKwlpZiAoISh2cS0+ZmxhZyAmIElOVEVHRVIpICYmICh2cS0+ZmxhZyAmIEFMTE9DKSkgeworCQl2cS0+ZmxhZyAmPSB+QUxMT0M7CisJCWFmcmVlKHZxLT52YWwucywgdnEtPmFyZWFwKTsKKwl9CisJdnEtPnZhbC5pID0gbnVtOworCWlmICh2cS0+dHlwZSA9PSAwKSAvKiBkZWZhdWx0IGJhc2UgKi8KKwkJdnEtPnR5cGUgPSBiYXNlOworCXZxLT5mbGFnIHw9IElTU0VUfElOVEVHRVI7CisJaWYgKHZxLT5mbGFnJlNQRUNJQUwpCisJCXNldHNwZWModnEpOworCXJldHVybiAodnEpOworfQorCitzdGF0aWMgY2hhciAqCitmb3JtYXRzdHIoc3RydWN0IHRibCAqdnAsIGNvbnN0IGNoYXIgKnMpCit7CisJaW50IG9sZW4sIG5sZW47CisJY2hhciAqcCwgKnE7CisJc2l6ZV90IHBzaXo7CisKKwlvbGVuID0gdXRmX21ic3dpZHRoKHMpOworCisJaWYgKHZwLT5mbGFnICYgKFJKVVNUfExKVVNUKSkgeworCQlpZiAoIXZwLT51Mi5maWVsZCkJLyogZGVmYXVsdCBmaWVsZCB3aWR0aCAqLworCQkJdnAtPnUyLmZpZWxkID0gb2xlbjsKKwkJbmxlbiA9IHZwLT51Mi5maWVsZDsKKwl9IGVsc2UKKwkJbmxlbiA9IG9sZW47CisKKwlwID0gYWxsb2MoKHBzaXogPSBubGVuICogLyogTUJfTEVOX01BWCAqLyAzICsgMSksIEFURU1QKTsKKwlpZiAodnAtPmZsYWcgJiAoUkpVU1R8TEpVU1QpKSB7CisJCWludCBzbGVuID0gb2xlbiwgaSA9IDA7CisKKwkJaWYgKHZwLT5mbGFnICYgUkpVU1QpIHsKKwkJCWNvbnN0IGNoYXIgKnFxID0gczsKKwkJCWludCBuID0gMDsKKworCQkJd2hpbGUgKGkgPCBzbGVuKQorCQkJCWkgKz0gdXRmX3dpZHRoYWRqKHFxLCAmcXEpOworCQkJLyogc3RyaXAgdHJhaWxpbmcgc3BhY2VzIChBVCZUIHVzZXMgcXFbLTFdID09ICcgJykgKi8KKwkJCXdoaWxlIChxcSA+IHMgJiYga3NoX2lzc3BhY2UocXFbLTFdKSkgeworCQkJCS0tcXE7CisJCQkJLS1zbGVuOworCQkJfQorCQkJaWYgKHZwLT5mbGFnICYgWkVST0ZJTCAmJiB2cC0+ZmxhZyAmIElOVEVHRVIpIHsKKwkJCQlpZiAoc1sxXSA9PSAnIycpCisJCQkJCW4gPSAyOworCQkJCWVsc2UgaWYgKHNbMl0gPT0gJyMnKQorCQkJCQluID0gMzsKKwkJCQlpZiAodnAtPnUyLmZpZWxkIDw9IG4pCisJCQkJCW4gPSAwOworCQkJfQorCQkJaWYgKG4pIHsKKwkJCQltZW1jcHkocCwgcywgbik7CisJCQkJcyArPSBuOworCQkJfQorCQkJd2hpbGUgKHNsZW4gPiB2cC0+dTIuZmllbGQpCisJCQkJc2xlbiAtPSB1dGZfd2lkdGhhZGoocywgJnMpOworCQkJaWYgKHZwLT51Mi5maWVsZCAtIHNsZW4pCisJCQkJbWVtc2V0KHAgKyBuLCAodnAtPmZsYWcgJiBaRVJPRklMKSA/ICcwJyA6ICcgJywKKwkJCQkgICAgdnAtPnUyLmZpZWxkIC0gc2xlbik7CisJCQlzbGVuIC09IG47CisJCQlzaGZfc25wcmludGYocCArIHZwLT51Mi5maWVsZCAtIHNsZW4sCisJCQkgICAgcHNpeiAtICh2cC0+dTIuZmllbGQgLSBzbGVuKSwKKwkJCSAgICAiJS4qcyIsIHNsZW4sIHMpOworCQl9IGVsc2UgeworCQkJLyogc3RyaXAgbGVhZGluZyBzcGFjZXMvemVyb3MgKi8KKwkJCXdoaWxlIChrc2hfaXNzcGFjZSgqcykpCisJCQkJcysrOworCQkJaWYgKHZwLT5mbGFnICYgWkVST0ZJTCkKKwkJCQl3aGlsZSAoKnMgPT0gJzAnKQorCQkJCQlzKys7CisJCQlzaGZfc25wcmludGYocCwgbmxlbiArIDEsICIlLSouKnMiLAorCQkJCXZwLT51Mi5maWVsZCwgdnAtPnUyLmZpZWxkLCBzKTsKKwkJfQorCX0gZWxzZQorCQltZW1jcHkocCwgcywgc3RybGVuKHMpICsgMSk7CisKKwlpZiAodnAtPmZsYWcgJiBVQ0FTRVZfQUwpIHsKKwkJZm9yIChxID0gcDsgKnE7IHErKykKKwkJCSpxID0ga3NoX3RvdXBwZXIoKnEpOworCX0gZWxzZSBpZiAodnAtPmZsYWcgJiBMQ0FTRVYpIHsKKwkJZm9yIChxID0gcDsgKnE7IHErKykKKwkJCSpxID0ga3NoX3RvbG93ZXIoKnEpOworCX0KKworCXJldHVybiAocCk7Cit9CisKKy8qCisgKiBtYWtlIHZwLT52YWwucyBiZSAibmFtZT12YWx1ZSIgZm9yIHF1aWNrIGV4cG9ydGluZy4KKyAqLworc3RhdGljIHZvaWQKK2V4cG9ydHByZXAoc3RydWN0IHRibCAqdnAsIGNvbnN0IGNoYXIgKnZhbCkKK3sKKwljaGFyICp4cDsKKwljaGFyICpvcCA9ICh2cC0+ZmxhZyZBTExPQykgPyB2cC0+dmFsLnMgOiBOVUxMOworCWludCBuYW1lbGVuID0gc3RybGVuKHZwLT5uYW1lKTsKKwlpbnQgdmFsbGVuID0gc3RybGVuKHZhbCkgKyAxOworCisJdnAtPmZsYWcgfD0gQUxMT0M7CisJeHAgPSBhbGxvYyhuYW1lbGVuICsgMSArIHZhbGxlbiwgdnAtPmFyZWFwKTsKKwltZW1jcHkodnAtPnZhbC5zID0geHAsIHZwLT5uYW1lLCBuYW1lbGVuKTsKKwl4cCArPSBuYW1lbGVuOworCSp4cCsrID0gJz0nOworCXZwLT50eXBlID0geHAgLSB2cC0+dmFsLnM7IC8qIG9mZnNldCB0byB2YWx1ZSAqLworCW1lbWNweSh4cCwgdmFsLCB2YWxsZW4pOworCWlmIChvcCAhPSBOVUxMKQorCQlhZnJlZShvcCwgdnAtPmFyZWFwKTsKK30KKworLyoKKyAqIGxvb2t1cCB2YXJpYWJsZSAoYWNjb3JkaW5nIHRvIChzZXQmTE9DQUwpKSwKKyAqIHNldCBpdHMgYXR0cmlidXRlcyAoSU5URUdFUiwgUkRPTkxZLCBFWFBPUlQsIFRSQUNFLCBMSlVTVCwgUkpVU1QsIFpFUk9GSUwsCisgKiBMQ0FTRVYsIFVDQVNFVl9BTCksIGFuZCBvcHRpb25hbGx5IHNldCBpdHMgdmFsdWUgaWYgYW4gYXNzaWdubWVudC4KKyAqLworc3RydWN0IHRibCAqCit0eXBlc2V0KGNvbnN0IGNoYXIgKnZhciwgVGZsYWcgc2V0LCBUZmxhZyBjbHIsIGludCBmaWVsZCwgaW50IGJhc2UpCit7CisJc3RydWN0IHRibCAqdnA7CisJc3RydWN0IHRibCAqdnBiYXNlLCAqdDsKKwljaGFyICp0dmFyOworCWNvbnN0IGNoYXIgKnZhbDsKKwlpbnQgbGVuOworCisJLyogY2hlY2sgZm9yIHZhbGlkIHZhcmlhYmxlIG5hbWUsIHNlYXJjaCBmb3IgdmFsdWUgKi8KKwl2YWwgPSBza2lwX3Zhcm5hbWUodmFyLCBmYWxzZSk7CisJaWYgKHZhbCA9PSB2YXIpCisJCXJldHVybiAoTlVMTCk7CisJbWtzc2VydCh2YXIgIT0gTlVMTCk7CisJbWtzc2VydCgqdmFyICE9IDApOworCWlmICgqdmFsID09ICdbJykgeworCQlpZiAoc2V0X3JlZmZsYWcpCisJCQllcnJvcmYoIiVzOiByZWZlcmVuY2UgdmFyaWFibGUgY2Fubm90IGJlIGFuIGFycmF5IiwKKwkJCSAgICB2YXIpOworCQlsZW4gPSBhcnJheV9yZWZfbGVuKHZhbCk7CisJCWlmIChsZW4gPT0gMCkKKwkJCXJldHVybiAoTlVMTCk7CisJCS8qIElNUE9SVCBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgc2hlbGwgc3RhcnRzIHVwIGFuZCBpcworCQkgKiBzZXR0aW5nIHVwIGl0cyBlbnZpcm9ubWVudC4gQWxsb3cgb25seSBzaW1wbGUgYXJyYXkKKwkJICogcmVmZXJlbmNlcyBhdCB0aGlzIHRpbWUgc2luY2UgcGFyYW1ldGVyL2NvbW1hbmQgc3Vic3RpdHV0aW9uCisJCSAqIGlzIHByZWZvcm1lZCBvbiB0aGUgW2V4cHJlc3Npb25dIHdoaWNoIHdvdWxkIGJlIGEgbWFqb3IKKwkJICogc2VjdXJpdHkgaG9sZS4KKwkJICovCisJCWlmIChzZXQgJiBJTVBPUlQpIHsKKwkJCWludCBpOworCQkJZm9yIChpID0gMTsgaSA8IGxlbiAtIDE7IGkrKykKKwkJCQlpZiAoIWtzaF9pc2RpZ2l0KHZhbFtpXSkpCisJCQkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJdmFsICs9IGxlbjsKKwl9CisJaWYgKCp2YWwgPT0gJz0nKQorCQlzdHJuZHVweCh0dmFyLCB2YXIsIHZhbCsrIC0gdmFyLCBBVEVNUCk7CisJZWxzZSB7CisJCS8qIEltcG9ydGluZyBmcm9tIG9yaWdpbmFsIGVudmlyb25tZW50OiBtdXN0IGhhdmUgYW4gPSAqLworCQlpZiAoc2V0ICYgSU1QT1JUKQorCQkJcmV0dXJuIChOVUxMKTsKKwkJc3RyZHVweCh0dmFyLCB2YXIsIEFURU1QKTsKKwkJdmFsID0gTlVMTDsKKwkJLyogaGFuZGxlIGZvb1sqXSDih5IgZm9vICh3aG9sZSBhcnJheSkgbWFwcGluZyBmb3IgUjM5YiAqLworCQlsZW4gPSBzdHJsZW4odHZhcik7CisJCWlmIChsZW4gPiAzICYmIHR2YXJbbGVuLTNdID09ICdbJyAmJiB0dmFyW2xlbi0yXSA9PSAnKicgJiYKKwkJICAgIHR2YXJbbGVuLTFdID09ICddJykKKwkJCXR2YXJbbGVuLTNdID0gJ1wwJzsKKwl9CisKKwkvKiBQcmV2ZW50IHR5cGVzZXQgZnJvbSBjcmVhdGluZyBhIGxvY2FsIFBBVEgvRU5WL1NIRUxMICovCisJaWYgKEZsYWcoRlJFU1RSSUNURUQpICYmIChzdHJjbXAodHZhciwgIlBBVEgiKSA9PSAwIHx8CisJICAgIHN0cmNtcCh0dmFyLCAiRU5WIikgPT0gMCB8fCBzdHJjbXAodHZhciwgIlNIRUxMIikgPT0gMCkpCisJCWVycm9yZigiJXM6IHJlc3RyaWN0ZWQiLCB0dmFyKTsKKworCXZwID0gKHNldCZMT0NBTCkgPyBsb2NhbCh0dmFyLCAoc2V0ICYgTE9DQUxfQ09QWSkgPyB0cnVlIDogZmFsc2UpIDoKKwkgICAgZ2xvYmFsKHR2YXIpOworCWlmIChzZXRfcmVmZmxhZyA9PSAyICYmICh2cC0+ZmxhZyAmIChBUlJBWXxBU1NPQykpID09IEFTU09DKQorCQl2cC0+ZmxhZyAmPSB+QVNTT0M7CisJZWxzZSBpZiAoc2V0X3JlZmZsYWcgPT0gMSkgeworCQlpZiAodnAtPmZsYWcgJiBBUlJBWSkgeworCQkJc3RydWN0IHRibCAqYSwgKnRtcDsKKworCQkJLyogRnJlZSB1cCBlbnRpcmUgYXJyYXkgKi8KKwkJCWZvciAoYSA9IHZwLT51LmFycmF5OyBhOyApIHsKKwkJCQl0bXAgPSBhOworCQkJCWEgPSBhLT51LmFycmF5OworCQkJCWlmICh0bXAtPmZsYWcgJiBBTExPQykKKwkJCQkJYWZyZWUodG1wLT52YWwucywgdG1wLT5hcmVhcCk7CisJCQkJYWZyZWUodG1wLCB0bXAtPmFyZWFwKTsKKwkJCX0KKwkJCXZwLT51LmFycmF5ID0gTlVMTDsKKwkJCXZwLT5mbGFnICY9IH5BUlJBWTsKKwkJfQorCQl2cC0+ZmxhZyB8PSBBU1NPQzsKKwl9CisKKwlzZXQgJj0gfihMT0NBTHxMT0NBTF9DT1BZKTsKKworCXZwYmFzZSA9ICh2cC0+ZmxhZyAmIEFSUkFZKSA/IGdsb2JhbChhcnJheW5hbWUodmFyKSkgOiB2cDsKKworCS8qIG9ubHkgYWxsb3cgZXhwb3J0IGZsYWcgdG8gYmUgc2V0LiBBVCZUIGtzaCBhbGxvd3MgYW55IGF0dHJpYnV0ZSB0bworCSAqIGJlIGNoYW5nZWQgd2hpY2ggbWVhbnMgaXQgY2FuIGJlIHRydW5jYXRlZCBvciBtb2RpZmllZCAoLUwvLVIvLVovLWkpCisJICovCisJaWYgKCh2cGJhc2UtPmZsYWcmUkRPTkxZKSAmJgorCSAgICAodmFsIHx8IGNsciB8fCAoc2V0ICYgfkVYUE9SVCkpKQorCQkvKiBYWFggY2hlY2sgY2FsbHMgLSBpcyBlcnJvciBoZXJlIG9rIGJ5IFBPU0lYPyAqLworCQllcnJvcmYoIiVzOiBpcyByZWFkIG9ubHkiLCB0dmFyKTsKKwlhZnJlZSh0dmFyLCBBVEVNUCk7CisKKwkvKiBtb3N0IGNhbGxzIGFyZSB3aXRoIHNldC9jbHIgPT0gMCAqLworCWlmIChzZXQgfCBjbHIpIHsKKwkJYm9vbCBvayA9IHRydWU7CisKKwkJLyogWFhYIGlmIHhbMF0gaXNuJ3Qgc2V0LCB0aGVyZSB3aWxsIGJlIHByb2JsZW1zOiBuZWVkIHRvIGhhdmUKKwkJICogb25lIGNvcHkgb2YgYXR0cmlidXRlcyBmb3IgYXJyYXlzLi4uCisJCSAqLworCQlmb3IgKHQgPSB2cGJhc2U7IHQ7IHQgPSB0LT51LmFycmF5KSB7CisJCQlib29sIGZha2VfYXNzaWduOworCQkJY2hhciAqcyA9IE5VTEw7CisJCQljaGFyICpmcmVlX21lID0gTlVMTDsKKworCQkJZmFrZV9hc3NpZ24gPSAodC0+ZmxhZyAmIElTU0VUKSAmJiAoIXZhbCB8fCB0ICE9IHZwKSAmJgorCQkJICAgICgoc2V0ICYgKFVDQVNFVl9BTHxMQ0FTRVZ8TEpVU1R8UkpVU1R8WkVST0ZJTCkpIHx8CisJCQkgICAgKCh0LT5mbGFnICYgSU5URUdFUikgJiYgKGNsciAmIElOVEVHRVIpKSB8fAorCQkJICAgICghKHQtPmZsYWcgJiBJTlRFR0VSKSAmJiAoc2V0ICYgSU5URUdFUikpKTsKKwkJCWlmIChmYWtlX2Fzc2lnbikgeworCQkJCWlmICh0LT5mbGFnICYgSU5URUdFUikgeworCQkJCQlzID0gc3RyX3ZhbCh0KTsKKwkJCQkJZnJlZV9tZSA9IE5VTEw7CisJCQkJfSBlbHNlIHsKKwkJCQkJcyA9IHQtPnZhbC5zICsgdC0+dHlwZTsKKwkJCQkJZnJlZV9tZSA9ICh0LT5mbGFnICYgQUxMT0MpID8gdC0+dmFsLnMgOgorCQkJCQkgICAgTlVMTDsKKwkJCQl9CisJCQkJdC0+ZmxhZyAmPSB+QUxMT0M7CisJCQl9CisJCQlpZiAoISh0LT5mbGFnICYgSU5URUdFUikgJiYgKHNldCAmIElOVEVHRVIpKSB7CisJCQkJdC0+dHlwZSA9IDA7CisJCQkJdC0+ZmxhZyAmPSB+QUxMT0M7CisJCQl9CisJCQl0LT5mbGFnID0gKHQtPmZsYWcgfCBzZXQpICYgfmNscjsKKwkJCS8qIERvbid0IGNoYW5nZSBiYXNlIGlmIGFzc2lnbm1lbnQgaXMgdG8gYmUgZG9uZSwKKwkJCSAqIGluIGNhc2UgYXNzaWdubWVudCBmYWlscy4KKwkJCSAqLworCQkJaWYgKChzZXQgJiBJTlRFR0VSKSAmJiBiYXNlID4gMCAmJiAoIXZhbCB8fCB0ICE9IHZwKSkKKwkJCQl0LT50eXBlID0gYmFzZTsKKwkJCWlmIChzZXQgJiAoTEpVU1R8UkpVU1R8WkVST0ZJTCkpCisJCQkJdC0+dTIuZmllbGQgPSBmaWVsZDsKKwkJCWlmIChmYWtlX2Fzc2lnbikgeworCQkJCWlmICghc2V0c3RyKHQsIHMsIEtTSF9SRVRVUk5fRVJST1IpKSB7CisJCQkJCS8qIFNvbWV3aGF0IGFyYml0cmFyeSBhY3Rpb24gaGVyZToKKwkJCQkJICogemFwIGNvbnRlbnRzIG9mIHZhcmlhYmxlLCBidXQga2VlcAorCQkJCQkgKiB0aGUgZmxhZyBzZXR0aW5ncy4KKwkJCQkJICovCisJCQkJCW9rID0gZmFsc2U7CisJCQkJCWlmICh0LT5mbGFnICYgSU5URUdFUikKKwkJCQkJCXQtPmZsYWcgJj0gfklTU0VUOworCQkJCQllbHNlIHsKKwkJCQkJCWlmICh0LT5mbGFnICYgQUxMT0MpCisJCQkJCQkJYWZyZWUodC0+dmFsLnMsIHQtPmFyZWFwKTsKKwkJCQkJCXQtPmZsYWcgJj0gfihJU1NFVHxBTExPQyk7CisJCQkJCQl0LT50eXBlID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoZnJlZV9tZSkKKwkJCQkJYWZyZWUoZnJlZV9tZSwgdC0+YXJlYXApOworCQkJfQorCQl9CisJCWlmICghb2spCisJCQllcnJvcmZ6KCk7CisJfQorCisJaWYgKHZhbCAhPSBOVUxMKSB7CisJCWlmICh2cC0+ZmxhZyZJTlRFR0VSKSB7CisJCQkvKiBkbyBub3QgemVybyBiYXNlIGJlZm9yZSBhc3NpZ25tZW50ICovCisJCQlzZXRzdHIodnAsIHZhbCwgS1NIX1VOV0lORF9FUlJPUiB8IDB4NCk7CisJCQkvKiBEb25lIGFmdGVyIGFzc2lnbm1lbnQgdG8gb3ZlcnJpZGUgZGVmYXVsdCAqLworCQkJaWYgKGJhc2UgPiAwKQorCQkJCXZwLT50eXBlID0gYmFzZTsKKwkJfSBlbHNlCisJCQkvKiBzZXRzdHIgY2FuJ3QgZmFpbCAocmVhZG9ubHkgY2hlY2sgYWxyZWFkeSBkb25lKSAqLworCQkJc2V0c3RyKHZwLCB2YWwsIEtTSF9SRVRVUk5fRVJST1IgfCAweDQpOworCX0KKworCS8qIG9ubHkgeFswXSBpcyBldmVyIGV4cG9ydGVkLCBzbyB1c2UgdnBiYXNlICovCisJaWYgKCh2cGJhc2UtPmZsYWcmRVhQT1JUKSAmJiAhKHZwYmFzZS0+ZmxhZyZJTlRFR0VSKSAmJgorCSAgICB2cGJhc2UtPnR5cGUgPT0gMCkKKwkJZXhwb3J0cHJlcCh2cGJhc2UsICh2cGJhc2UtPmZsYWcmSVNTRVQpID8gdnBiYXNlLT52YWwucyA6IG51bGwpOworCisJcmV0dXJuICh2cCk7Cit9CisKKy8qKgorICogVW5zZXQgYSB2YXJpYWJsZS4gVGhlIGZsYWdzIGNhbiBiZToKKyAqIHwxCT0gdGVhciBkb3duIGVudGlyZSBhcnJheQorICogfDIJPSBrZWVwIGF0dHJpYnV0ZXMsIG9ubHkgdW5zZXQgY29udGVudAorICovCit2b2lkCit1bnNldChzdHJ1Y3QgdGJsICp2cCwgaW50IGZsYWdzKQoreworCWlmICh2cC0+ZmxhZyAmIEFMTE9DKQorCQlhZnJlZSh2cC0+dmFsLnMsIHZwLT5hcmVhcCk7CisJaWYgKCh2cC0+ZmxhZyAmIEFSUkFZKSAmJiAoZmxhZ3MgJiAxKSkgeworCQlzdHJ1Y3QgdGJsICphLCAqdG1wOworCisJCS8qIEZyZWUgdXAgZW50aXJlIGFycmF5ICovCisJCWZvciAoYSA9IHZwLT51LmFycmF5OyBhOyApIHsKKwkJCXRtcCA9IGE7CisJCQlhID0gYS0+dS5hcnJheTsKKwkJCWlmICh0bXAtPmZsYWcgJiBBTExPQykKKwkJCQlhZnJlZSh0bXAtPnZhbC5zLCB0bXAtPmFyZWFwKTsKKwkJCWFmcmVlKHRtcCwgdG1wLT5hcmVhcCk7CisJCX0KKwkJdnAtPnUuYXJyYXkgPSBOVUxMOworCX0KKwlpZiAoZmxhZ3MgJiAyKSB7CisJCXZwLT5mbGFnICY9IH4oQUxMT0N8SVNTRVQpOworCQlyZXR1cm47CisJfQorCS8qIElmIGZvb1swXSBpcyBiZWluZyB1bnNldCwgdGhlIHJlbWFpbmRlciBvZiB0aGUgYXJyYXkgaXMga2VwdC4uLiAqLworCXZwLT5mbGFnICY9IFNQRUNJQUwgfCAoKGZsYWdzICYgMSkgPyAwIDogQVJSQVl8REVGSU5FRCk7CisJaWYgKHZwLT5mbGFnICYgU1BFQ0lBTCkKKwkJdW5zZXRzcGVjKHZwKTsJLyogcmVzcG9uc2libGUgZm9yICd1bnNwZWNpYWwnaW5nIHZhciAqLworfQorCisvKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyIHBhc3QgYSBsZWdhbCB2YXJpYWJsZSBuYW1lIChyZXR1cm5zIHRoZQorICogYXJndW1lbnQgaWYgdGhlcmUgaXMgbm8gbGVnYWwgbmFtZSwgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHRlcm1pbmF0aW5nCisgKiBOVUwgaWYgd2hvbGUgc3RyaW5nIGlzIGxlZ2FsKS4KKyAqLworY29uc3QgY2hhciAqCitza2lwX3Zhcm5hbWUoY29uc3QgY2hhciAqcywgaW50IGFvaykKK3sKKwlpbnQgYWxlbjsKKworCWlmIChzICYmIGtzaF9pc2FscGh4KCpzKSkgeworCQl3aGlsZSAoKisrcyAmJiBrc2hfaXNhbG51eCgqcykpCisJCQk7CisJCWlmIChhb2sgJiYgKnMgPT0gJ1snICYmIChhbGVuID0gYXJyYXlfcmVmX2xlbihzKSkpCisJCQlzICs9IGFsZW47CisJfQorCXJldHVybiAocyk7Cit9CisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBwYXN0IGFueSBsZWdhbCB2YXJpYWJsZSBuYW1lICovCitjb25zdCBjaGFyICoKK3NraXBfd2R2YXJuYW1lKGNvbnN0IGNoYXIgKnMsCisgICAgaW50IGFvaykJCQkJLyogc2tpcCBhcnJheSBkZS1yZWZlcmVuY2U/ICovCit7CisJaWYgKHNbMF0gPT0gQ0hBUiAmJiBrc2hfaXNhbHBoeChzWzFdKSkgeworCQlkbyB7CisJCQlzICs9IDI7CisJCX0gd2hpbGUgKHNbMF0gPT0gQ0hBUiAmJiBrc2hfaXNhbG51eChzWzFdKSk7CisJCWlmIChhb2sgJiYgc1swXSA9PSBDSEFSICYmIHNbMV0gPT0gJ1snKSB7CisJCQkvKiBza2lwIHBvc3NpYmxlIGFycmF5IGRlLXJlZmVyZW5jZSAqLworCQkJY29uc3QgY2hhciAqcCA9IHM7CisJCQljaGFyIGM7CisJCQlpbnQgZGVwdGggPSAwOworCisJCQl3aGlsZSAoMSkgeworCQkJCWlmIChwWzBdICE9IENIQVIpCisJCQkJCWJyZWFrOworCQkJCWMgPSBwWzFdOworCQkJCXAgKz0gMjsKKwkJCQlpZiAoYyA9PSAnWycpCisJCQkJCWRlcHRoKys7CisJCQkJZWxzZSBpZiAoYyA9PSAnXScgJiYgLS1kZXB0aCA9PSAwKSB7CisJCQkJCXMgPSBwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIChzKTsKK30KKworLyogQ2hlY2sgaWYgY29kZWQgc3RyaW5nIHMgaXMgYSB2YXJpYWJsZSBuYW1lICovCitpbnQKK2lzX3dkdmFybmFtZShjb25zdCBjaGFyICpzLCBpbnQgYW9rKQoreworCWNvbnN0IGNoYXIgKnAgPSBza2lwX3dkdmFybmFtZShzLCBhb2spOworCisJcmV0dXJuIChwICE9IHMgJiYgcFswXSA9PSBFT1MpOworfQorCisvKiBDaGVjayBpZiBjb2RlZCBzdHJpbmcgcyBpcyBhIHZhcmlhYmxlIGFzc2lnbm1lbnQgKi8KK2ludAoraXNfd2R2YXJhc3NpZ24oY29uc3QgY2hhciAqcykKK3sKKwljb25zdCBjaGFyICpwID0gc2tpcF93ZHZhcm5hbWUocywgdHJ1ZSk7CisKKwlyZXR1cm4gKHAgIT0gcyAmJiBwWzBdID09IENIQVIgJiYgcFsxXSA9PSAnPScpOworfQorCisvKgorICogTWFrZSB0aGUgZXhwb3J0ZWQgZW52aXJvbm1lbnQgZnJvbSB0aGUgZXhwb3J0ZWQgbmFtZXMgaW4gdGhlIGRpY3Rpb25hcnkuCisgKi8KK2NoYXIgKioKK21ha2Vudih2b2lkKQoreworCXN0cnVjdCBibG9jayAqbDsKKwlYUHRyViBkZW52OworCXN0cnVjdCB0YmwgKnZwLCAqKnZwcDsKKwlpbnQgaTsKKworCVhQaW5pdChkZW52LCA2NCk7CisJZm9yIChsID0gZS0+bG9jOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQorCQlmb3IgKHZwcCA9IGwtPnZhcnMudGJscywgaSA9IGwtPnZhcnMuc2l6ZTsgLS1pID49IDA7ICkKKwkJCWlmICgodnAgPSAqdnBwKyspICE9IE5VTEwgJiYKKwkJCSAgICAodnAtPmZsYWcmKElTU0VUfEVYUE9SVCkpID09IChJU1NFVHxFWFBPUlQpKSB7CisJCQkJc3RydWN0IGJsb2NrICpsMjsKKwkJCQlzdHJ1Y3QgdGJsICp2cDI7CisJCQkJdWludDMyX3QgaCA9IGhhc2godnAtPm5hbWUpOworCisJCQkJLyogdW5leHBvcnQgYW55IHJlZGVmaW5lZCBpbnN0YW5jZXMgKi8KKwkJCQlmb3IgKGwyID0gbC0+bmV4dDsgbDIgIT0gTlVMTDsgbDIgPSBsMi0+bmV4dCkgeworCQkJCQl2cDIgPSBrdHNlYXJjaCgmbDItPnZhcnMsIHZwLT5uYW1lLCBoKTsKKwkJCQkJaWYgKHZwMiAhPSBOVUxMKQorCQkJCQkJdnAyLT5mbGFnICY9IH5FWFBPUlQ7CisJCQkJfQorCQkJCWlmICgodnAtPmZsYWcmSU5URUdFUikpIHsKKwkJCQkJLyogaW50ZWdlciB0byBzdHJpbmcgKi8KKwkJCQkJY2hhciAqdmFsOworCQkJCQl2YWwgPSBzdHJfdmFsKHZwKTsKKwkJCQkJdnAtPmZsYWcgJj0gfihJTlRFR0VSfFJET05MWXxTUEVDSUFMKTsKKwkJCQkJLyogc2V0c3RyIGNhbid0IGZhaWwgaGVyZSAqLworCQkJCQlzZXRzdHIodnAsIHZhbCwgS1NIX1JFVFVSTl9FUlJPUik7CisJCQkJfQorCQkJCVhQcHV0KGRlbnYsIHZwLT52YWwucyk7CisJCQl9CisJWFBwdXQoZGVudiwgTlVMTCk7CisJcmV0dXJuICgoY2hhciAqKilYUGNsb3NlKGRlbnYpKTsKK30KKworLyogQm9iIEplbmtpbnMnIG9uZS1hdC1hLXRpbWUgaGFzaCAqLworc3RhdGljIHVpbnQzMl90CitvYWF0aGFzaF91cGRhdGUocmVnaXN0ZXIgdWludDMyX3QgaCwgcmVnaXN0ZXIgY29uc3QgdWludDhfdCAqY3AsCisgICAgcmVnaXN0ZXIgc2l6ZV90IG4pCit7CisJd2hpbGUgKG4tLSkgeworCQloICs9ICpjcCsrOworCQloICs9IGggPDwgMTA7CisJCWggXj0gaCA+PiA2OworCX0KKworCXJldHVybiAoaCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdAorb2FhdGhhc2hfZmluYWxpc2UocmVnaXN0ZXIgdWludDMyX3QgaCkKK3sKKwloICs9IGggPDwgMzsKKwloIF49IGggPj4gMTE7CisJaCArPSBoIDw8IDE1OworCisJcmV0dXJuIChoKTsKK30KKwordWludDMyX3QKK29hYXRoYXNoX2Z1bGwocmVnaXN0ZXIgY29uc3QgdWludDhfdCAqYnApCit7CisJcmVnaXN0ZXIgdWludDMyX3QgaCA9IDA7CisJcmVnaXN0ZXIgdWludDhfdCBjOworCisJd2hpbGUgKChjID0gKmJwKyspKSB7CisJCWggKz0gYzsKKwkJaCArPSBoIDw8IDEwOworCQloIF49IGggPj4gNjsKKwl9CisKKwlyZXR1cm4gKG9hYXRoYXNoX2ZpbmFsaXNlKGgpKTsKK30KKwordm9pZAorY2hhbmdlX3JhbmRvbShjb25zdCB2b2lkICp2cCwgc2l6ZV90IG4pCit7CisJcmVnaXN0ZXIgdWludDMyX3QgaCA9IDB4MTAwOworI2lmIGRlZmluZWQoX19PcGVuQlNEX18pCisJaW50IG1pYlsyXTsKKwl1aW50OF90IGtbM107CisJc2l6ZV90IGtsZW47CisjZW5kaWYKKworCWtzaHN0YXRlX3YuY3JfZHAgPSB2cDsKKwlrc2hzdGF0ZV92LmNyX2RzeiA9IG47CisJZ2V0dGltZW9mZGF5KCZrc2hzdGF0ZV92LmNyX3R2LCBOVUxMKTsKKwloID0gb2FhdGhhc2hfdXBkYXRlKG9hYXRoYXNoX3VwZGF0ZShoLCAodm9pZCAqKSZrc2hzdGF0ZV92LAorCSAgICBzaXplb2Yoa3Noc3RhdGVfdikpLCB2cCwgbik7CisJa3Noc3RhdGVfdi5sY2dfc3RhdGVfID0gb2FhdGhhc2hfZmluYWxpc2UoaCk7CisKKyNpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQorCS8qIE9wZW5CU0QsIE1pckJTRDogcHJvcGVyIGtlcm5lbCBlbnRyb3B5IGNvbWVzIGF0IHplcm8gY29zdCAqLworCisJbWliWzBdID0gQ1RMX0tFUk47CisJbWliWzFdID0gS0VSTl9BUk5EOworCWtsZW4gPSBzaXplb2Yoayk7CisJc3lzY3RsKG1pYiwgMiwgaywgJmtsZW4sICZrc2hzdGF0ZV92LmxjZ19zdGF0ZV8sCisJICAgIHNpemVvZihrc2hzdGF0ZV92LmxjZ19zdGF0ZV8pKTsKKwkvKiB3ZSBpZ25vcmUgZmFpbHVyZXMgYW5kIHRha2UgaW4gayBhbnl3YXkgKi8KKwloID0gb2FhdGhhc2hfdXBkYXRlKGgsIGssIHNpemVvZihrKSk7CisJa3Noc3RhdGVfdi5sY2dfc3RhdGVfID0gb2FhdGhhc2hfZmluYWxpc2UoaCk7CisjZWxpZiBkZWZpbmVkKE1LU0hfQTRQQikKKwkvKiBmb3JjZWQgYnkgdGhlIHVzZXIgdG8gdXNlIGFyYzRyYW5kb21fcHVzaGIoMykg4oCiIEN5Z3dpbj8gKi8KKwl7CisJCXVpbnQzMl90IHBydjsKKworCQlwcnYgPSBhcmM0cmFuZG9tX3B1c2hiKCZrc2hzdGF0ZV92LmxjZ19zdGF0ZV8sCisJCSAgICBzaXplb2Yoa3Noc3RhdGVfdi5sY2dfc3RhdGVfKSk7CisJCWggPSBvYWF0aGFzaF91cGRhdGUoaCwgJnBydiwgc2l6ZW9mKHBydikpOworCX0KKwlrc2hzdGF0ZV92LmxjZ19zdGF0ZV8gPSBvYWF0aGFzaF9maW5hbGlzZShoKTsKKyNlbmRpZgorfQorCisvKgorICogaGFuZGxlIHNwZWNpYWwgdmFyaWFibGVzIHdpdGggc2lkZSBlZmZlY3RzIC0gUEFUSCwgU0VDT05EUy4KKyAqLworCisvKiBUZXN0IGlmIG5hbWUgaXMgYSBzcGVjaWFsIHBhcmFtZXRlciAqLworc3RhdGljIGludAorc3BlY2lhbChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB0YmwgKnRwOworCisJdHAgPSBrdHNlYXJjaCgmc3BlY2lhbHMsIG5hbWUsIGhhc2gobmFtZSkpOworCXJldHVybiAodHAgJiYgKHRwLT5mbGFnICYgSVNTRVQpID8gdHAtPnR5cGUgOiBWX05PTkUpOworfQorCisvKiBNYWtlIGEgdmFyaWFibGUgbm9uLXNwZWNpYWwgKi8KK3N0YXRpYyB2b2lkCit1bnNwZWNpYWwoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdGJsICp0cDsKKworCXRwID0ga3RzZWFyY2goJnNwZWNpYWxzLCBuYW1lLCBoYXNoKG5hbWUpKTsKKwlpZiAodHApCisJCWt0ZGVsZXRlKHRwKTsKK30KKworc3RhdGljIHRpbWVfdCBzZWNvbmRzOwkJLyogdGltZSBTRUNPTkRTIGxhc3Qgc2V0ICovCitzdGF0aWMgaW50IHVzZXJfbGluZW5vOwkJLyogd2hhdCB1c2VyIHNldCAkTElORU5PIHRvICovCisKK3N0YXRpYyB2b2lkCitnZXRzcGVjKHN0cnVjdCB0YmwgKnZwKQoreworCXJlZ2lzdGVyIG1rc2hfYXJpX3QgaTsKKwlpbnQgc3Q7CisKKwlzd2l0Y2ggKChzdCA9IHNwZWNpYWwodnAtPm5hbWUpKSkgeworCWNhc2UgVl9TRUNPTkRTOgorCQkvKgorCQkgKiBPbiBzdGFydCB1cCB0aGUgdmFsdWUgb2YgU0VDT05EUyBpcyB1c2VkIGJlZm9yZQorCQkgKiBpdCBoYXMgYmVlbiBzZXQgLSBkb24ndCBkbyBhbnl0aGluZyBpbiB0aGlzIGNhc2UKKwkJICogKHNlZSBpbml0Y29tc1tdIGluIG1haW4uYykuCisJCSAqLworCQlpZiAodnAtPmZsYWcgJiBJU1NFVCkgeworCQkJc3RydWN0IHRpbWV2YWwgdHY7CisKKwkJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCQkJaSA9IHR2LnR2X3NlYyAtIHNlY29uZHM7CisJCX0gZWxzZQorCQkJcmV0dXJuOworCQlicmVhazsKKwljYXNlIFZfUkFORE9NOgorCQkvKgorCQkgKiB0aGlzIGlzIHRoZSBzYW1lIExpbmVhciBDb25ncnVlbnRpYWwgUFJORyBhcyBCb3JsYW5kCisJCSAqIEMvQysrIGFsbGVnZWRseSB1c2VzIGluIGl0cyBidWlsdC1pbiByYW5kKCkgZnVuY3Rpb24KKwkJICovCisJCWkgPSAoKGtzaHN0YXRlX3YubGNnX3N0YXRlXyA9CisJCSAgICAyMjY5NTQ3NyAqIGtzaHN0YXRlX3YubGNnX3N0YXRlXyArIDEpID4+IDE2KSAmIDB4N0ZGRjsKKwkJYnJlYWs7CisJY2FzZSBWX0hJU1RTSVpFOgorCQlpID0gaGlzdHNpemU7CisJCWJyZWFrOworCWNhc2UgVl9PUFRJTkQ6CisJCWkgPSB1c2VyX29wdC51b3B0aW5kOworCQlicmVhazsKKwljYXNlIFZfTElORU5POgorCQlpID0gY3VycmVudF9saW5lbm8gKyB1c2VyX2xpbmVubzsKKwkJYnJlYWs7CisJY2FzZSBWX0NPTFVNTlM6CisJY2FzZSBWX0xJTkVTOgorCQkvKgorCQkgKiBEbyBOT1QgZXhwb3J0IENPTFVNTlMvTElORVMuIE1hbnkgYXBwbGljYXRpb25zCisJCSAqIGNoZWNrIENPTFVNTlMvTElORVMgYmVmb3JlIGNoZWNraW5nIHdzLndzX2NvbC9yb3csCisJCSAqIHNvIGlmIHRoZSBhcHAgaXMgc3RhcnRlZCB3aXRoIEMvTCBpbiB0aGUgZW52aXJvbgorCQkgKiBhbmQgdGhlIHdpbmRvdyBpcyB0aGVuIHJlc2l6ZWQsIHRoZSBhcHAgd29uJ3QKKwkJICogc2VlIHRoZSBjaGFuZ2UgY2F1c2UgdGhlIGVudmlyb24gZG9lc24ndCBjaGFuZ2UuCisJCSAqLworCQljaGFuZ2Vfd2luc3ooKTsKKwkJaSA9IHN0ID09IFZfQ09MVU1OUyA/IHhfY29scyA6IHhfbGluczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogZG8gbm90aGluZywgZG8gbm90IHRvdWNoIHZwIGF0IGFsbCAqLworCQlyZXR1cm47CisJfQorCXZwLT5mbGFnICY9IH5TUEVDSUFMOworCXNldGludCh2cCwgaSk7CisJdnAtPmZsYWcgfD0gU1BFQ0lBTDsKK30KKworc3RhdGljIHZvaWQKK3NldHNwZWMoc3RydWN0IHRibCAqdnApCit7CisJbWtzaF9hcmlfdCBpOworCWNoYXIgKnM7CisJaW50IHN0OworCisJc3dpdGNoICgoc3QgPSBzcGVjaWFsKHZwLT5uYW1lKSkpIHsKKwljYXNlIFZfUEFUSDoKKwkJaWYgKHBhdGgpCisJCQlhZnJlZShwYXRoLCBBUEVSTSk7CisJCXMgPSBzdHJfdmFsKHZwKTsKKwkJc3RyZHVweChwYXRoLCBzLCBBUEVSTSk7CisJCWZsdXNoY29tKDEpOwkvKiBjbGVhciB0cmFja2VkIGFsaWFzZXMgKi8KKwkJcmV0dXJuOworCWNhc2UgVl9JRlM6CisJCXNldGN0eXBlcyhzID0gc3RyX3ZhbCh2cCksIENfSUZTKTsKKwkJaWZzMCA9ICpzOworCQlyZXR1cm47CisJY2FzZSBWX1RNUERJUjoKKwkJaWYgKHRtcGRpcikgeworCQkJYWZyZWUodG1wZGlyLCBBUEVSTSk7CisJCQl0bXBkaXIgPSBOVUxMOworCQl9CisJCS8qIFVzZSB0bXBkaXIgaWZmIGl0IGlzIGFuIGFic29sdXRlIHBhdGgsIGlzIHdyaXRhYmxlIGFuZAorCQkgKiBzZWFyY2hhYmxlIGFuZCBpcyBhIGRpcmVjdG9yeS4uLgorCQkgKi8KKwkJeworCQkJc3RydWN0IHN0YXQgc3RhdGI7CisKKwkJCXMgPSBzdHJfdmFsKHZwKTsKKwkJCWlmIChzWzBdID09ICcvJyAmJiBhY2Nlc3MocywgV19PS3xYX09LKSA9PSAwICYmCisJCQkgICAgc3RhdChzLCAmc3RhdGIpID09IDAgJiYgU19JU0RJUihzdGF0Yi5zdF9tb2RlKSkKKwkJCQlzdHJkdXB4KHRtcGRpciwgcywgQVBFUk0pOworCQl9CisJCWJyZWFrOworI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCisJY2FzZSBWX0hJU1RGSUxFOgorCQlzZXRoaXN0ZmlsZShzdHJfdmFsKHZwKSk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBWX1RNT1VUOgorCQkvKiBBVCZUIGtzaCBzZWVtcyB0byBkbyB0aGlzIChvbmx5IGxpc3RlbiBpZiBpbnRlZ2VyKSAqLworCQlpZiAodnAtPmZsYWcgJiBJTlRFR0VSKQorCQkJa3NoX3Rtb3V0ID0gdnAtPnZhbC5pID49IDAgPyB2cC0+dmFsLmkgOiAwOworCQlicmVhazsKKworCS8qIGNvbW1vbiBzdWItY2FzZXMgKi8KKwljYXNlIFZfT1BUSU5EOgorCWNhc2UgVl9ISVNUU0laRToKKwljYXNlIFZfQ09MVU1OUzoKKwljYXNlIFZfTElORVM6CisJY2FzZSBWX1JBTkRPTToKKwljYXNlIFZfU0VDT05EUzoKKwljYXNlIFZfTElORU5POgorCQl2cC0+ZmxhZyAmPSB+U1BFQ0lBTDsKKwkJaSA9IGludHZhbCh2cCk7CisJCXZwLT5mbGFnIHw9IFNQRUNJQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGRvIG5vdGhpbmcsIGRvIG5vdCB0b3VjaCB2cCBhdCBhbGwgKi8KKwkJcmV0dXJuOworCX0KKworCS8qIHByb2Nlc3MgdGhlIHNpbmd1bGFyIHBhcnRzIG9mIHRoZSBjb21tb24gY2FzZXMgKi8KKworCXN3aXRjaCAoc3QpIHsKKwljYXNlIFZfT1BUSU5EOgorCQlnZXRvcHRzX3Jlc2V0KChpbnQpaSk7CisJCWJyZWFrOworCWNhc2UgVl9ISVNUU0laRToKKwkJc2V0aGlzdHNpemUoKGludClpKTsKKwkJYnJlYWs7CisJY2FzZSBWX0NPTFVNTlM6CisJCWlmIChpID49IE1JTl9DT0xTKQorCQkJeF9jb2xzID0gaTsKKwkJYnJlYWs7CisJY2FzZSBWX0xJTkVTOgorCQlpZiAoaSA+PSBNSU5fTElOUykKKwkJCXhfbGlucyA9IGk7CisJCWJyZWFrOworCWNhc2UgVl9SQU5ET006CisJCS8qCisJCSAqIG1rc2ggUjM5ZCsgbm8gbG9uZ2VyIGhhcyB0aGUgdHJhZGl0aW9uYWwgcmVwZWF0YWJpbGl0eQorCQkgKiBvZiAkUkFORE9NIHNlcXVlbmNlcywgYnV0IGFsd2F5cyByZXRhaW5zIHN0YXRlCisJCSAqLworCQljaGFuZ2VfcmFuZG9tKCZpLCBzaXplb2YoaSkpOworCQlicmVhazsKKwljYXNlIFZfU0VDT05EUzoKKwkJeworCQkJc3RydWN0IHRpbWV2YWwgdHY7CisKKwkJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCQkJc2Vjb25kcyA9IHR2LnR2X3NlYyAtIGk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWX0xJTkVOTzoKKwkJLyogVGhlIC0xIGlzIGJlY2F1c2UgbGluZSBudW1iZXJpbmcgc3RhcnRzIGF0IDEuICovCisJCXVzZXJfbGluZW5vID0gKHVuc2lnbmVkIGludClpIC0gY3VycmVudF9saW5lbm8gLSAxOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCit1bnNldHNwZWMoc3RydWN0IHRibCAqdnApCit7CisJc3dpdGNoIChzcGVjaWFsKHZwLT5uYW1lKSkgeworCWNhc2UgVl9QQVRIOgorCQlpZiAocGF0aCkKKwkJCWFmcmVlKHBhdGgsIEFQRVJNKTsKKwkJc3RyZHVweChwYXRoLCBkZWZfcGF0aCwgQVBFUk0pOworCQlmbHVzaGNvbSgxKTsJLyogY2xlYXIgdHJhY2tlZCBhbGlhc2VzICovCisJCWJyZWFrOworCWNhc2UgVl9JRlM6CisJCXNldGN0eXBlcygiIFx0XG4iLCBDX0lGUyk7CisJCWlmczAgPSAnICc7CisJCWJyZWFrOworCWNhc2UgVl9UTVBESVI6CisJCS8qIHNob3VsZCBub3QgYmVjb21lIHVuc3BlY2lhbCAqLworCQlpZiAodG1wZGlyKSB7CisJCQlhZnJlZSh0bXBkaXIsIEFQRVJNKTsKKwkJCXRtcGRpciA9IE5VTEw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWX0xJTkVOTzoKKwljYXNlIFZfUkFORE9NOgorCWNhc2UgVl9TRUNPTkRTOgorCWNhc2UgVl9UTU9VVDoJCS8qIEFUJlQga3NoIGxlYXZlcyBwcmV2aW91cyB2YWx1ZSBpbiBwbGFjZSAqLworCQl1bnNwZWNpYWwodnAtPm5hbWUpOworCQlicmVhazsKKworCS8qCisJICogQVQmVCBrc2ggbWFuIHBhZ2Ugc2F5cyBPUFRJTkQsIE9QVEFSRyBhbmQgXyBsb3NlIHNwZWNpYWwKKwkgKiBtZWFuaW5nLCBidXQgT1BUQVJHIGRvZXMgbm90IChzdGlsbCBzZXQgYnkgZ2V0b3B0cykgYW5kIF8gaXMKKwkgKiBhbHNvIHN0aWxsIHNldCBpbiB2YXJpb3VzIHBsYWNlcy4gRG9uJ3Qga25vdyB3aGF0IEFUJlQgZG9lcworCSAqIGZvciBISVNUU0laRSwgSElTVEZJTEUuIFVuc2V0dGluZyB0aGVzZSBpbiBBVCZUIGtzaCBkb2VzIG5vdAorCSAqIGxvb3NlIHRoZSAnc3BlY2lhbG5lc3MnOiBJRlMsIENPTFVNTlMsIFBBVEgsIFRNUERJUgorCSAqLworCX0KK30KKworLyoKKyAqIFNlYXJjaCBmb3IgKGFuZCBwb3NzaWJseSBjcmVhdGUpIGEgdGFibGUgZW50cnkgc3RhcnRpbmcgd2l0aAorICogdnAsIGluZGV4ZWQgYnkgdmFsLgorICovCitzdGF0aWMgc3RydWN0IHRibCAqCithcnJheXNlYXJjaChzdHJ1Y3QgdGJsICp2cCwgdWludDMyX3QgdmFsKQoreworCXN0cnVjdCB0YmwgKnByZXYsICpjdXJyLCAqbmV3czsKKwlzaXplX3QgbGVuOworCisJdnAtPmZsYWcgPSAodnAtPmZsYWcgfCAoQVJSQVl8REVGSU5FRCkpICYgfkFTU09DOworCS8qIFRoZSB0YWJsZSBlbnRyeSBpcyBhbHdheXMgWzBdICovCisJaWYgKHZhbCA9PSAwKQorCQlyZXR1cm4gKHZwKTsKKwlwcmV2ID0gdnA7CisJY3VyciA9IHZwLT51LmFycmF5OworCXdoaWxlIChjdXJyICYmIGN1cnItPnVhLmluZGV4IDwgdmFsKSB7CisJCXByZXYgPSBjdXJyOworCQljdXJyID0gY3Vyci0+dS5hcnJheTsKKwl9CisJaWYgKGN1cnIgJiYgY3Vyci0+dWEuaW5kZXggPT0gdmFsKSB7CisJCWlmIChjdXJyLT5mbGFnJklTU0VUKQorCQkJcmV0dXJuIChjdXJyKTsKKwkJbmV3cyA9IGN1cnI7CisJfSBlbHNlCisJCW5ld3MgPSBOVUxMOworCWxlbiA9IHN0cmxlbih2cC0+bmFtZSkgKyAxOworCWlmICghbmV3cykgeworCQluZXdzID0gYWxsb2Mob2Zmc2V0b2Yoc3RydWN0IHRibCwgbmFtZVswXSkgKyBsZW4sIHZwLT5hcmVhcCk7CisJCW1lbWNweShuZXdzLT5uYW1lLCB2cC0+bmFtZSwgbGVuKTsKKwl9CisJbmV3cy0+ZmxhZyA9ICh2cC0+ZmxhZyAmIH4oQUxMT0N8REVGSU5FRHxJU1NFVHxTUEVDSUFMKSkgfCBBSU5ERVg7CisJbmV3cy0+dHlwZSA9IHZwLT50eXBlOworCW5ld3MtPmFyZWFwID0gdnAtPmFyZWFwOworCW5ld3MtPnUyLmZpZWxkID0gdnAtPnUyLmZpZWxkOworCW5ld3MtPnVhLmluZGV4ID0gdmFsOworCisJaWYgKGN1cnIgIT0gbmV3cykgewkJLyogbm90IHJldXNpbmcgb2xkIGFycmF5IGVudHJ5ICovCisJCXByZXYtPnUuYXJyYXkgPSBuZXdzOworCQluZXdzLT51LmFycmF5ID0gY3VycjsKKwl9CisJcmV0dXJuIChuZXdzKTsKK30KKworLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgYW4gYXJyYXkgcmVmZXJlbmNlIChlZywgWzErMl0pIC0gY3AgaXMgYXNzdW1lZAorICogdG8gcG9pbnQgdG8gdGhlIG9wZW4gYnJhY2tldC4gUmV0dXJucyAwIGlmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIGNsb3NpbmcKKyAqIGJyYWNrZXQuCisgKi8KK2ludAorYXJyYXlfcmVmX2xlbihjb25zdCBjaGFyICpjcCkKK3sKKwljb25zdCBjaGFyICpzID0gY3A7CisJaW50IGM7CisJaW50IGRlcHRoID0gMDsKKworCXdoaWxlICgoYyA9ICpzKyspICYmIChjICE9ICddJyB8fCAtLWRlcHRoKSkKKwkJaWYgKGMgPT0gJ1snKQorCQkJZGVwdGgrKzsKKwlpZiAoIWMpCisJCXJldHVybiAoMCk7CisJcmV0dXJuIChzIC0gY3ApOworfQorCisvKgorICogTWFrZSBhIGNvcHkgb2YgdGhlIGJhc2Ugb2YgYW4gYXJyYXkgbmFtZQorICovCitjaGFyICoKK2FycmF5bmFtZShjb25zdCBjaGFyICpzdHIpCit7CisJY29uc3QgY2hhciAqcDsKKwljaGFyICpydjsKKworCWlmICgocCA9IGNzdHJjaHIoc3RyLCAnWycpKSA9PSAwKQorCQkvKiBTaG91bGRuJ3QgaGFwcGVuLCBidXQgd2h5IHdvcnJ5PyAqLworCQlzdHJkdXB4KHJ2LCBzdHIsIEFURU1QKTsKKwllbHNlCisJCXN0cm5kdXB4KHJ2LCBzdHIsIHAgLSBzdHIsIEFURU1QKTsKKworCXJldHVybiAocnYpOworfQorCisvKiBzZXQgKG9yIG92ZXJ3cml0ZSwgaWYgcmVzZXQpIHRoZSBhcnJheSB2YXJpYWJsZSB2YXIgdG8gdGhlIHZhbHVlcyBpbiB2YWxzICovCitta3NoX3VhcmlfdAorc2V0X2FycmF5KGNvbnN0IGNoYXIgKnZhciwgYm9vbCByZXNldCwgY29uc3QgY2hhciAqKnZhbHMpCit7CisJc3RydWN0IHRibCAqdnAsICp2cTsKKwlta3NoX3VhcmlfdCBpOworCWNvbnN0IGNoYXIgKmNjcDsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCWNoYXIgKmNwOworCW1rc2hfdWFyaV90IGo7CisjZW5kaWYKKworCS8qIHRvIGdldCBsb2NhbCBhcnJheSwgdXNlICJ0eXBlc2V0IGZvbzsgc2V0IC1BIGZvbyIgKi8KKwl2cCA9IGdsb2JhbCh2YXIpOworCisJLyogTm90ZTogQVQmVCBrc2ggYWxsb3dzIHNldCAtQSBidXQgbm90IHNldCArQSBvZiBhIHJlYWQtb25seSB2YXIgKi8KKwlpZiAoKHZwLT5mbGFnJlJET05MWSkpCisJCWVycm9yZigiJXM6IGlzIHJlYWQgb25seSIsIHZhcik7CisJLyogVGhpcyBjb2RlIGlzIHF1aXRlIG5vbi1vcHRpbWFsICovCisJaWYgKHJlc2V0KQorCQkvKiB0cmFzaCBleGlzdGluZyB2YWx1ZXMgYW5kIGF0dHJpYnV0ZXMgKi8KKwkJdW5zZXQodnAsIDEpOworCS8qIHRvZG86IHdvdWxkIGJlIG5pY2UgZm9yIGFzc2lnbm1lbnQgdG8gY29tcGxldGVseSBzdWNjZWVkIG9yCisJICogY29tcGxldGVseSBmYWlsLiBPbmx5IHJlYWxseSBlZmZlY3RzIGludGVnZXIgYXJyYXlzOgorCSAqIGV2YWx1YXRpb24gb2Ygc29tZSBvZiB2YWxzW10gbWF5IGZhaWwuLi4KKwkgKi8KKwlpID0gMDsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCWogPSAwOworI2Vsc2UKKyNkZWZpbmUgaiBpCisjZW5kaWYKKwl3aGlsZSAoKGNjcCA9IHZhbHNbaV0pKSB7CisjaWZuZGVmIE1LU0hfU01BTEwKKwkJaWYgKCpjY3AgPT0gJ1snKSB7CisJCQlpbnQgbGV2ZWwgPSAwOworCisJCQl3aGlsZSAoKmNjcCkgeworCQkJCWlmICgqY2NwID09ICddJyAmJiAtLWxldmVsID09IDApCisJCQkJCWJyZWFrOworCQkJCWlmICgqY2NwID09ICdbJykKKwkJCQkJKytsZXZlbDsKKwkJCQkrK2NjcDsKKwkJCX0KKwkJCWlmICgqY2NwID09ICddJyAmJiBsZXZlbCA9PSAwICYmIGNjcFsxXSA9PSAnPScpIHsKKwkJCQlzdHJuZHVweChjcCwgdmFsc1tpXSArIDEsIGNjcCAtICh2YWxzW2ldICsgMSksCisJCQkJICAgIEFURU1QKTsKKwkJCQlldmFsdWF0ZShzdWJzdGl0dXRlKGNwLCAwKSwgKG1rc2hfYXJpX3QgKikmaiwKKwkJCQkgICAgS1NIX1VOV0lORF9FUlJPUiwgdHJ1ZSk7CisJCQkJYWZyZWUoY3AsIEFURU1QKTsKKwkJCQljY3AgKz0gMjsKKwkJCX0gZWxzZQorCQkJCWNjcCA9IHZhbHNbaV07CisJCX0KKyNlbmRpZgorCisJCXZxID0gYXJyYXlzZWFyY2godnAsIGopOworCQkvKiB3b3VsZCBiZSBuaWNlIHRvIGRlYWwgd2l0aCBlcnJvcnMgaGVyZS4uLiAoc2VlIGFib3ZlKSAqLworCQlzZXRzdHIodnEsIGNjcCwgS1NIX1JFVFVSTl9FUlJPUik7CisJCWkrKzsKKyNpZm5kZWYgTUtTSF9TTUFMTAorCQlqKys7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gKGkpOworfQorCit2b2lkCitjaGFuZ2Vfd2luc3oodm9pZCkKK3sKKwlpZiAoeF9saW5zIDwgMCkgeworCQkvKiBmaXJzdCB0aW1lIGluaXRpYWxpc2F0aW9uICovCisjaWZkZWYgVElPQ0dXSU5TWgorCQlpZiAodHR5X2ZkIDwgMCkKKwkJCS8qIG5vbi1GVEFMS0lORywgdHJ5IHRvIGdldCBhbiBmZCBhbnl3YXkgKi8KKwkJCXR0eV9pbml0KGZhbHNlLCBmYWxzZSk7CisjZW5kaWYKKwkJeF9jb2xzID0gLTE7CisJfQorCisjaWZkZWYgVElPQ0dXSU5TWgorCS8qIGNoZWNrIGlmIHdpbmRvdyBzaXplIGhhcyBjaGFuZ2VkICovCisJaWYgKHR0eV9mZCA+PSAwKSB7CisJCXN0cnVjdCB3aW5zaXplIHdzOworCisJCWlmIChpb2N0bCh0dHlfZmQsIFRJT0NHV0lOU1osICZ3cykgPj0gMCkgeworCQkJaWYgKHdzLndzX2NvbCkKKwkJCQl4X2NvbHMgPSB3cy53c19jb2w7CisJCQlpZiAod3Mud3Nfcm93KQorCQkJCXhfbGlucyA9IHdzLndzX3JvdzsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogYm91bmRzIGNoZWNrIGZvciBzYW5lIHZhbHVlcywgdXNlIGRlZmF1bHRzIG90aGVyd2lzZSAqLworCWlmICh4X2NvbHMgPCBNSU5fQ09MUykKKwkJeF9jb2xzID0gODA7CisJaWYgKHhfbGlucyA8IE1JTl9MSU5TKQorCQl4X2xpbnMgPSAyNDsKKworI2lmZGVmIFNJR1dJTkNICisJZ290X3dpbmNoID0gMDsKKyNlbmRpZgorfQorCit1aW50MzJfdAorZXZpbGhhc2goY29uc3QgY2hhciAqcykKK3sKKwlyZWdpc3RlciB1aW50MzJfdCBoID0gMHgxMDA7CisKKwloID0gb2FhdGhhc2hfdXBkYXRlKGgsICh2b2lkICopJmtzaHN0YXRlX2YsIHNpemVvZihrc2hzdGF0ZV9mKSk7CisJa3Noc3RhdGVfZi5oID0gb2FhdGhhc2hfZnVsbCgoY29uc3QgdWludDhfdCAqKXMpOworCXJldHVybiAob2FhdGhhc2hfZmluYWxpc2Uob2FhdGhhc2hfdXBkYXRlKGgsCisJICAgICh2b2lkICopJmtzaHN0YXRlX2YuaCwgc2l6ZW9mKGtzaHN0YXRlX2YuaCkpKSk7Cit9CmRpZmYgLS1naXQgYS9ta3NoL3NyYy92YXJfc3BlYy5oIGIvbWtzaC9zcmMvdmFyX3NwZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDM1Y2M5Ci0tLSAvZGV2L251bGwKKysrIGIvbWtzaC9zcmMvdmFyX3NwZWMuaApAQCAtMCwwICsxLDM5IEBACisjaWYgZGVmaW5lZChWQVJTUEVDX0RFRk5TKQorX19SQ1NJRCgiJE1pck9TOiBzcmMvYmluL21rc2gvdmFyX3NwZWMuaCx2IDEuMSAyMDA5LzA5LzI2IDAzOjQwOjAzIHRnIEV4cCAkIik7CisjZGVmaW5lIEZOKG5hbWUpCQkJLyogbm90aGluZyAqLworI2VsaWYgZGVmaW5lZChWQVJTUEVDX0VOVU1TKQorI2RlZmluZSBGTihuYW1lKQkJCVZfIyNuYW1lLAorI2RlZmluZSBGMChuYW1lKQkJCVZfIyNuYW1lID0gMCwKKyNlbGlmIGRlZmluZWQoVkFSU1BFQ19JVEVNUykKKyNkZWZpbmUgRjAobmFtZSkJCQkvKiBub3RoaW5nICovCisjZGVmaW5lIEZOKG5hbWUpCQkJI25hbWUsCisjZW5kaWYKKworI2lmbmRlZiBGMAorI2RlZmluZSBGMCBGTgorI2VuZGlmCisKKy8qIDAgaXMgYWx3YXlzIFZfTk9ORSAqLworRjAoTk9ORSkKKworLyogMSBhbmQgdXAgYXJlIHNwZWNpYWwgdmFyaWFibGVzICovCitGTihDT0xVTU5TKQorI2lmIEhBVkVfUEVSU0lTVEVOVF9ISVNUT1JZCitGTihISVNURklMRSkKKyNlbmRpZgorRk4oSElTVFNJWkUpCitGTihJRlMpCitGTihMSU5FTk8pCitGTihMSU5FUykKK0ZOKE9QVElORCkKK0ZOKFBBVEgpCitGTihSQU5ET00pCitGTihTRUNPTkRTKQorRk4oVE1PVVQpCitGTihUTVBESVIpCisKKyN1bmRlZiBGTgorI3VuZGVmIEYwCisjdW5kZWYgVkFSU1BFQ19ERUZOUworI3VuZGVmIFZBUlNQRUNfRU5VTVMKKyN1bmRlZiBWQVJTUEVDX0lURU1TCmRpZmYgLS1naXQgYS9uZXRjZmcvbmV0Y2ZnLmMgYi9uZXRjZmcvbmV0Y2ZnLmMKaW5kZXggZmM5Y2Y0OC4uOWNkODgzYSAxMDA2NDQKLS0tIGEvbmV0Y2ZnL25ldGNmZy5jCisrKyBiL25ldGNmZy9uZXRjZmcuYwpAQCAtMTksMTcgKzE5LDEzIEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2V0aGVyLmg+CisKKyNpbmNsdWRlIDxuZXR1dGlscy9pZmMuaD4KKyNpbmNsdWRlIDxuZXR1dGlscy9kaGNwLmg+CiAKIHN0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CiAKLWludCBpZmNfaW5pdCgpOwotdm9pZCBpZmNfY2xvc2UoKTsKLWludCBpZmNfdXAoY2hhciAqaW5hbWUpOwotaW50IGlmY19kb3duKGNoYXIgKmluYW1lKTsKLWludCBpZmNfcmVtb3ZlX2hvc3Rfcm91dGVzKGNoYXIgKmluYW1lKTsKLWludCBpZmNfcmVtb3ZlX2RlZmF1bHRfcm91dGUoY2hhciAqaW5hbWUpOwotaW50IGlmY19nZXRfaW5mbyhjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCAqYWRkciwgdW5zaWduZWQgKm1hc2ssIHVuc2lnbmVkICpmbGFncyk7Ci1pbnQgZG9fZGhjcChjaGFyICppbmFtZSk7CiAKIHZvaWQgZGllKGNvbnN0IGNoYXIgKnJlYXNvbikKIHsKQEAgLTM3LDE2ICszMywxMiBAQAogICAgIGV4aXQoMSk7CiB9CiAKLWNvbnN0IGNoYXIgKmlwYWRkcih1bnNpZ25lZCBhZGRyKQorY29uc3QgY2hhciAqaXBhZGRyKGluX2FkZHJfdCBhZGRyKQogewotICAgIHN0YXRpYyBjaGFyIGJ1ZlszMl07Ci0gICAgCi0gICAgc3ByaW50ZihidWYsIiVkLiVkLiVkLiVkIiwgCi0gICAgICAgICAgICBhZGRyICYgMjU1LAotICAgICAgICAgICAgKChhZGRyID4+IDgpICYgMjU1KSwKLSAgICAgICAgICAgICgoYWRkciA+PiAxNikgJiAyNTUpLCAKLSAgICAgICAgICAgIChhZGRyID4+IDI0KSk7Ci0gICAgcmV0dXJuIGJ1ZjsKKyAgICBzdHJ1Y3QgaW5fYWRkciBpbl9hZGRyOworCisgICAgaW5fYWRkci5zX2FkZHIgPSBhZGRyOworICAgIHJldHVybiBpbmV0X250b2EoaW5fYWRkcik7CiB9CiAKIHZvaWQgdXNhZ2Uodm9pZCkKQEAgLTg2LDYgKzc4LDE1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK2ludCBzZXRfaHdhZGRyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmFzYykgeworICAgIHN0cnVjdCBldGhlcl9hZGRyICphZGRyID0gZXRoZXJfYXRvbihhc2MpOworICAgIGlmICghYWRkcikgeworICAgICAgICBwcmludGYoIkZhaWxlZCB0byBwYXJzZSAnJXMnXG4iLCBhc2MpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBpZmNfc2V0X2h3YWRkcihuYW1lLCBhZGRyLT5ldGhlcl9hZGRyX29jdGV0KTsKK30KKwogc3RydWN0IAogewogICAgIGNvbnN0IGNoYXIgKm5hbWU7CkBAIC05Nyw2ICs5OCw3IEBACiAgICAgeyAiZG93biIsICAgMSwgaWZjX2Rvd24gfSwKICAgICB7ICJmbGhvc3RzIiwgIDEsIGlmY19yZW1vdmVfaG9zdF9yb3V0ZXMgfSwKICAgICB7ICJkZWxkZWZhdWx0IiwgMSwgaWZjX3JlbW92ZV9kZWZhdWx0X3JvdXRlIH0sCisgICAgeyAiaHdhZGRyIiwgMiwgc2V0X2h3YWRkciB9LAogICAgIHsgMCwgMCwgMCB9LAogfTsKIApkaWZmIC0tZ2l0IGEvbmV4dXMvRGhjcENsaWVudC5jcHAgYi9uZXh1cy9EaGNwQ2xpZW50LmNwcAppbmRleCBhNTY1NGQyLi43MTMwNTlkIDEwMDY0NAotLS0gYS9uZXh1cy9EaGNwQ2xpZW50LmNwcAorKysgYi9uZXh1cy9EaGNwQ2xpZW50LmNwcApAQCAtMjcsMzUgKzI3LDE1IEBACiAKICNpbmNsdWRlIDxzeXN1dGlscy9TZXJ2aWNlTWFuYWdlci5oPgogCisjaW5jbHVkZSA8bmV0dXRpbHMvaWZjLmg+CisjaW5jbHVkZSA8bmV0dXRpbHMvZGhjcC5oPgorCiAjaW5jbHVkZSAiRGhjcENsaWVudC5oIgogI2luY2x1ZGUgIkRoY3BTdGF0ZS5oIgogI2luY2x1ZGUgIkRoY3BMaXN0ZW5lci5oIgogI2luY2x1ZGUgIklEaGNwRXZlbnRIYW5kbGVycy5oIgogI2luY2x1ZGUgIkNvbnRyb2xsZXIuaCIKIAotZXh0ZXJuICJDIiB7Ci1pbnQgaWZjX2Rpc2FibGUoY29uc3QgY2hhciAqaWZuYW1lKTsKLWludCBpZmNfYWRkX2hvc3Rfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lLCB1aW50MzJfdCBhZGRyKTsKLWludCBpZmNfcmVtb3ZlX2hvc3Rfcm91dGVzKGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1pbnQgaWZjX3NldF9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSwgdWludDMyX3QgZ2F0ZXdheSk7Ci1pbnQgaWZjX2dldF9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1pbnQgaWZjX3JlbW92ZV9kZWZhdWx0X3JvdXRlKGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1pbnQgaWZjX3Jlc2V0X2Nvbm5lY3Rpb25zKGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1pbnQgaWZjX2NvbmZpZ3VyZShjb25zdCBjaGFyICppZm5hbWUsIGluX2FkZHJfdCBpcGFkZHIsIGluX2FkZHJfdCBuZXRtYXNrLCBpbl9hZGRyX3QgZ2F0ZXdheSwgaW5fYWRkcl90IGRuczEsIGluX2FkZHJfdCBkbnMyKTsKLQotaW50IGRoY3BfZG9fcmVxdWVzdChjb25zdCBjaGFyICppZm5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqaXBhZGRyLAotICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKmdhdGV3YXksCi0gICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqbWFzaywKLSAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpkbnMxLAotICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKmRuczIsCi0gICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqc2VydmVyLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgKmxlYXNlKTsKLWludCBkaGNwX3N0b3AoY29uc3QgY2hhciAqaWZuYW1lKTsKLWludCBkaGNwX3JlbGVhc2VfbGVhc2UoY29uc3QgY2hhciAqaWZuYW1lKTsKLWNoYXIgKmRoY3BfZ2V0X2Vycm1zZygpOwotfQotCiBEaGNwQ2xpZW50OjpEaGNwQ2xpZW50KElEaGNwRXZlbnRIYW5kbGVycyAqaGFuZGxlcnMpIDoKICAgICAgICAgICAgIG1TdGF0ZShEaGNwU3RhdGU6OklOSVQpLCBtSGFuZGxlcnMoaGFuZGxlcnMpIHsKICAgICBtU2VydmljZU1hbmFnZXIgPSBuZXcgU2VydmljZU1hbmFnZXIoKTsKZGlmZiAtLWdpdCBhL3BhdGNoLnR4dCBiL3BhdGNoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTg5NjVkCi0tLSAvZGV2L251bGwKKysrIGIvcGF0Y2gudHh0CkBAIC0wLDAgKzEsMTYgQEAKK2RpZmYgLS1naXQgYS9pbml0L3V0aWwuYyBiL2luaXQvdXRpbC5jCitpbmRleCA0ZDk4Y2MyLi4wNjY3NTkzIDEwMDc1NQorLS0tIGEvaW5pdC91dGlsLmMKKysrKyBiL2luaXQvdXRpbC5jCitAQCAtNjU3LDggKzY1Nyw5IEBAIHN0YXRpYyB2b2lkIGdldF9oYXJkd2FyZV9uYW1lKHZvaWQpCisgICAgICAgICBpZiAoeCkgeworICAgICAgICAgICAgIHggKz0gMjsKKyAgICAgICAgICAgICBuID0gMDsKKy0gICAgICAgICAgICB3aGlsZSAoKnggJiYgIWlzc3BhY2UoKngpKSB7CistICAgICAgICAgICAgICAgIGhhcmR3YXJlW24rK10gPSB0b2xvd2VyKCp4KTsKKysgICAgICAgICAgICB3aGlsZSAoKnggJiYgKnggIT0gJ1xuJykgeworKyAgICAgICAgICAgICAgICBpZiAoIWlzc3BhY2UoKngpKQorKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVbbisrXSA9IHRvbG93ZXIoKngpOworICAgICAgICAgICAgICAgICB4Kys7CisgICAgICAgICAgICAgICAgIGlmIChuID09IDMxKSBicmVhazsKKyAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9yb290ZGlyL0FuZHJvaWQubWsgYi9yb290ZGlyL0FuZHJvaWQubWsKaW5kZXggMzI5YmU3Zi4uMWE5ZTA2ZiAxMDA2NDQKLS0tIGEvcm9vdGRpci9BbmRyb2lkLm1rCisrKyBiL3Jvb3RkaXIvQW5kcm9pZC5tawpAQCAtNyw3ICs3LDExIEBACiAJZXRjL2RidXMuY29uZiBcCiAJZXRjL2hvc3RzCiAKLWlmZXEgKCQoVEFSR0VUX1BST0RVQ1QpLGdlbmVyaWMpCitpZmVxICgkKFRBUkdFVF9QUk9EVUNUKSxmdWxsKQorY29weV9mcm9tICs9IGV0Yy92b2xkLmZzdGFiCitlbmRpZgorCitpZmVxICgkKFRBUkdFVF9QUk9EVUNUKSxmdWxsX3g4NikKIGNvcHlfZnJvbSArPSBldGMvdm9sZC5mc3RhYgogZW5kaWYKIApkaWZmIC0tZ2l0IGEvcm9vdGRpci9ldGMvaW5pdC5nb2xkZmlzaC5zaCBiL3Jvb3RkaXIvZXRjL2luaXQuZ29sZGZpc2guc2gKaW5kZXggNWZmMGEzYS4uY2ZhMmM4MiAxMDA3NTUKLS0tIGEvcm9vdGRpci9ldGMvaW5pdC5nb2xkZmlzaC5zaAorKysgYi9yb290ZGlyL2V0Yy9pbml0LmdvbGRmaXNoLnNoCkBAIC00NSwzICs0NSwxMyBAQAogIyB0aGlzIGxpbmUgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcgdXNlZnVsLiBob3dldmVyIHdpdGhvdXQgaXQgdGhlCiAjIHByZXZpb3VzIHNldHByb3AgZG9lc24ndCBzZWVtIHRvIGFwcGx5IGZvciBzb21lIHJlYWxseSBvZGQgcmVhc29uCiBzZXRwcm9wIHJvLnFlbXUuaW5pdC5jb21wbGV0ZWQgMQorCisjIHNldCB1cCB0aGUgc2Vjb25kIGludGVyZmFjZSAoZm9yIGludGVyLWVtdWxhdG9yIGNvbm5lY3Rpb25zKQorIyBpZiByZXF1aXJlZAorbXlfaXA9YGdldHByb3AgbmV0LnNoYXJlZF9uZXRfaXBgCitjYXNlICIkbXlfaXAiIGluCisgICAgIiIpCisgICAgOzsKKyAgICAqKSBpZmNvbmZpZyBldGgxICIkbXlfaXAiIG5ldG1hc2sgMjU1LjI1NS4yNTUuMCB1cAorICAgIDs7Citlc2FjCmRpZmYgLS1naXQgYS9yb290ZGlyL2luaXQucmMgYi9yb290ZGlyL2luaXQucmMKaW5kZXggODIyNzI3My4uOTBjMDE3YiAxMDA2NDQKLS0tIGEvcm9vdGRpci9pbml0LnJjCisrKyBiL3Jvb3RkaXIvaW5pdC5yYwpAQCAtMTc2LDYgKzE3NiwxMSBAQAogICAgIGNob3duIHJvb3Qgcm9vdCAvY2FjaGUvbG9zdCtmb3VuZAogICAgIGNobW9kIDA3NzAgL2NhY2hlL2xvc3QrZm91bmQKIAorICAgICMgY3JlYXRlIGRhdGEvZHJtIGRpcmVjdG9yeQorICAgIG1rZGlyIC9kYXRhL2RybSAwNzc0IGRybSBkcm0KKyAgICBjaG93biBkcm0gZHJtIC9kYXRhL2RybQorICAgIGNobW9kIDA3NzQgL2RhdGEvZHJtCisKIG9uIGJvb3QKICMgYmFzaWMgbmV0d29yayBpbml0CiAgICAgaWZ1cCBsbwpAQCAtMzE1LDYgKzMyMCw3IEBACiAKIHNlcnZpY2UgbmV0ZCAvc3lzdGVtL2Jpbi9uZXRkCiAgICAgc29ja2V0IG5ldGQgc3RyZWFtIDA2NjAgcm9vdCBzeXN0ZW0KKyAgICBzb2NrZXQgZG5zcHJveHlkIHN0cmVhbSAwNjYwIHJvb3QgaW5ldAogCiBzZXJ2aWNlIGRlYnVnZ2VyZCAvc3lzdGVtL2Jpbi9kZWJ1Z2dlcmQKIApAQCAtMzMxLDYgKzMzNywxMyBAQAogICAgIG9ucmVzdGFydCByZXN0YXJ0IG1lZGlhCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgbmV0ZAogCitzZXJ2aWNlIGRybSAvc3lzdGVtL2Jpbi9kcm1zZXJ2ZXIKKyAgICB1c2VyIGRybQorICAgIGdyb3VwIHN5c3RlbSByb290IGluZXQKKworc2VydmljZSBkcm1pbyAvc3lzdGVtL2Jpbi9kcm1pb3NlcnZlcgorICAgIHVzZXIgZHJtaW8KKwogc2VydmljZSBtZWRpYSAvc3lzdGVtL2Jpbi9tZWRpYXNlcnZlcgogICAgIHVzZXIgbWVkaWEKICAgICBncm91cCBzeXN0ZW0gYXVkaW8gY2FtZXJhIGdyYXBoaWNzIGluZXQgbmV0X2J0IG5ldF9idF9hZG1pbiBuZXRfcmF3CmRpZmYgLS1naXQgYS9zaC9BbmRyb2lkLm1rIGIvc2gvQW5kcm9pZC5tawppbmRleCBiNWU1YzM4Li5kY2QxM2Q4IDEwMDY0NAotLS0gYS9zaC9BbmRyb2lkLm1rCisrKyBiL3NoL0FuZHJvaWQubWsKQEAgLTI5LDcgKzI5LDggQEAKIAlibHRpbi9lY2hvLmMgXAogCWluaXQuYwogCi1MT0NBTF9NT0RVTEU6PSBzaAorTE9DQUxfTU9EVUxFOj0gYXNoCitMT0NBTF9NT0RVTEVfVEFHUzo9IHNoZWxsX2FzaAogCiBMT0NBTF9DRkxBR1MgKz0gLURTSEVMTCAtRFdJVEhfTElORU5PSVNFCiAKQEAgLTUxLDMgKzUyLDE5IEBACiAJc2ggLi9ta2luaXQuc2ggJChQUklWQVRFX1NSQ19GSUxFUykgCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisKKyMgY3JlYXRlIC9zeXN0ZW0vYmluL3NoIHN5bWxpbmsgdG8gJChUQVJHRVRfU0hFTEwpCisjIG5vdCB0aGUgb3B0aW1hbCBwbGFjZSBmb3IgdGhpcywgYnV0IGEgZml0dGluZyBvbmUKKworT1VUU1lTVEVNQklOU0ggOj0gJChUQVJHRVRfT1VUKS9iaW4vc2gKK0xPQ0FMX01PRFVMRSA6PSBzeXN0ZW1iaW5zaAorJChPVVRTWVNURU1CSU5TSCk6IHwgJChUQVJHRVRfU0hFTEwpCiskKE9VVFNZU1RFTUJJTlNIKTogTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorJChPVVRTWVNURU1CSU5TSCk6CisJQGVjaG8gIlN5bWxpbms6ICRAIC0+ICQoVEFSR0VUX1NIRUxMKSIKKwlAcm0gLXJmICRACisJJChoaWRlKSBsbiAtc2YgJChUQVJHRVRfU0hFTEwpICRACisKK0FMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoT1VUU1lTVEVNQklOU0gpCitBTExfTU9EVUxFUy4kKExPQ0FMX01PRFVMRSkuSU5TVEFMTEVEICs9ICQoT1VUU1lTVEVNQklOU0gpCmRpZmYgLS1naXQgYS90b29sYm94L2NobW9kLmMgYi90b29sYm94L2NobW9kLmMKaW5kZXggMzFhNTNiZi4uMmE1MjRlOSAxMDA2NDQKLS0tIGEvdG9vbGJveC9jaG1vZC5jCisrKyBiL3Rvb2xib3gvY2htb2QuYwpAQCAtNCwxNyArNCw3NCBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL2xpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKK3ZvaWQgcmVjdXJzZV9jaG1vZChjaGFyKiBwYXRoLCBpbnQgbW9kZSkKK3sKKyAgICBzdHJ1Y3QgZGlyZW50ICpkcDsKKyAgICBESVIgKmRpciA9IG9wZW5kaXIocGF0aCk7CisgICAgaWYgKGRpciA9PSBOVUxMKSB7CisgICAgICAgIC8vIG5vdCBhIGRpcmVjdG9yeSwgY2Fycnkgb24KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjaGFyICpzdWJwYXRoID0gbWFsbG9jKHNpemVvZihjaGFyKSpQQVRIX01BWCk7CisgICAgaW50IHBhdGhsZW4gPSBzdHJsZW4ocGF0aCk7CisKKyAgICB3aGlsZSAoKGRwID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdHJjbXAoZHAtPmRfbmFtZSwgIi4iKSA9PSAwIHx8CisgICAgICAgICAgICBzdHJjbXAoZHAtPmRfbmFtZSwgIi4uIikgPT0gMCkgY29udGludWU7CisKKyAgICAgICAgaWYgKHN0cmxlbihkcC0+ZF9uYW1lKSArIHBhdGhsZW4gKyAyLypOVUwgYW5kIHNsYXNoKi8gPiBQQVRIX01BWCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHBhdGggc3BlY2lmaWVkOiB0b28gbG9uZ1xuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgc3RyY3B5KHN1YnBhdGgsIHBhdGgpOworICAgICAgICBzdHJjYXQoc3VicGF0aCwgIi8iKTsKKyAgICAgICAgc3RyY2F0KHN1YnBhdGgsIGRwLT5kX25hbWUpOworCisgICAgICAgIGlmIChjaG1vZChzdWJwYXRoLCBtb2RlKSA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGNobW9kICVzOiAlc1xuIiwgc3VicGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICByZWN1cnNlX2NobW9kKHN1YnBhdGgsIG1vZGUpOworICAgIH0KKyAgICBmcmVlKHN1YnBhdGgpOworICAgIGNsb3NlZGlyKGRpcik7Cit9CisKK3N0YXRpYyBpbnQgdXNhZ2UoKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGNobW9kIFtPUFRJT05dIDxNT0RFPiA8RklMRT5cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAtUiwgLS1yZWN1cnNpdmUgICAgICAgICBjaGFuZ2UgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHJlY3Vyc2l2ZWx5XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgLS1oZWxwICAgICAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXRcbiIpOworCisgICAgcmV0dXJuIDEwOworfQorCiBpbnQgY2htb2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAgICAgaW50IGk7CiAKLSAgICBpZiAoYXJnYyA8IDMpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogY2htb2QgPE1PREU+IDxGSUxFPlxuIik7Ci0gICAgICAgIHJldHVybiAxMDsKKyAgICBpZiAoYXJnYyA8IDMgfHwgc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB1c2FnZSgpOworICAgIH0KKworICAgIGludCByZWN1cnNpdmUgPSAoc3RyY21wKGFyZ3ZbMV0sICItUiIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChhcmd2WzFdLCAiLS1yZWN1cnNpdmUiKSA9PSAwKSA/IDEgOiAwOworCisgICAgaWYgKHJlY3Vyc2l2ZSAmJiBhcmdjIDwgNCkgeworICAgICAgICByZXR1cm4gdXNhZ2UoKTsKKyAgICB9CisKKyAgICBpZiAocmVjdXJzaXZlKSB7CisgICAgICAgIGFyZ2MtLTsKKyAgICAgICAgYXJndisrOwogICAgIH0KIAogICAgIGludCBtb2RlID0gMDsKQEAgLTI5LDExICs4NiwxNSBAQAogICAgICAgICB9CiAgICAgICAgIHMrKzsKICAgICB9CisKICAgICBmb3IgKGkgPSAyOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgIGlmIChjaG1vZChhcmd2W2ldLCBtb2RlKSA8IDApIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGNobW9kICVzOiAlc1xuIiwgYXJndltpXSwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgIHJldHVybiAxMDsKICAgICAgICAgfQorICAgICAgICBpZiAocmVjdXJzaXZlKSB7CisgICAgICAgICAgICByZWN1cnNlX2NobW9kKGFyZ3ZbaV0sIG1vZGUpOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdG9vbGJveC9pbnNtb2QuYyBiL3Rvb2xib3gvaW5zbW9kLmMKaW5kZXggNDRiOTg0Ny4uNzU2YTY0YiAxMDA2NDQKLS0tIGEvdG9vbGJveC9pbnNtb2QuYworKysgYi90b29sYm94L2luc21vZC5jCkBAIC03Nyw3ICs3Nyw2IEBACiAJCQltZW1jcHkocHRyLCBhcmd2W2ldLCBsZW4pOwogCQkJcHRyICs9IGxlbjsKIAkJCSpwdHIrKyA9ICcgJzsKLQkJCSpwdHIrKyA9ICdcMCc7CiAJCX0KIAkJKihwdHIgLSAxKSA9ICdcMCc7CiAJfQpkaWZmIC0tZ2l0IGEvdG9vbGJveC9scy5jIGIvdG9vbGJveC9scy5jCmluZGV4IDg3OTk1MTQuLjk2MmJmNDcgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvbHMuYworKysgYi90b29sYm94L2xzLmMKQEAgLTEzLDYgKzEzLDEzMCBAQAogI2luY2x1ZGUgPGdycC5oPgogCiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8vIGR5bmFtaWMgYXJyYXlzCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGNvdW50OworICAgIGludCBjYXBhY2l0eTsKKyAgICB2b2lkKiogaXRlbXM7Cit9IGR5bmFycmF5X3Q7CisKKyNkZWZpbmUgRFlOQVJSQVlfSU5JVElBTElaRVIgIHsgMCwgMCwgTlVMTCB9CisKK3N0YXRpYyB2b2lkIGR5bmFycmF5X2luaXQoIGR5bmFycmF5X3QgKmEgKQoreworICAgIGEtPmNvdW50ID0gYS0+Y2FwYWNpdHkgPSAwOworICAgIGEtPml0ZW1zID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZHluYXJyYXlfcmVzZXJ2ZV9tb3JlKCBkeW5hcnJheV90ICphLCBpbnQgY291bnQgKQoreworICAgIGludCBvbGRfY2FwID0gYS0+Y2FwYWNpdHk7CisgICAgaW50IG5ld19jYXAgPSBvbGRfY2FwOworICAgIGNvbnN0IGludCBtYXhfY2FwID0gSU5UX01BWC9zaXplb2Yodm9pZCopOworICAgIHZvaWQqKiBuZXdfaXRlbXM7CisgICAgaW50IG5ld19jb3VudCA9IGEtPmNvdW50ICsgY291bnQ7CisKKyAgICBpZiAoY291bnQgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGNvdW50ID4gbWF4X2NhcCAtIGEtPmNvdW50KQorICAgICAgICBhYm9ydCgpOworCisgICAgbmV3X2NvdW50ID0gYS0+Y291bnQgKyBjb3VudDsKKworICAgIHdoaWxlIChuZXdfY2FwIDwgbmV3X2NvdW50KSB7CisgICAgICAgIG9sZF9jYXAgPSBuZXdfY2FwOworICAgICAgICBuZXdfY2FwICs9IChuZXdfY2FwID4+IDIpICsgNDsKKyAgICAgICAgaWYgKG5ld19jYXAgPCBvbGRfY2FwIHx8IG5ld19jYXAgPiBtYXhfY2FwKSB7CisgICAgICAgICAgICBuZXdfY2FwID0gbWF4X2NhcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBuZXdfaXRlbXMgPSByZWFsbG9jKGEtPml0ZW1zLCBuZXdfY2FwKnNpemVvZih2b2lkKikpOworICAgIGlmIChuZXdfaXRlbXMgPT0gTlVMTCkKKyAgICAgICAgYWJvcnQoKTsKKworICAgIGEtPml0ZW1zID0gbmV3X2l0ZW1zOworICAgIGEtPmNhcGFjaXR5ID0gbmV3X2NhcDsKK30KKworc3RhdGljIHZvaWQgZHluYXJyYXlfYXBwZW5kKCBkeW5hcnJheV90ICphLCB2b2lkKiBpdGVtICkKK3sKKyAgICBpZiAoYS0+Y291bnQgPj0gYS0+Y2FwYWNpdHkpCisgICAgICAgIGR5bmFycmF5X3Jlc2VydmVfbW9yZShhLCAxKTsKKworICAgIGEtPml0ZW1zW2EtPmNvdW50KytdID0gaXRlbTsKK30KKworc3RhdGljIHZvaWQgZHluYXJyYXlfZG9uZSggZHluYXJyYXlfdCAqYSApCit7CisgICAgZnJlZShhLT5pdGVtcyk7CisgICAgYS0+aXRlbXMgPSBOVUxMOworICAgIGEtPmNvdW50ID0gYS0+Y2FwYWNpdHkgPSAwOworfQorCisjZGVmaW5lIERZTkFSUkFZX0ZPUkVBQ0hfVFlQRShfYXJyYXksX2l0ZW1fdHlwZSxfaXRlbSxfc3RtbnQpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaW50IF9ubl8jI19fTElORV9fID0gMDsgXAorICAgICAgICBmb3IgKDtfbm5fIyNfX0xJTkVfXyA8IChfYXJyYXkpLT5jb3VudDsgKysgX25uXyMjX19MSU5FX18pIHsgXAorICAgICAgICAgICAgX2l0ZW1fdHlwZSBfaXRlbSA9IChfaXRlbV90eXBlKShfYXJyYXkpLT5pdGVtc1tfbm5fIyNfX0xJTkVfX107IFwKKyAgICAgICAgICAgIF9zdG1udDsgXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIERZTkFSUkFZX0ZPUkVBQ0goX2FycmF5LF9pdGVtLF9zdG1udCkgXAorICAgIERZTkFSUkFZX0ZPUkVBQ0hfVFlQRShfYXJyYXksdm9pZCAqLF9pdGVtLF9zdG1udCkKKworLy8gc3RyaW5nIGFycmF5cworCit0eXBlZGVmIGR5bmFycmF5X3QgIHN0cmxpc3RfdDsKKworI2RlZmluZSAgU1RSTElTVF9JTklUSUFMSVpFUiAgRFlOQVJSQVlfSU5JVElBTElaRVIKKworI2RlZmluZSAgU1RSTElTVF9GT1JFQUNIKF9saXN0LF9zdHJpbmcsX3N0bW50KSBcCisgICAgRFlOQVJSQVlfRk9SRUFDSF9UWVBFKF9saXN0LGNoYXIgKixfc3RyaW5nLF9zdG1udCkKKworc3RhdGljIHZvaWQgc3RybGlzdF9pbml0KCBzdHJsaXN0X3QgKmxpc3QgKQoreworICAgIGR5bmFycmF5X2luaXQobGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmxpc3RfYXBwZW5kX2IoIHN0cmxpc3RfdCAqbGlzdCwgY29uc3Qgdm9pZCogc3RyLCBzaXplX3QgIHNsZW4gKQoreworICAgIGNoYXIgKmNvcHkgPSBtYWxsb2Moc2xlbisxKTsKKyAgICBtZW1jcHkoY29weSwgc3RyLCBzbGVuKTsKKyAgICBjb3B5W3NsZW5dID0gJ1wwJzsKKyAgICBkeW5hcnJheV9hcHBlbmQobGlzdCwgY29weSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmxpc3RfYXBwZW5kX2R1cCggc3RybGlzdF90ICpsaXN0LCBjb25zdCBjaGFyICpzdHIpCit7CisgICAgc3RybGlzdF9hcHBlbmRfYihsaXN0LCBzdHIsIHN0cmxlbihzdHIpKTsKK30KKworc3RhdGljIHZvaWQgc3RybGlzdF9kb25lKCBzdHJsaXN0X3QgKmxpc3QgKQoreworICAgIFNUUkxJU1RfRk9SRUFDSChsaXN0LCBzdHJpbmcsIGZyZWUoc3RyaW5nKSk7CisgICAgZHluYXJyYXlfZG9uZShsaXN0KTsKK30KKworc3RhdGljIGludCBzdHJsaXN0X2NvbXBhcmVfc3RyaW5ncyhjb25zdCB2b2lkKiBhLCBjb25zdCB2b2lkKiBiKQoreworICAgIGNvbnN0IGNoYXIgKnNhID0gKihjb25zdCBjaGFyICoqKWE7CisgICAgY29uc3QgY2hhciAqc2IgPSAqKGNvbnN0IGNoYXIgKiopYjsKKyAgICByZXR1cm4gc3RyY21wKHNhLCBzYik7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmxpc3Rfc29ydCggc3RybGlzdF90ICpsaXN0ICkKK3sKKyAgICBpZiAobGlzdC0+Y291bnQgPiAwKSB7CisgICAgICAgIHFzb3J0KGxpc3QtPml0ZW1zLCAKKyAgICAgICAgICAgICAgKHNpemVfdClsaXN0LT5jb3VudCwKKyAgICAgICAgICAgICAgc2l6ZW9mKHZvaWQqKSwKKyAgICAgICAgICAgICAgc3RybGlzdF9jb21wYXJlX3N0cmluZ3MpOworICAgIH0KK30KIAogLy8gYml0cyBmb3IgZmxhZ3MgYXJndW1lbnQKICNkZWZpbmUgTElTVF9MT05HICAgICAgICAgICAoMSA8PCAwKQpAQCAtMjMzLDcgKzM1Nyw4IEBACiAgICAgY2hhciB0bXBbNDA5Nl07CiAgICAgRElSICpkOwogICAgIHN0cnVjdCBkaXJlbnQgKmRlOwotCisgICAgc3RybGlzdF90ICBmaWxlcyA9IFNUUkxJU1RfSU5JVElBTElaRVI7CisgICAgCiAgICAgZCA9IG9wZW5kaXIobmFtZSk7CiAgICAgaWYoZCA9PSAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAib3BlbmRpciBmYWlsZWQsICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwpAQCAtMjQ4LDEwICszNzMsMTYgQEAKICAgICAgICAgaWYgKCFzdHJjbXAoZGUtPmRfbmFtZSwgIi4iKSB8fCAhc3RyY21wKGRlLT5kX25hbWUsICIuLiIpKSBjb250aW51ZTsKICAgICAgICAgaWYoZGUtPmRfbmFtZVswXSA9PSAnLicgJiYgKGZsYWdzICYgTElTVF9BTEwpID09IDApIGNvbnRpbnVlOwogCi0gICAgICAgIGxpc3RmaWxlKG5hbWUsIGRlLT5kX25hbWUsIGZsYWdzKTsKKyAgICAgICAgc3RybGlzdF9hcHBlbmRfZHVwKCZmaWxlcywgZGUtPmRfbmFtZSk7CiAgICAgfQogCisgICAgc3RybGlzdF9zb3J0KCZmaWxlcyk7CisgICAgU1RSTElTVF9GT1JFQUNIKCZmaWxlcywgZmlsZW5hbWUsIGxpc3RmaWxlKG5hbWUsIGZpbGVuYW1lLCBmbGFncykpOworICAgIHN0cmxpc3RfZG9uZSgmZmlsZXMpOworCiAgICAgaWYgKGZsYWdzICYgTElTVF9SRUNVUlNJVkUpIHsKKyAgICAgICAgc3RybGlzdF90IHN1YmRpcnMgPSBTVFJMSVNUX0lOSVRJQUxJWkVSOworCiAgICAgICAgIHJld2luZGRpcihkKTsKIAogICAgICAgICB3aGlsZSAoKGRlID0gcmVhZGRpcihkKSkgIT0gMCkgewpAQCAtMjg0LDEwICs0MTUsMTUgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKFNfSVNESVIocy5zdF9tb2RlKSkgewotICAgICAgICAgICAgICAgIHByaW50ZigiXG4lczpcbiIsIHRtcCk7Ci0gICAgICAgICAgICAgICAgbGlzdGRpcih0bXAsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBzdHJsaXN0X2FwcGVuZF9kdXAoJnN1YmRpcnMsIHRtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgc3RybGlzdF9zb3J0KCZzdWJkaXJzKTsKKyAgICAgICAgU1RSTElTVF9GT1JFQUNIKCZzdWJkaXJzLCBwYXRoLCB7CisgICAgICAgICAgICBwcmludGYoIlxuJXM6XG4iLCBwYXRoKTsKKyAgICAgICAgICAgIGxpc3RkaXIocGF0aCwgZmxhZ3MpOworICAgICAgICB9KTsKKyAgICAgICAgc3RybGlzdF9kb25lKCZzdWJkaXJzKTsKICAgICB9CiAKICAgICBjbG9zZWRpcihkKTsKQEAgLTMzMSwyNyArNDY3LDQwIEBACiAgICAgaWYoYXJnYyA+IDEpIHsKICAgICAgICAgaW50IGk7CiAgICAgICAgIGludCBlcnIgPSAwOworICAgICAgICBzdHJsaXN0X3QgIGZpbGVzID0gU1RSTElTVF9JTklUSUFMSVpFUjsKIAogICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWwiKSkgewotICAgICAgICAgICAgICAgIGZsYWdzIHw9IExJU1RfTE9ORzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXMiKSkgewotICAgICAgICAgICAgICAgIGZsYWdzIHw9IExJU1RfU0laRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWEiKSkgewotICAgICAgICAgICAgICAgIGZsYWdzIHw9IExJU1RfQUxMOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItUiIpKSB7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gTElTVF9SRUNVUlNJVkU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1kIikpIHsKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBMSVNUX0RJUkVDVE9SSUVTOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsaXN0ZWQrKzsKLSAgICAgICAgICAgICAgICBpZihsaXN0cGF0aChhcmd2W2ldLCBmbGFncykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICBpZiAoYXJndltpXVswXSA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICAvKiBhbiBvcHRpb24gPyAqLworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV0rMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYXJnWzBdKSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYXJnWzBdKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2wnOiBmbGFncyB8PSBMSVNUX0xPTkc7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzogZmxhZ3MgfD0gTElTVF9TSVpFOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnUic6IGZsYWdzIHw9IExJU1RfUkVDVVJTSVZFOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6IGZsYWdzIHw9IExJU1RfRElSRUNUT1JJRVM7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdhJzogZmxhZ3MgfD0gTElTVF9BTEw7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogVW5rbm93biBvcHRpb24gJy0lYycuIEFib3J0aW5nLlxuIiwgImxzIiwgYXJnWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXJnKys7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBub3QgYW4gb3B0aW9uID8gKi8KKyAgICAgICAgICAgICAgICBzdHJsaXN0X2FwcGVuZF9kdXAoJmZpbGVzLCBhcmd2W2ldKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChsaXN0ZWQgID4gMCkgcmV0dXJuIGVycjsKKyAgICAgICAgaWYgKGZpbGVzLmNvdW50ID4gMCkgeworICAgICAgICAgICAgU1RSTElTVF9GT1JFQUNIKCZmaWxlcywgcGF0aCwgeworICAgICAgICAgICAgICAgIGlmIChsaXN0cGF0aChwYXRoLCBmbGFncykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzdHJsaXN0X2RvbmUoJmZpbGVzKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLy8gbGlzdCB3b3JraW5nIGRpcmVjdG9yeSBpZiBubyBmaWxlcyBvciBkaXJlY3RvcmllcyB3ZXJlIHNwZWNpZmllZCAgICAKZGlmZiAtLWdpdCBhL3Rvb2xib3gvbWtkaXIuYyBiL3Rvb2xib3gvbWtkaXIuYwppbmRleCAxMjFhZGFiLi42NTY5NzBhIDEwMDY0NAotLS0gYS90b29sYm94L21rZGlyLmMKKysrIGIvdG9vbGJveC9ta2Rpci5jCkBAIC0yLDEwICsyLDE0IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvbGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KIAogc3RhdGljIGludCB1c2FnZSgpCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsIm1rZGlyIDx0YXJnZXQ+XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwibWtkaXIgW09QVElPTl0gPHRhcmdldD5cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLS1oZWxwICAgICAgICAgICBkaXNwbGF5IHVzYWdlIGFuZCBleGl0XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1wLCAtLXBhcmVudHMgICAgY3JlYXRlIHBhcmVudCBkaXJlY3RvcmllcyBhcyBuZWVkZWRcbiIpOwogICAgIHJldHVybiAtMTsKIH0KIApAQCAtMTMsMTUgKzE3LDYwIEBACiB7CiAgICAgaW50IHN5bWJvbGljID0gMDsKICAgICBpbnQgcmV0OwotICAgIGlmKGFyZ2MgPCAyKSByZXR1cm4gdXNhZ2UoKTsKKyAgICBpZihhcmdjIDwgMiB8fCBzdHJjbXAoYXJndlsxXSwgIi0taGVscCIpID09IDApIHsKKyAgICAgICAgcmV0dXJuIHVzYWdlKCk7CisgICAgfQorCisgICAgaW50IHJlY3Vyc2l2ZSA9IChzdHJjbXAoYXJndlsxXSwgIi1wIikgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGFyZ3ZbMV0sICItLXBhcmVudHMiKSA9PSAwKSA/IDEgOiAwOworCisgICAgaWYocmVjdXJzaXZlICYmIGFyZ2MgPCAzKSB7CisgICAgICAgIC8vIC1wIHNwZWNpZmllZCB3aXRob3V0IGEgcGF0aAorICAgICAgICByZXR1cm4gdXNhZ2UoKTsKKyAgICB9CisKKyAgICBpZihyZWN1cnNpdmUpIHsKKyAgICAgICAgYXJnYy0tOworICAgICAgICBhcmd2Kys7CisgICAgfQorCisgICAgY2hhciBjdXJycGF0aFtQQVRIX01BWF0sICpwYXRocGllY2U7CisgICAgc3RydWN0IHN0YXQgc3Q7CiAKICAgICB3aGlsZShhcmdjID4gMSkgewogICAgICAgICBhcmdjLS07CiAgICAgICAgIGFyZ3YrKzsKLSAgICAgICAgcmV0ID0gbWtkaXIoYXJndlswXSwgMDc3Nyk7Ci0gICAgICAgIGlmKHJldCA8IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWtkaXIgZmFpbGVkIGZvciAlcywgJXNcbiIsIGFyZ3ZbMF0sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZihyZWN1cnNpdmUpIHsKKyAgICAgICAgICAgIC8vIHJlc2V0IHBhdGgKKyAgICAgICAgICAgIHN0cmNweShjdXJycGF0aCwgIiIpOworICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBwaWVjZXMgb2YgdGhlIHBhdGggYWxvbmcgdGhlIHdheQorICAgICAgICAgICAgcGF0aHBpZWNlID0gc3RydG9rKGFyZ3ZbMF0sICIvIik7CisgICAgICAgICAgICBpZihhcmd2WzBdWzBdID09ICcvJykgeworICAgICAgICAgICAgICAgIC8vIHByZXBlbmQgLyBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICBzdHJjYXQoY3VycnBhdGgsICIvIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZShwYXRocGllY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmKHN0cmxlbihjdXJycGF0aCkgKyBzdHJsZW4ocGF0aHBpZWNlKSArIDIvKk5VTCBhbmQgc2xhc2gqLyA+IFBBVEhfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwYXRoIHNwZWNpZmllZDogdG9vIGxvbmdcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyY2F0KGN1cnJwYXRoLCBwYXRocGllY2UpOworICAgICAgICAgICAgICAgIHN0cmNhdChjdXJycGF0aCwgIi8iKTsKKyAgICAgICAgICAgICAgICBpZihzdGF0KGN1cnJwYXRoLCAmc3QpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gbWtkaXIoY3VycnBhdGgsIDA3NzcpOworICAgICAgICAgICAgICAgICAgICBpZihyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1rZGlyIGZhaWxlZCBmb3IgJXMsICVzXG4iLCBjdXJycGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0aHBpZWNlID0gc3RydG9rKE5VTEwsICIvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBta2Rpcihhcmd2WzBdLCAwNzc3KTsKKyAgICAgICAgICAgIGlmKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1rZGlyIGZhaWxlZCBmb3IgJXMsICVzXG4iLCBhcmd2WzBdLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS90b29sYm94L3JvdXRlLmMgYi90b29sYm94L3JvdXRlLmMKaW5kZXggMTA3ZTQ4YS4uM2UxMDAxNCAxMDA2NDQKLS0tIGEvdG9vbGJveC9yb3V0ZS5jCisrKyBiL3Rvb2xib3gvcm91dGUuYwpAQCAtODAsMTQgKzgwLDI0IEBACiAKICAgICAgICAgLyogcm91dGUgYWRkIC1uZXQgMTkyLjE2OC4xLjIgbmV0bWFzayAyNTUuMjU1LjI1NS4wIGd3IDE5Mi4xNjguMS4xICovCiAgICAgICAgIGlmIChhcmdjID4gNyAmJiAhc3RyY21wKGFyZ3ZbMl0sICItbmV0IikgJiYKLSAgICAgICAgICAgICFzdHJjbXAoYXJndls0XSwgIm5ldG1hc2siKSAmJiAhc3RyY21wKGFyZ3ZbNl0sICJndyIpKSB7Ci0gICAgICAgICAgICBydC5ydF9mbGFncyA9IFJURl9VUCB8IFJURl9HQVRFV0FZOwotICAgICAgICAgICAgaWYgKHNldF9hZGRyZXNzKGFyZ3ZbM10sICZydC5ydF9kc3QpICYmCi0gICAgICAgICAgICAgICAgc2V0X2FkZHJlc3MoYXJndls1XSwgJnJ0LnJ0X2dlbm1hc2spICYmCi0gICAgICAgICAgICAgICAgc2V0X2FkZHJlc3MoYXJndls3XSwgJnJ0LnJ0X2dhdGV3YXkpKSB7Ci0gICAgICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgICAgICFzdHJjbXAoYXJndls0XSwgIm5ldG1hc2siKSkgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoYXJndls2XSwgImd3IikpIHsKKyAgICAgICAgICAgICAgICBydC5ydF9mbGFncyA9IFJURl9VUCB8IFJURl9HQVRFV0FZOworICAgICAgICAgICAgICAgIGlmIChzZXRfYWRkcmVzcyhhcmd2WzNdLCAmcnQucnRfZHN0KSAmJgorICAgICAgICAgICAgICAgICAgICBzZXRfYWRkcmVzcyhhcmd2WzVdLCAmcnQucnRfZ2VubWFzaykgJiYKKyAgICAgICAgICAgICAgICAgICAgc2V0X2FkZHJlc3MoYXJndls3XSwgJnJ0LnJ0X2dhdGV3YXkpKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBhcHBseTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzZdLCAiZGV2IikpIHsKKyAgICAgICAgICAgICAgICBydC5ydF9mbGFncyA9IFJURl9VUDsKKyAgICAgICAgICAgICAgICBydC5ydF9kZXYgPSBhcmd2WzddOworICAgICAgICAgICAgICAgIGlmIChzZXRfYWRkcmVzcyhhcmd2WzNdLCAmcnQucnRfZHN0KSAmJgorICAgICAgICAgICAgICAgICAgICBzZXRfYWRkcmVzcyhhcmd2WzVdLCAmcnQucnRfZ2VubWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIGFwcGx5OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZ290byBhcHBseTsKICAgICAgICAgfQogICAgIH0KIAo=