I2luY2x1ZGUgIm1sdGFsbi5oIgojaW5jbHVkZSAiZHAuaCIKCiNkZWZpbmUgTUVNU0FWRSAxCgojZGVmaW5lIERFQlVHIDAKI2RlZmluZSBVU0VfUEVOQUxUWV9FWCAgMAojZGVmaW5lIFNUT1JFV00gMQoKI2RlZmluZSBEUFRBTk5JIDEwCgojZGVmaW5lIExPQ0FMIDAKCnN0YXRpYyBpbnQgcmVjY3ljbGUgPSAwOwoKc3RhdGljIGZsb2F0IGxvY2FsdGhyOwoKc3RhdGljIHZvaWQgbWF0Y2hfcmlib3N1bSggZmxvYXQgKm1hdGNoLCBmbG9hdCAqKmNwbXgxLCBmbG9hdCAqKmNwbXgyLCBpbnQgaTEsIGludCBsZ3RoMiwgZmxvYXQgKipmbG9hdHdvcmssIGludCAqKmludHdvcmssIGludCBpbml0aWFsaXplICkKewoJaW50IGosIGssIGw7CglmbG9hdCBzY2FyclszOF07CglmbG9hdCAqKmNwbXhwZCA9IGZsb2F0d29yazsKCWludCAqKmNwbXhwZG4gPSBpbnR3b3JrOwoJaW50IGNvdW50ID0gMDsKCWZsb2F0ICptYXRjaHB0OwoJZmxvYXQgKipjcG14cGRwdDsKCWludCAqKmNwbXhwZG5wdDsKCWludCBjcGtkOwoKCWlmKCBpbml0aWFsaXplICkKCXsKCQlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCQl7CgkJCWNvdW50ID0gMDsKCQkJZm9yKCBsPTA7IGw8Mzc7IGwrKyApCgkJCXsKCQkJCWlmKCBjcG14MltqXVtsXSApCgkJCQl7CgkJCQkJY3BteHBkW2pdW2NvdW50XSA9IGNwbXgyW2pdW2xdOwoJCQkJCWNwbXhwZG5bal1bY291bnRdID0gbDsKCQkJCQljb3VudCsrOwoJCQkJfQoJCQl9CgkJCWNwbXhwZG5bal1bY291bnRdID0gLTE7CgkJfQoJfQoKCWZvciggbD0wOyBsPDM3OyBsKysgKQoJewoJCXNjYXJyW2xdID0gMC4wOwoJCWZvciggaz0wOyBrPDM3OyBrKysgKQoJCXsKCQkJc2NhcnJbbF0gKz0gcmlib3N1bWRpc1trXVtsXSAqIGNwbXgxW2kxXVtrXTsKCQl9Cgl9CiNpZiAwIC8qIKSzpOyk8rvIpKakyKStpM9mbG9hdHdvcmukzqWipe2lsaG8pcik8rXVpMukuaTrICovCgl7CgkJZmxvYXQgKmZwdCwgKipmcHRwdCwgKmZwdDI7CgkJaW50ICppcHQsICoqaXB0cHQ7CgkJZnB0MiA9IG1hdGNoOwoJCWlwdHB0ID0gY3BteHBkbjsKCQlmcHRwdCA9IGNwbXhwZDsKCQl3aGlsZSggbGd0aDItLSApCgkJewoJCQkqZnB0MiA9IDAuMDsKCQkJaXB0PSppcHRwdCxmcHQ9KmZwdHB0OwoJCQl3aGlsZSggKmlwdCA+IC0xICkKCQkJCSpmcHQyICs9IHNjYXJyWyppcHQrK10gKiAqZnB0Kys7CgkJCWZwdDIrKyxpcHRwdCsrLGZwdHB0Kys7CgkJfSAKCX0KCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJewoJCW1hdGNoW2pdID0gMC4wOwoJCWZvciggaz0wOyBjcG14cGRuW2pdW2tdPi0xOyBrKysgKQoJCQltYXRjaFtqXSArPSBzY2FycltjcG14cGRuW2pdW2tdXSAqIGNwbXhwZFtqXVtrXTsKCX0gCiNlbHNlCgltYXRjaHB0ID0gbWF0Y2g7CgljcG14cGRucHQgPSBjcG14cGRuOwoJY3BteHBkcHQgPSBjcG14cGQ7Cgl3aGlsZSggbGd0aDItLSApCgl7CgkJKm1hdGNocHQgPSAwLjA7CgkJZm9yKCBrPTA7IChjcGtkPSgqY3BteHBkbnB0KVtrXSk+LTE7IGsrKyApCgkJCSptYXRjaHB0ICs9IHNjYXJyW2Nwa2RdICogKCpjcG14cGRwdClba107CgkJbWF0Y2hwdCsrOwoJCWNwbXhwZG5wdCsrOwoJCWNwbXhwZHB0Kys7Cgl9CiNlbmRpZgp9CgpzdGF0aWMgdm9pZCBtYXRjaF9jYWxjKCBmbG9hdCAqbWF0Y2gsIGZsb2F0ICoqY3BteDEsIGZsb2F0ICoqY3BteDIsIGludCBpMSwgaW50IGxndGgyLCBmbG9hdCAqKmZsb2F0d29yaywgaW50ICoqaW50d29yaywgaW50IGluaXRpYWxpemUgKQp7CglpbnQgaiwgaywgbDsKCWZsb2F0IHNjYXJyWzI2XTsKCWZsb2F0ICoqY3BteHBkID0gZmxvYXR3b3JrOwoJaW50ICoqY3BteHBkbiA9IGludHdvcms7CglpbnQgY291bnQgPSAwOwoJZmxvYXQgKm1hdGNocHQ7CglmbG9hdCAqKmNwbXhwZHB0OwoJaW50ICoqY3BteHBkbnB0OwoJaW50IGNwa2Q7CgoJaWYoIGluaXRpYWxpemUgKQoJewoJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCXsKCQkJY291bnQgPSAwOwoJCQlmb3IoIGw9MDsgbDwyNjsgbCsrICkKCQkJewoJCQkJaWYoIGNwbXgyW2pdW2xdICkKCQkJCXsKCQkJCQljcG14cGRbal1bY291bnRdID0gY3BteDJbal1bbF07CgkJCQkJY3BteHBkbltqXVtjb3VudF0gPSBsOwoJCQkJCWNvdW50Kys7CgkJCQl9CgkJCX0KCQkJY3BteHBkbltqXVtjb3VudF0gPSAtMTsKCQl9Cgl9CgoJZm9yKCBsPTA7IGw8MjY7IGwrKyApCgl7CgkJc2NhcnJbbF0gPSAwLjA7CgkJZm9yKCBrPTA7IGs8MjY7IGsrKyApCgkJewoJCQlzY2FycltsXSArPSAobl9kaXNba11bbF0tUk5BdGhyKSAqIGNwbXgxW2kxXVtrXTsKCQl9Cgl9CiNpZiAwIC8qIKSzpOyk8rvIpKakyKStpM9mbG9hdHdvcmukzqWipe2lsaG8pcik8rXVpMukuaTrICovCgl7CgkJZmxvYXQgKmZwdCwgKipmcHRwdCwgKmZwdDI7CgkJaW50ICppcHQsICoqaXB0cHQ7CgkJZnB0MiA9IG1hdGNoOwoJCWlwdHB0ID0gY3BteHBkbjsKCQlmcHRwdCA9IGNwbXhwZDsKCQl3aGlsZSggbGd0aDItLSApCgkJewoJCQkqZnB0MiA9IDAuMDsKCQkJaXB0PSppcHRwdCxmcHQ9KmZwdHB0OwoJCQl3aGlsZSggKmlwdCA+IC0xICkKCQkJCSpmcHQyICs9IHNjYXJyWyppcHQrK10gKiAqZnB0Kys7CgkJCWZwdDIrKyxpcHRwdCsrLGZwdHB0Kys7CgkJfSAKCX0KCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJewoJCW1hdGNoW2pdID0gMC4wOwoJCWZvciggaz0wOyBjcG14cGRuW2pdW2tdPi0xOyBrKysgKQoJCQltYXRjaFtqXSArPSBzY2FycltjcG14cGRuW2pdW2tdXSAqIGNwbXhwZFtqXVtrXTsKCX0gCiNlbHNlCgltYXRjaHB0ID0gbWF0Y2g7CgljcG14cGRucHQgPSBjcG14cGRuOwoJY3BteHBkcHQgPSBjcG14cGQ7Cgl3aGlsZSggbGd0aDItLSApCgl7CgkJKm1hdGNocHQgPSAwLjA7CgkJZm9yKCBrPTA7IChjcGtkPSgqY3BteHBkbnB0KVtrXSk+LTE7IGsrKyApCgkJCSptYXRjaHB0ICs9IHNjYXJyW2Nwa2RdICogKCpjcG14cGRwdClba107CgkJbWF0Y2hwdCsrOwoJCWNwbXhwZG5wdCsrOwoJCWNwbXhwZHB0Kys7Cgl9CiNlbmRpZgp9CgojaWYgMApzdGF0aWMgdm9pZCBtYXRjaF9hZGQoIGZsb2F0ICptYXRjaCwgZmxvYXQgKipjcG14MSwgZmxvYXQgKipjcG14MiwgaW50IGkxLCBpbnQgbGd0aDIsIGZsb2F0ICoqZmxvYXR3b3JrLCBpbnQgKippbnR3b3JrLCBpbnQgaW5pdGlhbGl6ZSApCnsKCWludCBqLCBrLCBsOwoJZmxvYXQgc2NhcnJbMjZdOwoJZmxvYXQgKipjcG14cGQgPSBmbG9hdHdvcms7CglpbnQgKipjcG14cGRuID0gaW50d29yazsKCWludCBjb3VudCA9IDA7CglmbG9hdCAqbWF0Y2hwdDsKCWZsb2F0ICoqY3BteHBkcHQ7CglpbnQgKipjcG14cGRucHQ7CglpbnQgY3BrZDsKCgoJaWYoIGluaXRpYWxpemUgKQoJewoJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCXsKCQkJY291bnQgPSAwOwoJCQlmb3IoIGw9MDsgbDwyNjsgbCsrICkKCQkJewoJCQkJaWYoIGNwbXgyW2pdW2xdICkKCQkJCXsKCQkJCQljcG14cGRbal1bY291bnRdID0gY3BteDJbal1bbF07CgkJCQkJY3BteHBkbltqXVtjb3VudF0gPSBsOwoJCQkJCWNvdW50Kys7CgkJCQl9CgkJCX0KCQkJY3BteHBkbltqXVtjb3VudF0gPSAtMTsKCQl9Cgl9CgoJZm9yKCBsPTA7IGw8MjY7IGwrKyApCgl7CgkJc2NhcnJbbF0gPSAwLjA7CgkJZm9yKCBrPTA7IGs8MjY7IGsrKyApCgkJewoJCQlzY2FycltsXSArPSBuX2Rpc1trXVtsXSAqIGNwbXgxW2kxXVtrXTsKCQl9Cgl9CiNpZiAwIC8qIKSzpOyk8rvIpKakyKStpM9mbG9hdHdvcmukzqWipe2lsaG8pcik8rXVpMukuaTrICovCgl7CgkJZmxvYXQgKmZwdCwgKipmcHRwdCwgKmZwdDI7CgkJaW50ICppcHQsICoqaXB0cHQ7CgkJZnB0MiA9IG1hdGNoOwoJCWlwdHB0ID0gY3BteHBkbjsKCQlmcHRwdCA9IGNwbXhwZDsKCQl3aGlsZSggbGd0aDItLSApCgkJewoJCQkqZnB0MiA9IDAuMDsKCQkJaXB0PSppcHRwdCxmcHQ9KmZwdHB0OwoJCQl3aGlsZSggKmlwdCA+IC0xICkKCQkJCSpmcHQyICs9IHNjYXJyWyppcHQrK10gKiAqZnB0Kys7CgkJCWZwdDIrKyxpcHRwdCsrLGZwdHB0Kys7CgkJfSAKCX0KCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJewoJCW1hdGNoW2pdID0gMC4wOwoJCWZvciggaz0wOyBjcG14cGRuW2pdW2tdPi0xOyBrKysgKQoJCQltYXRjaFtqXSArPSBzY2FycltjcG14cGRuW2pdW2tdXSAqIGNwbXhwZFtqXVtrXTsKCX0gCiNlbHNlCgltYXRjaHB0ID0gbWF0Y2g7CgljcG14cGRucHQgPSBjcG14cGRuOwoJY3BteHBkcHQgPSBjcG14cGQ7Cgl3aGlsZSggbGd0aDItLSApCgl7Ci8vCQkqbWF0Y2hwdCA9IDAuMDsgLy8gYWRkIGRha2FyYQoJCWZvciggaz0wOyAoY3BrZD0oKmNwbXhwZG5wdClba10pPi0xOyBrKysgKQoJCQkqbWF0Y2hwdCArPSBzY2FycltjcGtkXSAqICgqY3BteHBkcHQpW2tdOwoJCW1hdGNocHQrKzsKCQljcG14cGRucHQrKzsKCQljcG14cGRwdCsrOwoJfQojZW5kaWYKfQojZW5kaWYKCiNpZiAwCnN0YXRpYyBmbG9hdCBBdHJhY2tpbmcoIAoJCQkJCQljaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqbXNlcTEsIGNoYXIgKiptc2VxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGludCAqKmlqcCwgaW50IGljeWMsIGludCBqY3ljLAoJCQkJCQlpbnQgaXN0LCBpbnQgaWVuLCBpbnQganN0LCBpbnQgamVuICkKewoJaW50IGksIGosIGwsIGlpbiwgamluLCBpZmksIGpmaSwgbGd0aDEsIGxndGgyLCBrLCBrbGltOwoJY2hhciAqZ2FwdGFibGUxLCAqZ3QxYms7CgljaGFyICpnYXB0YWJsZTIsICpndDJiazsKCWxndGgxID0gaWVuLWlzdCsxOwoJbGd0aDIgPSBqZW4tanN0KzE7CgoJZ3QxYmsgPSBBbGxvY2F0ZUNoYXJWZWMoIGxndGgxK2xndGgyKzEgKTsKCWd0MmJrID0gQWxsb2NhdGVDaGFyVmVjKCBsZ3RoMStsZ3RoMisxICk7CgojaWYgMAoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJewoJCWZwcmludGYoIHN0ZGVyciwgImxhc3R2ZXJ0aWNhbHdbJWRdID0gJWZcbiIsIGksIGxhc3R2ZXJ0aWNhbHdbaV0gKTsKCX0KI2VuZGlmCgoKLy8JZnByaW50Ziggc3RkZXJyLCAiaW4gQXRyYWNraW5nLCBsZ3RoMT0lZCwgbGd0aDI9JWRcbiIsIGxndGgxLCBsZ3RoMiApOwogCiAgICBmb3IoIGk9MDsgaTxsZ3RoMSsxOyBpKysgKSAKICAgIHsKICAgICAgICBpanBbaV1bMF0gPSBpICsgMTsKICAgIH0KICAgIGZvciggaj0wOyBqPGxndGgyKzE7IGorKyApIAogICAgewogICAgICAgIGlqcFswXVtqXSA9IC0oIGogKyAxICk7CiAgICB9CgoKCWdhcHRhYmxlMSA9IGd0MWJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUxID0gMDsKCWdhcHRhYmxlMiA9IGd0MmJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUyID0gMDsKCi8vCWlmKCBsZ3RoMiA9PSAxICkgZnByaW50Ziggc3RkZXJyLCAiaW4gQXRyYWNraW5nLCBtc2VxMSA9ICVzLCBtc2VxMiA9ICVzXG4iLCBtc2VxMVswXSwgbXNlcTJbMF0gKTsKCglpaW4gPSBsZ3RoMTsgamluID0gbGd0aDI7CglrbGltID0gbGd0aDErbGd0aDI7Cglmb3IoIGs9MDsgazw9a2xpbTsgaysrICkgCgl7CgkJaWYoIGlqcFtpaW5dW2ppbl0gPCAwICkgCgkJewoJCQlpZmkgPSBpaW4tMTsgamZpID0gamluK2lqcFtpaW5dW2ppbl07CgkJfQoJCWVsc2UgaWYoIGlqcFtpaW5dW2ppbl0gPiAwICkKCQl7CgkJCWlmaSA9IGlpbi1panBbaWluXVtqaW5dOyBqZmkgPSBqaW4tMTsKCQl9CgkJZWxzZQoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbi0xOwoJCX0KCQlsID0gaWluIC0gaWZpOwoJCXdoaWxlKCAtLWwgKSAKCQl7CgkJCSotLWdhcHRhYmxlMSA9ICdvJzsKCQkJKi0tZ2FwdGFibGUyID0gJy0nOwoJCQlrKys7CgkJfQoJCWw9IGppbiAtIGpmaTsKCQl3aGlsZSggLS1sICkKCQl7CgkJCSotLWdhcHRhYmxlMSA9ICctJzsKCQkJKi0tZ2FwdGFibGUyID0gJ28nOwoJCQlrKys7CgkJfQoJCWlmKCBpaW4gPD0gMCB8fCBqaW4gPD0gMCApIGJyZWFrOwoJCSotLWdhcHRhYmxlMSA9ICdvJzsKCQkqLS1nYXB0YWJsZTIgPSAnbyc7CgkJaysrOwoJCWlpbiA9IGlmaTsgamluID0gamZpOwoKCX0KCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBnYXBpcmVydSggbXNlcTFbaV0sIHNlcTFbaV0raXN0LCBnYXB0YWJsZTEgKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIGdhcGlyZXJ1KCBtc2VxMltqXSwgc2VxMltqXStqc3QsIGdhcHRhYmxlMiApOwoKCWZyZWUoIGd0MWJrICk7CglmcmVlKCBndDJiayApOwoKLy8JZnByaW50Ziggc3RkZXJyLCAiaW4gQXRyYWNraW5nIChvd2FyaSksIG1zZXExID0gJXNcbiIsIG1zZXExWzBdICk7Ci8vCWZwcmludGYoIHN0ZGVyciwgImluIEF0cmFja2luZyAob3dhcmkpLCBtc2VxMiA9ICVzXG4iLCBtc2VxMlswXSApOwoJcmV0dXJuKCAwLjAgKTsKfQojZW5kaWYKCgpzdGF0aWMgZmxvYXQgTVNhbGlnbjJtMm1fcmVjKCBpbnQgaWN5YywgaW50IGpjeWMsIGRvdWJsZSAqZWZmMSwgZG91YmxlICplZmYyLCBjaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIGZsb2F0ICoqY3BteDEsIGZsb2F0ICoqY3BteDIsIGludCBpc3QsIGludCBpZW4sIGludCBqc3QsIGludCBqZW4sIGludCBhbGxvY2xlbiwgY2hhciAqKm1zZXExLCBjaGFyICoqbXNlcTIsIGludCBkZXB0aCwgZmxvYXQgKipnYXBpbmZvLCBmbG9hdCAqKm1hcCApCi8qIHNjb3JlIG5vIGtlaXNhbiBubyBzYWkgbW90b2thcmFhcnUgZ2FwIG5vIGF0dWthaSBuaSBtb25kYWkgZ2EgYXJ1ICovCnsKCWZsb2F0IHZhbHVlID0gMC4wOwoJcmVnaXN0ZXIgaW50IGksIGo7CgljaGFyICoqYXNlcTEsICoqYXNlcTI7CglpbnQgbGwxLCBsbDI7CglpbnQgbGFzdGksIGxhc3RqLCBpbWlkLCBqbWlkID0gMDsKCWZsb2F0IHdtID0gMC4wOyAgIC8qIGludCA/Pz8/Pz8gKi8KCWZsb2F0IGc7CglmbG9hdCAqY3VycmVudHcsICpwcmV2aW91c3c7CiNpZiBVU0VfUEVOQUxUWV9FWAoJZmxvYXQgZnBlbmFsdHlfZXggPSAoZmxvYXQpcGVuYWx0eV9leDsKI2VuZGlmCi8vCWZsb2F0IGZwZW5hbHR5ID0gKGZsb2F0KXBlbmFsdHk7CglmbG9hdCAqd3RtcDsKLy8Jc2hvcnQgKmlqcHB0OwoJaW50ICptcGpwdDsKLy8Jc2hvcnQgKippanA7CglpbnQgKm1wOwoJaW50IG1waTsKCWZsb2F0ICptanB0LCAqcHJlcHQsICpjdXJwdDsKCWZsb2F0IG1pOwoJZmxvYXQgKm07CglmbG9hdCAqdzEsICp3MjsKLy8JZmxvYXQgKm1hdGNoOwoJZmxvYXQgKmluaXR2ZXJ0aWNhbHc7ICAgIC8qIGt1ZnV1IHN1cmViYSBpcmFuYWkgKi8KCWZsb2F0ICpsYXN0dmVydGljYWx3OyAgICAvKiBrdWZ1dSBzdXJlYmEgaXJhbmFpICovCglpbnQgKippbnR3b3JrOwoJZmxvYXQgKipmbG9hdHdvcms7Ci8vCXNob3J0ICoqc2hvcnRtdHg7CiNpZiBTVE9SRVdNCglmbG9hdCAqKldNTVRYOwoJZmxvYXQgKipXTU1UWDI7CiNlbmRpZgoJZmxvYXQgKm1pZHc7CglmbG9hdCAqbWlkbTsKCWZsb2F0ICptaWRuOwoJaW50IGxndGgxLCBsZ3RoMjsKCWZsb2F0IG1heHdtID0gMC4wOwoJaW50ICpqdW1wZm9yd2k7CglpbnQgKmp1bXBmb3J3ajsKCWludCAqanVtcGJhY2tpOwoJaW50ICpqdW1wYmFja2o7CglpbnQgKmp1bXBkdW1taTsgLy9tdWRhCglpbnQgKmp1bXBkdW1tajsgLy9tdWRhCglpbnQganVtcGksIGp1bXBqID0gMDsKCWNoYXIgKmdhcHM7CglpbnQgaWpwaSwgaWpwajsKCWZsb2F0ICpvZ2NwMTsKCWZsb2F0ICpmZ2NwMTsKCWZsb2F0ICpvZ2NwMjsKCWZsb2F0ICpmZ2NwMjsKCWZsb2F0IGZpcnN0bTsKCWludCBmaXJzdG1wOwojaWYgMAoJc3RhdGljIGNoYXIgdHR0MVs1MDAwMF07CglzdGF0aWMgY2hhciB0dHQyWzUwMDAwXTsKI2VuZGlmCgoJbG9jYWx0aHIgPSAtb2Zmc2V0ICsgNTAwOyAvLyAwPwoKCW9nY3AxID0gZ2FwaW5mb1swXSArIGlzdDsKCWZnY3AxID0gZ2FwaW5mb1sxXSArIGlzdDsKCW9nY3AyID0gZ2FwaW5mb1syXSArIGpzdDsKCWZnY3AyID0gZ2FwaW5mb1szXSArIGpzdDsKCglkZXB0aCsrOwoJcmVjY3ljbGUrKzsKCglsZ3RoMSA9IGllbi1pc3QrMTsKCWxndGgyID0gamVuLWpzdCsxOwoKLy8JaWYoIGxndGgxIDwgNSApCi8vCQlmcHJpbnRmKCBzdGRlcnIsICJcbldBUk5JTkc6IGxndGgxID0gJWRcbiIsIGxndGgxICk7Ci8vCWlmKCBsZ3RoMiA8IDUgKQovLwkJZnByaW50Ziggc3RkZXJyLCAiXG5XQVJOSU5HOiBsZ3RoMiA9ICVkXG4iLCBsZ3RoMiApOwovLwoKI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgIj09PT0gTVNhbGlnbiAoZGVwdGg9JWQsIHJlY2N5Y2xlPSVkKSwgaXN0PSVkLCBpZW49JWQsIGpzdD0lZCwgamVuPSVkXG4iLCBkZXB0aCwgcmVjY3ljbGUsIGlzdCwgaWVuLCBqc3QsIGplbiApOwoJc3RybmNweSggdHR0MSwgc2VxMVswXStpc3QsIGxndGgxICk7CglzdHJuY3B5KCB0dHQyLCBzZXEyWzBdK2pzdCwgbGd0aDIgKTsKCXR0dDFbbGd0aDFdID0gMDsKCXR0dDJbbGd0aDJdID0gMDsKCWZwcmludGYoIHN0ZGVyciwgInNlcTEgPSAlc1xuIiwgdHR0MSApOwoJZnByaW50Ziggc3RkZXJyLCAic2VxMiA9ICVzXG4iLCB0dHQyICk7CiNlbmRpZgoJaWYoIGxndGgyIDw9IDAgKSAvLyBsZ3RoMSA8PSAwIGhhPwoJewovLwkJZnByaW50Ziggc3RkZXJyLCAiXG5cbj09PT0gamltZWlcblxuIiApOwovLwkJZXhpdCggMSApOwoJCWZvciggaT0wOyBpPGljeWM7IGkrKyApIAoJCXsKCQkJc3RybmNweSggbXNlcTFbaV0sIHNlcTFbaV0raXN0LCBsZ3RoMSApOwoJCQltc2VxMVtpXVtsZ3RoMV0gPSAwOwoJCX0KCQlmb3IoIGk9MDsgaTxqY3ljOyBpKysgKSAKCQl7CgkJCW1zZXEyW2ldWzBdID0gMDsKCQkJZm9yKCBqPTA7IGo8bGd0aDE7IGorKyApCgkJCQlzdHJjYXQoIG1zZXEyW2ldLCAiLSIgKTsKCQl9CgovLwkJZnByaW50Ziggc3RkZXJyLCAiPT09PSBtc2VxMVswXSAoJWQpID0gJXNcbiIsIGRlcHRoLCBtc2VxMVswXSApOwovLwkJZnByaW50Ziggc3RkZXJyLCAiPT09PSBtc2VxMlswXSAoJWQpID0gJXNcbiIsIGRlcHRoLCBtc2VxMlswXSApOwoKCQlyZXR1cm4oIDAuMCApOwoJfQoKI2lmIE1FTVNBVkUKCWFzZXExID0gQWxsb2NhdGVDaGFyTXR4KCBpY3ljLCAwICk7Cglhc2VxMiA9IEFsbG9jYXRlQ2hhck10eCggamN5YywgMCApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgYXNlcTFbaV0gPSBtc2VxMVtpXTsKCWZvciggaT0wOyBpPGpjeWM7IGkrKyApIGFzZXEyW2ldID0gbXNlcTJbaV07CiNlbHNlCglhc2VxMSA9IEFsbG9jYXRlQ2hhck10eCggaWN5YywgbGd0aDErbGd0aDIrMTAwICk7Cglhc2VxMiA9IEFsbG9jYXRlQ2hhck10eCggamN5YywgbGd0aDErbGd0aDIrMTAwICk7CiNlbmRpZgoKLy8gIGlmKCBsZ3RoMSA8IERQVEFOTkkgJiYgbGd0aDIgPCBEUFRBTk5JICkgLy8gJiBkYXRvIGxndGggPT0xIG5vIGthbm91c2VpIGdhIGFydW5vZGUgeW9rdW5haSAKLy8gICAgaWYoIGxndGgxIDwgRFBUQU5OSSApIC8vIGtvcmUgbW8gbGd0aDIgZ2EgbWlqaWthc3VnaXJ1IGthbm91c2VpIGFyaQogICAgaWYoIGxndGgxIDwgRFBUQU5OSSB8fCBsZ3RoMiA8IERQVEFOTkkgKSAvLyB6ZXR0YWkgbmkgYW56ZW4ga2E/Cgl7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICI9PT09IEdvaW5nIHRvIF90YW5uaVxuIiApOwoKLy8JCXZhbHVlID0gTVNhbGlnbm1tX3Rhbm5pKCBpY3ljLCBqY3ljLCBlZmYxLCBlZmYyLCBzZXExLCBzZXEyLCBjcG14MSwgY3BteDIsIGlzdCwgaWVuLCBqc3QsIGplbiwgYWxsb2NsZW4sIGFzZXExLCBhc2VxMiwgZ2FwaW5mbyApOwkKCgojaWYgTUVNU0FWRQoJCWZyZWUoIGFzZXExICk7CgkJZnJlZSggYXNlcTIgKTsKI2Vsc2UKCQlmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBzdHJjcHkoIG1zZXExW2ldLCBhc2VxMVtpXSApOwoJCWZvciggaT0wOyBpPGpjeWM7IGkrKyApIHN0cmNweSggbXNlcTJbaV0sIGFzZXEyW2ldICk7CgoJCUZyZWVDaGFyTXR4KCBhc2VxMSApOwoJCUZyZWVDaGFyTXR4KCBhc2VxMiApOwojZW5kaWYKCi8vCQlmcHJpbnRmKCBzdGRlcnIsICJ2YWx1ZSA9ICVmXG4iLCB2YWx1ZSApOwoKCQlyZXR1cm4oIHZhbHVlICk7Cgl9Ci8vCWZwcmludGYoIHN0ZGVyciwgIlRyeWluZyB0byBkaXZpZGUgdGhlIG10eFxuIiApOwoKCWxsMSA9ICggKGludCkobGd0aDEpICkgKyAxMDA7CglsbDIgPSAoIChpbnQpKGxndGgyKSApICsgMTAwOwoKLy8JZnByaW50Ziggc3RkZXJyLCAibGwxLGxsMj0lZCwlZFxuIiwgbGwxLCBsbDIgKTsKCgl3MSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7Cgl3MiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7Ci8vCW1hdGNoID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCW1pZHcgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJbWlkbiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgltaWRtID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCWp1bXBiYWNraSA9IEFsbG9jYXRlSW50VmVjKCBsbDIrMiApOwoJanVtcGJhY2tqID0gQWxsb2NhdGVJbnRWZWMoIGxsMisyICk7CglqdW1wZm9yd2kgPSBBbGxvY2F0ZUludFZlYyggbGwyKzIgKTsKCWp1bXBmb3J3aiA9IEFsbG9jYXRlSW50VmVjKCBsbDIrMiApOwoJanVtcGR1bW1pID0gQWxsb2NhdGVJbnRWZWMoIGxsMisyICk7CglqdW1wZHVtbWogPSBBbGxvY2F0ZUludFZlYyggbGwyKzIgKTsKCglpbml0dmVydGljYWx3ID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCWxhc3R2ZXJ0aWNhbHcgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoKCW0gPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJbXAgPSBBbGxvY2F0ZUludFZlYyggbGwyKzIgKTsKCWdhcHMgPSBBbGxvY2F0ZUNoYXJWZWMoIE1BWCggbGwxLCBsbDIgKSArIDIgKTsKCglmbG9hdHdvcmsgPSBBbGxvY2F0ZUZsb2F0TXR4KCBNQVgoIGxsMSwgbGwyICkrMiwgMjYgKTsgCglpbnR3b3JrID0gQWxsb2NhdGVJbnRNdHgoIE1BWCggbGwxLCBsbDIgKSsyLCAyNiApOyAKCiNpZiBERUJVRwoJZnByaW50Ziggc3RkZXJyLCAic3VjY2VlZGVkXG4iICk7CiNlbmRpZgoKI2lmIFNUT1JFV00KCVdNTVRYID0gQWxsb2NhdGVGbG9hdE10eCggbGwxLCBsbDIgKTsKCVdNTVRYMiA9IEFsbG9jYXRlRmxvYXRNdHgoIGxsMSwgbGwyICk7CiNlbmRpZgojaWYgMAoJc2hvcnRtdHggPSBBbGxvY2F0ZVNob3J0TXR4KCBsbDEsIGxsMiApOwoKI2lmIERFQlVHCglmcHJpbnRmKCBzdGRlcnIsICJzdWNjZWVkZWRcblxuIiApOwojZW5kaWYKCglpanAgPSBzaG9ydG10eDsKI2VuZGlmCgoJY3VycmVudHcgPSB3MTsKCXByZXZpb3VzdyA9IHcyOwoKCW1hdGNoX3JpYm9zdW0oIGluaXR2ZXJ0aWNhbHcsIGNwbXgyK2pzdCwgY3BteDEraXN0LCAwLCBsZ3RoMSwgZmxvYXR3b3JrLCBpbnR3b3JrLCAxICk7CgoJbWF0Y2hfcmlib3N1bSggY3VycmVudHcsIGNwbXgxK2lzdCwgY3BteDIranN0LCAwLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAxICk7CgoJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCXsKCQlpbml0dmVydGljYWx3W2ldICs9ICggb2djcDFbMF0gKyBmZ2NwMVtpLTFdICk7Cgl9Cglmb3IoIGo9MTsgajxsZ3RoMisxOyBqKysgKQoJewoJCWN1cnJlbnR3W2pdICs9ICggb2djcDJbMF0gKyBmZ2NwMltqLTFdICk7Cgl9CgojaWYgU1RPUkVXTQoJV01NVFhbMF1bMF0gPSBpbml0dmVydGljYWx3WzBdOwoJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCXsKCQlXTU1UWFtpXVswXSA9IGluaXR2ZXJ0aWNhbHdbaV07Cgl9Cglmb3IoIGo9MTsgajxsZ3RoMisxOyBqKysgKQoJewoJCVdNTVRYWzBdW2pdID0gY3VycmVudHdbal07Cgl9CiNlbmRpZgoKCglmb3IoIGo9MTsgajxsZ3RoMisxOyArK2ogKSAKCXsKCQltW2pdID0gY3VycmVudHdbai0xXSArIG9nY3AxWzFdOwovLwkJbVtqXSA9IGN1cnJlbnR3W2otMV07CgkJbXBbal0gPSAwOwoJfQoKCWxhc3R2ZXJ0aWNhbHdbMF0gPSBjdXJyZW50d1tsZ3RoMi0xXTsKCglpbWlkID0gbGd0aDEgKiAwLjU7CgoJanVtcGkgPSAwOyAvLyBhdG9kZSBrYXdhcnUuCglsYXN0aSA9IGxndGgxKzE7CiNpZiBTVE9SRVdNCglmb3IoIGk9MTsgaTxsYXN0aTsgaSsrICkKI2Vsc2UKCWZvciggaT0xOyBpPD1pbWlkOyBpKysgKQojZW5kaWYKCXsKCQl3dG1wID0gcHJldmlvdXN3OyAKCQlwcmV2aW91c3cgPSBjdXJyZW50dzsKCQljdXJyZW50dyA9IHd0bXA7CgoJCXByZXZpb3Vzd1swXSA9IGluaXR2ZXJ0aWNhbHdbaS0xXTsKCgkJbWF0Y2hfcmlib3N1bSggY3VycmVudHcsIGNwbXgxK2lzdCwgY3BteDIranN0LCBpLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAwICk7CgkJY3VycmVudHdbMF0gPSBpbml0dmVydGljYWx3W2ldOwoKCQltWzBdID0gb2djcDFbaV07CiNpZiBTVE9SRU0KCQlXTU1UWDJbaV1bMF0gPSBtWzBdOwojZW5kaWYKCQlpZiggaSA9PSBpbWlkICkgbWlkbVswXSA9IG1bMF07CgoJCW1pID0gcHJldmlvdXN3WzBdICsgb2djcDJbMV07IAovLwkJbWkgPSBwcmV2aW91c3dbMF07CgkJbXBpID0gMDsKCgovLwkJaWpwcHQgPSBpanBbaV0gKyAxOwoJCW1qcHQgPSBtICsgMTsKCQlwcmVwdCA9IHByZXZpb3VzdzsKCQljdXJwdCA9IGN1cnJlbnR3ICsgMTsKCQltcGpwdCA9IG1wICsgMTsKCgoJCWxhc3RqID0gbGd0aDIrMTsKCQlmb3IoIGo9MTsgajxsYXN0ajsgaisrICkKCQl7CgoJCQl3bSA9ICpwcmVwdDsKCiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmLT4iLCB3bSApOwojZW5kaWYKCQkJZyA9IG1pICsgZmdjcDJbai0xXTsKLy8JCQlnID0gbWkgKyBmcGVuYWx0eTsKI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGY/IiwgZyApOwojZW5kaWYKCQkJaWYoIGcgPiB3bSApCgkJCXsKCQkJCXdtID0gZzsKLy8JCQkJKmlqcHB0ID0gLSggaiAtIG1waSApOwoJCQl9CgkJCWcgPSAqcHJlcHQgKyBvZ2NwMltqXTsKLy8JCQlnID0gKnByZXB0OwoJCQlpZiggZyA+PSBtaSApCgkJCXsKCQkJCW1pID0gZzsKCQkJCW1waSA9IGotMTsKCQkJfQojaWYgVVNFX1BFTkFMVFlfRVgKCQkJbWkgKz0gZnBlbmFsdHlfZXg7CiNlbmRpZgoKCQkJZyA9ICptanB0ICsgZmdjcDFbaS0xXTsKLy8JCQlnID0gKm1qcHQgKyBmcGVuYWx0eTsKI2lmIDAgCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmPyIsIGcgKTsKI2VuZGlmCgkJCWlmKCBnID4gd20gKQoJCQl7CgkJCQl3bSA9IGc7Ci8vCQkJCSppanBwdCA9ICsoIGkgLSAqbXBqcHQgKTsKCQkJfQoKCgkJCWcgPSAqcHJlcHQgKyBvZ2NwMVtpXTsKLy8JCQlnID0gKnByZXB0OwoJCQlpZiggZyA+PSAqbWpwdCApCgkJCXsKCQkJCSptanB0ID0gZzsKCQkJCSptcGpwdCA9IGktMTsKCQkJfQojaWYgVVNFX1BFTkFMVFlfRVgKCQkJbVtqXSArPSBmcGVuYWx0eV9leDsKI2VuZGlmCiNpZiBMT0NBTAogICAgICAgICAgICBpZiggd20gPCBsb2NhbHRociApCiAgICAgICAgICAgIHsgICAgICAgCi8vCQkJCWZwcmludGYoIHN0ZGVyciwgInN0b3AgaT0lZCwgaj0lZCwgY3VycHQ9JWZcbiIsIGksIGosICpjdXJwdCApOwoJCQkJd20gPSAwOwogICAgICAgICAgICB9ICAgICAgIAojZW5kaWYKCiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmICIsIHdtICk7CiNlbmRpZgoJCQkqY3VycHQgKz0gd207CgoKI2lmIFNUT1JFV00KCQkJV01NVFhbaV1bal0gPSAqY3VycHQ7CgkJCVdNTVRYMltpXVtqXSA9ICptanB0OwojZW5kaWYKCgkJCWlmKCBpID09IGltaWQgKSAvL211ZGEKCQkJewkKCQkJCWp1bXBiYWNraltqXSA9ICptcGpwdDsgLy8gbXVkYSBhdG9kZSBtYXRvbWVydQoJCQkJanVtcGJhY2tpW2pdID0gbXBpOyAvLyBtdWRhIGF0b2RlIG1hdG9tZXJ1Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImp1bXBiYWNralslZF0gaW4gZm9yd2FyZCBkcCBpcyAlZFxuIiwgaiwgKm1wanB0ICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImp1bXBiYWNraVslZF0gaW4gZm9yd2FyZCBkcCBpcyAlZFxuIiwgaiwgbXBpICk7CgkJCQltaWR3W2pdID0gKmN1cnB0OwoJCQkJbWlkbVtqXSA9ICptanB0OwoJCQkJbWlkbltqXSA9IG1pOwoJCQl9CgovLwkJCWZwcmludGYoIHN0ZGVyciwgIm1bJWRdID0gJWZcbiIsIGosIG1bal0gKTsKCQkJbWpwdCsrOwoJCQlwcmVwdCsrOwoJCQltcGpwdCsrOwoJCQljdXJwdCsrOwoKCQl9CgkJbGFzdHZlcnRpY2Fsd1tpXSA9IGN1cnJlbnR3W2xndGgyLTFdOwoKI2lmIFNUT1JFV00KCQlXTU1UWDJbaV1bbGd0aDJdID0gbVtsZ3RoMi0xXTsKI2VuZGlmCgojaWYgMCAgLy8gdWUKCQlpZiggaSA9PSBpbWlkICkKCQl7CgkJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKSBtaWR3W2pdID0gY3VycmVudHdbal07CgkJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKSBtaWRtW2pdID0gbVtqXTsKCQl9CiNlbmRpZgoJfQovLwlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkgbWlkd1tqXSA9IFdNTVRYW2ltaWRdW2pdOwovLwlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkgbWlkbVtqXSA9IFdNTVRYMltpbWlkXVtqXTsKCiNpZiAwCiAgICBmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKICAgIHsKICAgICAgICBmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKICAgICAgICB7CiAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiUgMTAuMmYgIiwgV01NVFhbaV1bal0gKTsKICAgICAgICB9CiAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiAgICB9CglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZwcmludGYoIHN0ZGVyciwgIldNTVRYMiA9IFxuIiApOwogICAgZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCiAgICB7CiAgICAgICAgZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCiAgICAgICAgewogICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlIDEwLjJmICIsIFdNTVRYMltpXVtqXSApOwogICAgICAgIH0KICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKICAgIH0KCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwojZW5kaWYKCi8vIGd5YWt1ZHAKCgltYXRjaF9yaWJvc3VtKCBpbml0dmVydGljYWx3LCBjcG14Mitqc3QsIGNwbXgxK2lzdCwgbGd0aDItMSwgbGd0aDEsIGZsb2F0d29yaywgaW50d29yaywgMSApOwoJbWF0Y2hfcmlib3N1bSggY3VycmVudHcsIGNwbXgxK2lzdCwgY3BteDIranN0LCBsZ3RoMS0xLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAxICk7CgoJZm9yKCBpPTA7IGk8bGd0aDEtMTsgaSsrICkKCXsKCQlpbml0dmVydGljYWx3W2ldICs9ICggZmdjcDFbbGd0aDEtMV0gKyBvZ2NwMVtpKzFdICk7Ci8vCQlpbml0dmVydGljYWx3W2ldICs9IGZwZW5hbHR5OwoJfQoJZm9yKCBqPTA7IGo8bGd0aDItMTsgaisrICkKCXsKCQljdXJyZW50d1tqXSArPSAoIGZnY3AyW2xndGgyLTFdICsgb2djcDJbaisxXSApOwovLwkJY3VycmVudHdbal0gKz0gZnBlbmFsdHk7Cgl9CgojaWYgU1RPUkVXTQoJZm9yKCBpPTA7IGk8bGd0aDEtMTsgaSsrICkKCXsKCQlXTU1UWFtpXVtsZ3RoMi0xXSArPSAoIGZnY3AxW2xndGgxLTFdICsgb2djcDFbaSsxXSApOwovLwkJZnByaW50Ziggc3RkZXJyLCAiZmdjcDFbbGd0aDEtMV0gKyBvZ2NwMVtpKzFdID0gJWZcbiIsIGZnY3AxW2xndGgxLTFdICsgb2djcDFbaSsxXSApOwoJfQoJZm9yKCBqPTA7IGo8bGd0aDItMTsgaisrICkKCXsKCQlXTU1UWFtsZ3RoMS0xXVtqXSArPSAoIGZnY3AyW2xndGgyLTFdICsgb2djcDJbaisxXSApOwovLwkJZnByaW50Ziggc3RkZXJyLCAiZmdjcDJbbGd0aDItMV0gKyBvZ2NwMltqKzFdID0gJWZcbiIsIGZnY3AyW2xndGgyLTFdICsgb2djcDJbaisxXSApOwoJfQojZW5kaWYKCgoKCgoKCWZvciggaj1sZ3RoMi0xOyBqPjA7IC0taiApCgl7CgkJbVtqLTFdID0gY3VycmVudHdbal0gKyBmZ2NwMltsZ3RoMi0yXTsKLy8JCW1bai0xXSA9IGN1cnJlbnR3W2pdOwoJCW1wW2pdID0gbGd0aDEtMTsKCX0KCi8vCWZvciggaj0wOyBqPGxndGgyOyBqKysgKSBtW2pdID0gMC4wOwoJLy8gbVtsZ3RoMi0xXSBoYSBpcnVub2thPwoKCi8vCWZvciggaT1sZ3RoMS0yOyBpPj1pbWlkOyBpLS0gKQoJZmlyc3RtID0gLTk5OTk5OTkuOTsKCWZpcnN0bXAgPSBsZ3RoMS0xOwoJZm9yKCBpPWxndGgxLTI7IGk+LTE7IGktLSApCgl7CgkJd3RtcCA9IHByZXZpb3VzdzsKCQlwcmV2aW91c3cgPSBjdXJyZW50dzsKCQljdXJyZW50dyA9IHd0bXA7CgkJcHJldmlvdXN3W2xndGgyLTFdID0gaW5pdHZlcnRpY2Fsd1tpKzFdOwovLwkJbWF0Y2hfY2FsYyggY3VycmVudHcsIHNlcTEsIHNlcTIsIGksIGxndGgyICk7CgkJbWF0Y2hfcmlib3N1bSggY3VycmVudHcsIGNwbXgxK2lzdCwgY3BteDIranN0LCBpLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAwICk7CgoJCWN1cnJlbnR3W2xndGgyLTFdID0gaW5pdHZlcnRpY2Fsd1tpXTsKCi8vCQltW2xndGgyXSA9IGZnY3AxW2ldOwovLwkJV01NVFgyW2ldW2xndGgyXSArPSBtW2xndGgyXTsKLy8JCWZwcmludGYoIHN0ZGVyciwgIm1bXSA9ICVmXG4iLCBtW2xndGgyXSApOwoKCQltaSA9IHByZXZpb3Vzd1tsZ3RoMi0xXSArIGZnY3AyW2xndGgyLTJdOwovLwkJbWkgPSBwcmV2aW91c3dbbGd0aDItMV07CgkJbXBpID0gbGd0aDIgLSAxOwoKCQltanB0ID0gbSArIGxndGgyIC0gMjsKCQlwcmVwdCA9IHByZXZpb3VzdyArIGxndGgyIC0gMTsKCQljdXJwdCA9IGN1cnJlbnR3ICsgbGd0aDIgLSAyOwoJCW1wanB0ID0gbXAgKyBsZ3RoMiAtIDI7CgoKCQlmb3IoIGo9bGd0aDItMjsgaj4tMTsgai0tICkKCQl7CgkJCXdtID0gKnByZXB0OwoJCQlpanBpID0gaSsxOwoJCQlpanBqID0gaisxOwoKCQkJZyA9IG1pICsgb2djcDJbaisxXTsKLy8JCQlnID0gbWkgKyBmcGVuYWx0eTsKCQkJaWYoIGcgPiB3bSApCgkJCXsKCQkJCXdtID0gZzsKCQkJCWlqcGogPSBtcGk7CgkJCQlpanBpID0gaSsxOwoJCQl9CgoJCQlnID0gKnByZXB0ICsgZmdjcDJbal07Ci8vCQkJZyA9ICpwcmVwdDsKCQkJaWYoIGcgPj0gbWkgKQoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImksaj0lZCwlZCAtIHJlbmV3ZWQhIG1waSA9ICVkXG4iLCBpLCBqLCBqKzEgKTsKCQkJCW1pID0gZzsKCQkJCW1waSA9IGogKyAxOwoJCQl9CgojaWYgVVNFX1BFTkFMVFlfRVgKCQkJbWkgKz0gZnBlbmFsdHlfZXg7CiNlbmRpZgoKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJpLGo9JWQsJWQgKm1wanB0ID0gJWRcbiIsIGksIGosICptcGpwdCApOwoJCQlnID0gKm1qcHQgKyBvZ2NwMVtpKzFdOwovLwkJCWcgPSAqbWpwdCArIGZwZW5hbHR5OwoJCQlpZiggZyA+IHdtICkKCQkJewoJCQkJd20gPSBnOwoJCQkJaWpwaSA9ICptcGpwdDsKCQkJCWlqcGogPSBqKzE7CgkJCX0KCi8vCQkJaWYoIGkgPT0gaW1pZCApZnByaW50Ziggc3RkZXJyLCAiaSxqPSVkLCVkIFxuIiwgaSwgaiApOwoJCQlnID0gKnByZXB0ICsgZmdjcDFbaV07Ci8vCQkJZyA9ICpwcmVwdDsKCQkJaWYoIGcgPj0gKm1qcHQgKQoJCQl7CgkJCQkqbWpwdCA9IGc7CgkJCQkqbXBqcHQgPSBpICsgMTsKCQkJfQoKI2lmIFVTRV9QRU5BTFRZX0VYCgkJCW1bal0gKz0gZnBlbmFsdHlfZXg7CiNlbmRpZgoKCQkJaWYoIGkgPT0ganVtcGkgfHwgaSA9PSBpbWlkIC0gMSApCgkJCXsKCQkJCWp1bXBmb3J3aVtqXSA9IGlqcGk7IC8vbXVkYQoJCQkJanVtcGZvcndqW2pdID0gaWpwajsgLy9tdWRhCi8vCQkJCWZwcmludGYoIHN0ZGVyciwgImp1bXBmb3JpWyVkXSA9ICVkXG4iLCBqLCBpanBpICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImp1bXBmb3JqWyVkXSA9ICVkXG4iLCBqLCBpanBqICk7CgkJCX0KCQkJaWYoIGkgPT0gaW1pZCApIC8vIG11ZGEKCQkJewoJCQkJbWlkd1tqXSArPSB3bTsKLy8JCQkJbWlkbVtqKzFdICs9ICptanB0ICsgZnBlbmFsdHk7IC8vPz8/Pz8/CgkJCQltaWRtW2orMV0gKz0gKm1qcHQ7IC8vPz8/Pz8/CgkJCX0KCQkJaWYoIGkgPT0gaW1pZCAtIDEgKQoJCQl7Ci8vCQkJCW1pZG5bal0gKz0gbWkgKyBmcGVuYWx0eTsgIC8vPz8/PwoJCQkJbWlkbltqXSArPSBtaTsgIC8vPz8/PwoJCQl9CiNpZiBMT0NBTAogICAgICAgICAgICBpZiggd20gPCBsb2NhbHRociApCiAgICAgICAgICAgIHsgICAgICAgCi8vCQkJCWZwcmludGYoIHN0ZGVyciwgInN0b3AgaT0lZCwgaj0lZCwgY3VycHQ9JWZcbiIsIGksIGosICpjdXJwdCApOwoJCQkJd20gPSAwOwogICAgICAgICAgICB9ICAgICAgIAojZW5kaWYKCiNpZiBTVE9SRVdNCgkJCVdNTVRYW2ldW2pdICs9IHdtOwovLwkJCVdNTVRYMltpXVtqKzFdICs9ICptanB0ICsgZnBlbmFsdHk7CgkJCVdNTVRYMltpXVtqXSArPSAqY3VycHQ7CiNlbmRpZgoJCQkqY3VycHQgKz0gd207CgoJCQltanB0LS07CgkJCXByZXB0LS07CgkJCW1wanB0LS07CgkJCWN1cnB0LS07CgkJfQovLwkJZnByaW50Ziggc3RkZXJyLCAiYWRkaW5nICptanB0ICg9JWYpIHRvIFdNTVRYMlslZF1bJWRdXG4iLCAqbWpwdCwgaSwgaisxICk7CgkJZyA9ICpwcmVwdCArIGZnY3AxW2ldOwoJCWlmKCBmaXJzdG0gPCBnICkgCgkJewoJCQlmaXJzdG0gPSBnOwoJCQlmaXJzdG1wID0gaSArIDE7CgkJfQojaWYgU1RPUkVXTQovLwkJV01NVFgyW2ldW2orMV0gKz0gZmlyc3RtOwojZW5kaWYKCQlpZiggaSA9PSBpbWlkICkgbWlkbVtqKzFdICs9IGZpcnN0bTsKCgkJaWYoIGkgPT0gaW1pZCAtIDEgKQkKCQl7CgkJCW1heHdtID0gbWlkd1sxXTsKCQkJam1pZCA9IDA7Ci8vCQkJaWYoIGRlcHRoID09IDEgKSBmcHJpbnRmKCBzdGRlcnIsICJtYXh3bSEhID0gJWZcbiIsIG1heHdtICk7CgkJCWZvciggaj0yOyBqPGxndGgyLTE7IGorKyApCgkJCXsKCQkJCXdtID0gbWlkd1tqXTsKCQkJCWlmKCB3bSA+IG1heHdtICkKCQkJCXsKCQkJCQlqbWlkID0gajsKCQkJCQltYXh3bSA9IHdtOwoJCQkJfQovLwkJCQlpZiggZGVwdGggPT0gMSApIGZwcmludGYoIHN0ZGVyciwgIm1heHdtISEgPSAlZlxuIiwgbWF4d20gKTsKCQkJfQoJCQlmb3IoIGo9MDsgajxsZ3RoMisxOyBqKysgKQoJCQl7CgkJCQl3bSA9IG1pZG1bal07CgkJCQlpZiggd20gPiBtYXh3bSApCgkJCQl7CgkJCQkJam1pZCA9IGo7CgkJCQkJbWF4d20gPSB3bTsKCQkJCX0KLy8JCQkJaWYoIGRlcHRoID09IDEgKSBmcHJpbnRmKCBzdGRlcnIsICJtYXh3bSEhID0gJWZcbiIsIG1heHdtICk7CgkJCX0KCi8vCQkJaWYoIGRlcHRoID09IDEgKSBmcHJpbnRmKCBzdGRlcnIsICJtYXh3bSEhID0gJWZcbiIsIG1heHdtICk7CgoKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICIjIyMgaW1pZD0lZCwgam1pZD0lZFxuIiwgaW1pZCwgam1pZCApOwoJCQl3bSA9IG1pZHdbam1pZF07CgkJCWp1bXBpID0gaW1pZC0xOwoJCQlqdW1waiA9IGptaWQtMTsKCQkJaWYoIGptaWQgPiAwICYmIG1pZG5bam1pZC0xXSA+IHdtICkgLy8wNjA0MTMKCQkJewoJCQkJanVtcGkgPSBpbWlkLTE7CgkJCQlqdW1waiA9IGp1bXBiYWNraVtqbWlkXTsKCQkJCXdtID0gbWlkbltqbWlkLTFdOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJyZWp1bXAgKG4pXG4iICk7CgkJCX0KCQkJaWYoIG1pZG1bam1pZF0gPiB3bSApCgkJCXsKCQkJCWp1bXBpID0ganVtcGJhY2tqW2ptaWRdOwoJCQkJanVtcGogPSBqbWlkLTE7CgkJCQl3bSA9IG1pZG1bam1pZF07Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInJlanVtcCAobSkganVtcGk9JWRcbiIsIGp1bXBpICk7CgkJCX0KCgovLwkJCWZwcmludGYoIHN0ZGVyciwgIi0tPiBpbWlkPSVkLCBqbWlkPSVkXG4iLCBpbWlkLCBqbWlkICk7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiLS0+IGp1bXBpPSVkLCBqdW1waj0lZFxuIiwganVtcGksIGp1bXBqICk7CiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgImltaWQgPSAlZFxuIiwgaW1pZCApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJtaWRuID0gXG4iICk7CgkJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCQl7CgkJCQlmcHJpbnRmKCBzdGRlcnIsICIlIDcuMWYgIiwgbWlkbltqXSApOwoJCQl9CgkJCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJtaWR3ID0gXG4iICk7CgkJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCQl7CgkJCQlmcHJpbnRmKCBzdGRlcnIsICIlIDcuMWYgIiwgbWlkd1tqXSApOwoJCQl9CgkJCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJtaWRtID0gXG4iICk7CgkJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCQl7CgkJCQlmcHJpbnRmKCBzdGRlcnIsICIlIDcuMWYgIiwgbWlkbVtqXSApOwoJCQl9CgkJCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwojZW5kaWYKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJtYXh3bSA9ICVmXG4iLCBtYXh3bSApOwoJCX0KCQlpZiggaSA9PSBqdW1waSApIC8vc2FraT8KCQl7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiaW1pZCwganVtcGkgPSAlZCwlZFxuIiwgaW1pZCwganVtcGkgKTsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJqbWlkLCBqdW1waiA9ICVkLCVkXG4iLCBqbWlkLCBqdW1waiApOwoJCQlpZiggam1pZCA9PSAwICkKCQkJewovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJDSFVJMiFcbiIgKTsKCQkJCWp1bXBqID0gMDsgam1pZCA9IDE7CgkJCQlqdW1waSA9IGZpcnN0bXAgLSAxOwoJCQkJaW1pZCA9IGZpcnN0bXA7CgkJCX0KCiNpZiAwCgkJCWVsc2UgaWYoIGptaWQgPT0gbGd0aDIgKSAKCQkJewoJCQkJZnByaW50Ziggc3RkZXJyLCAiQ0hVSTEhXG4iICk7CgkJCQlqdW1waT0wOyBqdW1waj0wOwoJCQkJaW1pZD1qdW1wZm9yd2lbMF07IGptaWQ9bGd0aDItMTsKCQkJfQojZWxzZSAvLyAwNjA0MTQKCQkJZWxzZSBpZiggam1pZCA+PSBsZ3RoMiApIAoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgIkNIVUkxIVxuIiApOwoJCQkJanVtcGk9aW1pZC0xOyBqbWlkPWxndGgyOwoJCQkJanVtcGogPSBsZ3RoMi0xOwoJCQl9CiNlbmRpZgoJCQllbHNlCgkJCXsKCQkJCWltaWQgPSBqdW1wZm9yd2lbanVtcGpdOwoJCQkJam1pZCA9IGp1bXBmb3J3altqdW1wal07CgkJCX0KI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAianVtcGkgLT4gJWRcbiIsIGp1bXBpICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImp1bXBqIC0+ICVkXG4iLCBqdW1waiApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJpbWlkIC0+ICVkXG4iLCBpbWlkICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImptaWQgLT4gJWRcbiIsIGptaWQgKTsKI2VuZGlmCgojaWYgU1RPUkVXTQovLwkJCWJyZWFrOwojZWxzZQoJCQlicmVhazsKI2VuZGlmCgkJfQoJfQojaWYgMAoJCWp1bXBpPTA7IGp1bXBqPTA7CgkJaW1pZD1sZ3RoMS0xOyBqbWlkPWxndGgyLTE7Cgl9CiNlbmRpZgoKLy8JZnByaW50Ziggc3RkZXJyLCAiaW1pZCA9ICVkLCBidXQganVtcGkgPSAlZFxuIiwgaW1pZCwganVtcGkgKTsKLy8JZnByaW50Ziggc3RkZXJyLCAiam1pZCA9ICVkLCBidXQganVtcGogPSAlZFxuIiwgam1pZCwganVtcGogKTsKCi8vCWZvciggaj0wOyBqPGxndGgyOyBqKysgKSBtaWR3W2pdICs9IGN1cnJlbnR3W2pdOwovLwlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkgbWlkbVtqXSArPSBtW2orMV07Ci8vCWZvciggaj0wOyBqPGxndGgyOyBqKysgKSBtaWR3W2pdICs9IFdNTVRYW2ltaWRdW2pdOwovLwlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkgbWlkd1tqXSArPSBXTU1UWFtpbWlkXVtqXTsKCgoKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSBmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCQltYXBbaV1bal0gPSBXTU1UWFtpXVtqXSAvIG1heHdtOwovLwkJbWFwW2ldW2pdID0gV01NVFgyW2ldW2pdIC8gbWF4d207CgojaWYgU1RPUkVXTQoKI2lmIDAKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKQoJewoJCWZsb2F0IG1heHBhaXJzY29yZSA9IC05OTk5Ljk7CgkJZmxvYXQgdG1wc2NvcmU7CgoJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCXsKCQkJaWYoIG1heHBhaXJzY29yZSA8ICh0bXBzY29yZT1XTU1UWFtpXVtqXSkgKQoJCQl7CgkJCQltYXAxMltpXS5wb3MgPSBqOwoJCQkJbWFwMTJbaV0uc2NvcmUgPSB0bXBzY29yZTsKCQkJCW1heHBhaXJzY29yZSA9IHRtcHNjb3JlOwoJCQl9CgkJfQoKCQlmb3IoIGs9MDsgazxsZ3RoMTsgaysrICkKCQl7CgkJCWlmKCBpID09IGsgKSBjb250aW51ZTsKCQkJaWYoIG1hcDEyW2ldLnNjb3JlIDw9IFdNTVRYW2tdW21hcDEyW2ldLnBvc10gKQoJCQkJYnJlYWs7CgkJfQoJCWlmKCBrICE9IGxndGgxICkKCQl7CgkJCW1hcDEyW2ldLnBvcyA9IC0xOwoJCQltYXAxMltpXS5zY29yZSA9IC0xLjA7CgkJfQoJCWZwcmludGYoIHN0ZGVyciwgInBhaXIgb2YgJWQgPSAlZCAoJWYpICVjOiVjXG4iLCBpLCBtYXAxMltpXS5wb3MsIG1hcDEyW2ldLnNjb3JlLCBzZXExWzBdW2ldLCBzZXEyWzBdW21hcDEyW2ldLnBvc10gKTsKCX0KCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJewoJCWZsb2F0IG1heHBhaXJzY29yZSA9IC05OTk5Ljk7CgkJZmxvYXQgdG1wc2NvcmU7CgoJCWZvciggaT0wOyBpPGxndGgxOyBpKysgKQoJCXsKCQkJaWYoIG1heHBhaXJzY29yZSA8ICh0bXBzY29yZT1XTU1UWFtpXVtqXSkgKQoJCQl7CgkJCQltYXAyMVtqXS5wb3MgPSBpOwoJCQkJbWFwMjFbal0uc2NvcmUgPSB0bXBzY29yZTsKCQkJCW1heHBhaXJzY29yZSA9IHRtcHNjb3JlOwoJCQl9CgkJfQoKCQlmb3IoIGs9MDsgazxsZ3RoMjsgaysrICkKCQl7CgkJCWlmKCBqID09IGsgKSBjb250aW51ZTsKCQkJaWYoIG1hcDIxW2pdLnNjb3JlIDw9IFdNTVRYW21hcDIxW2pdLnBvc11ba10gKQoJCQkJYnJlYWs7CgkJfQoJCWlmKCBrICE9IGxndGgyICkKCQl7CgkJCW1hcDIxW2pdLnBvcyA9IC0xOwoJCQltYXAyMVtqXS5zY29yZSA9IC0xLjA7CgkJfQoJCWZwcmludGYoIHN0ZGVyciwgInBhaXIgb2YgJWQgPSAlZCAoJWYpICVjOiVjXG4iLCBqLCBtYXAyMVtqXS5wb3MsIG1hcDIxW2pdLnNjb3JlLCBzZXEyWzBdW2pdLCBzZXExWzBdW21hcDIxW2pdLnBvc10gKTsKCX0KCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKCXsKCQlpZiggbWFwMTJbaV0ucG9zICE9IC0xICkgaWYoIG1hcDIxW21hcDEyW2ldLnBvc10ucG9zICE9IGkgKSAKCQkJZnByaW50Ziggc3RkZXJyLCAiRVJST1IgaT0lZCwgYnV0IG1hcDEyW2ldLnBvcz0lZCBhbmQgbWFwMjFbbWFwMTJbaV0ucG9zXT0lZFxuIiwgaSwgbWFwMTJbaV0ucG9zLCBtYXAyMVttYXAxMltpXS5wb3NdLnBvcyApOwoJfQojZW5kaWYKCiNpZiAwCglmcHJpbnRmKCBzdGRlcnIsICJXTU1UWCA9IFxuIiApOwogICAgZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCiAgICB7CiAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJWQgIiwgaSApOwogICAgICAgIGZvciggaj0wOyBqPGxndGgyOyBqKysgKQogICAgICAgIHsKICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJSA3LjJmICIsIFdNTVRYW2ldW2pdICk7CiAgICAgICAgfQogICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogICAgfQovLwlmcHJpbnRmKCBzdGRlcnIsICJXTU1UWDIgPSAocCA9ICVmKVxuIiwgZnBlbmFsdHkgKTsKICAgIGZvciggaT0wOyBpPGxndGgxOyBpKysgKQogICAgewogICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiVkICIsIGkgKTsKICAgICAgICBmb3IoIGo9MDsgajxsZ3RoMisxOyBqKysgKQogICAgICAgIHsKICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJSA3LjJmICIsIFdNTVRYMltpXVtqXSApOwogICAgICAgIH0KICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKICAgIH0KI2VuZGlmCgojaWYgMAogICAgZnByaW50Ziggc3Rkb3V0LCAiI1dNTVRYID0gXG4iICk7CiAgICBmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKICAgIHsKLy8gICAgICAgIGZwcmludGYoIHN0ZG91dCwgIiVkICIsIGkgKTsgCiAgICAgICAgZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCiAgICAgICAgewovLyAgICAgICAgICBpZiggV01NVFhbaV1bal0gPiBhbWlub19kaXNbJ2EnXVsnZyddIC0xICkKICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZG91dCwgIiVkICVkICU4LjFmIiwgaSwgaiwgV01NVFhbaV1bal0gKTsKCQkJaWYoIFdNTVRYW2ldW2pdID09IG1heHdtICkKICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZG91dCwgInNlbGVjdGVkIFxuIiApOwoJCQllbHNlCiAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRvdXQsICJcbiIgKTsKICAgICAgICB9CiAgICAgICAgZnByaW50Ziggc3Rkb3V0LCAiXG4iICk7CiAgICB9CiNlbmRpZgoKI2lmIDAKCglmcHJpbnRmKCBzdGRlcnIsICJqdW1wYmFja2kgPSBcbiIgKTsKCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJewoJCWZwcmludGYoIHN0ZGVyciwgIiUgN2QgIiwganVtcGJhY2tpW2pdICk7Cgl9CglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZwcmludGYoIHN0ZGVyciwgImp1bXBiYWNraiA9IFxuIiApOwoJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiJSA3ZCAiLCBqdW1wYmFja2pbal0gKTsKCX0KCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJZnByaW50Ziggc3RkZXJyLCAianVtcGZvcndpID0gXG4iICk7Cglmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICIlIDdkICIsIGp1bXBmb3J3aVtqXSApOwoJfQoJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CglmcHJpbnRmKCBzdGRlcnIsICJqdW1wZm9yd2ogPSBcbiIgKTsKCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJewoJCWZwcmludGYoIHN0ZGVyciwgIiUgN2QgIiwganVtcGZvcndqW2pdICk7Cgl9CglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKI2VuZGlmCgoKI2VuZGlmCgoKLy8JQXRyYWNraW5nKCBjdXJyZW50dywgbGFzdHZlcnRpY2Fsdywgc2VxMSwgc2VxMiwgbXNlcTEsIG1zZXEyLCBjcG14MSwgY3BteDIsIGlqcCwgaWN5YywgamN5YyApOwoKI2lmIDAgLy8gaXJ1a2FtbwoJcmVzdWx0bGVuID0gc3RybGVuKCBtc2VxMVswXSApOwoJaWYoIGFsbG9jbGVuIDwgcmVzdWx0bGVuIHx8IHJlc3VsdGxlbiA+IE4gKQoJewoJCWZwcmludGYoIHN0ZGVyciwgImFsbG9jbGVuPSVkLCByZXN1bHRsZW49JWQsIE49JWRcbiIsIGFsbG9jbGVuLCByZXN1bHRsZW4sIE4gKTsKCQlFcnJvckV4aXQoICJMRU5HVEggT1ZFUiFcbiIgKTsKCX0KI2VuZGlmCgoKCiNpZiAwCglmcHJpbnRmKCBzdGRlcnIsICJqdW1waSA9ICVkLCBpbWlkID0gJWRcbiIsIGp1bXBpLCBpbWlkICk7CglmcHJpbnRmKCBzdGRlcnIsICJqdW1waiA9ICVkLCBqbWlkID0gJWRcbiIsIGp1bXBqLCBqbWlkICk7CgoJZnByaW50Ziggc3RkZXJyLCAiaW1pZCA9ICVkXG4iLCBpbWlkICk7CglmcHJpbnRmKCBzdGRlcnIsICJqbWlkID0gJWRcbiIsIGptaWQgKTsKI2VuZGlmCgoKCUZyZWVGbG9hdFZlYyggdzEgKTsKCUZyZWVGbG9hdFZlYyggdzIgKTsKCUZyZWVGbG9hdFZlYyggaW5pdHZlcnRpY2FsdyApOwoJRnJlZUZsb2F0VmVjKCBsYXN0dmVydGljYWx3ICk7CglGcmVlRmxvYXRWZWMoIG1pZHcgKTsKCUZyZWVGbG9hdFZlYyggbWlkbSApOwoJRnJlZUZsb2F0VmVjKCBtaWRuICk7CgoJRnJlZUludFZlYygganVtcGJhY2tpICk7CglGcmVlSW50VmVjKCBqdW1wYmFja2ogKTsKCUZyZWVJbnRWZWMoIGp1bXBmb3J3aSApOwoJRnJlZUludFZlYygganVtcGZvcndqICk7CglGcmVlSW50VmVjKCBqdW1wZHVtbWkgKTsKCUZyZWVJbnRWZWMoIGp1bXBkdW1taiApOwoKCUZyZWVGbG9hdFZlYyggbSApOwoJRnJlZUludFZlYyggbXAgKTsKCglGcmVlRmxvYXRNdHgoIGZsb2F0d29yayApOwoJRnJlZUludE10eCggaW50d29yayApOwoKI2lmIFNUT1JFV00KCUZyZWVGbG9hdE10eCggV01NVFggKTsKCUZyZWVGbG9hdE10eCggV01NVFgyICk7CiNlbmRpZgoKCXJldHVybiggdmFsdWUgKTsKCn0Kc3RhdGljIGZsb2F0IE1TYWxpZ25tbV9yZWMoIGludCBpY3ljLCBpbnQgamN5YywgZG91YmxlICplZmYxLCBkb3VibGUgKmVmZjIsIGNoYXIgKipzZXExLCBjaGFyICoqc2VxMiwgZmxvYXQgKipjcG14MSwgZmxvYXQgKipjcG14MiwgaW50IGlzdCwgaW50IGllbiwgaW50IGpzdCwgaW50IGplbiwgaW50IGFsbG9jbGVuLCBjaGFyICoqbXNlcTEsIGNoYXIgKiptc2VxMiwgaW50IGRlcHRoLCBmbG9hdCAqKmdhcGluZm8sIGZsb2F0ICoqbWFwICkKLyogc2NvcmUgbm8ga2Vpc2FuIG5vIHNhaSBtb3Rva2FyYWFydSBnYXAgbm8gYXR1a2FpIG5pIG1vbmRhaSBnYSBhcnUgKi8KewoJaW50IGFsbmxlbjsKCWZsb2F0IHZhbHVlID0gMC4wOwoJcmVnaXN0ZXIgaW50IGksIGo7CgljaGFyICoqYXNlcTEsICoqYXNlcTI7CglpbnQgbGwxLCBsbDIsIGwsIGxlbjsKCWludCBsYXN0aSwgbGFzdGosIGltaWQsIGptaWQ9MDsKCWZsb2F0IHdtID0gMC4wOyAgIC8qIGludCA/Pz8/Pz8gKi8KCWZsb2F0IGc7CglmbG9hdCAqY3VycmVudHcsICpwcmV2aW91c3c7CiNpZiBVU0VfUEVOQUxUWV9FWAoJZmxvYXQgZnBlbmFsdHlfZXggPSAoZmxvYXQpUk5BcGVuYWx0eV9leDsKI2VuZGlmCi8vCWZsb2F0IGZwZW5hbHR5ID0gKGZsb2F0KXBlbmFsdHk7CglmbG9hdCAqd3RtcDsKLy8Jc2hvcnQgKmlqcHB0OwoJaW50ICptcGpwdDsKLy8Jc2hvcnQgKippanA7CglpbnQgKm1wOwoJaW50IG1waTsKCWZsb2F0ICptanB0LCAqcHJlcHQsICpjdXJwdDsKCWZsb2F0IG1pOwoJZmxvYXQgKm07CglmbG9hdCAqdzEsICp3MjsKLy8JZmxvYXQgKm1hdGNoOwoJZmxvYXQgKmluaXR2ZXJ0aWNhbHc7ICAgIC8qIGt1ZnV1IHN1cmViYSBpcmFuYWkgKi8KCWZsb2F0ICpsYXN0dmVydGljYWx3OyAgICAvKiBrdWZ1dSBzdXJlYmEgaXJhbmFpICovCglpbnQgKippbnR3b3JrOwoJZmxvYXQgKipmbG9hdHdvcms7Ci8vCXNob3J0ICoqc2hvcnRtdHg7CiNpZiBTVE9SRVdNCglmbG9hdCAqKldNTVRYOwoJZmxvYXQgKipXTU1UWDI7CiNlbmRpZgoJZmxvYXQgKm1pZHc7CglmbG9hdCAqbWlkbTsKCWZsb2F0ICptaWRuOwoJaW50IGxndGgxLCBsZ3RoMjsKCWZsb2F0IG1heHdtID0gMC4wOwoJaW50ICpqdW1wZm9yd2k7CglpbnQgKmp1bXBmb3J3ajsKCWludCAqanVtcGJhY2tpOwoJaW50ICpqdW1wYmFja2o7CglpbnQgKmp1bXBkdW1taTsgLy9tdWRhCglpbnQgKmp1bXBkdW1tajsgLy9tdWRhCglpbnQganVtcGksIGp1bXBqID0gMDsKCWNoYXIgKmdhcHM7CglpbnQgaWpwaSwgaWpwajsKCWZsb2F0ICpvZ2NwMTsKCWZsb2F0ICpmZ2NwMTsKCWZsb2F0ICpvZ2NwMjsKCWZsb2F0ICpmZ2NwMjsKCWZsb2F0IGZpcnN0bTsKCWludCBmaXJzdG1wOwojaWYgMAoJc3RhdGljIGNoYXIgdHR0MVs1MDAwMF07CglzdGF0aWMgY2hhciB0dHQyWzUwMDAwXTsKI2VuZGlmCgoJbG9jYWx0aHIgPSAtb2Zmc2V0ICsgNTAwOyAvLyAwPwoKCW9nY3AxID0gZ2FwaW5mb1swXSArIGlzdDsKCWZnY3AxID0gZ2FwaW5mb1sxXSArIGlzdDsKCW9nY3AyID0gZ2FwaW5mb1syXSArIGpzdDsKCWZnY3AyID0gZ2FwaW5mb1szXSArIGpzdDsKCglkZXB0aCsrOwoJcmVjY3ljbGUrKzsKCglsZ3RoMSA9IGllbi1pc3QrMTsKCWxndGgyID0gamVuLWpzdCsxOwoKLy8JaWYoIGxndGgxIDwgNSApCi8vCQlmcHJpbnRmKCBzdGRlcnIsICJcbldBUk5JTkc6IGxndGgxID0gJWRcbiIsIGxndGgxICk7Ci8vCWlmKCBsZ3RoMiA8IDUgKQovLwkJZnByaW50Ziggc3RkZXJyLCAiXG5XQVJOSU5HOiBsZ3RoMiA9ICVkXG4iLCBsZ3RoMiApOwovLwoKI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgIj09PT0gTVNhbGlnbiAoZGVwdGg9JWQsIHJlY2N5Y2xlPSVkKSwgaXN0PSVkLCBpZW49JWQsIGpzdD0lZCwgamVuPSVkXG4iLCBkZXB0aCwgcmVjY3ljbGUsIGlzdCwgaWVuLCBqc3QsIGplbiApOwoJc3RybmNweSggdHR0MSwgc2VxMVswXStpc3QsIGxndGgxICk7CglzdHJuY3B5KCB0dHQyLCBzZXEyWzBdK2pzdCwgbGd0aDIgKTsKCXR0dDFbbGd0aDFdID0gMDsKCXR0dDJbbGd0aDJdID0gMDsKCWZwcmludGYoIHN0ZGVyciwgInNlcTEgPSAlc1xuIiwgdHR0MSApOwoJZnByaW50Ziggc3RkZXJyLCAic2VxMiA9ICVzXG4iLCB0dHQyICk7CiNlbmRpZgoJaWYoIGxndGgyIDw9IDAgKSAvLyBsZ3RoMSA8PSAwIGhhPwoJewovLwkJZnByaW50Ziggc3RkZXJyLCAiXG5cbj09PT0gamltZWlcblxuIiApOwovLwkJZXhpdCggMSApOwoJCWZvciggaT0wOyBpPGljeWM7IGkrKyApIAoJCXsKCQkJc3RybmNweSggbXNlcTFbaV0sIHNlcTFbaV0raXN0LCBsZ3RoMSApOwoJCQltc2VxMVtpXVtsZ3RoMV0gPSAwOwoJCX0KCQlmb3IoIGk9MDsgaTxqY3ljOyBpKysgKSAKCQl7CgkJCW1zZXEyW2ldWzBdID0gMDsKCQkJZm9yKCBqPTA7IGo8bGd0aDE7IGorKyApCgkJCQlzdHJjYXQoIG1zZXEyW2ldLCAiLSIgKTsKCQl9CgovLwkJZnByaW50Ziggc3RkZXJyLCAiPT09PSBtc2VxMVswXSAoJWQpID0gJXNcbiIsIGRlcHRoLCBtc2VxMVswXSApOwovLwkJZnByaW50Ziggc3RkZXJyLCAiPT09PSBtc2VxMlswXSAoJWQpID0gJXNcbiIsIGRlcHRoLCBtc2VxMlswXSApOwoKCQlyZXR1cm4oIDAuMCApOwoJfQoKI2lmIE1FTVNBVkUKCWFzZXExID0gQWxsb2NhdGVDaGFyTXR4KCBpY3ljLCAwICk7Cglhc2VxMiA9IEFsbG9jYXRlQ2hhck10eCggamN5YywgMCApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgYXNlcTFbaV0gPSBtc2VxMVtpXTsKCWZvciggaT0wOyBpPGpjeWM7IGkrKyApIGFzZXEyW2ldID0gbXNlcTJbaV07CiNlbHNlCglhc2VxMSA9IEFsbG9jYXRlQ2hhck10eCggaWN5YywgbGd0aDErbGd0aDIrMTAwICk7Cglhc2VxMiA9IEFsbG9jYXRlQ2hhck10eCggamN5YywgbGd0aDErbGd0aDIrMTAwICk7CiNlbmRpZgoKLy8gIGlmKCBsZ3RoMSA8IERQVEFOTkkgJiYgbGd0aDIgPCBEUFRBTk5JICkgLy8gJiBkYXRvIGxndGggPT0xIG5vIGthbm91c2VpIGdhIGFydW5vZGUgeW9rdW5haSAKLy8gICAgaWYoIGxndGgxIDwgRFBUQU5OSSApIC8vIGtvcmUgbW8gbGd0aDIgZ2EgbWlqaWthc3VnaXJ1IGthbm91c2VpIGFyaQogICAgaWYoIGxndGgxIDwgRFBUQU5OSSB8fCBsZ3RoMiA8IERQVEFOTkkgKSAvLyB6ZXR0YWkgbmkgYW56ZW4ga2E/Cgl7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICI9PT09IEdvaW5nIHRvIF90YW5uaVxuIiApOwoKLy8JCXZhbHVlID0gTVNhbGlnbm1tX3Rhbm5pKCBpY3ljLCBqY3ljLCBlZmYxLCBlZmYyLCBzZXExLCBzZXEyLCBjcG14MSwgY3BteDIsIGlzdCwgaWVuLCBqc3QsIGplbiwgYWxsb2NsZW4sIGFzZXExLCBhc2VxMiwgZ2FwaW5mbyApOwkKCgojaWYgTUVNU0FWRQoJCWZyZWUoIGFzZXExICk7CgkJZnJlZSggYXNlcTIgKTsKI2Vsc2UKCQlmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBzdHJjcHkoIG1zZXExW2ldLCBhc2VxMVtpXSApOwoJCWZvciggaT0wOyBpPGpjeWM7IGkrKyApIHN0cmNweSggbXNlcTJbaV0sIGFzZXEyW2ldICk7CgoJCUZyZWVDaGFyTXR4KCBhc2VxMSApOwoJCUZyZWVDaGFyTXR4KCBhc2VxMiApOwojZW5kaWYKCi8vCQlmcHJpbnRmKCBzdGRlcnIsICJ2YWx1ZSA9ICVmXG4iLCB2YWx1ZSApOwoKCQlyZXR1cm4oIHZhbHVlICk7Cgl9Ci8vCWZwcmludGYoIHN0ZGVyciwgIlRyeWluZyB0byBkaXZpZGUgdGhlIG10eFxuIiApOwoKCWxsMSA9ICggKGludCkobGd0aDEpICkgKyAxMDA7CglsbDIgPSAoIChpbnQpKGxndGgyKSApICsgMTAwOwoKLy8JZnByaW50Ziggc3RkZXJyLCAibGwxLGxsMj0lZCwlZFxuIiwgbGwxLCBsbDIgKTsKCgl3MSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7Cgl3MiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7Ci8vCW1hdGNoID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCW1pZHcgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJbWlkbiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgltaWRtID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCWp1bXBiYWNraSA9IEFsbG9jYXRlSW50VmVjKCBsbDIrMiApOwoJanVtcGJhY2tqID0gQWxsb2NhdGVJbnRWZWMoIGxsMisyICk7CglqdW1wZm9yd2kgPSBBbGxvY2F0ZUludFZlYyggbGwyKzIgKTsKCWp1bXBmb3J3aiA9IEFsbG9jYXRlSW50VmVjKCBsbDIrMiApOwoJanVtcGR1bW1pID0gQWxsb2NhdGVJbnRWZWMoIGxsMisyICk7CglqdW1wZHVtbWogPSBBbGxvY2F0ZUludFZlYyggbGwyKzIgKTsKCglpbml0dmVydGljYWx3ID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCWxhc3R2ZXJ0aWNhbHcgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoKCW0gPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJbXAgPSBBbGxvY2F0ZUludFZlYyggbGwyKzIgKTsKCWdhcHMgPSBBbGxvY2F0ZUNoYXJWZWMoIE1BWCggbGwxLCBsbDIgKSArIDIgKTsKCglmbG9hdHdvcmsgPSBBbGxvY2F0ZUZsb2F0TXR4KCBNQVgoIGxsMSwgbGwyICkrMiwgMjYgKTsgCglpbnR3b3JrID0gQWxsb2NhdGVJbnRNdHgoIE1BWCggbGwxLCBsbDIgKSsyLCAyNiApOyAKCiNpZiBERUJVRwoJZnByaW50Ziggc3RkZXJyLCAic3VjY2VlZGVkXG4iICk7CiNlbmRpZgoKI2lmIFNUT1JFV00KCVdNTVRYID0gQWxsb2NhdGVGbG9hdE10eCggbGwxLCBsbDIgKTsKCVdNTVRYMiA9IEFsbG9jYXRlRmxvYXRNdHgoIGxsMSwgbGwyICk7CiNlbmRpZgojaWYgMAoJc2hvcnRtdHggPSBBbGxvY2F0ZVNob3J0TXR4KCBsbDEsIGxsMiApOwoKI2lmIERFQlVHCglmcHJpbnRmKCBzdGRlcnIsICJzdWNjZWVkZWRcblxuIiApOwojZW5kaWYKCglpanAgPSBzaG9ydG10eDsKI2VuZGlmCgoJY3VycmVudHcgPSB3MTsKCXByZXZpb3VzdyA9IHcyOwoKCW1hdGNoX2NhbGMoIGluaXR2ZXJ0aWNhbHcsIGNwbXgyK2pzdCwgY3BteDEraXN0LCAwLCBsZ3RoMSwgZmxvYXR3b3JrLCBpbnR3b3JrLCAxICk7CgoJbWF0Y2hfY2FsYyggY3VycmVudHcsIGNwbXgxK2lzdCwgY3BteDIranN0LCAwLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAxICk7CgoJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCXsKCQlpbml0dmVydGljYWx3W2ldICs9ICggb2djcDFbMF0gKyBmZ2NwMVtpLTFdICk7Cgl9Cglmb3IoIGo9MTsgajxsZ3RoMisxOyBqKysgKQoJewoJCWN1cnJlbnR3W2pdICs9ICggb2djcDJbMF0gKyBmZ2NwMltqLTFdICk7Cgl9CgojaWYgU1RPUkVXTQoJV01NVFhbMF1bMF0gPSBpbml0dmVydGljYWx3WzBdOwoJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCXsKCQlXTU1UWFtpXVswXSA9IGluaXR2ZXJ0aWNhbHdbaV07Cgl9Cglmb3IoIGo9MTsgajxsZ3RoMisxOyBqKysgKQoJewoJCVdNTVRYWzBdW2pdID0gY3VycmVudHdbal07Cgl9CiNlbmRpZgoKCglmb3IoIGo9MTsgajxsZ3RoMisxOyArK2ogKSAKCXsKCQltW2pdID0gY3VycmVudHdbai0xXSArIG9nY3AxWzFdOwovLwkJbVtqXSA9IGN1cnJlbnR3W2otMV07CgkJbXBbal0gPSAwOwoJfQoKCWxhc3R2ZXJ0aWNhbHdbMF0gPSBjdXJyZW50d1tsZ3RoMi0xXTsKCglpbWlkID0gbGd0aDEgKiAwLjU7CgoJanVtcGkgPSAwOyAvLyBhdG9kZSBrYXdhcnUuCglsYXN0aSA9IGxndGgxKzE7CiNpZiBTVE9SRVdNCglmb3IoIGk9MTsgaTxsYXN0aTsgaSsrICkKI2Vsc2UKCWZvciggaT0xOyBpPD1pbWlkOyBpKysgKQojZW5kaWYKCXsKCQl3dG1wID0gcHJldmlvdXN3OyAKCQlwcmV2aW91c3cgPSBjdXJyZW50dzsKCQljdXJyZW50dyA9IHd0bXA7CgoJCXByZXZpb3Vzd1swXSA9IGluaXR2ZXJ0aWNhbHdbaS0xXTsKCgkJbWF0Y2hfY2FsYyggY3VycmVudHcsIGNwbXgxK2lzdCwgY3BteDIranN0LCBpLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAwICk7CgkJY3VycmVudHdbMF0gPSBpbml0dmVydGljYWx3W2ldOwoKCQltWzBdID0gb2djcDFbaV07CiNpZiBTVE9SRU0KCQlXTU1UWDJbaV1bMF0gPSBtWzBdOwojZW5kaWYKCQlpZiggaSA9PSBpbWlkICkgbWlkbVswXSA9IG1bMF07CgoJCW1pID0gcHJldmlvdXN3WzBdICsgb2djcDJbMV07IAovLwkJbWkgPSBwcmV2aW91c3dbMF07CgkJbXBpID0gMDsKCgovLwkJaWpwcHQgPSBpanBbaV0gKyAxOwoJCW1qcHQgPSBtICsgMTsKCQlwcmVwdCA9IHByZXZpb3VzdzsKCQljdXJwdCA9IGN1cnJlbnR3ICsgMTsKCQltcGpwdCA9IG1wICsgMTsKCgoJCWxhc3RqID0gbGd0aDIrMTsKCQlmb3IoIGo9MTsgajxsYXN0ajsgaisrICkKCQl7CgoJCQl3bSA9ICpwcmVwdDsKCiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmLT4iLCB3bSApOwojZW5kaWYKCQkJZyA9IG1pICsgZmdjcDJbai0xXTsKLy8JCQlnID0gbWkgKyBmcGVuYWx0eTsKI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGY/IiwgZyApOwojZW5kaWYKCQkJaWYoIGcgPiB3bSApCgkJCXsKCQkJCXdtID0gZzsKLy8JCQkJKmlqcHB0ID0gLSggaiAtIG1waSApOwoJCQl9CgkJCWcgPSAqcHJlcHQgKyBvZ2NwMltqXTsKLy8JCQlnID0gKnByZXB0OwoJCQlpZiggZyA+PSBtaSApCgkJCXsKCQkJCW1pID0gZzsKCQkJCW1waSA9IGotMTsKCQkJfQojaWYgVVNFX1BFTkFMVFlfRVgKCQkJbWkgKz0gZnBlbmFsdHlfZXg7CiNlbmRpZgoKCQkJZyA9ICptanB0ICsgZmdjcDFbaS0xXTsKLy8JCQlnID0gKm1qcHQgKyBmcGVuYWx0eTsKI2lmIDAgCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmPyIsIGcgKTsKI2VuZGlmCgkJCWlmKCBnID4gd20gKQoJCQl7CgkJCQl3bSA9IGc7Ci8vCQkJCSppanBwdCA9ICsoIGkgLSAqbXBqcHQgKTsKCQkJfQoKCgkJCWcgPSAqcHJlcHQgKyBvZ2NwMVtpXTsKLy8JCQlnID0gKnByZXB0OwoJCQlpZiggZyA+PSAqbWpwdCApCgkJCXsKCQkJCSptanB0ID0gZzsKCQkJCSptcGpwdCA9IGktMTsKCQkJfQojaWYgVVNFX1BFTkFMVFlfRVgKCQkJbVtqXSArPSBmcGVuYWx0eV9leDsKI2VuZGlmCiNpZiBMT0NBTAogICAgICAgICAgICBpZiggd20gPCBsb2NhbHRociApCiAgICAgICAgICAgIHsgICAgICAgCi8vCQkJCWZwcmludGYoIHN0ZGVyciwgInN0b3AgaT0lZCwgaj0lZCwgY3VycHQ9JWZcbiIsIGksIGosICpjdXJwdCApOwoJCQkJd20gPSAwOwogICAgICAgICAgICB9ICAgICAgIAojZW5kaWYKCiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmICIsIHdtICk7CiNlbmRpZgoJCQkqY3VycHQgKz0gd207CgoKI2lmIFNUT1JFV00KCQkJV01NVFhbaV1bal0gPSAqY3VycHQ7CgkJCVdNTVRYMltpXVtqXSA9ICptanB0OwojZW5kaWYKCgkJCWlmKCBpID09IGltaWQgKSAvL211ZGEKCQkJewkKCQkJCWp1bXBiYWNraltqXSA9ICptcGpwdDsgLy8gbXVkYSBhdG9kZSBtYXRvbWVydQoJCQkJanVtcGJhY2tpW2pdID0gbXBpOyAvLyBtdWRhIGF0b2RlIG1hdG9tZXJ1Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImp1bXBiYWNralslZF0gaW4gZm9yd2FyZCBkcCBpcyAlZFxuIiwgaiwgKm1wanB0ICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImp1bXBiYWNraVslZF0gaW4gZm9yd2FyZCBkcCBpcyAlZFxuIiwgaiwgbXBpICk7CgkJCQltaWR3W2pdID0gKmN1cnB0OwoJCQkJbWlkbVtqXSA9ICptanB0OwoJCQkJbWlkbltqXSA9IG1pOwoJCQl9CgovLwkJCWZwcmludGYoIHN0ZGVyciwgIm1bJWRdID0gJWZcbiIsIGosIG1bal0gKTsKCQkJbWpwdCsrOwoJCQlwcmVwdCsrOwoJCQltcGpwdCsrOwoJCQljdXJwdCsrOwoKCQl9CgkJbGFzdHZlcnRpY2Fsd1tpXSA9IGN1cnJlbnR3W2xndGgyLTFdOwoKI2lmIFNUT1JFV00KCQlXTU1UWDJbaV1bbGd0aDJdID0gbVtsZ3RoMi0xXTsKI2VuZGlmCgojaWYgMCAgLy8gdWUKCQlpZiggaSA9PSBpbWlkICkKCQl7CgkJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKSBtaWR3W2pdID0gY3VycmVudHdbal07CgkJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKSBtaWRtW2pdID0gbVtqXTsKCQl9CiNlbmRpZgoJfQovLwlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkgbWlkd1tqXSA9IFdNTVRYW2ltaWRdW2pdOwovLwlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkgbWlkbVtqXSA9IFdNTVRYMltpbWlkXVtqXTsKCiNpZiAwCiAgICBmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKICAgIHsKICAgICAgICBmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKICAgICAgICB7CiAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiUgMTAuMmYgIiwgV01NVFhbaV1bal0gKTsKICAgICAgICB9CiAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiAgICB9CglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZwcmludGYoIHN0ZGVyciwgIldNTVRYMiA9IFxuIiApOwogICAgZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCiAgICB7CiAgICAgICAgZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCiAgICAgICAgewogICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlIDEwLjJmICIsIFdNTVRYMltpXVtqXSApOwogICAgICAgIH0KICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKICAgIH0KCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwojZW5kaWYKCi8vIGd5YWt1ZHAKCgltYXRjaF9jYWxjKCBpbml0dmVydGljYWx3LCBjcG14Mitqc3QsIGNwbXgxK2lzdCwgbGd0aDItMSwgbGd0aDEsIGZsb2F0d29yaywgaW50d29yaywgMSApOwoJbWF0Y2hfY2FsYyggY3VycmVudHcsIGNwbXgxK2lzdCwgY3BteDIranN0LCBsZ3RoMS0xLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAxICk7CgoJZm9yKCBpPTA7IGk8bGd0aDEtMTsgaSsrICkKCXsKCQlpbml0dmVydGljYWx3W2ldICs9ICggZmdjcDFbbGd0aDEtMV0gKyBvZ2NwMVtpKzFdICk7Ci8vCQlpbml0dmVydGljYWx3W2ldICs9IGZwZW5hbHR5OwoJfQoJZm9yKCBqPTA7IGo8bGd0aDItMTsgaisrICkKCXsKCQljdXJyZW50d1tqXSArPSAoIGZnY3AyW2xndGgyLTFdICsgb2djcDJbaisxXSApOwovLwkJY3VycmVudHdbal0gKz0gZnBlbmFsdHk7Cgl9CgojaWYgU1RPUkVXTQoJZm9yKCBpPTA7IGk8bGd0aDEtMTsgaSsrICkKCXsKCQlXTU1UWFtpXVtsZ3RoMi0xXSArPSAoIGZnY3AxW2xndGgxLTFdICsgb2djcDFbaSsxXSApOwovLwkJZnByaW50Ziggc3RkZXJyLCAiZmdjcDFbbGd0aDEtMV0gKyBvZ2NwMVtpKzFdID0gJWZcbiIsIGZnY3AxW2xndGgxLTFdICsgb2djcDFbaSsxXSApOwoJfQoJZm9yKCBqPTA7IGo8bGd0aDItMTsgaisrICkKCXsKCQlXTU1UWFtsZ3RoMS0xXVtqXSArPSAoIGZnY3AyW2xndGgyLTFdICsgb2djcDJbaisxXSApOwovLwkJZnByaW50Ziggc3RkZXJyLCAiZmdjcDJbbGd0aDItMV0gKyBvZ2NwMltqKzFdID0gJWZcbiIsIGZnY3AyW2xndGgyLTFdICsgb2djcDJbaisxXSApOwoJfQojZW5kaWYKCgoKCgoKCWZvciggaj1sZ3RoMi0xOyBqPjA7IC0taiApCgl7CgkJbVtqLTFdID0gY3VycmVudHdbal0gKyBmZ2NwMltsZ3RoMi0yXTsKLy8JCW1bai0xXSA9IGN1cnJlbnR3W2pdOwoJCW1wW2pdID0gbGd0aDEtMTsKCX0KCi8vCWZvciggaj0wOyBqPGxndGgyOyBqKysgKSBtW2pdID0gMC4wOwoJLy8gbVtsZ3RoMi0xXSBoYSBpcnVub2thPwoKCi8vCWZvciggaT1sZ3RoMS0yOyBpPj1pbWlkOyBpLS0gKQoJZmlyc3RtID0gLTk5OTk5OTkuOTsKCWZpcnN0bXAgPSBsZ3RoMS0xOwoJZm9yKCBpPWxndGgxLTI7IGk+LTE7IGktLSApCgl7CgkJd3RtcCA9IHByZXZpb3VzdzsKCQlwcmV2aW91c3cgPSBjdXJyZW50dzsKCQljdXJyZW50dyA9IHd0bXA7CgkJcHJldmlvdXN3W2xndGgyLTFdID0gaW5pdHZlcnRpY2Fsd1tpKzFdOwovLwkJbWF0Y2hfY2FsYyggY3VycmVudHcsIHNlcTEsIHNlcTIsIGksIGxndGgyICk7CgkJbWF0Y2hfY2FsYyggY3VycmVudHcsIGNwbXgxK2lzdCwgY3BteDIranN0LCBpLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAwICk7CgoJCWN1cnJlbnR3W2xndGgyLTFdID0gaW5pdHZlcnRpY2Fsd1tpXTsKCi8vCQltW2xndGgyXSA9IGZnY3AxW2ldOwovLwkJV01NVFgyW2ldW2xndGgyXSArPSBtW2xndGgyXTsKLy8JCWZwcmludGYoIHN0ZGVyciwgIm1bXSA9ICVmXG4iLCBtW2xndGgyXSApOwoKCQltaSA9IHByZXZpb3Vzd1tsZ3RoMi0xXSArIGZnY3AyW2xndGgyLTJdOwovLwkJbWkgPSBwcmV2aW91c3dbbGd0aDItMV07CgkJbXBpID0gbGd0aDIgLSAxOwoKCQltanB0ID0gbSArIGxndGgyIC0gMjsKCQlwcmVwdCA9IHByZXZpb3VzdyArIGxndGgyIC0gMTsKCQljdXJwdCA9IGN1cnJlbnR3ICsgbGd0aDIgLSAyOwoJCW1wanB0ID0gbXAgKyBsZ3RoMiAtIDI7CgoKCQlmb3IoIGo9bGd0aDItMjsgaj4tMTsgai0tICkKCQl7CgkJCXdtID0gKnByZXB0OwoJCQlpanBpID0gaSsxOwoJCQlpanBqID0gaisxOwoKCQkJZyA9IG1pICsgb2djcDJbaisxXTsKLy8JCQlnID0gbWkgKyBmcGVuYWx0eTsKCQkJaWYoIGcgPiB3bSApCgkJCXsKCQkJCXdtID0gZzsKCQkJCWlqcGogPSBtcGk7CgkJCQlpanBpID0gaSsxOwoJCQl9CgoJCQlnID0gKnByZXB0ICsgZmdjcDJbal07Ci8vCQkJZyA9ICpwcmVwdDsKCQkJaWYoIGcgPj0gbWkgKQoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImksaj0lZCwlZCAtIHJlbmV3ZWQhIG1waSA9ICVkXG4iLCBpLCBqLCBqKzEgKTsKCQkJCW1pID0gZzsKCQkJCW1waSA9IGogKyAxOwoJCQl9CgojaWYgVVNFX1BFTkFMVFlfRVgKCQkJbWkgKz0gZnBlbmFsdHlfZXg7CiNlbmRpZgoKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJpLGo9JWQsJWQgKm1wanB0ID0gJWRcbiIsIGksIGosICptcGpwdCApOwoJCQlnID0gKm1qcHQgKyBvZ2NwMVtpKzFdOwovLwkJCWcgPSAqbWpwdCArIGZwZW5hbHR5OwoJCQlpZiggZyA+IHdtICkKCQkJewoJCQkJd20gPSBnOwoJCQkJaWpwaSA9ICptcGpwdDsKCQkJCWlqcGogPSBqKzE7CgkJCX0KCi8vCQkJaWYoIGkgPT0gaW1pZCApZnByaW50Ziggc3RkZXJyLCAiaSxqPSVkLCVkIFxuIiwgaSwgaiApOwoJCQlnID0gKnByZXB0ICsgZmdjcDFbaV07Ci8vCQkJZyA9ICpwcmVwdDsKCQkJaWYoIGcgPj0gKm1qcHQgKQoJCQl7CgkJCQkqbWpwdCA9IGc7CgkJCQkqbXBqcHQgPSBpICsgMTsKCQkJfQoKI2lmIFVTRV9QRU5BTFRZX0VYCgkJCW1bal0gKz0gZnBlbmFsdHlfZXg7CiNlbmRpZgoKCQkJaWYoIGkgPT0ganVtcGkgfHwgaSA9PSBpbWlkIC0gMSApCgkJCXsKCQkJCWp1bXBmb3J3aVtqXSA9IGlqcGk7IC8vbXVkYQoJCQkJanVtcGZvcndqW2pdID0gaWpwajsgLy9tdWRhCi8vCQkJCWZwcmludGYoIHN0ZGVyciwgImp1bXBmb3JpWyVkXSA9ICVkXG4iLCBqLCBpanBpICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImp1bXBmb3JqWyVkXSA9ICVkXG4iLCBqLCBpanBqICk7CgkJCX0KCQkJaWYoIGkgPT0gaW1pZCApIC8vIG11ZGEKCQkJewoJCQkJbWlkd1tqXSArPSB3bTsKLy8JCQkJbWlkbVtqKzFdICs9ICptanB0ICsgZnBlbmFsdHk7IC8vPz8/Pz8/CgkJCQltaWRtW2orMV0gKz0gKm1qcHQ7IC8vPz8/Pz8/CgkJCX0KCQkJaWYoIGkgPT0gaW1pZCAtIDEgKQoJCQl7Ci8vCQkJCW1pZG5bal0gKz0gbWkgKyBmcGVuYWx0eTsgIC8vPz8/PwoJCQkJbWlkbltqXSArPSBtaTsgIC8vPz8/PwoJCQl9CiNpZiBMT0NBTAogICAgICAgICAgICBpZiggd20gPCBsb2NhbHRociApCiAgICAgICAgICAgIHsgICAgICAgCi8vCQkJCWZwcmludGYoIHN0ZGVyciwgInN0b3AgaT0lZCwgaj0lZCwgY3VycHQ9JWZcbiIsIGksIGosICpjdXJwdCApOwoJCQkJd20gPSAwOwogICAgICAgICAgICB9ICAgICAgIAojZW5kaWYKCiNpZiBTVE9SRVdNCgkJCVdNTVRYW2ldW2pdICs9IHdtOwovLwkJCVdNTVRYMltpXVtqKzFdICs9ICptanB0ICsgZnBlbmFsdHk7CgkJCVdNTVRYMltpXVtqXSArPSAqY3VycHQ7CiNlbmRpZgoJCQkqY3VycHQgKz0gd207CgoJCQltanB0LS07CgkJCXByZXB0LS07CgkJCW1wanB0LS07CgkJCWN1cnB0LS07CgkJfQovLwkJZnByaW50Ziggc3RkZXJyLCAiYWRkaW5nICptanB0ICg9JWYpIHRvIFdNTVRYMlslZF1bJWRdXG4iLCAqbWpwdCwgaSwgaisxICk7CgkJZyA9ICpwcmVwdCArIGZnY3AxW2ldOwoJCWlmKCBmaXJzdG0gPCBnICkgCgkJewoJCQlmaXJzdG0gPSBnOwoJCQlmaXJzdG1wID0gaSArIDE7CgkJfQojaWYgU1RPUkVXTQovLwkJV01NVFgyW2ldW2orMV0gKz0gZmlyc3RtOwojZW5kaWYKCQlpZiggaSA9PSBpbWlkICkgbWlkbVtqKzFdICs9IGZpcnN0bTsKCgkJaWYoIGkgPT0gaW1pZCAtIDEgKQkKCQl7CgkJCW1heHdtID0gbWlkd1sxXTsKCQkJam1pZCA9IDA7Ci8vCQkJaWYoIGRlcHRoID09IDEgKSBmcHJpbnRmKCBzdGRlcnIsICJtYXh3bSEhID0gJWZcbiIsIG1heHdtICk7CgkJCWZvciggaj0yOyBqPGxndGgyLTE7IGorKyApCgkJCXsKCQkJCXdtID0gbWlkd1tqXTsKCQkJCWlmKCB3bSA+IG1heHdtICkKCQkJCXsKCQkJCQlqbWlkID0gajsKCQkJCQltYXh3bSA9IHdtOwoJCQkJfQovLwkJCQlpZiggZGVwdGggPT0gMSApIGZwcmludGYoIHN0ZGVyciwgIm1heHdtISEgPSAlZlxuIiwgbWF4d20gKTsKCQkJfQoJCQlmb3IoIGo9MDsgajxsZ3RoMisxOyBqKysgKQoJCQl7CgkJCQl3bSA9IG1pZG1bal07CgkJCQlpZiggd20gPiBtYXh3bSApCgkJCQl7CgkJCQkJam1pZCA9IGo7CgkJCQkJbWF4d20gPSB3bTsKCQkJCX0KLy8JCQkJaWYoIGRlcHRoID09IDEgKSBmcHJpbnRmKCBzdGRlcnIsICJtYXh3bSEhID0gJWZcbiIsIG1heHdtICk7CgkJCX0KCi8vCQkJaWYoIGRlcHRoID09IDEgKSBmcHJpbnRmKCBzdGRlcnIsICJtYXh3bSEhID0gJWZcbiIsIG1heHdtICk7CgoKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICIjIyMgaW1pZD0lZCwgam1pZD0lZFxuIiwgaW1pZCwgam1pZCApOwoJCQl3bSA9IG1pZHdbam1pZF07CgkJCWp1bXBpID0gaW1pZC0xOwoJCQlqdW1waiA9IGptaWQtMTsKCQkJaWYoIGptaWQgPiAwICYmIG1pZG5bam1pZC0xXSA+IHdtICkgLy8wNjA0MTMKCQkJewoJCQkJanVtcGkgPSBpbWlkLTE7CgkJCQlqdW1waiA9IGp1bXBiYWNraVtqbWlkXTsKCQkJCXdtID0gbWlkbltqbWlkLTFdOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJyZWp1bXAgKG4pXG4iICk7CgkJCX0KCQkJaWYoIG1pZG1bam1pZF0gPiB3bSApCgkJCXsKCQkJCWp1bXBpID0ganVtcGJhY2tqW2ptaWRdOwoJCQkJanVtcGogPSBqbWlkLTE7CgkJCQl3bSA9IG1pZG1bam1pZF07Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInJlanVtcCAobSkganVtcGk9JWRcbiIsIGp1bXBpICk7CgkJCX0KCgovLwkJCWZwcmludGYoIHN0ZGVyciwgIi0tPiBpbWlkPSVkLCBqbWlkPSVkXG4iLCBpbWlkLCBqbWlkICk7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiLS0+IGp1bXBpPSVkLCBqdW1waj0lZFxuIiwganVtcGksIGp1bXBqICk7CiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgImltaWQgPSAlZFxuIiwgaW1pZCApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJtaWRuID0gXG4iICk7CgkJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCQl7CgkJCQlmcHJpbnRmKCBzdGRlcnIsICIlIDcuMWYgIiwgbWlkbltqXSApOwoJCQl9CgkJCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJtaWR3ID0gXG4iICk7CgkJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCQl7CgkJCQlmcHJpbnRmKCBzdGRlcnIsICIlIDcuMWYgIiwgbWlkd1tqXSApOwoJCQl9CgkJCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJtaWRtID0gXG4iICk7CgkJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCQl7CgkJCQlmcHJpbnRmKCBzdGRlcnIsICIlIDcuMWYgIiwgbWlkbVtqXSApOwoJCQl9CgkJCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwojZW5kaWYKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJtYXh3bSA9ICVmXG4iLCBtYXh3bSApOwoJCX0KCQlpZiggaSA9PSBqdW1waSApIC8vc2FraT8KCQl7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiaW1pZCwganVtcGkgPSAlZCwlZFxuIiwgaW1pZCwganVtcGkgKTsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJqbWlkLCBqdW1waiA9ICVkLCVkXG4iLCBqbWlkLCBqdW1waiApOwoJCQlpZiggam1pZCA9PSAwICkKCQkJewovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJDSFVJMiFcbiIgKTsKCQkJCWp1bXBqID0gMDsgam1pZCA9IDE7CgkJCQlqdW1waSA9IGZpcnN0bXAgLSAxOwoJCQkJaW1pZCA9IGZpcnN0bXA7CgkJCX0KCiNpZiAwCgkJCWVsc2UgaWYoIGptaWQgPT0gbGd0aDIgKSAKCQkJewoJCQkJZnByaW50Ziggc3RkZXJyLCAiQ0hVSTEhXG4iICk7CgkJCQlqdW1waT0wOyBqdW1waj0wOwoJCQkJaW1pZD1qdW1wZm9yd2lbMF07IGptaWQ9bGd0aDItMTsKCQkJfQojZWxzZSAvLyAwNjA0MTQKCQkJZWxzZSBpZiggam1pZCA+PSBsZ3RoMiApIAoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgIkNIVUkxIVxuIiApOwoJCQkJanVtcGk9aW1pZC0xOyBqbWlkPWxndGgyOwoJCQkJanVtcGogPSBsZ3RoMi0xOwoJCQl9CiNlbmRpZgoJCQllbHNlCgkJCXsKCQkJCWltaWQgPSBqdW1wZm9yd2lbanVtcGpdOwoJCQkJam1pZCA9IGp1bXBmb3J3altqdW1wal07CgkJCX0KI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAianVtcGkgLT4gJWRcbiIsIGp1bXBpICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImp1bXBqIC0+ICVkXG4iLCBqdW1waiApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJpbWlkIC0+ICVkXG4iLCBpbWlkICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImptaWQgLT4gJWRcbiIsIGptaWQgKTsKI2VuZGlmCgojaWYgU1RPUkVXTQovLwkJCWJyZWFrOwojZWxzZQoJCQlicmVhazsKI2VuZGlmCgkJfQoJfQojaWYgMAoJCWp1bXBpPTA7IGp1bXBqPTA7CgkJaW1pZD1sZ3RoMS0xOyBqbWlkPWxndGgyLTE7Cgl9CiNlbmRpZgoKLy8JZnByaW50Ziggc3RkZXJyLCAiaW1pZCA9ICVkLCBidXQganVtcGkgPSAlZFxuIiwgaW1pZCwganVtcGkgKTsKLy8JZnByaW50Ziggc3RkZXJyLCAiam1pZCA9ICVkLCBidXQganVtcGogPSAlZFxuIiwgam1pZCwganVtcGogKTsKCi8vCWZvciggaj0wOyBqPGxndGgyOyBqKysgKSBtaWR3W2pdICs9IGN1cnJlbnR3W2pdOwovLwlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkgbWlkbVtqXSArPSBtW2orMV07Ci8vCWZvciggaj0wOyBqPGxndGgyOyBqKysgKSBtaWR3W2pdICs9IFdNTVRYW2ltaWRdW2pdOwovLwlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkgbWlkd1tqXSArPSBXTU1UWFtpbWlkXVtqXTsKCgoKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSBmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCQltYXBbaV1bal0gPSBXTU1UWFtpXVtqXSAvIG1heHdtOwovLwkJbWFwW2ldW2pdID0gV01NVFgyW2ldW2pdIC8gbWF4d207CgojaWYgU1RPUkVXTQoKI2lmIDAKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKQoJewoJCWZsb2F0IG1heHBhaXJzY29yZSA9IC05OTk5Ljk7CgkJZmxvYXQgdG1wc2NvcmU7CgoJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCXsKCQkJaWYoIG1heHBhaXJzY29yZSA8ICh0bXBzY29yZT1XTU1UWFtpXVtqXSkgKQoJCQl7CgkJCQltYXAxMltpXS5wb3MgPSBqOwoJCQkJbWFwMTJbaV0uc2NvcmUgPSB0bXBzY29yZTsKCQkJCW1heHBhaXJzY29yZSA9IHRtcHNjb3JlOwoJCQl9CgkJfQoKCQlmb3IoIGs9MDsgazxsZ3RoMTsgaysrICkKCQl7CgkJCWlmKCBpID09IGsgKSBjb250aW51ZTsKCQkJaWYoIG1hcDEyW2ldLnNjb3JlIDw9IFdNTVRYW2tdW21hcDEyW2ldLnBvc10gKQoJCQkJYnJlYWs7CgkJfQoJCWlmKCBrICE9IGxndGgxICkKCQl7CgkJCW1hcDEyW2ldLnBvcyA9IC0xOwoJCQltYXAxMltpXS5zY29yZSA9IC0xLjA7CgkJfQoJCWZwcmludGYoIHN0ZGVyciwgInBhaXIgb2YgJWQgPSAlZCAoJWYpICVjOiVjXG4iLCBpLCBtYXAxMltpXS5wb3MsIG1hcDEyW2ldLnNjb3JlLCBzZXExWzBdW2ldLCBzZXEyWzBdW21hcDEyW2ldLnBvc10gKTsKCX0KCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJewoJCWZsb2F0IG1heHBhaXJzY29yZSA9IC05OTk5Ljk7CgkJZmxvYXQgdG1wc2NvcmU7CgoJCWZvciggaT0wOyBpPGxndGgxOyBpKysgKQoJCXsKCQkJaWYoIG1heHBhaXJzY29yZSA8ICh0bXBzY29yZT1XTU1UWFtpXVtqXSkgKQoJCQl7CgkJCQltYXAyMVtqXS5wb3MgPSBpOwoJCQkJbWFwMjFbal0uc2NvcmUgPSB0bXBzY29yZTsKCQkJCW1heHBhaXJzY29yZSA9IHRtcHNjb3JlOwoJCQl9CgkJfQoKCQlmb3IoIGs9MDsgazxsZ3RoMjsgaysrICkKCQl7CgkJCWlmKCBqID09IGsgKSBjb250aW51ZTsKCQkJaWYoIG1hcDIxW2pdLnNjb3JlIDw9IFdNTVRYW21hcDIxW2pdLnBvc11ba10gKQoJCQkJYnJlYWs7CgkJfQoJCWlmKCBrICE9IGxndGgyICkKCQl7CgkJCW1hcDIxW2pdLnBvcyA9IC0xOwoJCQltYXAyMVtqXS5zY29yZSA9IC0xLjA7CgkJfQoJCWZwcmludGYoIHN0ZGVyciwgInBhaXIgb2YgJWQgPSAlZCAoJWYpICVjOiVjXG4iLCBqLCBtYXAyMVtqXS5wb3MsIG1hcDIxW2pdLnNjb3JlLCBzZXEyWzBdW2pdLCBzZXExWzBdW21hcDIxW2pdLnBvc10gKTsKCX0KCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKCXsKCQlpZiggbWFwMTJbaV0ucG9zICE9IC0xICkgaWYoIG1hcDIxW21hcDEyW2ldLnBvc10ucG9zICE9IGkgKSAKCQkJZnByaW50Ziggc3RkZXJyLCAiRVJST1IgaT0lZCwgYnV0IG1hcDEyW2ldLnBvcz0lZCBhbmQgbWFwMjFbbWFwMTJbaV0ucG9zXT0lZFxuIiwgaSwgbWFwMTJbaV0ucG9zLCBtYXAyMVttYXAxMltpXS5wb3NdLnBvcyApOwoJfQojZW5kaWYKCiNpZiAwCglmcHJpbnRmKCBzdGRlcnIsICJXTU1UWCA9IFxuIiApOwogICAgZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCiAgICB7CiAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJWQgIiwgaSApOwogICAgICAgIGZvciggaj0wOyBqPGxndGgyOyBqKysgKQogICAgICAgIHsKICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJSA3LjJmICIsIFdNTVRYW2ldW2pdICk7CiAgICAgICAgfQogICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogICAgfQovLwlmcHJpbnRmKCBzdGRlcnIsICJXTU1UWDIgPSAocCA9ICVmKVxuIiwgZnBlbmFsdHkgKTsKICAgIGZvciggaT0wOyBpPGxndGgxOyBpKysgKQogICAgewogICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiVkICIsIGkgKTsKICAgICAgICBmb3IoIGo9MDsgajxsZ3RoMisxOyBqKysgKQogICAgICAgIHsKICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJSA3LjJmICIsIFdNTVRYMltpXVtqXSApOwogICAgICAgIH0KICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKICAgIH0KCWV4aXQoIDEgKTsKI2VuZGlmCgojaWYgMAogICAgZnByaW50Ziggc3Rkb3V0LCAiI1dNTVRYID0gXG4iICk7CiAgICBmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKICAgIHsKLy8gICAgICAgIGZwcmludGYoIHN0ZG91dCwgIiVkICIsIGkgKTsgCiAgICAgICAgZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCiAgICAgICAgewovLyAgICAgICAgICBpZiggV01NVFhbaV1bal0gPiBhbWlub19kaXNbJ2EnXVsnZyddIC0xICkKICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZG91dCwgIiVkICVkICU4LjFmIiwgaSwgaiwgV01NVFhbaV1bal0gKTsKCQkJaWYoIFdNTVRYW2ldW2pdID09IG1heHdtICkKICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZG91dCwgInNlbGVjdGVkIFxuIiApOwoJCQllbHNlCiAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRvdXQsICJcbiIgKTsKICAgICAgICB9CiAgICAgICAgZnByaW50Ziggc3Rkb3V0LCAiXG4iICk7CiAgICB9CglleGl0KCAxICk7CiNlbmRpZgoKI2lmIDAKCglmcHJpbnRmKCBzdGRlcnIsICJqdW1wYmFja2kgPSBcbiIgKTsKCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJewoJCWZwcmludGYoIHN0ZGVyciwgIiUgN2QgIiwganVtcGJhY2tpW2pdICk7Cgl9CglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZwcmludGYoIHN0ZGVyciwgImp1bXBiYWNraiA9IFxuIiApOwoJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiJSA3ZCAiLCBqdW1wYmFja2pbal0gKTsKCX0KCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJZnByaW50Ziggc3RkZXJyLCAianVtcGZvcndpID0gXG4iICk7Cglmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICIlIDdkICIsIGp1bXBmb3J3aVtqXSApOwoJfQoJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CglmcHJpbnRmKCBzdGRlcnIsICJqdW1wZm9yd2ogPSBcbiIgKTsKCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJewoJCWZwcmludGYoIHN0ZGVyciwgIiUgN2QgIiwganVtcGZvcndqW2pdICk7Cgl9CglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKI2VuZGlmCgoKI2VuZGlmCgoKLy8JQXRyYWNraW5nKCBjdXJyZW50dywgbGFzdHZlcnRpY2Fsdywgc2VxMSwgc2VxMiwgbXNlcTEsIG1zZXEyLCBjcG14MSwgY3BteDIsIGlqcCwgaWN5YywgamN5YyApOwoKI2lmIDAgLy8gaXJ1a2FtbwoJcmVzdWx0bGVuID0gc3RybGVuKCBtc2VxMVswXSApOwoJaWYoIGFsbG9jbGVuIDwgcmVzdWx0bGVuIHx8IHJlc3VsdGxlbiA+IE4gKQoJewoJCWZwcmludGYoIHN0ZGVyciwgImFsbG9jbGVuPSVkLCByZXN1bHRsZW49JWQsIE49JWRcbiIsIGFsbG9jbGVuLCByZXN1bHRsZW4sIE4gKTsKCQlFcnJvckV4aXQoICJMRU5HVEggT1ZFUiFcbiIgKTsKCX0KI2VuZGlmCgoKCiNpZiAwCglmcHJpbnRmKCBzdGRlcnIsICJqdW1waSA9ICVkLCBpbWlkID0gJWRcbiIsIGp1bXBpLCBpbWlkICk7CglmcHJpbnRmKCBzdGRlcnIsICJqdW1waiA9ICVkLCBqbWlkID0gJWRcbiIsIGp1bXBqLCBqbWlkICk7CgoJZnByaW50Ziggc3RkZXJyLCAiaW1pZCA9ICVkXG4iLCBpbWlkICk7CglmcHJpbnRmKCBzdGRlcnIsICJqbWlkID0gJWRcbiIsIGptaWQgKTsKI2VuZGlmCgoKCUZyZWVGbG9hdFZlYyggdzEgKTsKCUZyZWVGbG9hdFZlYyggdzIgKTsKCUZyZWVGbG9hdFZlYyggaW5pdHZlcnRpY2FsdyApOwoJRnJlZUZsb2F0VmVjKCBsYXN0dmVydGljYWx3ICk7CglGcmVlRmxvYXRWZWMoIG1pZHcgKTsKCUZyZWVGbG9hdFZlYyggbWlkbSApOwoJRnJlZUZsb2F0VmVjKCBtaWRuICk7CgoJRnJlZUludFZlYygganVtcGJhY2tpICk7CglGcmVlSW50VmVjKCBqdW1wYmFja2ogKTsKCUZyZWVJbnRWZWMoIGp1bXBmb3J3aSApOwoJRnJlZUludFZlYygganVtcGZvcndqICk7CglGcmVlSW50VmVjKCBqdW1wZHVtbWkgKTsKCUZyZWVJbnRWZWMoIGp1bXBkdW1taiApOwoKCUZyZWVGbG9hdFZlYyggbSApOwoJRnJlZUludFZlYyggbXAgKTsKCglGcmVlRmxvYXRNdHgoIGZsb2F0d29yayApOwoJRnJlZUludE10eCggaW50d29yayApOwoKI2lmIFNUT1JFV00KCUZyZWVGbG9hdE10eCggV01NVFggKTsKCUZyZWVGbG9hdE10eCggV01NVFgyICk7CiNlbmRpZgoKCXJldHVybiggdmFsdWUgKTsKCi8vCWZwcmludGYoIHN0ZGVyciwgIj09PT0gY2FsbGluZyBteXNlbGYgKGZpcnN0KVxuIiApOwoKI2lmIDAKCQlmcHJpbnRmKCBzdGRlcnIsICJzZXExWzBdID0gJXNcbiIsIHNlcTFbMF0gKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJzZXEyWzBdID0gJXNcbiIsIHNlcTJbMF0gKTsKI2VuZGlmCgl2YWx1ZSA9IE1TYWxpZ25tbV9yZWMoIGljeWMsIGpjeWMsIGVmZjEsIGVmZjIsIHNlcTEsIHNlcTIsIGNwbXgxLCBjcG14MiwgaXN0LCBpc3QranVtcGksIGpzdCwganN0K2p1bXBqLCBhbGxvY2xlbiwgYXNlcTEsIGFzZXEyLCBkZXB0aCwgZ2FwaW5mbywgbWFwICk7CQojaWYgMAoJCWZwcmludGYoIHN0ZGVyciwgImFzZXExWzBdID0gJXNcbiIsIGFzZXExWzBdICk7CgkJZnByaW50Ziggc3RkZXJyLCAiYXNlcTJbMF0gPSAlc1xuIiwgYXNlcTJbMF0gKTsKI2VuZGlmCiNpZiBNRU1TQVZFCiNlbHNlCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBzdHJjcHkoIG1zZXExW2ldLCBhc2VxMVtpXSApOwoJZm9yKCBpPTA7IGk8amN5YzsgaSsrICkgc3RyY3B5KCBtc2VxMltpXSwgYXNlcTJbaV0gKTsKI2VuZGlmCgovLwlmcHJpbnRmKCBzdGRlcnIsICI9PT09KGYpIGFzZXExWzBdICglZCkgPSAlcyAoJWQtJWQpXG4iLCBkZXB0aCwgYXNlcTFbMF0sIGlzdCwgaWVuICk7Ci8vCWZwcmludGYoIHN0ZGVyciwgIj09PT0oZikgYXNlcTJbMF0gKCVkKSA9ICVzICglZC0lZClcbiIsIGRlcHRoLCBhc2VxMlswXSwganN0LCBqZW4gKTsKCglsZW4gPSBzdHJsZW4oIG1zZXExWzBdICk7Ci8vCWZwcmludGYoIHN0ZGVyciwgImxlbiA9ICVkXG4iLCBsZW4gKTsKCWwgPSBqbWlkIC0ganVtcGogLSAxOwovLwlmcHJpbnRmKCBzdGRlcnIsICJsPSVkXG4iLCBsICk7CglpZiggbCA+IDAgKQoJewoJCWZvciggaT0wOyBpPGw7IGkrKyApIGdhcHNbaV0gPSAnLSc7IGdhcHNbaV0gPSAwOwoJCWZvciggaT0wOyBpPGljeWM7IGkrKyApIAoJCXsKCQkJc3RyY2F0KCBtc2VxMVtpXSwgZ2FwcyApOwoJCQltc2VxMVtpXVtsZW4rbF0gPSAwOwoJCX0KCQlmb3IoIGo9MDsgajxqY3ljOyBqKysgKQoJCXsKCQkJc3RybmNhdCggbXNlcTJbal0sIHNlcTJbal0ranN0K2p1bXBqKzEsIGwgKTsKCQkJbXNlcTJbal1bbGVuK2xdID0gMDsKCQl9Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJwZW5hbGl6aW5nICgyKSAuLiAlZiglZCksICVmKCVkKVxuIiwgb2djcDJbanVtcGorMV0sIGp1bXBqKzEsIGZnY3AyW2ptaWQtMV0sIGptaWQtMSApOwoJCXZhbHVlICs9ICAoIG9nY3AyW2p1bXBqKzFdICsgZmdjcDJbam1pZC0xXSApOwovLwkJdmFsdWUgKz0gZnBlbmFsdHk7Cgl9CglsZW4gPSBzdHJsZW4oIG1zZXExWzBdICk7CglsID0gaW1pZCAtIGp1bXBpIC0gMTsKLy8JZnByaW50Ziggc3RkZXJyLCAibD0lZFxuIiwgbCApOwoJaWYoIGwgPiAwICkKCXsKCQlmb3IoIGk9MDsgaTxsOyBpKysgKSBnYXBzW2ldID0gJy0nOyBnYXBzW2ldID0gMDsKCQlmb3IoIGk9MDsgaTxpY3ljOyBpKysgKQoJCXsKCQkJc3RybmNhdCggbXNlcTFbaV0sIHNlcTFbaV0raXN0K2p1bXBpKzEsIGwgKTsKCQkJbXNlcTFbaV1bbGVuK2xdID0gMDsKCQl9CgkJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgCgkJewoJCQlzdHJjYXQoIG1zZXEyW2pdLCBnYXBzICk7CgkJCW1zZXEyW2pdW2xlbitsXSA9IDA7CgkJfQoKLy8JCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSBmcHJpbnRmKCBzdGRlcnIsICJvZ2NwMVslZF0gPSAlZlxuIiwgaSwgb2djcDFbaV0gKTsKLy8JCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSBmcHJpbnRmKCBzdGRlcnIsICJmZ2NwMVslZF0gPSAlZlxuIiwgaSwgZmdjcDFbaV0gKTsKCgovLwkJZnByaW50Ziggc3RkZXJyLCAicGVuYWxpemluZyAoMSkgLi4gb2djcDFbJWRdID0gJWYsIGZnY3AxWyVkXSA9ICVmXG4iLCBqdW1waSsxLCBvZ2NwMVtqdW1waSsxXSwgaW1pZC0xLCBmZ2NwMVtpbWlkLTFdICk7CgkJdmFsdWUgKz0gKCBvZ2NwMVtqdW1waSsxXSArIGZnY3AxW2ltaWQtMV0gKTsKLy8JCXZhbHVlICs9IGZwZW5hbHR5OwoJfQojaWYgMAoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgZnByaW50Ziggc3RkZXJyLCAiYWZ0ZXIgZ2FwZmlsbCBtc2VxMVslZF09JXNcbiIsIGksIG1zZXExW2ldICk7Cglmb3IoIGk9MDsgaTxqY3ljOyBpKysgKSBmcHJpbnRmKCBzdGRlcnIsICJhZnRlciBnYXBmaWxsIG1zZXEyWyVkXT0lc1xuIiwgaSwgbXNlcTJbaV0gKTsKI2VuZGlmCgovLwlmcHJpbnRmKCBzdGRlcnIsICI9PT09IGNhbGxpbmcgbXlzZWxmIChzZWNvbmQpXG4iICk7CgojaWYgTUVNU0FWRQoJYWxubGVuID0gc3RybGVuKCBhc2VxMVswXSApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgYXNlcTFbaV0gKz0gYWxubGVuOwoJZm9yKCBpPTA7IGk8amN5YzsgaSsrICkgYXNlcTJbaV0gKz0gYWxubGVuOwojZW5kaWYKCiNpZiAwCgkJZnByaW50Ziggc3RkZXJyLCAic2VxMVswXSA9ICVzXG4iLCBzZXExWzBdICk7CgkJZnByaW50Ziggc3RkZXJyLCAic2VxMlswXSA9ICVzXG4iLCBzZXEyWzBdICk7CiNlbmRpZgoJdmFsdWUgKz0gTVNhbGlnbm1tX3JlYyggaWN5YywgamN5YywgZWZmMSwgZWZmMiwgc2VxMSwgc2VxMiwgY3BteDEsIGNwbXgyLCBpc3QraW1pZCwgaWVuLCBqc3Qram1pZCwgamVuLCBhbGxvY2xlbiwgYXNlcTEsIGFzZXEyLCBkZXB0aCwgZ2FwaW5mbywgbWFwICk7CQojaWYgMAoJCWZwcmludGYoIHN0ZGVyciwgImFzZXExWzBdID0gJXNcbiIsIGFzZXExWzBdICk7CgkJZnByaW50Ziggc3RkZXJyLCAiYXNlcTJbMF0gPSAlc1xuIiwgYXNlcTJbMF0gKTsKI2VuZGlmCgoKCiNpZiBERUJVRwoJaWYoIHZhbHVlIC0gbWF4d20gPiAxIHx8IG1heHdtIC0gdmFsdWUgPiAxICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJXQVJOSU5HIHZhbHVlICA9ICVmLCBidXQgbWF4d20gPSAlZlxuIiwgdmFsdWUsIG1heHdtICk7CgkJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkKCQl7CgkJCWZwcmludGYoIHN0ZGVyciwgIj4xLSVkXG4lc1xuIiwgaSwgbXNlcTFbaV0gKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiJXNcbiIsIGFzZXExW2ldICk7CgkJfQoJCWZvciggaT0wOyBpPGpjeWM7IGkrKyApCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICI+Mi0lZFxuJXNcbiIsIGksIG1zZXEyW2ldICk7CgkJCWZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBhc2VxMltpXSApOwoJCX0KCi8vCQlleGl0KCAxICk7Cgl9CgllbHNlCgl7CgkJZnByaW50Ziggc3RkZXJyLCAidmFsdWUgPSAlLjBmLCBtYXh3bSA9ICUuMGYgLT4gb2tcbiIsIHZhbHVlLCBtYXh3bSApOwoJfQojZW5kaWYKCiNpZiBNRU1TQVZFCiNlbHNlCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBzdHJjYXQoIG1zZXExW2ldLCBhc2VxMVtpXSApOwoJZm9yKCBpPTA7IGk8amN5YzsgaSsrICkgc3RyY2F0KCBtc2VxMltpXSwgYXNlcTJbaV0gKTsKI2VuZGlmCgovLwlmcHJpbnRmKCBzdGRlcnIsICI9PT09KHMpIGFzZXExWzBdICglZCkgPSAlcyAoJWQtJWQpXG4iLCBkZXB0aCwgYXNlcTFbMF0sIGlzdCwgaWVuICk7Ci8vCWZwcmludGYoIHN0ZGVyciwgIj09PT0ocykgYXNlcTJbMF0gKCVkKSA9ICVzICglZC0lZClcbiIsIGRlcHRoLCBhc2VxMlswXSwganN0LCBqZW4gKTsKCglmcmVlKCBnYXBzICk7CiNpZiBNRU1TQVZFCglmcmVlKCBhc2VxMSApOwoJZnJlZSggYXNlcTIgKTsKI2Vsc2UKCUZyZWVDaGFyTXR4KCBhc2VxMSApOwoJRnJlZUNoYXJNdHgoIGFzZXEyICk7CiNlbmRpZgoJCglyZXR1cm4oIHZhbHVlICk7Cn0KCgoKZmxvYXQgTGFsaWdubW1faG1vdXQoIGNoYXIgKipzZXExLCBjaGFyICoqc2VxMiwgZG91YmxlICplZmYxLCBkb3VibGUgKmVmZjIsIGludCBpY3ljLCBpbnQgamN5YywgaW50IGFsbG9jbGVuLCBjaGFyICpzZ2FwMSwgY2hhciAqc2dhcDIsIGNoYXIgKmVnYXAxLCBjaGFyICplZ2FwMiwgZmxvYXQgKiptYXAgKQovKiBzY29yZSBubyBrZWlzYW4gbm8gc2FpIG1vdG9rYXJhYXJ1IGdhcCBubyBhdHVrYWkgbmkgbW9uZGFpIGdhIGFydSAqLwp7Ci8vCWludCBrOwoJaW50IGksIGo7CglpbnQgbGwxLCBsbDI7CglpbnQgbGd0aDEsIGxndGgyOwoJZmxvYXQgd20gPSAwLjA7ICAgLyogaW50ID8/Pz8/PyAqLwoJY2hhciAqKm1zZXExOwoJY2hhciAqKm1zZXEyOwovLwljaGFyICoqbXNlcTsKCWZsb2F0ICpvZ2NwMTsKCWZsb2F0ICpvZ2NwMjsKCWZsb2F0ICpmZ2NwMTsKCWZsb2F0ICpmZ2NwMjsKCWZsb2F0ICoqY3BteDE7CglmbG9hdCAqKmNwbXgyOwoJZmxvYXQgKipnYXBpbmZvOwovLwlmbG9hdCBmcGVuYWx0eTsKCWZsb2F0IGZwZW5hbHR5ID0gKGZsb2F0KVJOQXBlbmFsdHk7CglpbnQgbmdsZW4xLCBuZ2xlbjI7CgoKCgoKI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgImVmZiBpbiBTQSsrK2FsaWduXG4iICk7Cglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBmcHJpbnRmKCBzdGRlcnIsICJlZmYxWyVkXSA9ICVmXG4iLCBpLCBlZmYxW2ldICk7CiNlbmRpZgoKCW5nbGVuMSA9IHNlcWxlbiggc2VxMVswXSApOwoJbmdsZW4yID0gc2VxbGVuKCBzZXEyWzBdICk7CgoJbGd0aDEgPSBzdHJsZW4oIHNlcTFbMF0gKTsKCWxndGgyID0gc3RybGVuKCBzZXEyWzBdICk7CgoJbGwxID0gKCAoaW50KShsZ3RoMSkgKSArIDEwMDsKCWxsMiA9ICggKGludCkobGd0aDIpICkgKyAxMDA7CgoJbXNlcTEgPSBBbGxvY2F0ZUNoYXJNdHgoIGljeWMsIGxsMStsbDIgKTsKCW1zZXEyID0gQWxsb2NhdGVDaGFyTXR4KCBqY3ljLCBsbDErbGwyICk7CgoJZ2FwaW5mbyA9IEFsbG9jYXRlRmxvYXRNdHgoIDQsIDAgKTsKCW9nY3AxID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCW9nY3AyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCWZnY3AxID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCWZnY3AyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCgoJY3BteDEgPSBBbGxvY2F0ZUZsb2F0TXR4KCBsbDErMiwgMjcgKTsKCWNwbXgyID0gQWxsb2NhdGVGbG9hdE10eCggbGwyKzIsIDI3ICk7CgoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgCgl7CgkJaWYoIHN0cmxlbiggc2VxMVtpXSApICE9IGxndGgxICkKCQl7CgkJCWZwcmludGYoIHN0ZGVyciwgImkgPSAlZCAvICVkXG4iLCBpLCBpY3ljICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImJ1ZyEgaGFpcmV0c3UgZ2Ega293YXJldGEhXG4iICk7CgkJCWV4aXQoIDEgKTsKCQl9Cgl9Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKQoJewoJCWlmKCBzdHJsZW4oIHNlcTJbal0gKSAhPSBsZ3RoMiApCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICJqID0gJWQgLyAlZFxuIiwgaiwgamN5YyApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJidWchIGhhaXJldHN1IGdhIGtvd2FyZXRhIVxuIiApOwoJCQlleGl0KCAxICk7CgkJfQoJfQoKCU1TY3BteF9jYWxjX25ldyggc2VxMSwgY3BteDEsIGVmZjEsIGxndGgxLCBpY3ljICk7CglNU2NwbXhfY2FsY19uZXcoIHNlcTIsIGNwbXgyLCBlZmYyLCBsZ3RoMiwgamN5YyApOwoKCiNpZiAxCgoJaWYoIHNnYXAxICkKCXsKCQluZXdfT3BlbmluZ0dhcENvdW50KCBvZ2NwMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEsIHNnYXAxICk7CgkJbmV3X09wZW5pbmdHYXBDb3VudCggb2djcDIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyLCBzZ2FwMiApOwoJCW5ld19GaW5hbEdhcENvdW50KCBmZ2NwMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEsIGVnYXAyICk7CgkJbmV3X0ZpbmFsR2FwQ291bnQoIGZnY3AyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiwgZWdhcDIgKTsKCX0KCWVsc2UKCXsKCQlzdF9PcGVuaW5nR2FwQ291bnQoIG9nY3AxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCXN0X09wZW5pbmdHYXBDb3VudCggb2djcDIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7CgkJc3RfRmluYWxHYXBDb3VudCggZmdjcDEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJc3RfRmluYWxHYXBDb3VudCggZmdjcDIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7Cgl9CgojaWYgMQoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJewoJCW9nY3AxW2ldID0gMC41ICogKCAxLjAgLSBvZ2NwMVtpXSApICogZnBlbmFsdHk7CgkJZmdjcDFbaV0gPSAwLjUgKiAoIDEuMCAtIGZnY3AxW2ldICkgKiBmcGVuYWx0eTsKLy8JCWZwcmludGYoIHN0ZGVyciwgImZnY3AxWyVkXSA9ICVmXG4iLCBpLCBmZ2NwMVtpXSApOwoJfQoJZm9yKCBpPTA7IGk8bGd0aDI7IGkrKyApIAoJewoJCW9nY3AyW2ldID0gMC41ICogKCAxLjAgLSBvZ2NwMltpXSApICogZnBlbmFsdHk7CgkJZmdjcDJbaV0gPSAwLjUgKiAoIDEuMCAtIGZnY3AyW2ldICkgKiBmcGVuYWx0eTsKLy8JCWZwcmludGYoIHN0ZGVyciwgImZnY3AyWyVkXSA9ICVmXG4iLCBpLCBmZ2NwMltpXSApOwoJfQojZWxzZQoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJewoJCW9nY3AxW2ldID0gMC41ICogZnBlbmFsdHk7CgkJZmdjcDFbaV0gPSAwLjUgKiBmcGVuYWx0eTsKCX0KCWZvciggaT0wOyBpPGxndGgyOyBpKysgKSAKCXsKCQlvZ2NwMltpXSA9IDAuNSAqIGZwZW5hbHR5OwoJCWZnY3AyW2ldID0gMC41ICogZnBlbmFsdHk7Cgl9CiNlbmRpZgoKCWdhcGluZm9bMF0gPSBvZ2NwMTsKCWdhcGluZm9bMV0gPSBmZ2NwMTsKCWdhcGluZm9bMl0gPSBvZ2NwMjsKCWdhcGluZm9bM10gPSBmZ2NwMjsKI2VuZGlmCgojaWYgMAoJZnByaW50Ziggc3Rkb3V0LCAiaW4gTVNhbGlnbm1tLmNcbiIgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApCgl7CgkJZnByaW50Ziggc3Rkb3V0LCAiPiVkIG9mIEdST1VQMVxuIiwgaSApOwoJCWZwcmludGYoIHN0ZG91dCwgIiVzXG4iLCBzZXExW2ldICk7Cgl9Cglmb3IoIGk9MDsgaTxqY3ljOyBpKysgKQoJewoJCWZwcmludGYoIHN0ZG91dCwgIj4lZCBvZiBHUk9VUDJcbiIsIGkgKTsKCQlmcHJpbnRmKCBzdGRvdXQsICIlc1xuIiwgc2VxMltpXSApOwoJfQoJZmZsdXNoKCBzdGRvdXQgKTsKI2VuZGlmCgoJd20gPSBNU2FsaWdubW1fcmVjKCBpY3ljLCBqY3ljLCBlZmYxLCBlZmYyLCBzZXExLCBzZXEyLCBjcG14MSwgY3BteDIsIDAsIGxndGgxLTEsIDAsIGxndGgyLTEsIGFsbG9jbGVuLCBtc2VxMSwgbXNlcTIsIDAsIGdhcGluZm8sIG1hcCApOwojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICIgc2VxMVswXSA9ICVzXG4iLCBzZXExWzBdICk7CgkJZnByaW50Ziggc3RkZXJyLCAiIHNlcTJbMF0gPSAlc1xuIiwgc2VxMlswXSApOwoJCWZwcmludGYoIHN0ZGVyciwgIm1zZXExWzBdID0gJXNcbiIsIG1zZXExWzBdICk7CgkJZnByaW50Ziggc3RkZXJyLCAibXNlcTJbMF0gPSAlc1xuIiwgbXNlcTJbMF0gKTsKI2VuZGlmCgovLwlmcHJpbnRmKCBzdGRlcnIsICJ3bSA9ICVmXG4iLCB3bSApOwoKI2lmIDAKCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBzdHJjcHkoIHNlcTFbaV0sIG1zZXExW2ldICk7Cglmb3IoIGk9MDsgaTxqY3ljOyBpKysgKSBzdHJjcHkoIHNlcTJbaV0sIG1zZXEyW2ldICk7CgoJaWYoIHNlcWxlbiggc2VxMVswXSApICE9IG5nbGVuMSApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiYnVnISBoYWlyZXRzdSBnYSBrb3dhcmV0YSEgKG5nbGVuMSkgc2VxbGVuKHNlcTFbMF0pPSVkIGJ1dCBuZ2xlbjE9JWRcbiIsIHNlcWxlbiggc2VxMVswXSApLCBuZ2xlbjEgKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJzZXExWzBdID0gJXNcbiIsIHNlcTFbMF0gKTsKCQlleGl0KCAxICk7Cgl9CglpZiggc2VxbGVuKCBzZXEyWzBdICkgIT0gbmdsZW4yICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJidWchIGhhaXJldHN1IGdhIGtvd2FyZXRhISAobmdsZW4yKSBzZXFsZW4oc2VxMlswXSk9JWQgYnV0IG5nbGVuMj0lZFxuIiwgc2VxbGVuKCBzZXEyWzBdICksIG5nbGVuMiApOwoJCWV4aXQoIDEgKTsKCX0KI2VuZGlmCgoJRnJlZUZsb2F0VmVjKCBvZ2NwMSApOwoJRnJlZUZsb2F0VmVjKCBvZ2NwMiApOwoJRnJlZUZsb2F0VmVjKCBmZ2NwMSApOwoJRnJlZUZsb2F0VmVjKCBmZ2NwMiApOwoJRnJlZUZsb2F0TXR4KCBjcG14MSApOwoJRnJlZUZsb2F0TXR4KCBjcG14MiApOwoJZnJlZSggKHZvaWQgKilnYXBpbmZvICk7CgoJRnJlZUNoYXJNdHgoIG1zZXExICk7CglGcmVlQ2hhck10eCggbXNlcTIgKTsKCglsZ3RoMSA9IHN0cmxlbiggc2VxMVswXSApOwoJbGd0aDIgPSBzdHJsZW4oIHNlcTJbMF0gKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIAoJewoJCWlmKCBzdHJsZW4oIHNlcTFbaV0gKSAhPSBsZ3RoMSApCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICJpID0gJWQgLyAlZFxuIiwgaSwgaWN5YyApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJoYWlyZXRzdSBnYSBrb3dhcmV0YSAoZW5kIG9mIE1TYWxpZ25tbSkgIVxuIiApOwoJCQlleGl0KCAxICk7CgkJfQoJfQoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkKCXsKCQlpZiggc3RybGVuKCBzZXEyW2pdICkgIT0gbGd0aDIgKQoJCXsKCQkJZnByaW50Ziggc3RkZXJyLCAiaiA9ICVkIC8gJWRcbiIsIGosIGpjeWMgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiaGFpcmV0c3UgZ2Ega293YXJldGEgKGVuZCBvZiBNU2FsaWdubW0pICFcbiIgKTsKCQkJZXhpdCggMSApOwoJCX0KCX0KCglyZXR1cm4oIHdtICk7Cn0KCmZsb2F0IExhbGlnbjJtMm1faG1vdXQoIGNoYXIgKipzZXExLCBjaGFyICoqc2VxMiwgY2hhciAqKnNlcTFyLCBjaGFyICoqc2VxMnIsIGNoYXIgKmRpcjEsIGNoYXIgKmRpcjIsIGRvdWJsZSAqZWZmMSwgZG91YmxlICplZmYyLCBpbnQgaWN5YywgaW50IGpjeWMsIGludCBhbGxvY2xlbiwgY2hhciAqc2dhcDEsIGNoYXIgKnNnYXAyLCBjaGFyICplZ2FwMSwgY2hhciAqZWdhcDIsIGZsb2F0ICoqbWFwICkKLyogc2NvcmUgbm8ga2Vpc2FuIG5vIHNhaSBtb3Rva2FyYWFydSBnYXAgbm8gYXR1a2FpIG5pIG1vbmRhaSBnYSBhcnUgKi8KewovLwlpbnQgazsKCWludCBpLCBqOwoJaW50IGxsMSwgbGwyOwoJaW50IGxndGgxLCBsZ3RoMjsKCWZsb2F0IHdtID0gMC4wOyAgIC8qIGludCA/Pz8/Pz8gKi8KCWNoYXIgKiptc2VxMTsKCWNoYXIgKiptc2VxMjsKCWZsb2F0ICpvZ2NwMTsKCWZsb2F0ICpvZ2NwMjsKCWZsb2F0ICpmZ2NwMTsKCWZsb2F0ICpmZ2NwMjsKCWZsb2F0ICoqY3BteDE7CglmbG9hdCAqKmNwbXgyOwoJZmxvYXQgKipnYXBpbmZvOwoJZmxvYXQgZnBlbmFsdHkgPSAoZmxvYXQpcGVuYWx0eTsKCWludCBuZ2xlbjEsIG5nbGVuMjsKCiNpZiAwCglmcHJpbnRmKCBzdGRlcnIsICJlZmYgaW4gU0ErKythbGlnblxuIiApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgZnByaW50Ziggc3RkZXJyLCAiZWZmMVslZF0gPSAlZlxuIiwgaSwgZWZmMVtpXSApOwojZW5kaWYKCgluZ2xlbjEgPSBzZXFsZW4oIHNlcTFbMF0gKTsKCW5nbGVuMiA9IHNlcWxlbiggc2VxMlswXSApOwoKCWxndGgxID0gc3RybGVuKCBzZXExWzBdICk7CglsZ3RoMiA9IHN0cmxlbiggc2VxMlswXSApOwoKCWxsMSA9ICggKGludCkobGd0aDEpICkgKyAxMDA7CglsbDIgPSAoIChpbnQpKGxndGgyKSApICsgMTAwOwoKCW1zZXExID0gQWxsb2NhdGVDaGFyTXR4KCBpY3ljLCBsbDErbGwyICk7Cgltc2VxMiA9IEFsbG9jYXRlQ2hhck10eCggamN5YywgbGwxK2xsMiApOwoKCWdhcGluZm8gPSBBbGxvY2F0ZUZsb2F0TXR4KCA0LCAwICk7CglvZ2NwMSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CglvZ2NwMiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CglmZ2NwMSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CglmZ2NwMiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgoKCWNwbXgxID0gQWxsb2NhdGVGbG9hdE10eCggbGwxKzIsIDM5ICk7CgljcG14MiA9IEFsbG9jYXRlRmxvYXRNdHgoIGxsMisyLCAzOSApOwoKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIAoJewoJCWlmKCBzdHJsZW4oIHNlcTFbaV0gKSAhPSBsZ3RoMSApCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICJpID0gJWQgLyAlZFxuIiwgaSwgaWN5YyApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJidWchIGhhaXJldHN1IGdhIGtvd2FyZXRhIVxuIiApOwoJCQlleGl0KCAxICk7CgkJfQoJfQoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkKCXsKCQlpZiggc3RybGVuKCBzZXEyW2pdICkgIT0gbGd0aDIgKQoJCXsKCQkJZnByaW50Ziggc3RkZXJyLCAiaiA9ICVkIC8gJWRcbiIsIGosIGpjeWMgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiYnVnISBoYWlyZXRzdSBnYSBrb3dhcmV0YSFcbiIgKTsKCQkJZXhpdCggMSApOwoJCX0KCX0KCiNpZiAwCglNU2NwbXhfY2FsY19uZXcoIHNlcTEsIGNwbXgxLCBlZmYxLCBsZ3RoMSwgaWN5YyApOwoJTVNjcG14X2NhbGNfbmV3KCBzZXEyLCBjcG14MiwgZWZmMiwgbGd0aDIsIGpjeWMgKTsKI2Vsc2UKCWNwbXhfcmlib3N1bSggc2VxMSwgc2VxMXIsIGRpcjEsIGNwbXgxLCBlZmYxLCBsZ3RoMSwgaWN5YyApOwoJY3BteF9yaWJvc3VtKCBzZXEyLCBzZXEyciwgZGlyMiwgY3BteDIsIGVmZjIsIGxndGgyLCBqY3ljICk7CiNlbmRpZgoKCiNpZiAxCgoJaWYoIHNnYXAxICkKCXsKCQluZXdfT3BlbmluZ0dhcENvdW50KCBvZ2NwMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEsIHNnYXAxICk7CgkJbmV3X09wZW5pbmdHYXBDb3VudCggb2djcDIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyLCBzZ2FwMiApOwoJCW5ld19GaW5hbEdhcENvdW50KCBmZ2NwMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEsIGVnYXAyICk7CgkJbmV3X0ZpbmFsR2FwQ291bnQoIGZnY3AyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiwgZWdhcDIgKTsKCX0KCWVsc2UKCXsKCQlzdF9PcGVuaW5nR2FwQ291bnQoIG9nY3AxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCXN0X09wZW5pbmdHYXBDb3VudCggb2djcDIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7CgkJc3RfRmluYWxHYXBDb3VudCggZmdjcDEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJc3RfRmluYWxHYXBDb3VudCggZmdjcDIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7Cgl9CgojaWYgMQoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJewoJCW9nY3AxW2ldID0gMC41ICogKCAxLjAgLSBvZ2NwMVtpXSApICogZnBlbmFsdHk7CgkJZmdjcDFbaV0gPSAwLjUgKiAoIDEuMCAtIGZnY3AxW2ldICkgKiBmcGVuYWx0eTsKLy8JCWZwcmludGYoIHN0ZGVyciwgImZnY3AxWyVkXSA9ICVmXG4iLCBpLCBmZ2NwMVtpXSApOwoJfQoJZm9yKCBpPTA7IGk8bGd0aDI7IGkrKyApIAoJewoJCW9nY3AyW2ldID0gMC41ICogKCAxLjAgLSBvZ2NwMltpXSApICogZnBlbmFsdHk7CgkJZmdjcDJbaV0gPSAwLjUgKiAoIDEuMCAtIGZnY3AyW2ldICkgKiBmcGVuYWx0eTsKLy8JCWZwcmludGYoIHN0ZGVyciwgImZnY3AyWyVkXSA9ICVmXG4iLCBpLCBmZ2NwMltpXSApOwoJfQojZWxzZQoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJewoJCW9nY3AxW2ldID0gMC41ICogZnBlbmFsdHk7CgkJZmdjcDFbaV0gPSAwLjUgKiBmcGVuYWx0eTsKCX0KCWZvciggaT0wOyBpPGxndGgyOyBpKysgKSAKCXsKCQlvZ2NwMltpXSA9IDAuNSAqIGZwZW5hbHR5OwoJCWZnY3AyW2ldID0gMC41ICogZnBlbmFsdHk7Cgl9CiNlbmRpZgoKCWdhcGluZm9bMF0gPSBvZ2NwMTsKCWdhcGluZm9bMV0gPSBmZ2NwMTsKCWdhcGluZm9bMl0gPSBvZ2NwMjsKCWdhcGluZm9bM10gPSBmZ2NwMjsKI2VuZGlmCgojaWYgMAoJZnByaW50Ziggc3Rkb3V0LCAiaW4gTVNhbGlnbm1tLmNcbiIgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApCgl7CgkJZnByaW50Ziggc3Rkb3V0LCAiPiVkIG9mIEdST1VQMVxuIiwgaSApOwoJCWZwcmludGYoIHN0ZG91dCwgIiVzXG4iLCBzZXExW2ldICk7Cgl9Cglmb3IoIGk9MDsgaTxqY3ljOyBpKysgKQoJewoJCWZwcmludGYoIHN0ZG91dCwgIj4lZCBvZiBHUk9VUDJcbiIsIGkgKTsKCQlmcHJpbnRmKCBzdGRvdXQsICIlc1xuIiwgc2VxMltpXSApOwoJfQoJZmZsdXNoKCBzdGRvdXQgKTsKI2VuZGlmCgoJd20gPSBNU2FsaWduMm0ybV9yZWMoIGljeWMsIGpjeWMsIGVmZjEsIGVmZjIsIHNlcTEsIHNlcTIsIGNwbXgxLCBjcG14MiwgMCwgbGd0aDEtMSwgMCwgbGd0aDItMSwgYWxsb2NsZW4sIG1zZXExLCBtc2VxMiwgMCwgZ2FwaW5mbywgbWFwICk7CiNpZiBERUJVRwoJCWZwcmludGYoIHN0ZGVyciwgIiBzZXExWzBdID0gJXNcbiIsIHNlcTFbMF0gKTsKCQlmcHJpbnRmKCBzdGRlcnIsICIgc2VxMlswXSA9ICVzXG4iLCBzZXEyWzBdICk7CgkJZnByaW50Ziggc3RkZXJyLCAibXNlcTFbMF0gPSAlc1xuIiwgbXNlcTFbMF0gKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJtc2VxMlswXSA9ICVzXG4iLCBtc2VxMlswXSApOwojZW5kaWYKCi8vCWZwcmludGYoIHN0ZGVyciwgIndtID0gJWZcbiIsIHdtICk7CgojaWYgMAoKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIHN0cmNweSggc2VxMVtpXSwgbXNlcTFbaV0gKTsKCWZvciggaT0wOyBpPGpjeWM7IGkrKyApIHN0cmNweSggc2VxMltpXSwgbXNlcTJbaV0gKTsKCglpZiggc2VxbGVuKCBzZXExWzBdICkgIT0gbmdsZW4xICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJidWchIGhhaXJldHN1IGdhIGtvd2FyZXRhISAobmdsZW4xKSBzZXFsZW4oc2VxMVswXSk9JWQgYnV0IG5nbGVuMT0lZFxuIiwgc2VxbGVuKCBzZXExWzBdICksIG5nbGVuMSApOwoJCWZwcmludGYoIHN0ZGVyciwgInNlcTFbMF0gPSAlc1xuIiwgc2VxMVswXSApOwoJCWV4aXQoIDEgKTsKCX0KCWlmKCBzZXFsZW4oIHNlcTJbMF0gKSAhPSBuZ2xlbjIgKQoJewoJCWZwcmludGYoIHN0ZGVyciwgImJ1ZyEgaGFpcmV0c3UgZ2Ega293YXJldGEhIChuZ2xlbjIpIHNlcWxlbihzZXEyWzBdKT0lZCBidXQgbmdsZW4yPSVkXG4iLCBzZXFsZW4oIHNlcTJbMF0gKSwgbmdsZW4yICk7CgkJZXhpdCggMSApOwoJfQojZW5kaWYKCglGcmVlRmxvYXRWZWMoIG9nY3AxICk7CglGcmVlRmxvYXRWZWMoIG9nY3AyICk7CglGcmVlRmxvYXRWZWMoIGZnY3AxICk7CglGcmVlRmxvYXRWZWMoIGZnY3AyICk7CglGcmVlRmxvYXRNdHgoIGNwbXgxICk7CglGcmVlRmxvYXRNdHgoIGNwbXgyICk7CglmcmVlKCAodm9pZCAqKWdhcGluZm8gKTsKCglGcmVlQ2hhck10eCggbXNlcTEgKTsKCUZyZWVDaGFyTXR4KCBtc2VxMiApOwoKCWxndGgxID0gc3RybGVuKCBzZXExWzBdICk7CglsZ3RoMiA9IHN0cmxlbiggc2VxMlswXSApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgCgl7CgkJaWYoIHN0cmxlbiggc2VxMVtpXSApICE9IGxndGgxICkKCQl7CgkJCWZwcmludGYoIHN0ZGVyciwgImkgPSAlZCAvICVkXG4iLCBpLCBpY3ljICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImhhaXJldHN1IGdhIGtvd2FyZXRhIChlbmQgb2YgTVNhbGlnbm1tKSAhXG4iICk7CgkJCWV4aXQoIDEgKTsKCQl9Cgl9Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKQoJewoJCWlmKCBzdHJsZW4oIHNlcTJbal0gKSAhPSBsZ3RoMiApCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICJqID0gJWQgLyAlZFxuIiwgaiwgamN5YyApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJoYWlyZXRzdSBnYSBrb3dhcmV0YSAoZW5kIG9mIE1TYWxpZ25tbSkgIVxuIiApOwoJCQlleGl0KCAxICk7CgkJfQoJfQoKCXJldHVybiggd20gKTsKfQo=