LyogRHJvcCBpbiByZXBsYWNlbWVudCBmb3IgaGVhcHEucHkgCgpDIGltcGxlbWVudGF0aW9uIGRlcml2ZWQgZGlyZWN0bHkgZnJvbSBoZWFwcS5weSBpbiBQeTIuMwp3aGljaCB3YXMgd3JpdHRlbiBieSBLZXZpbiBPJ0Nvbm5vciwgYXVnbWVudGVkIGJ5IFRpbSBQZXRlcnMsCmFubm90YXRlZCBieSBGcmFu529pcyBQaW5hcmQsIGFuZCBjb252ZXJ0ZWQgdG8gQyBieSBSYXltb25kIEhldHRpbmdlci4KCiovCgojaW5jbHVkZSAiUHl0aG9uLmgiCgpzdGF0aWMgaW50Cl9zaWZ0ZG93bihQeUxpc3RPYmplY3QgKmhlYXAsIGludCBzdGFydHBvcywgaW50IHBvcykKewoJUHlPYmplY3QgKm5ld2l0ZW0sICpwYXJlbnQ7CglpbnQgY21wLCBwYXJlbnRwb3M7CgoJYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7CglpZiAocG9zID49IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgewoJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CgkJcmV0dXJuIC0xOwoJfQoKCW5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKCVB5X0lOQ1JFRihuZXdpdGVtKTsKCS8qIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nCgkgICBhIHBsYWNlIG5ld2l0ZW0gZml0cy4gKi8KCXdoaWxlIChwb3MgPiBzdGFydHBvcyl7CgkJcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDE7CgkJcGFyZW50ID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBhcmVudHBvcyk7CgkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHBhcmVudCwgbmV3aXRlbSwgUHlfTEUpOwoJCWlmIChjbXAgPT0gLTEpCgkJCXJldHVybiAtMTsKCQlpZiAoY21wID09IDEpCgkJCWJyZWFrOwoJCVB5X0lOQ1JFRihwYXJlbnQpOwoJCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CgkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgcGFyZW50KTsKCQlwb3MgPSBwYXJlbnRwb3M7Cgl9CglQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwoJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludApfc2lmdHVwKFB5TGlzdE9iamVjdCAqaGVhcCwgaW50IHBvcykKewoJaW50IHN0YXJ0cG9zLCBlbmRwb3MsIGNoaWxkcG9zLCByaWdodHBvczsKCWludCBjbXA7CglQeU9iamVjdCAqbmV3aXRlbSwgKnRtcDsKCglhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKCWVuZHBvcyA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKCXN0YXJ0cG9zID0gcG9zOwoJaWYgKHBvcyA+PSBlbmRwb3MpIHsKCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOwoJCXJldHVybiAtMTsKCX0KCW5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKCVB5X0lOQ1JFRihuZXdpdGVtKTsKCgkvKiBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuICovCgljaGlsZHBvcyA9IDIqcG9zICsgMTsgICAgLyogbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24gICovCgl3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHsKCQkvKiBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4gICAqLwoJCXJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxOwoJCWlmIChyaWdodHBvcyA8IGVuZHBvcykgewoJCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woCgkJCQlQeUxpc3RfR0VUX0lURU0oaGVhcCwgcmlnaHRwb3MpLAoJCQkJUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKSwKCQkJCVB5X0xFKTsKCQkJaWYgKGNtcCA9PSAtMSkKCQkJCXJldHVybiAtMTsKCQkJaWYgKGNtcCA9PSAxKQoJCQkJY2hpbGRwb3MgPSByaWdodHBvczsKCQl9CgkJLyogTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4gKi8KCQl0bXAgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgY2hpbGRwb3MpOwoJCVB5X0lOQ1JFRih0bXApOwoJCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CgkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgdG1wKTsKCQlwb3MgPSBjaGlsZHBvczsKCQljaGlsZHBvcyA9IDIqcG9zICsgMTsKCX0KCgkvKiBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBhbmQgYnViYmxlCgkgICBpdCB1cCB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS4gKi8KCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CglQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsKCXJldHVybiBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcyk7Cn0KCnN0YXRpYyBQeU9iamVjdCAqCmhlYXBwdXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewoJUHlPYmplY3QgKmhlYXAsICppdGVtOwoKCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImhlYXBwdXNoIiwgMiwgMiwgJmhlYXAsICZpdGVtKSkKCQlyZXR1cm4gTlVMTDsKCglpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgewoJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgaXRlbSkgPT0gLTEpCgkJcmV0dXJuIE5VTEw7CgoJaWYgKF9zaWZ0ZG93bigoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCwgUHlMaXN0X0dFVF9TSVpFKGhlYXApLTEpID09IC0xKQoJCXJldHVybiBOVUxMOwoJUHlfSU5DUkVGKFB5X05vbmUpOwoJcmV0dXJuIFB5X05vbmU7Cn0KClB5RG9jX1NUUlZBUihoZWFwcHVzaF9kb2MsCiJQdXNoIGl0ZW0gb250byBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgpoZWFwcG9wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaGVhcCkKewoJUHlPYmplY3QgKmxhc3RlbHQsICpyZXR1cm5pdGVtOwoJaW50IG47CgoJaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eSAqLwoJbiA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKCWlmIChuID09IDApIHsKCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOwoJCXJldHVybiBOVUxMOwoJfQoKCWxhc3RlbHQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgbi0xKSA7CglQeV9JTkNSRUYobGFzdGVsdCk7CglQeUxpc3RfU2V0U2xpY2UoaGVhcCwgbi0xLCBuLCBOVUxMKTsKCW4tLTsKCglpZiAoIW4pIAoJCXJldHVybiBsYXN0ZWx0OwoJcmV0dXJuaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKCVB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBsYXN0ZWx0KTsKCWlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgewoJCVB5X0RFQ1JFRihyZXR1cm5pdGVtKTsKCQlyZXR1cm4gTlVMTDsKCX0KCXJldHVybiByZXR1cm5pdGVtOwp9CgpQeURvY19TVFJWQVIoaGVhcHBvcF9kb2MsCiJQb3AgdGhlIHNtYWxsZXN0IGl0ZW0gb2ZmIHRoZSBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgpoZWFwcmVwbGFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKCVB5T2JqZWN0ICpoZWFwLCAqaXRlbSwgKnJldHVybml0ZW07CgoJaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaGVhcHJlcGxhY2UiLCAyLCAyLCAmaGVhcCwgJml0ZW0pKQoJCXJldHVybiBOVUxMOwoKCWlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7CgkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglpZiAoUHlMaXN0X0dFVF9TSVpFKGhlYXApIDwgMSkgewoJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJcmV0dXJuaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKCVB5X0lOQ1JFRihpdGVtKTsKCVB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBpdGVtKTsKCWlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgewoJCVB5X0RFQ1JFRihyZXR1cm5pdGVtKTsKCQlyZXR1cm4gTlVMTDsKCX0KCXJldHVybiByZXR1cm5pdGVtOwp9CgpQeURvY19TVFJWQVIoaGVhcHJlcGxhY2VfZG9jLAoiUG9wIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgc21hbGxlc3QgdmFsdWUsIGFuZCBhZGQgdGhlIG5ldyBpdGVtLlxuXApcblwKVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGhlYXBwb3AoKSBmb2xsb3dlZCBieSBoZWFwcHVzaCgpLCBhbmQgY2FuIGJlXG5cCm1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkLXNpemUgaGVhcC4gIE5vdGUgdGhhdCB0aGUgdmFsdWVcblwKcmV0dXJuZWQgbWF5IGJlIGxhcmdlciB0aGFuIGl0ZW0hICBUaGF0IGNvbnN0cmFpbnMgcmVhc29uYWJsZSB1c2VzIG9mXG5cCnRoaXMgcm91dGluZSB1bmxlc3Mgd3JpdHRlbiBhcyBwYXJ0IG9mIGEgbGFyZ2VyIGV4cHJlc3Npb246XG5cblwKICAgIHJlc3VsdCA9IGl0ZW0gPD0gaGVhcFswXSBhbmQgaXRlbSAgb3IgIGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pXG4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCmhlYXBpZnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpoZWFwKQp7CglpbnQgaSwgbjsKCglpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgewoJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJbiA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKCS8qIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0bwoJICAgbG9va2luZyBhdCBpcyB0aGUgbGFyZ2VzdCB3aXRoIGEgY2hpbGQgaW5kZXggaW4tcmFuZ2UsIHNvIG11c3QKCSAgIGhhdmUgMippICsgMSA8IG4sIG9yIGkgPCAobi0xKS8yLiAgSWYgbiBpcyBldmVuID0gMipqLCB0aGlzIGlzCgkgICAoMipqLTEpLzIgPSBqLTEvMiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYKCSAgIG4gaXMgb2RkID0gMipqKzEsIHRoaXMgaXMgKDIqaisxLTEpLzIgPSBqIHNvIGotMSBpcyB0aGUgbGFyZ2VzdCwKCSAgIGFuZCB0aGF0J3MgYWdhaW4gbi8vMi0xLgoJKi8KCWZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCgkJaWYoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCgkJCXJldHVybiBOVUxMOwoJUHlfSU5DUkVGKFB5X05vbmUpOwoJcmV0dXJuIFB5X05vbmU7Cn0KClB5RG9jX1NUUlZBUihoZWFwaWZ5X2RvYywKIlRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oaGVhcCkpIHRpbWUuIik7CgpzdGF0aWMgUHlPYmplY3QgKgpubGFyZ2VzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKCVB5T2JqZWN0ICpoZWFwPU5VTEwsICplbGVtLCAqaXRlcmFibGUsICpzb2wsICppdCwgKm9sZGVsZW07CglpbnQgaSwgbjsKCglpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOm5sYXJnZXN0IiwgJm4sICZpdGVyYWJsZSkpCgkJcmV0dXJuIE5VTEw7CgoJaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKCWlmIChpdCA9PSBOVUxMKQoJCXJldHVybiBOVUxMOwoKCWhlYXAgPSBQeUxpc3RfTmV3KDApOwoJaWYgKGhlYXAgPT0gTlVMTCkKCQlnb3RvIGZhaWw7CgoJZm9yIChpPTAgOyBpPG4gOyBpKysgKXsKCQllbGVtID0gUHlJdGVyX05leHQoaXQpOwoJCWlmIChlbGVtID09IE5VTEwpIHsKCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCgkJCQlnb3RvIGZhaWw7CgkJCWVsc2UKCQkJCWdvdG8gc29ydGl0OwoJCX0KCQlpZiAoUHlMaXN0X0FwcGVuZChoZWFwLCBlbGVtKSA9PSAtMSkgewoJCQlQeV9ERUNSRUYoZWxlbSk7CgkJCWdvdG8gZmFpbDsKCQl9CgkJUHlfREVDUkVGKGVsZW0pOwoJfQoJaWYgKFB5TGlzdF9HRVRfU0laRShoZWFwKSA9PSAwKQoJCWdvdG8gc29ydGl0OwoKCWZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCgkJaWYoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCgkJCWdvdG8gZmFpbDsKCglzb2wgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Cgl3aGlsZSAoMSkgewoJCWVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7CgkJaWYgKGVsZW0gPT0gTlVMTCkgewoJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKCQkJCWdvdG8gZmFpbDsKCQkJZWxzZQoJCQkJZ290byBzb3J0aXQ7CgkJfQoJCWlmIChQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZWxlbSwgc29sLCBQeV9MRSkpIHsKCQkJUHlfREVDUkVGKGVsZW0pOwoJCQljb250aW51ZTsKCQl9CgkJb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKCQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgMCwgZWxlbSk7CgkJUHlfREVDUkVGKG9sZGVsZW0pOwoJCWlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkKCQkJZ290byBmYWlsOwoJCXNvbCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKCX0Kc29ydGl0OgoJaWYgKFB5TGlzdF9Tb3J0KGhlYXApID09IC0xKQoJCWdvdG8gZmFpbDsKCWlmIChQeUxpc3RfUmV2ZXJzZShoZWFwKSA9PSAtMSkKCQlnb3RvIGZhaWw7CglQeV9ERUNSRUYoaXQpOwoJcmV0dXJuIGhlYXA7CgpmYWlsOgoJUHlfREVDUkVGKGl0KTsKCVB5X1hERUNSRUYoaGVhcCk7CglyZXR1cm4gTlVMTDsKfQoKUHlEb2NfU1RSVkFSKG5sYXJnZXN0X2RvYywKIkZpbmQgdGhlIG4gbGFyZ2VzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuXG5cClxuXApFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCByZXZlcnNlPVRydWUpWzpuXVxuIik7CgpzdGF0aWMgaW50Cl9zaWZ0ZG93bm1heChQeUxpc3RPYmplY3QgKmhlYXAsIGludCBzdGFydHBvcywgaW50IHBvcykKewoJUHlPYmplY3QgKm5ld2l0ZW0sICpwYXJlbnQ7CglpbnQgY21wLCBwYXJlbnRwb3M7CgoJYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7CglpZiAocG9zID49IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgewoJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CgkJcmV0dXJuIC0xOwoJfQoKCW5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKCVB5X0lOQ1JFRihuZXdpdGVtKTsKCS8qIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nCgkgICBhIHBsYWNlIG5ld2l0ZW0gZml0cy4gKi8KCXdoaWxlIChwb3MgPiBzdGFydHBvcyl7CgkJcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDE7CgkJcGFyZW50ID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBhcmVudHBvcyk7CgkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKG5ld2l0ZW0sIHBhcmVudCwgUHlfTEUpOwoJCWlmIChjbXAgPT0gLTEpCgkJCXJldHVybiAtMTsKCQlpZiAoY21wID09IDEpCgkJCWJyZWFrOwoJCVB5X0lOQ1JFRihwYXJlbnQpOwoJCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CgkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgcGFyZW50KTsKCQlwb3MgPSBwYXJlbnRwb3M7Cgl9CglQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwoJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludApfc2lmdHVwbWF4KFB5TGlzdE9iamVjdCAqaGVhcCwgaW50IHBvcykKewoJaW50IHN0YXJ0cG9zLCBlbmRwb3MsIGNoaWxkcG9zLCByaWdodHBvczsKCWludCBjbXA7CglQeU9iamVjdCAqbmV3aXRlbSwgKnRtcDsKCglhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKCWVuZHBvcyA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKCXN0YXJ0cG9zID0gcG9zOwoJaWYgKHBvcyA+PSBlbmRwb3MpIHsKCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOwoJCXJldHVybiAtMTsKCX0KCW5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKCVB5X0lOQ1JFRihuZXdpdGVtKTsKCgkvKiBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuICovCgljaGlsZHBvcyA9IDIqcG9zICsgMTsgICAgLyogbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24gICovCgl3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHsKCQkvKiBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4gICAqLwoJCXJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxOwoJCWlmIChyaWdodHBvcyA8IGVuZHBvcykgewoJCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woCgkJCQlQeUxpc3RfR0VUX0lURU0oaGVhcCwgY2hpbGRwb3MpLAoJCQkJUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHJpZ2h0cG9zKSwKCQkJCVB5X0xFKTsKCQkJaWYgKGNtcCA9PSAtMSkKCQkJCXJldHVybiAtMTsKCQkJaWYgKGNtcCA9PSAxKQoJCQkJY2hpbGRwb3MgPSByaWdodHBvczsKCQl9CgkJLyogTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4gKi8KCQl0bXAgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgY2hpbGRwb3MpOwoJCVB5X0lOQ1JFRih0bXApOwoJCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CgkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgdG1wKTsKCQlwb3MgPSBjaGlsZHBvczsKCQljaGlsZHBvcyA9IDIqcG9zICsgMTsKCX0KCgkvKiBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBhbmQgYnViYmxlCgkgICBpdCB1cCB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS4gKi8KCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CglQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsKCXJldHVybiBfc2lmdGRvd25tYXgoaGVhcCwgc3RhcnRwb3MsIHBvcyk7Cn0KCnN0YXRpYyBQeU9iamVjdCAqCm5zbWFsbGVzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKCVB5T2JqZWN0ICpoZWFwPU5VTEwsICplbGVtLCAqaXRlcmFibGUsICpsb3MsICppdCwgKm9sZGVsZW07CglpbnQgaSwgbjsKCglpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOm5zbWFsbGVzdCIsICZuLCAmaXRlcmFibGUpKQoJCXJldHVybiBOVUxMOwoKCWl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7CglpZiAoaXQgPT0gTlVMTCkKCQlyZXR1cm4gTlVMTDsKCgloZWFwID0gUHlMaXN0X05ldygwKTsKCWlmIChoZWFwID09IE5VTEwpCgkJZ290byBmYWlsOwoKCWZvciAoaT0wIDsgaTxuIDsgaSsrICl7CgkJZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKCQlpZiAoZWxlbSA9PSBOVUxMKSB7CgkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQoJCQkJZ290byBmYWlsOwoJCQllbHNlCgkJCQlnb3RvIHNvcnRpdDsKCQl9CgkJaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgZWxlbSkgPT0gLTEpIHsKCQkJUHlfREVDUkVGKGVsZW0pOwoJCQlnb3RvIGZhaWw7CgkJfQoJCVB5X0RFQ1JFRihlbGVtKTsKCX0KCW4gPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7CglpZiAobiA9PSAwKQoJCWdvdG8gc29ydGl0OwoKCWZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCgkJaWYoX3NpZnR1cG1heCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCgkJCWdvdG8gZmFpbDsKCglsb3MgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Cgl3aGlsZSAoMSkgewoJCWVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7CgkJaWYgKGVsZW0gPT0gTlVMTCkgewoJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKCQkJCWdvdG8gZmFpbDsKCQkJZWxzZQoJCQkJZ290byBzb3J0aXQ7CgkJfQoJCWlmIChQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wobG9zLCBlbGVtLCBQeV9MRSkpIHsKCQkJUHlfREVDUkVGKGVsZW0pOwoJCQljb250aW51ZTsKCQl9CgoJCW9sZGVsZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CgkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOwoJCVB5X0RFQ1JFRihvbGRlbGVtKTsKCQlpZiAoX3NpZnR1cG1heCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpCgkJCWdvdG8gZmFpbDsKCQlsb3MgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Cgl9Cgpzb3J0aXQ6CglpZiAoUHlMaXN0X1NvcnQoaGVhcCkgPT0gLTEpCgkJZ290byBmYWlsOwoJUHlfREVDUkVGKGl0KTsKCXJldHVybiBoZWFwOwoKZmFpbDoKCVB5X0RFQ1JFRihpdCk7CglQeV9YREVDUkVGKGhlYXApOwoJcmV0dXJuIE5VTEw7Cn0KClB5RG9jX1NUUlZBUihuc21hbGxlc3RfZG9jLAoiRmluZCB0aGUgbiBzbWFsbGVzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuXG5cClxuXApFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlKVs6bl1cbiIpOwoKc3RhdGljIFB5TWV0aG9kRGVmIGhlYXBxX21ldGhvZHNbXSA9IHsKCXsiaGVhcHB1c2giLAkoUHlDRnVuY3Rpb24paGVhcHB1c2gsCQkKCQlNRVRIX1ZBUkFSR1MsCWhlYXBwdXNoX2RvY30sCgl7ImhlYXBwb3AiLAkoUHlDRnVuY3Rpb24paGVhcHBvcCwKCQlNRVRIX08sCQloZWFwcG9wX2RvY30sCgl7ImhlYXByZXBsYWNlIiwJKFB5Q0Z1bmN0aW9uKWhlYXByZXBsYWNlLAoJCU1FVEhfVkFSQVJHUywJaGVhcHJlcGxhY2VfZG9jfSwKCXsiaGVhcGlmeSIsCShQeUNGdW5jdGlvbiloZWFwaWZ5LAoJCU1FVEhfTywJCWhlYXBpZnlfZG9jfSwKCXsibmxhcmdlc3QiLAkoUHlDRnVuY3Rpb24pbmxhcmdlc3QsCgkJTUVUSF9WQVJBUkdTLAlubGFyZ2VzdF9kb2N9LAoJeyJuc21hbGxlc3QiLAkoUHlDRnVuY3Rpb24pbnNtYWxsZXN0LAoJCU1FVEhfVkFSQVJHUywJbnNtYWxsZXN0X2RvY30sCgl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLwp9OwoKUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCiJIZWFwIHF1ZXVlIGFsZ29yaXRobSAoYS5rLmEuIHByaW9yaXR5IHF1ZXVlKS5cblwKXG5cCkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXG5cCmFsbCBrLCBjb3VudGluZyBlbGVtZW50cyBmcm9tIDAuICBGb3IgdGhlIHNha2Ugb2YgY29tcGFyaXNvbixcblwKbm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nXG5cCnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxuXApcblwKVXNhZ2U6XG5cClxuXApoZWFwID0gW10gICAgICAgICAgICAjIGNyZWF0ZXMgYW4gZW1wdHkgaGVhcFxuXApoZWFwcHVzaChoZWFwLCBpdGVtKSAjIHB1c2hlcyBhIG5ldyBpdGVtIG9uIHRoZSBoZWFwXG5cCml0ZW0gPSBoZWFwcG9wKGhlYXApICMgcG9wcyB0aGUgc21hbGxlc3QgaXRlbSBmcm9tIHRoZSBoZWFwXG5cCml0ZW0gPSBoZWFwWzBdICAgICAgICMgc21hbGxlc3QgaXRlbSBvbiB0aGUgaGVhcCB3aXRob3V0IHBvcHBpbmcgaXRcblwKaGVhcGlmeSh4KSAgICAgICAgICAgIyB0cmFuc2Zvcm1zIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBsaW5lYXIgdGltZVxuXAppdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkgIyBwb3BzIGFuZCByZXR1cm5zIHNtYWxsZXN0IGl0ZW0sIGFuZCBhZGRzXG5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5ldyBpdGVtOyB0aGUgaGVhcCBzaXplIGlzIHVuY2hhbmdlZFxuXApcblwKT3VyIEFQSSBkaWZmZXJzIGZyb20gdGV4dGJvb2sgaGVhcCBhbGdvcml0aG1zIGFzIGZvbGxvd3M6XG5cClxuXAotIFdlIHVzZSAwLWJhc2VkIGluZGV4aW5nLiAgVGhpcyBtYWtlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlXG5cCiAgaW5kZXggZm9yIGEgbm9kZSBhbmQgdGhlIGluZGV4ZXMgZm9yIGl0cyBjaGlsZHJlbiBzbGlnaHRseSBsZXNzXG5cCiAgb2J2aW91cywgYnV0IGlzIG1vcmUgc3VpdGFibGUgc2luY2UgUHl0aG9uIHVzZXMgMC1iYXNlZCBpbmRleGluZy5cblwKXG5cCi0gT3VyIGhlYXBwb3AoKSBtZXRob2QgcmV0dXJucyB0aGUgc21hbGxlc3QgaXRlbSwgbm90IHRoZSBsYXJnZXN0LlxuXApcblwKVGhlc2UgdHdvIG1ha2UgaXQgcG9zc2libGUgdG8gdmlldyB0aGUgaGVhcCBhcyBhIHJlZ3VsYXIgUHl0aG9uIGxpc3RcblwKd2l0aG91dCBzdXJwcmlzZXM6IGhlYXBbMF0gaXMgdGhlIHNtYWxsZXN0IGl0ZW0sIGFuZCBoZWFwLnNvcnQoKVxuXAptYWludGFpbnMgdGhlIGhlYXAgaW52YXJpYW50IVxuIik7CgoKUHlEb2NfU1RSVkFSKF9fYWJvdXRfXywKIkhlYXAgcXVldWVzXG5cClxuXApbZXhwbGFuYXRpb24gYnkgRnJhbudvaXMgUGluYXJkXVxuXApcblwKSGVhcHMgYXJlIGFycmF5cyBmb3Igd2hpY2ggYVtrXSA8PSBhWzIqaysxXSBhbmQgYVtrXSA8PSBhWzIqaysyXSBmb3JcblwKYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxuXApub24tZXhpc3RpbmcgZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW5maW5pdGUuICBUaGUgaW50ZXJlc3RpbmdcblwKcHJvcGVydHkgb2YgYSBoZWFwIGlzIHRoYXQgYVswXSBpcyBhbHdheXMgaXRzIHNtYWxsZXN0IGVsZW1lbnQuXG4iCiJcblwKVGhlIHN0cmFuZ2UgaW52YXJpYW50IGFib3ZlIGlzIG1lYW50IHRvIGJlIGFuIGVmZmljaWVudCBtZW1vcnlcblwKcmVwcmVzZW50YXRpb24gZm9yIGEgdG91cm5hbWVudC4gIFRoZSBudW1iZXJzIGJlbG93IGFyZSBgaycsIG5vdCBhW2tdOlxuXApcblwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwXG5cClxuXAogICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMlxuXApcblwKICAgICAgICAgIDMgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICA2XG5cClxuXAogICAgICA3ICAgICAgIDggICAgICAgOSAgICAgICAxMCAgICAgIDExICAgICAgMTIgICAgICAxMyAgICAgIDE0XG5cClxuXAogICAgMTUgMTYgICAxNyAxOCAgIDE5IDIwICAgMjEgMjIgICAyMyAyNCAgIDI1IDI2ICAgMjcgMjggICAyOSAzMFxuXApcblwKXG5cCkluIHRoZSB0cmVlIGFib3ZlLCBlYWNoIGNlbGwgYGsnIGlzIHRvcHBpbmcgYDIqaysxJyBhbmQgYDIqaysyJy4gIEluXG5cCmFuIHVzdWFsIGJpbmFyeSB0b3VybmFtZW50IHdlIHNlZSBpbiBzcG9ydHMsIGVhY2ggY2VsbCBpcyB0aGUgd2lubmVyXG5cCm92ZXIgdGhlIHR3byBjZWxscyBpdCB0b3BzLCBhbmQgd2UgY2FuIHRyYWNlIHRoZSB3aW5uZXIgZG93biB0aGUgdHJlZVxuXAp0byBzZWUgYWxsIG9wcG9uZW50cyBzL2hlIGhhZC4gIEhvd2V2ZXIsIGluIG1hbnkgY29tcHV0ZXIgYXBwbGljYXRpb25zXG5cCm9mIHN1Y2ggdG91cm5hbWVudHMsIHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNlIHRoZSBoaXN0b3J5IG9mIGEgd2lubmVyLlxuXApUbyBiZSBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHdoZW4gYSB3aW5uZXIgaXMgcHJvbW90ZWQsIHdlIHRyeSB0b1xuXApyZXBsYWNlIGl0IGJ5IHNvbWV0aGluZyBlbHNlIGF0IGEgbG93ZXIgbGV2ZWwsIGFuZCB0aGUgcnVsZSBiZWNvbWVzXG5cCnRoYXQgYSBjZWxsIGFuZCB0aGUgdHdvIGNlbGxzIGl0IHRvcHMgY29udGFpbiB0aHJlZSBkaWZmZXJlbnQgaXRlbXMsXG5cCmJ1dCB0aGUgdG9wIGNlbGwgXCJ3aW5zXCIgb3ZlciB0aGUgdHdvIHRvcHBlZCBjZWxscy5cbiIKIlxuXApJZiB0aGlzIGhlYXAgaW52YXJpYW50IGlzIHByb3RlY3RlZCBhdCBhbGwgdGltZSwgaW5kZXggMCBpcyBjbGVhcmx5XG5cCnRoZSBvdmVyYWxsIHdpbm5lci4gIFRoZSBzaW1wbGVzdCBhbGdvcml0aG1pYyB3YXkgdG8gcmVtb3ZlIGl0IGFuZFxuXApmaW5kIHRoZSBcIm5leHRcIiB3aW5uZXIgaXMgdG8gbW92ZSBzb21lIGxvc2VyIChsZXQncyBzYXkgY2VsbCAzMCBpbiB0aGVcblwKZGlhZ3JhbSBhYm92ZSkgaW50byB0aGUgMCBwb3NpdGlvbiwgYW5kIHRoZW4gcGVyY29sYXRlIHRoaXMgbmV3IDAgZG93blxuXAp0aGUgdHJlZSwgZXhjaGFuZ2luZyB2YWx1ZXMsIHVudGlsIHRoZSBpbnZhcmlhbnQgaXMgcmUtZXN0YWJsaXNoZWQuXG5cClRoaXMgaXMgY2xlYXJseSBsb2dhcml0aG1pYyBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSB0cmVlLlxuXApCeSBpdGVyYXRpbmcgb3ZlciBhbGwgaXRlbXMsIHlvdSBnZXQgYW4gTyhuIGxuIG4pIHNvcnQuXG4iCiJcblwKQSBuaWNlIGZlYXR1cmUgb2YgdGhpcyBzb3J0IGlzIHRoYXQgeW91IGNhbiBlZmZpY2llbnRseSBpbnNlcnQgbmV3XG5cCml0ZW1zIHdoaWxlIHRoZSBzb3J0IGlzIGdvaW5nIG9uLCBwcm92aWRlZCB0aGF0IHRoZSBpbnNlcnRlZCBpdGVtcyBhcmVcblwKbm90IFwiYmV0dGVyXCIgdGhhbiB0aGUgbGFzdCAwJ3RoIGVsZW1lbnQgeW91IGV4dHJhY3RlZC4gIFRoaXMgaXNcblwKZXNwZWNpYWxseSB1c2VmdWwgaW4gc2ltdWxhdGlvbiBjb250ZXh0cywgd2hlcmUgdGhlIHRyZWUgaG9sZHMgYWxsXG5cCmluY29taW5nIGV2ZW50cywgYW5kIHRoZSBcIndpblwiIGNvbmRpdGlvbiBtZWFucyB0aGUgc21hbGxlc3Qgc2NoZWR1bGVkXG5cCnRpbWUuICBXaGVuIGFuIGV2ZW50IHNjaGVkdWxlIG90aGVyIGV2ZW50cyBmb3IgZXhlY3V0aW9uLCB0aGV5IGFyZVxuXApzY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhXG5cCmhlYXAgaXMgYSBnb29kIHN0cnVjdHVyZSBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgKHRoaXMgaXMgd2hhdCBJXG5cCnVzZWQgZm9yIG15IE1JREkgc2VxdWVuY2VyIDotKS5cbiIKIlxuXApWYXJpb3VzIHN0cnVjdHVyZXMgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzIGhhdmUgYmVlbiBleHRlbnNpdmVseVxuXApzdHVkaWVkLCBhbmQgaGVhcHMgYXJlIGdvb2QgZm9yIHRoaXMsIGFzIHRoZXkgYXJlIHJlYXNvbmFibHkgc3BlZWR5LFxuXAp0aGUgc3BlZWQgaXMgYWxtb3N0IGNvbnN0YW50LCBhbmQgdGhlIHdvcnN0IGNhc2UgaXMgbm90IG11Y2ggZGlmZmVyZW50XG5cCnRoYW4gdGhlIGF2ZXJhZ2UgY2FzZS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBvdGhlciByZXByZXNlbnRhdGlvbnMgd2hpY2hcblwKYXJlIG1vcmUgZWZmaWNpZW50IG92ZXJhbGwsIHlldCB0aGUgd29yc3QgY2FzZXMgbWlnaHQgYmUgdGVycmlibGUuXG4iCiJcblwKSGVhcHMgYXJlIGFsc28gdmVyeSB1c2VmdWwgaW4gYmlnIGRpc2sgc29ydHMuICBZb3UgbW9zdCBwcm9iYWJseSBhbGxcblwKa25vdyB0aGF0IGEgYmlnIHNvcnQgaW1wbGllcyBwcm9kdWNpbmcgXCJydW5zXCIgKHdoaWNoIGFyZSBwcmUtc29ydGVkXG5cCnNlcXVlbmNlcywgd2hpY2ggc2l6ZSBpcyB1c3VhbGx5IHJlbGF0ZWQgdG8gdGhlIGFtb3VudCBvZiBDUFUgbWVtb3J5KSxcblwKZm9sbG93ZWQgYnkgYSBtZXJnaW5nIHBhc3NlcyBmb3IgdGhlc2UgcnVucywgd2hpY2ggbWVyZ2luZyBpcyBvZnRlblxuXAp2ZXJ5IGNsZXZlcmx5IG9yZ2FuaXNlZFsxXS4gIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgdGhlIGluaXRpYWxcblwKc29ydCBwcm9kdWNlcyB0aGUgbG9uZ2VzdCBydW5zIHBvc3NpYmxlLiAgVG91cm5hbWVudHMgYXJlIGEgZ29vZCB3YXlcblwKdG8gdGhhdC4gIElmLCB1c2luZyBhbGwgdGhlIG1lbW9yeSBhdmFpbGFibGUgdG8gaG9sZCBhIHRvdXJuYW1lbnQsIHlvdVxuXApyZXBsYWNlIGFuZCBwZXJjb2xhdGUgaXRlbXMgdGhhdCBoYXBwZW4gdG8gZml0IHRoZSBjdXJyZW50IHJ1biwgeW91J2xsXG5cCnByb2R1Y2UgcnVucyB3aGljaCBhcmUgdHdpY2UgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgcmFuZG9tIGlucHV0LFxuXAphbmQgbXVjaCBiZXR0ZXIgZm9yIGlucHV0IGZ1enppbHkgb3JkZXJlZC5cbiIKIlxuXApNb3Jlb3ZlciwgaWYgeW91IG91dHB1dCB0aGUgMCd0aCBpdGVtIG9uIGRpc2sgYW5kIGdldCBhbiBpbnB1dCB3aGljaFxuXAptYXkgbm90IGZpdCBpbiB0aGUgY3VycmVudCB0b3VybmFtZW50IChiZWNhdXNlIHRoZSB2YWx1ZSBcIndpbnNcIiBvdmVyXG5cCnRoZSBsYXN0IG91dHB1dCB2YWx1ZSksIGl0IGNhbm5vdCBmaXQgaW4gdGhlIGhlYXAsIHNvIHRoZSBzaXplIG9mIHRoZVxuXApoZWFwIGRlY3JlYXNlcy4gIFRoZSBmcmVlZCBtZW1vcnkgY291bGQgYmUgY2xldmVybHkgcmV1c2VkIGltbWVkaWF0ZWx5XG5cCmZvciBwcm9ncmVzc2l2ZWx5IGJ1aWxkaW5nIGEgc2Vjb25kIGhlYXAsIHdoaWNoIGdyb3dzIGF0IGV4YWN0bHkgdGhlXG5cCnNhbWUgcmF0ZSB0aGUgZmlyc3QgaGVhcCBpcyBtZWx0aW5nLiAgV2hlbiB0aGUgZmlyc3QgaGVhcCBjb21wbGV0ZWx5XG5cCnZhbmlzaGVzLCB5b3Ugc3dpdGNoIGhlYXBzIGFuZCBzdGFydCBhIG5ldyBydW4uICBDbGV2ZXIgYW5kIHF1aXRlXG5cCmVmZmVjdGl2ZSFcblwKXG5cCkluIGEgd29yZCwgaGVhcHMgYXJlIHVzZWZ1bCBtZW1vcnkgc3RydWN0dXJlcyB0byBrbm93LiAgSSB1c2UgdGhlbSBpblxuXAphIGZldyBhcHBsaWNhdGlvbnMsIGFuZCBJIHRoaW5rIGl0IGlzIGdvb2QgdG8ga2VlcCBhIGBoZWFwJyBtb2R1bGVcblwKYXJvdW5kLiA6LSlcbiIKIlxuXAotLS0tLS0tLS0tLS0tLS0tLS0tLVxuXApbMV0gVGhlIGRpc2sgYmFsYW5jaW5nIGFsZ29yaXRobXMgd2hpY2ggYXJlIGN1cnJlbnQsIG5vd2FkYXlzLCBhcmVcblwKbW9yZSBhbm5veWluZyB0aGFuIGNsZXZlciwgYW5kIHRoaXMgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgc2Vla2luZ1xuXApjYXBhYmlsaXRpZXMgb2YgdGhlIGRpc2tzLiAgT24gZGV2aWNlcyB3aGljaCBjYW5ub3Qgc2VlaywgbGlrZSBiaWdcblwKdGFwZSBkcml2ZXMsIHRoZSBzdG9yeSB3YXMgcXVpdGUgZGlmZmVyZW50LCBhbmQgb25lIGhhZCB0byBiZSB2ZXJ5XG5cCmNsZXZlciB0byBlbnN1cmUgKGZhciBpbiBhZHZhbmNlKSB0aGF0IGVhY2ggdGFwZSBtb3ZlbWVudCB3aWxsIGJlIHRoZVxuXAptb3N0IGVmZmVjdGl2ZSBwb3NzaWJsZSAodGhhdCBpcywgd2lsbCBiZXN0IHBhcnRpY2lwYXRlIGF0XG5cClwicHJvZ3Jlc3NpbmdcIiB0aGUgbWVyZ2UpLiAgU29tZSB0YXBlcyB3ZXJlIGV2ZW4gYWJsZSB0byByZWFkXG5cCmJhY2t3YXJkcywgYW5kIHRoaXMgd2FzIGFsc28gdXNlZCB0byBhdm9pZCB0aGUgcmV3aW5kaW5nIHRpbWUuXG5cCkJlbGlldmUgbWUsIHJlYWwgZ29vZCB0YXBlIHNvcnRzIHdlcmUgcXVpdGUgc3BlY3RhY3VsYXIgdG8gd2F0Y2ghXG5cCkZyb20gYWxsIHRpbWVzLCBzb3J0aW5nIGhhcyBhbHdheXMgYmVlbiBhIEdyZWF0IEFydCEgOi0pXG4iKTsKClB5TU9ESU5JVF9GVU5DCmluaXRfaGVhcHEodm9pZCkKewoJUHlPYmplY3QgKm07CgoJbSA9IFB5X0luaXRNb2R1bGUzKCJfaGVhcHEiLCBoZWFwcV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX19hYm91dF9fIiwgUHlTdHJpbmdfRnJvbVN0cmluZyhfX2Fib3V0X18pKTsKfQoK