LyogRHJvcCBpbiByZXBsYWNlbWVudCBmb3IgaGVhcHEucHkgCgpDIGltcGxlbWVudGF0aW9uIGRlcml2ZWQgZGlyZWN0bHkgZnJvbSBoZWFwcS5weSBpbiBQeTIuMwp3aGljaCB3YXMgd3JpdHRlbiBieSBLZXZpbiBPJ0Nvbm5vciwgYXVnbWVudGVkIGJ5IFRpbSBQZXRlcnMsCmFubm90YXRlZCBieSBGcmFu529pcyBQaW5hcmQsIGFuZCBjb252ZXJ0ZWQgdG8gQyBieSBSYXltb25kIEhldHRpbmdlci4KCiovCgojaW5jbHVkZSAiUHl0aG9uLmgiCgpzdGF0aWMgaW50CmNtcF9sdChQeU9iamVjdCAqeCwgUHlPYmplY3QgKnkpCnsKCXJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeCwgeSwgUHlfTFQpOwp9CgpzdGF0aWMgaW50Cl9zaWZ0ZG93bihQeUxpc3RPYmplY3QgKmhlYXAsIFB5X3NzaXplX3Qgc3RhcnRwb3MsIFB5X3NzaXplX3QgcG9zKQp7CglQeU9iamVjdCAqbmV3aXRlbSwgKnBhcmVudDsKCWludCBjbXA7CglQeV9zc2l6ZV90IHBhcmVudHBvczsKCglhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKCWlmIChwb3MgPj0gUHlMaXN0X0dFVF9TSVpFKGhlYXApKSB7CgkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKCQlyZXR1cm4gLTE7Cgl9CgoJbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOwoJUHlfSU5DUkVGKG5ld2l0ZW0pOwoJLyogRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcKCSAgIGEgcGxhY2UgbmV3aXRlbSBmaXRzLiAqLwoJd2hpbGUgKHBvcyA+IHN0YXJ0cG9zKXsKCQlwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMTsKCQlwYXJlbnQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcGFyZW50cG9zKTsKCQljbXAgPSBjbXBfbHQobmV3aXRlbSwgcGFyZW50KTsKCQlpZiAoY21wID09IC0xKSB7CgkJCVB5X0RFQ1JFRihuZXdpdGVtKTsKCQkJcmV0dXJuIC0xOwoJCX0KCQlpZiAoY21wID09IDApCgkJCWJyZWFrOwoJCVB5X0lOQ1JFRihwYXJlbnQpOwoJCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CgkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgcGFyZW50KTsKCQlwb3MgPSBwYXJlbnRwb3M7Cgl9CglQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwoJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludApfc2lmdHVwKFB5TGlzdE9iamVjdCAqaGVhcCwgUHlfc3NpemVfdCBwb3MpCnsKCVB5X3NzaXplX3Qgc3RhcnRwb3MsIGVuZHBvcywgY2hpbGRwb3MsIHJpZ2h0cG9zOwoJaW50IGNtcDsKCVB5T2JqZWN0ICpuZXdpdGVtLCAqdG1wOwoKCWFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOwoJZW5kcG9zID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOwoJc3RhcnRwb3MgPSBwb3M7CglpZiAocG9zID49IGVuZHBvcykgewoJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CgkJcmV0dXJuIC0xOwoJfQoJbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOwoJUHlfSU5DUkVGKG5ld2l0ZW0pOwoKCS8qIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4gKi8KCWNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8KCXdoaWxlIChjaGlsZHBvcyA8IGVuZHBvcykgewoJCS8qIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLiAgICovCgkJcmlnaHRwb3MgPSBjaGlsZHBvcyArIDE7CgkJaWYgKHJpZ2h0cG9zIDwgZW5kcG9zKSB7CgkJCWNtcCA9IGNtcF9sdCgKCQkJCVB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyksCgkJCQlQeUxpc3RfR0VUX0lURU0oaGVhcCwgcmlnaHRwb3MpKTsKCQkJaWYgKGNtcCA9PSAtMSkgewoJCQkJUHlfREVDUkVGKG5ld2l0ZW0pOwoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJCWlmIChjbXAgPT0gMCkKCQkJCWNoaWxkcG9zID0gcmlnaHRwb3M7CgkJfQoJCS8qIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuICovCgkJdG1wID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKTsKCQlQeV9JTkNSRUYodG1wKTsKCQlQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwoJCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHRtcCk7CgkJcG9zID0gY2hpbGRwb3M7CgkJY2hpbGRwb3MgPSAyKnBvcyArIDE7Cgl9CgoJLyogVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYW5kIGJ1YmJsZQoJICAgaXQgdXAgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuICovCglQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwoJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CglyZXR1cm4gX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpOwp9CgpzdGF0aWMgUHlPYmplY3QgKgpoZWFwcHVzaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKCVB5T2JqZWN0ICpoZWFwLCAqaXRlbTsKCglpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcHVzaCIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCgkJcmV0dXJuIE5VTEw7CgoJaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwoJCXJldHVybiBOVUxMOwoJfQoKCWlmIChQeUxpc3RfQXBwZW5kKGhlYXAsIGl0ZW0pID09IC0xKQoJCXJldHVybiBOVUxMOwoKCWlmIChfc2lmdGRvd24oKFB5TGlzdE9iamVjdCAqKWhlYXAsIDAsIFB5TGlzdF9HRVRfU0laRShoZWFwKS0xKSA9PSAtMSkKCQlyZXR1cm4gTlVMTDsKCVB5X0lOQ1JFRihQeV9Ob25lKTsKCXJldHVybiBQeV9Ob25lOwp9CgpQeURvY19TVFJWQVIoaGVhcHB1c2hfZG9jLAoiUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKaGVhcHBvcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmhlYXApCnsKCVB5T2JqZWN0ICpsYXN0ZWx0LCAqcmV0dXJuaXRlbTsKCVB5X3NzaXplX3QgbjsKCglpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgewoJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJLyogIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5ICovCgluID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOwoJaWYgKG4gPT0gMCkgewoJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJbGFzdGVsdCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBuLTEpIDsKCVB5X0lOQ1JFRihsYXN0ZWx0KTsKCVB5TGlzdF9TZXRTbGljZShoZWFwLCBuLTEsIG4sIE5VTEwpOwoJbi0tOwoKCWlmICghbikgCgkJcmV0dXJuIGxhc3RlbHQ7CglyZXR1cm5pdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwoJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGxhc3RlbHQpOwoJaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKSB7CgkJUHlfREVDUkVGKHJldHVybml0ZW0pOwoJCXJldHVybiBOVUxMOwoJfQoJcmV0dXJuIHJldHVybml0ZW07Cn0KClB5RG9jX1NUUlZBUihoZWFwcG9wX2RvYywKIlBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCmhlYXByZXBsYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewoJUHlPYmplY3QgKmhlYXAsICppdGVtLCAqcmV0dXJuaXRlbTsKCglpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcmVwbGFjZSIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCgkJcmV0dXJuIE5VTEw7CgoJaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwoJCXJldHVybiBOVUxMOwoJfQoKCWlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7CgkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglyZXR1cm5pdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwoJUHlfSU5DUkVGKGl0ZW0pOwoJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGl0ZW0pOwoJaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKSB7CgkJUHlfREVDUkVGKHJldHVybml0ZW0pOwoJCXJldHVybiBOVUxMOwoJfQoJcmV0dXJuIHJldHVybml0ZW07Cn0KClB5RG9jX1NUUlZBUihoZWFwcmVwbGFjZV9kb2MsCiJQb3AgYW5kIHJldHVybiB0aGUgY3VycmVudCBzbWFsbGVzdCB2YWx1ZSwgYW5kIGFkZCB0aGUgbmV3IGl0ZW0uXG5cClxuXApUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaGVhcHBvcCgpIGZvbGxvd2VkIGJ5IGhlYXBwdXNoKCksIGFuZCBjYW4gYmVcblwKbW9yZSBhcHByb3ByaWF0ZSB3aGVuIHVzaW5nIGEgZml4ZWQtc2l6ZSBoZWFwLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZVxuXApyZXR1cm5lZCBtYXkgYmUgbGFyZ2VyIHRoYW4gaXRlbSEgIFRoYXQgY29uc3RyYWlucyByZWFzb25hYmxlIHVzZXMgb2ZcblwKdGhpcyByb3V0aW5lIHVubGVzcyB3cml0dGVuIGFzIHBhcnQgb2YgYSBjb25kaXRpb25hbCByZXBsYWNlbWVudDpcblxuXAogICAgICAgIGlmIGl0ZW0gPiBoZWFwWzBdOlxuXAogICAgICAgICAgICBpdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSlcbiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKaGVhcHB1c2hwb3AoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CglQeU9iamVjdCAqaGVhcCwgKml0ZW0sICpyZXR1cm5pdGVtOwoJaW50IGNtcDsKCglpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcHVzaHBvcCIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCgkJcmV0dXJuIE5VTEw7CgoJaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwoJCXJldHVybiBOVUxMOwoJfQoKCWlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7CgkJUHlfSU5DUkVGKGl0ZW0pOwoJCXJldHVybiBpdGVtOwoJfQoKCWNtcCA9IGNtcF9sdChQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCksIGl0ZW0pOwoJaWYgKGNtcCA9PSAtMSkKCQlyZXR1cm4gTlVMTDsKCWlmIChjbXAgPT0gMCkgewoJCVB5X0lOQ1JFRihpdGVtKTsKCQlyZXR1cm4gaXRlbTsKCX0KCglyZXR1cm5pdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwoJUHlfSU5DUkVGKGl0ZW0pOwoJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGl0ZW0pOwoJaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKSB7CgkJUHlfREVDUkVGKHJldHVybml0ZW0pOwoJCXJldHVybiBOVUxMOwoJfQoJcmV0dXJuIHJldHVybml0ZW07Cn0KClB5RG9jX1NUUlZBUihoZWFwcHVzaHBvcF9kb2MsCiJQdXNoIGl0ZW0gb24gdGhlIGhlYXAsIHRoZW4gcG9wIGFuZCByZXR1cm4gdGhlIHNtYWxsZXN0IGl0ZW1cblwKZnJvbSB0aGUgaGVhcC4gVGhlIGNvbWJpbmVkIGFjdGlvbiBydW5zIG1vcmUgZWZmaWNpZW50bHkgdGhhblxuXApoZWFwcHVzaCgpIGZvbGxvd2VkIGJ5IGEgc2VwYXJhdGUgY2FsbCB0byBoZWFwcG9wKCkuIik7CgpzdGF0aWMgUHlPYmplY3QgKgpoZWFwaWZ5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaGVhcCkKewoJUHlfc3NpemVfdCBpLCBuOwoKCWlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7CgkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgluID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOwoJLyogVHJhbnNmb3JtIGJvdHRvbS11cC4gIFRoZSBsYXJnZXN0IGluZGV4IHRoZXJlJ3MgYW55IHBvaW50IHRvCgkgICBsb29raW5nIGF0IGlzIHRoZSBsYXJnZXN0IHdpdGggYSBjaGlsZCBpbmRleCBpbi1yYW5nZSwgc28gbXVzdAoJICAgaGF2ZSAyKmkgKyAxIDwgbiwgb3IgaSA8IChuLTEpLzIuICBJZiBuIGlzIGV2ZW4gPSAyKmosIHRoaXMgaXMKCSAgICgyKmotMSkvMiA9IGotMS8yIHNvIGotMSBpcyB0aGUgbGFyZ2VzdCwgd2hpY2ggaXMgbi8vMiAtIDEuICBJZgoJICAgbiBpcyBvZGQgPSAyKmorMSwgdGhpcyBpcyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LAoJICAgYW5kIHRoYXQncyBhZ2FpbiBuLy8yLTEuCgkqLwoJZm9yIChpPW4vMi0xIDsgaT49MCA7IGktLSkKCQlpZihfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCBpKSA9PSAtMSkKCQkJcmV0dXJuIE5VTEw7CglQeV9JTkNSRUYoUHlfTm9uZSk7CglyZXR1cm4gUHlfTm9uZTsKfQoKUHlEb2NfU1RSVkFSKGhlYXBpZnlfZG9jLAoiVHJhbnNmb3JtIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBPKGxlbihoZWFwKSkgdGltZS4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCm5sYXJnZXN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewoJUHlPYmplY3QgKmhlYXA9TlVMTCwgKmVsZW0sICppdGVyYWJsZSwgKnNvbCwgKml0LCAqb2xkZWxlbTsKCVB5X3NzaXplX3QgaSwgbjsKCWludCBjbXA7CgoJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzpubGFyZ2VzdCIsICZuLCAmaXRlcmFibGUpKQoJCXJldHVybiBOVUxMOwoKCWl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7CglpZiAoaXQgPT0gTlVMTCkKCQlyZXR1cm4gTlVMTDsKCgloZWFwID0gUHlMaXN0X05ldygwKTsKCWlmIChoZWFwID09IE5VTEwpCgkJZ290byBmYWlsOwoKCWZvciAoaT0wIDsgaTxuIDsgaSsrICl7CgkJZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKCQlpZiAoZWxlbSA9PSBOVUxMKSB7CgkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQoJCQkJZ290byBmYWlsOwoJCQllbHNlCgkJCQlnb3RvIHNvcnRpdDsKCQl9CgkJaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgZWxlbSkgPT0gLTEpIHsKCQkJUHlfREVDUkVGKGVsZW0pOwoJCQlnb3RvIGZhaWw7CgkJfQoJCVB5X0RFQ1JFRihlbGVtKTsKCX0KCWlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPT0gMCkKCQlnb3RvIHNvcnRpdDsKCglmb3IgKGk9bi8yLTEgOyBpPj0wIDsgaS0tKQoJCWlmKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIGkpID09IC0xKQoJCQlnb3RvIGZhaWw7CgoJc29sID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwoJd2hpbGUgKDEpIHsKCQllbGVtID0gUHlJdGVyX05leHQoaXQpOwoJCWlmIChlbGVtID09IE5VTEwpIHsKCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCgkJCQlnb3RvIGZhaWw7CgkJCWVsc2UKCQkJCWdvdG8gc29ydGl0OwoJCX0KCQljbXAgPSBjbXBfbHQoc29sLCBlbGVtKTsKCQlpZiAoY21wID09IC0xKSB7CgkJCVB5X0RFQ1JFRihlbGVtKTsKCQkJZ290byBmYWlsOwoJCX0KCQlpZiAoY21wID09IDApIHsKCQkJUHlfREVDUkVGKGVsZW0pOwoJCQljb250aW51ZTsKCQl9CgkJb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKCQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgMCwgZWxlbSk7CgkJUHlfREVDUkVGKG9sZGVsZW0pOwoJCWlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkKCQkJZ290byBmYWlsOwoJCXNvbCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKCX0Kc29ydGl0OgoJaWYgKFB5TGlzdF9Tb3J0KGhlYXApID09IC0xKQoJCWdvdG8gZmFpbDsKCWlmIChQeUxpc3RfUmV2ZXJzZShoZWFwKSA9PSAtMSkKCQlnb3RvIGZhaWw7CglQeV9ERUNSRUYoaXQpOwoJcmV0dXJuIGhlYXA7CgpmYWlsOgoJUHlfREVDUkVGKGl0KTsKCVB5X1hERUNSRUYoaGVhcCk7CglyZXR1cm4gTlVMTDsKfQoKUHlEb2NfU1RSVkFSKG5sYXJnZXN0X2RvYywKIkZpbmQgdGhlIG4gbGFyZ2VzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuXG5cClxuXApFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCByZXZlcnNlPVRydWUpWzpuXVxuIik7CgpzdGF0aWMgaW50Cl9zaWZ0ZG93bm1heChQeUxpc3RPYmplY3QgKmhlYXAsIFB5X3NzaXplX3Qgc3RhcnRwb3MsIFB5X3NzaXplX3QgcG9zKQp7CglQeU9iamVjdCAqbmV3aXRlbSwgKnBhcmVudDsKCWludCBjbXA7CglQeV9zc2l6ZV90IHBhcmVudHBvczsKCglhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKCWlmIChwb3MgPj0gUHlMaXN0X0dFVF9TSVpFKGhlYXApKSB7CgkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKCQlyZXR1cm4gLTE7Cgl9CgoJbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOwoJUHlfSU5DUkVGKG5ld2l0ZW0pOwoJLyogRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcKCSAgIGEgcGxhY2UgbmV3aXRlbSBmaXRzLiAqLwoJd2hpbGUgKHBvcyA+IHN0YXJ0cG9zKXsKCQlwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMTsKCQlwYXJlbnQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcGFyZW50cG9zKTsKCQljbXAgPSBjbXBfbHQocGFyZW50LCBuZXdpdGVtKTsKCQlpZiAoY21wID09IC0xKSB7CgkJCVB5X0RFQ1JFRihuZXdpdGVtKTsKCQkJcmV0dXJuIC0xOwoJCX0KCQlpZiAoY21wID09IDApCgkJCWJyZWFrOwoJCVB5X0lOQ1JFRihwYXJlbnQpOwoJCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CgkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgcGFyZW50KTsKCQlwb3MgPSBwYXJlbnRwb3M7Cgl9CglQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwoJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludApfc2lmdHVwbWF4KFB5TGlzdE9iamVjdCAqaGVhcCwgUHlfc3NpemVfdCBwb3MpCnsKCVB5X3NzaXplX3Qgc3RhcnRwb3MsIGVuZHBvcywgY2hpbGRwb3MsIHJpZ2h0cG9zOwoJaW50IGNtcDsKCVB5T2JqZWN0ICpuZXdpdGVtLCAqdG1wOwoKCWFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOwoJZW5kcG9zID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOwoJc3RhcnRwb3MgPSBwb3M7CglpZiAocG9zID49IGVuZHBvcykgewoJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CgkJcmV0dXJuIC0xOwoJfQoJbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOwoJUHlfSU5DUkVGKG5ld2l0ZW0pOwoKCS8qIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4gKi8KCWNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8KCXdoaWxlIChjaGlsZHBvcyA8IGVuZHBvcykgewoJCS8qIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLiAgICovCgkJcmlnaHRwb3MgPSBjaGlsZHBvcyArIDE7CgkJaWYgKHJpZ2h0cG9zIDwgZW5kcG9zKSB7CgkJCWNtcCA9IGNtcF9sdCgKCQkJCVB5TGlzdF9HRVRfSVRFTShoZWFwLCByaWdodHBvcyksCgkJCQlQeUxpc3RfR0VUX0lURU0oaGVhcCwgY2hpbGRwb3MpKTsKCQkJaWYgKGNtcCA9PSAtMSkgewoJCQkJUHlfREVDUkVGKG5ld2l0ZW0pOwoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJCWlmIChjbXAgPT0gMCkKCQkJCWNoaWxkcG9zID0gcmlnaHRwb3M7CgkJfQoJCS8qIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuICovCgkJdG1wID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKTsKCQlQeV9JTkNSRUYodG1wKTsKCQlQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwoJCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHRtcCk7CgkJcG9zID0gY2hpbGRwb3M7CgkJY2hpbGRwb3MgPSAyKnBvcyArIDE7Cgl9CgoJLyogVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYW5kIGJ1YmJsZQoJICAgaXQgdXAgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuICovCglQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwoJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CglyZXR1cm4gX3NpZnRkb3dubWF4KGhlYXAsIHN0YXJ0cG9zLCBwb3MpOwp9CgpzdGF0aWMgUHlPYmplY3QgKgpuc21hbGxlc3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CglQeU9iamVjdCAqaGVhcD1OVUxMLCAqZWxlbSwgKml0ZXJhYmxlLCAqbG9zLCAqaXQsICpvbGRlbGVtOwoJUHlfc3NpemVfdCBpLCBuOwoJaW50IGNtcDsKCglpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5POm5zbWFsbGVzdCIsICZuLCAmaXRlcmFibGUpKQoJCXJldHVybiBOVUxMOwoKCWl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7CglpZiAoaXQgPT0gTlVMTCkKCQlyZXR1cm4gTlVMTDsKCgloZWFwID0gUHlMaXN0X05ldygwKTsKCWlmIChoZWFwID09IE5VTEwpCgkJZ290byBmYWlsOwoKCWZvciAoaT0wIDsgaTxuIDsgaSsrICl7CgkJZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKCQlpZiAoZWxlbSA9PSBOVUxMKSB7CgkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQoJCQkJZ290byBmYWlsOwoJCQllbHNlCgkJCQlnb3RvIHNvcnRpdDsKCQl9CgkJaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgZWxlbSkgPT0gLTEpIHsKCQkJUHlfREVDUkVGKGVsZW0pOwoJCQlnb3RvIGZhaWw7CgkJfQoJCVB5X0RFQ1JFRihlbGVtKTsKCX0KCW4gPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7CglpZiAobiA9PSAwKQoJCWdvdG8gc29ydGl0OwoKCWZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCgkJaWYoX3NpZnR1cG1heCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCgkJCWdvdG8gZmFpbDsKCglsb3MgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Cgl3aGlsZSAoMSkgewoJCWVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7CgkJaWYgKGVsZW0gPT0gTlVMTCkgewoJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKCQkJCWdvdG8gZmFpbDsKCQkJZWxzZQoJCQkJZ290byBzb3J0aXQ7CgkJfQoJCWNtcCA9IGNtcF9sdChlbGVtLCBsb3MpOwoJCWlmIChjbXAgPT0gLTEpIHsKCQkJUHlfREVDUkVGKGVsZW0pOwoJCQlnb3RvIGZhaWw7CgkJfQoJCWlmIChjbXAgPT0gMCkgewoJCQlQeV9ERUNSRUYoZWxlbSk7CgkJCWNvbnRpbnVlOwoJCX0KCgkJb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKCQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgMCwgZWxlbSk7CgkJUHlfREVDUkVGKG9sZGVsZW0pOwoJCWlmIChfc2lmdHVwbWF4KChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkKCQkJZ290byBmYWlsOwoJCWxvcyA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKCX0KCnNvcnRpdDoKCWlmIChQeUxpc3RfU29ydChoZWFwKSA9PSAtMSkKCQlnb3RvIGZhaWw7CglQeV9ERUNSRUYoaXQpOwoJcmV0dXJuIGhlYXA7CgpmYWlsOgoJUHlfREVDUkVGKGl0KTsKCVB5X1hERUNSRUYoaGVhcCk7CglyZXR1cm4gTlVMTDsKfQoKUHlEb2NfU1RSVkFSKG5zbWFsbGVzdF9kb2MsCiJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cblwKXG5cCkVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUpWzpuXVxuIik7CgpzdGF0aWMgUHlNZXRob2REZWYgaGVhcHFfbWV0aG9kc1tdID0gewoJeyJoZWFwcHVzaCIsCShQeUNGdW5jdGlvbiloZWFwcHVzaCwJCQoJCU1FVEhfVkFSQVJHUywJaGVhcHB1c2hfZG9jfSwKCXsiaGVhcHB1c2hwb3AiLAkoUHlDRnVuY3Rpb24paGVhcHB1c2hwb3AsCQkKCQlNRVRIX1ZBUkFSR1MsCWhlYXBwdXNocG9wX2RvY30sCgl7ImhlYXBwb3AiLAkoUHlDRnVuY3Rpb24paGVhcHBvcCwKCQlNRVRIX08sCQloZWFwcG9wX2RvY30sCgl7ImhlYXByZXBsYWNlIiwJKFB5Q0Z1bmN0aW9uKWhlYXByZXBsYWNlLAoJCU1FVEhfVkFSQVJHUywJaGVhcHJlcGxhY2VfZG9jfSwKCXsiaGVhcGlmeSIsCShQeUNGdW5jdGlvbiloZWFwaWZ5LAoJCU1FVEhfTywJCWhlYXBpZnlfZG9jfSwKCXsibmxhcmdlc3QiLAkoUHlDRnVuY3Rpb24pbmxhcmdlc3QsCgkJTUVUSF9WQVJBUkdTLAlubGFyZ2VzdF9kb2N9LAoJeyJuc21hbGxlc3QiLAkoUHlDRnVuY3Rpb24pbnNtYWxsZXN0LAoJCU1FVEhfVkFSQVJHUywJbnNtYWxsZXN0X2RvY30sCgl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLwp9OwoKUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCiJIZWFwIHF1ZXVlIGFsZ29yaXRobSAoYS5rLmEuIHByaW9yaXR5IHF1ZXVlKS5cblwKXG5cCkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXG5cCmFsbCBrLCBjb3VudGluZyBlbGVtZW50cyBmcm9tIDAuICBGb3IgdGhlIHNha2Ugb2YgY29tcGFyaXNvbixcblwKbm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nXG5cCnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxuXApcblwKVXNhZ2U6XG5cClxuXApoZWFwID0gW10gICAgICAgICAgICAjIGNyZWF0ZXMgYW4gZW1wdHkgaGVhcFxuXApoZWFwcHVzaChoZWFwLCBpdGVtKSAjIHB1c2hlcyBhIG5ldyBpdGVtIG9uIHRoZSBoZWFwXG5cCml0ZW0gPSBoZWFwcG9wKGhlYXApICMgcG9wcyB0aGUgc21hbGxlc3QgaXRlbSBmcm9tIHRoZSBoZWFwXG5cCml0ZW0gPSBoZWFwWzBdICAgICAgICMgc21hbGxlc3QgaXRlbSBvbiB0aGUgaGVhcCB3aXRob3V0IHBvcHBpbmcgaXRcblwKaGVhcGlmeSh4KSAgICAgICAgICAgIyB0cmFuc2Zvcm1zIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBsaW5lYXIgdGltZVxuXAppdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkgIyBwb3BzIGFuZCByZXR1cm5zIHNtYWxsZXN0IGl0ZW0sIGFuZCBhZGRzXG5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5ldyBpdGVtOyB0aGUgaGVhcCBzaXplIGlzIHVuY2hhbmdlZFxuXApcblwKT3VyIEFQSSBkaWZmZXJzIGZyb20gdGV4dGJvb2sgaGVhcCBhbGdvcml0aG1zIGFzIGZvbGxvd3M6XG5cClxuXAotIFdlIHVzZSAwLWJhc2VkIGluZGV4aW5nLiAgVGhpcyBtYWtlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlXG5cCiAgaW5kZXggZm9yIGEgbm9kZSBhbmQgdGhlIGluZGV4ZXMgZm9yIGl0cyBjaGlsZHJlbiBzbGlnaHRseSBsZXNzXG5cCiAgb2J2aW91cywgYnV0IGlzIG1vcmUgc3VpdGFibGUgc2luY2UgUHl0aG9uIHVzZXMgMC1iYXNlZCBpbmRleGluZy5cblwKXG5cCi0gT3VyIGhlYXBwb3AoKSBtZXRob2QgcmV0dXJucyB0aGUgc21hbGxlc3QgaXRlbSwgbm90IHRoZSBsYXJnZXN0LlxuXApcblwKVGhlc2UgdHdvIG1ha2UgaXQgcG9zc2libGUgdG8gdmlldyB0aGUgaGVhcCBhcyBhIHJlZ3VsYXIgUHl0aG9uIGxpc3RcblwKd2l0aG91dCBzdXJwcmlzZXM6IGhlYXBbMF0gaXMgdGhlIHNtYWxsZXN0IGl0ZW0sIGFuZCBoZWFwLnNvcnQoKVxuXAptYWludGFpbnMgdGhlIGhlYXAgaW52YXJpYW50IVxuIik7CgoKUHlEb2NfU1RSVkFSKF9fYWJvdXRfXywKIkhlYXAgcXVldWVzXG5cClxuXApbZXhwbGFuYXRpb24gYnkgRnJhblx4YzNceGE3b2lzIFBpbmFyZF1cblwKXG5cCkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXG5cCmFsbCBrLCBjb3VudGluZyBlbGVtZW50cyBmcm9tIDAuICBGb3IgdGhlIHNha2Ugb2YgY29tcGFyaXNvbixcblwKbm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nXG5cCnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxuIgoiXG5cClRoZSBzdHJhbmdlIGludmFyaWFudCBhYm92ZSBpcyBtZWFudCB0byBiZSBhbiBlZmZpY2llbnQgbWVtb3J5XG5cCnJlcHJlc2VudGF0aW9uIGZvciBhIHRvdXJuYW1lbnQuICBUaGUgbnVtYmVycyBiZWxvdyBhcmUgYGsnLCBub3QgYVtrXTpcblwKXG5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMFxuXApcblwKICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJcblwKXG5cCiAgICAgICAgICAzICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICA1ICAgICAgICAgICAgICAgNlxuXApcblwKICAgICAgNyAgICAgICA4ICAgICAgIDkgICAgICAgMTAgICAgICAxMSAgICAgIDEyICAgICAgMTMgICAgICAxNFxuXApcblwKICAgIDE1IDE2ICAgMTcgMTggICAxOSAyMCAgIDIxIDIyICAgMjMgMjQgICAyNSAyNiAgIDI3IDI4ICAgMjkgMzBcblwKXG5cClxuXApJbiB0aGUgdHJlZSBhYm92ZSwgZWFjaCBjZWxsIGBrJyBpcyB0b3BwaW5nIGAyKmsrMScgYW5kIGAyKmsrMicuICBJblxuXAphbiB1c3VhbCBiaW5hcnkgdG91cm5hbWVudCB3ZSBzZWUgaW4gc3BvcnRzLCBlYWNoIGNlbGwgaXMgdGhlIHdpbm5lclxuXApvdmVyIHRoZSB0d28gY2VsbHMgaXQgdG9wcywgYW5kIHdlIGNhbiB0cmFjZSB0aGUgd2lubmVyIGRvd24gdGhlIHRyZWVcblwKdG8gc2VlIGFsbCBvcHBvbmVudHMgcy9oZSBoYWQuICBIb3dldmVyLCBpbiBtYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9uc1xuXApvZiBzdWNoIHRvdXJuYW1lbnRzLCB3ZSBkbyBub3QgbmVlZCB0byB0cmFjZSB0aGUgaGlzdG9yeSBvZiBhIHdpbm5lci5cblwKVG8gYmUgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCB3aGVuIGEgd2lubmVyIGlzIHByb21vdGVkLCB3ZSB0cnkgdG9cblwKcmVwbGFjZSBpdCBieSBzb21ldGhpbmcgZWxzZSBhdCBhIGxvd2VyIGxldmVsLCBhbmQgdGhlIHJ1bGUgYmVjb21lc1xuXAp0aGF0IGEgY2VsbCBhbmQgdGhlIHR3byBjZWxscyBpdCB0b3BzIGNvbnRhaW4gdGhyZWUgZGlmZmVyZW50IGl0ZW1zLFxuXApidXQgdGhlIHRvcCBjZWxsIFwid2luc1wiIG92ZXIgdGhlIHR3byB0b3BwZWQgY2VsbHMuXG4iCiJcblwKSWYgdGhpcyBoZWFwIGludmFyaWFudCBpcyBwcm90ZWN0ZWQgYXQgYWxsIHRpbWUsIGluZGV4IDAgaXMgY2xlYXJseVxuXAp0aGUgb3ZlcmFsbCB3aW5uZXIuICBUaGUgc2ltcGxlc3QgYWxnb3JpdGhtaWMgd2F5IHRvIHJlbW92ZSBpdCBhbmRcblwKZmluZCB0aGUgXCJuZXh0XCIgd2lubmVyIGlzIHRvIG1vdmUgc29tZSBsb3NlciAobGV0J3Mgc2F5IGNlbGwgMzAgaW4gdGhlXG5cCmRpYWdyYW0gYWJvdmUpIGludG8gdGhlIDAgcG9zaXRpb24sIGFuZCB0aGVuIHBlcmNvbGF0ZSB0aGlzIG5ldyAwIGRvd25cblwKdGhlIHRyZWUsIGV4Y2hhbmdpbmcgdmFsdWVzLCB1bnRpbCB0aGUgaW52YXJpYW50IGlzIHJlLWVzdGFibGlzaGVkLlxuXApUaGlzIGlzIGNsZWFybHkgbG9nYXJpdGhtaWMgb24gdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgdHJlZS5cblwKQnkgaXRlcmF0aW5nIG92ZXIgYWxsIGl0ZW1zLCB5b3UgZ2V0IGFuIE8obiBsbiBuKSBzb3J0LlxuIgoiXG5cCkEgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ld1xuXAppdGVtcyB3aGlsZSB0aGUgc29ydCBpcyBnb2luZyBvbiwgcHJvdmlkZWQgdGhhdCB0aGUgaW5zZXJ0ZWQgaXRlbXMgYXJlXG5cCm5vdCBcImJldHRlclwiIHRoYW4gdGhlIGxhc3QgMCd0aCBlbGVtZW50IHlvdSBleHRyYWN0ZWQuICBUaGlzIGlzXG5cCmVzcGVjaWFsbHkgdXNlZnVsIGluIHNpbXVsYXRpb24gY29udGV4dHMsIHdoZXJlIHRoZSB0cmVlIGhvbGRzIGFsbFxuXAppbmNvbWluZyBldmVudHMsIGFuZCB0aGUgXCJ3aW5cIiBjb25kaXRpb24gbWVhbnMgdGhlIHNtYWxsZXN0IHNjaGVkdWxlZFxuXAp0aW1lLiAgV2hlbiBhbiBldmVudCBzY2hlZHVsZSBvdGhlciBldmVudHMgZm9yIGV4ZWN1dGlvbiwgdGhleSBhcmVcblwKc2NoZWR1bGVkIGludG8gdGhlIGZ1dHVyZSwgc28gdGhleSBjYW4gZWFzaWx5IGdvIGludG8gdGhlIGhlYXAuICBTbywgYVxuXApoZWFwIGlzIGEgZ29vZCBzdHJ1Y3R1cmUgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzICh0aGlzIGlzIHdoYXQgSVxuXAp1c2VkIGZvciBteSBNSURJIHNlcXVlbmNlciA6LSkuXG4iCiJcblwKVmFyaW91cyBzdHJ1Y3R1cmVzIGZvciBpbXBsZW1lbnRpbmcgc2NoZWR1bGVycyBoYXZlIGJlZW4gZXh0ZW5zaXZlbHlcblwKc3R1ZGllZCwgYW5kIGhlYXBzIGFyZSBnb29kIGZvciB0aGlzLCBhcyB0aGV5IGFyZSByZWFzb25hYmx5IHNwZWVkeSxcblwKdGhlIHNwZWVkIGlzIGFsbW9zdCBjb25zdGFudCwgYW5kIHRoZSB3b3JzdCBjYXNlIGlzIG5vdCBtdWNoIGRpZmZlcmVudFxuXAp0aGFuIHRoZSBhdmVyYWdlIGNhc2UuICBIb3dldmVyLCB0aGVyZSBhcmUgb3RoZXIgcmVwcmVzZW50YXRpb25zIHdoaWNoXG5cCmFyZSBtb3JlIGVmZmljaWVudCBvdmVyYWxsLCB5ZXQgdGhlIHdvcnN0IGNhc2VzIG1pZ2h0IGJlIHRlcnJpYmxlLlxuIgoiXG5cCkhlYXBzIGFyZSBhbHNvIHZlcnkgdXNlZnVsIGluIGJpZyBkaXNrIHNvcnRzLiAgWW91IG1vc3QgcHJvYmFibHkgYWxsXG5cCmtub3cgdGhhdCBhIGJpZyBzb3J0IGltcGxpZXMgcHJvZHVjaW5nIFwicnVuc1wiICh3aGljaCBhcmUgcHJlLXNvcnRlZFxuXApzZXF1ZW5jZXMsIHdoaWNoIHNpemUgaXMgdXN1YWxseSByZWxhdGVkIHRvIHRoZSBhbW91bnQgb2YgQ1BVIG1lbW9yeSksXG5cCmZvbGxvd2VkIGJ5IGEgbWVyZ2luZyBwYXNzZXMgZm9yIHRoZXNlIHJ1bnMsIHdoaWNoIG1lcmdpbmcgaXMgb2Z0ZW5cblwKdmVyeSBjbGV2ZXJseSBvcmdhbmlzZWRbMV0uICBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHRoZSBpbml0aWFsXG5cCnNvcnQgcHJvZHVjZXMgdGhlIGxvbmdlc3QgcnVucyBwb3NzaWJsZS4gIFRvdXJuYW1lbnRzIGFyZSBhIGdvb2Qgd2F5XG5cCnRvIHRoYXQuICBJZiwgdXNpbmcgYWxsIHRoZSBtZW1vcnkgYXZhaWxhYmxlIHRvIGhvbGQgYSB0b3VybmFtZW50LCB5b3VcblwKcmVwbGFjZSBhbmQgcGVyY29sYXRlIGl0ZW1zIHRoYXQgaGFwcGVuIHRvIGZpdCB0aGUgY3VycmVudCBydW4sIHlvdSdsbFxuXApwcm9kdWNlIHJ1bnMgd2hpY2ggYXJlIHR3aWNlIHRoZSBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHJhbmRvbSBpbnB1dCxcblwKYW5kIG11Y2ggYmV0dGVyIGZvciBpbnB1dCBmdXp6aWx5IG9yZGVyZWQuXG4iCiJcblwKTW9yZW92ZXIsIGlmIHlvdSBvdXRwdXQgdGhlIDAndGggaXRlbSBvbiBkaXNrIGFuZCBnZXQgYW4gaW5wdXQgd2hpY2hcblwKbWF5IG5vdCBmaXQgaW4gdGhlIGN1cnJlbnQgdG91cm5hbWVudCAoYmVjYXVzZSB0aGUgdmFsdWUgXCJ3aW5zXCIgb3ZlclxuXAp0aGUgbGFzdCBvdXRwdXQgdmFsdWUpLCBpdCBjYW5ub3QgZml0IGluIHRoZSBoZWFwLCBzbyB0aGUgc2l6ZSBvZiB0aGVcblwKaGVhcCBkZWNyZWFzZXMuICBUaGUgZnJlZWQgbWVtb3J5IGNvdWxkIGJlIGNsZXZlcmx5IHJldXNlZCBpbW1lZGlhdGVseVxuXApmb3IgcHJvZ3Jlc3NpdmVseSBidWlsZGluZyBhIHNlY29uZCBoZWFwLCB3aGljaCBncm93cyBhdCBleGFjdGx5IHRoZVxuXApzYW1lIHJhdGUgdGhlIGZpcnN0IGhlYXAgaXMgbWVsdGluZy4gIFdoZW4gdGhlIGZpcnN0IGhlYXAgY29tcGxldGVseVxuXAp2YW5pc2hlcywgeW91IHN3aXRjaCBoZWFwcyBhbmQgc3RhcnQgYSBuZXcgcnVuLiAgQ2xldmVyIGFuZCBxdWl0ZVxuXAplZmZlY3RpdmUhXG5cClxuXApJbiBhIHdvcmQsIGhlYXBzIGFyZSB1c2VmdWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8ga25vdy4gIEkgdXNlIHRoZW0gaW5cblwKYSBmZXcgYXBwbGljYXRpb25zLCBhbmQgSSB0aGluayBpdCBpcyBnb29kIHRvIGtlZXAgYSBgaGVhcCcgbW9kdWxlXG5cCmFyb3VuZC4gOi0pXG4iCiJcblwKLS0tLS0tLS0tLS0tLS0tLS0tLS1cblwKWzFdIFRoZSBkaXNrIGJhbGFuY2luZyBhbGdvcml0aG1zIHdoaWNoIGFyZSBjdXJyZW50LCBub3dhZGF5cywgYXJlXG5cCm1vcmUgYW5ub3lpbmcgdGhhbiBjbGV2ZXIsIGFuZCB0aGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHNlZWtpbmdcblwKY2FwYWJpbGl0aWVzIG9mIHRoZSBkaXNrcy4gIE9uIGRldmljZXMgd2hpY2ggY2Fubm90IHNlZWssIGxpa2UgYmlnXG5cCnRhcGUgZHJpdmVzLCB0aGUgc3Rvcnkgd2FzIHF1aXRlIGRpZmZlcmVudCwgYW5kIG9uZSBoYWQgdG8gYmUgdmVyeVxuXApjbGV2ZXIgdG8gZW5zdXJlIChmYXIgaW4gYWR2YW5jZSkgdGhhdCBlYWNoIHRhcGUgbW92ZW1lbnQgd2lsbCBiZSB0aGVcblwKbW9zdCBlZmZlY3RpdmUgcG9zc2libGUgKHRoYXQgaXMsIHdpbGwgYmVzdCBwYXJ0aWNpcGF0ZSBhdFxuXApcInByb2dyZXNzaW5nXCIgdGhlIG1lcmdlKS4gIFNvbWUgdGFwZXMgd2VyZSBldmVuIGFibGUgdG8gcmVhZFxuXApiYWNrd2FyZHMsIGFuZCB0aGlzIHdhcyBhbHNvIHVzZWQgdG8gYXZvaWQgdGhlIHJld2luZGluZyB0aW1lLlxuXApCZWxpZXZlIG1lLCByZWFsIGdvb2QgdGFwZSBzb3J0cyB3ZXJlIHF1aXRlIHNwZWN0YWN1bGFyIHRvIHdhdGNoIVxuXApGcm9tIGFsbCB0aW1lcywgc29ydGluZyBoYXMgYWx3YXlzIGJlZW4gYSBHcmVhdCBBcnQhIDotKVxuIik7CgoKc3RhdGljIHN0cnVjdCBQeU1vZHVsZURlZiBfaGVhcHFtb2R1bGUgPSB7CglQeU1vZHVsZURlZl9IRUFEX0lOSVQsCgkiX2hlYXBxIiwKCW1vZHVsZV9kb2MsCgktMSwKCWhlYXBxX21ldGhvZHMsCglOVUxMLAoJTlVMTCwKCU5VTEwsCglOVUxMCn07CgpQeU1PRElOSVRfRlVOQwpQeUluaXRfX2hlYXBxKHZvaWQpCnsKCVB5T2JqZWN0ICptLCAqYWJvdXQ7CgoJbSA9IFB5TW9kdWxlX0NyZWF0ZSgmX2hlYXBxbW9kdWxlKTsKCWlmIChtID09IE5VTEwpCiAgICAJCXJldHVybiBOVUxMOwoJYWJvdXQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChfX2Fib3V0X18sIHN0cmxlbihfX2Fib3V0X18pLCBOVUxMKTsKCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX19hYm91dF9fIiwgYWJvdXQpOwoJcmV0dXJuIG07Cn0KCg==