I2luY2x1ZGUgIm1sdGFsbi5oIgojaW5jbHVkZSAiZHAuaCIKCiNkZWZpbmUgTUVNU0FWRSAxCgojZGVmaW5lIERFQlVHIDAKI2RlZmluZSBVU0VfUEVOQUxUWV9FWCAgMAojZGVmaW5lIFNUT1JFV00gMAoKI2RlZmluZSBEUFRBTk5JIDEwMAoKCnN0YXRpYyBpbnQgcmVjY3ljbGUgPSAwOwoKCnN0YXRpYyB2b2lkIG1hdGNoX2NhbGMoIGZsb2F0ICptYXRjaCwgZmxvYXQgKipjcG14MSwgZmxvYXQgKipjcG14MiwgaW50IGkxLCBpbnQgbGd0aDIsIGZsb2F0ICoqZmxvYXR3b3JrLCBpbnQgKippbnR3b3JrLCBpbnQgaW5pdGlhbGl6ZSApCnsKCWludCBqLCBrLCBsOwoJZmxvYXQgc2NhcnJbMjZdOwoJZmxvYXQgKipjcG14cGQgPSBmbG9hdHdvcms7CglpbnQgKipjcG14cGRuID0gaW50d29yazsKCWludCBjb3VudCA9IDA7CglmbG9hdCAqbWF0Y2hwdDsKCWZsb2F0ICoqY3BteHBkcHQ7CglpbnQgKipjcG14cGRucHQ7CglpbnQgY3BrZDsKCglpZiggaW5pdGlhbGl6ZSApCgl7CgkJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJewoJCQljb3VudCA9IDA7CgkJCWZvciggbD0wOyBsPDI2OyBsKysgKQoJCQl7CgkJCQlpZiggY3BteDJbal1bbF0gKQoJCQkJewoJCQkJCWNwbXhwZFtqXVtjb3VudF0gPSBjcG14MltqXVtsXTsKCQkJCQljcG14cGRuW2pdW2NvdW50XSA9IGw7CgkJCQkJY291bnQrKzsKCQkJCX0KCQkJfQoJCQljcG14cGRuW2pdW2NvdW50XSA9IC0xOwoJCX0KCX0KCglmb3IoIGw9MDsgbDwyNjsgbCsrICkKCXsKCQlzY2FycltsXSA9IDAuMDsKCQlmb3IoIGs9MDsgazwyNjsgaysrICkKCQl7CgkJCXNjYXJyW2xdICs9IG5fZGlzW2tdW2xdICogY3BteDFbaTFdW2tdOwoJCX0KCX0KI2lmIDAgLyogpLOk7KTyu8ikpqTIpK2kz2Zsb2F0d29ya6TOpaKl7aWxobylyKTytdWky6S5pOsgKi8KCXsKCQlmbG9hdCAqZnB0LCAqKmZwdHB0LCAqZnB0MjsKCQlpbnQgKmlwdCwgKippcHRwdDsKCQlmcHQyID0gbWF0Y2g7CgkJaXB0cHQgPSBjcG14cGRuOwoJCWZwdHB0ID0gY3BteHBkOwoJCXdoaWxlKCBsZ3RoMi0tICkKCQl7CgkJCSpmcHQyID0gMC4wOwoJCQlpcHQ9KmlwdHB0LGZwdD0qZnB0cHQ7CgkJCXdoaWxlKCAqaXB0ID4gLTEgKQoJCQkJKmZwdDIgKz0gc2NhcnJbKmlwdCsrXSAqICpmcHQrKzsKCQkJZnB0MisrLGlwdHB0KyssZnB0cHQrKzsKCQl9IAoJfQoJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgl7CgkJbWF0Y2hbal0gPSAwLjA7CgkJZm9yKCBrPTA7IGNwbXhwZG5bal1ba10+LTE7IGsrKyApCgkJCW1hdGNoW2pdICs9IHNjYXJyW2NwbXhwZG5bal1ba11dICogY3BteHBkW2pdW2tdOwoJfSAKI2Vsc2UKCW1hdGNocHQgPSBtYXRjaDsKCWNwbXhwZG5wdCA9IGNwbXhwZG47CgljcG14cGRwdCA9IGNwbXhwZDsKCXdoaWxlKCBsZ3RoMi0tICkKCXsKCQkqbWF0Y2hwdCA9IDAuMDsKCQlmb3IoIGs9MDsgKGNwa2Q9KCpjcG14cGRucHQpW2tdKT4tMTsgaysrICkKCQkJKm1hdGNocHQgKz0gc2NhcnJbY3BrZF0gKiAoKmNwbXhwZHB0KVtrXTsKCQltYXRjaHB0Kys7CgkJY3BteHBkbnB0Kys7CgkJY3BteHBkcHQrKzsKCX0KI2VuZGlmCn0KCnN0YXRpYyBmbG9hdCBBdHJhY2tpbmcoIAoJCQkJCQljaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqbXNlcTEsIGNoYXIgKiptc2VxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGludCAqKmlqcCwgaW50IGljeWMsIGludCBqY3ljLAoJCQkJCQlpbnQgaXN0LCBpbnQgaWVuLCBpbnQganN0LCBpbnQgamVuICkKewoJaW50IGksIGosIGwsIGlpbiwgamluLCBpZmksIGpmaSwgbGd0aDEsIGxndGgyLCBrLCBrbGltOwoJY2hhciAqZ2FwdGFibGUxLCAqZ3QxYms7CgljaGFyICpnYXB0YWJsZTIsICpndDJiazsKCWxndGgxID0gaWVuLWlzdCsxOwoJbGd0aDIgPSBqZW4tanN0KzE7CgoJZ3QxYmsgPSBBbGxvY2F0ZUNoYXJWZWMoIGxndGgxK2xndGgyKzEgKTsKCWd0MmJrID0gQWxsb2NhdGVDaGFyVmVjKCBsZ3RoMStsZ3RoMisxICk7CgojaWYgMAoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJewoJCWZwcmludGYoIHN0ZGVyciwgImxhc3R2ZXJ0aWNhbHdbJWRdID0gJWZcbiIsIGksIGxhc3R2ZXJ0aWNhbHdbaV0gKTsKCX0KI2VuZGlmCgoKLy8JZnByaW50Ziggc3RkZXJyLCAiaW4gQXRyYWNraW5nLCBsZ3RoMT0lZCwgbGd0aDI9JWRcbiIsIGxndGgxLCBsZ3RoMiApOwogCiAgICBmb3IoIGk9MDsgaTxsZ3RoMSsxOyBpKysgKSAKICAgIHsKICAgICAgICBpanBbaV1bMF0gPSBpICsgMTsKICAgIH0KICAgIGZvciggaj0wOyBqPGxndGgyKzE7IGorKyApIAogICAgewogICAgICAgIGlqcFswXVtqXSA9IC0oIGogKyAxICk7CiAgICB9CgoKCWdhcHRhYmxlMSA9IGd0MWJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUxID0gMDsKCWdhcHRhYmxlMiA9IGd0MmJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUyID0gMDsKCi8vCWlmKCBsZ3RoMiA9PSAxICkgZnByaW50Ziggc3RkZXJyLCAiaW4gQXRyYWNraW5nLCBtc2VxMSA9ICVzLCBtc2VxMiA9ICVzXG4iLCBtc2VxMVswXSwgbXNlcTJbMF0gKTsKCglpaW4gPSBsZ3RoMTsgamluID0gbGd0aDI7CglrbGltID0gbGd0aDErbGd0aDI7Cglmb3IoIGs9MDsgazw9a2xpbTsgaysrICkgCgl7CgkJaWYoIGlqcFtpaW5dW2ppbl0gPCAwICkgCgkJewoJCQlpZmkgPSBpaW4tMTsgamZpID0gamluK2lqcFtpaW5dW2ppbl07CgkJfQoJCWVsc2UgaWYoIGlqcFtpaW5dW2ppbl0gPiAwICkKCQl7CgkJCWlmaSA9IGlpbi1panBbaWluXVtqaW5dOyBqZmkgPSBqaW4tMTsKCQl9CgkJZWxzZQoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbi0xOwoJCX0KCQlsID0gaWluIC0gaWZpOwoJCXdoaWxlKCAtLWwgKSAKCQl7CgkJCSotLWdhcHRhYmxlMSA9ICdvJzsKCQkJKi0tZ2FwdGFibGUyID0gJy0nOwoJCQlrKys7CgkJfQoJCWw9IGppbiAtIGpmaTsKCQl3aGlsZSggLS1sICkKCQl7CgkJCSotLWdhcHRhYmxlMSA9ICctJzsKCQkJKi0tZ2FwdGFibGUyID0gJ28nOwoJCQlrKys7CgkJfQoJCWlmKCBpaW4gPD0gMCB8fCBqaW4gPD0gMCApIGJyZWFrOwoJCSotLWdhcHRhYmxlMSA9ICdvJzsKCQkqLS1nYXB0YWJsZTIgPSAnbyc7CgkJaysrOwoJCWlpbiA9IGlmaTsgamluID0gamZpOwoKCX0KCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBnYXBpcmVydSggbXNlcTFbaV0sIHNlcTFbaV0raXN0LCBnYXB0YWJsZTEgKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIGdhcGlyZXJ1KCBtc2VxMltqXSwgc2VxMltqXStqc3QsIGdhcHRhYmxlMiApOwoKCWZyZWUoIGd0MWJrICk7CglmcmVlKCBndDJiayApOwoKLy8JZnByaW50Ziggc3RkZXJyLCAiaW4gQXRyYWNraW5nIChvd2FyaSksIG1zZXExID0gJXNcbiIsIG1zZXExWzBdICk7Ci8vCWZwcmludGYoIHN0ZGVyciwgImluIEF0cmFja2luZyAob3dhcmkpLCBtc2VxMiA9ICVzXG4iLCBtc2VxMlswXSApOwoJcmV0dXJuKCAwLjAgKTsKfQoKc3RhdGljIGZsb2F0IE1TYWxpZ25tbV90YW5uaSggaW50IGljeWMsIGludCBqY3ljLCBkb3VibGUgKmVmZjEsIGRvdWJsZSAqZWZmMiwgY2hhciAqKnNlcTEsIGNoYXIgKipzZXEyLCBmbG9hdCAqKmNwbXgxLCBmbG9hdCAqKmNwbXgyLCBpbnQgaXN0LCBpbnQgaWVuLCBpbnQganN0LCBpbnQgamVuLCBpbnQgYWxsb2NsZW4sIGNoYXIgKiptc2VxMSwgY2hhciAqKm1zZXEyLCBmbG9hdCAqKmdhcGluZm8gKQovKiBzY29yZSBubyBrZWlzYW4gbm8gc2FpIG1vdG9rYXJhYXJ1IGdhcCBubyBhdHVrYWkgbmkgbW9uZGFpIGdhIGFydSAqLwp7Ci8vCWludCBrOwoJcmVnaXN0ZXIgaW50IGksIGo7CglpbnQgbGwxLCBsbDI7CglpbnQgbGFzdGksIGxhc3RqOwoJZmxvYXQgd20gPSAwLjA7ICAgLyogaW50ID8/Pz8/PyAqLwoJZmxvYXQgZzsKCWZsb2F0ICpjdXJyZW50dywgKnByZXZpb3VzdzsKI2lmIFVTRV9QRU5BTFRZX0VYCglmbG9hdCBmcGVuYWx0eV9leCA9IChmbG9hdClwZW5hbHR5X2V4OwojZW5kaWYKI2lmIDEKCWZsb2F0ICp3dG1wOwoJaW50ICppanBwdDsKCWZsb2F0ICptanB0LCAqcHJlcHQsICpjdXJwdDsKCWludCAqbXBqcHQ7CiNlbmRpZgoJZmxvYXQgbWksICptOwoJaW50ICoqaWpwOwoJaW50IG1waSwgKm1wOwoJZmxvYXQgKncxLCAqdzI7CglmbG9hdCAqaW5pdHZlcnRpY2FsdzsgICAgLyoga3VmdXUgc3VyZWJhIGlyYW5haSAqLwoJZmxvYXQgKmxhc3R2ZXJ0aWNhbHc7ICAgIC8qIGt1ZnV1IHN1cmViYSBpcmFuYWkgKi8KCWludCAqKmludHdvcms7CglmbG9hdCAqKmZsb2F0d29yazsKCWludCAqKmludG10eDsKCWludCBsZ3RoMSwgbGd0aDI7CglmbG9hdCAqb2djcDE7CglmbG9hdCAqZmdjcDE7CglmbG9hdCAqb2djcDI7CglmbG9hdCAqZmdjcDI7Ci8vCWNoYXIgKiphc2VxMTsKLy8JY2hhciAqKmFzZXEyOwovLwljaGFyICoqYXNlcTFiaywgKiphc2VxMmJrOwoKCW9nY3AxID0gZ2FwaW5mb1swXSArIGlzdDsKCWZnY3AxID0gZ2FwaW5mb1sxXSArIGlzdDsKCW9nY3AyID0gZ2FwaW5mb1syXSArIGpzdDsKCWZnY3AyID0gZ2FwaW5mb1szXSArIGpzdDsKCiNpZiBTVE9SRVdNCgljaGFyIHR0dDFbMTAwMDBdLCB0dHQyWzEwMDAwXTsKI2VuZGlmCgoKCWxndGgxID0gaWVuLWlzdCsxOwoJbGd0aDIgPSBqZW4tanN0KzE7CgojaWYgU1RPUkVXTQoJc3RybmNweSggdHR0MSwgc2VxMVswXStpc3QsIGxndGgxICk7IHR0dDFbbGd0aDFdID0gMDsKCXN0cm5jcHkoIHR0dDIsIHNlcTJbMF0ranN0LCBsZ3RoMiApOyB0dHQyW2xndGgyXSA9IDA7CgoJZnByaW50Ziggc3RkZXJyLCAiaW4gX3Rhbm5pIGlzdCxpZW4gPSAlZCwlZCwgbGd0aDE9JWRcbiIsIGlzdCwgaWVuLCBsZ3RoMSApOwoJZnByaW50Ziggc3RkZXJyLCAiaW4gX3Rhbm5pIGpzdCxqZW4gPSAlZCwlZCwgbGd0aDI9JWRcbiIsIGpzdCwgamVuLCBsZ3RoMiApOwoJZnByaW50Ziggc3RkZXJyLCAidHR0MSA9ICVzXG4iLCB0dHQxICk7CglmcHJpbnRmKCBzdGRlcnIsICJ0dHQyID0gJXNcbiIsIHR0dDIgKTsKI2VuZGlmCgoKCWxsMSA9ICggKGludCkobGd0aDEpICkgKyAxMDA7CglsbDIgPSAoIChpbnQpKGxndGgyKSApICsgMTAwOwoKLy8JYXNlcTEgPSBBbGxvY2F0ZUNoYXJNdHgoIGljeWMsIDAgKTsKLy8JYXNlcTIgPSBBbGxvY2F0ZUNoYXJNdHgoIGpjeWMsIDAgKTsKLy8JYXNlcTFiayA9IEFsbG9jYXRlQ2hhck10eCggaWN5YywgbGd0aDErbGd0aDIrMTAwICk7Ci8vCWFzZXEyYmsgPSBBbGxvY2F0ZUNoYXJNdHgoIGpjeWMsIGxndGgxK2xndGgyKzEwMCApOwovLwlmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBhc2VxMVtpXSA9IGFzZXExYmtbaV07Ci8vCWZvciggaT0wOyBpPGpjeWM7IGkrKyApIGFzZXEyW2ldID0gYXNlcTJia1tpXTsKCgl3MSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7Cgl3MiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgoJaW5pdHZlcnRpY2FsdyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CglsYXN0dmVydGljYWx3ID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCgltID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCW1wID0gQWxsb2NhdGVJbnRWZWMoIGxsMisyICk7CgoJZmxvYXR3b3JrID0gQWxsb2NhdGVGbG9hdE10eCggTUFYKCBsbDEsIGxsMiApKzIsIDI3ICk7IAoJaW50d29yayA9IEFsbG9jYXRlSW50TXR4KCBNQVgoIGxsMSwgbGwyICkrMiwgMjcgKTsgCgoKCWludG10eCA9IEFsbG9jYXRlSW50TXR4KCBsbDErMSwgbGwyKzEgKTsKCglpanAgPSBpbnRtdHg7CgoJY3VycmVudHcgPSB3MTsKCXByZXZpb3VzdyA9IHcyOwoKCW1hdGNoX2NhbGMoIGluaXR2ZXJ0aWNhbHcsIGNwbXgyK2pzdCwgY3BteDEraXN0LCAwLCBsZ3RoMSwgZmxvYXR3b3JrLCBpbnR3b3JrLCAxICk7CgoJbWF0Y2hfY2FsYyggY3VycmVudHcsIGNwbXgxK2lzdCwgY3BteDIranN0LCAwLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAxICk7CgoJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCXsKCQlpbml0dmVydGljYWx3W2ldICs9ICggb2djcDFbMF0gKyBmZ2NwMVtpLTFdICk7Cgl9Cglmb3IoIGo9MTsgajxsZ3RoMisxOyBqKysgKQoJewoJCWN1cnJlbnR3W2pdICs9ICggb2djcDJbMF0gKyBmZ2NwMltqLTFdICk7Cgl9CgoJZm9yKCBqPTE7IGo8bGd0aDIrMTsgKytqICkgCgl7CgkJbVtqXSA9IGN1cnJlbnR3W2otMV0gKyBvZ2NwMVsxXTsgbXBbal0gPSAwOzsKCX0KCglsYXN0dmVydGljYWx3WzBdID0gY3VycmVudHdbbGd0aDItMV07CgoKCglsYXN0aSA9IGxndGgxKzE7Cglmb3IoIGk9MTsgaTxsYXN0aTsgaSsrICkKCXsKCgkJd3RtcCA9IHByZXZpb3VzdzsgCgkJcHJldmlvdXN3ID0gY3VycmVudHc7CgkJY3VycmVudHcgPSB3dG1wOwoKCQlwcmV2aW91c3dbMF0gPSBpbml0dmVydGljYWx3W2ktMV07CgoJCW1hdGNoX2NhbGMoIGN1cnJlbnR3LCBjcG14MStpc3QsIGNwbXgyK2pzdCwgaSwgbGd0aDIsIGZsb2F0d29yaywgaW50d29yaywgMCApOwoJCWN1cnJlbnR3WzBdID0gaW5pdHZlcnRpY2Fsd1tpXTsKCgkJbWkgPSBwcmV2aW91c3dbMF0gKyBvZ2NwMlsxXTsgCgkJbXBpID0gMDsKCgkJaWpwcHQgPSBpanBbaV0gKyAxOwoJCW1qcHQgPSBtICsgMTsKCQlwcmVwdCA9IHByZXZpb3VzdzsKCQljdXJwdCA9IGN1cnJlbnR3ICsgMTsKCQltcGpwdCA9IG1wICsgMTsKCQlsYXN0aiA9IGxndGgyKzE7CgkJZm9yKCBqPTE7IGo8bGFzdGo7IGorKyApCgkJewoJCQl3bSA9ICpwcmVwdDsKCQkJKmlqcHB0ID0gMDsKCiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmLT4iLCB3bSApOwojZW5kaWYKCQkJZyA9IG1pICsgZmdjcDJbai0xXTsKI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGY/IiwgZyApOwojZW5kaWYKCQkJaWYoIGcgPiB3bSApCgkJCXsKCQkJCXdtID0gZzsKCQkJCSppanBwdCA9IC0oIGogLSBtcGkgKTsKCQkJfQoJCQlnID0gKnByZXB0ICsgb2djcDJbal07CgkJCWlmKCBnID49IG1pICkKCQkJewoJCQkJbWkgPSBnOwoJCQkJbXBpID0gai0xOwoJCQl9CiNpZiBVU0VfUEVOQUxUWV9FWAoJCQltaSArPSBmcGVuYWx0eV9leDsKI2VuZGlmCgoJCQlnID0gKm1qcHQgKyBmZ2NwMVtpLTFdOwojaWYgMCAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGY/IiwgZyApOwojZW5kaWYKCQkJaWYoIGcgPiB3bSApCgkJCXsKCQkJCXdtID0gZzsKCQkJCSppanBwdCA9ICsoIGkgLSAqbXBqcHQgKTsKCQkJfQoJCQlnID0gKnByZXB0ICsgb2djcDFbaV07CgkJCWlmKCBnID49ICptanB0ICkKCQkJewoJCQkJKm1qcHQgPSBnOwoJCQkJKm1wanB0ID0gaS0xOwoJCQl9CiNpZiBVU0VfUEVOQUxUWV9FWAoJCQltW2pdICs9IGZwZW5hbHR5X2V4OwojZW5kaWYKCiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmICIsIHdtICk7CiNlbmRpZgoJCQkqY3VycHQgKz0gd207CgoKCQkJaWpwcHQrKzsKCQkJbWpwdCsrOwoJCQlwcmVwdCsrOwoJCQltcGpwdCsrOwoJCQljdXJwdCsrOwoJCX0KCQlsYXN0dmVydGljYWx3W2ldID0gY3VycmVudHdbbGd0aDItMV07Cgl9CgovLwlmcHJpbnRmKCBzdGRlcnIsICJ3bSA9ICVmXG4iLCB3bSApOwoKCUF0cmFja2luZyggc2VxMSwgc2VxMiwgbXNlcTEsIG1zZXEyLCBpanAsIGljeWMsIGpjeWMsIGlzdCwgaWVuLCBqc3QsIGplbiApOwoKLy8JZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgc3RyY3B5KCBtc2VxMVtpXSwgYXNlcTFbaV0gKTsKLy8JZm9yKCBpPTA7IGk8amN5YzsgaSsrICkgc3RyY3B5KCBtc2VxMltpXSwgYXNlcTJbaV0gKTsKCi8vCWZwcmludGYoIHN0ZGVyciwgImluIF90YW5uaSwgYXNlcTEgPSAlc1xuIiwgYXNlcTFbMF0gKTsKLy8JZnByaW50Ziggc3RkZXJyLCAiaW4gX3Rhbm5pLCBtc2VxMSA9ICVzXG4iLCBtc2VxMVswXSApOwoKCUZyZWVGbG9hdFZlYyggdzEgKTsKCUZyZWVGbG9hdFZlYyggdzIgKTsKCUZyZWVGbG9hdFZlYyggaW5pdHZlcnRpY2FsdyApOwoJRnJlZUZsb2F0VmVjKCBsYXN0dmVydGljYWx3ICk7CgoJRnJlZUZsb2F0VmVjKCBtICk7CglGcmVlSW50VmVjKCBtcCApOwoKCglGcmVlRmxvYXRNdHgoIGZsb2F0d29yayApOwoJRnJlZUludE10eCggaW50d29yayApOwoKCUZyZWVJbnRNdHgoIGludG10eCApOwoKLy8JRnJlZUNoYXJNdHgoIGFzZXExYmsgKTsKLy8JRnJlZUNoYXJNdHgoIGFzZXEyYmsgKTsKCi8vCWZyZWUoIGFzZXExICk7Ci8vCWZyZWUoIGFzZXEyICk7CgoJcmV0dXJuKCB3bSApOwoKfQoKc3RhdGljIGZsb2F0IE1TYWxpZ25tbV9yZWMoIGludCBpY3ljLCBpbnQgamN5YywgZG91YmxlICplZmYxLCBkb3VibGUgKmVmZjIsIGNoYXIgKipzZXExLCBjaGFyICoqc2VxMiwgZmxvYXQgKipjcG14MSwgZmxvYXQgKipjcG14MiwgaW50IGlzdCwgaW50IGllbiwgaW50IGpzdCwgaW50IGplbiwgaW50IGFsbG9jbGVuLCBjaGFyICoqbXNlcTEsIGNoYXIgKiptc2VxMiwgaW50IGRlcHRoLCBmbG9hdCAqKmdhcGluZm8gKQovKiBzY29yZSBubyBrZWlzYW4gbm8gc2FpIG1vdG9rYXJhYXJ1IGdhcCBubyBhdHVrYWkgbmkgbW9uZGFpIGdhIGFydSAqLwp7Ci8vCWludCBrOwoJaW50IGFsbmxlbjsKCWZsb2F0IHZhbHVlID0gMC4wOwoJcmVnaXN0ZXIgaW50IGksIGo7CgljaGFyICoqYXNlcTEsICoqYXNlcTI7CglpbnQgbGwxLCBsbDIsIGwsIGxlbjsKCWludCBsYXN0aSwgbGFzdGosIGltaWQ7CglpbnQgam1pZCA9IDA7IC8vIGJ5IEQuTWF0aG9nLCBhIGd1ZXNzCglmbG9hdCB3bSA9IDAuMDsgICAvKiBpbnQgPz8/Pz8/ICovCglmbG9hdCBnOwoJZmxvYXQgKmN1cnJlbnR3LCAqcHJldmlvdXN3OwojaWYgVVNFX1BFTkFMVFlfRVgKCWZsb2F0IGZwZW5hbHR5X2V4ID0gKGZsb2F0KXBlbmFsdHlfZXg7CiNlbmRpZgoJZmxvYXQgKnd0bXA7Ci8vCXNob3J0ICppanBwdDsKCWludCAqbXBqcHQ7Ci8vCXNob3J0ICoqaWpwOwoJaW50ICptcDsKCWludCBtcGk7CglmbG9hdCAqbWpwdCwgKnByZXB0LCAqY3VycHQ7CglmbG9hdCBtaTsKCWZsb2F0ICptOwoJZmxvYXQgKncxLCAqdzI7Ci8vCWZsb2F0ICptYXRjaDsKCWZsb2F0ICppbml0dmVydGljYWx3OyAgICAvKiBrdWZ1dSBzdXJlYmEgaXJhbmFpICovCglmbG9hdCAqbGFzdHZlcnRpY2FsdzsgICAgLyoga3VmdXUgc3VyZWJhIGlyYW5haSAqLwoJaW50ICoqaW50d29yazsKCWZsb2F0ICoqZmxvYXR3b3JrOwovLwlzaG9ydCAqKnNob3J0bXR4OwojaWYgU1RPUkVXTQoJZmxvYXQgKipXTU1UWDsKCWZsb2F0ICoqV01NVFgyOwojZW5kaWYKCWZsb2F0ICptaWR3OwoJZmxvYXQgKm1pZG07CglmbG9hdCAqbWlkbjsKCWludCBsZ3RoMSwgbGd0aDI7CglmbG9hdCBtYXh3bTsKCWludCAqanVtcGZvcndpOwoJaW50ICpqdW1wZm9yd2o7CglpbnQgKmp1bXBiYWNraTsKCWludCAqanVtcGJhY2tqOwoJaW50ICpqdW1wZHVtbWk7IC8vbXVkYQoJaW50ICpqdW1wZHVtbWogPSBOVUxMOyAvLyBieSBELk1hdGhvZywgYSBndWVzcwoJaW50IGp1bXBpLCBqdW1waiA9IDA7IC8vIGJ5IEQuTWF0aG9nLCBhIGd1ZXNzCgljaGFyICpnYXBzOwoJaW50IGlqcGksIGlqcGo7CglmbG9hdCAqb2djcDE7CglmbG9hdCAqZmdjcDE7CglmbG9hdCAqb2djcDI7CglmbG9hdCAqZmdjcDI7CglmbG9hdCBmaXJzdG07CglpbnQgZmlyc3RtcDsKI2lmIFNUT1JFV00KCXN0YXRpYyBjaGFyIHR0dDFbNTAwMDBdOwoJc3RhdGljIGNoYXIgdHR0Mls1MDAwMF07CiNlbmRpZgoKCW9nY3AxID0gZ2FwaW5mb1swXSArIGlzdDsKCWZnY3AxID0gZ2FwaW5mb1sxXSArIGlzdDsKCW9nY3AyID0gZ2FwaW5mb1syXSArIGpzdDsKCWZnY3AyID0gZ2FwaW5mb1szXSArIGpzdDsKCglkZXB0aCsrOwoJcmVjY3ljbGUrKzsKCglsZ3RoMSA9IGllbi1pc3QrMTsKCWxndGgyID0gamVuLWpzdCsxOwoKLy8JaWYoIGxndGgxIDwgNSApCi8vCQlmcHJpbnRmKCBzdGRlcnIsICJcbldBUk5JTkc6IGxndGgxID0gJWRcbiIsIGxndGgxICk7Ci8vCWlmKCBsZ3RoMiA8IDUgKQovLwkJZnByaW50Ziggc3RkZXJyLCAiXG5XQVJOSU5HOiBsZ3RoMiA9ICVkXG4iLCBsZ3RoMiApOwovLwoKI2lmIFNUT1JFV00KCWZwcmludGYoIHN0ZGVyciwgIj09PT0gTVNhbGlnbiAoZGVwdGg9JWQsIHJlY2N5Y2xlPSVkKSwgaXN0PSVkLCBpZW49JWQsIGpzdD0lZCwgamVuPSVkXG4iLCBkZXB0aCwgcmVjY3ljbGUsIGlzdCwgaWVuLCBqc3QsIGplbiApOwoJc3RybmNweSggdHR0MSwgc2VxMVswXStpc3QsIGxndGgxICk7CglzdHJuY3B5KCB0dHQyLCBzZXEyWzBdK2pzdCwgbGd0aDIgKTsKCXR0dDFbbGd0aDFdID0gMDsKCXR0dDJbbGd0aDJdID0gMDsKCWZwcmludGYoIHN0ZGVyciwgInNlcTEgPSAlc1xuIiwgdHR0MSApOwoJZnByaW50Ziggc3RkZXJyLCAic2VxMiA9ICVzXG4iLCB0dHQyICk7CiNlbmRpZgoJaWYoIGxndGgyIDw9IDAgKSAvLyBsZ3RoMSA8PSAwIGhhPwoJewovLwkJZnByaW50Ziggc3RkZXJyLCAiXG5cbj09PT0gamltZWlcblxuIiApOwovLwkJZXhpdCggMSApOwoJCWZvciggaT0wOyBpPGljeWM7IGkrKyApIAoJCXsKCQkJc3RybmNweSggbXNlcTFbaV0sIHNlcTFbaV0raXN0LCBsZ3RoMSApOwoJCQltc2VxMVtpXVtsZ3RoMV0gPSAwOwoJCX0KCQlmb3IoIGk9MDsgaTxqY3ljOyBpKysgKSAKCQl7CgkJCW1zZXEyW2ldWzBdID0gMDsKCQkJZm9yKCBqPTA7IGo8bGd0aDE7IGorKyApCgkJCQlzdHJjYXQoIG1zZXEyW2ldLCAiLSIgKTsKCQl9CgovLwkJZnByaW50Ziggc3RkZXJyLCAiPT09PSBtc2VxMVswXSAoJWQpID0gJXNcbiIsIGRlcHRoLCBtc2VxMVswXSApOwovLwkJZnByaW50Ziggc3RkZXJyLCAiPT09PSBtc2VxMlswXSAoJWQpID0gJXNcbiIsIGRlcHRoLCBtc2VxMlswXSApOwoKCQlyZXR1cm4oIDAuMCApOwoJfQoKI2lmIE1FTVNBVkUKCWFzZXExID0gQWxsb2NhdGVDaGFyTXR4KCBpY3ljLCAwICk7Cglhc2VxMiA9IEFsbG9jYXRlQ2hhck10eCggamN5YywgMCApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgYXNlcTFbaV0gPSBtc2VxMVtpXTsKCWZvciggaT0wOyBpPGpjeWM7IGkrKyApIGFzZXEyW2ldID0gbXNlcTJbaV07CiNlbHNlCglhc2VxMSA9IEFsbG9jYXRlQ2hhck10eCggaWN5YywgbGd0aDErbGd0aDIrMTAwICk7Cglhc2VxMiA9IEFsbG9jYXRlQ2hhck10eCggamN5YywgbGd0aDErbGd0aDIrMTAwICk7CiNlbmRpZgoKLy8gIGlmKCBsZ3RoMSA8IERQVEFOTkkgJiYgbGd0aDIgPCBEUFRBTk5JICkgLy8gJiBkYXRvIGxndGggPT0xIG5vIGthbm91c2VpIGdhIGFydW5vZGUgeW9rdW5haSAKLy8gICAgaWYoIGxndGgxIDwgRFBUQU5OSSApIC8vIGtvcmUgbW8gbGd0aDIgZ2EgbWlqaWthc3VnaXJ1IGthbm91c2VpIGFyaQogICAgaWYoIGxndGgxIDwgRFBUQU5OSSB8fCBsZ3RoMiA8IERQVEFOTkkgKSAvLyB6ZXR0YWkgbmkgYW56ZW4ga2E/Cgl7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICI9PT09IEdvaW5nIHRvIF90YW5uaVxuIiApOwoKCQl2YWx1ZSA9IE1TYWxpZ25tbV90YW5uaSggaWN5YywgamN5YywgZWZmMSwgZWZmMiwgc2VxMSwgc2VxMiwgY3BteDEsIGNwbXgyLCBpc3QsIGllbiwganN0LCBqZW4sIGFsbG9jbGVuLCBhc2VxMSwgYXNlcTIsIGdhcGluZm8gKTsJCgoKI2lmIE1FTVNBVkUKCQlmcmVlKCBhc2VxMSApOwoJCWZyZWUoIGFzZXEyICk7CiNlbHNlCgkJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgc3RyY3B5KCBtc2VxMVtpXSwgYXNlcTFbaV0gKTsKCQlmb3IoIGk9MDsgaTxqY3ljOyBpKysgKSBzdHJjcHkoIG1zZXEyW2ldLCBhc2VxMltpXSApOwoKCQlGcmVlQ2hhck10eCggYXNlcTEgKTsKCQlGcmVlQ2hhck10eCggYXNlcTIgKTsKI2VuZGlmCgovLwkJZnByaW50Ziggc3RkZXJyLCAidmFsdWUgPSAlZlxuIiwgdmFsdWUgKTsKCgkJcmV0dXJuKCB2YWx1ZSApOwoJfQovLwlmcHJpbnRmKCBzdGRlcnIsICJUcnlpbmcgdG8gZGl2aWRlIHRoZSBtdHhcbiIgKTsKCglsbDEgPSAoIChpbnQpKGxndGgxKSApICsgMTAwOwoJbGwyID0gKCAoaW50KShsZ3RoMikgKSArIDEwMDsKCi8vCWZwcmludGYoIHN0ZGVyciwgImxsMSxsbDI9JWQsJWRcbiIsIGxsMSwgbGwyICk7CgoJdzEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJdzIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwovLwltYXRjaCA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgltaWR3ID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCW1pZG4gPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJbWlkbSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CglqdW1wYmFja2kgPSBBbGxvY2F0ZUludFZlYyggbGwyKzIgKTsKCWp1bXBiYWNraiA9IEFsbG9jYXRlSW50VmVjKCBsbDIrMiApOwoJanVtcGZvcndpID0gQWxsb2NhdGVJbnRWZWMoIGxsMisyICk7CglqdW1wZm9yd2ogPSBBbGxvY2F0ZUludFZlYyggbGwyKzIgKTsKCWp1bXBkdW1taSA9IEFsbG9jYXRlSW50VmVjKCBsbDIrMiApOwoJanVtcGR1bW1qID0gQWxsb2NhdGVJbnRWZWMoIGxsMisyICk7CgoJaW5pdHZlcnRpY2FsdyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CglsYXN0dmVydGljYWx3ID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCgltID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCW1wID0gQWxsb2NhdGVJbnRWZWMoIGxsMisyICk7CglnYXBzID0gQWxsb2NhdGVDaGFyVmVjKCBNQVgoIGxsMSwgbGwyICkgKyAyICk7CgoJZmxvYXR3b3JrID0gQWxsb2NhdGVGbG9hdE10eCggTUFYKCBsbDEsIGxsMiApKzIsIDI2ICk7IAoJaW50d29yayA9IEFsbG9jYXRlSW50TXR4KCBNQVgoIGxsMSwgbGwyICkrMiwgMjYgKTsgCgojaWYgREVCVUcKCWZwcmludGYoIHN0ZGVyciwgInN1Y2NlZWRlZFxuIiApOwojZW5kaWYKCiNpZiBTVE9SRVdNCglXTU1UWCA9IEFsbG9jYXRlRmxvYXRNdHgoIGxsMSwgbGwyICk7CglXTU1UWDIgPSBBbGxvY2F0ZUZsb2F0TXR4KCBsbDEsIGxsMiApOwojZW5kaWYKI2lmIDAKCXNob3J0bXR4ID0gQWxsb2NhdGVTaG9ydE10eCggbGwxLCBsbDIgKTsKCiNpZiBERUJVRwoJZnByaW50Ziggc3RkZXJyLCAic3VjY2VlZGVkXG5cbiIgKTsKI2VuZGlmCgoJaWpwID0gc2hvcnRtdHg7CiNlbmRpZgoKCWN1cnJlbnR3ID0gdzE7CglwcmV2aW91c3cgPSB3MjsKCgltYXRjaF9jYWxjKCBpbml0dmVydGljYWx3LCBjcG14Mitqc3QsIGNwbXgxK2lzdCwgMCwgbGd0aDEsIGZsb2F0d29yaywgaW50d29yaywgMSApOwoKCW1hdGNoX2NhbGMoIGN1cnJlbnR3LCBjcG14MStpc3QsIGNwbXgyK2pzdCwgMCwgbGd0aDIsIGZsb2F0d29yaywgaW50d29yaywgMSApOwoKCWZvciggaT0xOyBpPGxndGgxKzE7IGkrKyApCgl7CgkJaW5pdHZlcnRpY2Fsd1tpXSArPSAoIG9nY3AxWzBdICsgZmdjcDFbaS0xXSApOwoJfQoJZm9yKCBqPTE7IGo8bGd0aDIrMTsgaisrICkKCXsKCQljdXJyZW50d1tqXSArPSAoIG9nY3AyWzBdICsgZmdjcDJbai0xXSApOwoJfQoKI2lmIFNUT1JFV00KCVdNTVRYWzBdWzBdID0gaW5pdHZlcnRpY2Fsd1swXTsKCWZvciggaT0xOyBpPGxndGgxKzE7IGkrKyApCgl7CgkJV01NVFhbaV1bMF0gPSBpbml0dmVydGljYWx3W2ldOwoJfQoJZm9yKCBqPTE7IGo8bGd0aDIrMTsgaisrICkKCXsKCQlXTU1UWFswXVtqXSA9IGN1cnJlbnR3W2pdOwoJfQojZW5kaWYKCgoJZm9yKCBqPTE7IGo8bGd0aDIrMTsgKytqICkgCgl7CgkJbVtqXSA9IGN1cnJlbnR3W2otMV0gKyBvZ2NwMVsxXTsKLy8JCW1bal0gPSBjdXJyZW50d1tqLTFdOwoJCW1wW2pdID0gMDsKCX0KCglsYXN0dmVydGljYWx3WzBdID0gY3VycmVudHdbbGd0aDItMV07CgoJaW1pZCA9IGxndGgxICogMC41OwoKCWp1bXBpID0gMDsgLy8gYXRvZGUga2F3YXJ1LgoJbGFzdGkgPSBsZ3RoMSsxOwojaWYgU1RPUkVXTQoJZm9yKCBpPTE7IGk8bGFzdGk7IGkrKyApCiNlbHNlCglmb3IoIGk9MTsgaTw9aW1pZDsgaSsrICkKI2VuZGlmCgl7CgkJd3RtcCA9IHByZXZpb3VzdzsgCgkJcHJldmlvdXN3ID0gY3VycmVudHc7CgkJY3VycmVudHcgPSB3dG1wOwoKCQlwcmV2aW91c3dbMF0gPSBpbml0dmVydGljYWx3W2ktMV07CgoJCW1hdGNoX2NhbGMoIGN1cnJlbnR3LCBjcG14MStpc3QsIGNwbXgyK2pzdCwgaSwgbGd0aDIsIGZsb2F0d29yaywgaW50d29yaywgMCApOwoJCWN1cnJlbnR3WzBdID0gaW5pdHZlcnRpY2Fsd1tpXTsKCgkJbVswXSA9IG9nY3AxW2ldOwojaWYgU1RPUkVNCgkJV01NVFgyW2ldWzBdID0gbVswXTsKI2VuZGlmCgkJaWYoIGkgPT0gaW1pZCApIG1pZG1bMF0gPSBtWzBdOwoKCQltaSA9IHByZXZpb3Vzd1swXSArIG9nY3AyWzFdOyAKLy8JCW1pID0gcHJldmlvdXN3WzBdOwoJCW1waSA9IDA7CgoKLy8JCWlqcHB0ID0gaWpwW2ldICsgMTsKCQltanB0ID0gbSArIDE7CgkJcHJlcHQgPSBwcmV2aW91c3c7CgkJY3VycHQgPSBjdXJyZW50dyArIDE7CgkJbXBqcHQgPSBtcCArIDE7CgoKCQlsYXN0aiA9IGxndGgyKzE7CgkJZm9yKCBqPTE7IGo8bGFzdGo7IGorKyApCgkJewoKCQkJd20gPSAqcHJlcHQ7CgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZi0+Iiwgd20gKTsKI2VuZGlmCgkJCWcgPSBtaSArIGZnY3AyW2otMV07Ci8vCQkJZyA9IG1pICsgZnBlbmFsdHk7CiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmPyIsIGcgKTsKI2VuZGlmCgkJCWlmKCBnID4gd20gKQoJCQl7CgkJCQl3bSA9IGc7Ci8vCQkJCSppanBwdCA9IC0oIGogLSBtcGkgKTsKCQkJfQoJCQlnID0gKnByZXB0ICsgb2djcDJbal07Ci8vCQkJZyA9ICpwcmVwdDsKCQkJaWYoIGcgPj0gbWkgKQoJCQl7CgkJCQltaSA9IGc7CgkJCQltcGkgPSBqLTE7CgkJCX0KI2lmIFVTRV9QRU5BTFRZX0VYCgkJCW1pICs9IGZwZW5hbHR5X2V4OwojZW5kaWYKCgkJCWcgPSAqbWpwdCArIGZnY3AxW2ktMV07Ci8vCQkJZyA9ICptanB0ICsgZnBlbmFsdHk7CiNpZiAwIAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZj8iLCBnICk7CiNlbmRpZgoJCQlpZiggZyA+IHdtICkKCQkJewoJCQkJd20gPSBnOwovLwkJCQkqaWpwcHQgPSArKCBpIC0gKm1wanB0ICk7CgkJCX0KCgoJCQlnID0gKnByZXB0ICsgb2djcDFbaV07Ci8vCQkJZyA9ICpwcmVwdDsKCQkJaWYoIGcgPj0gKm1qcHQgKQoJCQl7CgkJCQkqbWpwdCA9IGc7CgkJCQkqbXBqcHQgPSBpLTE7CgkJCX0KI2lmIFVTRV9QRU5BTFRZX0VYCgkJCW1bal0gKz0gZnBlbmFsdHlfZXg7CiNlbmRpZgoKI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGYgIiwgd20gKTsKI2VuZGlmCgkJCSpjdXJwdCArPSB3bTsKCiNpZiBTVE9SRVdNCgkJCVdNTVRYW2ldW2pdID0gKmN1cnB0OwoJCQlXTU1UWDJbaV1bal0gPSAqbWpwdDsKI2VuZGlmCgoJCQlpZiggaSA9PSBpbWlkICkgLy9tdWRhCgkJCXsJCgkJCQlqdW1wYmFja2pbal0gPSAqbXBqcHQ7IC8vIG11ZGEgYXRvZGUgbWF0b21lcnUKCQkJCWp1bXBiYWNraVtqXSA9IG1waTsgLy8gbXVkYSBhdG9kZSBtYXRvbWVydQovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJqdW1wYmFja2pbJWRdIGluIGZvcndhcmQgZHAgaXMgJWRcbiIsIGosICptcGpwdCApOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJqdW1wYmFja2lbJWRdIGluIGZvcndhcmQgZHAgaXMgJWRcbiIsIGosIG1waSApOwoJCQkJbWlkd1tqXSA9ICpjdXJwdDsKCQkJCW1pZG1bal0gPSAqbWpwdDsKCQkJCW1pZG5bal0gPSBtaTsKCQkJfQoKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJtWyVkXSA9ICVmXG4iLCBqLCBtW2pdICk7CgkJCW1qcHQrKzsKCQkJcHJlcHQrKzsKCQkJbXBqcHQrKzsKCQkJY3VycHQrKzsKCgkJfQoJCWxhc3R2ZXJ0aWNhbHdbaV0gPSBjdXJyZW50d1tsZ3RoMi0xXTsKCiNpZiBTVE9SRVdNCgkJV01NVFgyW2ldW2xndGgyXSA9IG1bbGd0aDItMV07CiNlbmRpZgoKI2lmIDAgIC8vIHVlCgkJaWYoIGkgPT0gaW1pZCApCgkJewoJCQlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkgbWlkd1tqXSA9IGN1cnJlbnR3W2pdOwoJCQlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkgbWlkbVtqXSA9IG1bal07CgkJfQojZW5kaWYKCX0KLy8JZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApIG1pZHdbal0gPSBXTU1UWFtpbWlkXVtqXTsKLy8JZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApIG1pZG1bal0gPSBXTU1UWDJbaW1pZF1bal07CgojaWYgMAogICAgZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCiAgICB7CiAgICAgICAgZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCiAgICAgICAgewogICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlIDEwLjJmICIsIFdNTVRYW2ldW2pdICk7CiAgICAgICAgfQogICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogICAgfQoJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CglmcHJpbnRmKCBzdGRlcnIsICJXTU1UWDIgPSBcbiIgKTsKICAgIGZvciggaT0wOyBpPGxndGgxOyBpKysgKQogICAgewogICAgICAgIGZvciggaj0wOyBqPGxndGgyOyBqKysgKQogICAgICAgIHsKICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJSAxMC4yZiAiLCBXTU1UWDJbaV1bal0gKTsKICAgICAgICB9CiAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiAgICB9CglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKI2VuZGlmCgovLyBneWFrdWRwCgoJbWF0Y2hfY2FsYyggaW5pdHZlcnRpY2FsdywgY3BteDIranN0LCBjcG14MStpc3QsIGxndGgyLTEsIGxndGgxLCBmbG9hdHdvcmssIGludHdvcmssIDEgKTsKCW1hdGNoX2NhbGMoIGN1cnJlbnR3LCBjcG14MStpc3QsIGNwbXgyK2pzdCwgbGd0aDEtMSwgbGd0aDIsIGZsb2F0d29yaywgaW50d29yaywgMSApOwoKCWZvciggaT0wOyBpPGxndGgxLTE7IGkrKyApCgl7CgkJaW5pdHZlcnRpY2Fsd1tpXSArPSAoIGZnY3AxW2xndGgxLTFdICsgb2djcDFbaSsxXSApOwovLwkJaW5pdHZlcnRpY2Fsd1tpXSArPSBmcGVuYWx0eTsKCX0KCWZvciggaj0wOyBqPGxndGgyLTE7IGorKyApCgl7CgkJY3VycmVudHdbal0gKz0gKCBmZ2NwMltsZ3RoMi0xXSArIG9nY3AyW2orMV0gKTsKLy8JCWN1cnJlbnR3W2pdICs9IGZwZW5hbHR5OwoJfQoKI2lmIFNUT1JFV00KCWZvciggaT0wOyBpPGxndGgxLTE7IGkrKyApCgl7CgkJV01NVFhbaV1bbGd0aDItMV0gKz0gKCBmZ2NwMVtsZ3RoMS0xXSArIG9nY3AxW2krMV0gKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJmZ2NwMVtsZ3RoMS0xXSArIG9nY3AxW2krMV0gPSAlZlxuIiwgZmdjcDFbbGd0aDEtMV0gKyBvZ2NwMVtpKzFdICk7Cgl9Cglmb3IoIGo9MDsgajxsZ3RoMi0xOyBqKysgKQoJewoJCVdNTVRYW2xndGgxLTFdW2pdICs9ICggZmdjcDJbbGd0aDItMV0gKyBvZ2NwMltqKzFdICk7CgkJZnByaW50Ziggc3RkZXJyLCAiZmdjcDJbbGd0aDItMV0gKyBvZ2NwMltqKzFdID0gJWZcbiIsIGZnY3AyW2xndGgyLTFdICsgb2djcDJbaisxXSApOwoJfQojZW5kaWYKCgoKCgoKCWZvciggaj1sZ3RoMi0xOyBqPjA7IC0taiApCgl7CgkJbVtqLTFdID0gY3VycmVudHdbal0gKyBmZ2NwMltsZ3RoMi0yXTsKLy8JCW1bai0xXSA9IGN1cnJlbnR3W2pdOwoJCW1wW2pdID0gbGd0aDEtMTsKCX0KCi8vCWZvciggaj0wOyBqPGxndGgyOyBqKysgKSBtW2pdID0gMC4wOwoJLy8gbVtsZ3RoMi0xXSBoYSBpcnVub2thPwoKCi8vCWZvciggaT1sZ3RoMS0yOyBpPj1pbWlkOyBpLS0gKQoJZmlyc3RtID0gLTk5OTk5OTkuOTsKCWZpcnN0bXAgPSBsZ3RoMS0xOwoJZm9yKCBpPWxndGgxLTI7IGk+LTE7IGktLSApCgl7CgkJd3RtcCA9IHByZXZpb3VzdzsKCQlwcmV2aW91c3cgPSBjdXJyZW50dzsKCQljdXJyZW50dyA9IHd0bXA7CgkJcHJldmlvdXN3W2xndGgyLTFdID0gaW5pdHZlcnRpY2Fsd1tpKzFdOwovLwkJbWF0Y2hfY2FsYyggY3VycmVudHcsIHNlcTEsIHNlcTIsIGksIGxndGgyICk7CgkJbWF0Y2hfY2FsYyggY3VycmVudHcsIGNwbXgxK2lzdCwgY3BteDIranN0LCBpLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAwICk7CgoJCWN1cnJlbnR3W2xndGgyLTFdID0gaW5pdHZlcnRpY2Fsd1tpXTsKCi8vCQltW2xndGgyXSA9IGZnY3AxW2ldOwovLwkJV01NVFgyW2ldW2xndGgyXSArPSBtW2xndGgyXTsKLy8JCWZwcmludGYoIHN0ZGVyciwgIm1bXSA9ICVmXG4iLCBtW2xndGgyXSApOwoKCQltaSA9IHByZXZpb3Vzd1tsZ3RoMi0xXSArIGZnY3AyW2xndGgyLTJdOwovLwkJbWkgPSBwcmV2aW91c3dbbGd0aDItMV07CgkJbXBpID0gbGd0aDIgLSAxOwoKCQltanB0ID0gbSArIGxndGgyIC0gMjsKCQlwcmVwdCA9IHByZXZpb3VzdyArIGxndGgyIC0gMTsKCQljdXJwdCA9IGN1cnJlbnR3ICsgbGd0aDIgLSAyOwoJCW1wanB0ID0gbXAgKyBsZ3RoMiAtIDI7CgoKCQlmb3IoIGo9bGd0aDItMjsgaj4tMTsgai0tICkKCQl7CgkJCXdtID0gKnByZXB0OwoJCQlpanBpID0gaSsxOwoJCQlpanBqID0gaisxOwoKCQkJZyA9IG1pICsgb2djcDJbaisxXTsKLy8JCQlnID0gbWkgKyBmcGVuYWx0eTsKCQkJaWYoIGcgPiB3bSApCgkJCXsKCQkJCXdtID0gZzsKCQkJCWlqcGogPSBtcGk7CgkJCQlpanBpID0gaSsxOwoJCQl9CgoJCQlnID0gKnByZXB0ICsgZmdjcDJbal07Ci8vCQkJZyA9ICpwcmVwdDsKCQkJaWYoIGcgPj0gbWkgKQoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImksaj0lZCwlZCAtIHJlbmV3ZWQhIG1waSA9ICVkXG4iLCBpLCBqLCBqKzEgKTsKCQkJCW1pID0gZzsKCQkJCW1waSA9IGogKyAxOwoJCQl9CgojaWYgVVNFX1BFTkFMVFlfRVgKCQkJbWkgKz0gZnBlbmFsdHlfZXg7CiNlbmRpZgoKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJpLGo9JWQsJWQgKm1wanB0ID0gJWRcbiIsIGksIGosICptcGpwdCApOwoJCQlnID0gKm1qcHQgKyBvZ2NwMVtpKzFdOwovLwkJCWcgPSAqbWpwdCArIGZwZW5hbHR5OwoJCQlpZiggZyA+IHdtICkKCQkJewoJCQkJd20gPSBnOwoJCQkJaWpwaSA9ICptcGpwdDsKCQkJCWlqcGogPSBqKzE7CgkJCX0KCi8vCQkJaWYoIGkgPT0gaW1pZCApZnByaW50Ziggc3RkZXJyLCAiaSxqPSVkLCVkIFxuIiwgaSwgaiApOwoJCQlnID0gKnByZXB0ICsgZmdjcDFbaV07Ci8vCQkJZyA9ICpwcmVwdDsKCQkJaWYoIGcgPj0gKm1qcHQgKQoJCQl7CgkJCQkqbWpwdCA9IGc7CgkJCQkqbXBqcHQgPSBpICsgMTsKCQkJfQoKI2lmIFVTRV9QRU5BTFRZX0VYCgkJCW1bal0gKz0gZnBlbmFsdHlfZXg7CiNlbmRpZgoKCQkJaWYoIGkgPT0ganVtcGkgfHwgaSA9PSBpbWlkIC0gMSApCgkJCXsKCQkJCWp1bXBmb3J3aVtqXSA9IGlqcGk7IC8vbXVkYQoJCQkJanVtcGZvcndqW2pdID0gaWpwajsgLy9tdWRhCi8vCQkJCWZwcmludGYoIHN0ZGVyciwgImp1bXBmb3JpWyVkXSA9ICVkXG4iLCBqLCBpanBpICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImp1bXBmb3JqWyVkXSA9ICVkXG4iLCBqLCBpanBqICk7CgkJCX0KCQkJaWYoIGkgPT0gaW1pZCApIC8vIG11ZGEKCQkJewoJCQkJbWlkd1tqXSArPSB3bTsKLy8JCQkJbWlkbVtqKzFdICs9ICptanB0ICsgZnBlbmFsdHk7IC8vPz8/Pz8/CgkJCQltaWRtW2orMV0gKz0gKm1qcHQ7IC8vPz8/Pz8/CgkJCX0KCQkJaWYoIGkgPT0gaW1pZCAtIDEgKQoJCQl7Ci8vCQkJCW1pZG5bal0gKz0gbWkgKyBmcGVuYWx0eTsgIC8vPz8/PwoJCQkJbWlkbltqXSArPSBtaTsgIC8vPz8/PwoJCQl9CiNpZiBTVE9SRVdNCgkJCVdNTVRYW2ldW2pdICs9IHdtOwovLwkJCVdNTVRYMltpXVtqKzFdICs9ICptanB0ICsgZnBlbmFsdHk7CgkJCVdNTVRYMltpXVtqKzFdICs9ICptanB0OwojZW5kaWYKCQkJKmN1cnB0ICs9IHdtOwoKCQkJbWpwdC0tOwoJCQlwcmVwdC0tOwoJCQltcGpwdC0tOwoJCQljdXJwdC0tOwoJCX0KLy8JCWZwcmludGYoIHN0ZGVyciwgImFkZGluZyAqbWpwdCAoPSVmKSB0byBXTU1UWDJbJWRdWyVkXVxuIiwgKm1qcHQsIGksIGorMSApOwoJCWcgPSAqcHJlcHQgKyBmZ2NwMVtpXTsKCQlpZiggZmlyc3RtIDwgZyApIAoJCXsKCQkJZmlyc3RtID0gZzsKCQkJZmlyc3RtcCA9IGkgKyAxOwoJCX0KI2lmIFNUT1JFV00KCQlXTU1UWDJbaV1baisxXSArPSBmaXJzdG07CiNlbmRpZgoJCWlmKCBpID09IGltaWQgKSBtaWRtW2orMV0gKz0gZmlyc3RtOwoKCQlpZiggaSA9PSBpbWlkIC0gMSApCQoJCXsKCQkJbWF4d20gPSBtaWR3WzFdOwoJCQlqbWlkID0gMDsKLy8JCQlpZiggZGVwdGggPT0gMSApIGZwcmludGYoIHN0ZGVyciwgIm1heHdtISEgPSAlZlxuIiwgbWF4d20gKTsKCQkJZm9yKCBqPTI7IGo8bGd0aDItMTsgaisrICkKCQkJewoJCQkJd20gPSBtaWR3W2pdOwoJCQkJaWYoIHdtID4gbWF4d20gKQoJCQkJewoJCQkJCWptaWQgPSBqOwoJCQkJCW1heHdtID0gd207CgkJCQl9Ci8vCQkJCWlmKCBkZXB0aCA9PSAxICkgZnByaW50Ziggc3RkZXJyLCAibWF4d20hISA9ICVmXG4iLCBtYXh3bSApOwoJCQl9CgkJCWZvciggaj0wOyBqPGxndGgyKzE7IGorKyApCgkJCXsKCQkJCXdtID0gbWlkbVtqXTsKCQkJCWlmKCB3bSA+IG1heHdtICkKCQkJCXsKCQkJCQlqbWlkID0gajsKCQkJCQltYXh3bSA9IHdtOwoJCQkJfQovLwkJCQlpZiggZGVwdGggPT0gMSApIGZwcmludGYoIHN0ZGVyciwgIm1heHdtISEgPSAlZlxuIiwgbWF4d20gKTsKCQkJfQoKLy8JCQlpZiggZGVwdGggPT0gMSApIGZwcmludGYoIHN0ZGVyciwgIm1heHdtISEgPSAlZlxuIiwgbWF4d20gKTsKCgovLwkJCWZwcmludGYoIHN0ZGVyciwgIiMjIyBpbWlkPSVkLCBqbWlkPSVkXG4iLCBpbWlkLCBqbWlkICk7CgkJCXdtID0gbWlkd1tqbWlkXTsKCQkJanVtcGkgPSBpbWlkLTE7CgkJCWp1bXBqID0gam1pZC0xOwoJCQlpZiggam1pZCA+IDAgJiYgbWlkbltqbWlkLTFdID4gd20gKSAvLzA2MDQxMwoJCQl7CgkJCQlqdW1waSA9IGltaWQtMTsKCQkJCWp1bXBqID0ganVtcGJhY2tpW2ptaWRdOwoJCQkJd20gPSBtaWRuW2ptaWQtMV07Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInJlanVtcCAobilcbiIgKTsKCQkJfQoJCQlpZiggbWlkbVtqbWlkXSA+IHdtICkKCQkJewoJCQkJanVtcGkgPSBqdW1wYmFja2pbam1pZF07CgkJCQlqdW1waiA9IGptaWQtMTsKCQkJCXdtID0gbWlkbVtqbWlkXTsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAicmVqdW1wIChtKSBqdW1waT0lZFxuIiwganVtcGkgKTsKCQkJfQoKCi8vCQkJZnByaW50Ziggc3RkZXJyLCAiLS0+IGltaWQ9JWQsIGptaWQ9JWRcbiIsIGltaWQsIGptaWQgKTsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICItLT4ganVtcGk9JWQsIGp1bXBqPSVkXG4iLCBqdW1waSwganVtcGogKTsKI2lmIFNUT1JFV00KCQkJZnByaW50Ziggc3RkZXJyLCAiaW1pZCA9ICVkXG4iLCBpbWlkICk7CgkJCWZwcmludGYoIHN0ZGVyciwgIm1pZG4gPSBcbiIgKTsKCQkJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJCXsKCQkJCWZwcmludGYoIHN0ZGVyciwgIiUgNy4xZiAiLCBtaWRuW2pdICk7CgkJCX0KCQkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CgkJCWZwcmludGYoIHN0ZGVyciwgIm1pZHcgPSBcbiIgKTsKCQkJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJCXsKCQkJCWZwcmludGYoIHN0ZGVyciwgIiUgNy4xZiAiLCBtaWR3W2pdICk7CgkJCX0KCQkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CgkJCWZwcmludGYoIHN0ZGVyciwgIm1pZG0gPSBcbiIgKTsKCQkJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJCXsKCQkJCWZwcmludGYoIHN0ZGVyciwgIiUgNy4xZiAiLCBtaWRtW2pdICk7CgkJCX0KCQkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiNlbmRpZgovLwkJCWZwcmludGYoIHN0ZGVyciwgIm1heHdtID0gJWZcbiIsIG1heHdtICk7CgkJfQoJCWlmKCBpID09IGp1bXBpICkgLy9zYWtpPwoJCXsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJpbWlkLCBqdW1waSA9ICVkLCVkXG4iLCBpbWlkLCBqdW1waSApOwovLwkJCWZwcmludGYoIHN0ZGVyciwgImptaWQsIGp1bXBqID0gJWQsJWRcbiIsIGptaWQsIGp1bXBqICk7CgkJCWlmKCBqbWlkID09IDAgKQoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgIkNIVUkyIVxuIiApOwoJCQkJanVtcGogPSAwOyBqbWlkID0gMTsKCQkJCWp1bXBpID0gZmlyc3RtcCAtIDE7CgkJCQlpbWlkID0gZmlyc3RtcDsKCQkJfQoKI2lmIDAKCQkJZWxzZSBpZiggam1pZCA9PSBsZ3RoMiApIAoJCQl7CgkJCQlmcHJpbnRmKCBzdGRlcnIsICJDSFVJMSFcbiIgKTsKCQkJCWp1bXBpPTA7IGp1bXBqPTA7CgkJCQlpbWlkPWp1bXBmb3J3aVswXTsgam1pZD1sZ3RoMi0xOwoJCQl9CiNlbHNlIC8vIDA2MDQxNAoJCQllbHNlIGlmKCBqbWlkID49IGxndGgyICkgCgkJCXsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAiQ0hVSTEhXG4iICk7CgkJCQlqdW1waT1pbWlkLTE7IGptaWQ9bGd0aDI7CgkJCQlqdW1waiA9IGxndGgyLTE7CgkJCX0KI2VuZGlmCgkJCWVsc2UKCQkJewoJCQkJaW1pZCA9IGp1bXBmb3J3aVtqdW1wal07CgkJCQlqbWlkID0ganVtcGZvcndqW2p1bXBqXTsKCQkJfQojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICJqdW1waSAtPiAlZFxuIiwganVtcGkgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAianVtcGogLT4gJWRcbiIsIGp1bXBqICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImltaWQgLT4gJWRcbiIsIGltaWQgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiam1pZCAtPiAlZFxuIiwgam1pZCApOwojZW5kaWYKCiNpZiBTVE9SRVdNCgkJCWJyZWFrOwojZWxzZQoJCQlicmVhazsKI2VuZGlmCgkJfQoJfQojaWYgMAoJCWp1bXBpPTA7IGp1bXBqPTA7CgkJaW1pZD1sZ3RoMS0xOyBqbWlkPWxndGgyLTE7Cgl9CiNlbmRpZgoKLy8JZnByaW50Ziggc3RkZXJyLCAiaW1pZCA9ICVkLCBidXQganVtcGkgPSAlZFxuIiwgaW1pZCwganVtcGkgKTsKLy8JZnByaW50Ziggc3RkZXJyLCAiam1pZCA9ICVkLCBidXQganVtcGogPSAlZFxuIiwgam1pZCwganVtcGogKTsKCi8vCWZvciggaj0wOyBqPGxndGgyOyBqKysgKSBtaWR3W2pdICs9IGN1cnJlbnR3W2pdOwovLwlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkgbWlkbVtqXSArPSBtW2orMV07Ci8vCWZvciggaj0wOyBqPGxndGgyOyBqKysgKSBtaWR3W2pdICs9IFdNTVRYW2ltaWRdW2pdOwovLwlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkgbWlkd1tqXSArPSBXTU1UWFtpbWlkXVtqXTsKCgojaWYgU1RPUkVXTQoJZnByaW50Ziggc3RkZXJyLCAiV01NVFggPSBcbiIgKTsKICAgIGZvciggaT0wOyBpPGxndGgxOyBpKysgKQogICAgewogICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiVkICIsIGkgKTsKICAgICAgICBmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKICAgICAgICB7CiAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiUgNy4yZiAiLCBXTU1UWFtpXVtqXSApOwogICAgICAgIH0KICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKICAgIH0KLy8JZnByaW50Ziggc3RkZXJyLCAiV01NVFgyID0gKHAgPSAlZilcbiIsIGZwZW5hbHR5ICk7CiAgICBmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKICAgIHsKICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlZCAiLCBpICk7CiAgICAgICAgZm9yKCBqPTA7IGo8bGd0aDIrMTsgaisrICkKICAgICAgICB7CiAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiUgNy4yZiAiLCBXTU1UWDJbaV1bal0gKTsKICAgICAgICB9CiAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiAgICB9CgoJZnByaW50Ziggc3RkZXJyLCAianVtcGJhY2tpID0gXG4iICk7Cglmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICIlIDdkICIsIGp1bXBiYWNraVtqXSApOwoJfQoJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CglmcHJpbnRmKCBzdGRlcnIsICJqdW1wYmFja2ogPSBcbiIgKTsKCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJewoJCWZwcmludGYoIHN0ZGVyciwgIiUgN2QgIiwganVtcGJhY2tqW2pdICk7Cgl9CglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZwcmludGYoIHN0ZGVyciwgImp1bXBmb3J3aSA9IFxuIiApOwoJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiJSA3ZCAiLCBqdW1wZm9yd2lbal0gKTsKCX0KCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJZnByaW50Ziggc3RkZXJyLCAianVtcGZvcndqID0gXG4iICk7Cglmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICIlIDdkICIsIGp1bXBmb3J3altqXSApOwoJfQoJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CgoKI2VuZGlmCgoKLy8JQXRyYWNraW5nKCBjdXJyZW50dywgbGFzdHZlcnRpY2Fsdywgc2VxMSwgc2VxMiwgbXNlcTEsIG1zZXEyLCBjcG14MSwgY3BteDIsIGlqcCwgaWN5YywgamN5YyApOwoKI2lmIDAgLy8gaXJ1a2FtbwoJcmVzdWx0bGVuID0gc3RybGVuKCBtc2VxMVswXSApOwoJaWYoIGFsbG9jbGVuIDwgcmVzdWx0bGVuIHx8IHJlc3VsdGxlbiA+IE4gKQoJewoJCWZwcmludGYoIHN0ZGVyciwgImFsbG9jbGVuPSVkLCByZXN1bHRsZW49JWQsIE49JWRcbiIsIGFsbG9jbGVuLCByZXN1bHRsZW4sIE4gKTsKCQlFcnJvckV4aXQoICJMRU5HVEggT1ZFUiFcbiIgKTsKCX0KI2VuZGlmCgoKCiNpZiAwCglmcHJpbnRmKCBzdGRlcnIsICJqdW1waSA9ICVkLCBpbWlkID0gJWRcbiIsIGp1bXBpLCBpbWlkICk7CglmcHJpbnRmKCBzdGRlcnIsICJqdW1waiA9ICVkLCBqbWlkID0gJWRcbiIsIGp1bXBqLCBqbWlkICk7CgoJZnByaW50Ziggc3RkZXJyLCAiaW1pZCA9ICVkXG4iLCBpbWlkICk7CglmcHJpbnRmKCBzdGRlcnIsICJqbWlkID0gJWRcbiIsIGptaWQgKTsKI2VuZGlmCgoKCUZyZWVGbG9hdFZlYyggdzEgKTsKCUZyZWVGbG9hdFZlYyggdzIgKTsKCUZyZWVGbG9hdFZlYyggaW5pdHZlcnRpY2FsdyApOwoJRnJlZUZsb2F0VmVjKCBsYXN0dmVydGljYWx3ICk7CglGcmVlRmxvYXRWZWMoIG1pZHcgKTsKCUZyZWVGbG9hdFZlYyggbWlkbSApOwoJRnJlZUZsb2F0VmVjKCBtaWRuICk7CgoJRnJlZUludFZlYygganVtcGJhY2tpICk7CglGcmVlSW50VmVjKCBqdW1wYmFja2ogKTsKCUZyZWVJbnRWZWMoIGp1bXBmb3J3aSApOwoJRnJlZUludFZlYygganVtcGZvcndqICk7CglGcmVlSW50VmVjKCBqdW1wZHVtbWkgKTsKCUZyZWVJbnRWZWMoIGp1bXBkdW1taiApOwoKCUZyZWVGbG9hdFZlYyggbSApOwoJRnJlZUludFZlYyggbXAgKTsKCglGcmVlRmxvYXRNdHgoIGZsb2F0d29yayApOwoJRnJlZUludE10eCggaW50d29yayApOwoKI2lmIFNUT1JFV00KCUZyZWVGbG9hdE10eCggV01NVFggKTsKCUZyZWVGbG9hdE10eCggV01NVFgyICk7CiNlbmRpZgoKLy8JZnByaW50Ziggc3RkZXJyLCAiPT09PSBjYWxsaW5nIG15c2VsZiAoZmlyc3QpXG4iICk7CgojaWYgMAoJCWZwcmludGYoIHN0ZGVyciwgInNlcTFbMF0gPSAlc1xuIiwgc2VxMVswXSApOwoJCWZwcmludGYoIHN0ZGVyciwgInNlcTJbMF0gPSAlc1xuIiwgc2VxMlswXSApOwojZW5kaWYKCXZhbHVlID0gTVNhbGlnbm1tX3JlYyggaWN5YywgamN5YywgZWZmMSwgZWZmMiwgc2VxMSwgc2VxMiwgY3BteDEsIGNwbXgyLCBpc3QsIGlzdCtqdW1waSwganN0LCBqc3QranVtcGosIGFsbG9jbGVuLCBhc2VxMSwgYXNlcTIsIGRlcHRoLCBnYXBpbmZvICk7CQojaWYgMAoJCWZwcmludGYoIHN0ZGVyciwgImFzZXExWzBdID0gJXNcbiIsIGFzZXExWzBdICk7CgkJZnByaW50Ziggc3RkZXJyLCAiYXNlcTJbMF0gPSAlc1xuIiwgYXNlcTJbMF0gKTsKI2VuZGlmCiNpZiBNRU1TQVZFCiNlbHNlCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBzdHJjcHkoIG1zZXExW2ldLCBhc2VxMVtpXSApOwoJZm9yKCBpPTA7IGk8amN5YzsgaSsrICkgc3RyY3B5KCBtc2VxMltpXSwgYXNlcTJbaV0gKTsKI2VuZGlmCgovLwlmcHJpbnRmKCBzdGRlcnIsICI9PT09KGYpIGFzZXExWzBdICglZCkgPSAlcyAoJWQtJWQpXG4iLCBkZXB0aCwgYXNlcTFbMF0sIGlzdCwgaWVuICk7Ci8vCWZwcmludGYoIHN0ZGVyciwgIj09PT0oZikgYXNlcTJbMF0gKCVkKSA9ICVzICglZC0lZClcbiIsIGRlcHRoLCBhc2VxMlswXSwganN0LCBqZW4gKTsKCglsZW4gPSBzdHJsZW4oIG1zZXExWzBdICk7Ci8vCWZwcmludGYoIHN0ZGVyciwgImxlbiA9ICVkXG4iLCBsZW4gKTsKCWwgPSBqbWlkIC0ganVtcGogLSAxOwovLwlmcHJpbnRmKCBzdGRlcnIsICJsPSVkXG4iLCBsICk7CglpZiggbCA+IDAgKQoJewoJCWZvciggaT0wOyBpPGw7IGkrKyApIGdhcHNbaV0gPSAnLSc7IGdhcHNbaV0gPSAwOwoJCWZvciggaT0wOyBpPGljeWM7IGkrKyApIAoJCXsKCQkJc3RyY2F0KCBtc2VxMVtpXSwgZ2FwcyApOwoJCQltc2VxMVtpXVtsZW4rbF0gPSAwOwoJCX0KCQlmb3IoIGo9MDsgajxqY3ljOyBqKysgKQoJCXsKCQkJc3RybmNhdCggbXNlcTJbal0sIHNlcTJbal0ranN0K2p1bXBqKzEsIGwgKTsKCQkJbXNlcTJbal1bbGVuK2xdID0gMDsKCQl9Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJwZW5hbGl6aW5nICgyKSAuLiAlZiglZCksICVmKCVkKVxuIiwgb2djcDJbanVtcGorMV0sIGp1bXBqKzEsIGZnY3AyW2ptaWQtMV0sIGptaWQtMSApOwoJCXZhbHVlICs9ICAoIG9nY3AyW2p1bXBqKzFdICsgZmdjcDJbam1pZC0xXSApOwovLwkJdmFsdWUgKz0gZnBlbmFsdHk7Cgl9CglsZW4gPSBzdHJsZW4oIG1zZXExWzBdICk7CglsID0gaW1pZCAtIGp1bXBpIC0gMTsKLy8JZnByaW50Ziggc3RkZXJyLCAibD0lZFxuIiwgbCApOwoJaWYoIGwgPiAwICkKCXsKCQlmb3IoIGk9MDsgaTxsOyBpKysgKSBnYXBzW2ldID0gJy0nOyBnYXBzW2ldID0gMDsKCQlmb3IoIGk9MDsgaTxpY3ljOyBpKysgKQoJCXsKCQkJc3RybmNhdCggbXNlcTFbaV0sIHNlcTFbaV0raXN0K2p1bXBpKzEsIGwgKTsKCQkJbXNlcTFbaV1bbGVuK2xdID0gMDsKCQl9CgkJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgCgkJewoJCQlzdHJjYXQoIG1zZXEyW2pdLCBnYXBzICk7CgkJCW1zZXEyW2pdW2xlbitsXSA9IDA7CgkJfQoKLy8JCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSBmcHJpbnRmKCBzdGRlcnIsICJvZ2NwMVslZF0gPSAlZlxuIiwgaSwgb2djcDFbaV0gKTsKLy8JCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSBmcHJpbnRmKCBzdGRlcnIsICJmZ2NwMVslZF0gPSAlZlxuIiwgaSwgZmdjcDFbaV0gKTsKCgovLwkJZnByaW50Ziggc3RkZXJyLCAicGVuYWxpemluZyAoMSkgLi4gb2djcDFbJWRdID0gJWYsIGZnY3AxWyVkXSA9ICVmXG4iLCBqdW1waSsxLCBvZ2NwMVtqdW1waSsxXSwgaW1pZC0xLCBmZ2NwMVtpbWlkLTFdICk7CgkJdmFsdWUgKz0gKCBvZ2NwMVtqdW1waSsxXSArIGZnY3AxW2ltaWQtMV0gKTsKLy8JCXZhbHVlICs9IGZwZW5hbHR5OwoJfQojaWYgMAoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgZnByaW50Ziggc3RkZXJyLCAiYWZ0ZXIgZ2FwZmlsbCBtc2VxMVslZF09JXNcbiIsIGksIG1zZXExW2ldICk7Cglmb3IoIGk9MDsgaTxqY3ljOyBpKysgKSBmcHJpbnRmKCBzdGRlcnIsICJhZnRlciBnYXBmaWxsIG1zZXEyWyVkXT0lc1xuIiwgaSwgbXNlcTJbaV0gKTsKI2VuZGlmCgovLwlmcHJpbnRmKCBzdGRlcnIsICI9PT09IGNhbGxpbmcgbXlzZWxmIChzZWNvbmQpXG4iICk7CgojaWYgTUVNU0FWRQoJYWxubGVuID0gc3RybGVuKCBhc2VxMVswXSApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgYXNlcTFbaV0gKz0gYWxubGVuOwoJZm9yKCBpPTA7IGk8amN5YzsgaSsrICkgYXNlcTJbaV0gKz0gYWxubGVuOwojZW5kaWYKCiNpZiAwCgkJZnByaW50Ziggc3RkZXJyLCAic2VxMVswXSA9ICVzXG4iLCBzZXExWzBdICk7CgkJZnByaW50Ziggc3RkZXJyLCAic2VxMlswXSA9ICVzXG4iLCBzZXEyWzBdICk7CiNlbmRpZgoJdmFsdWUgKz0gTVNhbGlnbm1tX3JlYyggaWN5YywgamN5YywgZWZmMSwgZWZmMiwgc2VxMSwgc2VxMiwgY3BteDEsIGNwbXgyLCBpc3QraW1pZCwgaWVuLCBqc3Qram1pZCwgamVuLCBhbGxvY2xlbiwgYXNlcTEsIGFzZXEyLCBkZXB0aCwgZ2FwaW5mbyApOwkKI2lmIDAKCQlmcHJpbnRmKCBzdGRlcnIsICJhc2VxMVswXSA9ICVzXG4iLCBhc2VxMVswXSApOwoJCWZwcmludGYoIHN0ZGVyciwgImFzZXEyWzBdID0gJXNcbiIsIGFzZXEyWzBdICk7CiNlbmRpZgoKCgojaWYgREVCVUcKCWlmKCB2YWx1ZSAtIG1heHdtID4gMSB8fCBtYXh3bSAtIHZhbHVlID4gMSApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiV0FSTklORyB2YWx1ZSAgPSAlZiwgYnV0IG1heHdtID0gJWZcbiIsIHZhbHVlLCBtYXh3bSApOwoJCWZvciggaT0wOyBpPGljeWM7IGkrKyApCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICI+MS0lZFxuJXNcbiIsIGksIG1zZXExW2ldICk7CgkJCWZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBhc2VxMVtpXSApOwoJCX0KCQlmb3IoIGk9MDsgaTxqY3ljOyBpKysgKQoJCXsKCQkJZnByaW50Ziggc3RkZXJyLCAiPjItJWRcbiVzXG4iLCBpLCBtc2VxMltpXSApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICIlc1xuIiwgYXNlcTJbaV0gKTsKCQl9CgovLwkJZXhpdCggMSApOwoJfQoJZWxzZQoJewoJCWZwcmludGYoIHN0ZGVyciwgInZhbHVlID0gJS4wZiwgbWF4d20gPSAlLjBmIC0+IG9rXG4iLCB2YWx1ZSwgbWF4d20gKTsKCX0KI2VuZGlmCgojaWYgTUVNU0FWRQojZWxzZQoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgc3RyY2F0KCBtc2VxMVtpXSwgYXNlcTFbaV0gKTsKCWZvciggaT0wOyBpPGpjeWM7IGkrKyApIHN0cmNhdCggbXNlcTJbaV0sIGFzZXEyW2ldICk7CiNlbmRpZgoKLy8JZnByaW50Ziggc3RkZXJyLCAiPT09PShzKSBhc2VxMVswXSAoJWQpID0gJXMgKCVkLSVkKVxuIiwgZGVwdGgsIGFzZXExWzBdLCBpc3QsIGllbiApOwovLwlmcHJpbnRmKCBzdGRlcnIsICI9PT09KHMpIGFzZXEyWzBdICglZCkgPSAlcyAoJWQtJWQpXG4iLCBkZXB0aCwgYXNlcTJbMF0sIGpzdCwgamVuICk7CgoJZnJlZSggZ2FwcyApOwojaWYgTUVNU0FWRQoJZnJlZSggYXNlcTEgKTsKCWZyZWUoIGFzZXEyICk7CiNlbHNlCglGcmVlQ2hhck10eCggYXNlcTEgKTsKCUZyZWVDaGFyTXR4KCBhc2VxMiApOwojZW5kaWYKCQoJcmV0dXJuKCB2YWx1ZSApOwp9CgoKCmZsb2F0IE1TYWxpZ25tbSggY2hhciAqKnNlcTEsIGNoYXIgKipzZXEyLCBkb3VibGUgKmVmZjEsIGRvdWJsZSAqZWZmMiwgaW50IGljeWMsIGludCBqY3ljLCBpbnQgYWxsb2NsZW4sIGNoYXIgKnNnYXAxLCBjaGFyICpzZ2FwMiwgY2hhciAqZWdhcDEsIGNoYXIgKmVnYXAyICkKLyogc2NvcmUgbm8ga2Vpc2FuIG5vIHNhaSBtb3Rva2FyYWFydSBnYXAgbm8gYXR1a2FpIG5pIG1vbmRhaSBnYSBhcnUgKi8KewovLwlpbnQgazsKCWludCBpLCBqOwoJaW50IGxsMSwgbGwyOwoJaW50IGxndGgxLCBsZ3RoMjsKCWZsb2F0IHdtID0gMC4wOyAgIC8qIGludCA/Pz8/Pz8gKi8KCWNoYXIgKiptc2VxMTsKCWNoYXIgKiptc2VxMjsKCWZsb2F0ICpvZ2NwMTsKCWZsb2F0ICpvZ2NwMjsKCWZsb2F0ICpmZ2NwMTsKCWZsb2F0ICpmZ2NwMjsKCWZsb2F0ICoqY3BteDE7CglmbG9hdCAqKmNwbXgyOwoJZmxvYXQgKipnYXBpbmZvOwoJZmxvYXQgZnBlbmFsdHkgPSAoZmxvYXQpcGVuYWx0eTsKCWludCBuZ2xlbjEsIG5nbGVuMjsKCiNpZiAwCglmcHJpbnRmKCBzdGRlcnIsICJlZmYgaW4gU0ErKythbGlnblxuIiApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgZnByaW50Ziggc3RkZXJyLCAiZWZmMVslZF0gPSAlZlxuIiwgaSwgZWZmMVtpXSApOwojZW5kaWYKCgluZ2xlbjEgPSBzZXFsZW4oIHNlcTFbMF0gKTsKCW5nbGVuMiA9IHNlcWxlbiggc2VxMlswXSApOwoKCWxndGgxID0gc3RybGVuKCBzZXExWzBdICk7CglsZ3RoMiA9IHN0cmxlbiggc2VxMlswXSApOwoKCWxsMSA9ICggKGludCkobGd0aDEpICkgKyAxMDA7CglsbDIgPSAoIChpbnQpKGxndGgyKSApICsgMTAwOwoKCW1zZXExID0gQWxsb2NhdGVDaGFyTXR4KCBpY3ljLCBsbDErbGwyICk7Cgltc2VxMiA9IEFsbG9jYXRlQ2hhck10eCggamN5YywgbGwxK2xsMiApOwoKCWdhcGluZm8gPSBBbGxvY2F0ZUZsb2F0TXR4KCA0LCAwICk7CglvZ2NwMSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CglvZ2NwMiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CglmZ2NwMSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CglmZ2NwMiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgoKCWNwbXgxID0gQWxsb2NhdGVGbG9hdE10eCggbGwxKzIsIDI3ICk7CgljcG14MiA9IEFsbG9jYXRlRmxvYXRNdHgoIGxsMisyLCAyNyApOwoKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIAoJewoJCWlmKCBzdHJsZW4oIHNlcTFbaV0gKSAhPSBsZ3RoMSApCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICJpID0gJWQgLyAlZFxuIiwgaSwgaWN5YyApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJidWchIGhhaXJldHN1IGdhIGtvd2FyZXRhIVxuIiApOwoJCQlleGl0KCAxICk7CgkJfQoJfQoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkKCXsKCQlpZiggc3RybGVuKCBzZXEyW2pdICkgIT0gbGd0aDIgKQoJCXsKCQkJZnByaW50Ziggc3RkZXJyLCAiaiA9ICVkIC8gJWRcbiIsIGosIGpjeWMgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiYnVnISBoYWlyZXRzdSBnYSBrb3dhcmV0YSFcbiIgKTsKCQkJZXhpdCggMSApOwoJCX0KCX0KCglNU2NwbXhfY2FsY19uZXcoIHNlcTEsIGNwbXgxLCBlZmYxLCBsZ3RoMSwgaWN5YyApOwoJTVNjcG14X2NhbGNfbmV3KCBzZXEyLCBjcG14MiwgZWZmMiwgbGd0aDIsIGpjeWMgKTsKCgojaWYgMQoKCWlmKCBzZ2FwMSApCgl7CgkJbmV3X09wZW5pbmdHYXBDb3VudCggb2djcDEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxLCBzZ2FwMSApOwoJCW5ld19PcGVuaW5nR2FwQ291bnQoIG9nY3AyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiwgc2dhcDIgKTsKCQluZXdfRmluYWxHYXBDb3VudCggZmdjcDEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxLCBlZ2FwMiApOwoJCW5ld19GaW5hbEdhcENvdW50KCBmZ2NwMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIsIGVnYXAyICk7Cgl9CgllbHNlCgl7CgkJc3RfT3BlbmluZ0dhcENvdW50KCBvZ2NwMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlzdF9PcGVuaW5nR2FwQ291bnQoIG9nY3AyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiApOwoJCXN0X0ZpbmFsR2FwQ291bnQoIGZnY3AxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCXN0X0ZpbmFsR2FwQ291bnQoIGZnY3AyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiApOwoJfQoKI2lmIDEKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCXsKCQlvZ2NwMVtpXSA9IDAuNSAqICggMS4wIC0gb2djcDFbaV0gKSAqIGZwZW5hbHR5OwoJCWZnY3AxW2ldID0gMC41ICogKCAxLjAgLSBmZ2NwMVtpXSApICogZnBlbmFsdHk7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJmZ2NwMVslZF0gPSAlZlxuIiwgaSwgZmdjcDFbaV0gKTsKCX0KCWZvciggaT0wOyBpPGxndGgyOyBpKysgKSAKCXsKCQlvZ2NwMltpXSA9IDAuNSAqICggMS4wIC0gb2djcDJbaV0gKSAqIGZwZW5hbHR5OwoJCWZnY3AyW2ldID0gMC41ICogKCAxLjAgLSBmZ2NwMltpXSApICogZnBlbmFsdHk7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJmZ2NwMlslZF0gPSAlZlxuIiwgaSwgZmdjcDJbaV0gKTsKCX0KI2Vsc2UKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCXsKCQlvZ2NwMVtpXSA9IDAuNSAqIGZwZW5hbHR5OwoJCWZnY3AxW2ldID0gMC41ICogZnBlbmFsdHk7Cgl9Cglmb3IoIGk9MDsgaTxsZ3RoMjsgaSsrICkgCgl7CgkJb2djcDJbaV0gPSAwLjUgKiBmcGVuYWx0eTsKCQlmZ2NwMltpXSA9IDAuNSAqIGZwZW5hbHR5OwoJfQojZW5kaWYKCglnYXBpbmZvWzBdID0gb2djcDE7CglnYXBpbmZvWzFdID0gZmdjcDE7CglnYXBpbmZvWzJdID0gb2djcDI7CglnYXBpbmZvWzNdID0gZmdjcDI7CiNlbmRpZgoKI2lmIDAKCWZwcmludGYoIHN0ZG91dCwgImluIE1TYWxpZ25tbS5jXG4iICk7Cglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKQoJewoJCWZwcmludGYoIHN0ZG91dCwgIj4lZCBvZiBHUk9VUDFcbiIsIGkgKTsKCQlmcHJpbnRmKCBzdGRvdXQsICIlc1xuIiwgc2VxMVtpXSApOwoJfQoJZm9yKCBpPTA7IGk8amN5YzsgaSsrICkKCXsKCQlmcHJpbnRmKCBzdGRvdXQsICI+JWQgb2YgR1JPVVAyXG4iLCBpICk7CgkJZnByaW50Ziggc3Rkb3V0LCAiJXNcbiIsIHNlcTJbaV0gKTsKCX0KCWZmbHVzaCggc3Rkb3V0ICk7CiNlbmRpZgoKCXdtID0gTVNhbGlnbm1tX3JlYyggaWN5YywgamN5YywgZWZmMSwgZWZmMiwgc2VxMSwgc2VxMiwgY3BteDEsIGNwbXgyLCAwLCBsZ3RoMS0xLCAwLCBsZ3RoMi0xLCBhbGxvY2xlbiwgbXNlcTEsIG1zZXEyLCAwLCBnYXBpbmZvICk7CiNpZiBERUJVRwoJCWZwcmludGYoIHN0ZGVyciwgIiBzZXExWzBdID0gJXNcbiIsIHNlcTFbMF0gKTsKCQlmcHJpbnRmKCBzdGRlcnIsICIgc2VxMlswXSA9ICVzXG4iLCBzZXEyWzBdICk7CgkJZnByaW50Ziggc3RkZXJyLCAibXNlcTFbMF0gPSAlc1xuIiwgbXNlcTFbMF0gKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJtc2VxMlswXSA9ICVzXG4iLCBtc2VxMlswXSApOwojZW5kaWYKCi8vCWZwcmludGYoIHN0ZGVyciwgIndtID0gJWZcbiIsIHdtICk7CgoKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIHN0cmNweSggc2VxMVtpXSwgbXNlcTFbaV0gKTsKCWZvciggaT0wOyBpPGpjeWM7IGkrKyApIHN0cmNweSggc2VxMltpXSwgbXNlcTJbaV0gKTsKCglpZiggc2VxbGVuKCBzZXExWzBdICkgIT0gbmdsZW4xICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJidWchIGhhaXJldHN1IGdhIGtvd2FyZXRhISAobmdsZW4xKSBzZXFsZW4oc2VxMVswXSk9JWQgYnV0IG5nbGVuMT0lZFxuIiwgc2VxbGVuKCBzZXExWzBdICksIG5nbGVuMSApOwoJCWZwcmludGYoIHN0ZGVyciwgInNlcTFbMF0gPSAlc1xuIiwgc2VxMVswXSApOwoJCWV4aXQoIDEgKTsKCX0KCWlmKCBzZXFsZW4oIHNlcTJbMF0gKSAhPSBuZ2xlbjIgKQoJewoJCWZwcmludGYoIHN0ZGVyciwgImJ1ZyEgaGFpcmV0c3UgZ2Ega293YXJldGEhIChuZ2xlbjIpIHNlcWxlbihzZXEyWzBdKT0lZCBidXQgbmdsZW4yPSVkXG4iLCBzZXFsZW4oIHNlcTJbMF0gKSwgbmdsZW4yICk7CgkJZXhpdCggMSApOwoJfQoKCUZyZWVGbG9hdFZlYyggb2djcDEgKTsKCUZyZWVGbG9hdFZlYyggb2djcDIgKTsKCUZyZWVGbG9hdFZlYyggZmdjcDEgKTsKCUZyZWVGbG9hdFZlYyggZmdjcDIgKTsKCUZyZWVGbG9hdE10eCggY3BteDEgKTsKCUZyZWVGbG9hdE10eCggY3BteDIgKTsKCWZyZWUoICh2b2lkICopZ2FwaW5mbyApOwoKCUZyZWVDaGFyTXR4KCBtc2VxMSApOwoJRnJlZUNoYXJNdHgoIG1zZXEyICk7CgoJbGd0aDEgPSBzdHJsZW4oIHNlcTFbMF0gKTsKCWxndGgyID0gc3RybGVuKCBzZXEyWzBdICk7Cglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSAKCXsKCQlpZiggc3RybGVuKCBzZXExW2ldICkgIT0gbGd0aDEgKQoJCXsKCQkJZnByaW50Ziggc3RkZXJyLCAiaSA9ICVkIC8gJWRcbiIsIGksIGljeWMgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiaGFpcmV0c3UgZ2Ega293YXJldGEgKGVuZCBvZiBNU2FsaWdubW0pICFcbiIgKTsKCQkJZXhpdCggMSApOwoJCX0KCX0KCWZvciggaj0wOyBqPGpjeWM7IGorKyApCgl7CgkJaWYoIHN0cmxlbiggc2VxMltqXSApICE9IGxndGgyICkKCQl7CgkJCWZwcmludGYoIHN0ZGVyciwgImogPSAlZCAvICVkXG4iLCBqLCBqY3ljICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImhhaXJldHN1IGdhIGtvd2FyZXRhIChlbmQgb2YgTVNhbGlnbm1tKSAhXG4iICk7CgkJCWV4aXQoIDEgKTsKCQl9Cgl9CgoJcmV0dXJuKCB3bSApOwp9Cg==