LyogRHJvcCBpbiByZXBsYWNlbWVudCBmb3IgaGVhcHEucHkgCgpDIGltcGxlbWVudGF0aW9uIGRlcml2ZWQgZGlyZWN0bHkgZnJvbSBoZWFwcS5weSBpbiBQeTIuMwp3aGljaCB3YXMgd3JpdHRlbiBieSBLZXZpbiBPJ0Nvbm5vciwgYXVnbWVudGVkIGJ5IFRpbSBQZXRlcnMsCmFubm90YXRlZCBieSBGcmFu529pcyBQaW5hcmQsIGFuZCBjb252ZXJ0ZWQgdG8gQyBieSBSYXltb25kIEhldHRpbmdlci4KCiovCgojaW5jbHVkZSAiUHl0aG9uLmgiCgpzdGF0aWMgaW50Cl9zaWZ0ZG93bihQeUxpc3RPYmplY3QgKmhlYXAsIFB5X3NzaXplX3Qgc3RhcnRwb3MsIFB5X3NzaXplX3QgcG9zKQp7CglQeU9iamVjdCAqbmV3aXRlbSwgKnBhcmVudDsKCWludCBjbXA7CglQeV9zc2l6ZV90IHBhcmVudHBvczsKCglhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKCWlmIChwb3MgPj0gUHlMaXN0X0dFVF9TSVpFKGhlYXApKSB7CgkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKCQlyZXR1cm4gLTE7Cgl9CgoJbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOwoJUHlfSU5DUkVGKG5ld2l0ZW0pOwoJLyogRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcKCSAgIGEgcGxhY2UgbmV3aXRlbSBmaXRzLiAqLwoJd2hpbGUgKHBvcyA+IHN0YXJ0cG9zKXsKCQlwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMTsKCQlwYXJlbnQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcGFyZW50cG9zKTsKCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wocGFyZW50LCBuZXdpdGVtLCBQeV9MRSk7CgkJaWYgKGNtcCA9PSAtMSkgewoJCQlQeV9ERUNSRUYobmV3aXRlbSk7CgkJCXJldHVybiAtMTsKCQl9CgkJaWYgKGNtcCA9PSAxKQoJCQlicmVhazsKCQlQeV9JTkNSRUYocGFyZW50KTsKCQlQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwoJCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHBhcmVudCk7CgkJcG9zID0gcGFyZW50cG9zOwoJfQoJUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKX3NpZnR1cChQeUxpc3RPYmplY3QgKmhlYXAsIFB5X3NzaXplX3QgcG9zKQp7CglQeV9zc2l6ZV90IHN0YXJ0cG9zLCBlbmRwb3MsIGNoaWxkcG9zLCByaWdodHBvczsKCWludCBjbXA7CglQeU9iamVjdCAqbmV3aXRlbSwgKnRtcDsKCglhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKCWVuZHBvcyA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKCXN0YXJ0cG9zID0gcG9zOwoJaWYgKHBvcyA+PSBlbmRwb3MpIHsKCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOwoJCXJldHVybiAtMTsKCX0KCW5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKCVB5X0lOQ1JFRihuZXdpdGVtKTsKCgkvKiBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuICovCgljaGlsZHBvcyA9IDIqcG9zICsgMTsgICAgLyogbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24gICovCgl3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHsKCQkvKiBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4gICAqLwoJCXJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxOwoJCWlmIChyaWdodHBvcyA8IGVuZHBvcykgewoJCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woCgkJCQlQeUxpc3RfR0VUX0lURU0oaGVhcCwgcmlnaHRwb3MpLAoJCQkJUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKSwKCQkJCVB5X0xFKTsKCQkJaWYgKGNtcCA9PSAtMSkgewoJCQkJUHlfREVDUkVGKG5ld2l0ZW0pOwoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJCWlmIChjbXAgPT0gMSkKCQkJCWNoaWxkcG9zID0gcmlnaHRwb3M7CgkJfQoJCS8qIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuICovCgkJdG1wID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKTsKCQlQeV9JTkNSRUYodG1wKTsKCQlQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwoJCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHRtcCk7CgkJcG9zID0gY2hpbGRwb3M7CgkJY2hpbGRwb3MgPSAyKnBvcyArIDE7Cgl9CgoJLyogVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYW5kIGJ1YmJsZQoJICAgaXQgdXAgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuICovCglQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwoJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CglyZXR1cm4gX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpOwp9CgpzdGF0aWMgUHlPYmplY3QgKgpoZWFwcHVzaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKCVB5T2JqZWN0ICpoZWFwLCAqaXRlbTsKCglpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcHVzaCIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCgkJcmV0dXJuIE5VTEw7CgoJaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwoJCXJldHVybiBOVUxMOwoJfQoKCWlmIChQeUxpc3RfQXBwZW5kKGhlYXAsIGl0ZW0pID09IC0xKQoJCXJldHVybiBOVUxMOwoKCWlmIChfc2lmdGRvd24oKFB5TGlzdE9iamVjdCAqKWhlYXAsIDAsIFB5TGlzdF9HRVRfU0laRShoZWFwKS0xKSA9PSAtMSkKCQlyZXR1cm4gTlVMTDsKCVB5X0lOQ1JFRihQeV9Ob25lKTsKCXJldHVybiBQeV9Ob25lOwp9CgpQeURvY19TVFJWQVIoaGVhcHB1c2hfZG9jLAoiUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKaGVhcHBvcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmhlYXApCnsKCVB5T2JqZWN0ICpsYXN0ZWx0LCAqcmV0dXJuaXRlbTsKCVB5X3NzaXplX3QgbjsKCglpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgewoJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJLyogIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5ICovCgluID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOwoJaWYgKG4gPT0gMCkgewoJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJbGFzdGVsdCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBuLTEpIDsKCVB5X0lOQ1JFRihsYXN0ZWx0KTsKCVB5TGlzdF9TZXRTbGljZShoZWFwLCBuLTEsIG4sIE5VTEwpOwoJbi0tOwoKCWlmICghbikgCgkJcmV0dXJuIGxhc3RlbHQ7CglyZXR1cm5pdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwoJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGxhc3RlbHQpOwoJaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKSB7CgkJUHlfREVDUkVGKHJldHVybml0ZW0pOwoJCXJldHVybiBOVUxMOwoJfQoJcmV0dXJuIHJldHVybml0ZW07Cn0KClB5RG9jX1NUUlZBUihoZWFwcG9wX2RvYywKIlBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCmhlYXByZXBsYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewoJUHlPYmplY3QgKmhlYXAsICppdGVtLCAqcmV0dXJuaXRlbTsKCglpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcmVwbGFjZSIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCgkJcmV0dXJuIE5VTEw7CgoJaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwoJCXJldHVybiBOVUxMOwoJfQoKCWlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7CgkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglyZXR1cm5pdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwoJUHlfSU5DUkVGKGl0ZW0pOwoJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGl0ZW0pOwoJaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKSB7CgkJUHlfREVDUkVGKHJldHVybml0ZW0pOwoJCXJldHVybiBOVUxMOwoJfQoJcmV0dXJuIHJldHVybml0ZW07Cn0KClB5RG9jX1NUUlZBUihoZWFwcmVwbGFjZV9kb2MsCiJQb3AgYW5kIHJldHVybiB0aGUgY3VycmVudCBzbWFsbGVzdCB2YWx1ZSwgYW5kIGFkZCB0aGUgbmV3IGl0ZW0uXG5cClxuXApUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaGVhcHBvcCgpIGZvbGxvd2VkIGJ5IGhlYXBwdXNoKCksIGFuZCBjYW4gYmVcblwKbW9yZSBhcHByb3ByaWF0ZSB3aGVuIHVzaW5nIGEgZml4ZWQtc2l6ZSBoZWFwLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZVxuXApyZXR1cm5lZCBtYXkgYmUgbGFyZ2VyIHRoYW4gaXRlbSEgIFRoYXQgY29uc3RyYWlucyByZWFzb25hYmxlIHVzZXMgb2ZcblwKdGhpcyByb3V0aW5lIHVubGVzcyB3cml0dGVuIGFzIHBhcnQgb2YgYSBjb25kaXRpb25hbCByZXBsYWNlbWVudDpcblxuXAogICAgICAgIGlmIGl0ZW0gPiBoZWFwWzBdOlxuXAogICAgICAgICAgICBpdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSlcbiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKaGVhcGlmeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmhlYXApCnsKCVB5X3NzaXplX3QgaSwgbjsKCglpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgewoJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJbiA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKCS8qIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0bwoJICAgbG9va2luZyBhdCBpcyB0aGUgbGFyZ2VzdCB3aXRoIGEgY2hpbGQgaW5kZXggaW4tcmFuZ2UsIHNvIG11c3QKCSAgIGhhdmUgMippICsgMSA8IG4sIG9yIGkgPCAobi0xKS8yLiAgSWYgbiBpcyBldmVuID0gMipqLCB0aGlzIGlzCgkgICAoMipqLTEpLzIgPSBqLTEvMiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYKCSAgIG4gaXMgb2RkID0gMipqKzEsIHRoaXMgaXMgKDIqaisxLTEpLzIgPSBqIHNvIGotMSBpcyB0aGUgbGFyZ2VzdCwKCSAgIGFuZCB0aGF0J3MgYWdhaW4gbi8vMi0xLgoJKi8KCWZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCgkJaWYoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCgkJCXJldHVybiBOVUxMOwoJUHlfSU5DUkVGKFB5X05vbmUpOwoJcmV0dXJuIFB5X05vbmU7Cn0KClB5RG9jX1NUUlZBUihoZWFwaWZ5X2RvYywKIlRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oaGVhcCkpIHRpbWUuIik7CgpzdGF0aWMgUHlPYmplY3QgKgpubGFyZ2VzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKCVB5T2JqZWN0ICpoZWFwPU5VTEwsICplbGVtLCAqaXRlcmFibGUsICpzb2wsICppdCwgKm9sZGVsZW07CglQeV9zc2l6ZV90IGksIG47CgoJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzpubGFyZ2VzdCIsICZuLCAmaXRlcmFibGUpKQoJCXJldHVybiBOVUxMOwoKCWl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7CglpZiAoaXQgPT0gTlVMTCkKCQlyZXR1cm4gTlVMTDsKCgloZWFwID0gUHlMaXN0X05ldygwKTsKCWlmIChoZWFwID09IE5VTEwpCgkJZ290byBmYWlsOwoKCWZvciAoaT0wIDsgaTxuIDsgaSsrICl7CgkJZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKCQlpZiAoZWxlbSA9PSBOVUxMKSB7CgkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQoJCQkJZ290byBmYWlsOwoJCQllbHNlCgkJCQlnb3RvIHNvcnRpdDsKCQl9CgkJaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgZWxlbSkgPT0gLTEpIHsKCQkJUHlfREVDUkVGKGVsZW0pOwoJCQlnb3RvIGZhaWw7CgkJfQoJCVB5X0RFQ1JFRihlbGVtKTsKCX0KCWlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPT0gMCkKCQlnb3RvIHNvcnRpdDsKCglmb3IgKGk9bi8yLTEgOyBpPj0wIDsgaS0tKQoJCWlmKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIGkpID09IC0xKQoJCQlnb3RvIGZhaWw7CgoJc29sID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwoJd2hpbGUgKDEpIHsKCQllbGVtID0gUHlJdGVyX05leHQoaXQpOwoJCWlmIChlbGVtID09IE5VTEwpIHsKCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCgkJCQlnb3RvIGZhaWw7CgkJCWVsc2UKCQkJCWdvdG8gc29ydGl0OwoJCX0KCQlpZiAoUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGVsZW0sIHNvbCwgUHlfTEUpKSB7CgkJCVB5X0RFQ1JFRihlbGVtKTsKCQkJY29udGludWU7CgkJfQoJCW9sZGVsZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CgkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOwoJCVB5X0RFQ1JFRihvbGRlbGVtKTsKCQlpZiAoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpCgkJCWdvdG8gZmFpbDsKCQlzb2wgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Cgl9CnNvcnRpdDoKCWlmIChQeUxpc3RfU29ydChoZWFwKSA9PSAtMSkKCQlnb3RvIGZhaWw7CglpZiAoUHlMaXN0X1JldmVyc2UoaGVhcCkgPT0gLTEpCgkJZ290byBmYWlsOwoJUHlfREVDUkVGKGl0KTsKCXJldHVybiBoZWFwOwoKZmFpbDoKCVB5X0RFQ1JFRihpdCk7CglQeV9YREVDUkVGKGhlYXApOwoJcmV0dXJuIE5VTEw7Cn0KClB5RG9jX1NUUlZBUihubGFyZ2VzdF9kb2MsCiJGaW5kIHRoZSBuIGxhcmdlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LlxuXApcblwKRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwgcmV2ZXJzZT1UcnVlKVs6bl1cbiIpOwoKc3RhdGljIGludApfc2lmdGRvd25tYXgoUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBQeV9zc2l6ZV90IHBvcykKewoJUHlPYmplY3QgKm5ld2l0ZW0sICpwYXJlbnQ7CglpbnQgY21wOwoJUHlfc3NpemVfdCBwYXJlbnRwb3M7CgoJYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7CglpZiAocG9zID49IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgewoJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CgkJcmV0dXJuIC0xOwoJfQoKCW5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKCVB5X0lOQ1JFRihuZXdpdGVtKTsKCS8qIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nCgkgICBhIHBsYWNlIG5ld2l0ZW0gZml0cy4gKi8KCXdoaWxlIChwb3MgPiBzdGFydHBvcyl7CgkJcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDE7CgkJcGFyZW50ID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBhcmVudHBvcyk7CgkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKG5ld2l0ZW0sIHBhcmVudCwgUHlfTEUpOwoJCWlmIChjbXAgPT0gLTEpIHsKCQkJUHlfREVDUkVGKG5ld2l0ZW0pOwoJCQlyZXR1cm4gLTE7CgkJfQoJCWlmIChjbXAgPT0gMSkKCQkJYnJlYWs7CgkJUHlfSU5DUkVGKHBhcmVudCk7CgkJUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKCQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBwYXJlbnQpOwoJCXBvcyA9IHBhcmVudHBvczsKCX0KCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CglQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50Cl9zaWZ0dXBtYXgoUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHBvcykKewoJUHlfc3NpemVfdCBzdGFydHBvcywgZW5kcG9zLCBjaGlsZHBvcywgcmlnaHRwb3M7CglpbnQgY21wOwoJUHlPYmplY3QgKm5ld2l0ZW0sICp0bXA7CgoJYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7CgllbmRwb3MgPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7CglzdGFydHBvcyA9IHBvczsKCWlmIChwb3MgPj0gZW5kcG9zKSB7CgkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKCQlyZXR1cm4gLTE7Cgl9CgluZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7CglQeV9JTkNSRUYobmV3aXRlbSk7CgoJLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLwoJY2hpbGRwb3MgPSAyKnBvcyArIDE7ICAgIC8qIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uICAqLwoJd2hpbGUgKGNoaWxkcG9zIDwgZW5kcG9zKSB7CgkJLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KCQlyaWdodHBvcyA9IGNoaWxkcG9zICsgMTsKCQlpZiAocmlnaHRwb3MgPCBlbmRwb3MpIHsKCQkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKAoJCQkJUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKSwKCQkJCVB5TGlzdF9HRVRfSVRFTShoZWFwLCByaWdodHBvcyksCgkJCQlQeV9MRSk7CgkJCWlmIChjbXAgPT0gLTEpIHsKCQkJCVB5X0RFQ1JFRihuZXdpdGVtKTsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlpZiAoY21wID09IDEpCgkJCQljaGlsZHBvcyA9IHJpZ2h0cG9zOwoJCX0KCQkvKiBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLiAqLwoJCXRtcCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyk7CgkJUHlfSU5DUkVGKHRtcCk7CgkJUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKCQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCB0bXApOwoJCXBvcyA9IGNoaWxkcG9zOwoJCWNoaWxkcG9zID0gMipwb3MgKyAxOwoJfQoKCS8qIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGFuZCBidWJibGUKCSAgIGl0IHVwIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLiAqLwoJUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOwoJcmV0dXJuIF9zaWZ0ZG93bm1heChoZWFwLCBzdGFydHBvcywgcG9zKTsKfQoKc3RhdGljIFB5T2JqZWN0ICoKbnNtYWxsZXN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewoJUHlPYmplY3QgKmhlYXA9TlVMTCwgKmVsZW0sICppdGVyYWJsZSwgKmxvcywgKml0LCAqb2xkZWxlbTsKCVB5X3NzaXplX3QgaSwgbjsKCglpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5POm5zbWFsbGVzdCIsICZuLCAmaXRlcmFibGUpKQoJCXJldHVybiBOVUxMOwoKCWl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7CglpZiAoaXQgPT0gTlVMTCkKCQlyZXR1cm4gTlVMTDsKCgloZWFwID0gUHlMaXN0X05ldygwKTsKCWlmIChoZWFwID09IE5VTEwpCgkJZ290byBmYWlsOwoKCWZvciAoaT0wIDsgaTxuIDsgaSsrICl7CgkJZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKCQlpZiAoZWxlbSA9PSBOVUxMKSB7CgkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQoJCQkJZ290byBmYWlsOwoJCQllbHNlCgkJCQlnb3RvIHNvcnRpdDsKCQl9CgkJaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgZWxlbSkgPT0gLTEpIHsKCQkJUHlfREVDUkVGKGVsZW0pOwoJCQlnb3RvIGZhaWw7CgkJfQoJCVB5X0RFQ1JFRihlbGVtKTsKCX0KCW4gPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7CglpZiAobiA9PSAwKQoJCWdvdG8gc29ydGl0OwoKCWZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCgkJaWYoX3NpZnR1cG1heCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCgkJCWdvdG8gZmFpbDsKCglsb3MgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Cgl3aGlsZSAoMSkgewoJCWVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7CgkJaWYgKGVsZW0gPT0gTlVMTCkgewoJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKCQkJCWdvdG8gZmFpbDsKCQkJZWxzZQoJCQkJZ290byBzb3J0aXQ7CgkJfQoJCWlmIChQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wobG9zLCBlbGVtLCBQeV9MRSkpIHsKCQkJUHlfREVDUkVGKGVsZW0pOwoJCQljb250aW51ZTsKCQl9CgoJCW9sZGVsZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CgkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOwoJCVB5X0RFQ1JFRihvbGRlbGVtKTsKCQlpZiAoX3NpZnR1cG1heCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpCgkJCWdvdG8gZmFpbDsKCQlsb3MgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Cgl9Cgpzb3J0aXQ6CglpZiAoUHlMaXN0X1NvcnQoaGVhcCkgPT0gLTEpCgkJZ290byBmYWlsOwoJUHlfREVDUkVGKGl0KTsKCXJldHVybiBoZWFwOwoKZmFpbDoKCVB5X0RFQ1JFRihpdCk7CglQeV9YREVDUkVGKGhlYXApOwoJcmV0dXJuIE5VTEw7Cn0KClB5RG9jX1NUUlZBUihuc21hbGxlc3RfZG9jLAoiRmluZCB0aGUgbiBzbWFsbGVzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuXG5cClxuXApFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlKVs6bl1cbiIpOwoKc3RhdGljIFB5TWV0aG9kRGVmIGhlYXBxX21ldGhvZHNbXSA9IHsKCXsiaGVhcHB1c2giLAkoUHlDRnVuY3Rpb24paGVhcHB1c2gsCQkKCQlNRVRIX1ZBUkFSR1MsCWhlYXBwdXNoX2RvY30sCgl7ImhlYXBwb3AiLAkoUHlDRnVuY3Rpb24paGVhcHBvcCwKCQlNRVRIX08sCQloZWFwcG9wX2RvY30sCgl7ImhlYXByZXBsYWNlIiwJKFB5Q0Z1bmN0aW9uKWhlYXByZXBsYWNlLAoJCU1FVEhfVkFSQVJHUywJaGVhcHJlcGxhY2VfZG9jfSwKCXsiaGVhcGlmeSIsCShQeUNGdW5jdGlvbiloZWFwaWZ5LAoJCU1FVEhfTywJCWhlYXBpZnlfZG9jfSwKCXsibmxhcmdlc3QiLAkoUHlDRnVuY3Rpb24pbmxhcmdlc3QsCgkJTUVUSF9WQVJBUkdTLAlubGFyZ2VzdF9kb2N9LAoJeyJuc21hbGxlc3QiLAkoUHlDRnVuY3Rpb24pbnNtYWxsZXN0LAoJCU1FVEhfVkFSQVJHUywJbnNtYWxsZXN0X2RvY30sCgl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLwp9OwoKUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCiJIZWFwIHF1ZXVlIGFsZ29yaXRobSAoYS5rLmEuIHByaW9yaXR5IHF1ZXVlKS5cblwKXG5cCkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXG5cCmFsbCBrLCBjb3VudGluZyBlbGVtZW50cyBmcm9tIDAuICBGb3IgdGhlIHNha2Ugb2YgY29tcGFyaXNvbixcblwKbm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nXG5cCnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxuXApcblwKVXNhZ2U6XG5cClxuXApoZWFwID0gW10gICAgICAgICAgICAjIGNyZWF0ZXMgYW4gZW1wdHkgaGVhcFxuXApoZWFwcHVzaChoZWFwLCBpdGVtKSAjIHB1c2hlcyBhIG5ldyBpdGVtIG9uIHRoZSBoZWFwXG5cCml0ZW0gPSBoZWFwcG9wKGhlYXApICMgcG9wcyB0aGUgc21hbGxlc3QgaXRlbSBmcm9tIHRoZSBoZWFwXG5cCml0ZW0gPSBoZWFwWzBdICAgICAgICMgc21hbGxlc3QgaXRlbSBvbiB0aGUgaGVhcCB3aXRob3V0IHBvcHBpbmcgaXRcblwKaGVhcGlmeSh4KSAgICAgICAgICAgIyB0cmFuc2Zvcm1zIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBsaW5lYXIgdGltZVxuXAppdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkgIyBwb3BzIGFuZCByZXR1cm5zIHNtYWxsZXN0IGl0ZW0sIGFuZCBhZGRzXG5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5ldyBpdGVtOyB0aGUgaGVhcCBzaXplIGlzIHVuY2hhbmdlZFxuXApcblwKT3VyIEFQSSBkaWZmZXJzIGZyb20gdGV4dGJvb2sgaGVhcCBhbGdvcml0aG1zIGFzIGZvbGxvd3M6XG5cClxuXAotIFdlIHVzZSAwLWJhc2VkIGluZGV4aW5nLiAgVGhpcyBtYWtlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlXG5cCiAgaW5kZXggZm9yIGEgbm9kZSBhbmQgdGhlIGluZGV4ZXMgZm9yIGl0cyBjaGlsZHJlbiBzbGlnaHRseSBsZXNzXG5cCiAgb2J2aW91cywgYnV0IGlzIG1vcmUgc3VpdGFibGUgc2luY2UgUHl0aG9uIHVzZXMgMC1iYXNlZCBpbmRleGluZy5cblwKXG5cCi0gT3VyIGhlYXBwb3AoKSBtZXRob2QgcmV0dXJucyB0aGUgc21hbGxlc3QgaXRlbSwgbm90IHRoZSBsYXJnZXN0LlxuXApcblwKVGhlc2UgdHdvIG1ha2UgaXQgcG9zc2libGUgdG8gdmlldyB0aGUgaGVhcCBhcyBhIHJlZ3VsYXIgUHl0aG9uIGxpc3RcblwKd2l0aG91dCBzdXJwcmlzZXM6IGhlYXBbMF0gaXMgdGhlIHNtYWxsZXN0IGl0ZW0sIGFuZCBoZWFwLnNvcnQoKVxuXAptYWludGFpbnMgdGhlIGhlYXAgaW52YXJpYW50IVxuIik7CgoKUHlEb2NfU1RSVkFSKF9fYWJvdXRfXywKIkhlYXAgcXVldWVzXG5cClxuXApbZXhwbGFuYXRpb24gYnkgRnJhbudvaXMgUGluYXJkXVxuXApcblwKSGVhcHMgYXJlIGFycmF5cyBmb3Igd2hpY2ggYVtrXSA8PSBhWzIqaysxXSBhbmQgYVtrXSA8PSBhWzIqaysyXSBmb3JcblwKYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxuXApub24tZXhpc3RpbmcgZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW5maW5pdGUuICBUaGUgaW50ZXJlc3RpbmdcblwKcHJvcGVydHkgb2YgYSBoZWFwIGlzIHRoYXQgYVswXSBpcyBhbHdheXMgaXRzIHNtYWxsZXN0IGVsZW1lbnQuXG4iCiJcblwKVGhlIHN0cmFuZ2UgaW52YXJpYW50IGFib3ZlIGlzIG1lYW50IHRvIGJlIGFuIGVmZmljaWVudCBtZW1vcnlcblwKcmVwcmVzZW50YXRpb24gZm9yIGEgdG91cm5hbWVudC4gIFRoZSBudW1iZXJzIGJlbG93IGFyZSBgaycsIG5vdCBhW2tdOlxuXApcblwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwXG5cClxuXAogICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMlxuXApcblwKICAgICAgICAgIDMgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICA2XG5cClxuXAogICAgICA3ICAgICAgIDggICAgICAgOSAgICAgICAxMCAgICAgIDExICAgICAgMTIgICAgICAxMyAgICAgIDE0XG5cClxuXAogICAgMTUgMTYgICAxNyAxOCAgIDE5IDIwICAgMjEgMjIgICAyMyAyNCAgIDI1IDI2ICAgMjcgMjggICAyOSAzMFxuXApcblwKXG5cCkluIHRoZSB0cmVlIGFib3ZlLCBlYWNoIGNlbGwgYGsnIGlzIHRvcHBpbmcgYDIqaysxJyBhbmQgYDIqaysyJy4gIEluXG5cCmFuIHVzdWFsIGJpbmFyeSB0b3VybmFtZW50IHdlIHNlZSBpbiBzcG9ydHMsIGVhY2ggY2VsbCBpcyB0aGUgd2lubmVyXG5cCm92ZXIgdGhlIHR3byBjZWxscyBpdCB0b3BzLCBhbmQgd2UgY2FuIHRyYWNlIHRoZSB3aW5uZXIgZG93biB0aGUgdHJlZVxuXAp0byBzZWUgYWxsIG9wcG9uZW50cyBzL2hlIGhhZC4gIEhvd2V2ZXIsIGluIG1hbnkgY29tcHV0ZXIgYXBwbGljYXRpb25zXG5cCm9mIHN1Y2ggdG91cm5hbWVudHMsIHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNlIHRoZSBoaXN0b3J5IG9mIGEgd2lubmVyLlxuXApUbyBiZSBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHdoZW4gYSB3aW5uZXIgaXMgcHJvbW90ZWQsIHdlIHRyeSB0b1xuXApyZXBsYWNlIGl0IGJ5IHNvbWV0aGluZyBlbHNlIGF0IGEgbG93ZXIgbGV2ZWwsIGFuZCB0aGUgcnVsZSBiZWNvbWVzXG5cCnRoYXQgYSBjZWxsIGFuZCB0aGUgdHdvIGNlbGxzIGl0IHRvcHMgY29udGFpbiB0aHJlZSBkaWZmZXJlbnQgaXRlbXMsXG5cCmJ1dCB0aGUgdG9wIGNlbGwgXCJ3aW5zXCIgb3ZlciB0aGUgdHdvIHRvcHBlZCBjZWxscy5cbiIKIlxuXApJZiB0aGlzIGhlYXAgaW52YXJpYW50IGlzIHByb3RlY3RlZCBhdCBhbGwgdGltZSwgaW5kZXggMCBpcyBjbGVhcmx5XG5cCnRoZSBvdmVyYWxsIHdpbm5lci4gIFRoZSBzaW1wbGVzdCBhbGdvcml0aG1pYyB3YXkgdG8gcmVtb3ZlIGl0IGFuZFxuXApmaW5kIHRoZSBcIm5leHRcIiB3aW5uZXIgaXMgdG8gbW92ZSBzb21lIGxvc2VyIChsZXQncyBzYXkgY2VsbCAzMCBpbiB0aGVcblwKZGlhZ3JhbSBhYm92ZSkgaW50byB0aGUgMCBwb3NpdGlvbiwgYW5kIHRoZW4gcGVyY29sYXRlIHRoaXMgbmV3IDAgZG93blxuXAp0aGUgdHJlZSwgZXhjaGFuZ2luZyB2YWx1ZXMsIHVudGlsIHRoZSBpbnZhcmlhbnQgaXMgcmUtZXN0YWJsaXNoZWQuXG5cClRoaXMgaXMgY2xlYXJseSBsb2dhcml0aG1pYyBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSB0cmVlLlxuXApCeSBpdGVyYXRpbmcgb3ZlciBhbGwgaXRlbXMsIHlvdSBnZXQgYW4gTyhuIGxuIG4pIHNvcnQuXG4iCiJcblwKQSBuaWNlIGZlYXR1cmUgb2YgdGhpcyBzb3J0IGlzIHRoYXQgeW91IGNhbiBlZmZpY2llbnRseSBpbnNlcnQgbmV3XG5cCml0ZW1zIHdoaWxlIHRoZSBzb3J0IGlzIGdvaW5nIG9uLCBwcm92aWRlZCB0aGF0IHRoZSBpbnNlcnRlZCBpdGVtcyBhcmVcblwKbm90IFwiYmV0dGVyXCIgdGhhbiB0aGUgbGFzdCAwJ3RoIGVsZW1lbnQgeW91IGV4dHJhY3RlZC4gIFRoaXMgaXNcblwKZXNwZWNpYWxseSB1c2VmdWwgaW4gc2ltdWxhdGlvbiBjb250ZXh0cywgd2hlcmUgdGhlIHRyZWUgaG9sZHMgYWxsXG5cCmluY29taW5nIGV2ZW50cywgYW5kIHRoZSBcIndpblwiIGNvbmRpdGlvbiBtZWFucyB0aGUgc21hbGxlc3Qgc2NoZWR1bGVkXG5cCnRpbWUuICBXaGVuIGFuIGV2ZW50IHNjaGVkdWxlIG90aGVyIGV2ZW50cyBmb3IgZXhlY3V0aW9uLCB0aGV5IGFyZVxuXApzY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhXG5cCmhlYXAgaXMgYSBnb29kIHN0cnVjdHVyZSBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgKHRoaXMgaXMgd2hhdCBJXG5cCnVzZWQgZm9yIG15IE1JREkgc2VxdWVuY2VyIDotKS5cbiIKIlxuXApWYXJpb3VzIHN0cnVjdHVyZXMgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzIGhhdmUgYmVlbiBleHRlbnNpdmVseVxuXApzdHVkaWVkLCBhbmQgaGVhcHMgYXJlIGdvb2QgZm9yIHRoaXMsIGFzIHRoZXkgYXJlIHJlYXNvbmFibHkgc3BlZWR5LFxuXAp0aGUgc3BlZWQgaXMgYWxtb3N0IGNvbnN0YW50LCBhbmQgdGhlIHdvcnN0IGNhc2UgaXMgbm90IG11Y2ggZGlmZmVyZW50XG5cCnRoYW4gdGhlIGF2ZXJhZ2UgY2FzZS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBvdGhlciByZXByZXNlbnRhdGlvbnMgd2hpY2hcblwKYXJlIG1vcmUgZWZmaWNpZW50IG92ZXJhbGwsIHlldCB0aGUgd29yc3QgY2FzZXMgbWlnaHQgYmUgdGVycmlibGUuXG4iCiJcblwKSGVhcHMgYXJlIGFsc28gdmVyeSB1c2VmdWwgaW4gYmlnIGRpc2sgc29ydHMuICBZb3UgbW9zdCBwcm9iYWJseSBhbGxcblwKa25vdyB0aGF0IGEgYmlnIHNvcnQgaW1wbGllcyBwcm9kdWNpbmcgXCJydW5zXCIgKHdoaWNoIGFyZSBwcmUtc29ydGVkXG5cCnNlcXVlbmNlcywgd2hpY2ggc2l6ZSBpcyB1c3VhbGx5IHJlbGF0ZWQgdG8gdGhlIGFtb3VudCBvZiBDUFUgbWVtb3J5KSxcblwKZm9sbG93ZWQgYnkgYSBtZXJnaW5nIHBhc3NlcyBmb3IgdGhlc2UgcnVucywgd2hpY2ggbWVyZ2luZyBpcyBvZnRlblxuXAp2ZXJ5IGNsZXZlcmx5IG9yZ2FuaXNlZFsxXS4gIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgdGhlIGluaXRpYWxcblwKc29ydCBwcm9kdWNlcyB0aGUgbG9uZ2VzdCBydW5zIHBvc3NpYmxlLiAgVG91cm5hbWVudHMgYXJlIGEgZ29vZCB3YXlcblwKdG8gdGhhdC4gIElmLCB1c2luZyBhbGwgdGhlIG1lbW9yeSBhdmFpbGFibGUgdG8gaG9sZCBhIHRvdXJuYW1lbnQsIHlvdVxuXApyZXBsYWNlIGFuZCBwZXJjb2xhdGUgaXRlbXMgdGhhdCBoYXBwZW4gdG8gZml0IHRoZSBjdXJyZW50IHJ1biwgeW91J2xsXG5cCnByb2R1Y2UgcnVucyB3aGljaCBhcmUgdHdpY2UgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgcmFuZG9tIGlucHV0LFxuXAphbmQgbXVjaCBiZXR0ZXIgZm9yIGlucHV0IGZ1enppbHkgb3JkZXJlZC5cbiIKIlxuXApNb3Jlb3ZlciwgaWYgeW91IG91dHB1dCB0aGUgMCd0aCBpdGVtIG9uIGRpc2sgYW5kIGdldCBhbiBpbnB1dCB3aGljaFxuXAptYXkgbm90IGZpdCBpbiB0aGUgY3VycmVudCB0b3VybmFtZW50IChiZWNhdXNlIHRoZSB2YWx1ZSBcIndpbnNcIiBvdmVyXG5cCnRoZSBsYXN0IG91dHB1dCB2YWx1ZSksIGl0IGNhbm5vdCBmaXQgaW4gdGhlIGhlYXAsIHNvIHRoZSBzaXplIG9mIHRoZVxuXApoZWFwIGRlY3JlYXNlcy4gIFRoZSBmcmVlZCBtZW1vcnkgY291bGQgYmUgY2xldmVybHkgcmV1c2VkIGltbWVkaWF0ZWx5XG5cCmZvciBwcm9ncmVzc2l2ZWx5IGJ1aWxkaW5nIGEgc2Vjb25kIGhlYXAsIHdoaWNoIGdyb3dzIGF0IGV4YWN0bHkgdGhlXG5cCnNhbWUgcmF0ZSB0aGUgZmlyc3QgaGVhcCBpcyBtZWx0aW5nLiAgV2hlbiB0aGUgZmlyc3QgaGVhcCBjb21wbGV0ZWx5XG5cCnZhbmlzaGVzLCB5b3Ugc3dpdGNoIGhlYXBzIGFuZCBzdGFydCBhIG5ldyBydW4uICBDbGV2ZXIgYW5kIHF1aXRlXG5cCmVmZmVjdGl2ZSFcblwKXG5cCkluIGEgd29yZCwgaGVhcHMgYXJlIHVzZWZ1bCBtZW1vcnkgc3RydWN0dXJlcyB0byBrbm93LiAgSSB1c2UgdGhlbSBpblxuXAphIGZldyBhcHBsaWNhdGlvbnMsIGFuZCBJIHRoaW5rIGl0IGlzIGdvb2QgdG8ga2VlcCBhIGBoZWFwJyBtb2R1bGVcblwKYXJvdW5kLiA6LSlcbiIKIlxuXAotLS0tLS0tLS0tLS0tLS0tLS0tLVxuXApbMV0gVGhlIGRpc2sgYmFsYW5jaW5nIGFsZ29yaXRobXMgd2hpY2ggYXJlIGN1cnJlbnQsIG5vd2FkYXlzLCBhcmVcblwKbW9yZSBhbm5veWluZyB0aGFuIGNsZXZlciwgYW5kIHRoaXMgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgc2Vla2luZ1xuXApjYXBhYmlsaXRpZXMgb2YgdGhlIGRpc2tzLiAgT24gZGV2aWNlcyB3aGljaCBjYW5ub3Qgc2VlaywgbGlrZSBiaWdcblwKdGFwZSBkcml2ZXMsIHRoZSBzdG9yeSB3YXMgcXVpdGUgZGlmZmVyZW50LCBhbmQgb25lIGhhZCB0byBiZSB2ZXJ5XG5cCmNsZXZlciB0byBlbnN1cmUgKGZhciBpbiBhZHZhbmNlKSB0aGF0IGVhY2ggdGFwZSBtb3ZlbWVudCB3aWxsIGJlIHRoZVxuXAptb3N0IGVmZmVjdGl2ZSBwb3NzaWJsZSAodGhhdCBpcywgd2lsbCBiZXN0IHBhcnRpY2lwYXRlIGF0XG5cClwicHJvZ3Jlc3NpbmdcIiB0aGUgbWVyZ2UpLiAgU29tZSB0YXBlcyB3ZXJlIGV2ZW4gYWJsZSB0byByZWFkXG5cCmJhY2t3YXJkcywgYW5kIHRoaXMgd2FzIGFsc28gdXNlZCB0byBhdm9pZCB0aGUgcmV3aW5kaW5nIHRpbWUuXG5cCkJlbGlldmUgbWUsIHJlYWwgZ29vZCB0YXBlIHNvcnRzIHdlcmUgcXVpdGUgc3BlY3RhY3VsYXIgdG8gd2F0Y2ghXG5cCkZyb20gYWxsIHRpbWVzLCBzb3J0aW5nIGhhcyBhbHdheXMgYmVlbiBhIEdyZWF0IEFydCEgOi0pXG4iKTsKClB5TU9ESU5JVF9GVU5DCmluaXRfaGVhcHEodm9pZCkKewoJUHlPYmplY3QgKm07CgoJbSA9IFB5X0luaXRNb2R1bGUzKCJfaGVhcHEiLCBoZWFwcV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKCWlmIChtID09IE5VTEwpCiAgICAJCXJldHVybjsKCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX19hYm91dF9fIiwgUHlTdHJpbmdfRnJvbVN0cmluZyhfX2Fib3V0X18pKTsKfQoK