ZGlmZiAtLWdpdCBhL0NNYWtlTGlzdHMudHh0IGIvQ01ha2VMaXN0cy50eHQKaW5kZXggMTlkZWFhNS4uNWNlODFiZSAxMDA2NDQKLS0tIGEvQ01ha2VMaXN0cy50eHQKKysrIGIvQ01ha2VMaXN0cy50eHQKQEAgLTIxLDcgKzIxLDYgQEAKICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgbGFyZ2UgZmlsZSBzdXBwb3J0CiAjCiBzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgLURfTEFSR0VGSUxFNjRfU09VUkNFKQotCiAjIFdlIGFkZCB0aGVzZSBvdGhlciBkZWZpbml0aW9ucyBoZXJlIGJlY2F1c2UgQ2hlY2tUeXBlU2l6ZS5jbWFrZQogIyBpbiBDTWFrZSAyLjQueCBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGRvIHNvIGFuZCB3ZSB3YW50CiAjIGNvbXBhdGliaWxpdHkgd2l0aCBDTWFrZSAyLjQueC4KQEAgLTM0LDkgKzMzLDcgQEAKIGlmKEhBVkVfU1REREVGX0gpCiAgICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgLURIQVZFX1NURERFRl9IKQogZW5kaWYoKQotCiBjaGVja190eXBlX3NpemUob2ZmNjRfdCBPRkY2NF9UKQotCiBpZihIQVZFX09GRjY0X1QpCiAgICBhZGRfZGVmaW5pdGlvbnMoLURfTEFSR0VGSUxFNjRfU09VUkNFKQogZW5kaWYoKQpAQCAtNjMsMjMgKzYwLDYgQEAKIGVuZGlmKCkKIAogIwotIyBDaGVjayBmb3IgbW1hcCBzdXBwb3J0Ci0jCi1zZXQobW1hcF90ZXN0X2NvZGUgIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLWNhZGRyX3QgaGVsbG8oKSB7Ci0gIHJldHVybiBtbWFwKChjYWRkcl90KTAsIChvZmZfdCkwLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIDAsIChvZmZfdCkwKTsKLX0KLWludCBtYWluKCkgeyByZXR1cm4gMDsgfQotIikKLWNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCIke21tYXBfdGVzdF9jb2RlfSIgVVNFX01NQVApCi1pZihVU0VfTU1BUCkKLSAgICBhZGRfZGVmaW5pdGlvbnMoLURVU0VfTU1BUCkKLWVuZGlmKCkKLQotIwogIyBDcmVhdGUgdGhlIHpsaWJkZWZzLmggZmlsZS4KICMgTm90ZTogd2UgY3JlYXRlIGl0IGluIENNQUtFX0NVUlJFTlRfU09VUkNFX0RJUiBpbnN0ZWFkIAogIyAgICAgICBvZiBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVIgYmVjYXVzZSBhbiBlbXB0eSB6bGliZGVmcy5oCkBAIC04OCw3ICs2OCw3IEBACiAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vemxpYmRlZnMuaCkKIAogaWYoTVNWQykKLSAgICBzZXQoQ01BS0VfREVCVUdfUE9TVEZJWCAiRCIpCisgICAgc2V0KENNQUtFX0RFQlVHX1BPU1RGSVggImQiKQogICAgIGFkZF9kZWZpbml0aW9ucygtRF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSkKICAgICBhZGRfZGVmaW5pdGlvbnMoLURfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFKQogZW5kaWYoKQpAQCAtMTMwLDE1ICsxMTAsNDcgQEAKICAgICB0cmVlcy5jCiAgICAgdW5jb21wci5jCiAgICAgenV0aWwuYworICAgIHdpbjMyL3psaWIxLnJjCiApCiAKKyMgcGFyc2UgdGhlIGZ1bGwgdmVyc2lvbiBudW1iZXIgZnJvbSB6bGliLmggYW5kIGluY2x1ZGUgaW4gWkxJQl9GVUxMX1ZFUlNJT04KK2ZpbGUoUkVBRCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vemxpYi5oIF96bGliX2hfY29udGVudHMpCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiLiojZGVmaW5lWyBcdF0rWkxJQl9WRVJTSU9OWyBcdF0rXCIoWzAtOUEtWmEtei5dKylcIi4qIgorICAgICJcXDEiIFpMSUJfRlVMTF9WRVJTSU9OICR7X3psaWJfaF9jb250ZW50c30pCisKK2lmKE1JTkdXKQorICAgICMgVGhpcyBnZXRzIHVzIERMTCByZXNvdXJjZSBpbmZvcm1hdGlvbiB3aGVuIGNvbXBpbGluZyBvbiBNaW5HVy4KKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS96bGliMXJjLm9iagorICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EIHdpbmRyZXMuZXhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUQgR0NDX1dJTkRSRVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtSSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vemxpYjFyYy5vYmoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtaSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vd2luMzIvemxpYjEucmMpCisgICAgc2V0KFpMSUJfU1JDUyAke1pMSUJfU1JDU30gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3psaWIxcmMub2JqKQorZW5kaWYoTUlOR1cpCisKIGFkZF9saWJyYXJ5KHpsaWIgJHtaTElCX1NSQ1N9ICR7WkxJQl9QVUJMSUNfSERSU30gJHtaTElCX1BSSVZBVEVfSERSU30pCiBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoemxpYiBQUk9QRVJUSUVTIERFRklORV9TWU1CT0wgWkxJQl9ETEwpCi1zZXRfdGFyZ2V0X3Byb3BlcnRpZXMoemxpYiBQUk9QRVJUSUVTIFZFUlNJT04gMS4yLjMuNCkKKwogc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHpsaWIgUFJPUEVSVElFUyBTT1ZFUlNJT04gMSkKKworaWYoTk9UIENZR1dJTikKKyAgICAjIFRoaXMgcHJvcGVydHkgY2F1c2VzIHNoYXJlZCBsaWJyYXJpZXMgb24gTGludXggdG8gaGF2ZSB0aGUgZnVsbCB2ZXJzaW9uCisgICAgIyBlbmNvZGVkIGludG8gdGhlaXIgZmluYWwgZmlsZW5hbWUuICBXZSBkaXNhYmxlIHRoaXMgb24gQ3lnd2luIGJlY2F1c2UKKyAgICAjIGl0IGNhdXNlcyBjeWd6LSR7WkxJQl9GVUxMX1ZFUlNJT059LmRsbCB0byBiZSBjcmVhdGVkIHdoZW4gY3lnei5kbGwKKyAgICAjIHNlZW1zIHRvIGJlIHRoZSBkZWZhdWx0LgorICAgICMKKyAgICAjIFRoaXMgaGFzIG5vIGVmZmVjdCB3aXRoIE1TVkMsIG9uIHRoYXQgcGxhdGZvcm0gdGhlIHZlcnNpb24gaW5mbyBmb3IKKyAgICAjIHRoZSBETEwgY29tZXMgZnJvbSB0aGUgcmVzb3VyY2UgZmlsZSB3aW4zMi96bGliMS5yYworICAgIHNldF90YXJnZXRfcHJvcGVydGllcyh6bGliIFBST1BFUlRJRVMgVkVSU0lPTiAke1pMSUJfRlVMTF9WRVJTSU9OfSkKK2VuZGlmKCkKKwogaWYoVU5JWCkKLSAgICMgT24gdW5peCBsaWtlIHBsYXRmb3JtcyB0aGUgbGlicmFyeSBpcyBhbG1vc3QgYWx3YXlzIGNhbGxlZCBsaWJ6CisgICAgIyBPbiB1bml4LWxpa2UgcGxhdGZvcm1zIHRoZSBsaWJyYXJ5IGlzIGFsbW9zdCBhbHdheXMgY2FsbGVkIGxpYnoKICAgIHNldF90YXJnZXRfcHJvcGVydGllcyh6bGliIFBST1BFUlRJRVMgT1VUUFVUX05BTUUgeikKK2Vsc2VpZihCVUlMRF9TSEFSRURfTElCUyBBTkQgV0lOMzIpCisgICAgIyBDcmVhdGVzIHpsaWIxLmRsbCB3aGVuIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb24KKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoemxpYiBQUk9QRVJUSUVTIFNVRkZJWCAiMS5kbGwiKQogZW5kaWYoKQogCiBpZihOT1QgU0tJUF9JTlNUQUxMX0xJQlJBUklFUyBBTkQgTk9UIFNLSVBfSU5TVEFMTF9BTEwgKQpkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCmluZGV4IDZlOGZmNWMuLjg3ZTQzMzkgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9DaGFuZ2VMb2cKQEAgLTEsNiArMSwyNyBAQAogCiAgICAgICAgICAgICAgICAgQ2hhbmdlTG9nIGZpbGUgZm9yIHpsaWIKIAorQ2hhbmdlcyBpbiAxLjIuMy42ICgxNyBKYW4gMjAxMCkKKy0gQXZvaWQgdm9pZCAqIGFyaXRobWV0aWMgaW4gZ3pyZWFkLmMgYW5kIGd6d3JpdGUuYworLSBNYWtlIGNvbXBpbGVycyBoYXBwaWVyIHdpdGggY29uc3QgY2hhciAqIGZvciBnel9lcnJvciBtZXNzYWdlCistIEF2b2lkIHVudXNlZCBwYXJhbWV0ZXIgd2FybmluZyBpbiBpbmZsYXRlLmMKKy0gQXZvaWQgc2lnbmVkLXVuc2lnbmVkIGNvbXBhcmlzb24gd2FybmluZyBpbiBpbmZsYXRlLmMKKy0gSW5kZW50ICNwcmFnbWEncyBmb3IgdHJhZGl0aW9uYWwgQworLSBGaXggdXNhZ2Ugb2Ygc3Ryd2luZXJyb3IoKSBpbiBnbGliLmMsIGNoYW5nZSB0byBnel9zdHJ3aW5lcnJvcigpCistIENvcnJlY3QgZW1haWwgYWRkcmVzcyBpbiBjb25maWd1cmUgZm9yIHN5c3RlbSBvcHRpb25zCistIFVwZGF0ZSBtYWtlX3Ztcy5jb20gYW5kIGFkZCBtYWtlX3Ztcy5jb20gdG8gY29udHJpYi9taW5pemlwIFtaaW5zZXJdCistIFVwZGF0ZSB6bGliLm1hcCBbQnJvd25dCistIEZpeCBNYWtlZmlsZS5pbiBmb3IgU29sYXJpcyAxMCBtYWtlIG9mIGV4YW1wbGU2NCBhbmQgbWluaXppcDY0IFtUmnKaa10KKy0gQXBwbHkgdmFyaW91cyBmaXhlcyB0byBDTWFrZUxpc3RzLnR4dCBbTG93bWFuXQorLSBBZGQgY2hlY2tzIG9uIGxlbiBpbiBnenJlYWQoKSBhbmQgZ3p3cml0ZSgpCistIEFkZCBlcnJvciBtZXNzYWdlIGZvciBubyBtb3JlIHJvb20gZm9yIGd6dW5nZXRjKCkKKy0gUmVtb3ZlIHpsaWIgdmVyc2lvbiBjaGVjayBpbiBnendyaXRlKCkKKy0gRGVmZXIgY29tcHJlc3Npb24gb2YgZ3pwcmludGYoKSByZXN1bHQgdW50aWwgbmVlZCB0bworLSBVc2Ugc25wcmludGYoKSBpbiBnemRvcGVuKCkgaWYgYXZhaWxhYmxlCistIFJlbW92ZSBVU0VfTU1BUCBjb25maWd1cmF0aW9uIGRldGVybWluYXRpb24gKG9ubHkgdXNlZCBieSBtaW5pZ3ppcCkKKy0gUmVtb3ZlIGV4YW1wbGVzL3BpZ3ouYyAoYXZhaWxhYmxlIHNlcGFyYXRlbHkpCistIFVwZGF0ZSBleGFtcGxlcy9ndW4uYyB0byAxLjYKKwogQ2hhbmdlcyBpbiAxLjIuMy41ICg4IEphbiAyMDEwKQogLSBBZGQgc3BhY2UgYWZ0ZXIgI2lmIGluIHp1dGlsLmggZm9yIHNvbWUgY29tcGlsZXJzCiAtIEZpeCByZWxhdGl2ZWx5IGhhcm1sZXNzIGJ1ZyBpbiBkZWZsYXRlX2Zhc3QoKSBbRXhhcmV2c2t5XQpAQCAtMjEsNiArNDIsNyBAQAogLSBSZXBsYWNlIGd6aW8uYyB3aXRoIGEgbmV3IHNldCBvZiByb3V0aW5lcyB3aXRoIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkKIC0gQWRkIGd6YnVmZmVyKCksIGd6b2Zmc2V0KCksIGd6Y2xvc2VfcigpLCBnemNsb3NlX3coKSBhcyBwYXJ0IG9mIGFib3ZlCiAtIFVwZGF0ZSBjb250cmliL21pbml6aXAgdG8gMS4xYgorLSBDaGFuZ2UgZ3plb2YoKSB0byByZXR1cm4gMCBvbiBlcnJvciBpbnN0ZWFkIG9mIC0xIHRvIGFncmVlIHdpdGggemxpYi5oCiAKIENoYW5nZXMgaW4gMS4yLjMuNCAoMjEgRGVjIDIwMDkpCiAtIFVzZSBvbGQgc2Nob29sIC5TVUZGSVhFUyBpbiBNYWtlZmlsZS5pbiBmb3IgRnJlZUJTRCBjb21wYXRpYmlsaXR5CmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDA5NDEyMjguLjliODFmMjMgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogIyBNYWtlZmlsZSBmb3IgemxpYgotIyBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNiBKZWFuLWxvdXAgR2FpbGx5LgorIyBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMCBKZWFuLWxvdXAgR2FpbGx5LgogIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCiAKICMgVG8gY29tcGlsZSBhbmQgdGVzdCwgdHlwZToKQEAgLTMyLDcgKzMyLDcgQEAKIAogU1RBVElDTElCPWxpYnouYQogU0hBUkVETElCPWxpYnouc28KLVNIQVJFRExJQlY9bGliei5zby4xLjIuMy41CitTSEFSRURMSUJWPWxpYnouc28uMS4yLjMuNgogU0hBUkVETElCTT1saWJ6LnNvLjEKIExJQlM9JChTVEFUSUNMSUIpICQoU0hBUkVETElCKSAkKFNIQVJFRExJQlYpCiAKQEAgLTEyNCwxMCArMTI0LDEwIEBACiAJcm0gLWYgX21hdGNoLnMKIAogZXhhbXBsZTY0Lm86IGV4YW1wbGUuYyB6bGliLmggemNvbmYuaCB6bGliZGVmcy5oCi0JJChDQykgJChDRkxBR1MpIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgLWMgLW8gJEAgJDwKKwkkKENDKSAkKENGTEFHUykgLURfRklMRV9PRkZTRVRfQklUUz02NCAtYyAtbyAkQCBleGFtcGxlLmMKIAogbWluaWd6aXA2NC5vOiBtaW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oIHpsaWJkZWZzLmgKLQkkKENDKSAkKENGTEFHUykgLURfRklMRV9PRkZTRVRfQklUUz02NCAtYyAtbyAkQCAkPAorCSQoQ0MpICQoQ0ZMQUdTKSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IC1jIC1vICRAIG1pbmlnemlwLmMKIAogLlNVRkZJWEVTOiAubG8KIApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgppbmRleCAwOTQxMjI4Li45YjgxZjIzIDEwMDY0NAotLS0gYS9NYWtlZmlsZS5pbgorKysgYi9NYWtlZmlsZS5pbgpAQCAtMSw1ICsxLDUgQEAKICMgTWFrZWZpbGUgZm9yIHpsaWIKLSMgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDYgSmVhbi1sb3VwIEdhaWxseS4KKyMgQ29weXJpZ2h0IChDKSAxOTk1LTIwMTAgSmVhbi1sb3VwIEdhaWxseS4KICMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogCiAjIFRvIGNvbXBpbGUgYW5kIHRlc3QsIHR5cGU6CkBAIC0zMiw3ICszMiw3IEBACiAKIFNUQVRJQ0xJQj1saWJ6LmEKIFNIQVJFRExJQj1saWJ6LnNvCi1TSEFSRURMSUJWPWxpYnouc28uMS4yLjMuNQorU0hBUkVETElCVj1saWJ6LnNvLjEuMi4zLjYKIFNIQVJFRExJQk09bGliei5zby4xCiBMSUJTPSQoU1RBVElDTElCKSAkKFNIQVJFRExJQikgJChTSEFSRURMSUJWKQogCkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogCXJtIC1mIF9tYXRjaC5zCiAKIGV4YW1wbGU2NC5vOiBleGFtcGxlLmMgemxpYi5oIHpjb25mLmggemxpYmRlZnMuaAotCSQoQ0MpICQoQ0ZMQUdTKSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IC1jIC1vICRAICQ8CisJJChDQykgJChDRkxBR1MpIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgLWMgLW8gJEAgZXhhbXBsZS5jCiAKIG1pbmlnemlwNjQubzogbWluaWd6aXAuYyB6bGliLmggemNvbmYuaCB6bGliZGVmcy5oCi0JJChDQykgJChDRkxBR1MpIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgLWMgLW8gJEAgJDwKKwkkKENDKSAkKENGTEFHUykgLURfRklMRV9PRkZTRVRfQklUUz02NCAtYyAtbyAkQCBtaW5pZ3ppcC5jCiAKIC5TVUZGSVhFUzogLmxvCiAKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQppbmRleCBlM2EyMTcwLi43NDFlMDAwIDEwMDY0NAotLS0gYS9SRUFETUUKKysrIGIvUkVBRE1FCkBAIC0xLDYgKzEsNiBAQAogWkxJQiBEQVRBIENPTVBSRVNTSU9OIExJQlJBUlkKIAotemxpYiAxLjIuMy41IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4gIEFsbCB0aGUgY29kZSBpcworemxpYiAxLjIuMy42IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4gIEFsbCB0aGUgY29kZSBpcwogdGhyZWFkIHNhZmUuICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzCiAoUmVxdWVzdCBmb3IgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXMKIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTAudHh0ICh6bGliIGZvcm1hdCksIHJmYzE5NTEudHh0IChkZWZsYXRlIGZvcm1hdCkKQEAgLTMzLDcgKzMzLDcgQEAKIGlzc3VlIG9mICBEci4gRG9iYidzIEpvdXJuYWw7IGEgY29weSBvZiB0aGUgYXJ0aWNsZSBpcyBhdmFpbGFibGUgaW4KIGh0dHA6Ly9kb2dtYS5uZXQvbWFya24vYXJ0aWNsZXMvemxpYnRvb2wvemxpYnRvb2wuaHRtCiAKLVRoZSBjaGFuZ2VzIG1hZGUgaW4gdmVyc2lvbiAxLjIuMy41IGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlIENoYW5nZUxvZy4KK1RoZSBjaGFuZ2VzIG1hZGUgaW4gdmVyc2lvbiAxLjIuMy42IGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlIENoYW5nZUxvZy4KIAogVW5zdXBwb3J0ZWQgdGhpcmQgcGFydHkgY29udHJpYnV0aW9ucyBhcmUgcHJvdmlkZWQgaW4gZGlyZWN0b3J5ICJjb250cmliIi4KIApkaWZmIC0tZ2l0IGEvYXM0MDAvemxpYi5pbmMgYi9hczQwMC96bGliLmluYwppbmRleCAzOGM0N2FjLi43ZWNlYTk4IDEwMDY0NAotLS0gYS9hczQwMC96bGliLmluYworKysgYi9hczQwMC96bGliLmluYwpAQCAtMSw3ICsxLDcgQEAKICAgICAgICogIFpMSUIuSU5DIC0gSW50ZXJmYWNlIHRvIHRoZSBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeQogICAgICAgKgogICAgICAgKiAgSUxFIFJQRzQwMCB2ZXJzaW9uIGJ5IFBhdHJpY2sgTW9ubmVyYXQsIERBVEFTUEhFUkUuCi0gICAgICAqICBWZXJzaW9uIDEuMi4zLjUKKyAgICAgICogIFZlcnNpb24gMS4yLjMuNgogICAgICAgKgogICAgICAgKgogICAgICAgKiAgV0FSTklORzoKQEAgLTIyLDggKzIyLDggQEAKICAgICAgICoKICAgICAgICogIFZlcnNpb25pbmcgaW5mb3JtYXRpb24uCiAgICAgICAqCi0gICAgIEQgWkxJQl9WRVJTSU9OICAgIEMgICAgICAgICAgICAgICAgICAgJzEuMi4zLjUnCi0gICAgIEQgWkxJQl9WRVJOVU0gICAgIEMgICAgICAgICAgICAgICAgICAgWCcxMjM1JworICAgICBEIFpMSUJfVkVSU0lPTiAgICBDICAgICAgICAgICAgICAgICAgICcxLjIuMy42JworICAgICBEIFpMSUJfVkVSTlVNICAgICBDICAgICAgICAgICAgICAgICAgIFgnMTIzNicKICAgICAgICoKICAgICAgICogIE90aGVyIGVxdWF0ZXMuCiAgICAgICAqCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggYjg3ZGRkYy4uMjYxZWZhOSAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtNzgsNiArNzgsOSBAQAogICBDQz0iJGNjIgogICBTRkxBR1M9IiR7Q0ZMQUdTLSItTzMifSAtZlBJQyIKICAgQ0ZMQUdTPSIke0NGTEFHUy0iLU8zIn0iCisgIGlmIHRlc3QgIiR7WkxJQkdDQ1dBUk59IiA9ICJZRVMiOyB0aGVuCisgICAgQ0ZMQUdTPSIke0NGTEFHU30gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMiCisgIGZpCiAgIGlmIHRlc3QgLXogIiR1bmFtZSI7IHRoZW4KICAgICB1bmFtZT1gKHVuYW1lIC1zIHx8IGVjaG8gdW5rbm93bikgMj4vZGV2L251bGxgCiAgIGZpCkBAIC0xNTQsOCArMTU3LDggQEAKICAgU3VuT1NcIDQqKSBTRkxBR1M9JHtDRkxBR1MtIi1PMiAtUElDIn0KICAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PMiJ9CiAgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0ibGQifSA7OwotICBTdW5TdHVkaW9cIDkqKSBTRkxBR1M9JHtDRkxBR1MtIi1EVVNFX01NQVAgLWZhc3QgLXhjb2RlPXBpYzMyIC14dGFyZ2V0PXVsdHJhMyAteGFyY2g9djliIn0KLSAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1EVVNFX01NQVAgLWZhc3QgLXh0YXJnZXQ9dWx0cmEzIC14YXJjaD12OWIifQorICBTdW5TdHVkaW9cIDkqKSBTRkxBR1M9JHtDRkxBR1MtIi1mYXN0IC14Y29kZT1waWMzMiAteHRhcmdldD11bHRyYTMgLXhhcmNoPXY5YiJ9CisgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItZmFzdCAteHRhcmdldD11bHRyYTMgLXhhcmNoPXY5YiJ9CiAgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXhhcmNoPXY5YiJ9IDs7CiAgIFVOSVhfU3lzdGVtX1ZcIDQuMi4wKQogICAgICAgICAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLUtQSUMgLU8ifQpAQCAtMTczLDcgKzE3Niw3IEBACiAgICAgICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItTyAtcW1heG1lbT04MTkyIn0KICAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIC1xbWF4bWVtPTgxOTIifQogICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtInhsYyAtRyJ9IDs7Ci0gICMgc2VuZCB3b3JraW5nIG9wdGlvbnMgZm9yIG90aGVyIHN5c3RlbXMgdG8gc3VwcG9ydEBnemlwLm9yZworICAjIHNlbmQgd29ya2luZyBvcHRpb25zIGZvciBvdGhlciBzeXN0ZW1zIHRvIHpsaWJAZ3ppcC5vcmcKICAgKikgICAgICAgICBTRkxBR1M9JHtDRkxBR1MtIi1PIn0KICAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KICAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtc2hhcmVkIn0gOzsKQEAgLTQ4OCwyMiArNDkxLDYgQEAKICAgU0ZMQUdTPSIkU0ZMQUdTIC1ETk9fRVJSTk9fSCIKIGZpCiAKLWNhdCA+ICR0ZXN0LmMgPDxFT0YKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci1jYWRkcl90IGhlbGxvKCkgewotICByZXR1cm4gbW1hcCgoY2FkZHJfdCkwLCAob2ZmX3QpMCwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCAwLCAob2ZmX3QpMCk7Ci19Ci1FT0YKLWlmIHRlc3QgImAoJENDIC1jICRDRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiI7IHRoZW4KLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1EVVNFX01NQVAiCi0gIFNGTEFHUz0iJFNGTEFHUyAtRFVTRV9NTUFQIgotICBlY2hvIENoZWNraW5nIGZvciBtbWFwIHN1cHBvcnQuLi4gWWVzLgotZWxzZQotICBlY2hvIENoZWNraW5nIGZvciBtbWFwIHN1cHBvcnQuLi4gTm8uCi1maQotCiBDUFA9JHtDUFAtIiRDQyAtRSJ9CiBjYXNlICRDRkxBR1MgaW4KICAgKkFTTVYqKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9pbmZiYWNrOS9pbmZ0cmVlOS5jIGIvY29udHJpYi9pbmZiYWNrOS9pbmZ0cmVlOS5jCmluZGV4IDliMGY0NmMuLjJkNDJmNzIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvaW5mYmFjazkvaW5mdHJlZTkuYworKysgYi9jb250cmliL2luZmJhY2s5L2luZnRyZWU5LmMKQEAgLTEsNSArMSw1IEBACiAvKiBpbmZ0cmVlOS5jIC0tIGdlbmVyYXRlIEh1ZmZtYW4gdHJlZXMgZm9yIGVmZmljaWVudCBkZWNvZGluZwotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDggTWFyayBBZGxlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTAgTWFyayBBZGxlcgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKQEAgLTksNyArOSw3IEBACiAjZGVmaW5lIE1BWEJJVFMgMTUKIAogY29uc3QgY2hhciBpbmZsYXRlOV9jb3B5cmlnaHRbXSA9Ci0gICAiIGluZmxhdGU5IDEuMi4zLjUgQ29weXJpZ2h0IDE5OTUtMjAwOSBNYXJrIEFkbGVyICI7CisgICAiIGluZmxhdGU5IDEuMi4zLjYgQ29weXJpZ2h0IDE5OTUtMjAxMCBNYXJrIEFkbGVyICI7CiAvKgogICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCiAgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKQEAgLTY0LDcgKzY0LDcgQEAKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbGV4dFszMV0gPSB7IC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqLwogICAgICAgICAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI5LCAxMjksIDEyOSwgMTI5LAogICAgICAgICAxMzAsIDEzMCwgMTMwLCAxMzAsIDEzMSwgMTMxLCAxMzEsIDEzMSwgMTMyLCAxMzIsIDEzMiwgMTMyLAotICAgICAgICAxMzMsIDEzMywgMTMzLCAxMzMsIDE0NCwgNjksIDE5OX07CisgICAgICAgIDEzMywgMTMzLCAxMzMsIDEzMywgMTQ0LCAxOTksIDcwfTsKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGJhc2VbMzJdID0geyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4zMSBiYXNlICovCiAgICAgICAgIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwKICAgICAgICAgNjUsIDk3LCAxMjksIDE5MywgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLApkaWZmIC0tZ2l0IGEvY29udHJpYi9taW5pemlwL21ha2Vfdm1zLmNvbSBiL2NvbnRyaWIvbWluaXppcC9tYWtlX3Ztcy5jb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4ZWUyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbWluaXppcC9tYWtlX3Ztcy5jb20KQEAgLTAsMCArMSwyNSBAQAorJCBpZiBmJHNlYXJjaCgiaW9hcGkuaF9vcmlnIikgLmVxcy4gIiIgdGhlbiBjb3B5IGlvYXBpLmggaW9hcGkuaF9vcmlnCiskIG9wZW4vd3JpdGUgemRlZiB2bXNkZWZzLmgKKyQgY29weSBzeXMkaW5wdXQ6IHpkZWYKKyQgZGVjaworI2RlZmluZSB1bml4CisjZGVmaW5lIGZpbGxfemxpYl9maWxlZnVuYzY0XzMyX2RlZl9mcm9tX2ZpbGVmdW5jMzIgZmlsbHpmZnVuYzY0ZnJvbQorI2RlZmluZSBXcml0ZV9aaXA2NEVuZE9mQ2VudHJhbERpcmVjdG9yeUxvY2F0b3IgV3JpdGVfWmlwNjRFb0RMb2NhdG9yCisjZGVmaW5lIFdyaXRlX1ppcDY0RW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkIFdyaXRlX1ppcDY0RW9EUmVjb3JkCisjZGVmaW5lIFdyaXRlX0VuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZCBXcml0ZV9Fb0RSZWNvcmQKKyQgZW9kCiskIGNsb3NlIHpkZWYKKyQgY29weSB2bXNkZWZzLmgsaW9hcGkuaF9vcmlnIGlvYXBpLmgKKyQgY2MvaW5jbHVkZT1bLS1dL3ByZWZpeD1hbGwgaW9hcGkuYworJCBjYy9pbmNsdWRlPVstLV0vcHJlZml4PWFsbCBtaW5pdW56LmMKKyQgY2MvaW5jbHVkZT1bLS1dL3ByZWZpeD1hbGwgdW56aXAuYyAKKyQgY2MvaW5jbHVkZT1bLS1dL3ByZWZpeD1hbGwgbWluaXppcC5jCiskIGNjL2luY2x1ZGU9Wy0tXS9wcmVmaXg9YWxsIHppcC5jCiskIGxpbmsgbWluaXVueix1bnppcCxpb2FwaSxbLS1dbGliei5vbGIvbGliCiskIGxpbmsgbWluaXppcCx6aXAsaW9hcGksWy0tXWxpYnoub2xiL2xpYgorJCBtY3IgW11taW5pemlwIHRlc3QgbWluaXppcDY0X2luZm8udHh0CiskIG1jciBbXW1pbml1bnogLWwgdGVzdC56aXAKKyQgcmVuYW1lIG1pbml6aXA2NF9pbmZvLnR4dDsgbWluaXppcDY0X2luZm8udHh0X29sZAorJCBtY3IgW11taW5pdW56IHRlc3QuemlwCiskIGRlbGV0ZSB0ZXN0LnppcDsqCiskZXhpdApkaWZmIC0tZ2l0IGEvY29udHJpYi92c3R1ZGlvL3ZjNy96bGliLnJjIGIvY29udHJpYi92c3R1ZGlvL3ZjNy96bGliLnJjCmluZGV4IDdiYjRiYjcuLjQxOGViN2EgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdnN0dWRpby92YzcvemxpYi5yYworKysgYi9jb250cmliL3ZzdHVkaW8vdmM3L3psaWIucmMKQEAgLTIsOCArMiw4IEBACiANCiAjZGVmaW5lIElEUl9WRVJTSU9OMSAgMQ0KIElEUl9WRVJTSU9OMQlWRVJTSU9OSU5GTwlNT1ZFQUJMRSBJTVBVUkUgTE9BRE9OQ0FMTCBESVNDQVJEQUJMRQ0KLSAgRklMRVZFUlNJT04JIDEsMiwzLDUNCi0gIFBST0RVQ1RWRVJTSU9OIDEsMiwzLDUNCisgIEZJTEVWRVJTSU9OCSAxLDIsMyw2DQorICBQUk9EVUNUVkVSU0lPTiAxLDIsMyw2DQogICBGSUxFRkxBR1NNQVNLCVZTX0ZGSV9GSUxFRkxBR1NNQVNLDQogICBGSUxFRkxBR1MJMA0KICAgRklMRU9TCVZPU19ET1NfV0lORE9XUzMyDQpAQCAtMTcsMTIgKzE3LDEyIEBACiANCiAgICAgQkVHSU4NCiAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgInpsaWIgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5XDAiDQotICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwJIjEuMi4zLjVcMCINCisgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLAkiMS4yLjMuNlwwIg0KICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLAkiemxpYlwwIg0KICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwJInpsaWIuZGxsXDAiDQogICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwJIlpMaWIuRExMXDAiDQogICAgICAgVkFMVUUgIkNvbW1lbnRzIiwiRExMIHN1cHBvcnQgYnkgQWxlc3NhbmRybyBJYWNvcGV0dGkgJiBHaWxsZXMgVm9sbGFudFwwIg0KLSAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICIoQykgMTk5NS0yMDA2IEplYW4tbG91cCBHYWlsbHkgJiBNYXJrIEFkbGVyXDAiDQorICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIihDKSAxOTk1LTIwMTAgSmVhbi1sb3VwIEdhaWxseSAmIE1hcmsgQWRsZXJcMCINCiAgICAgRU5EDQogICBFTkQNCiAgIEJMT0NLICJWYXJGaWxlSW5mbyINCmRpZmYgLS1naXQgYS9kZWZsYXRlLmMgYi9kZWZsYXRlLmMKaW5kZXggZDM0ZTFhZC4uYzAxMGE4OSAxMDA2NDQKLS0tIGEvZGVmbGF0ZS5jCisrKyBiL2RlZmxhdGUuYwpAQCAtNTIsNyArNTIsNyBAQAogI2luY2x1ZGUgImRlZmxhdGUuaCIKIAogY29uc3QgY2hhciBkZWZsYXRlX2NvcHlyaWdodFtdID0KLSAgICIgZGVmbGF0ZSAxLjIuMy41IENvcHlyaWdodCAxOTk1LTIwMTAgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlciAiOworICAgIiBkZWZsYXRlIDEuMi4zLjYgQ29weXJpZ2h0IDE5OTUtMjAxMCBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyICI7CiAvKgogICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCiAgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL1JFQURNRS5leGFtcGxlcyBiL2V4YW1wbGVzL1JFQURNRS5leGFtcGxlcwppbmRleCAxNDY5MTljLi41NmEzMTcxIDEwMDY0NAotLS0gYS9leGFtcGxlcy9SRUFETUUuZXhhbXBsZXMKKysrIGIvZXhhbXBsZXMvUkVBRE1FLmV4YW1wbGVzCkBAIC0zNCwxMiArMzQsNiBAQAogICAgICAgYW5kIGRlZmxhdGVTZXREaWN0aW9uYXJ5KCkKICAgICAtIGlsbHVzdHJhdGVzIHVzZSBvZiBhIGd6aXAgaGVhZGVyIGV4dHJhIGZpZWxkCiAKLXBpZ3ouYwotICAgIHBhcmFsbGVsIGltcGxlbWVudGF0aW9uIG9mIGd6aXAgY29tcHJlc3Npb24KLSAgICAtIHVzZXMgcHRocmVhZHMgdG8gc3BlZWQgdXAgY29tcHJlc3Npb24gb24gbXVsdGlwbGUgY29yZSBtYWNoaW5lcwotICAgIC0gaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiBkZWZsYXRlU2V0RGljdGlvbmFyeSgpIHdpdGggcmF3IGRlZmxhdGUKLSAgICAtIGlsbHVzdHJhdGVzIHRoZSB1c2Ugb2YgY3JjMzJfY29tYmluZSgpCi0KIHpsaWJfaG93Lmh0bWwKICAgICBwYWluZnVsbHkgY29tcHJlaGVuc2l2ZSBkZXNjcmlwdGlvbiBvZiB6cGlwZS5jIChzZWUgYmVsb3cpCiAgICAgLSBkZXNjcmliZXMgaW4gZXhjcnVjaWF0aW5nIGRldGFpbCB0aGUgdXNlIG9mIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpCmRpZmYgLS1naXQgYS9leGFtcGxlcy9ndW4uYyBiL2V4YW1wbGVzL2d1bi5jCmluZGV4IGJmZWM1OTAuLjcyYjA4ODIgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL2d1bi5jCisrKyBiL2V4YW1wbGVzL2d1bi5jCkBAIC0xLDcgKzEsNyBAQAogLyogZ3VuLmMgLS0gc2ltcGxlIGd1bnppcCB0byBnaXZlIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBpbmZsYXRlQmFjaygpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgTWFyayBBZGxlcgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1LCAyMDA4LCAyMDEwIE1hcmsgQWRsZXIKICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAgIFZlcnNpb24gMS4zICAxMiBKdW5lIDIwMDUgIE1hcmsgQWRsZXIgKi8KKyAgIFZlcnNpb24gMS42ICAxNyBKYW51YXJ5IDIwMTAgIE1hcmsgQWRsZXIgKi8KIAogLyogVmVyc2lvbiBoaXN0b3J5OgogICAgMS4wICAxNiBGZWIgMjAwMyAgRmlyc3QgdmVyc2lvbiBmb3IgdGVzdGluZyBvZiBpbmZsYXRlQmFjaygpCkBAIC0xNSw2ICsxNSw5IEBACiAgICAxLjIgIDIwIE1hciAyMDA1ICBBZGQgVW5peCBjb21wcmVzcyAoTFpXKSBkZWNvbXByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICBDb3B5IGZpbGUgYXR0cmlidXRlcyBmcm9tIGlucHV0IGZpbGUgdG8gb3V0cHV0IGZpbGUKICAgIDEuMyAgMTIgSnVuIDIwMDUgIEFkZCBjYXN0cyBmb3IgZXJyb3IgbWVzc2FnZXMgW09iZXJodW1lcl0KKyAgIDEuNCAgIDggRGVjIDIwMDYgIExaVyBkZWNvbXByZXNzaW9uIHNwZWVkIGltcHJvdmVtZW50cworICAgMS41ICAgOSBGZWIgMjAwOCAgQXZvaWQgd2FybmluZyBpbiBsYXRlc3QgdmVyc2lvbiBvZiBnY2MKKyAgIDEuNiAgMTcgSmFuIDIwMTAgIEF2b2lkIHNpZ25lZC91bnNpZ25lZCBjb21wYXJpc29uIHdhcm5pbmdzCiAgKi8KIAogLyoKQEAgLTE5NywxNCArMjAwLDE0IEBACiAgICAgICAgICAgICAgICAgICBpbnQgb3V0ZmlsZSwgel9zdHJlYW0gKnN0cm0pCiB7CiAgICAgaW50IGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIGxhc3QgYnl0ZSByZWFkIGJ5IE5FWFQoKSwgb3IgLTEgaWYgRU9GICovCi0gICAgaW50IGNodW5rOyAgICAgICAgICAgICAgICAgIC8qIGJ5dGVzIGxlZnQgaW4gY3VycmVudCBjaHVuayAqLworICAgIHVuc2lnbmVkIGNodW5rOyAgICAgICAgICAgICAvKiBieXRlcyBsZWZ0IGluIGN1cnJlbnQgY2h1bmsgKi8KICAgICBpbnQgbGVmdDsgICAgICAgICAgICAgICAgICAgLyogYml0cyBsZWZ0IGluIHJlbSAqLwogICAgIHVuc2lnbmVkIHJlbTsgICAgICAgICAgICAgICAvKiB1bnVzZWQgYml0cyBmcm9tIGlucHV0ICovCiAgICAgaW50IGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0cyBwZXIgY29kZSAqLwogICAgIHVuc2lnbmVkIGNvZGU7ICAgICAgICAgICAgICAvKiBjb2RlLCB0YWJsZSB0cmF2ZXJzYWwgaW5kZXggKi8KICAgICB1bnNpZ25lZCBtYXNrOyAgICAgICAgICAgICAgLyogbWFzayBmb3IgY3VycmVudCBiaXRzIGNvZGVzICovCiAgICAgaW50IG1heDsgICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gYml0cyBwZXIgY29kZSBmb3IgdGhpcyBzdHJlYW0gKi8KLSAgICBpbnQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyogY29tcHJlc3MgZmxhZ3MsIHRoZW4gYmxvY2sgY29tcHJlc3MgZmxhZyAqLworICAgIHVuc2lnbmVkIGZsYWdzOyAgICAgICAgICAgICAvKiBjb21wcmVzcyBmbGFncywgdGhlbiBibG9jayBjb21wcmVzcyBmbGFnICovCiAgICAgdW5zaWduZWQgZW5kOyAgICAgICAgICAgICAgIC8qIGxhc3QgdmFsaWQgZW50cnkgaW4gcHJlZml4L3N1ZmZpeCB0YWJsZXMgKi8KICAgICB1bnNpZ25lZCB0ZW1wOyAgICAgICAgICAgICAgLyogY3VycmVudCBjb2RlICovCiAgICAgdW5zaWduZWQgcHJldjsgICAgICAgICAgICAgIC8qIHByZXZpb3VzIGNvZGUgKi8KQEAgLTIxMiw2ICsyMTUsNyBAQAogICAgIHVuc2lnbmVkIHN0YWNrOyAgICAgICAgICAgICAvKiBuZXh0IHBvc2l0aW9uIGZvciByZXZlcnNlZCBzdHJpbmcgKi8KICAgICB1bnNpZ25lZCBvdXRjbnQ7ICAgICAgICAgICAgLyogYnl0ZXMgaW4gb3V0cHV0IGJ1ZmZlciAqLwogICAgIHN0cnVjdCBvdXRkIG91dGQ7ICAgICAgICAgICAvKiBvdXRwdXQgc3RydWN0dXJlICovCisgICAgdW5zaWduZWQgY2hhciAqcDsKIAogICAgIC8qIHNldCB1cCBvdXRwdXQgKi8KICAgICBvdXRkLm91dGZpbGUgPSBvdXRmaWxlOwpAQCAtMzIyLDEwICszMjYsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qIHdhbGsgdGhyb3VnaCBsaW5rZWQgbGlzdCB0byBnZW5lcmF0ZSBvdXRwdXQgaW4gcmV2ZXJzZSBvcmRlciAqLworICAgICAgICBwID0gbWF0Y2ggKyBzdGFjazsKICAgICAgICAgd2hpbGUgKGNvZGUgPj0gMjU2KSB7Ci0gICAgICAgICAgICBtYXRjaFtzdGFjaysrXSA9IHN1ZmZpeFtjb2RlXTsKKyAgICAgICAgICAgICpwKysgPSBzdWZmaXhbY29kZV07CiAgICAgICAgICAgICBjb2RlID0gcHJlZml4W2NvZGVdOwogICAgICAgICB9CisgICAgICAgIHN0YWNrID0gcCAtIG1hdGNoOwogICAgICAgICBtYXRjaFtzdGFjaysrXSA9ICh1bnNpZ25lZCBjaGFyKWNvZGU7CiAgICAgICAgIGZpbmFsID0gY29kZTsKIApAQCAtMzQ5LDkgKzM1NSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgb3V0Y250ID0gMDsKICAgICAgICAgfQorICAgICAgICBwID0gbWF0Y2ggKyBzdGFjazsKICAgICAgICAgZG8gewotICAgICAgICAgICAgb3V0YnVmW291dGNudCsrXSA9IG1hdGNoWy0tc3RhY2tdOwotICAgICAgICB9IHdoaWxlIChzdGFjayk7CisgICAgICAgICAgICBvdXRidWZbb3V0Y250KytdID0gKi0tcDsKKyAgICAgICAgfSB3aGlsZSAocCA+IG1hdGNoKTsKKyAgICAgICAgc3RhY2sgPSAwOwogCiAgICAgICAgIC8qIGxvb3AgZm9yIG5leHQgY29kZSB3aXRoIGZpbmFsIGFuZCBwcmV2IGFzIHRoZSBsYXN0IG1hdGNoLCByZW0gYW5kCiAgICAgICAgICAgIGxlZnQgcHJvdmlkZSB0aGUgZmlyc3QgMC4uNyBiaXRzIG9mIHRoZSBuZXh0IGNvZGUsIGVuZCBpcyB0aGUgbGFzdApAQCAtMzc1LDcgKzM4Myw3IEBACiB7CiAgICAgaW50IHJldCwgZmlyc3QsIGxhc3Q7CiAgICAgdW5zaWduZWQgaGF2ZSwgZmxhZ3MsIGxlbjsKLSAgICB1bnNpZ25lZCBjaGFyICpuZXh0OworICAgIHVuc2lnbmVkIGNoYXIgKm5leHQgPSBOVUxMOwogICAgIHN0cnVjdCBpbmQgaW5kLCAqaW5kcDsKICAgICBzdHJ1Y3Qgb3V0ZCBvdXRkOwogCkBAIC00NzEsMTAgKzQ3OSwxMCBAQAogCiAgICAgICAgIC8qIGNoZWNrIHRyYWlsZXIgKi8KICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7Ci0gICAgICAgIGlmIChORVhUKCkgIT0gKG91dGQuY3JjICYgMHhmZikgfHwKLSAgICAgICAgICAgIE5FWFQoKSAhPSAoKG91dGQuY3JjID4+IDgpICYgMHhmZikgfHwKLSAgICAgICAgICAgIE5FWFQoKSAhPSAoKG91dGQuY3JjID4+IDE2KSAmIDB4ZmYpIHx8Ci0gICAgICAgICAgICBORVhUKCkgIT0gKChvdXRkLmNyYyA+PiAyNCkgJiAweGZmKSkgeworICAgICAgICBpZiAoTkVYVCgpICE9IChpbnQpKG91dGQuY3JjICYgMHhmZikgfHwKKyAgICAgICAgICAgIE5FWFQoKSAhPSAoaW50KSgob3V0ZC5jcmMgPj4gOCkgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9IChpbnQpKChvdXRkLmNyYyA+PiAxNikgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9IChpbnQpKChvdXRkLmNyYyA+PiAyNCkgJiAweGZmKSkgewogICAgICAgICAgICAgLyogY3JjIGVycm9yICovCiAgICAgICAgICAgICBpZiAobGFzdCAhPSAtMSkgewogICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBkYXRhIGNoZWNrIjsKQEAgLTQ4MiwxMCArNDkwLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoTkVYVCgpICE9IChvdXRkLnRvdGFsICYgMHhmZikgfHwKLSAgICAgICAgICAgIE5FWFQoKSAhPSAoKG91dGQudG90YWwgPj4gOCkgJiAweGZmKSB8fAotICAgICAgICAgICAgTkVYVCgpICE9ICgob3V0ZC50b3RhbCA+PiAxNikgJiAweGZmKSB8fAotICAgICAgICAgICAgTkVYVCgpICE9ICgob3V0ZC50b3RhbCA+PiAyNCkgJiAweGZmKSkgeworICAgICAgICBpZiAoTkVYVCgpICE9IChpbnQpKG91dGQudG90YWwgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9IChpbnQpKChvdXRkLnRvdGFsID4+IDgpICYgMHhmZikgfHwKKyAgICAgICAgICAgIE5FWFQoKSAhPSAoaW50KSgob3V0ZC50b3RhbCA+PiAxNikgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9IChpbnQpKChvdXRkLnRvdGFsID4+IDI0KSAmIDB4ZmYpKSB7CiAgICAgICAgICAgICAvKiBsZW5ndGggZXJyb3IgKi8KICAgICAgICAgICAgIGlmIChsYXN0ICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW5jb3JyZWN0IGxlbmd0aCBjaGVjayI7CkBAIC02NDIsOCArNjUwLDggQEAKICAgICBhcmd2Kys7CiAgICAgdGVzdCA9IDA7CiAgICAgaWYgKGFyZ2MgJiYgc3RyY21wKCphcmd2LCAiLWgiKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIDEuMyAoMTIgSnVuIDIwMDUpXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3B5cmlnaHQgKGMpIDIwMDUgTWFyayBBZGxlclxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIDEuNiAoMTcgSmFuIDIwMTApXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBNYXJrIEFkbGVyXG4iKTsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogZ3VuIFstdF0gW2ZpbGUxLmd6IFtmaWxlMi5aIC4uLl1dXG4iKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcGlnei5jIGIvZXhhbXBsZXMvcGlnei5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc5NGQwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL3BpZ3ouYworKysgL2Rldi9udWxsCkBAIC0xLDQ1MiArMCwwIEBACi0vKiBwaWd6LmMgLS0gcGFyYWxsZWwgaW1wbGVtZW50YXRpb24gb2YgZ3ppcAotICogQ29weXJpZ2h0IChDKSAyMDA3IE1hcmsgQWRsZXIKLSAqIFZlcnNpb24gMS4xICAyOCBKYW51YXJ5IDIwMDcgIE1hcmsgQWRsZXIKLSAqLwotCi0vKiBWZXJzaW9uIGhpc3Rvcnk6Ci0gICAxLjAgIDE3IEphbiAyMDA3ICBGaXJzdCB2ZXJzaW9uCi0gICAxLjEgIDI4IEphbiAyMDA3ICBBdm9pZCB2b2lkICogYXJpdGhtZXRpYyAoc29tZSBjb21waWxlcnMgZG9uJ3QgZ2V0IHRoYXQpCi0gICAgICAgICAgICAgICAgICAgICBBZGQgbm90ZSBhYm91dCByZXF1aXJpbmcgemxpYiAxLjIuMwotICAgICAgICAgICAgICAgICAgICAgQWxsb3cgY29tcHJlc3Npb24gbGV2ZWwgMCAobm8gY29tcHJlc3Npb24pCi0gICAgICAgICAgICAgICAgICAgICBDb21wbGV0ZWx5IHJld3JpdGUgcGFyYWxsZWxpc20gLS0gYWRkIGEgd3JpdGUgdGhyZWFkCi0gICAgICAgICAgICAgICAgICAgICBVc2UgZGVmbGF0ZVNldERpY3Rpb25hcnkoKSB0byBtYWtlIHVzZSBvZiBoaXN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICBUdW5lIGFyZ3VtZW50IGRlZmF1bHRzIHRvIGJlc3QgcGVyZm9ybWFuY2Ugb24gZm91ciBjb3JlcwotICovCi0KLS8qCi0gICBwaWd6IGNvbXByZXNzZXMgZnJvbSBzdGRpbiB0byBzdGRvdXQgdXNpbmcgdGhyZWFkcyB0byBtYWtlIHVzZSBvZiBtdWx0aXBsZQotICAgcHJvY2Vzc29ycyBhbmQgY29yZXMuICBUaGUgaW5wdXQgaXMgYnJva2VuIHVwIGludG8gMTI4IEtCIGNodW5rcywgYW5kIGVhY2gKLSAgIGlzIGNvbXByZXNzZWQgc2VwYXJhdGVseS4gIFRoZSBDUkMgZm9yIGVhY2ggY2h1bmsgaXMgYWxzbyBjYWxjdWxhdGVkCi0gICBzZXBhcmF0ZWx5LiAgVGhlIGNvbXByZXNzZWQgY2h1bmtzIGFyZSB3cml0dGVuIGluIG9yZGVyIHRvIHRoZSBvdXRwdXQsCi0gICBhbmQgdGhlIG92ZXJhbGwgQ1JDIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgQ1JDJ3Mgb2YgdGhlIGNodW5rcy4KLQotICAgVGhlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgZ2VuZXJhdGVkIGlzIHRoZSBnemlwIGZvcm1hdCB1c2luZyB0aGUgZGVmbGF0ZQotICAgY29tcHJlc3Npb24gbWV0aG9kLiAgRmlyc3QgYSBnemlwIGhlYWRlciBpcyB3cml0dGVuLCBmb2xsb3dlZCBieSByYXcgZGVmbGF0ZQotICAgcGFydGlhbCBzdHJlYW1zLiAgVGhleSBhcmUgcGFydGlhbCwgaW4gdGhhdCB0aGV5IGRvIG5vdCBoYXZlIGEgdGVybWluYXRpbmcKLSAgIGJsb2NrLiAgQXQgdGhlIGVuZCwgdGhlIGRlZmxhdGUgc3RyZWFtIGlzIHRlcm1pbmF0ZWQgd2l0aCBhIGZpbmFsIGVtcHR5Ci0gICBzdGF0aWMgYmxvY2ssIGFuZCBsYXN0bHkgYSBnemlwIHRyYWlsZXIgaXMgd3JpdHRlbiB3aXRoIHRoZSBDUkMgYW5kIHRoZQotICAgbnVtYmVyIG9mIGlucHV0IGJ5dGVzLgotCi0gICBFYWNoIHJhdyBkZWZsYXRlIHBhcnRpYWwgc3RyZWFtIGlzIHRlcm1pbmF0ZWQgYnkgYW4gZW1wdHkgc3RvcmVkIGJsb2NrCi0gICAodXNpbmcgdGhlIFpfU1lOQ19GTFVTSCBvcHRpb24gb2YgemxpYiksIGluIG9yZGVyIHRvIGVuZCB0aGF0IHBhcnRpYWwKLSAgIGJpdCBzdHJlYW0gYXQgYSBieXRlIGJvdW5kYXJ5LiAgVGhhdCBhbGxvd3MgdGhlIHBhcnRpYWwgc3RyZWFtcyB0byBiZQotICAgY29uY2FudGVuYXRlZCBzaW1wbHkgYXMgc2VxdWVuY2VzIG9mIGJ5dGVzLiAgVGhpcyBhZGRzIGEgdmVyeSBzbWFsbCBmb3VyCi0gICBvciBmaXZlIGJ5dGUgb3ZlcmhlYWQgdG8gdGhlIG91dHB1dCBmb3IgZWFjaCBpbnB1dCBjaHVuay4KLQotICAgemxpYidzIGNyYzMyX2NvbWJpbmUoKSByb3V0aW5lIGFsbG93cyB0aGUgY2FsY3VhdGlvbiBvZiB0aGUgQ1JDIG9mIHRoZQotICAgZW50aXJlIGlucHV0IHVzaW5nIHRoZSBpbmRlcGVuZGVudCBDUkMncyBvZiB0aGUgY2h1bmtzLiAgcGlneiByZXF1aXJlcyB6bGliCi0gICB2ZXJzaW9uIDEuMi4zIG9yIGxhdGVyLCBzaW5jZSB0aGF0IGlzIHRoZSBmaXJzdCB2ZXJzaW9uIHRoYXQgcHJvdmlkZXMgdGhlCi0gICBjcmMzMl9jb21iaW5lKCkgZnVuY3Rpb24uCi0KLSAgIHBpZ3ogdXNlcyB0aGUgUE9TSVggcHRocmVhZCBsaWJyYXJ5IGZvciB0aHJlYWQgY29udHJvbCBhbmQgY29tbXVuaWNhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgInpsaWIuaCIKLQotI2RlZmluZSBsb2NhbCBzdGF0aWMKLQotLyogZXhpdCB3aXRoIGVycm9yICovCi1sb2NhbCB2b2lkIGJhaWwoY2hhciAqbXNnKQotewotICAgIGZwcmludGYoc3RkZXJyLCAicGlneiBhYm9ydDogJXNcbiIsIG1zZyk7Ci0gICAgZXhpdCgxKTsKLX0KLQotLyogcmVhZCB1cCB0byBsZW4gYnl0ZXMgaW50byBidWYsIHJlcGVhdGluZyByZWFkKCkgY2FsbHMgYXMgbmVlZGVkICovCi1sb2NhbCBzaXplX3QgcmVhZG4oaW50IGRlc2MsIHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgICBzc2l6ZV90IHJldDsKLSAgICBzaXplX3QgZ290OwotCi0gICAgZ290ID0gMDsKLSAgICB3aGlsZSAobGVuKSB7Ci0gICAgICAgIHJldCA9IHJlYWQoZGVzYywgYnVmLCBsZW4pOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIGJhaWwoInJlYWQgZXJyb3IiKTsKLSAgICAgICAgaWYgKHJldCA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGJ1ZiArPSByZXQ7Ci0gICAgICAgIGxlbiAtPSByZXQ7Ci0gICAgICAgIGdvdCArPSByZXQ7Ci0gICAgfQotICAgIHJldHVybiBnb3Q7Ci19Ci0KLS8qIHdyaXRlIGxlbiBieXRlcywgcmVwZWF0aW5nIHdyaXRlKCkgY2FsbHMgYXMgbmVlZGVkICovCi1sb2NhbCB2b2lkIHdyaXRlbihpbnQgZGVzYywgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICAgIHNzaXplX3QgcmV0OwotCi0gICAgd2hpbGUgKGxlbikgewotICAgICAgICByZXQgPSB3cml0ZShkZXNjLCBidWYsIGxlbik7Ci0gICAgICAgIGlmIChyZXQgPCAxKQotICAgICAgICAgICAgYmFpbCgid3JpdGUgZXJyb3IiKTsKLSAgICAgICAgYnVmICs9IHJldDsKLSAgICAgICAgbGVuIC09IHJldDsKLSAgICB9Ci19Ci0KLS8qIGEgZmxhZyB2YXJpYWJsZSBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHR3byB0aHJlYWRzICovCi1zdHJ1Y3QgZmxhZyB7Ci0gICAgaW50IHZhbHVlOyAgICAgICAgICAgICAgLyogdmFsdWUgb2YgZmxhZyAqLwotICAgIHB0aHJlYWRfbXV0ZXhfdCBsb2NrOyAgIC8qIGxvY2sgZm9yIGNoZWNraW5nIGFuZCBjaGFuZ2luZyBmbGFnICovCi0gICAgcHRocmVhZF9jb25kX3QgY29uZDsgICAgLyogY29uZGl0aW9uIGZvciBzaWduYWxpbmcgb24gZmxhZyBjaGFuZ2UgKi8KLX07Ci0KLS8qIGluaXRpYWxpemUgYSBmbGFnIGZvciB1c2UsIHN0YXJ0aW5nIHdpdGggdmFsdWUgdmFsICovCi1sb2NhbCB2b2lkIGZsYWdfaW5pdChzdHJ1Y3QgZmxhZyAqbWUsIGludCB2YWwpCi17Ci0gICAgbWUtPnZhbHVlID0gdmFsOwotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmKG1lLT5sb2NrKSwgTlVMTCk7Ci0gICAgcHRocmVhZF9jb25kX2luaXQoJihtZS0+Y29uZCksIE5VTEwpOwotfQotCi0vKiBzZXQgdGhlIGZsYWcgdG8gdmFsLCBzaWduYWwgYW5vdGhlciBwcm9jZXNzIHRoYXQgbWF5IGJlIHdhaXRpbmcgZm9yIGl0ICovCi1sb2NhbCB2b2lkIGZsYWdfc2V0KHN0cnVjdCBmbGFnICptZSwgaW50IHZhbCkKLXsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJihtZS0+bG9jaykpOwotICAgIG1lLT52YWx1ZSA9IHZhbDsKLSAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCYobWUtPmNvbmQpKTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmKG1lLT5sb2NrKSk7Ci19Ci0KLS8qIGlmIGl0IGlzbid0IGFscmVhZHksIHdhaXQgZm9yIHNvbWUgb3RoZXIgdGhyZWFkIHRvIHNldCB0aGUgZmxhZyB0byB2YWwgKi8KLWxvY2FsIHZvaWQgZmxhZ193YWl0KHN0cnVjdCBmbGFnICptZSwgaW50IHZhbCkKLXsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJihtZS0+bG9jaykpOwotICAgIHdoaWxlIChtZS0+dmFsdWUgIT0gdmFsKQotICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmKG1lLT5jb25kKSwgJihtZS0+bG9jaykpOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYobWUtPmxvY2spKTsKLX0KLQotLyogaWYgZmxhZyBpcyBlcXVhbCB0byB2YWwsIHdhaXQgZm9yIHNvbWUgb3RoZXIgdGhyZWFkIHRvIGNoYW5nZSBpdCAqLwotbG9jYWwgdm9pZCBmbGFnX3dhaXRfbm90KHN0cnVjdCBmbGFnICptZSwgaW50IHZhbCkKLXsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJihtZS0+bG9jaykpOwotICAgIHdoaWxlIChtZS0+dmFsdWUgPT0gdmFsKQotICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmKG1lLT5jb25kKSwgJihtZS0+bG9jaykpOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYobWUtPmxvY2spKTsKLX0KLQotLyogY2xlYW4gdXAgdGhlIGZsYWcgd2hlbiBkb25lIHdpdGggaXQgKi8KLWxvY2FsIHZvaWQgZmxhZ19kb25lKHN0cnVjdCBmbGFnICptZSkKLXsKLSAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmKG1lLT5jb25kKSk7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCYobWUtPmxvY2spKTsKLX0KLQotLyogYSB1bml0IG9mIHdvcmsgdG8gZmVlZCB0byBjb21wcmVzc190aHJlYWQoKSAtLSBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIG91dAotICAgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBtYXhpbXVtIHNpemUgbGVuIGJ5dGVzIGNvdWxkIGRlZmxhdGUgdG8sCi0gICBwbHVzIGZpdmUgYnl0ZXMgZm9yIHRoZSBmaW5hbCBzeW5jIG1hcmtlciAqLwotc3RydWN0IHdvcmsgewotICAgIHNpemVfdCBsZW47ICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgaW5wdXQgKi8KLSAgICB1bnNpZ25lZCBsb25nIGNyYzsgICAgICAgICAgLyogY3JjIG9mIGlucHV0ICovCi0gICAgdW5zaWduZWQgY2hhciAqYnVmOyAgICAgICAgIC8qIGlucHV0ICovCi0gICAgdW5zaWduZWQgY2hhciAqb3V0OyAgICAgICAgIC8qIHNwYWNlIGZvciBvdXRwdXQgKGd1YXJhbnRlZWQgYmlnIGVub3VnaCkgKi8KLSAgICB6X3N0cmVhbSBzdHJtOyAgICAgICAgICAgICAgLyogcHJlLWluaXRpYWxpemVkIHpfc3RyZWFtICovCi0gICAgc3RydWN0IGZsYWcgYnVzeTsgICAgICAgICAgIC8qIGJ1c3kgZmxhZyBpbmRpY2F0aW5nIHdvcmsgdW5pdCBpbiB1c2UgKi8KLSAgICBwdGhyZWFkX3QgY29tcDsgICAgICAgICAgICAgLyogdGhpcyBjb21wcmVzc2lvbiB0aHJlYWQgKi8KLX07Ci0KLS8qIGJ1c3kgZmxhZyB2YWx1ZXMgKi8KLSNkZWZpbmUgSURMRSAwICAgICAgICAgIC8qIGNvbXByZXNzIGFuZCB3cml0aW5nIGRvbmUgLS0gY2FuIHN0YXJ0IGNvbXByZXNzICovCi0jZGVmaW5lIENPTVAgMSAgICAgICAgICAvKiBjb21wcmVzcyAtLSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgaW4gdXNlICovCi0jZGVmaW5lIFdSSVRFIDIgICAgICAgICAvKiBjb21wcmVzcyBkb25lLCB3cml0aW5nIG91dHB1dCAtLSBjYW4gcmVhZCBpbnB1dCAqLwotCi0vKiByZWFkLW9ubHkgZ2xvYmFscyAoc2V0IGJ5IG1haW4vcmVhZCB0aHJlYWQgYmVmb3JlIG90aGVycyBzdGFydGVkKSAqLwotbG9jYWwgaW50IGluZDsgICAgICAgICAgICAgIC8qIGlucHV0IGZpbGUgZGVzY3JpcHRvciAqLwotbG9jYWwgaW50IG91dGQ7ICAgICAgICAgICAgIC8qIG91dHB1dCBmaWxlIGRlc2NyaXB0b3IgKi8KLWxvY2FsIGludCBsZXZlbDsgICAgICAgICAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAqLwotbG9jYWwgaW50IHByb2NzOyAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb21wcmVzc2lvbiB0aHJlYWRzICg+PSAyKSAqLwotbG9jYWwgc2l6ZV90IHNpemU7ICAgICAgICAgIC8qIHVuY29tcHJlc3NlZCBpbnB1dCBzaXplIHBlciB0aHJlYWQgKD49IDMySykgKi8KLWxvY2FsIHN0cnVjdCB3b3JrICpqb2JzOyAgICAvKiB3b3JrIHVuaXRzOiBqb2JzWzAuLnByb2NzLTFdICovCi0KLS8qIG5leHQgYW5kIHByZXZpb3VzIGpvYnNbXSBpbmRpY2VzICovCi0jZGVmaW5lIE5FWFQobikgKChuKSA9PSBwcm9jcyAtIDEgPyAwIDogKG4pICsgMSkKLSNkZWZpbmUgUFJFVihuKSAoKG4pID09IDAgPyBwcm9jcyAtIDEgOiAobikgLSAxKQotCi0vKiBzbGlkaW5nIGRpY3Rpb25hcnkgc2l6ZSBmb3IgZGVmbGF0ZSAqLwotI2RlZmluZSBESUNUIDMyNzY4VQotCi0vKiBsYXJnZXN0IHBvd2VyIG9mIDIgdGhhdCBmaXRzIGluIGFuIHVuc2lnbmVkIGludCAtLSB1c2VkIHRvIGxpbWl0IHJlcXVlc3RzCi0gICB0byB6bGliIGZ1bmN0aW9ucyB0aGF0IHVzZSB1bnNpZ25lZCBpbnQgbGVuZ3RocyAqLwotI2RlZmluZSBNQVggKCgoKHVuc2lnbmVkKS0xKSA+PiAxKSArIDEpCi0KLS8qIGNvbXByZXNzIHRocmVhZDogY29tcHJlc3MgdGhlIGlucHV0IGluIHRoZSBwcm92aWRlZCB3b3JrIHVuaXQgYW5kIGNvbXB1dGUKLSAgIGl0cyBjcmMgLS0gYXNzdW1lIHRoYXQgdGhlIGFtb3VudCBvZiBzcGFjZSBhdCBqb2ItPm91dCBpcyBndWFyYW50ZWVkIHRvIGJlCi0gICBlbm91Z2ggZm9yIHRoZSBjb21wcmVzc2VkIG91dHB1dCwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgbWF4aW11bSBleHBhbnNpb24KLSAgIG9mIGRlZmxhdGUgY29tcHJlc3Npb24gLS0gdXNlIHRoZSBpbnB1dCBpbiB0aGUgcHJldmlvdXMgd29yayB1bml0IChpZiB0aGVyZQotICAgaXMgb25lKSB0byBzZXQgdGhlIGRlZmxhdGUgZGljdGlvbmFyeSBmb3IgYmV0dGVyIGNvbXByZXNzaW9uICovCi1sb2NhbCB2b2lkICpjb21wcmVzc190aHJlYWQodm9pZCAqYXJnKQotewotICAgIHNpemVfdCBsZW47ICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgbGVuZ3RoIGZvciB0aGlzIHdvcmsgdW5pdCAqLwotICAgIHVuc2lnbmVkIGxvbmcgY3JjOyAgICAgICAgICAgICAgLyogY3JjIG9mIGlucHV0IGRhdGEgKi8KLSAgICBzdHJ1Y3Qgd29yayAqcHJldjsgICAgICAgICAgICAgIC8qIHByZXZpb3VzIHdvcmsgdW5pdCAqLwotICAgIHN0cnVjdCB3b3JrICpqb2IgPSBhcmc7ICAgICAgICAgLyogd29yayB1bml0IGZvciB0aGlzIHRocmVhZCAqLwotICAgIHpfc3RyZWFtICpzdHJtID0gJihqb2ItPnN0cm0pOyAgLyogemxpYiBzdHJlYW0gZm9yIHRoaXMgd29yayB1bml0ICovCi0KLSAgICAvKiByZXNldCBzdGF0ZSBmb3IgYSBuZXcgY29tcHJlc3NlZCBzdHJlYW0gKi8KLSAgICAodm9pZClkZWZsYXRlUmVzZXQoc3RybSk7Ci0KLSAgICAvKiBpbml0aWFsaXplIGlucHV0LCBvdXRwdXQsIGFuZCBjcmMgKi8KLSAgICBzdHJtLT5uZXh0X2luID0gam9iLT5idWY7Ci0gICAgc3RybS0+bmV4dF9vdXQgPSBqb2ItPm91dDsKLSAgICBsZW4gPSBqb2ItPmxlbjsKLSAgICBjcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKLQotICAgIC8qIHNldCBkaWN0aW9uYXJ5IGlmIHRoaXMgaXNuJ3QgdGhlIGZpcnN0IHdvcmsgdW5pdCwgYW5kIGlmIHdlIHdpbGwgYmUKLSAgICAgICBjb21wcmVzc2luZyBzb21ldGhpbmcgKHRoZSByZWFkIHRocmVhZCBhc3N1cmVzIHRoYXQgdGhlIGRpY3Rpb25hcnkKLSAgICAgICBkYXRhIGluIHRoZSBwcmV2aW91cyB3b3JrIHVuaXQgaXMgc3RpbGwgdGhlcmUpICovCi0gICAgcHJldiA9IGpvYnMgKyBQUkVWKGpvYiAtIGpvYnMpOwotICAgIGlmIChwcmV2LT5idWYgIT0gTlVMTCAmJiBsZW4gIT0gMCkKLSAgICAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgcHJldi0+YnVmICsgKHNpemUgLSBESUNUKSwgRElDVCk7Ci0KLSAgICAvKiBydW4gTUFYLXNpemVkIGFtb3VudHMgb2YgaW5wdXQgdGhyb3VnaCBkZWZsYXRlIGFuZCBjcmMzMiAtLSB0aGlzIGxvb3AKLSAgICAgICBpcyBuZWVkZWQgZm9yIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBpbnRlZ2VyIHR5cGUgaXMgc21hbGxlciB0aGFuIHRoZQotICAgICAgIHNpemVfdCB0eXBlLCBvciB3aGVuIGxlbiBpcyBjbG9zZSB0byB0aGUgbGltaXQgb2YgdGhlIHNpemVfdCB0eXBlICovCi0gICAgd2hpbGUgKGxlbiA+IE1BWCkgewotICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IE1BWDsKLSAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gKHVuc2lnbmVkKS0xOwotICAgICAgICBjcmMgPSBjcmMzMihjcmMsIHN0cm0tPm5leHRfaW4sIHN0cm0tPmF2YWlsX2luKTsKLSAgICAgICAgKHZvaWQpZGVmbGF0ZShzdHJtLCBaX05PX0ZMVVNIKTsKLSAgICAgICAgbGVuIC09IE1BWDsKLSAgICB9Ci0KLSAgICAvKiBydW4gbGFzdCBwaWVjZSB0aHJvdWdoIGRlZmxhdGUgYW5kIGNyYzMyLCBmb2xsb3cgd2l0aCBhIHN5bmMgbWFya2VyICovCi0gICAgaWYgKGxlbikgewotICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IGxlbjsKLSAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gKHVuc2lnbmVkKS0xOwotICAgICAgICBjcmMgPSBjcmMzMihjcmMsIHN0cm0tPm5leHRfaW4sIHN0cm0tPmF2YWlsX2luKTsKLSAgICAgICAgKHZvaWQpZGVmbGF0ZShzdHJtLCBaX1NZTkNfRkxVU0gpOwotICAgIH0KLQotICAgIC8qIGRvbid0IG5lZWQgdG8gWl9GSU5JU0gsIHNpbmNlIHdlJ2QgZGVsZXRlIHRoZSBsYXN0IHR3byBieXRlcyBhbnl3YXkgKi8KLQotICAgIC8qIHJldHVybiByZXN1bHQgKi8KLSAgICBqb2ItPmNyYyA9IGNyYzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogcHV0IGEgNC1ieXRlIGludGVnZXIgaW50byBhIGJ5dGUgYXJyYXkgaW4gTFNCIG9yZGVyICovCi0jZGVmaW5lIFBVVDQoYSxiKSAoKihhKT0oYiksKGEpWzFdPShiKT4+OCwoYSlbMl09KGIpPj4xNiwoYSlbM109KGIpPj4yNCkKLQotLyogd3JpdGUgdGhyZWFkOiB3YWl0IGZvciBjb21wcmVzc2lvbiB0aHJlYWRzIHRvIGNvbXBsZXRlLCB3cml0ZSBvdXRwdXQgaW4KLSAgIG9yZGVyLCBhbHNvIHdyaXRlIGd6aXAgaGVhZGVyIGFuZCB0cmFpbGVyIGFyb3VuZCB0aGUgY29tcHJlc3NlZCBkYXRhICovCi1sb2NhbCB2b2lkICp3cml0ZV90aHJlYWQodm9pZCAqYXJnKQotewotICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcHJlc3MgdGhyZWFkIGluZGV4ICovCi0gICAgc2l6ZV90IGxlbjsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgaW5wdXQgcHJvY2Vzc2VkICovCi0gICAgdW5zaWduZWQgbG9uZyB0b3Q7ICAgICAgICAgICAgICAvKiB0b3RhbCB1bmNvbXByZXNzZWQgc2l6ZSAob3ZlcmZsb3cgb2spICovCi0gICAgdW5zaWduZWQgbG9uZyBjcmM7ICAgICAgICAgICAgICAvKiBDUkMtMzIgb2YgdW5jb21wcmVzc2VkIGRhdGEgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHdyYXBbMTBdOyAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG9yIHRyYWlsZXIgKi8KLQotICAgIC8qIHdyaXRlIHNpbXBsZSBnemlwIGhlYWRlciAqLwotICAgIG1lbWNweSh3cmFwLCAiXDAzN1wyMTNcMTBcMFwwXDBcMFwwXDBcMyIsIDEwKTsKLSAgICB3cmFwWzhdID0gbGV2ZWwgPT0gOSA/IDIgOiAobGV2ZWwgPT0gMSA/IDQgOiAwKTsKLSAgICB3cml0ZW4ob3V0ZCwgd3JhcCwgMTApOwotCi0gICAgLyogcHJvY2VzcyBvdXRwdXQgb2YgY29tcHJlc3MgdGhyZWFkcyB1bnRpbCBlbmQgb2YgaW5wdXQgKi8gICAgCi0gICAgdG90ID0gMDsKLSAgICBjcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKLSAgICBuID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIC8qIHdhaXQgZm9yIGNvbXByZXNzIHRocmVhZCB0byBzdGFydCwgdGhlbiB3YWl0IHRvIGNvbXBsZXRlICovCi0gICAgICAgIGZsYWdfd2FpdCgmKGpvYnNbbl0uYnVzeSksIENPTVApOwotICAgICAgICBwdGhyZWFkX2pvaW4oam9ic1tuXS5jb21wLCBOVUxMKTsKLQotICAgICAgICAvKiBub3cgdGhhdCBjb21wcmVzcyBpcyBkb25lLCBhbGxvdyByZWFkIHRocmVhZCB0byB1c2UgaW5wdXQgYnVmZmVyICovCi0gICAgICAgIGZsYWdfc2V0KCYoam9ic1tuXS5idXN5KSwgV1JJVEUpOwotCi0gICAgICAgIC8qIHdyaXRlIGNvbXByZXNzZWQgZGF0YSBhbmQgdXBkYXRlIGxlbmd0aCBhbmQgY3JjICovCi0gICAgICAgIHdyaXRlbihvdXRkLCBqb2JzW25dLm91dCwgam9ic1tuXS5zdHJtLm5leHRfb3V0IC0gam9ic1tuXS5vdXQpOwotICAgICAgICBsZW4gPSBqb2JzW25dLmxlbjsKLSAgICAgICAgdG90ICs9IGxlbjsKLSAgICAgICAgY3JjID0gY3JjMzJfY29tYmluZShjcmMsIGpvYnNbbl0uY3JjLCBsZW4pOwotCi0gICAgICAgIC8qIHJlbGVhc2UgdGhpcyB3b3JrIHVuaXQgYW5kIGdvIHRvIHRoZSBuZXh0IHdvcmsgdW5pdCAqLwotICAgICAgICBmbGFnX3NldCgmKGpvYnNbbl0uYnVzeSksIElETEUpOwotICAgICAgICBuID0gTkVYVChuKTsKLQotICAgICAgICAvKiBhbiBpbnB1dCBidWZmZXIgbGVzcyB0aGFuIHNpemUgaW4gbGVuZ3RoIGluZGljYXRlcyBlbmQgb2YgaW5wdXQgKi8KLSAgICB9IHdoaWxlIChsZW4gPT0gc2l6ZSk7Ci0KLSAgICAvKiB3cml0ZSBmaW5hbCBzdGF0aWMgYmxvY2sgYW5kIGd6aXAgdHJhaWxlciAoY3JjIGFuZCBsZW4gbW9kIDJeMzIpICovCi0gICAgd3JhcFswXSA9IDM7ICB3cmFwWzFdID0gMDsKLSAgICBQVVQ0KHdyYXAgKyAyLCBjcmMpOwotICAgIFBVVDQod3JhcCArIDYsIHRvdCk7Ci0gICAgd3JpdGVuKG91dGQsIHdyYXAsIDEwKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gb2YgYSB3b3JrIHVuaXQgLS0gdGhpcyBpcyB3aGVyZSB3ZSBzZXQgdGhlIGRlZmxhdGUKLSAgIGNvbXByZXNzaW9uIGxldmVsIGFuZCByZXF1ZXN0IHJhdyBkZWZsYXRlLCBhbmQgYWxzbyB3aGVyZSB3ZSBzZXQgdGhlIHNpemUKLSAgIG9mIHRoZSBvdXRwdXQgYnVmZmVyIHRvIGd1YXJhbnRlZSBlbm91Z2ggc3BhY2UgZm9yIGEgd29yc3QtY2FzZSBkZWZsYXRlCi0gICBlbmRpbmcgd2l0aCBhIFpfU1lOQ19GTFVTSCAqLwotbG9jYWwgdm9pZCBqb2JfaW5pdChzdHJ1Y3Qgd29yayAqam9iKQotewotICAgIGludCByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmbGF0ZUluaXQyKCkgcmV0dXJuIHZhbHVlICovCi0KLSAgICBqb2ItPmJ1ZiA9IG1hbGxvYyhzaXplKTsKLSAgICBqb2ItPm91dCA9IG1hbGxvYyhzaXplICsgKHNpemUgPj4gMTEpICsgMTApOwotICAgIGpvYi0+c3RybS56ZnJlZSA9IFpfTlVMTDsKLSAgICBqb2ItPnN0cm0uemFsbG9jID0gWl9OVUxMOwotICAgIGpvYi0+c3RybS5vcGFxdWUgPSBaX05VTEw7Ci0gICAgcmV0ID0gZGVmbGF0ZUluaXQyKCYoam9iLT5zdHJtKSwgbGV2ZWwsIFpfREVGTEFURUQsIC0xNSwgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgWl9ERUZBVUxUX1NUUkFURUdZKTsKLSAgICBpZiAoam9iLT5idWYgPT0gTlVMTCB8fCBqb2ItPm91dCA9PSBOVUxMIHx8IHJldCAhPSBaX09LKQotICAgICAgICBiYWlsKCJub3QgZW5vdWdoIG1lbW9yeSIpOwotfQotCi0vKiBjb21wcmVzcyBpbmQgdG8gb3V0ZCBpbiB0aGUgZ3ppcCBmb3JtYXQsIHVzaW5nIG11bHRpcGxlIHRocmVhZHMgZm9yIHRoZQotICAgY29tcHJlc3Npb24gYW5kIGNyYyBjYWxjdWxhdGlvbiBhbmQgYW5vdGhlciB0aHJlYWQgZm9yIHdyaXRpbmcgdGhlIG91dHB1dCAtLQotICAgdGhlIHJlYWQgdGhyZWFkIGlzIHRoZSBtYWluIHRocmVhZCAqLwotbG9jYWwgdm9pZCByZWFkX3RocmVhZCh2b2lkKQotewotICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2VuZXJhbCBpbmRleCAqLwotICAgIHNpemVfdCBnb3Q7ICAgICAgICAgICAgICAgICAgICAgLyogYW1vdW50IHJlYWQgKi8KLSAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOyAgICAgICAgICAgIC8qIHRocmVhZCBhdHRyaWJ1dGVzIChsZWZ0IGF0IGRlZmF1bHRzKSAqLwotICAgIHB0aHJlYWRfdCB3cml0ZTsgICAgICAgICAgICAgICAgLyogd3JpdGUgdGhyZWFkICovCi0KLSAgICAvKiBzZXQgZGVmYXVsdHMgKG5vdCBhbGwgcHRocmVhZCBpbXBsZW1lbnRhdGlvbnMgZGVmYXVsdCB0byBqb2luYWJsZSkgKi8KLSAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7Ci0gICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7Ci0KLSAgICAvKiBhbGxvY2F0ZSBhbmQgc2V0IHVwIHdvcmsgbGlzdCAoaW5kaXZpZHVhbCB3b3JrIHVuaXRzIHdpbGwgYmUgaW5pdGlhbGl6ZWQKLSAgICAgICBhcyBuZWVkZWQsIGluIGNhc2UgdGhlIGlucHV0IGlzIHNob3J0KSwgYXNzdXJlIHRoYXQgYWxsb2NhdGlvbiBzaXplCi0gICAgICAgYXJpdGhtZXRpYyBkb2VzIG5vdCBvdmVyZmxvdyAqLwotICAgIGlmIChzaXplICsgKHNpemUgPj4gMTEpICsgMTAgPCAoc2l6ZSA+PiAxMSkgKyAxMCB8fAotICAgICAgICAoc3NpemVfdCkoc2l6ZSArIChzaXplID4+IDExKSArIDEwKSA8IDAgfHwKLSAgICAgICAgKChzaXplX3QpMCAtIDEpIC8gcHJvY3MgPD0gc2l6ZW9mKHN0cnVjdCB3b3JrKSB8fAotICAgICAgICAoam9icyA9IG1hbGxvYyhwcm9jcyAqIHNpemVvZihzdHJ1Y3Qgd29yaykpKSA9PSBOVUxMKQotICAgICAgICBiYWlsKCJub3QgZW5vdWdoIG1lbW9yeSIpOwotICAgIGZvciAobiA9IDA7IG4gPCBwcm9jczsgbisrKSB7Ci0gICAgICAgIGpvYnNbbl0uYnVmID0gTlVMTDsKLSAgICAgICAgZmxhZ19pbml0KCYoam9ic1tuXS5idXN5KSwgSURMRSk7Ci0gICAgfQotCi0gICAgLyogc3RhcnQgd3JpdGUgdGhyZWFkICovCi0gICAgcHRocmVhZF9jcmVhdGUoJndyaXRlLCAmYXR0ciwgd3JpdGVfdGhyZWFkLCBOVUxMKTsKLQotICAgIC8qIHJlYWQgZnJvbSBpbnB1dCBhbmQgc3RhcnQgY29tcHJlc3MgdGhyZWFkcyAod3JpdGUgdGhyZWFkIHdpbGwgcGljayB1cAotICAgICAgIHRoZSBvdXRwdXQgb2YgdGhlIGNvbXByZXNzIHRocmVhZHMpICovCi0gICAgbiA9IDA7Ci0gICAgZG8gewotICAgICAgICAvKiBpbml0aWFsaXplIHRoaXMgd29yayB1bml0IGlmIGl0J3MgdGhlIGZpcnN0IHRpbWUgaXQncyB1c2VkICovCi0gICAgICAgIGlmIChqb2JzW25dLmJ1ZiA9PSBOVUxMKQotICAgICAgICAgICAgam9iX2luaXQoam9icyArIG4pOwotCi0gICAgICAgIC8qIHJlYWQgaW5wdXQgZGF0YSwgYnV0IHdhaXQgZm9yIGxhc3QgY29tcHJlc3Mgb24gdGhpcyB3b3JrIHVuaXQgdG8gYmUKLSAgICAgICAgICAgZG9uZSwgYW5kIHdhaXQgZm9yIHRoZSBkaWN0aW9uYXJ5IHRvIGJlIHVzZWQgYnkgdGhlIGxhc3QgY29tcHJlc3Mgb24KLSAgICAgICAgICAgdGhlIG5leHQgd29yayB1bml0ICovCi0gICAgICAgIGZsYWdfd2FpdF9ub3QoJihqb2JzW25dLmJ1c3kpLCBDT01QKTsKLSAgICAgICAgZmxhZ193YWl0X25vdCgmKGpvYnNbTkVYVChuKV0uYnVzeSksIENPTVApOwotICAgICAgICBnb3QgPSByZWFkbihpbmQsIGpvYnNbbl0uYnVmLCBzaXplKTsKLQotICAgICAgICAvKiBzdGFydCBjb21wcmVzcyB0aHJlYWQsIGJ1dCB3YWl0IGZvciB3cml0ZSB0byBiZSBkb25lIGZpcnN0ICovCi0gICAgICAgIGZsYWdfd2FpdCgmKGpvYnNbbl0uYnVzeSksIElETEUpOwotICAgICAgICBqb2JzW25dLmxlbiA9IGdvdDsKLSAgICAgICAgcHRocmVhZF9jcmVhdGUoJihqb2JzW25dLmNvbXApLCAmYXR0ciwgY29tcHJlc3NfdGhyZWFkLCBqb2JzICsgbik7Ci0KLSAgICAgICAgLyogbWFyayB3b3JrIHVuaXQgc28gd3JpdGUgdGhyZWFkIGtub3dzIGNvbXByZXNzIHdhcyBzdGFydGVkICovCi0gICAgICAgIGZsYWdfc2V0KCYoam9ic1tuXS5idXN5KSwgQ09NUCk7Ci0KLSAgICAgICAgLyogZ28gdG8gdGhlIG5leHQgd29yayB1bml0ICovCi0gICAgICAgIG4gPSBORVhUKG4pOwotCi0gICAgICAgIC8qIGRvIHVudGlsIGVuZCBvZiBpbnB1dCwgaW5kaWNhdGVkIGJ5IGEgcmVhZCBsZXNzIHRoYW4gc2l6ZSAqLwotICAgIH0gd2hpbGUgKGdvdCA9PSBzaXplKTsKLQotICAgIC8qIHdhaXQgZm9yIHRoZSB3cml0ZSB0aHJlYWQgdG8gY29tcGxldGUgLS0gdGhlIHdyaXRlIHRocmVhZCB3aWxsIGpvaW4gd2l0aAotICAgICAgIGFsbCBvZiB0aGUgY29tcHJlc3MgdGhyZWFkcywgc28gdGhpcyB3YWl0cyBmb3IgYWxsIG9mIHRoZSB0aHJlYWRzIHRvCi0gICAgICAgY29tcGxldGUgKi8KLSAgICBwdGhyZWFkX2pvaW4od3JpdGUsIE5VTEwpOwotCi0gICAgLyogZnJlZSB1cCBhbGwgcmVxdWVzdGVkIHJlc291cmNlcyBhbmQgcmV0dXJuICovCi0gICAgZm9yIChuID0gcHJvY3MgLSAxOyBuID49IDA7IG4tLSkgewotICAgICAgICBmbGFnX2RvbmUoJihqb2JzW25dLmJ1c3kpKTsKLSAgICAgICAgKHZvaWQpZGVmbGF0ZUVuZCgmKGpvYnNbbl0uc3RybSkpOwotICAgICAgICBmcmVlKGpvYnNbbl0ub3V0KTsKLSAgICAgICAgZnJlZShqb2JzW25dLmJ1Zik7Ci0gICAgfQotICAgIGZyZWUoam9icyk7Ci0gICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOwotfQotCi0vKiBQcm9jZXNzIGFyZ3VtZW50cyBmb3IgbGV2ZWwsIHNpemUsIGFuZCBwcm9jcywgY29tcHJlc3MgZnJvbSBzdGRpbiB0bwotICAgc3Rkb3V0IGluIHRoZSBnemlwIGZvcm1hdC4gIE5vdGUgdGhhdCBwcm9jcyBtdXN0IGJlIGF0IGxlYXN0IHR3byBpbgotICAgb3JkZXIgdG8gcHJvdmlkZSBhIGRpY3Rpb25hcnkgaW4gb25lIHdvcmsgdW5pdCBmb3IgdGhlIG90aGVyIHdvcmsKLSAgIHVuaXQsIGFuZCB0aGF0IHNpemUgbXVzdCBiZSBhdCBsZWFzdCAzMksgdG8gc3RvcmUgYSBmdWxsIGRpY3Rpb25hcnkuICovCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZW5lcmFsIGluZGV4ICovCi0gICAgaW50IGdldDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyB0byBnZXQgKi8KLSAgICBjaGFyICphcmc7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgbGluZSBhcmd1bWVudCAqLwotCi0gICAgLyogc2V0IGRlZmF1bHRzIC0tIDMyIHByb2Nlc3NlcyBhbmQgMTI4SyBidWZmZXJzIHdhcyBmb3VuZCB0byBwcm92aWRlCi0gICAgICAgZ29vZCB1dGlsaXphdGlvbiBvZiBmb3VyIGNvcmVzIChhYm91dCA5NyUpIGFuZCBiYWxhbmNlZCB0aGUgb3ZlcmFsbAotICAgICAgIGV4ZWN1dGlvbiB0aW1lIGltcGFjdCBvZiBtb3JlIHRocmVhZHMgYWdhaW5zdCBtb3JlIGRpY3Rpb25hcnkKLSAgICAgICBwcm9jZXNzaW5nIGZvciBhIGZpeGVkIGFtb3VudCBvZiBtZW1vcnkgLS0gdGhlIG1lbW9yeSB1c2FnZSBmb3IgdGhlc2UKLSAgICAgICBzZXR0aW5ncyBhbmQgZnVsbCB1c2Ugb2YgYWxsIHdvcmsgdW5pdHMgKGF0IGxlYXN0IDQgTUIgb2YgaW5wdXQpIGlzCi0gICAgICAgMTYuMiBNQgotICAgICAgICovCi0gICAgbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT047Ci0gICAgcHJvY3MgPSAzMjsKLSAgICBzaXplID0gMTMxMDcyVUw7Ci0KLSAgICAvKiBwcm9jZXNzIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgKi8KLSAgICBnZXQgPSAwOwotICAgIGZvciAobiA9IDE7IG4gPCBhcmdjOyBuKyspIHsKLSAgICAgICAgYXJnID0gYXJndltuXTsKLSAgICAgICAgaWYgKCphcmcgPT0gJy0nKSB7Ci0gICAgICAgICAgICB3aGlsZSAoKisrYXJnKQotICAgICAgICAgICAgICAgIGlmICgqYXJnID49ICcwJyAmJiAqYXJnIDw9ICc5JykgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICovCi0gICAgICAgICAgICAgICAgICAgIGxldmVsID0gKmFyZyAtICcwJzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICgqYXJnID09ICdiJykgICAgICAgICAgICAgICAvKiBjaHVuayBzaXplIGluIEsgKi8KLSAgICAgICAgICAgICAgICAgICAgZ2V0IHw9IDE7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKmFyZyA9PSAncCcpICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByb2Nlc3NlcyAqLwotICAgICAgICAgICAgICAgICAgICBnZXQgfD0gMjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICgqYXJnID09ICdoJykgeyAgICAgICAgICAgICAvKiBoZWxwICovCi0gICAgICAgICAgICAgICAgICAgIGZwdXRzKCJ1c2FnZTogcGlneiBbLTAuLjldIFstYiBibG9ja3NpemVpbktdIiwgc3RkZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgZnB1dHMoIiBbLXAgcHJvY2Vzc2VzXSA8IGZvbyA+IGZvby5nelxuIiwgc3RkZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYmFpbCgiaW52YWxpZCBvcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChnZXQgJiAxKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0ICYgMikKLSAgICAgICAgICAgICAgICBiYWlsKCJ5b3UgbmVlZCB0byBzZXBhcmF0ZSB0aGUgLWIgYW5kIC1wIG9wdGlvbnMiKTsKLSAgICAgICAgICAgIHNpemUgPSAoc2l6ZV90KShhdG9sKGFyZykpIDw8IDEwOyAgICAgICAvKiBjaHVuayBzaXplICovCi0gICAgICAgICAgICBpZiAoc2l6ZSA8IERJQ1QpCi0gICAgICAgICAgICAgICAgYmFpbCgiaW52YWxpZCBvcHRpb24iKTsKLSAgICAgICAgICAgIGdldCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZ2V0ICYgMikgewotICAgICAgICAgICAgcHJvY3MgPSBhdG9pKGFyZyk7ICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3NlcyAqLwotICAgICAgICAgICAgaWYgKHByb2NzIDwgMikKLSAgICAgICAgICAgICAgICBiYWlsKCJpbnZhbGlkIG9wdGlvbiIpOwotICAgICAgICAgICAgZ2V0ID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBiYWlsKCJpbnZhbGlkIG9wdGlvbiAoeW91IG5lZWQgdG8gcGlwZSBpbnB1dCBhbmQgb3V0cHV0KSIpOwotICAgIH0KLSAgICBpZiAoZ2V0KQotICAgICAgICBiYWlsKCJtaXNzaW5nIG9wdGlvbiBhcmd1bWVudCIpOwotCi0gICAgLyogZG8gcGFyYWxsZWwgY29tcHJlc3Npb24gZnJvbSBzdGRpbiB0byBzdGRvdXQgKHRoZSByZWFkIHRocmVhZCBzdGFydHMgdXAKLSAgICAgICB0aGUgd3JpdGUgdGhyZWFkIGFuZCB0aGUgY29tcHJlc3Npb24gdGhyZWFkcywgYW5kIHRoZXkgYWxsIGpvaW4gYmVmb3JlCi0gICAgICAgdGhlIHJlYWQgdGhyZWFkIHJldHVybnMpICovCi0gICAgaW5kID0gMDsKLSAgICBvdXRkID0gMTsKLSAgICByZWFkX3RocmVhZCgpOwotCi0gICAgLyogZG9uZSAqLwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZ3pndXRzLmggYi9nemd1dHMuaAppbmRleCA0MjljMjFiLi44Yjc5MTRkIDEwMDY0NAotLS0gYS9nemd1dHMuaAorKysgYi9nemd1dHMuaApAQCAtMTUsMTAgKzE1LDEyIEBACiAjZGVmaW5lIFpMSUJfSU5URVJOQUwKIAogI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlICJ6bGliLmgiCisjaWZkZWYgU1REQworIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CiAKICNpZmRlZiBOT19ERUZMQVRFICAgICAgIC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGRlZmluaXRpb24gKi8KICMgIGRlZmluZSBOT19HWkNPTVBSRVNTCkBAIC00Miw3ICs0NCw4IEBACiAKIC8qIGdldCBlcnJubyBhbmQgc3RyZXJyb3IgZGVmaW5pdGlvbiAqLwogI2lmIGRlZmluZWQgVU5ERVJfQ0UgJiYgZGVmaW5lZCBOT19FUlJOT19ICi0jICBkZWZpbmUgenN0cmVycm9yKGVycm51bSkgc3Ryd2luZXJyb3IoKERXT1JEKWVycm51bSkKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgIGRlZmluZSB6c3RyZXJyb3IoKSBnel9zdHJ3aW5lcnJvcigoRFdPUkQpR2V0TGFzdEVycm9yKCkpCiAjZWxzZQogIyAgaWZkZWYgU1REQwogIyAgICBpbmNsdWRlIDxlcnJuby5oPgpAQCAtNTQsNyArNTcsNyBAQAogCiAvKiBNVlMgZmRvcGVuKCkgKi8KICNpZmRlZiBfX01WU19fCi0jICBwcmFnbWEgbWFwIChmZG9wZW4gLCAiXDE3NFwxNzRGRE9QRU4iKQorICAjcHJhZ21hIG1hcCAoZmRvcGVuICwgIlwxNzRcMTc0RkRPUEVOIikKICAgIEZJTEUgKmZkb3BlbihpbnQsIGNvbnN0IGNoYXIgKik7CiAjZW5kaWYKIApAQCAtMTA2LDQgKzEwOSw3IEBACiB0eXBlZGVmIGd6X3N0YXRlIEZBUiAqZ3pfc3RhdGVwOwogCiAvKiBzaGFyZWQgZnVuY3Rpb25zICovCi1aRVhURVJOIHZvaWQgWkVYUE9SVCBnel9lcnJvciBPRigoZ3pfc3RhdGVwLCBpbnQsIGNoYXIgKikpOworWkVYVEVSTiB2b2lkIFpFWFBPUlQgZ3pfZXJyb3IgT0YoKGd6X3N0YXRlcCwgaW50LCBjb25zdCBjaGFyICopKTsKKyNpZiBkZWZpbmVkIFVOREVSX0NFICYmIGRlZmluZWQgTk9fRVJSTk9fSAorWkVYVEVSTiBjaGFyIFpFWFBPUlQgKmd6X3N0cndpbmVycm9yIE9GKChEV09SRCBlcnJvcikpOworI2VuZGlmCmRpZmYgLS1naXQgYS9nemlvLmMgYi9nemlvLmMKaW5kZXggZjlhZmMxMC4uNzJiNjI4NyAxMDA2NDQKLS0tIGEvZ3ppby5jCisrKyBiL2d6aW8uYwpAQCAtOTUsNyArOTUsNyBAQAogI2VuZGlmIC8qIFVOREVSX0NFICYmIE5PX0VSUk5PX0ggKi8KIAogI2lmZGVmIF9fTVZTX18KLSMgIHByYWdtYSBtYXAgKGZkb3BlbiAsICJcMTc0XDE3NEZET1BFTiIpCisgICNwcmFnbWEgbWFwIChmZG9wZW4gLCAiXDE3NFwxNzRGRE9QRU4iKQogICAgRklMRSAqZmRvcGVuKGludCwgY29uc3QgY2hhciAqKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9nemxpYi5jIGIvZ3psaWIuYwppbmRleCBiY2VmNmMyLi5jOWE4MmRjIDEwMDY0NAotLS0gYS9nemxpYi5jCisrKyBiL2d6bGliLmMKQEAgLTE4LDIxICsxOCwxNyBAQAogbG9jYWwgZ3pGaWxlIGd6X29wZW4gT0YoKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICosIGludCkpOwogCiAjaWYgZGVmaW5lZCBVTkRFUl9DRSAmJiBkZWZpbmVkIE5PX0VSUk5PX0gKLWxvY2FsIGNoYXIgKnN0cndpbmVycm9yIE9GKChEV09SRCBlcnJvcikpOwogCi0jICBpbmNsdWRlIDx3aW5kb3dzLmg+CisvKiBNYXAgdGhlIFdpbmRvd3MgZXJyb3IgbnVtYmVyIGluIEVSUk9SIHRvIGEgbG9jYWxlLWRlcGVuZGVudCBlcnJvciBtZXNzYWdlCisgICBzdHJpbmcgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuICBUeXBpY2FsbHksIHRoZSB2YWx1ZXMgZm9yIEVSUk9SIGNvbWUKKyAgIGZyb20gR2V0TGFzdEVycm9yLgogCi0vKiBNYXAgdGhlIFdpbmRvd3MgZXJyb3IgbnVtYmVyIGluIEVSUk9SIHRvIGEgbG9jYWxlLWRlcGVuZGVudCBlcnJvcgotICAgbWVzc2FnZSBzdHJpbmcgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuICBUeXBpY2FsbHksIHRoZSB2YWx1ZXMKLSAgIGZvciBFUlJPUiBjb21lIGZyb20gR2V0TGFzdEVycm9yLgorICAgVGhlIHN0cmluZyBwb2ludGVkIHRvIHNoYWxsIG5vdCBiZSBtb2RpZmllZCBieSB0aGUgYXBwbGljYXRpb24sIGJ1dCBtYXkgYmUKKyAgIG92ZXJ3cml0dGVuIGJ5IGEgc3Vic2VxdWVudCBjYWxsIHRvIGd6X3N0cndpbmVycm9yCiAKLSAgIFRoZSBzdHJpbmcgcG9pbnRlZCB0byBzaGFsbCBub3QgYmUgbW9kaWZpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLAotICAgYnV0IG1heSBiZSBvdmVyd3JpdHRlbiBieSBhIHN1YnNlcXVlbnQgY2FsbCB0byBzdHJ3aW5lcnJvcgotCi0gICBUaGUgc3Ryd2luZXJyb3IgZnVuY3Rpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBjdXJyZW50IHNldHRpbmcKLSAgIG9mIEdldExhc3RFcnJvci4gICovCi0KLWxvY2FsIGNoYXIgKnN0cndpbmVycm9yIChlcnJvcikKKyAgIFRoZSBnel9zdHJ3aW5lcnJvciBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgc2V0dGluZyBvZgorICAgR2V0TGFzdEVycm9yLiAqLworY2hhciBaRVhQT1JUICpnel9zdHJ3aW5lcnJvciAoZXJyb3IpCiAgICAgIERXT1JEIGVycm9yOwogewogICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMDI0XTsKQEAgLTgyLDE4ICs3OCwxOCBAQAogICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7ICAgICAgICAgICAgLyogbm8gb3V0cHV0IGRhdGEgYXZhaWxhYmxlICovCiAgICAgICAgIHN0YXRlLT5lb2YgPSAwOyAgICAgICAgICAgICAvKiBub3QgYXQgZW5kIG9mIGZpbGUgKi8KICAgICB9Ci0gICAgc3RhdGUtPnNlZWsgPSAwOyAgICAgICAgICAgIC8qIG5vIHNlZWsgcmVxdWVzdCBwZW5kaW5nICovCi0gICAgZ3pfZXJyb3Ioc3RhdGUsIFpfT0ssIE5VTEwpOyAgIC8qIGNsZWFyIGVycm9yICovCi0gICAgc3RhdGUtPnBvcyA9IDA7ICAgICAgICAgICAgIC8qIG5vIHVuY29tcHJlc3NlZCBkYXRhIHlldCAqLwotICAgIHN0YXRlLT5zdHJtLmF2YWlsX2luID0gMDsgICAvKiBubyBpbnB1dCBkYXRhIHlldCAqLworICAgIHN0YXRlLT5zZWVrID0gMDsgICAgICAgICAgICAgICAgLyogbm8gc2VlayByZXF1ZXN0IHBlbmRpbmcgKi8KKyAgICBnel9lcnJvcihzdGF0ZSwgWl9PSywgTlVMTCk7ICAgIC8qIGNsZWFyIGVycm9yICovCisgICAgc3RhdGUtPnBvcyA9IDA7ICAgICAgICAgICAgICAgICAvKiBubyB1bmNvbXByZXNzZWQgZGF0YSB5ZXQgKi8KKyAgICBzdGF0ZS0+c3RybS5hdmFpbF9pbiA9IDA7ICAgICAgIC8qIG5vIGlucHV0IGRhdGEgeWV0ICovCiB9CiAKIC8qIE9wZW4gYSBnemlwIGZpbGUgZWl0aGVyIGJ5IG5hbWUgb3IgZmlsZSBkZXNjcmlwdG9yLiAqLwotbG9jYWwgZ3pGaWxlIGd6X29wZW4ocGF0aCwgZmQsIG1vZGUsIHVzZTY0KQorbG9jYWwgZ3pGaWxlIGd6X29wZW4ocGF0aCwgZmQsIG1vZGUsIGxhcmdlKQogICAgIGNvbnN0IGNoYXIgKnBhdGg7CiAgICAgaW50IGZkOwogICAgIGNvbnN0IGNoYXIgKm1vZGU7Ci0gICAgaW50IHVzZTY0OworICAgIGludCBsYXJnZTsKIHsKICAgICBnel9zdGF0ZXAgc3RhdGU7CiAKQEAgLTE1Niw5ICsxNTIsMTMgQEAKICAgICAvKiBvcGVuIHRoZSBmaWxlIHdpdGggdGhlIGFwcHJvcHJpYXRlIG1vZGUgKG9yIGp1c3QgdXNlIGZkKSAqLwogICAgIHN0YXRlLT5mZCA9IGZkICE9IC0xID8gZmQgOgogICAgICAgICBvcGVuKHBhdGgsCisgICAgICAgICAgICAobGFyZ2UgPwogI2lmZGVmIE9fTEFSR0VGSUxFCi0gICAgICAgICAgICAodXNlNjQgPyBPX0xBUkdFRklMRSA6IDApIHwKKyAgICAgICAgICAgIE9fTEFSR0VGSUxFCisjZWxzZQorICAgICAgICAgICAgMAogI2VuZGlmCisgICAgICAgICAgICA6IDApIHwKICNpZmRlZiBPX0JJTkFSWQogICAgICAgICAgICAgT19CSU5BUlkgfAogI2VuZGlmCkBAIC0yMTQsMTMgKzIxNCwxNiBAQAogICAgIGludCBmZDsKICAgICBjb25zdCBjaGFyICptb2RlOwogewotICAgIGNoYXIgcGF0aFs0Nl07ICAgICAgLyogYWxsb3cgdXAgdG8gMTI4LWJpdCBpbnRlZ2Vycywgc28gZG9uJ3Qgd29ycnkgLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzcHJpbnRmKCkgaXMgc2FmZSAqLworICAgIGNoYXIgcGF0aFs0Nl07ICAgICAgLyogaWRlbnRpZmllciBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KIAogICAgIGlmIChmZCA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHNwcmludGYocGF0aCwgIjxmZDolZD4iLCBmZCk7ICAgICAgIC8qIGZvciBlcnJvciBtZXNzYWdlcyAqLwotICAgIHJldHVybiBnel9vcGVuKHBhdGgsIGZkLCBtb2RlLCAxKTsKKyNpZmRlZiBOT19zbnByaW50ZgorICAgIHNwcmludGYocGF0aCwgIjxmZDolZD4iLCBmZCk7ICAgLyogYmlnIGVub3VnaCBmb3IgMTI4LWJpdCBpbnRlZ2VycyAqLworI2Vsc2UKKyAgICBzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICI8ZmQ6JWQ+IiwgZmQpOworI2VuZGlmCisgICAgcmV0dXJuIGd6X29wZW4ocGF0aCwgZmQsIG1vZGUsIDApOwogfQogCiAvKiAtLSBzZWUgemxpYi5oIC0tICovCkBAIC0zMjUsNyArMzI4LDcgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICAvKiBpZiByZWFkaW5nLCBza2lwIHdoYXQncyBpbiBvdXRwdXQgYnVmZmVyIChvbmUgbGVzcyBnel9nZXRjKCkgY2hlY2spICovCisgICAgLyogaWYgcmVhZGluZywgc2tpcCB3aGF0J3MgaW4gb3V0cHV0IGJ1ZmZlciAob25lIGxlc3MgZ3pnZXRjKCkgY2hlY2spICovCiAgICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX1JFQUQpIHsKICAgICAgICAgbiA9IHN0YXRlLT5oYXZlID4gb2Zmc2V0ID8gKHVuc2lnbmVkKW9mZnNldCA6IHN0YXRlLT5oYXZlOwogICAgICAgICBzdGF0ZS0+aGF2ZSAtPSBuOwpAQCAtNDIyLDEwICs0MjUsMTAgQEAKIAogICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgYW5kIGNoZWNrIGludGVncml0eSAqLwogICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CiAgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCi0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIDA7CiAKICAgICAvKiByZXR1cm4gZW5kLW9mLWZpbGUgc3RhdGUgKi8KICAgICByZXR1cm4gc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCA/IChzdGF0ZS0+ZW9mICYmIHN0YXRlLT5oYXZlID09IDApIDogMDsKQEAgLTQ3MCwxNSArNDczLDE1IEBACiB9CiAKIC8qIENyZWF0ZSBhbiBlcnJvciBtZXNzYWdlIGluIGFsbG9jYXRlZCBtZW1vcnkgYW5kIHNldCBzdGF0ZS0+ZXJyIGFuZAotICAgc3RhdGUtPm1zZyBhY2NvcmRpbmdseS4gRnJlZSBhbnkgcHJldmlvdXMgZXJyb3IgbWVzc2FnZSBhbHJlYWR5IHRoZXJlLiAgRG8KKyAgIHN0YXRlLT5tc2cgYWNjb3JkaW5nbHkuICBGcmVlIGFueSBwcmV2aW91cyBlcnJvciBtZXNzYWdlIGFscmVhZHkgdGhlcmUuICBEbwogICAgbm90IHRyeSB0byBmcmVlIG9yIGFsbG9jYXRlIHNwYWNlIGlmIHRoZSBlcnJvciBpcyBaX01FTV9FUlJPUiAob3V0IG9mCi0gICBtZW1vcnkpLiAgU2ltcGx5IHNhdmUgdGhlIGVycm9yIG1lc3NhZ2UgYXMgYSBzdGF0aWMgc3RyaW5nLiAgSWYgdGhlcmUgaXMKLSAgIGFuIGFsbG9jYXRpb24gZmFpbHVyZSBjb25zdHJ1Y3RpbmcgdGhlIGVycm9yIG1lc3NhZ2UsIHRoZW4gY29udmVydCB0aGUKLSAgIGVycm9yIHRvIG91dCBvZiBtZW1vcnkuICovCisgICBtZW1vcnkpLiAgU2ltcGx5IHNhdmUgdGhlIGVycm9yIG1lc3NhZ2UgYXMgYSBzdGF0aWMgc3RyaW5nLiAgSWYgdGhlcmUgaXMgYW4KKyAgIGFsbG9jYXRpb24gZmFpbHVyZSBjb25zdHJ1Y3RpbmcgdGhlIGVycm9yIG1lc3NhZ2UsIHRoZW4gY29udmVydCB0aGUgZXJyb3IgdG8KKyAgIG91dCBvZiBtZW1vcnkuICovCiB2b2lkIFpFWFBPUlQgZ3pfZXJyb3Ioc3RhdGUsIGVyciwgbXNnKQogICAgIGd6X3N0YXRlcCBzdGF0ZTsKICAgICBpbnQgZXJyOwotICAgIGNoYXIgKm1zZzsKKyAgICBjb25zdCBjaGFyICptc2c7CiB7CiAgICAgLyogZnJlZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBtZXNzYWdlIGFuZCBjbGVhciAqLwogICAgIGlmIChzdGF0ZS0+bXNnICE9IE5VTEwpIHsKQEAgLTQ5NCwxNCArNDk3LDE0IEBACiAKICAgICAvKiBmb3IgYW4gb3V0IG9mIG1lbW9yeSBlcnJvciwgc2F2ZSBhcyBzdGF0aWMgc3RyaW5nICovCiAgICAgaWYgKGVyciA9PSBaX01FTV9FUlJPUikgewotICAgICAgICBzdGF0ZS0+bXNnID0gbXNnOworICAgICAgICBzdGF0ZS0+bXNnID0gKGNoYXIgKiltc2c7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICAvKiBjb25zdHJ1Y3QgZXJyb3IgbWVzc2FnZSB3aXRoIHBhdGggKi8KICAgICBpZiAoKHN0YXRlLT5tc2cgPSBtYWxsb2Moc3RybGVuKHN0YXRlLT5wYXRoKSArIHN0cmxlbihtc2cpICsgMykpID09IE5VTEwpIHsKICAgICAgICAgc3RhdGUtPmVyciA9IFpfTUVNX0VSUk9SOwotICAgICAgICBzdGF0ZS0+bXNnID0gIm91dCBvZiBtZW1vcnkiOworICAgICAgICBzdGF0ZS0+bXNnID0gKGNoYXIgKikib3V0IG9mIG1lbW9yeSI7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3RyY3B5KHN0YXRlLT5tc2csIHN0YXRlLT5wYXRoKTsKZGlmZiAtLWdpdCBhL2d6cmVhZC5jIGIvZ3pyZWFkLmMKaW5kZXggODM2YzU3Yy4uNzRiZGM3YiAxMDA2NDQKLS0tIGEvZ3pyZWFkLmMKKysrIGIvZ3pyZWFkLmMKQEAgLTY5LDggKzY5LDggQEAKICAgICAgICAgICAgICAgICAoc3RybS0+YXZhaWxfaW4gPT0gMCA/IC0xIDogXAogICAgICAgICAgICAgICAgICAoc3RybS0+YXZhaWxfaW4tLSwgKihzdHJtLT5uZXh0X2luKSsrKSkpCiAKLS8qIEdldCBhIGZvdXItYnl0ZSBsaXR0bGUtZW5kaWFuIGludGVnZXIgYW5kIHJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIHRoZQotICAgdmFsdWUgaW4gKnJldC4gIE90aGVyd2lzZSAtMSBpcyByZXR1cm5lZCBhbmQgKnJldCBpcyBub3QgbW9kaWZpZWQuICovCisvKiBHZXQgYSBmb3VyLWJ5dGUgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyIGFuZCByZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCB0aGUgdmFsdWUKKyAgIGluICpyZXQuICBPdGhlcndpc2UgLTEgaXMgcmV0dXJuZWQgYW5kICpyZXQgaXMgbm90IG1vZGlmaWVkLiAqLwogbG9jYWwgaW50IGd6X25leHQ0KHN0YXRlLCByZXQpCiAgICAgZ3pfc3RhdGVwIHN0YXRlOwogICAgIHVuc2lnbmVkIGxvbmcgKnJldDsKQEAgLTkzLDcgKzkzLDcgQEAKIC8qIExvb2sgZm9yIGd6aXAgaGVhZGVyLCBzZXQgdXAgZm9yIGluZmxhdGUgb3IgY29weS4gIHN0YXRlLT5oYXZlIG11c3QgYmUgemVyby4KICAgIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgaW4sIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4gIHN0YXRlLT5ob3cgd2lsbCBiZQogICAgbGVmdCB1bmNoYW5nZWQgaWYgdGhlcmUgaXMgbm8gbW9yZSBpbnB1dCBkYXRhIGF2YWlsYWJsZSwgd2lsbCBiZSBzZXQgdG8gMSBpZgotICAgdGhlcmUgaXMgbm8gZ3ppcCBoZWFkZXIgYW5kIGRpcmVjdCBjb3B5aW5nIHdpbGwgYmUgcGVyZm9ybW5lZCwgb3IgaXQgd2lsbCBiZQorICAgdGhlcmUgaXMgbm8gZ3ppcCBoZWFkZXIgYW5kIGRpcmVjdCBjb3B5aW5nIHdpbGwgYmUgcGVyZm9ybWVkLCBvciBpdCB3aWxsIGJlCiAgICBzZXQgdG8gMiBmb3IgZGVjb21wcmVzc2lvbiwgYW5kIHRoZSBnemlwIGhlYWRlciB3aWxsIGJlIHNraXBwZWQgc28gdGhhdCB0aGUKICAgIG5leHQgYXZhaWxhYmxlIGlucHV0IGRhdGEgaXMgdGhlIHJhdyBkZWZsYXRlIHN0cmVhbS4gIElmIGRpcmVjdCBjb3B5aW5nLAogICAgdGhlbiBsZWZ0b3ZlciBpbnB1dCBkYXRhIGZyb20gdGhlIGlucHV0IGJ1ZmZlciB3aWxsIGJlIGNvcGllZCB0byB0aGUgb3V0cHV0CkBAIC0xOTAsNiArMTkwLDggQEAKICAgICAgICAgICAgICAgICBORVhUKCk7CiAgICAgICAgICAgICAgICAgTkVYVCgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogYW4gdW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpcyBub3QgY2hlY2tlZCBmb3IgaGVyZSAtLSBpdCB3aWxsIGJlCisgICAgICAgICAgICAgICBub3RpY2VkIG9uIHRoZSBmaXJzdCByZXF1ZXN0IGZvciB1bmNvbXByZXNzZWQgZGF0YSAqLwogCiAgICAgICAgICAgICAvKiBzZXQgdXAgZm9yIGRlY29tcHJlc3Npb24gKi8KICAgICAgICAgICAgIGluZmxhdGVSZXNldChzdHJtKTsKQEAgLTIwNiw3ICsyMDgsNyBAQAogCiAgICAgLyogZG9pbmcgcmF3IGkvbywgc2F2ZSBzdGFydCBvZiByYXcgZGF0YSBmb3Igc2Vla2luZywgY29weSBhbnkgbGVmdG92ZXIKICAgICAgICBpbnB1dCB0byBvdXRwdXQgLS0gdGhpcyBhc3N1bWVzIHRoYXQgdGhlIG91dHB1dCBidWZmZXIgaXMgbGFyZ2VyIHRoYW4KLSAgICAgICB0aGUgaW5wdXQgYnVmZmVyICovCisgICAgICAgdGhlIGlucHV0IGJ1ZmZlciwgd2hpY2ggYWxzbyBhc3N1cmVzIHNwYWNlIGZvciBnenVuZ2V0YygpICovCiAgICAgc3RhdGUtPnJhdyA9IHN0YXRlLT5wb3M7CiAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+b3V0OwogICAgIGlmIChzdHJtLT5hdmFpbF9pbikgewpAQCAtMjIwLDEwICsyMjIsMTAgQEAKIAogLyogRGVjb21wcmVzcyBmcm9tIGlucHV0IHRvIHRoZSBwcm92aWRlZCBuZXh0X291dCBhbmQgYXZhaWxfb3V0IGluIHRoZSBzdGF0ZS4KICAgIElmIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBpcyByZWFjaGVkLCB0aGVuIHZlcmlmeSB0aGUgZ3ppcCB0cmFpbGVyCi0gICBjaGVjayB2YWx1ZSBhbmQgbGVuZ3RoIChtb2R1bG8gMl4zMikuICBzdGF0ZS0+aGF2ZSBhbmQgc3RhdGUtPm5leHQgYXJlCi0gICBzZXQgdG8gcG9pbnQgdG8gdGhlIGp1c3QgZGVjb21wcmVzc2VkIGRhdGEsIGFuZCB0aGUgY3JjIGlzIHVwZGF0ZWQuICBJZiB0aGUKKyAgIGNoZWNrIHZhbHVlIGFuZCBsZW5ndGggKG1vZHVsbyAyXjMyKS4gIHN0YXRlLT5oYXZlIGFuZCBzdGF0ZS0+bmV4dCBhcmUgc2V0CisgICB0byBwb2ludCB0byB0aGUganVzdCBkZWNvbXByZXNzZWQgZGF0YSwgYW5kIHRoZSBjcmMgaXMgdXBkYXRlZC4gIElmIHRoZQogICAgdHJhaWxlciBpcyB2ZXJpZmllZCwgc3RhdGUtPmhvdyBpcyByZXNldCB0byB6ZXJvIHRvIGxvb2sgZm9yIHRoZSBuZXh0IGd6aXAKLSAgIHN0cmVhbSBvciByYXcgZGF0YSwgb25jZSBzdGF0ZS0+aGF2ZSBpcyBkZXBsZXRlZC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xCisgICBzdHJlYW0gb3IgcmF3IGRhdGEsIG9uY2Ugc3RhdGUtPmhhdmUgaXMgZGVwbGV0ZWQuICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEKICAgIG9uIGZhaWx1cmUuICBGYWlsdXJlcyBtYXkgaW5jbHVkZSBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSBvciBhIGZhaWxlZCBnemlwCiAgICB0cmFpbGVyIHZlcmlmaWNhdGlvbi4gKi8KIGxvY2FsIGludCBnel9kZWNvbXAoc3RhdGUpCkBAIC0zNzIsNiArMzc0LDE3IEBACiAgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwgc3RhdGUtPmVyciAhPSBaX09LKQogICAgICAgICByZXR1cm4gLTE7CiAKKyAgICAvKiBzaW5jZSBhbiBpbnQgaXMgcmV0dXJuZWQsIG1ha2Ugc3VyZSBsZW4gZml0cyBpbiBvbmUsIG90aGVyd2lzZSByZXR1cm4KKyAgICAgICB3aXRoIGFuIGVycm9yICh0aGlzIGF2b2lkcyB0aGUgZmxhdyBpbiB0aGUgaW50ZXJmYWNlKSAqLworICAgIGlmICgoaW50KWxlbiA8IDApIHsKKyAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfQlVGX0VSUk9SLCAicmVxdWVzdGVkIGxlbmd0aCBkb2VzIG5vdCBmaXQgaW4gaW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBpZiBsZW4gaXMgemVybywgYXZvaWQgdW5uZWNlc3Nhcnkgb3BlcmF0aW9ucyAqLworICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKICAgICAvKiBwcm9jZXNzIGEgc2tpcCByZXF1ZXN0ICovCiAgICAgaWYgKHN0YXRlLT5zZWVrKSB7CiAgICAgICAgIHN0YXRlLT5zZWVrID0gMDsKQEAgLTM4MSw4ICszOTQsNyBAQAogCiAgICAgLyogZ2V0IGxlbiBieXRlcyB0byBidWYsIG9yIGxlc3MgdGhhbiBsZW4gaWYgYXQgdGhlIGVuZCAqLwogICAgIGdvdCA9IDA7Ci0gICAgd2hpbGUgKGxlbikgewotCisgICAgZG8gewogICAgICAgICAvKiBmaXJzdCBqdXN0IHRyeSBjb3B5aW5nIGRhdGEgZnJvbSB0aGUgb3V0cHV0IGJ1ZmZlciAqLwogICAgICAgICBpZiAoc3RhdGUtPmhhdmUpIHsKICAgICAgICAgICAgIG4gPSBzdGF0ZS0+aGF2ZSA+IGxlbiA/IGxlbiA6IHN0YXRlLT5oYXZlOwpAQCAtNDAyLDYgKzQxNCw4IEBACiAgICAgICAgICAgICBpZiAoZ3pfbWFrZShzdGF0ZSkgPT0gLTEpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgY29udGludWU7ICAgICAgIC8qIG5vIHByb2dyZXNzIHlldCAtLSBnbyBiYWNrIHRvIG1lbWNweSgpIGFib3ZlICovCisgICAgICAgICAgICAvKiB0aGUgY29weSBhYm92ZSBhc3N1cmVzIHRoYXQgd2Ugd2lsbCBsZWF2ZSB3aXRoIHNwYWNlIGluIHRoZQorICAgICAgICAgICAgICAgb3V0cHV0IGJ1ZmZlciwgYWxsb3dpbmcgYXQgbGVhc3Qgb25lIGd6dW5nZXRjKCkgdG8gc3VjY2VlZCAqLwogICAgICAgICB9CiAKICAgICAgICAgLyogbGFyZ2UgbGVuIC0tIHJlYWQgZGlyZWN0bHkgaW50byB1c2VyIGJ1ZmZlciAqLwpAQCAtNDIyLDEzICs0MzYsMTMgQEAKIAogICAgICAgICAvKiB1cGRhdGUgcHJvZ3Jlc3MgKi8KICAgICAgICAgbGVuIC09IG47Ci0gICAgICAgIGJ1ZiArPSBuOworICAgICAgICBidWYgPSAoY2hhciAqKWJ1ZiArIG47CiAgICAgICAgIGdvdCArPSBuOwogICAgICAgICBzdGF0ZS0+cG9zICs9IG47Ci0gICAgfQorICAgIH0gd2hpbGUgKGxlbik7CiAKLSAgICAvKiByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW50byB1c2VyIGJ1ZmZlciAqLwotICAgIHJldHVybiAoaW50KWdvdDsgICAgICAgIC8qIGxlbiBoYWQgYmV0dGVyIGZpdCBpbiBpbnQgLS0gaW50ZXJmYWNlIGZsYXcgKi8KKyAgICAvKiByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW50byB1c2VyIGJ1ZmZlciAod2lsbCBmaXQgaW4gaW50KSAqLworICAgIHJldHVybiAoaW50KWdvdDsKIH0KIAogLyogLS0gc2VlIHpsaWIuaCAtLSAqLwpAQCAtNDQ4LDcgKzQ2Miw3IEBACiAgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwgc3RhdGUtPmVyciAhPSBaX09LKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAvKiB0cnkgb3V0cHV0IGJ1ZmZlciAqLworICAgIC8qIHRyeSBvdXRwdXQgYnVmZmVyIChubyBuZWVkIHRvIGNoZWNrIGZvciBza2lwIHJlcXVlc3QpICovCiAgICAgaWYgKHN0YXRlLT5oYXZlKSB7CiAgICAgICAgIHN0YXRlLT5oYXZlLS07CiAgICAgICAgIHN0YXRlLT5wb3MrKzsKQEAgLTQ5Niw5ICs1MTAsMTEgQEAKICAgICAgICAgcmV0dXJuIGM7CiAgICAgfQogCi0gICAgLyogaWYgbm8gcm9vbSwgZ2l2ZSB1cCAobXVzdCBoYXZlIGFscmVhZHkgZG9uZSBhIGd6X3VuZ2V0YygpKSAqLwotICAgIGlmIChzdGF0ZS0+aGF2ZSA9PSAoc3RhdGUtPnNpemUgPDwgMSkpCisgICAgLyogaWYgbm8gcm9vbSwgZ2l2ZSB1cCAobXVzdCBoYXZlIGFscmVhZHkgZG9uZSBhIGd6dW5nZXRjKCkpICovCisgICAgaWYgKHN0YXRlLT5oYXZlID09IChzdGF0ZS0+c2l6ZSA8PCAxKSkgeworICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9CVUZfRVJST1IsICJvdXQgb2Ygcm9vbSB0byBwdXNoIGNoYXJhY3RlcnMiKTsKICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAogICAgIC8qIHNsaWRlIG91dHB1dCBkYXRhIGlmIG5lZWRlZCBhbmQgaW5zZXJ0IGJ5dGUgYmVmb3JlIGV4aXN0aW5nIGRhdGEgKi8KICAgICBpZiAoc3RhdGUtPm5leHQgPT0gc3RhdGUtPm91dCkgewpkaWZmIC0tZ2l0IGEvZ3p3cml0ZS5jIGIvZ3p3cml0ZS5jCmluZGV4IDY1YTEzYzMuLmM3YzAzM2EgMTAwNjQ0Ci0tLSBhL2d6d3JpdGUuYworKysgYi9nendyaXRlLmMKQEAgLTIwLDE1ICsyMCw2IEBACiAgICAgaW50IHJldDsKICAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOwogCi0gICAgLyogY2hlY2sgdmVyc2lvbiBvZiB6bGliIC0tIG5lZWQgMS4yLjEgb3IgbGF0ZXIgZm9yIGd6aXAgZGVmbGF0ZSgpICovCi0jaWZkZWYgWkxJQl9WRVJOVU0KLSAgICBpZiAoWkxJQl9WRVJOVU0gPCAweDEyMTApCi0jZW5kaWYKLSAgICB7Ci0gICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX1ZFUlNJT05fRVJST1IsICJuZWVkIHpsaWIgMS4yLjEgb3IgbGF0ZXIiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQogICAgIC8qIGFsbG9jYXRlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyAqLwogICAgIHN0YXRlLT5pbiA9IG1hbGxvYyhzdGF0ZS0+d2FudCk7CiAgICAgc3RhdGUtPm91dCA9IG1hbGxvYyhzdGF0ZS0+d2FudCk7CkBAIC0xNjksNiArMTYwLDE3IEBACiAgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFIHx8IHN0YXRlLT5lcnIgIT0gWl9PSykKICAgICAgICAgcmV0dXJuIC0xOwogCisgICAgLyogc2luY2UgYW4gaW50IGlzIHJldHVybmVkLCBtYWtlIHN1cmUgbGVuIGZpdHMgaW4gb25lLCBvdGhlcndpc2UgcmV0dXJuCisgICAgICAgd2l0aCBhbiBlcnJvciAodGhpcyBhdm9pZHMgdGhlIGZsYXcgaW4gdGhlIGludGVyZmFjZSkgKi8KKyAgICBpZiAoKGludClsZW4gPCAwKSB7CisgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0JVRl9FUlJPUiwgInJlcXVlc3RlZCBsZW5ndGggZG9lcyBub3QgZml0IGluIGludCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogaWYgbGVuIGlzIHplcm8sIGF2b2lkIHVubmVjZXNzYXJ5IG9wZXJhdGlvbnMgKi8KKyAgICBpZiAobGVuID09IDApCisgICAgICAgIHJldHVybiAwOworCiAgICAgLyogYWxsb2NhdGUgbWVtb3J5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCAqLwogICAgIGlmIChzdGF0ZS0+c2l6ZSA9PSAwICYmIGd6X2luaXQoc3RhdGUpID09IC0xKQogICAgICAgICByZXR1cm4gLTE7CkBAIC0xODMsNyArMTg1LDcgQEAKICAgICAvKiBmb3Igc21hbGwgbGVuLCBjb3B5IHRvIGlucHV0IGJ1ZmZlciwgb3RoZXJ3aXNlIGNvbXByZXNzIGRpcmVjdGx5ICovCiAgICAgaWYgKGxlbiA8IHN0YXRlLT5zaXplKSB7CiAgICAgICAgIC8qIGNvcHkgdG8gaW5wdXQgYnVmZmVyLCBjb21wcmVzcyB3aGVuIGZ1bGwgKi8KLSAgICAgICAgd2hpbGUgKGxlbikgeworICAgICAgICBkbyB7CiAgICAgICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCkKICAgICAgICAgICAgICAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOwogICAgICAgICAgICAgbiA9IHN0YXRlLT5zaXplIC0gc3RybS0+YXZhaWxfaW47CkBAIC0xOTIsMTEgKzE5NCwxMSBAQAogICAgICAgICAgICAgbWVtY3B5KHN0cm0tPm5leHRfaW4gKyBzdHJtLT5hdmFpbF9pbiwgYnVmLCBuKTsKICAgICAgICAgICAgIHN0cm0tPmF2YWlsX2luICs9IG47CiAgICAgICAgICAgICBzdGF0ZS0+cG9zICs9IG47Ci0gICAgICAgICAgICBidWYgKz0gbjsKKyAgICAgICAgICAgIGJ1ZiA9IChjaGFyICopYnVmICsgbjsKICAgICAgICAgICAgIGxlbiAtPSBuOwogICAgICAgICAgICAgaWYgKGxlbiAmJiBnel9jb21wKHN0YXRlLCBaX05PX0ZMVVNIKSA9PSAtMSkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAobGVuKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIC8qIGNvbnN1bWUgd2hhdGV2ZXIncyBsZWZ0IGluIHRoZSBpbnB1dCBidWZmZXIgKi8KQEAgLTIxMSw3ICsyMTMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIC8qIGlucHV0IHdhcyBhbGwgYnVmZmVyZWQgb3IgY29tcHJlc3NlZCAqLworICAgIC8qIGlucHV0IHdhcyBhbGwgYnVmZmVyZWQgb3IgY29tcHJlc3NlZCAocHV0IHdpbGwgZml0IGluIGludCkgKi8KICAgICByZXR1cm4gKGludClwdXQ7CiB9CiAKQEAgLTMzMiwxMiArMzM0LDEwIEBACiAgICAgaWYgKGxlbiA8PSAwIHx8IGxlbiA+PSAoaW50KXNpemUgfHwgc3RhdGUtPmluW3NpemUgLSAxXSAhPSAwKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIC8qIHdyaXRlIG91dCByZXN1bHQgb2YgcHJpbnRmKCkgKi8KKyAgICAvKiB1cGRhdGUgYnVmZmVyIGFuZCBwb3NpdGlvbiwgZGVmZXIgY29tcHJlc3Npb24gdW50aWwgbmVlZGVkICovCiAgICAgc3RybS0+YXZhaWxfaW4gPSAodW5zaWduZWQpbGVuOwogICAgIHN0cm0tPm5leHRfaW4gPSBzdGF0ZS0+aW47CiAgICAgc3RhdGUtPnBvcyArPSBsZW47Ci0gICAgaWYgKGd6X2NvbXAoc3RhdGUsIFpfTk9fRkxVU0gpID09IC0xKQotICAgICAgICByZXR1cm4gMDsKICAgICByZXR1cm4gbGVuOwogfQogCkBAIC00MDgsMTIgKzQwOCwxMCBAQAogICAgIGlmIChsZW4gPD0gMCB8fCBsZW4gPj0gKGludClzaXplIHx8IHN0YXRlLT5pbltzaXplIC0gMV0gIT0gMCkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAvKiB3cml0ZSBvdXQgcmVzdWx0IG9mIHByaW50ZigpICovCisgICAgLyogdXBkYXRlIGJ1ZmZlciBhbmQgcG9zaXRpb24sIGRlZmVyIGNvbXByZXNzaW9uIHVudGlsIG5lZWRlZCAqLwogICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKWxlbjsKICAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOwogICAgIHN0YXRlLT5wb3MgKz0gbGVuOwotICAgIGlmIChnel9jb21wKHN0YXRlLCBaX05PX0ZMVVNIKSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIDA7CiAgICAgcmV0dXJuIGxlbjsKIH0KIApkaWZmIC0tZ2l0IGEvaW5mbGF0ZS5jIGIvaW5mbGF0ZS5jCmluZGV4IGU3ZjNjZGQuLjQwYzBlYzggMTAwNjQ0Ci0tLSBhL2luZmxhdGUuYworKysgYi9pbmZsYXRlLmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogICAgIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqLwogICAgIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKQogICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgaWYgKHN0YXRlLT53Yml0cyAhPSB3aW5kb3dCaXRzICYmIHN0YXRlLT53aW5kb3cgIT0gWl9OVUxMKSB7CisgICAgaWYgKHN0YXRlLT53Yml0cyAhPSAodW5zaWduZWQpd2luZG93Qml0cyAmJiBzdGF0ZS0+d2luZG93ICE9IFpfTlVMTCkgewogICAgICAgICBaRlJFRShzdHJtLCBzdGF0ZS0+d2luZG93KTsKICAgICAgICAgc3RhdGUtPndpbmRvdyA9IFpfTlVMTDsKICAgICB9CkBAIC0xNDU4LDggKzE0NTgsOCBAQAogCiAgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUgogICAgIHN0YXRlLT5zYW5lID0gIXN1YnZlcnQ7CisjaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSCiAgICAgcmV0dXJuIFpfT0s7CiAjZWxzZQogICAgIHN0YXRlLT5zYW5lID0gMTsKZGlmZiAtLWdpdCBhL2luZnRyZWVzLmMgYi9pbmZ0cmVlcy5jCmluZGV4IDIxZjRkZmIuLmFlODlkOTcgMTAwNjQ0Ci0tLSBhL2luZnRyZWVzLmMKKysrIGIvaW5mdHJlZXMuYwpAQCAtOSw3ICs5LDcgQEAKICNkZWZpbmUgTUFYQklUUyAxNQogCiBjb25zdCBjaGFyIGluZmxhdGVfY29weXJpZ2h0W10gPQotICAgIiBpbmZsYXRlIDEuMi4zLjUgQ29weXJpZ2h0IDE5OTUtMjAxMCBNYXJrIEFkbGVyICI7CisgICAiIGluZmxhdGUgMS4yLjMuNiBDb3B5cmlnaHQgMTk5NS0yMDEwIE1hcmsgQWRsZXIgIjsKIC8qCiAgIElmIHlvdSB1c2UgdGhlIHpsaWIgbGlicmFyeSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGlzIHdlbGNvbWUKICAgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgeW91ciBwcm9kdWN0LiBJZiBmb3Igc29tZSByZWFzb24geW91IGNhbm5vdApAQCAtNjIsNyArNjIsNyBAQAogICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMH07CiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxleHRbMzFdID0geyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgZXh0cmEgKi8KICAgICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsCi0gICAgICAgIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDE2LCA2OSwgMTk5fTsKKyAgICAgICAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDE5OSwgNzB9OwogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkYmFzZVszMl0gPSB7IC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi8KICAgICAgICAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLAogICAgICAgICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsCmRpZmYgLS1naXQgYS9tYWtlX3Ztcy5jb20gYi9tYWtlX3Ztcy5jb20KaW5kZXggZTNlODc0MC4uZmM1ZmQwYyAxMDA2NDQKLS0tIGEvbWFrZV92bXMuY29tCisrKyBiL21ha2Vfdm1zLmNvbQpAQCAtMTEsMTUgKzExLDE4IEBACiAkISBWZXJzaW9uIGhpc3RvcnkKICQhIDAuMDEgMjAwNjAxMjAgRmlyc3QgdmVyc2lvbiB0byByZWNlaXZlIGEgbnVtYmVyCiAkISAwLjAyIDIwMDYxMDA4IEFkYXB0IHRvIG5ldyBNYWtlZmlsZS5pbgorJCEgMC4wMyAyMDA5MTIyNCBBZGQgc3VwcG9ydCBmb3IgbGFyZ2UgZmlsZSBjaGVjaworJCEgMC4wNCAyMDEwMDExMCBBZGQgbmV3IGd6Y2xvc2UsIGd6bGliLCBnenJlYWQsIGd6d3JpdGUKICQhCiAkIG9uIGVycm9yIHRoZW4gZ290byBlcnJfZXhpdAogJCEKLSQhCi0kISBKdXN0IHNvbWUgZ2VuZXJhbCBjb25zdGFudHMuLi4KLSQhCiAkIHRydWUgID0gMQogJCBmYWxzZSA9IDAKICQgdG1wbmFtID0gInRlbXBfIiArIGYkZ2V0anBpKCIiLCJwaWQiKQorJCB0dCA9IHRtcG5hbSArICIudHh0IgorJCB0YyA9IHRtcG5hbSArICIuYyIKKyQgdGggPSB0bXBuYW0gKyAiLmgiCiskIGRlZmluZS9ub2xvZyB0Y29uZmlnICd0aCcKICQgaXRzX2RlY2MgPSBmYWxzZQogJCBpdHNfdmF4YyA9IGZhbHNlCiAkIGl0c19nbnVjID0gZmFsc2UKQEAgLTI3LDE3ICszMCwyNSBAQAogJCEKICQhIFNldHVwIHZhcmlhYmxlcyBob2xkaW5nICJjb25maWciIGluZm9ybWF0aW9uCiAkIQotJCBNYWtlICAgICA9ICIiCiskIE1ha2UgICAgPSAiIgogJCBuYW1lICAgICA9ICJabGliIgogJCB2ZXJzaW9uICA9ICI/Lj8uPyIKICQgdl9zdHJpbmcgPSAiWkxJQl9WRVJTSU9OIgogJCB2X2ZpbGUgICA9ICJ6bGliLmgiCi0kIGNjb3B0ICAgID0gIiIKLSQgbG9wdHMgICAgPSAiIgorJCBjY29wdCAgID0gIiIKKyQgbG9wdHMgICA9ICIiCiAkIGRuc3JsICAgPSAiIgorJCBhY29uZl9pbl9maWxlID0gImNvbmZpZy5oaW4iCiskIGNvbmZfY2hlY2tfc3RyaW5nID0gIiIKICQgbGlua29ubHkgPSBmYWxzZQogJCBvcHRmaWxlICA9IG5hbWUgKyAiLm9wdCIKLSQgYXhwICAgICAgPSBmJGdldHN5aSgiSFdfTU9ERUwiKS5nZS4xMDI0CiskIGxpYmRlZnMgID0gIiIgCiskIGF4cCAgICAgID0gZiRnZXRzeWkoIkhXX01PREVMIikuZ2UuMTAyNCAuYW5kLiBmJGdldHN5aSgiSFdfTU9ERUwiKS5sdC40MDk2CiskIQorJCB3aG9hbWkgPSBmJHBhcnNlKGYkZW52aW9ybm1lbnQoIlByb2NlZHVyZSIpLCwsLCJOT19DT05DRUFMIikKKyQgbXlkZWYgID0gRiRwYXJzZSh3aG9hbWksLCwiREVWSUNFIikKKyQgbXlkaXIgID0gZiRwYXJzZSh3aG9hbWksLCwiRElSRUNUT1JZIikgLSAiXVsiCiskIG15cHJvYyA9IGYkcGFyc2Uod2hvYW1pLCwsIk5hbWUiKSArIGYkcGFyc2Uod2hvYW1pLCwsInR5cGUiKQogJCEKICQhIENoZWNrIGZvciBNTUsvTU1TCiAkIQpAQCAtNDcsMTEgKzU4LDE2IEBACiAkIQogJCBnb3N1YiBmaW5kX3ZlcnNpb24KICQhCiskICBvcGVuL3dyaXRlIHRvcHQgdG1wLm9wdAorJCAgb3Blbi93cml0ZSBvcHRmICdvcHRmaWxlJworJCEKICQgZ29zdWIgY2hlY2tfb3B0cwogJCEKICQhIExvb2sgZm9yIHRoZSBjb21waWxlciB1c2VkCiAkIQogJCBnb3N1YiBjaGVja19jb21waWxlcgorJCBjbG9zZSB0b3B0CiskIQogJCBpZiBpdHNfZGVjYwogJCB0aGVuCiAkICAgY2NvcHQgPSAiL3ByZWZpeD1hbGwiICsgY2NvcHQKQEAgLTcxLDYgKzg3LDQ5IEBACiAkICAgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgogJCBlbmRpZgogJCEKKyQhIEJ1aWxkIGEgZmFrZSBjb25maWd1cmUgaW5wdXQgaGVhZGVyIAorJCEKKyQgb3Blbi93cml0ZSBjb25mX2hpbiBjb25maWcuaGluCiskIHdyaXRlIGNvbmZfaGluICIjdW5kZWYgX0xBUkdFRklMRTY0X1NPVVJDRSIKKyQgY2xvc2UgY29uZl9oaW4KKyQhCiskIQorJCBpID0gMAorJEZJTkRfQUNPTkY6CiskIGZuYW1lID0gZiRlbGVtZW50KGksIiMiLGFjb25mX2luX2ZpbGUpCiskIGlmIGZuYW1lIC5lcXMuICIjIiB0aGVuIGdvdG8gQU1JU1NfRVJSCiskIGlmIGYkc2VhcmNoKGZuYW1lKSAuZXFzLiAiIgorJCB0aGVuIAorJCAgIGkgPSBpICsgMQorJCAgIGdvdG8gZmluZF9hY29uZgorJCBlbmRpZgorJCBvcGVuL3JlYWQvZXJyPWFjb25mX2VyciBhY29uZl9pbiAnZm5hbWUnCiskIG9wZW4vd3JpdGUgYWNvbmYgemxpYmRlZnMuaAorJEFDT05GX0xPT1A6CiskIHJlYWQvZW5kX29mX2ZpbGU9YWNvbmZfZXhpdCBhY29uZl9pbiBsaW5lCiskIHdvcmsgPSBmJGVkaXQobGluZSwgImNvbXByZXNzLHRyaW0iKQorJCBpZiBmJGV4dHJhY3QoMCw2LHdvcmspIC5uZXMuICIjdW5kZWYiCiskIHRoZW4KKyQgICB3cml0ZSBhY29uZiBsaW5lCiskIGVsc2UKKyQgICBjZGVmID0gZiRlbGVtZW50KDEsIiAiLHdvcmspCiskICAgZ29zdWIgY2hlY2tfY29uZmlnCiskIGVuZGlmCiskIGdvdG8gYWNvbmZfbG9vcAorJEFDT05GX0VYSVQ6CiskIHdyaXRlIGFjb25mICIjZGVmaW5lIFZNUyAxIgorJCB3cml0ZSBhY29uZiAiI2luY2x1ZGUgPHVuaXN0ZC5oPiIKKyQgd3JpdGUgYWNvbmYgIiNpbmNsdWRlIDx1bml4aW8uaD4iCiskIHdyaXRlIGFjb25mICIjaWZkZWYgX0xBUkdFRklMRSIKKyQgd3JpdGUgYWNvbmYgIiNkZWZpbmUgb2ZmNjRfdCBfX29mZjY0X3QiCiskIHdyaXRlIGFjb25mICIjZGVmaW5lIGZvcGVuNjQgZm9wZW4iCiskIHdyaXRlIGFjb25mICIjZGVmaW5lIGZzZWVrbzY0IGZzZWVrbyIKKyQgd3JpdGUgYWNvbmYgIiNkZWZpbmUgbHNlZWs2NCBsc2VlayIKKyQgd3JpdGUgYWNvbmYgIiNkZWZpbmUgZnRlbGxvNjQgZnRlbGwiCiskIHdyaXRlIGFjb25mICIjZW5kaWYiCiskIGNsb3NlIGFjb25mX2luCiskIGNsb3NlIGFjb25mCiskIGRlbGV0ZSAndGgnOyoKICQhIEJ1aWxkIHRoZSB0aGluZyBwbGFpbiBvciB3aXRoIG1tcwogJCEKICQgd3JpdGUgc3lzJG91dHB1dCAiQ29tcGlsaW5nIFpsaWIgc291cmNlcyAuLi4iCkBAIC04NiwxNSArMTQ1LDE1IEBACiAkICAgQ0FMTCBNQUtFIGRlZmxhdGUuT0JKICJDQyAnJ0NDT1BUJyBkZWZsYXRlIiAtCiAgICAgICAgICAgICAgICAgZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHpsaWJkZWZzLmgKICQgICBDQUxMIE1BS0UgZ3pjbG9zZS5PQkogIkNDICcnQ0NPUFQnIGd6Y2xvc2UiIC0KLSAgICAgICAgICAgICAgICBnemNsb3NlLmMgemxpYi5oIHpjb25mLmggemxpYmRlZnMuaCBnemd1dHMuaAorICAgICAgICAgICAgICAgIGd6Y2xvc2UuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHpsaWJkZWZzLmgKICQgICBDQUxMIE1BS0UgZ3ppby5PQkogIkNDICcnQ0NPUFQnIGd6aW8iIC0KICAgICAgICAgICAgICAgICBnemlvLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCB6bGliZGVmcy5oCiAkICAgQ0FMTCBNQUtFIGd6bGliLk9CSiAiQ0MgJydDQ09QVCcgZ3psaWIiIC0KLSAgICAgICAgICAgICAgICBnemxpYi5jIHpsaWIuaCB6Y29uZi5oIHpsaWJkZWZzLmggZ3pndXRzLmgKKyAgICAgICAgICAgICAgICBnemxpYi5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggemxpYmRlZnMuaAogJCAgIENBTEwgTUFLRSBnenJlYWQuT0JKICJDQyAnJ0NDT1BUJyBnenJlYWQiIC0KLSAgICAgICAgICAgICAgICBnenJlYWQuYyB6bGliLmggemNvbmYuaCB6bGliZGVmcy5oIGd6Z3V0cy5oCisgICAgICAgICAgICAgICAgZ3pyZWFkLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCB6bGliZGVmcy5oCiAkICAgQ0FMTCBNQUtFIGd6d3JpdGUuT0JKICJDQyAnJ0NDT1BUJyBnendyaXRlIiAtCi0gICAgICAgICAgICAgICAgZ3p3cml0ZS5jIHpsaWIuaCB6Y29uZi5oIHpsaWJkZWZzLmggZ3pndXRzLmgKKyAgICAgICAgICAgICAgICBnendyaXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCB6bGliZGVmcy5oCiAkICAgQ0FMTCBNQUtFIGluZmJhY2suT0JKICJDQyAnJ0NDT1BUJyBpbmZiYWNrIiAtCiAgICAgICAgICAgICAgICAgaW5mYmFjay5jIHp1dGlsLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oIGluZmZpeGVkLmgKICQgICBDQUxMIE1BS0UgaW5mZmFzdC5PQkogIkNDICcnQ0NPUFQnIGluZmZhc3QiIC0KQEAgLTE1Myw2ICsyMTIsMTQgQEAKICRFUlJfRVhJVDoKICQgc2V0IG1lc3NhZ2UvZmFjaWwvaWRlbnQvc2V2ZXIvdGV4dAogJCBjbG9zZS9ub2xvZyBvcHRmCiskIGNsb3NlL25vbG9nIHRvcHQKKyQgY2xvc2Uvbm9sb2cgY29uZl9oaW4KKyQgY2xvc2Uvbm9sb2cgYWNvbmZfaW4KKyQgY2xvc2Uvbm9sb2cgYWNvbmYKKyQgY2xvc2Uvbm9sb2cgb3V0CiskIGNsb3NlL25vbG9nIG1pbgorJCBjbG9zZS9ub2xvZyBtb2QKKyQgY2xvc2Uvbm9sb2cgaF9pbgogJCB3cml0ZSBzeXMkb3V0cHV0ICJFeGl0aW5nLi4uIgogJCBleGl0IDIKICQhCkBAIC0yMDAsNjEgKzI2Nyw3MiBAQAogJCEKICQhIENoZWNrIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZCBzZXQgc3ltYm9scyBhY2NvcmRpbmdseQogJCEKKyQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskISBWZXJzaW9uIGhpc3RvcnkKKyQhIDAuMDEgMjAwNDEyMDYgRmlyc3QgdmVyc2lvbiB0byByZWNlaXZlIGEgbnVtYmVyCiskISAwLjAyIDIwMDYwMTI2IEFkZCBuZXcgIkhFTFAiIHRhcmdldAogJCBDSEVDS19PUFRTOgogJCBpID0gMQogJCBPUFRfTE9PUDoKICQgaWYgaSAubHQuIDkKICQgdGhlbgogJCAgIGNwYXJtID0gZiRlZGl0KHAnaScsInVwY2FzZSIpCi0kICAgaWYgY3Bhcm0gLmVxcy4gIkRFQlVHIgorJCEKKyQhIENoZWNrIGlmIHBhcmFtZXRlciBhY3R1YWxseSBjb250YWlucyBzb21ldGhpbmcKKyQhCiskICAgaWYgZiRlZGl0KGNwYXJtLCJ0cmltIikgLm5lcy4gIiIKICQgICB0aGVuCi0kICAgICBjY29wdCA9IGNjb3B0ICsgIi9ub29wdC9kZWIiCi0kICAgICBsb3B0cyA9IGxvcHRzICsgIi9kZWIiCi0kICAgZW5kaWYKLSQgICBpZiBmJGxvY2F0ZSgiQ0NPUFQ9IixjcGFybSkgLmx0LiBmJGxlbmd0aChjcGFybSkKLSQgICB0aGVuCi0kICAgICBzdGFydCA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCi0kICAgICBsZW4gICA9IGYkbGVuZ3RoKGNwYXJtKSAtIHN0YXJ0Ci0kICAgICBjY29wdCA9IGNjb3B0ICsgZiRleHRyYWN0KHN0YXJ0LGxlbixjcGFybSkKLSQgICAgIGlmIGYkbG9jYXRlKCJBU19JUyIsZiRlZGl0KGNjb3B0LCJVUENBU0UiKSkgLmx0LiBmJGxlbmd0aChjY29wdCkgLQotICAgICAgICAgdGhlbiBzX2Nhc2UgPSB0cnVlCi0kICAgZW5kaWYKLSQgICBpZiBjcGFybSAuZXFzLiAiTElOSyIgdGhlbiBsaW5rb25seSA9IHRydWUKLSQgICBpZiBmJGxvY2F0ZSgiTE9QVFM9IixjcGFybSkgLmx0LiBmJGxlbmd0aChjcGFybSkKLSQgICB0aGVuCi0kICAgICBzdGFydCA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCi0kICAgICBsZW4gICA9IGYkbGVuZ3RoKGNwYXJtKSAtIHN0YXJ0Ci0kICAgICBsb3B0cyA9IGxvcHRzICsgZiRleHRyYWN0KHN0YXJ0LGxlbixjcGFybSkKLSQgICBlbmRpZgotJCAgIGlmIGYkbG9jYXRlKCJDQz0iLGNwYXJtKSAubHQuIGYkbGVuZ3RoKGNwYXJtKQotJCAgIHRoZW4KLSQgICAgIHN0YXJ0ICA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCi0kICAgICBsZW4gICAgPSBmJGxlbmd0aChjcGFybSkgLSBzdGFydAotJCAgICAgY2NfY29tID0gZiRleHRyYWN0KHN0YXJ0LGxlbixjcGFybSkKLSAgICAgIGlmIChjY19jb20gLm5lcy4gIkRFQ0MiKSAuYW5kLiAtCi0gICAgICAgICAoY2NfY29tIC5uZXMuICJWQVhDIikgLmFuZC4gLQotCSAoY2NfY29tIC5uZXMuICJHTlVDIikKKyQgICAgIGlmIGNwYXJtIC5lcXMuICJERUJVRyIKICQgICAgIHRoZW4KLSQgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiVW5zdXBwb3J0ZWQgY29tcGlsZXIgY2hvaWNlICcnY2NfY29tJyBpZ25vcmVkIgotJCAgICAgICB3cml0ZSBzeXMkb3V0cHV0ICJVc2UgREVDQywgVkFYQywgb3IgR05VQyBpbnN0ZWFkIgotJCAgICAgZWxzZQotJCAgICAgCWlmIGNjX2NvbSAuZXFzLiAiREVDQyIgdGhlbiBpdHNfZGVjYyA9IHRydWUKLSQgICAgIAlpZiBjY19jb20gLmVxcy4gIlZBWEMiIHRoZW4gaXRzX3ZheGMgPSB0cnVlCi0kICAgICAJaWYgY2NfY29tIC5lcXMuICJHTlVDIiB0aGVuIGl0c19nbnVjID0gdHJ1ZQorJCAgICAgICBjY29wdCA9IGNjb3B0ICsgIi9ub29wdC9kZWIiCiskICAgICAgIGxvcHRzID0gbG9wdHMgKyAiL2RlYiIKICQgICAgIGVuZGlmCi0kICAgZW5kaWYKLSQgICBpZiBmJGxvY2F0ZSgiTUFLRT0iLGNwYXJtKSAubHQuIGYkbGVuZ3RoKGNwYXJtKQotJCAgIHRoZW4KLSQgICAgIHN0YXJ0ICA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCi0kICAgICBsZW4gICAgPSBmJGxlbmd0aChjcGFybSkgLSBzdGFydAotJCAgICAgbW1rcyA9IGYkZXh0cmFjdChzdGFydCxsZW4sY3Bhcm0pCi0kICAgICBpZiAobW1rcyAuZXFzLiAiTU1LIikgLm9yLiAobW1rcyAuZXFzLiAiTU1TIikKKyQgICAgIGlmIGYkbG9jYXRlKCJDQ09QVD0iLGNwYXJtKSAubHQuIGYkbGVuZ3RoKGNwYXJtKQogJCAgICAgdGhlbgotJCAgICAgICBtYWtlID0gbW1rcwotJCAgICAgZWxzZQotJCAgICAgICB3cml0ZSBzeXMkb3V0cHV0ICJVbnN1cHBvcnRlZCBtYWtlIGNob2ljZSAnJ21ta3MnIGlnbm9yZWQiCi0kICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIlVzZSBNTUsgb3IgTU1TIGluc3RlYWQiCiskICAgICAgIHN0YXJ0ID0gZiRsb2NhdGUoIj0iLGNwYXJtKSArIDEKKyQgICAgICAgbGVuICAgPSBmJGxlbmd0aChjcGFybSkgLSBzdGFydAorJCAgICAgICBjY29wdCA9IGNjb3B0ICsgZiRleHRyYWN0KHN0YXJ0LGxlbixjcGFybSkKKyQgICAgICAgaWYgZiRsb2NhdGUoIkFTX0lTIixmJGVkaXQoY2NvcHQsIlVQQ0FTRSIpKSAubHQuIGYkbGVuZ3RoKGNjb3B0KSAtCisgICAgICAgICAgdGhlbiBzX2Nhc2UgPSB0cnVlCiAkICAgICBlbmRpZgorJCAgICAgaWYgY3Bhcm0gLmVxcy4gIkxJTksiIHRoZW4gbGlua29ubHkgPSB0cnVlCiskICAgICBpZiBmJGxvY2F0ZSgiTE9QVFM9IixjcGFybSkgLmx0LiBmJGxlbmd0aChjcGFybSkKKyQgICAgIHRoZW4KKyQgICAgICAgc3RhcnQgPSBmJGxvY2F0ZSgiPSIsY3Bhcm0pICsgMQorJCAgICAgICBsZW4gICA9IGYkbGVuZ3RoKGNwYXJtKSAtIHN0YXJ0CiskICAgICAgIGxvcHRzID0gbG9wdHMgKyBmJGV4dHJhY3Qoc3RhcnQsbGVuLGNwYXJtKQorJCAgICAgZW5kaWYKKyQgICAgIGlmIGYkbG9jYXRlKCJDQz0iLGNwYXJtKSAubHQuIGYkbGVuZ3RoKGNwYXJtKQorJCAgICAgdGhlbgorJCAgICAgICBzdGFydCAgPSBmJGxvY2F0ZSgiPSIsY3Bhcm0pICsgMQorJCAgICAgICBsZW4gICAgPSBmJGxlbmd0aChjcGFybSkgLSBzdGFydAorJCAgICAgICBjY19jb20gPSBmJGV4dHJhY3Qoc3RhcnQsbGVuLGNwYXJtKQorICAgICAgICBpZiAoY2NfY29tIC5uZXMuICJERUNDIikgLmFuZC4gLQorICAgICAgICAgICAoY2NfY29tIC5uZXMuICJWQVhDIikgLmFuZC4gLQorICAgICAgICAgICAoY2NfY29tIC5uZXMuICJHTlVDIikKKyQgICAgICAgdGhlbgorJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIlVuc3VwcG9ydGVkIGNvbXBpbGVyIGNob2ljZSAnJ2NjX2NvbScgaWdub3JlZCIKKyQgICAgICAgICB3cml0ZSBzeXMkb3V0cHV0ICJVc2UgREVDQywgVkFYQywgb3IgR05VQyBpbnN0ZWFkIgorJCAgICAgICBlbHNlCiskICAgICAgICAgaWYgY2NfY29tIC5lcXMuICJERUNDIiB0aGVuIGl0c19kZWNjID0gdHJ1ZQorJCAgICAgICAgIGlmIGNjX2NvbSAuZXFzLiAiVkFYQyIgdGhlbiBpdHNfdmF4YyA9IHRydWUKKyQgICAgICAgICBpZiBjY19jb20gLmVxcy4gIkdOVUMiIHRoZW4gaXRzX2dudWMgPSB0cnVlCiskICAgICAgIGVuZGlmCiskICAgICBlbmRpZgorJCAgICAgaWYgZiRsb2NhdGUoIk1BS0U9IixjcGFybSkgLmx0LiBmJGxlbmd0aChjcGFybSkKKyQgICAgIHRoZW4KKyQgICAgICAgc3RhcnQgID0gZiRsb2NhdGUoIj0iLGNwYXJtKSArIDEKKyQgICAgICAgbGVuICAgID0gZiRsZW5ndGgoY3Bhcm0pIC0gc3RhcnQKKyQgICAgICAgbW1rcyA9IGYkZXh0cmFjdChzdGFydCxsZW4sY3Bhcm0pCiskICAgICAgIGlmIChtbWtzIC5lcXMuICJNTUsiKSAub3IuIChtbWtzIC5lcXMuICJNTVMiKQorJCAgICAgICB0aGVuCiskICAgICAgICAgbWFrZSA9IG1ta3MKKyQgICAgICAgZWxzZQorJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIlVuc3VwcG9ydGVkIG1ha2UgY2hvaWNlICcnbW1rcycgaWdub3JlZCIKKyQgICAgICAgICB3cml0ZSBzeXMkb3V0cHV0ICJVc2UgTU1LIG9yIE1NUyBpbnN0ZWFkIgorJCAgICAgICBlbmRpZgorJCAgICAgZW5kaWYKKyQgICAgIGlmIGNwYXJtIC5lcXMuICJIRUxQIiB0aGVuIGdvc3ViIGJoZWxwCiAkICAgZW5kaWYKICQgICBpID0gaSArIDEKICQgICBnb3RvIG9wdF9sb29wCkBAIC0yNjcsNiArMzQ1LDggQEAKICQhIFZlcnNpb24gaGlzdG9yeQogJCEgMC4wMSAyMDA0MDIyMyBGaXJzdCB2ZXJzaW9uIHRvIHJlY2VpdmUgYSBudW1iZXIKICQhIDAuMDIgMjAwNDAyMjkgU2F2ZS9zZXQgdmFsdWUgb2YgZGVjYyRub19yb290ZWRfc2VhcmNoX2xpc3RzCiskISAwLjAzIDIwMDYwMjAyIEV4dGVuZCBoYW5kbGluZyBvZiBHTlUgQworJCEgMC4wNCAyMDA5MDQwMiBDb21wYXEgLT4gaHAKICRDSEVDS19DT01QSUxFUjoKICQgaWYgKC5ub3QuIChpdHNfZGVjYyAub3IuIGl0c192YXhjIC5vci4gaXRzX2dudWMpKQogJCB0aGVuCkBAIC0yODIsMTUgKzM2MiwyMSBAQAogJCBlbHNlCiAkICAgaWYgaXRzX2RlY2MKICQgICB0aGVuCi0kICAgICB3cml0ZSBzeXMkb3V0cHV0ICJDQyBjb21waWxlciBjaGVjayAuLi4gQ29tcGFxIEMiCiskICAgICB3cml0ZSBzeXMkb3V0cHV0ICJDQyBjb21waWxlciBjaGVjayAuLi4gaHAgQyIKICQgICAgIGlmIGYkdHJubG5tKCJkZWNjJG5vX3Jvb3RlZF9zZWFyY2hfbGlzdHMiKSAubmVzLiAiIgogJCAgICAgdGhlbgogJCAgICAgICBkbnJzbCA9IGYkdHJubG5tKCJkZWNjJG5vX3Jvb3RlZF9zZWFyY2hfbGlzdHMiKQogJCAgICAgZW5kaWYKLSQgICAgIGRlZmluZSBkZWNjJG5vX3Jvb3RlZF9zZWFyY2hfbGlzdHMgMQorJCAgICAgZGVmaW5lL25vbG9nIGRlY2Mkbm9fcm9vdGVkX3NlYXJjaF9saXN0cyAxCiAkICAgZWxzZQogJCAgICAgaWYgaXRzX3ZheGMgdGhlbiB3cml0ZSBzeXMkb3V0cHV0ICJDQyBjb21waWxlciBjaGVjayAuLi4gVkFYIEMiCi0kICAgICBpZiBpdHNfZ251YyB0aGVuIHdyaXRlIHN5cyRvdXRwdXQgIkNDIGNvbXBpbGVyIGNoZWNrIC4uLiBHTlUgQyIKKyQgICAgIGlmIGl0c19nbnVjCiskICAgICB0aGVuCiskICAgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiQ0MgY29tcGlsZXIgY2hlY2sgLi4uIEdOVSBDIgorJCAgICAgICAgIGlmIGYkdHJubG5tKHRvcHQpIHRoZW4gd3JpdGUgdG9wdCAiZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9saWIiCiskICAgICAgICAgaWYgZiR0cm5sbm0ob3B0ZikgdGhlbiB3cml0ZSBvcHRmICJnbnVfY2M6WzAwMDAwMF1nY2NsaWIub2xiL2xpYiIKKyQgICAgICAgICBjYyA9ICJnY2MiCiskICAgICBlbmRpZgogJCAgICAgaWYgZiR0cm5sbm0odG9wdCkgdGhlbiB3cml0ZSB0b3B0ICJzeXMkc2hhcmU6dmF4Y3J0bC5leGUvc2hhcmUiCiAkICAgICBpZiBmJHRybmxubShvcHRmKSB0aGVuIHdyaXRlIG9wdGYgInN5cyRzaGFyZTp2YXhjcnRsLmV4ZS9zaGFyZSIKICQgICBlbmRpZgpAQCAtMzEwLDcgKzM5Niw4IEBACiAjIHdyaXR0ZW4gYnkgTWFydGluIFAuSi4gWmluc2VyCiAjIDx6aW5zZXJAemluc2VyLm5vLWlwLmluZm8gb3Igemluc2VyQHN5c2Rldi5kZXV0c2NoZS1ib2Vyc2UuY29tPgogCi1PQkpTID0gYWRsZXIzMi5vYmosIGNvbXByZXNzLm9iaiwgY3JjMzIub2JqLCBnemlvLm9iaiwgdW5jb21wci5vYmosIGluZmJhY2sub2JqXAorT0JKUyA9IGFkbGVyMzIub2JqLCBjb21wcmVzcy5vYmosIGNyYzMyLm9iaiwgZ3pjbG9zZS5vYmosIGd6aW8ub2JqLCBnemxpYi5vYmpcIAorICAgICAgIGd6cmVhZC5vYmosIGd6d3JpdGUub2JqLCB1bmNvbXByLm9iaiwgaW5mYmFjay5vYmpcCiAgICAgICAgZGVmbGF0ZS5vYmosIHRyZWVzLm9iaiwgenV0aWwub2JqLCBpbmZsYXRlLm9iaiwgXAogICAgICAgIGluZnRyZWVzLm9iaiwgaW5mZmFzdC5vYmoKIApAQCAtMzQyLDcgKzQyOSwxMSBAQAogY3JjMzIub2JqICAgIDogY3JjMzIuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHpsaWJkZWZzLmgKIGRlZmxhdGUub2JqICA6IGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaCB6bGliZGVmcy5oCiBleGFtcGxlLm9iaiAgOiBleGFtcGxlLmMgemxpYi5oIHpjb25mLmggemxpYmRlZnMuaAorZ3pjbG9zZS5vYmogIDogZ3pjbG9zZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggemxpYmRlZnMuaAogZ3ppby5vYmogICAgIDogZ3ppby5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggemxpYmRlZnMuaAorZ3psaWIub2JqICAgIDogZ3psaWIuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHpsaWJkZWZzLmgKK2d6cmVhZC5vYmogICA6IGd6cmVhZC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggemxpYmRlZnMuaAorZ3p3cml0ZS5vYmogIDogZ3p3cml0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggemxpYmRlZnMuaAogaW5mZmFzdC5vYmogIDogaW5mZmFzdC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggemxpYmRlZnMuaCBpbmZ0cmVlcy5oIGluZmZhc3QuaAogaW5mbGF0ZS5vYmogIDogaW5mbGF0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggemxpYmRlZnMuaAogaW5mdHJlZXMub2JqIDogaW5mdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHpsaWJkZWZzLmggaW5mdHJlZXMuaApAQCAtNDE2LDYgKzUwNywxNjkgQEAKICQgcmV0dXJuCiAkIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJCEKKyRDSEVDS19DT05GSUc6CiskIQorJCBpbl9sZGVmID0gZiRsb2NhdGUoY2RlZixsaWJkZWZzKQorJCBpZiAoaW5fbGRlZiAubHQuIGYkbGVuZ3RoKGxpYmRlZnMpKQorJCB0aGVuCiskICAgd3JpdGUgYWNvbmYgIiNkZWZpbmUgJydjZGVmJyAxIgorJCAgIGxpYmRlZnMgPSBmJGV4dHJhY3QoMCxpbl9sZGVmLGxpYmRlZnMpICsgLQorICAgICAgICAgICAgICBmJGV4dHJhY3QoaW5fbGRlZiArIGYkbGVuZ3RoKGNkZWYpICsgMSwgLQorICAgICAgICAgICAgICAgICAgICAgICAgZiRsZW5ndGgobGliZGVmcykgLSBpbl9sZGVmIC0gZiRsZW5ndGgoY2RlZikgLSAxLCAtCisgICAgICAgICAgICAgICAgICAgICAgICBsaWJkZWZzKQorJCBlbHNlCiskICAgaWYgKGYkdHlwZSgnY2RlZicpIC5lcXMuICJJTlRFR0VSIikKKyQgICB0aGVuCiskICAgICB3cml0ZSBhY29uZiAiI2RlZmluZSAnJ2NkZWYnICIsICdjZGVmJworJCAgIGVsc2UgCiskICAgICBpZiAoZiR0eXBlKCdjZGVmJykgLmVxcy4gIlNUUklORyIpCiskICAgICB0aGVuCiskICAgICAgIHdyaXRlIGFjb25mICIjZGVmaW5lICcnY2RlZicgIiwgIiIiIiwgJycnY2RlZicnLCAiIiIiCiskICAgICBlbHNlCiskICAgICAgIGdvc3ViIGNoZWNrX2NjX2RlZgorJCAgICAgZW5kaWYKKyQgICBlbmRpZgorJCBlbmRpZgorJCByZXR1cm4KKyQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIQorJCEgQ2hlY2sgaWYgdGhpcyBpcyBhIGRlZmluZSByZWxhdGluZyB0byB0aGUgcHJvcGVydGllcyBvZiB0aGUgQy9DKysKKyQhIGNvbXBpbGVyCiskIQorJCBDSEVDS19DQ19ERUY6CiskIGlmIChjZGVmIC5lcXMuICJfTEFSR0VGSUxFNjRfU09VUkNFIikKKyQgdGhlbgorJCAgIGNvcHkgc3lzJGlucHV0OiAndGMnCiskICAgZGVjaworI2luY2x1ZGUgInRjb25maWciCisjZGVmaW5lIF9MQVJHRUZJTEUKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbigpeworRklMRSAqZnA7CisgIGZwID0gZm9wZW4oInRlbXAudHh0IiwiciIpOworICBmc2Vla28oZnAsMSxTRUVLX1NFVCk7CisgIGZjbG9zZShmcCk7Cit9CisKKyQgICBlb2QKKyQgICB0ZXN0X2ludiA9IGZhbHNlCiskICAgY29tbV9oID0gZmFsc2UKKyQgICBnb3N1YiBjY19wcm9wX2NoZWNrCiskICAgcmV0dXJuCiskIGVuZGlmCiskIHdyaXRlIGFjb25mICIvKiAiLCBsaW5lLCAiICovIgorJCByZXR1cm4KKyQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIQorJCEgQ2hlY2sgZm9yIHByb3BlcnRpZXMgb2YgQy9DKysgY29tcGlsZXIKKyQhCiskISBWZXJzaW9uIGhpc3RvcnkKKyQhIDAuMDEgMjAwMzEwMjAgRmlyc3QgdmVyc2lvbiB0byByZWNlaXZlIGEgbnVtYmVyCiskISAwLjAyIDIwMDMxMDIyIEFkZGVkIGxvZ2ljIGZvciBkZWZpbmVzIHdpdGggdmFsdWUKKyQhIDAuMDMgMjAwNDAzMDkgTWFrZSBzdXJlIGxvY2FsIGNvbmZpZyBmaWxlIGdldHMgbm90IGRlbGV0ZWQKKyQhIDAuMDQgMjAwNDEyMzAgQWxzbyB3cml0ZSBpbmNsdWRlIGZvciBjb25maWd1cmUgcnVuCiskISAwLjA1IDIwMDUwMTAzIEFkZCBwcm9jZXNzaW5nIG9mICJjb21tZW50IGRlZmluZXMiCiskQ0NfUFJPUF9DSEVDSzoKKyQgY2NfcHJvcCA9IHRydWUKKyQgaXNfbmVlZCA9IGZhbHNlCiskIGlzX25lZWQgPSAoZiRleHRyYWN0KDAsNCxjZGVmKSAuZXFzLiAiTkVFRCIpIC5vci4gKHRlc3RfaW52IC5lcS4gdHJ1ZSkKKyQgaWYgZiRzZWFyY2godGgpIC5lcXMuICIiIHRoZW4gY3JlYXRlICd0aCcKKyQgc2V0IG1lc3NhZ2Uvbm9mYWMvbm9pZGVudC9ub3NldmVyL25vdGV4dAorJCBvbiBlcnJvciB0aGVuIGNvbnRpbnVlCiskIGNjICd0bXBuYW0nCiskIGlmIC5ub3QuICgkc3RhdHVzKSAgdGhlbiBjY19wcm9wID0gZmFsc2UKKyQgb24gZXJyb3IgdGhlbiBjb250aW51ZQorJCEgVGhlIGhlYWRlcnMgbWlnaHQgbGllIGFib3V0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIFJUTAorJCBsaW5rICd0bXBuYW0nLHRtcC5vcHQvb3B0CiskIGlmIC5ub3QuICgkc3RhdHVzKSAgdGhlbiBjY19wcm9wID0gZmFsc2UKKyQgc2V0IG1lc3NhZ2UvZmFjL2lkZW50L3NldmVyL3RleHQKKyQgb24gZXJyb3IgdGhlbiBnb3RvIGVycl9leGl0CiskIGRlbGV0ZS9ub2xvZyAndG1wbmFtJy4qOyovZXhjbHVkZT0ndGgnCiskIGlmIChjY19wcm9wIC5hbmQuIC5ub3QuIGlzX25lZWQpIC5vci4gLQorICAgICAoLm5vdC4gY2NfcHJvcCAuYW5kLiBpc19uZWVkKSAKKyQgdGhlbgorJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkNoZWNraW5nIGZvciAnJ2NkZWYnLi4uIHllcyIKKyQgICBpZiBmJHR5cGUoJ2NkZWZfdmFsJ195ZXMpIC5uZXMuICIiCiskICAgdGhlbgorJCAgICAgaWYgZiR0eXBlKCdjZGVmX3ZhbCdfeWVzKSAuZXFzLiAiSU5URUdFUiIgLQorICAgICAgICAgdGhlbiBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiI2RlZmluZSAhQVMgIVVMIixjZGVmLCdjZGVmX3ZhbCdfeWVzKQorJCAgICAgaWYgZiR0eXBlKCdjZGVmX3ZhbCdfeWVzKSAuZXFzLiAiU1RSSU5HIiAtCisgICAgICAgICB0aGVuIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIjZGVmaW5lICFBUyAhQVMiLGNkZWYsJ2NkZWZfdmFsJ195ZXMpCiskICAgZWxzZQorJCAgICAgY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiNkZWZpbmUgIUFTIDEiLGNkZWYpCiskICAgZW5kaWYKKyQgICBpZiAoY2RlZiAuZXFzLiAiSEFWRV9GU0VFS08iKSAub3IuIChjZGVmIC5lcXMuICJfTEFSR0VfRklMRVMiKSAub3IuIC0gCisgICAgICAgKGNkZWYgLmVxcy4gIl9MQVJHRUZJTEU2NF9TT1VSQ0UiKSB0aGVuIC0gCisgICAgICBjYWxsIHdyaXRlX2NvbmZpZyBmJHN0cmluZygiI2RlZmluZSBfTEFSR0VGSUxFIDEiKQorJCBlbHNlIAorJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkNoZWNraW5nIGZvciAnJ2NkZWYnLi4uIG5vIgorJCAgIGlmIChjb21tX2gpCiskICAgdGhlbgorICAgICAgY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIi8qICFBUyAqLyIsbGluZSkKKyQgICBlbHNlCiskICAgICBpZiBmJHR5cGUoJ2NkZWZfdmFsJ19ubykgLm5lcy4gIiIKKyQgICAgIHRoZW4KKyQgICAgICAgaWYgZiR0eXBlKCdjZGVmX3ZhbCdfbm8pIC5lcXMuICJJTlRFR0VSIiAtCisgICAgICAgICAgIHRoZW4gY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiNkZWZpbmUgIUFTICFVTCIsY2RlZiwnY2RlZl92YWwnX25vKQorJCAgICAgICBpZiBmJHR5cGUoJ2NkZWZfdmFsJ19ubykgLmVxcy4gIlNUUklORyIgLQorICAgICAgICAgICB0aGVuIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIjZGVmaW5lICFBUyAhQVMiLGNkZWYsJ2NkZWZfdmFsJ19ubykKKyQgICAgIGVsc2UKKyQgICAgICAgY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiN1bmRlZiAhQVMiLGNkZWYpCiskICAgICBlbmRpZgorJCAgIGVuZGlmCiskIGVuZGlmCiskIHJldHVybgorJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQhCiskISBDaGVjayBmb3IgcHJvcGVydGllcyBvZiBDL0MrKyBjb21waWxlciB3aXRoIG11bHRpcGxlIHJlc3VsdCB2YWx1ZXMKKyQhCiskISBWZXJzaW9uIGhpc3RvcnkKKyQhIDAuMDEgMjAwNDAxMjcgRmlyc3QgdmVyc2lvbgorJCEgMC4wMiAyMDA1MDEwMyBSZWNvbmNpbGUgY2hhbmdlcyBmcm9tIGNjX3Byb3AgdXAgdG8gdmVyc2lvbiAwLjA1CiskQ0NfTVBST1BfQ0hFQ0s6CiskIGNjX3Byb3AgPSB0cnVlCiskIGkgICAgPSAxCiskIGlkZWwgPSAxCiskIE1UX0xPT1A6CiskIGlmIGYkdHlwZShyZXN1bHRfJ2knKSAuZXFzLiAiU1RSSU5HIgorJCB0aGVuCiskICAgc2V0IG1lc3NhZ2Uvbm9mYWMvbm9pZGVudC9ub3NldmVyL25vdGV4dAorJCAgIG9uIGVycm9yIHRoZW4gY29udGludWUKKyQgICBjYyAndG1wbmFtJ18naScKKyQgICBpZiAubm90LiAoJHN0YXR1cykgIHRoZW4gY2NfcHJvcCA9IGZhbHNlCiskICAgb24gZXJyb3IgdGhlbiBjb250aW51ZQorJCEgVGhlIGhlYWRlcnMgbWlnaHQgbGllIGFib3V0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIFJUTAorJCAgIGxpbmsgJ3RtcG5hbSdfJ2knLHRtcC5vcHQvb3B0CiskICAgaWYgLm5vdC4gKCRzdGF0dXMpICB0aGVuIGNjX3Byb3AgPSBmYWxzZQorJCAgIHNldCBtZXNzYWdlL2ZhYy9pZGVudC9zZXZlci90ZXh0CiskICAgb24gZXJyb3IgdGhlbiBnb3RvIGVycl9leGl0CiskICAgZGVsZXRlL25vbG9nICd0bXBuYW0nXydpJy4qOyoKKyQgICBpZiAoY2NfcHJvcCkgCiskICAgdGhlbgorJCAgICAgd3JpdGUgc3lzJG91dHB1dCAiQ2hlY2tpbmcgZm9yICcnY2RlZicuLi4gIiwgbWRlZl8naScKKyQgICAgIGlmIGYkdHlwZShtZGVmXydpJykgLmVxcy4gIklOVEVHRVIiIC0KKyAgICAgICAgIHRoZW4gY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiNkZWZpbmUgIUFTICFVTCIsY2RlZixtZGVmXydpJykKKyQgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX3llcykgLmVxcy4gIlNUUklORyIgLQorICAgICAgICAgdGhlbiBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiI2RlZmluZSAhQVMgIUFTIixjZGVmLG1kZWZfJ2knKQorJCAgICAgZ290byBtc3ltX2NsZWFuCiskICAgZWxzZQorJCAgICAgaSA9IGkgKyAxCiskICAgICBnb3RvIG10X2xvb3AKKyQgICBlbmRpZgorJCBlbmRpZgorJCB3cml0ZSBzeXMkb3V0cHV0ICJDaGVja2luZyBmb3IgJydjZGVmJy4uLiBubyIKKyQgY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiN1bmRlZiAhQVMiLGNkZWYpCiskIE1TWU1fQ0xFQU46CiskIGlmIChpZGVsIC5sZS4gbXN5bV9tYXgpCiskIHRoZW4KKyQgICBkZWxldGUvc3ltIG1kZWZfJ2lkZWwnCiskICAgaWRlbCA9IGlkZWwgKyAxCiskICAgZ290byBtc3ltX2NsZWFuCiskIGVuZGlmCiskIHJldHVybgorJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQhCiAkISBBbmFseXplIE9iamVjdCBmaWxlcyBmb3IgT3BlblZNUyBBWFAgdG8gZXh0cmFjdCBQcm9jZWR1cmUgYW5kIERhdGEgCiAkISBpbmZvcm1hdGlvbiB0byBidWlsZCBhIHN5bWJvbCB2ZWN0b3IgZm9yIGEgc2hhcmVhYmxlIGltYWdlCiAkISBBbGwgdGhlICJicmFpbnMiIG9mIHRoaXMgbG9naWMgd2FzIHN1Z2dlc3RlZCBieSBIYXJ0bXV0IEJlY2tlcgpAQCAtNTMzLDMgKzc4NywxNiBAQAogJCBpZiBWIHRoZW4gc2V0IHZlcmlmeQogJCBlbmRzdWJyb3V0aW5lIAogJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQhCiskISBXcml0ZSBjb25maWd1cmF0aW9uIHRvIGJvdGggcGVybWFuZW50IGFuZCB0ZW1wb3JhcnkgY29uZmlnIGZpbGUKKyQhCiskISBWZXJzaW9uIGhpc3RvcnkKKyQhIDAuMDEgMjAwMzEwMjkgRmlyc3QgdmVyc2lvbiB0byByZWNlaXZlIGEgbnVtYmVyCiskIQorJFdSSVRFX0NPTkZJRzogU1VCUk9VVElORQorJCAgd3JpdGUgYWNvbmYgJ3AxJworJCAgb3Blbi9hcHBlbmQgY29uZmggJ3RoJworJCAgd3JpdGUgY29uZmggJ3AxJworJCAgY2xvc2UgY29uZmgKKyRFTkRTVUJST1VUSU5FCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvb2xkL3psaWIuaHRtbCBiL29sZC96bGliLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMWIxOTAuLjAwMDAwMDAKLS0tIGEvb2xkL3psaWIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk3MSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotIDx0aXRsZT4KLSB6bGliIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5IHZlcnNpb24gMS4xLjQKLSA8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iV2hpdGUiIHRleHQ9IkJsYWNrIiB2bGluaz0iUmVkIiBhbGluaz0iTmF2eSIgbGluaz0iUmVkIj4KLTwhLS0gYmFja2dyb3VuZD0iemxpYmJnLmdpZiIgLS0+Ci0KLTxoMT4gemxpYiAxLjEuNCBNYW51YWwgPC9oMT4KLTxocj4KLTxhIG5hbWU9IkNvbnRlbnRzIj48aDI+Q29udGVudHM8L2gyPgotPG9sIHR5cGU9IkkiPgotPGxpPiA8YSBocmVmPSIjUHJvbG9ndWUiPlByb2xvZ3VlPC9hPgotPGxpPiA8YSBocmVmPSIjSW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2E+Ci08bGk+IDxhIGhyZWY9IiNVdGlsaXR5IGZ1bmN0aW9ucyI+VXRpbGl0eSBmdW5jdGlvbnM8L2E+Ci08bGk+IDxhIGhyZWY9IiNCYXNpYyBmdW5jdGlvbnMiPkJhc2ljIGZ1bmN0aW9uczwvYT4KLTxsaT4gPGEgaHJlZj0iI0FkdmFuY2VkIGZ1bmN0aW9ucyI+QWR2YW5jZWQgZnVuY3Rpb25zPC9hPgotPGxpPiA8YSBocmVmPSIjQ29uc3RhbnRzIj5Db25zdGFudHM8L2E+Ci08bGk+IDxhIGhyZWY9IiNzdHJ1Y3Qgel9zdHJlYW1fcyI+c3RydWN0IHpfc3RyZWFtX3M8L2E+Ci08bGk+IDxhIGhyZWY9IiNDaGVja3N1bSBmdW5jdGlvbnMiPkNoZWNrc3VtIGZ1bmN0aW9uczwvYT4KLTxsaT4gPGEgaHJlZj0iI01pc2MiPk1pc2M8L2E+Ci08L29sPgotPGhyPgotPGEgbmFtZT0iUHJvbG9ndWUiPjxoMj4gUHJvbG9ndWUgPC9oMj4KLSAgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5IHZlcnNpb24gMS4xLjQsIE1hcmNoIDExdGgsIDIwMDIKLSAgPHA+Ci0gIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKLSAgPHA+Ci0gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLSAgPHA+Ci0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLSAgPG9sPgotICAgPGxpPiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgOyB5b3UgbXVzdCBub3QKLSAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKLSAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gICA8bGk+IEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAgIDxsaT4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLSAgPC9vbD4KLQotICA8ZGw+Ci0gIDxkdD5KZWFuLWxvdXAgR2FpbGx5Ci0gIDxkZD48YSBocmVmPSJtYWlsdG86amxvdXBAZ3ppcC5vcmciPmpsb3VwQGd6aXAub3JnPC9hPgotICA8ZHQ+TWFyayBBZGxlcgotICA8ZGQ+PGEgaHJlZj0ibWFpbHRvOm1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUiPm1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHU8L2E+Ci0gIDwvZGw+Ci0KLSAgVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeSBpcyBkZXNjcmliZWQgYnkgUkZDcyAoUmVxdWVzdCBmb3IKLSAgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXMKLSAgPGEgaHJlZj0iZnRwOi8vZHMuaW50ZXJuaWMubmV0L3JmYy9yZmMxOTUwLnR4dCI+Ci0gIGZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1MC50eHQgPC9hPgotICAoemxpYiBmb3JtYXQpLAotICA8YSBocmVmPSJmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTEudHh0Ij4KLSAgcmZjMTk1MS50eHQgPC9hPgotICAoPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IGZvcm1hdCkgYW5kCi0gIDxhIGhyZWY9ImZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1Mi50eHQiPgotICByZmMxOTUyLnR4dCA8L2E+Ci0gIChnemlwIGZvcm1hdCkuCi0gIDxwPgotICBUaGlzIG1hbnVhbCBpcyBjb252ZXJ0ZWQgZnJvbSB6bGliLmggYnkKLSAgPGEgaHJlZj0ibWFpbHRvOnBpYWlwQGNzaWUubnR1LmVkdS50dyI+IHBpYWlwIDwvYT4KLSAgPHA+Ci0gIFZpc2l0IDxhIGhyZWY9Imh0dHA6Ly9mdHAuY2Ryb20uY29tL3B1Yi9pbmZvemlwL3psaWIvIj4KLSAgaHR0cDovL2Z0cC5jZHJvbS5jb20vcHViL2luZm96aXAvemxpYi88L2E+Ci0gIGZvciB0aGUgb2ZmaWNpYWwgemxpYiB3ZWIgcGFnZS4KLSAgPHA+Ci0KLTxocj4KLTxhIG5hbWU9IkludHJvZHVjdGlvbiI+PGgyPiBJbnRyb2R1Y3Rpb24gPC9oMj4KLSAgICAgVGhlICd6bGliJyBjb21wcmVzc2lvbiBsaWJyYXJ5IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQKLSAgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQKLSAgZGF0YS4gIFRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBzdXBwb3J0cyBvbmx5IG9uZSBjb21wcmVzc2lvbiBtZXRob2QKLSAgKGRlZmxhdGlvbikgYnV0IG90aGVyIGFsZ29yaXRobXMgd2lsbCBiZSBhZGRlZCBsYXRlciBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lCi0gIHN0cmVhbSBpbnRlcmZhY2UuCi0gIDxwPgotCi0gICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlCi0gIGVub3VnaCAoZm9yIGV4YW1wbGUgaWYgYW4gaW5wdXQgZmlsZSBpcyBtbWFwJ2VkKSwgb3IgY2FuIGJlIGRvbmUgYnkKLSAgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUKLSAgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAotICAocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgotICA8cD4KLQotICAgICBUaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4gZ3ppcCAoLmd6KSBmb3JtYXQKLSAgd2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvLgotICA8cD4KLQotICAgICBUaGUgbGlicmFyeSBkb2VzIG5vdCBpbnN0YWxsIGFueSBzaWduYWwgaGFuZGxlci4gVGhlIGRlY29kZXIgY2hlY2tzCi0gIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLCBzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIKLSAgY3Jhc2ggZXZlbiBpbiBjYXNlIG9mIGNvcnJ1cHRlZCBpbnB1dC4KLSAgPHA+Ci0KLTxocj4KLTxhIG5hbWU9IlV0aWxpdHkgZnVuY3Rpb25zIj48aDI+IFV0aWxpdHkgZnVuY3Rpb25zIDwvaDI+Ci0gICAgIFRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUKLSAgIDxhIGhyZWY9IiNCYXNpYyBmdW5jdGlvbnMiPmJhc2ljIHN0cmVhbS1vcmllbnRlZCBmdW5jdGlvbnM8L2E+LgotICAgVG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZSwgc29tZQotICAgZGVmYXVsdCBvcHRpb25zIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLAotICAgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zKS4gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlCi0gICB1dGlsaXR5IGZ1bmN0aW9ucyBjYW4gZWFzaWx5IGJlIG1vZGlmaWVkIGlmIHlvdSBuZWVkIHNwZWNpYWwgb3B0aW9ucy4KLTxoMz4gRnVuY3Rpb24gbGlzdCA8L2gzPgotPHVsPgotPGxpPiBpbnQgIDxhIGhyZWY9IiNjb21wcmVzcyI+Y29tcHJlc3M8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbik7Ci08bGk+IGludCAgPGEgaHJlZj0iI2NvbXByZXNzMiI+Y29tcHJlc3MyPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4sIGludCBsZXZlbCk7Ci08bGk+IGludCAgPGEgaHJlZj0iI3VuY29tcHJlc3MiPnVuY29tcHJlc3M8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbik7Ci08bGk+IHR5cGVkZWYgdm9pZHAgZ3pGaWxlOwotPGxpPiAgZ3pGaWxlICA8YSBocmVmPSIjZ3pvcGVuIj5nem9wZW48L2E+ICAoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSk7Ci08bGk+IGd6RmlsZSAgPGEgaHJlZj0iI2d6ZG9wZW4iPmd6ZG9wZW48L2E+ICAoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKTsKLTxsaT4gaW50ICA8YSBocmVmPSIjZ3pzZXRwYXJhbXMiPmd6c2V0cGFyYW1zPC9hPiAoZ3pGaWxlIGZpbGUsIGludCBsZXZlbCwgaW50IHN0cmF0ZWd5KTsKLTxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+ICAoZ3pGaWxlIGZpbGUsIHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKTsKLTxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3p3cml0ZSI+Z3p3cml0ZTwvYT4gKGd6RmlsZSBmaWxlLCBjb25zdCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbik7Ci08bGk+IGludCBWQSAgIDxhIGhyZWY9IiNnenByaW50ZiI+Z3pwcmludGY8L2E+IChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwotPGxpPiBpbnQgIDxhIGhyZWY9IiNnenB1dHMiPmd6cHV0czwvYT4gKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpzKTsKLTxsaT4gY2hhciAqICA8YSBocmVmPSIjZ3pnZXRzIj5nemdldHM8L2E+IChnekZpbGUgZmlsZSwgY2hhciAqYnVmLCBpbnQgbGVuKTsKLTxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pwdXRjIj5nenB1dGM8L2E+IChnekZpbGUgZmlsZSwgaW50IGMpOwotPGxpPiBpbnQgICAgIDxhIGhyZWY9IiNnemdldGMiPmd6Z2V0YzwvYT4gKGd6RmlsZSBmaWxlKTsKLTxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pmbHVzaCI+Z3pmbHVzaDwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgZmx1c2gpOwotPGxpPiB6X29mZl90ICAgICA8YSBocmVmPSIjZ3pzZWVrIj5nenNlZWs8L2E+IChnekZpbGUgZmlsZSwgel9vZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpOwotPGxpPiB6X29mZl90ICAgICA8YSBocmVmPSIjZ3p0ZWxsIj5nenRlbGw8L2E+IChnekZpbGUgZmlsZSk7Ci08bGk+IGludCAgICAgPGEgaHJlZj0iI2d6cmV3aW5kIj5nenJld2luZDwvYT4gKGd6RmlsZSBmaWxlKTsKLTxsaT4gaW50ICA8YSBocmVmPSIjZ3plb2YiPmd6ZW9mPC9hPiAoZ3pGaWxlIGZpbGUpOwotPGxpPiBpbnQgICAgIDxhIGhyZWY9IiNnemNsb3NlIj5nemNsb3NlPC9hPiAoZ3pGaWxlIGZpbGUpOwotPGxpPiBjb25zdCBjaGFyICogIDxhIGhyZWY9IiNnemVycm9yIj5nemVycm9yPC9hPiAoZ3pGaWxlIGZpbGUsIGludCAqZXJybnVtKTsKLTwvdWw+Ci08aDM+IEZ1bmN0aW9uIGRlc2NyaXB0aW9uIDwvaDM+Ci08ZGw+Ci08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImNvbXByZXNzIj5jb21wcmVzczwvYT4gKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCi0gICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCi0gICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgMC4xJSBsYXJnZXIgdGhhbgotICAgc291cmNlTGVuIHBsdXMgMTIgYnl0ZXMuIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCi0gICBjb21wcmVzc2VkIGJ1ZmZlci48cD4KLSAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byA8YSBocmVmPSIjY29tcHJlc3MiPmNvbXByZXNzPC9hPiBhIHdob2xlIGZpbGUgYXQgb25jZSBpZiB0aGUKLSAgIGlucHV0IGZpbGUgaXMgbW1hcCdlZC48cD4KLSAgICAgPGEgaHJlZj0iI2NvbXByZXNzIj5jb21wcmVzczwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0Ci0gICBidWZmZXIuPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iY29tcHJlc3MyIj5jb21wcmVzczI8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbiwgaW50IGxldmVsKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiBUaGUgbGV2ZWwKLSAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPi4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQotICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQotICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IDAuMSUgbGFyZ2VyIHRoYW4gc291cmNlTGVuIHBsdXMKLSAgIDEyIGJ5dGVzLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KLSAgIDxwPgotCi0gICAgIDxhIGhyZWY9IiNjb21wcmVzczIiPmNvbXByZXNzMjwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKLSAgIG1lbW9yeSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwKLSAgIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBsZXZlbCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9InVuY29tcHJlc3MiPnVuY29tcHJlc3M8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbik7PC9mb250PgotPGRkPgotICAgICBEZWNvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCi0gICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCi0gICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCi0gICBlbnRpcmUgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbXVzdCBoYXZlCi0gICBiZWVuIHNhdmVkIHByZXZpb3VzbHkgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHRyYW5zbWl0dGVkIHRvIHRoZSBkZWNvbXByZXNzb3IKLSAgIGJ5IHNvbWUgbWVjaGFuaXNtIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgY29tcHJlc3Npb24gbGlicmFyeS4pCi0gICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4gPHA+Ci0gICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZGVjb21wcmVzcyBhIHdob2xlIGZpbGUgYXQgb25jZSBpZiB0aGUKLSAgIGlucHV0IGZpbGUgaXMgbW1hcCdlZC4KLSAgIDxwPgotCi0gICAgIDxhIGhyZWY9IiN1bmNvbXByZXNzIj51bmNvbXByZXNzPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90Ci0gICBlbm91Z2ggbWVtb3J5LCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKLSAgIGJ1ZmZlciwgb3IgPGEgaHJlZj0iI1pfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkLgotICAgPHA+Ci0KLTxkdD4gdHlwZWRlZiB2b2lkcCBnekZpbGU7Ci08ZGQ+IDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgZ3pGaWxlICA8YSBuYW1lPSJnem9wZW4iPmd6b3BlbjwvYT4gIChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptb2RlKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuIFRoZSBtb2RlIHBhcmFtZXRlcgotICAgaXMgYXMgaW4gZm9wZW4gKCJyYiIgb3IgIndiIikgYnV0IGNhbiBhbHNvIGluY2x1ZGUgYSBjb21wcmVzc2lvbiBsZXZlbAotICAgKCJ3YjkiKSBvciBhIHN0cmF0ZWd5OiAnZicgZm9yIGZpbHRlcmVkIGRhdGEgYXMgaW4gIndiNmYiLCAnaCcgZm9yCi0gICBIdWZmbWFuIG9ubHkgY29tcHJlc3Npb24gYXMgaW4gIndiMWgiLiAoU2VlIHRoZSBkZXNjcmlwdGlvbgotICAgb2YgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RyYXRlZ3kgcGFyYW1ldGVyLikKLSAgIDxwPgotCi0gICAgIDxhIGhyZWY9IiNnem9wZW4iPmd6b3BlbjwvYT4gY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGZpbGUgd2hpY2ggaXMgbm90IGluIGd6aXAgZm9ybWF0IDsgaW4gdGhpcwotICAgY2FzZSA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+IHdpbGwgZGlyZWN0bHkgcmVhZCBmcm9tIHRoZSBmaWxlIHdpdGhvdXQgZGVjb21wcmVzc2lvbi4KLSAgIDxwPgotCi0gICAgIDxhIGhyZWY9IiNnem9wZW4iPmd6b3BlbjwvYT4gcmV0dXJucyBOVUxMIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgb3IgaWYgdGhlcmUgd2FzCi0gICBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSAoZGUpY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gOyBlcnJubwotICAgY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyAoaWYgZXJybm8gaXMgemVybywgdGhlCi0gICB6bGliIGVycm9yIGlzIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+KS4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBnekZpbGUgIDxhIG5hbWU9Imd6ZG9wZW4iPmd6ZG9wZW48L2E+ICAoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIDxhIGhyZWY9IiNnemRvcGVuIj5nemRvcGVuPC9hPigpIGFzc29jaWF0ZXMgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiAgRmlsZQotICAgZGVzY3JpcHRvcnMgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yCi0gICBmaWxlbm8gKGluIHRoZSBmaWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLgotICAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzIGluIDxhIGhyZWY9IiNnem9wZW4iPmd6b3BlbjwvYT4uCi0gICA8cD4KLSAgICAgVGhlIG5leHQgY2FsbCBvZiA8YSBocmVmPSIjZ3pjbG9zZSI+Z3pjbG9zZTwvYT4gb24gdGhlIHJldHVybmVkIGd6RmlsZSB3aWxsIGFsc28gY2xvc2UgdGhlCi0gICBmaWxlIGRlc2NyaXB0b3IgZmQsIGp1c3QgbGlrZSBmY2xvc2UoZmRvcGVuKGZkKSwgbW9kZSkgY2xvc2VzIHRoZSBmaWxlCi0gICBkZXNjcmlwdG9yIGZkLiBJZiB5b3Ugd2FudCB0byBrZWVwIGZkIG9wZW4sIHVzZSA8YSBocmVmPSIjZ3pkb3BlbiI+Z3pkb3BlbjwvYT4oZHVwKGZkKSwgbW9kZSkuCi0gICA8cD4KLSAgICAgPGEgaHJlZj0iI2d6ZG9wZW4iPmd6ZG9wZW48L2E+IHJldHVybnMgTlVMTCBpZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZQotICAgdGhlIChkZSljb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPi4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9Imd6c2V0cGFyYW1zIj5nenNldHBhcmFtczwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSk7PC9mb250PgotPGRkPgotICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIG9yIHN0cmF0ZWd5LiBTZWUgdGhlIGRlc2NyaXB0aW9uCi0gICBvZiA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+IGZvciB0aGUgbWVhbmluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzLgotICAgPHA+Ci0gICAgIDxhIGhyZWY9IiNnenNldHBhcmFtcyI+Z3pzZXRwYXJhbXM8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIG9yIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBmaWxlIHdhcyBub3QKLSAgIG9wZW5lZCBmb3Igd3JpdGluZy4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgICAgIDxhIG5hbWU9Imd6cmVhZCI+Z3pyZWFkPC9hPiAgKGd6RmlsZSBmaWxlLCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbik7PC9mb250PgotPGRkPgotICAgICBSZWFkcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICBJZiB0aGUgaW5wdXQgZmlsZSB3YXMgbm90IGluIGd6aXAgZm9ybWF0LCA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+IGNvcGllcyB0aGUgZ2l2ZW4gbnVtYmVyCi0gICBvZiBieXRlcyBpbnRvIHRoZSBidWZmZXIuCi0gICA8cD4KLSAgICAgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHJlYWQgKDAgZm9yCi0gICBlbmQgb2YgZmlsZSwgLTEgZm9yIGVycm9yKS4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgICAgIDxhIG5hbWU9Imd6d3JpdGUiPmd6d3JpdGU8L2E+IChnekZpbGUgZmlsZSwgY29uc3Qgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pOzwvZm9udD4KLTxkZD4KLSAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KLSAgIDxhIGhyZWY9IiNnendyaXRlIj5nendyaXRlPC9hPiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4KLSAgICgwIGluIGNhc2Ugb2YgZXJyb3IpLgotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCBWQSAgIDxhIG5hbWU9Imd6cHJpbnRmIj5nenByaW50ZjwvYT4gKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7PC9mb250PgotPGRkPgotICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJncyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCi0gICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiA8YSBocmVmPSIjZ3pwcmludGYiPmd6cHJpbnRmPC9hPiByZXR1cm5zIHRoZSBudW1iZXIgb2YKLSAgIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLgotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZ3pwdXRzIj5nenB1dHM8L2E+IChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcyk7PC9mb250PgotPGRkPgotICAgICAgV3JpdGVzIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUsIGV4Y2x1ZGluZwotICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgotICAgPHA+Ci0gICAgICA8YSBocmVmPSIjZ3pwdXRzIj5nenB1dHM8L2E+IHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCi0gICAgICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gY2hhciAqICA8YSBuYW1lPSJnemdldHMiPmd6Z2V0czwvYT4gKGd6RmlsZSBmaWxlLCBjaGFyICpidWYsIGludCBsZW4pOzwvZm9udD4KLTxkZD4KLSAgICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZSByZWFkLCBvcgotICAgYSBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkIGFuZCB0cmFuc2ZlcnJlZCB0byBidWYsIG9yIGFuIGVuZC1vZi1maWxlCi0gICBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBUaGUgc3RyaW5nIGlzIHRoZW4gdGVybWluYXRlZCB3aXRoIGEgbnVsbAotICAgY2hhcmFjdGVyLgotICAgPHA+Ci0gICAgICA8YSBocmVmPSIjZ3pnZXRzIj5nemdldHM8L2E+IHJldHVybnMgYnVmLCBvciA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+IGluIGNhc2Ugb2YgZXJyb3IuCi0gICAgICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnenB1dGMiPmd6cHV0YzwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgYyk7PC9mb250PgotPGRkPgotICAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICA8YSBocmVmPSIjZ3pwdXRjIj5nenB1dGM8L2E+IHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnemdldGMiPmd6Z2V0YzwvYT4gKGd6RmlsZSBmaWxlKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgICBSZWFkcyBvbmUgYnl0ZSBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuIDxhIGhyZWY9IiNnemdldGMiPmd6Z2V0YzwvYT4gcmV0dXJucyB0aGlzIGJ5dGUKLSAgIG9yIC0xIGluIGNhc2Ugb2YgZW5kIG9mIGZpbGUgb3IgZXJyb3IuCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnemZsdXNoIj5nemZsdXNoPC9hPiAoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCk7PC9mb250PgotPGRkPgotICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuIFRoZSBwYXJhbWV0ZXIKLSAgIGZsdXNoIGlzIGFzIGluIHRoZSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSBmdW5jdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgotICAgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gPGEgaHJlZj0iI2d6ZXJyb3IiPmd6ZXJyb3I8L2E+IGJlbG93KS4gPGEgaHJlZj0iI2d6Zmx1c2giPmd6Zmx1c2g8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmCi0gICB0aGUgZmx1c2ggcGFyYW1ldGVyIGlzIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+IGFuZCBhbGwgb3V0cHV0IGNvdWxkIGJlIGZsdXNoZWQuCi0gICA8cD4KLSAgICAgPGEgaHJlZj0iI2d6Zmx1c2giPmd6Zmx1c2g8L2E+IHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHN0cmljdGx5IG5lY2Vzc2FyeSBiZWNhdXNlIGl0IGNhbgotICAgZGVncmFkZSBjb21wcmVzc2lvbi4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiB6X29mZl90ICAgICA8YSBuYW1lPSJnenNlZWsiPmd6c2VlazwvYT4gKGd6RmlsZSBmaWxlLCB6X29mZl90IG9mZnNldCwgaW50IHdoZW5jZSk7PC9mb250PgotPGRkPgotICAgICAgU2V0cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IDxhIGhyZWY9IiNnenJlYWQiPmd6cmVhZDwvYT4gb3IgPGEgaHJlZj0iI2d6d3JpdGUiPmd6d3JpdGU8L2E+IG9uIHRoZQotICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGUgb2Zmc2V0IHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCi0gICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uIFRoZSB3aGVuY2UgcGFyYW1ldGVyIGlzIGRlZmluZWQgYXMgaW4gbHNlZWsoMik7Ci0gICB0aGUgdmFsdWUgU0VFS19FTkQgaXMgbm90IHN1cHBvcnRlZC4KLSAgIDxwPgotICAgICBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcsIHRoaXMgZnVuY3Rpb24gaXMgZW11bGF0ZWQgYnV0IGNhbiBiZQotICAgZXh0cmVtZWx5IHNsb3cuIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZywgb25seSBmb3J3YXJkIHNlZWtzIGFyZQotICAgc3VwcG9ydGVkIDsgPGEgaHJlZj0iI2d6c2VlayI+Z3pzZWVrPC9hPiB0aGVuIGNvbXByZXNzZXMgYSBzZXF1ZW5jZSBvZiB6ZXJvZXMgdXAgdG8gdGhlIG5ldwotICAgc3RhcnRpbmcgcG9zaXRpb24uCi0gICA8cD4KLSAgICAgIDxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4gcmV0dXJucyB0aGUgcmVzdWx0aW5nIG9mZnNldCBsb2NhdGlvbiBhcyBtZWFzdXJlZCBpbiBieXRlcyBmcm9tCi0gICB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLCBpbgotICAgcGFydGljdWxhciBpZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcgYW5kIHRoZSBuZXcgc3RhcnRpbmcgcG9zaXRpb24KLSAgIHdvdWxkIGJlIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAgIDxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgICAgIDxhIG5hbWU9Imd6cmV3aW5kIj5nenJld2luZDwvYT4gKGd6RmlsZSBmaWxlKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCi0gICAgIDxwPgotICAgPGEgaHJlZj0iI2d6cmV3aW5kIj5nenJld2luZDwvYT4oZmlsZSkgaXMgZXF1aXZhbGVudCB0byAoaW50KTxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4oZmlsZSwgMEwsIFNFRUtfU0VUKQotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IHpfb2ZmX3QgICAgIDxhIG5hbWU9Imd6dGVsbCI+Z3p0ZWxsPC9hPiAoZ3pGaWxlIGZpbGUpOzwvZm9udD4KLTxkZD4KLSAgICAgUmV0dXJucyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IDxhIGhyZWY9IiNnenJlYWQiPmd6cmVhZDwvYT4gb3IgPGEgaHJlZj0iI2d6d3JpdGUiPmd6d3JpdGU8L2E+IG9uIHRoZQotICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCi0gICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uCi0gICA8cD4KLQotICAgPGEgaHJlZj0iI2d6dGVsbCI+Z3p0ZWxsPC9hPihmaWxlKSBpcyBlcXVpdmFsZW50IHRvIDxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4oZmlsZSwgMEwsIFNFRUtfQ1VSKQotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZ3plb2YiPmd6ZW9mPC9hPiAoZ3pGaWxlIGZpbGUpOzwvZm9udD4KLTxkZD4KLSAgICAgUmV0dXJucyAxIHdoZW4gRU9GIGhhcyBwcmV2aW91c2x5IGJlZW4gZGV0ZWN0ZWQgcmVhZGluZyB0aGUgZ2l2ZW4KLSAgIGlucHV0IHN0cmVhbSwgb3RoZXJ3aXNlIHplcm8uCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnemNsb3NlIj5nemNsb3NlPC9hPiAoZ3pGaWxlIGZpbGUpOzwvZm9udD4KLTxkZD4KLSAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaWYgbmVjZXNzYXJ5LCBjbG9zZXMgdGhlIGNvbXByZXNzZWQgZmlsZQotICAgYW5kIGRlYWxsb2NhdGVzIGFsbCB0aGUgKGRlKWNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+LiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCi0gICBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiA8YSBocmVmPSIjZ3plcnJvciI+Z3plcnJvcjwvYT4gYmVsb3cpLgotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGNvbnN0IGNoYXIgKiAgPGEgbmFtZT0iZ3plcnJvciI+Z3plcnJvcjwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgKmVycm51bSk7PC9mb250PgotPGRkPgotICAgICBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUKLSAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gZXJybnVtIGlzIHNldCB0byB6bGliIGVycm9yIG51bWJlci4gSWYgYW4KLSAgIGVycm9yIG9jY3VycmVkIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgbm90IGluIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5LAotICAgZXJybnVtIGlzIHNldCB0byA8YSBocmVmPSIjWl9FUlJOTyI+Wl9FUlJOTzwvYT4gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubwotICAgdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgotICAgPHA+Ci08L2RsPgotPGhyPgotPGEgbmFtZT0iQmFzaWMgZnVuY3Rpb25zIj48aDI+IEJhc2ljIGZ1bmN0aW9ucyA8L2gyPgotPGgzPiBGdW5jdGlvbiBsaXN0IDwvaDM+Ci08dWw+Ci08bGk+ICBjb25zdCBjaGFyICogIDxhIGhyZWY9IiN6bGliVmVyc2lvbiI+emxpYlZlcnNpb248L2E+ICh2b2lkKTsKLTxsaT4gIGludCAgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGxldmVsKTsKLTxsaT4gIGludCAgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBmbHVzaCk7Ci08bGk+ICBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlRW5kIj5kZWZsYXRlRW5kPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTsKLTxsaT4gIGludCAgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7Ci08bGk+ICBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgZmx1c2gpOwotPGxpPiAgaW50ICA8YSBocmVmPSIjaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7Ci08L3VsPgotCi08aDM+IEZ1bmN0aW9uIGRlc2NyaXB0aW9uIDwvaDM+Ci08ZGw+Ci08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgY29uc3QgY2hhciAqICA8YSBuYW1lPSJ6bGliVmVyc2lvbiI+emxpYlZlcnNpb248L2E+ICh2b2lkKTs8L2ZvbnQ+Ci08ZGQ+IFRoZSBhcHBsaWNhdGlvbiBjYW4gY29tcGFyZSA8YSBocmVmPSIjemxpYlZlcnNpb24iPnpsaWJWZXJzaW9uPC9hPiBhbmQgWkxJQl9WRVJTSU9OIGZvciBjb25zaXN0ZW5jeS4KLSAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZGlmZmVycywgdGhlIGxpYnJhcnkgY29kZSBhY3R1YWxseSB1c2VkIGlzCi0gICBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB6bGliLmggaGVhZGVyIGZpbGUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCi0gICBUaGlzIGNoZWNrIGlzIGF1dG9tYXRpY2FsbHkgbWFkZSBieSA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBhbmQgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4uCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBsZXZlbCk7PC9mb250PgotPGRkPgotICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IGZvciBjb21wcmVzc2lvbi4gVGhlIGZpZWxkcwotICAgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlIGNhbGxlci4KLSAgIElmIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFyZSBzZXQgdG8gPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiwgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gdXBkYXRlcyB0aGVtIHRvCi0gICB1c2UgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KLSAgIDxwPgotCi0gICAgIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBtdXN0IGJlIDxhIGhyZWY9IiNaX0RFRkFVTFRfQ09NUFJFU1NJT04iPlpfREVGQVVMVF9DT01QUkVTU0lPTjwvYT4sIG9yIGJldHdlZW4gMCBhbmQgOToKLSAgIDEgZ2l2ZXMgYmVzdCBzcGVlZCwgOSBnaXZlcyBiZXN0IGNvbXByZXNzaW9uLCAwIGdpdmVzIG5vIGNvbXByZXNzaW9uIGF0Ci0gICBhbGwgKHRoZSBpbnB1dCBkYXRhIGlzIHNpbXBseSBjb3BpZWQgYSBibG9jayBhdCBhIHRpbWUpLgotICAgPHA+Ci0KLSAgIDxhIGhyZWY9IiNaX0RFRkFVTFRfQ09NUFJFU1NJT04iPlpfREVGQVVMVF9DT01QUkVTU0lPTjwvYT4gcmVxdWVzdHMgYSBkZWZhdWx0IGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBhbmQKLSAgIGNvbXByZXNzaW9uIChjdXJyZW50bHkgZXF1aXZhbGVudCB0byBsZXZlbCA2KS4KLSAgIDxwPgotCi0gICAgIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QKLSAgIGVub3VnaCBtZW1vcnksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIGxldmVsIGlzIG5vdCBhIHZhbGlkIGNvbXByZXNzaW9uIGxldmVsLAotICAgPGEgaHJlZj0iI1pfVkVSU0lPTl9FUlJPUiI+Wl9WRVJTSU9OX0VSUk9SPC9hPiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gKDxhIGhyZWY9IiN6bGliX3ZlcnNpb24iPnpsaWJfdmVyc2lvbjwvYT4pIGlzIGluY29tcGF0aWJsZQotICAgd2l0aCB0aGUgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIgKFpMSUJfVkVSU0lPTikuCi0gICA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBkb2VzIG5vdAotICAgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLgotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImRlZmxhdGUiPmRlZmxhdGU8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBmbHVzaCk7PC9mb250PgotPGRkPgotICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0Ci0gIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IGludHJvZHVjZSBzb21lCi0gIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCi0gIGZvcmNlZCB0byBmbHVzaC48cD4KLQotICAgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKLSAgZm9sbG93aW5nIGFjdGlvbnM6Ci0KLSAgPHVsPgotICA8bGk+IENvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCB1cGRhdGUgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPgotICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90Ci0gICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IGFyZSB1cGRhdGVkIGFuZAotICAgIHByb2Nlc3Npbmcgd2lsbCByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS4KLQotICA8bGk+Ci0gICAgUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+Ci0gICAgYWNjb3JkaW5nbHkuIFRoaXMgYWN0aW9uIGlzIGZvcmNlZCBpZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIG5vbiB6ZXJvLgotICAgIEZvcmNpbmcgZmx1c2ggZnJlcXVlbnRseSBkZWdyYWRlcyB0aGUgY29tcHJlc3Npb24gcmF0aW8sIHNvIHRoaXMgcGFyYW1ldGVyCi0gICAgc2hvdWxkIGJlIHNldCBvbmx5IHdoZW4gbmVjZXNzYXJ5IChpbiBpbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbnMpLgotICAgIFNvbWUgb3V0cHV0IG1heSBiZSBwcm92aWRlZCBldmVuIGlmIGZsdXNoIGlzIG5vdCBzZXQuCi0gIDwvdWw+IDxwPgotCi0gIEJlZm9yZSB0aGUgY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAotICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKLSAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBvciA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IGFjY29yZGluZ2x5IDsgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPgotICBzaG91bGQgbmV2ZXIgYmUgemVybyBiZWZvcmUgdGhlIGNhbGwuIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUKLSAgY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsCi0gICg8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+ID09IDApLCBvciBhZnRlciBlYWNoIGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuIElmIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPgotICBhbmQgd2l0aCB6ZXJvIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4sIGl0IG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZQotICBvdXRwdXQgYnVmZmVyIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KLSAgPHA+Ci0KLSAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byA8YSBocmVmPSIjWl9TWU5DX0ZMVVNIIj5aX1NZTkNfRkxVU0g8L2E+LCBhbGwgcGVuZGluZyBvdXRwdXQgaXMKLSAgZmx1c2hlZCB0byB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdGhlIG91dHB1dCBpcyBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgc28KLSAgdGhhdCB0aGUgZGVjb21wcmVzc29yIGNhbiBnZXQgYWxsIGlucHV0IGRhdGEgYXZhaWxhYmxlIHNvIGZhci4gKEluIHBhcnRpY3VsYXIKLSAgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gaXMgemVybyBhZnRlciB0aGUgY2FsbCBpZiBlbm91Z2ggb3V0cHV0IHNwYWNlIGhhcyBiZWVuIHByb3ZpZGVkCi0gIGJlZm9yZSB0aGUgY2FsbC4pICBGbHVzaGluZyBtYXkgZGVncmFkZSBjb21wcmVzc2lvbiBmb3Igc29tZSBjb21wcmVzc2lvbgotICBhbGdvcml0aG1zIGFuZCBzbyBpdCBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LgotICA8cD4KLQotICAgIElmIGZsdXNoIGlzIHNldCB0byA8YSBocmVmPSIjWl9GVUxMX0ZMVVNIIj5aX0ZVTExfRkxVU0g8L2E+LCBhbGwgb3V0cHV0IGlzIGZsdXNoZWQgYXMgd2l0aAotICA8YSBocmVmPSIjWl9TWU5DX0ZMVVNIIj5aX1NZTkNfRkxVU0g8L2E+LCBhbmQgdGhlIGNvbXByZXNzaW9uIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IGlzIHJlc2V0IHNvIHRoYXQgZGVjb21wcmVzc2lvbiBjYW4KLSAgcmVzdGFydCBmcm9tIHRoaXMgcG9pbnQgaWYgcHJldmlvdXMgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGRhbWFnZWQgb3IgaWYKLSAgcmFuZG9tIGFjY2VzcyBpcyBkZXNpcmVkLiBVc2luZyA8YSBocmVmPSIjWl9GVUxMX0ZMVVNIIj5aX0ZVTExfRkxVU0g8L2E+IHRvbyBvZnRlbiBjYW4gc2VyaW91c2x5IGRlZ3JhZGUKLSAgdGhlIGNvbXByZXNzaW9uLgotICA8cD4KLQotICAgIElmIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiByZXR1cm5zIHdpdGggPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiA9PSAwLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFnYWluCi0gIHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQKLSAgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiksIHVudGlsIHRoZSBmbHVzaCBpcyBjb21wbGV0ZSAoPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IHJldHVybnMgd2l0aCBub24temVybwotICA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+KS4KLSAgPHA+Ci0KLSAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQsCi0gIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgYW5kIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiByZXR1cm5zIHdpdGggPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiBpZiB0aGVyZQotICB3YXMgZW5vdWdoIG91dHB1dCBzcGFjZSA7IGlmIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiByZXR1cm5zIHdpdGggPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+LCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUKLSAgY2FsbGVkIGFnYWluIHdpdGggPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4gYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4pIGJ1dCBubwotICBtb3JlIGlucHV0IGRhdGEsIHVudGlsIGl0IHJldHVybnMgd2l0aCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IG9yIGFuIGVycm9yLiBBZnRlcgotICA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gaGFzIHJldHVybmVkIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4sIHRoZSBvbmx5IHBvc3NpYmxlIG9wZXJhdGlvbnMgb24gdGhlCi0gIHN0cmVhbSBhcmUgPGEgaHJlZj0iI2RlZmxhdGVSZXNldCI+ZGVmbGF0ZVJlc2V0PC9hPiBvciA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4uCi0gIDxwPgotCi0gICAgPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4gY2FuIGJlIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gaWYgYWxsIHRoZSBjb21wcmVzc2lvbgotICBpcyB0byBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAuIEluIHRoaXMgY2FzZSwgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBtdXN0IGJlIGF0IGxlYXN0Ci0gIDAuMSUgbGFyZ2VyIHRoYW4gPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gcGx1cyAxMiBieXRlcy4gIElmIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBkb2VzIG5vdCByZXR1cm4KLSAgPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiwgdGhlbiBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhcyBkZXNjcmliZWQgYWJvdmUuCi0gIDxwPgotCi0gICAgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkgc2V0cyBzdHJtLSZndCA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiB0byB0aGUgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IGNoZWNrc3VtIG9mIGFsbCBpbnB1dCByZWFkCi0gIHNvIGZhciAodGhhdCBpcywgPGEgaHJlZj0iI3RvdGFsX2luIj50b3RhbF9pbjwvYT4gYnl0ZXMpLgotICA8cD4KLQotICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpIG1heSB1cGRhdGUgPGEgaHJlZj0iI2RhdGFfdHlwZSI+ZGF0YV90eXBlPC9hPiBpZiBpdCBjYW4gbWFrZSBhIGdvb2QgZ3Vlc3MgYWJvdXQKLSAgdGhlIGlucHV0IGRhdGEgdHlwZSAoPGEgaHJlZj0iI1pfQVNDSUkiPlpfQVNDSUk8L2E+IG9yIDxhIGhyZWY9IiNaX0JJTkFSWSI+Wl9CSU5BUlk8L2E+KS4gSW4gZG91YnQsIHRoZSBkYXRhIGlzIGNvbnNpZGVyZWQKLSAgYmluYXJ5LiBUaGlzIGZpZWxkIGlzIG9ubHkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzIGFuZCBkb2VzIG5vdCBhZmZlY3QKLSAgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbiBhbnkgbWFubmVyLgotICA8cD4KLQotICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpIHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dAotICBwcm9jZXNzZWQgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IGlmIGFsbCBpbnB1dCBoYXMgYmVlbgotICBjb25zdW1lZCBhbmQgYWxsIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCAob25seSB3aGVuIGZsdXNoIGlzIHNldCB0bwotICA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKLSAgaWYgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IG9yIDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IHdhcyBOVUxMKSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUKLSAgKGZvciBleGFtcGxlIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IG9yIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gd2FzIHplcm8pLgotICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250PgotPGRkPgotICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgotICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueQotICAgcGVuZGluZyBvdXRwdXQuCi0gICA8cD4KLQotICAgICA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlCi0gICBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudCwgPGEgaHJlZj0iI1pfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiBpZiB0aGUgc3RyZWFtIHdhcyBmcmVlZAotICAgcHJlbWF0dXJlbHkgKHNvbWUgaW5wdXQgb3Igb3V0cHV0IHdhcyBkaXNjYXJkZWQpLiBJbiB0aGUgZXJyb3IgY2FzZSwKLSAgIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYSBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZQotICAgZGVhbGxvY2F0ZWQpLgotICAgPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImluZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250PgotPGRkPgotCUluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gZm9yIGRlY29tcHJlc3Npb24uIFRoZSBmaWVsZHMKLSAgIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiwgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4sIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFuZCA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5Ci0gICB0aGUgY2FsbGVyLiBJZiA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gaXMgbm90IDxhIGhyZWY9IiNaX05VTEwiPlpfTlVMTDwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IGlzIGxhcmdlIGVub3VnaCAodGhlIGV4YWN0Ci0gICB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjb21wcmVzc2lvbiBtZXRob2QpLCA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiBkZXRlcm1pbmVzIHRoZQotICAgY29tcHJlc3Npb24gbWV0aG9kIGZyb20gdGhlIHpsaWIgaGVhZGVyIGFuZCBhbGxvY2F0ZXMgYWxsIGRhdGEgc3RydWN0dXJlcwotICAgYWNjb3JkaW5nbHkgOyBvdGhlcndpc2UgdGhlIGFsbG9jYXRpb24gd2lsbCBiZSBkZWZlcnJlZCB0byB0aGUgZmlyc3QgY2FsbCBvZgotICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+LiAgSWYgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBhbmQgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYXJlIHNldCB0byA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+LCA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiB1cGRhdGVzIHRoZW0gdG8KLSAgIHVzZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb25zLgotICAgPHA+Ci0KLSAgICAgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKLSAgIG1lbW9yeSwgPGEgaHJlZj0iI1pfVkVSU0lPTl9FUlJPUiI+Wl9WRVJTSU9OX0VSUk9SPC9hPiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlCi0gICB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlci4gIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IKLSAgIG1lc3NhZ2UuIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24gYXBhcnQgZnJvbSByZWFkaW5nCi0gICB0aGUgemxpYiBoZWFkZXIgaWYgcHJlc2VudDogdGhpcyB3aWxsIGJlIGRvbmUgYnkgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkuICAoU28gPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZAotICAgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gbWF5IGJlIG1vZGlmaWVkLCBidXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gYXJlIHVuY2hhbmdlZC4pCi0gICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGZsdXNoKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+IGRlY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAotICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBzb21lCi0gIGludHJvZHVjZSBzb21lIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpCi0gIGV4Y2VwdCB3aGVuIGZvcmNlZCB0byBmbHVzaC4KLSAgPHA+Ci0KLSAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+IHBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZQotICBmb2xsb3dpbmcgYWN0aW9uczoKLQotICA8dWw+Ci0gIDxsaT4gRGVjb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4KLSAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAotICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGlzIHVwZGF0ZWQgYW5kIHByb2Nlc3NpbmcKLSAgICB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLgotCi0gIDxsaT4gUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IGFuZAotICAgIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gYWNjb3JkaW5nbHkuICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSBwcm92aWRlcyBhcyBtdWNoIG91dHB1dCBhcyBwb3NzaWJsZSwKLSAgICB1bnRpbCB0aGVyZSBpcyBubyBtb3JlIGlucHV0IGRhdGEgb3Igbm8gbW9yZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgotICAgIChzZWUgYmVsb3cgYWJvdXQgdGhlIGZsdXNoIHBhcmFtZXRlcikuCi0gIDwvdWw+IDxwPgotCi0gIEJlZm9yZSB0aGUgY2FsbCBvZiA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAotICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKLSAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyB0aGUgbmV4dF8qIGFuZCBhdmFpbF8qIHZhbHVlcyBhY2NvcmRpbmdseS4KLSAgVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvcgotICBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCAoPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiA9PSAwKSwgb3IgYWZ0ZXIgZWFjaAotICBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLiBJZiA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gYW5kIHdpdGggemVybyA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+LCBpdAotICBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlCi0gIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCi0gIDxwPgotCi0gICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiwgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+IGZsdXNoZXMgYXMgbXVjaAotICBvdXRwdXQgYXMgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIuIFRoZSBmbHVzaGluZyBiZWhhdmlvciBvZiA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gaXMKLSAgbm90IHNwZWNpZmllZCBmb3IgdmFsdWVzIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgb3RoZXIgdGhhbiA8YSBocmVmPSIjWl9TWU5DX0ZMVVNIIj5aX1NZTkNfRkxVU0g8L2E+Ci0gIGFuZCA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiwgYnV0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IGZsdXNoZXMgYXMgbXVjaCBvdXRwdXQKLSAgYXMgcG9zc2libGUgYW55d2F5LgotICA8cD4KLQotICAgIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpIHNob3VsZCBub3JtYWxseSBiZSBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IG9yIGFuCi0gIGVycm9yLiBIb3dldmVyIGlmIGFsbCBkZWNvbXByZXNzaW9uIGlzIHRvIGJlIHBlcmZvcm1lZCBpbiBhIHNpbmdsZSBzdGVwCi0gIChhIHNpbmdsZSBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiksIHRoZSBwYXJhbWV0ZXIgZmx1c2ggc2hvdWxkIGJlIHNldCB0bwotICA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPi4gSW4gdGhpcyBjYXNlIGFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCBhbmQgYWxsIHBlbmRpbmcKLSAgb3V0cHV0IGlzIGZsdXNoZWQgOyA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZQotICB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtYXkgaGF2ZSBiZWVuIHNhdmVkCi0gIGJ5IHRoZSBjb21wcmVzc29yIGZvciB0aGlzIHB1cnBvc2UuKSBUaGUgbmV4dCBvcGVyYXRpb24gb24gdGhpcyBzdHJlYW0gbXVzdAotICBiZSA8YSBocmVmPSIjaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gdG8gZGVhbGxvY2F0ZSB0aGUgZGVjb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPi4gVGhlIHVzZSBvZiA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPgotICBpcyBuZXZlciByZXF1aXJlZCwgYnV0IGNhbiBiZSB1c2VkIHRvIGluZm9ybSA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gdGhhdCBhIGZhc3RlciByb3V0aW5lCi0gIG1heSBiZSB1c2VkIGZvciB0aGUgc2luZ2xlIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpIGNhbGwuCi0gIDxwPgotCi0gICAgIElmIGEgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQgKHNlZSA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPgotICBiZWxvdyksIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiBzZXRzIHN0cm0tPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gdG8gdGhlIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiBjaGVja3N1bSBvZiB0aGUKLSAgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgPGEgaHJlZj0iI1pfTkVFRF9ESUNUIj5aX05FRURfRElDVDwvYT4gOyBvdGhlcndpc2UKLSAgaXQgc2V0cyBzdHJtLSZndCA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiB0byB0aGUgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IGNoZWNrc3VtIG9mIGFsbCBvdXRwdXQgcHJvZHVjZWQKLSAgc28gZmFyICh0aGF0IGlzLCA8YSBocmVmPSIjdG90YWxfb3V0Ij50b3RhbF9vdXQ8L2E+IGJ5dGVzKSBhbmQgcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4sIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gb3IKLSAgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQgYmVsb3cuIEF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkKLSAgY2hlY2tzIHRoYXQgaXRzIGNvbXB1dGVkIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiBjaGVja3N1bSBpcyBlcXVhbCB0byB0aGF0IHNhdmVkIGJ5IHRoZQotICBjb21wcmVzc29yIGFuZCByZXR1cm5zIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gb25seSBpZiB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdC4KLSAgPHA+Ci0KLSAgICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQgcHJvY2Vzc2VkCi0gIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiBpZiB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaGFzCi0gIGJlZW4gcmVhY2hlZCBhbmQgYWxsIHVuY29tcHJlc3NlZCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQsIDxhIGhyZWY9IiNaX05FRURfRElDVCI+Wl9ORUVEX0RJQ1Q8L2E+IGlmIGEKLSAgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQsIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaWYgdGhlIGlucHV0IGRhdGEgd2FzCi0gIGNvcnJ1cHRlZCAoaW5wdXQgc3RyZWFtIG5vdCBjb25mb3JtaW5nIHRvIHRoZSB6bGliIGZvcm1hdCBvciBpbmNvcnJlY3QKLSAgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IGNoZWNrc3VtKSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudAotICAoZm9yIGV4YW1wbGUgaWYgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IG9yIDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IHdhcyBOVUxMKSwgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdAotICBlbm91Z2ggbWVtb3J5LCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90Ci0gIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIHdoZW4gPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4gaXMgdXNlZC4gSW4gdGhlIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4KLSAgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuIGNhbGwgPGEgaHJlZj0iI2luZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4gdG8gbG9vayBmb3IgYSBnb29kCi0gIGNvbXByZXNzaW9uIGJsb2NrLgotICA8cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250PgotPGRkPgotICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgotICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueQotICAgcGVuZGluZyBvdXRwdXQuCi0gICA8cD4KLQotICAgICA8YSBocmVmPSIjaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPgotICAgd2FzIGluY29uc2lzdGVudC4gSW4gdGhlIGVycm9yIGNhc2UsIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQotICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgotPC9kbD4KLTxocj4KLTxhIG5hbWU9IkFkdmFuY2VkIGZ1bmN0aW9ucyI+PGgyPiBBZHZhbmNlZCBmdW5jdGlvbnMgPC9oMj4KLSAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIG9ubHkgaW4gc29tZSBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KLTxoMz4gRnVuY3Rpb24gbGlzdCA8L2gzPgotPHVsPgotPGxpPiAgaW50ICA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sCi08bGk+IGludCAgPGEgaHJlZj0iI2RlZmxhdGVTZXREaWN0aW9uYXJ5Ij5kZWZsYXRlU2V0RGljdGlvbmFyeTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksIHVJbnQgIGRpY3RMZW5ndGgpOwotPGxpPiBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlQ29weSI+ZGVmbGF0ZUNvcHk8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IGRlc3QsIDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc291cmNlKTsKLTxsaT4gaW50ICA8YSBocmVmPSIjZGVmbGF0ZVJlc2V0Ij5kZWZsYXRlUmVzZXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOwotPGxpPiBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSk7Ci08bGk+IGludCAgPGEgaHJlZj0iI2luZmxhdGVJbml0MiI+aW5mbGF0ZUluaXQyPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgIHdpbmRvd0JpdHMpOwotPGxpPiAgaW50ICA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwgdUludCAgZGljdExlbmd0aCk7Ci08bGk+IGludCAgPGEgaHJlZj0iI2luZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7Ci08bGk+IGludCAgPGEgaHJlZj0iI2luZmxhdGVSZXNldCI+aW5mbGF0ZVJlc2V0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTsKLQotPC91bD4KLTxoMz4gRnVuY3Rpb24gZGVzY3JpcHRpb24gPC9oMz4KLTxkbD4KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImRlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgIGxldmVsLCBpbnQgIG1ldGhvZCwgaW50ICB3aW5kb3dCaXRzLCBpbnQgIG1lbUxldmVsLCBpbnQgIHN0cmF0ZWd5KTs8L2ZvbnQ+Ci0KLTxkZD4gVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gd2l0aCBtb3JlIGNvbXByZXNzaW9uIG9wdGlvbnMuIFRoZQotICAgZmllbGRzIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiwgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkKLSAgIHRoZSBjYWxsZXIuPHA+Ci0KLSAgICAgVGhlIG1ldGhvZCBwYXJhbWV0ZXIgaXMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4gSXQgbXVzdCBiZSA8YSBocmVmPSIjWl9ERUZMQVRFRCI+Wl9ERUZMQVRFRDwvYT4gaW4KLSAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS48cD4KLQotICAgICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgd2luZG93IHNpemUKLSAgICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiAgSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNSBmb3IgdGhpcwotICAgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gTGFyZ2VyIHZhbHVlcyBvZiB0aGlzIHBhcmFtZXRlciByZXN1bHQgaW4gYmV0dGVyCi0gICBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmCi0gICA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBpcyB1c2VkIGluc3RlYWQuPHA+Ci0KLSAgICAgVGhlIG1lbUxldmVsIHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG11Y2ggbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQKLSAgIGZvciB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uIG1lbUxldmVsPTEgdXNlcyBtaW5pbXVtIG1lbW9yeSBidXQKLSAgIGlzIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW8gOyBtZW1MZXZlbD05IHVzZXMgbWF4aW11bSBtZW1vcnkKLSAgIGZvciBvcHRpbWFsIHNwZWVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LiBTZWUgemNvbmYuaCBmb3IgdG90YWwgbWVtb3J5Ci0gICB1c2FnZSBhcyBhIGZ1bmN0aW9uIG9mIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLjxwPgotCi0gICAgIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0dW5lIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uIFVzZSB0aGUKLSAgIHZhbHVlIDxhIGhyZWY9IiNaX0RFRkFVTFRfU1RSQVRFR1kiPlpfREVGQVVMVF9TVFJBVEVHWTwvYT4gZm9yIG5vcm1hbCBkYXRhLCA8YSBocmVmPSIjWl9GSUxURVJFRCI+Wl9GSUxURVJFRDwvYT4gZm9yIGRhdGEgcHJvZHVjZWQgYnkgYQotICAgZmlsdGVyIChvciBwcmVkaWN0b3IpLCBvciA8YSBocmVmPSIjWl9IVUZGTUFOX09OTFkiPlpfSFVGRk1BTl9PTkxZPC9hPiB0byBmb3JjZSBIdWZmbWFuIGVuY29kaW5nIG9ubHkgKG5vCi0gICBzdHJpbmcgbWF0Y2gpLiAgRmlsdGVyZWQgZGF0YSBjb25zaXN0cyBtb3N0bHkgb2Ygc21hbGwgdmFsdWVzIHdpdGggYQotICAgc29tZXdoYXQgcmFuZG9tIGRpc3RyaWJ1dGlvbi4gSW4gdGhpcyBjYXNlLCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzCi0gICB0dW5lZCB0byA8YSBocmVmPSIjY29tcHJlc3MiPmNvbXByZXNzPC9hPiB0aGVtIGJldHRlci4gVGhlIGVmZmVjdCBvZiA8YSBocmVmPSIjWl9GSUxURVJFRCI+Wl9GSUxURVJFRDwvYT4gaXMgdG8gZm9yY2UgbW9yZQotICAgSHVmZm1hbiBjb2RpbmcgYW5kIGxlc3Mgc3RyaW5nIG1hdGNoaW5nIDsgaXQgaXMgc29tZXdoYXQgaW50ZXJtZWRpYXRlCi0gICBiZXR3ZWVuIFpfREVGQVVMVCBhbmQgPGEgaHJlZj0iI1pfSFVGRk1BTl9PTkxZIj5aX0hVRkZNQU5fT05MWTwvYT4uIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgb25seSBhZmZlY3RzCi0gICB0aGUgY29tcHJlc3Npb24gcmF0aW8gYnV0IG5vdCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGNvbXByZXNzZWQgb3V0cHV0IGV2ZW4KLSAgIGlmIGl0IGlzIG5vdCBzZXQgYXBwcm9wcmlhdGVseS48cD4KLQotICAgICAgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGFuIGludmFsaWQKLSAgIG1ldGhvZCkuIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4gZG9lcwotICAgbm90IHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS48cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJkZWZsYXRlU2V0RGljdGlvbmFyeSI+ZGVmbGF0ZVNldERpY3Rpb25hcnk8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LCB1SW50ICBkaWN0TGVuZ3RoKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGUgc2VxdWVuY2UKLSAgIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZAotICAgaW1tZWRpYXRlbHkgYWZ0ZXIgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4sIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4gb3IgPGEgaHJlZj0iI2RlZmxhdGVSZXNldCI+ZGVmbGF0ZVJlc2V0PC9hPiwgYmVmb3JlIGFueQotICAgY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4uIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZQotICAgZGljdGlvbmFyeSAoc2VlIDxhIGhyZWY9IiNpbmZsYXRlU2V0RGljdGlvbmFyeSI+aW5mbGF0ZVNldERpY3Rpb25hcnk8L2E+KS48cD4KLQotICAgICBUaGUgZGljdGlvbmFyeSBzaG91bGQgY29uc2lzdCBvZiBzdHJpbmdzIChieXRlIHNlcXVlbmNlcykgdGhhdCBhcmUgbGlrZWx5Ci0gICB0byBiZSBlbmNvdW50ZXJlZCBsYXRlciBpbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkLCB3aXRoIHRoZSBtb3N0IGNvbW1vbmx5Ci0gICB1c2VkIHN0cmluZ3MgcHJlZmVyYWJseSBwdXQgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LiBVc2luZyBhCi0gICBkaWN0aW9uYXJ5IGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCBpcyBzaG9ydCBhbmQgY2FuIGJlCi0gICBwcmVkaWN0ZWQgd2l0aCBnb29kIGFjY3VyYWN5IDsgdGhlIGRhdGEgY2FuIHRoZW4gYmUgY29tcHJlc3NlZCBiZXR0ZXIgdGhhbgotICAgd2l0aCB0aGUgZGVmYXVsdCBlbXB0eSBkaWN0aW9uYXJ5LjxwPgotCi0gICAgIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3Npb24gZGF0YSBzdHJ1Y3R1cmVzIHNlbGVjdGVkIGJ5Ci0gICA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBvciA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+LCBhIHBhcnQgb2YgdGhlIGRpY3Rpb25hcnkgbWF5IGluIGVmZmVjdCBiZQotICAgZGlzY2FyZGVkLCBmb3IgZXhhbXBsZSBpZiB0aGUgZGljdGlvbmFyeSBpcyBsYXJnZXIgdGhhbiB0aGUgd2luZG93IHNpemUgaW4KLSAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBvciBkZWZsYXRlMi4gVGh1cyB0aGUgc3RyaW5ncyBtb3N0IGxpa2VseSB0byBiZSB1c2VmdWwgc2hvdWxkIGJlCi0gICBwdXQgYXQgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeSwgbm90IGF0IHRoZSBmcm9udC48cD4KLQotICAgICBVcG9uIHJldHVybiBvZiB0aGlzIGZ1bmN0aW9uLCBzdHJtLSZndCA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiBpcyBzZXQgdG8gdGhlIEFkbGVyMzIgdmFsdWUKLSAgIG9mIHRoZSBkaWN0aW9uYXJ5IDsgdGhlIGRlY29tcHJlc3NvciBtYXkgbGF0ZXIgdXNlIHRoaXMgdmFsdWUgdG8gZGV0ZXJtaW5lCi0gICB3aGljaCBkaWN0aW9uYXJ5IGhhcyBiZWVuIHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuIChUaGUgQWRsZXIzMiB2YWx1ZQotICAgYXBwbGllcyB0byB0aGUgd2hvbGUgZGljdGlvbmFyeSBldmVuIGlmIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGRpY3Rpb25hcnkgaXMKLSAgIGFjdHVhbGx5IHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuKTxwPgotCi0gICAgIDxhIGhyZWY9IiNkZWZsYXRlU2V0RGljdGlvbmFyeSI+ZGVmbGF0ZVNldERpY3Rpb25hcnk8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIG9yIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIGEKLSAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIE5VTEwgZGljdGlvbmFyeSkgb3IgdGhlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBpcwotICAgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZSBpZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc3RyZWFtCi0gICBvciBpZiB0aGUgY29tcHJlc3Npb24gbWV0aG9kIGlzIGJzb3J0KS4gPGEgaHJlZj0iI2RlZmxhdGVTZXREaWN0aW9uYXJ5Ij5kZWZsYXRlU2V0RGljdGlvbmFyeTwvYT4gZG9lcyBub3QKLSAgIHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS48cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJkZWZsYXRlQ29weSI+ZGVmbGF0ZUNvcHk8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IGRlc3QsIDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc291cmNlKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBhcyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBzdHJlYW0uPHA+Ci0KLSAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gc2V2ZXJhbCBjb21wcmVzc2lvbiBzdHJhdGVnaWVzIHdpbGwgYmUKLSAgIHRyaWVkLCBmb3IgZXhhbXBsZSB3aGVuIHRoZXJlIGFyZSBzZXZlcmFsIHdheXMgb2YgcHJlLXByb2Nlc3NpbmcgdGhlIGlucHV0Ci0gICBkYXRhIHdpdGggYSBmaWx0ZXIuIFRoZSBzdHJlYW1zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgc2hvdWxkIHRoZW4gYmUgZnJlZWQKLSAgIGJ5IGNhbGxpbmcgPGEgaHJlZj0iI2RlZmxhdGVFbmQiPmRlZmxhdGVFbmQ8L2E+LiAgTm90ZSB0aGF0IDxhIGhyZWY9IiNkZWZsYXRlQ29weSI+ZGVmbGF0ZUNvcHk8L2E+IGR1cGxpY2F0ZXMgdGhlIGludGVybmFsCi0gICBjb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiB3aGljaCBjYW4gYmUgcXVpdGUgbGFyZ2UsIHNvIHRoaXMgc3RyYXRlZ3kgaXMgc2xvdyBhbmQKLSAgIGNhbiBjb25zdW1lIGxvdHMgb2YgbWVtb3J5LjxwPgotCi0gICAgIDxhIGhyZWY9IiNkZWZsYXRlQ29weSI+ZGVmbGF0ZUNvcHk8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QKLSAgIGVub3VnaCBtZW1vcnksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzb3VyY2Ugc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQKLSAgIChzdWNoIGFzIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYmVpbmcgTlVMTCkuIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCi0gICBkZXN0aW5hdGlvbi48cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJkZWZsYXRlUmVzZXQiPmRlZmxhdGVSZXNldDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250PgotPGRkPiAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIDxhIGhyZWY9IiNkZWZsYXRlRW5kIj5kZWZsYXRlRW5kPC9hPiBmb2xsb3dlZCBieSA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiwKLSAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uCi0gICBUaGUgc3RyZWFtIHdpbGwga2VlcCB0aGUgc2FtZSBjb21wcmVzc2lvbiBsZXZlbCBhbmQgYW55IG90aGVyIGF0dHJpYnV0ZXMKLSAgIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPi48cD4KLQotICAgICAgPGEgaHJlZj0iI2RlZmxhdGVSZXNldCI+ZGVmbGF0ZVJlc2V0PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCBvciA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IG9yIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IGJlaW5nIE5VTEwpLjxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImRlZmxhdGVQYXJhbXMiPmRlZmxhdGVQYXJhbXM8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBsZXZlbCwgaW50IHN0cmF0ZWd5KTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGNvbXByZXNzaW9uIHN0cmF0ZWd5LiAgVGhlCi0gICBpbnRlcnByZXRhdGlvbiBvZiBsZXZlbCBhbmQgc3RyYXRlZ3kgaXMgYXMgaW4gPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPi4gIFRoaXMgY2FuIGJlCi0gICB1c2VkIHRvIHN3aXRjaCBiZXR3ZWVuIGNvbXByZXNzaW9uIGFuZCBzdHJhaWdodCBjb3B5IG9mIHRoZSBpbnB1dCBkYXRhLCBvcgotICAgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IGtpbmQgb2YgaW5wdXQgZGF0YSByZXF1aXJpbmcgYSBkaWZmZXJlbnQKLSAgIHN0cmF0ZWd5LiBJZiB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgY2hhbmdlZCwgdGhlIGlucHV0IGF2YWlsYWJsZSBzbyBmYXIKLSAgIGlzIGNvbXByZXNzZWQgd2l0aCB0aGUgb2xkIGxldmVsIChhbmQgbWF5IGJlIGZsdXNoZWQpOyB0aGUgbmV3IGxldmVsIHdpbGwKLSAgIHRha2UgZWZmZWN0IG9ubHkgYXQgdGhlIG5leHQgY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS48cD4KLQotICAgICBCZWZvcmUgdGhlIGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGVQYXJhbXMiPmRlZmxhdGVQYXJhbXM8L2E+LCB0aGUgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IG11c3QgYmUgc2V0IGFzIGZvcgotICAgYSBjYWxsIG9mIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLCBzaW5jZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBpbnB1dCBtYXkgaGF2ZSB0bwotICAgYmUgY29tcHJlc3NlZCBhbmQgZmx1c2hlZC4gSW4gcGFydGljdWxhciwgc3RybS0mZ3QgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBtdXN0IGJlCi0gICBub24temVyby48cD4KLQotICAgICA8YSBocmVmPSIjZGVmbGF0ZVBhcmFtcyI+ZGVmbGF0ZVBhcmFtczwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQgb3IgaWYgYSBwYXJhbWV0ZXIgd2FzIGludmFsaWQsIDxhIGhyZWY9IiNaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+Ci0gICBpZiBzdHJtLSZndGF2YWlsX291dCB3YXMgemVyby48cD4KLQotPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJpbmZsYXRlSW5pdDIiPmluZmxhdGVJbml0MjwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50ICB3aW5kb3dCaXRzKTs8L2ZvbnQ+Ci0KLTxkZD4gICAgIFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IHdpdGggYW4gZXh0cmEgcGFyYW1ldGVyLiBUaGUKLSAgIGZpZWxkcyA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4sIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+LCA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+LCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiBhbmQgPGEgaHJlZj0iI29wYXF1ZSI+b3BhcXVlPC9hPiBtdXN0IGJlIGluaXRpYWxpemVkCi0gICBiZWZvcmUgYnkgdGhlIGNhbGxlci48cD4KLQotICAgICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgbWF4aW11bSB3aW5kb3cKLSAgIHNpemUgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvcgotICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZiA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiBpcyB1c2VkCi0gICBpbnN0ZWFkLiBJZiBhIGNvbXByZXNzZWQgc3RyZWFtIHdpdGggYSBsYXJnZXIgd2luZG93IHNpemUgaXMgZ2l2ZW4gYXMKLSAgIGlucHV0LCA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaW5zdGVhZCBvZgotICAgdHJ5aW5nIHRvIGFsbG9jYXRlIGEgbGFyZ2VyIHdpbmRvdy48cD4KLQotICAgICAgPGEgaHJlZj0iI2luZmxhdGVJbml0MiI+aW5mbGF0ZUluaXQyPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGEgbmVnYXRpdmUKLSAgIG1lbUxldmVsKS4gPGEgaHJlZj0iI21zZyI+bXNnPC9hPiBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgPGEgaHJlZj0iI2luZmxhdGVJbml0MiI+aW5mbGF0ZUluaXQyPC9hPgotICAgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcgdGhlIHpsaWIgaGVhZGVyIGlmCi0gICBwcmVzZW50OiB0aGlzIHdpbGwgYmUgZG9uZSBieSA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKS4gKFNvIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gbWF5IGJlCi0gICBtb2RpZmllZCwgYnV0IDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IGFyZSB1bmNoYW5nZWQuKTxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgaW50ICA8YSBuYW1lPSJpbmZsYXRlU2V0RGljdGlvbmFyeSI+aW5mbGF0ZVNldERpY3Rpb25hcnk8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LCB1SW50ICBkaWN0TGVuZ3RoKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIEluaXRpYWxpemVzIHRoZSBkZWNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gdW5jb21wcmVzc2VkIGJ5dGUKLSAgIHNlcXVlbmNlLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgY2FsbCBvZiA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4KLSAgIGlmIHRoaXMgY2FsbCByZXR1cm5lZCA8YSBocmVmPSIjWl9ORUVEX0RJQ1QiPlpfTkVFRF9ESUNUPC9hPi4gVGhlIGRpY3Rpb25hcnkgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yCi0gICBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBBZGxlcjMyIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgY2FsbCBvZgotICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+LiBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKLSAgIGRpY3Rpb25hcnkgKHNlZSA8YSBocmVmPSIjZGVmbGF0ZVNldERpY3Rpb25hcnkiPmRlZmxhdGVTZXREaWN0aW9uYXJ5PC9hPikuPHA+Ci0KLSAgICAgPGEgaHJlZj0iI2luZmxhdGVTZXREaWN0aW9uYXJ5Ij5pbmZsYXRlU2V0RGljdGlvbmFyeTwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgYQotICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgTlVMTCBkaWN0aW9uYXJ5KSBvciB0aGUgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IGlzCi0gICBpbmNvbnNpc3RlbnQsIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaWYgdGhlIGdpdmVuIGRpY3Rpb25hcnkgZG9lc24ndCBtYXRjaCB0aGUKLSAgIGV4cGVjdGVkIG9uZSAoaW5jb3JyZWN0IEFkbGVyMzIgdmFsdWUpLiA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiBkb2VzIG5vdAotICAgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgc3Vic2VxdWVudCBjYWxscyBvZgotICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkuPHA+Ci0KLTxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iaW5mbGF0ZVN5bmMiPmluZmxhdGVTeW5jPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTs8L2ZvbnQ+Ci0KLTxkZD4gICAgU2tpcHMgaW52YWxpZCBjb21wcmVzc2VkIGRhdGEgdW50aWwgYSBmdWxsIGZsdXNoIHBvaW50IChzZWUgYWJvdmUgdGhlCi0gIGRlc2NyaXB0aW9uIG9mIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiB3aXRoIDxhIGhyZWY9IiNaX0ZVTExfRkxVU0giPlpfRlVMTF9GTFVTSDwvYT4pIGNhbiBiZSBmb3VuZCwgb3IgdW50aWwgYWxsCi0gIGF2YWlsYWJsZSBpbnB1dCBpcyBza2lwcGVkLiBObyBvdXRwdXQgaXMgcHJvdmlkZWQuPHA+Ci0KLSAgICA8YSBocmVmPSIjaW5mbGF0ZVN5bmMiPmluZmxhdGVTeW5jPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBhIGZ1bGwgZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsIDxhIGhyZWY9IiNaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+Ci0gIGlmIG5vIG1vcmUgaW5wdXQgd2FzIHByb3ZpZGVkLCA8YSBocmVmPSIjWl9EQVRBX0VSUk9SIj5aX0RBVEFfRVJST1I8L2E+IGlmIG5vIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLAotICBvciA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50LiBJbiB0aGUgc3VjY2VzcwotICBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHNhdmUgdGhlIGN1cnJlbnQgY3VycmVudCB2YWx1ZSBvZiA8YSBocmVmPSIjdG90YWxfaW4iPnRvdGFsX2luPC9hPiB3aGljaAotICBpbmRpY2F0ZXMgd2hlcmUgdmFsaWQgY29tcHJlc3NlZCBkYXRhIHdhcyBmb3VuZC4gSW4gdGhlIGVycm9yIGNhc2UsIHRoZQotICBhcHBsaWNhdGlvbiBtYXkgcmVwZWF0ZWRseSBjYWxsIDxhIGhyZWY9IiNpbmZsYXRlU3luYyI+aW5mbGF0ZVN5bmM8L2E+LCBwcm92aWRpbmcgbW9yZSBpbnB1dCBlYWNoIHRpbWUsCi0gIHVudGlsIHN1Y2Nlc3Mgb3IgZW5kIG9mIHRoZSBpbnB1dCBkYXRhLjxwPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImluZmxhdGVSZXNldCI+aW5mbGF0ZVJlc2V0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byA8YSBocmVmPSIjaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gZm9sbG93ZWQgYnkgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4sCi0gICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGRlY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uCi0gICBUaGUgc3RyZWFtIHdpbGwga2VlcCBhdHRyaWJ1dGVzIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgPGEgaHJlZj0iI2luZmxhdGVJbml0MiI+aW5mbGF0ZUluaXQyPC9hPi4KLSAgIDxwPgotCi0gICAgICA8YSBocmVmPSIjaW5mbGF0ZVJlc2V0Ij5pbmZsYXRlUmVzZXQ8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIG9yIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzb3VyY2UKLSAgIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gb3IgPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gYmVpbmcgTlVMTCkuCi0gICA8cD4KLTwvZGw+Ci0KLTxocj4KLTxhIG5hbWU9IkNoZWNrc3VtIGZ1bmN0aW9ucyI+PGgyPiBDaGVja3N1bSBmdW5jdGlvbnMgPC9oMj4KLSAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcmVsYXRlZCB0byBjb21wcmVzc2lvbiBidXQgYXJlIGV4cG9ydGVkCi0gICBhbnl3YXkgYmVjYXVzZSB0aGV5IG1pZ2h0IGJlIHVzZWZ1bCBpbiBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlCi0gICBjb21wcmVzc2lvbiBsaWJyYXJ5LgotPGgzPiBGdW5jdGlvbiBsaXN0IDwvaDM+Ci08dWw+Ci08bGk+IHVMb25nICA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4gKHVMb25nIDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+LCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbik7Ci08bGk+IHVMb25nICA8YSBocmVmPSIjY3JjMzIiPmNyYzMyPC9hPiAgICh1TG9uZyBjcmMsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKTsKLTwvdWw+Ci08aDM+IEZ1bmN0aW9uIGRlc2NyaXB0aW9uIDwvaDM+Ci08ZGw+Ci08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiB1TG9uZyAgPGEgbmFtZT0iYWRsZXIzMiI+YWRsZXIzMjwvYT4gKHVMb25nIDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+LCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbik7PC9mb250PgotPGRkPgotICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kCi0gICByZXR1cm4gdGhlIHVwZGF0ZWQgY2hlY2tzdW0uIElmIGJ1ZiBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLSAgIHRoZSByZXF1aXJlZCBpbml0aWFsIHZhbHVlIGZvciB0aGUgY2hlY2tzdW0uCi0gICA8cD4KLSAgIEFuIEFkbGVyLTMyIGNoZWNrc3VtIGlzIGFsbW9zdCBhcyByZWxpYWJsZSBhcyBhIENSQzMyIGJ1dCBjYW4gYmUgY29tcHV0ZWQKLSAgIG11Y2ggZmFzdGVyLiBVc2FnZSBleGFtcGxlOgotICAgPHByZT4KLQotICAgICB1TG9uZyA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiA9IDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPigwTCwgPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiwgMCk7Ci0KLSAgICAgd2hpbGUgKHJlYWRfYnVmZmVyKGJ1ZmZlciwgbGVuZ3RoKSAhPSBFT0YpIHsKLSAgICAgICA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiA9IDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPig8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiwgYnVmZmVyLCBsZW5ndGgpOwotICAgICB9Ci0gICAgIGlmICg8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiAhPSBvcmlnaW5hbF9hZGxlcikgZXJyb3IoKTsKLSAgIDwvcHJlPgotCi08Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiB1TG9uZyAgPGEgbmFtZT0iY3JjMzIiPmNyYzMyPC9hPiAgICh1TG9uZyBjcmMsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKTs8L2ZvbnQ+Ci08ZGQ+Ci0gICAgIFVwZGF0ZSBhIHJ1bm5pbmcgY3JjIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kIHJldHVybiB0aGUgdXBkYXRlZAotICAgY3JjLiBJZiBidWYgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1aXJlZCBpbml0aWFsIHZhbHVlCi0gICBmb3IgdGhlIGNyYy4gUHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzIHBlcmZvcm1lZAotICAgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgotICAgVXNhZ2UgZXhhbXBsZToKLSAgIDxwcmU+Ci0KLSAgICAgdUxvbmcgY3JjID0gPGEgaHJlZj0iI2NyYzMyIj5jcmMzMjwvYT4oMEwsIDxhIGhyZWY9IiNaX05VTEwiPlpfTlVMTDwvYT4sIDApOwotCi0gICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7Ci0gICAgICAgY3JjID0gPGEgaHJlZj0iI2NyYzMyIj5jcmMzMjwvYT4oY3JjLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgIH0KLSAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7Ci0gICA8L3ByZT4KLTwvZGw+Ci08aHI+Ci08YSBuYW1lPSJzdHJ1Y3Qgel9zdHJlYW1fcyI+PGgyPiBzdHJ1Y3Qgel9zdHJlYW1fcyA8L2gyPgotPGZvbnQgY29sb3I9IkJsdWUiPgotPGEgbmFtZT0iel9zdHJlYW1fcyI+Ci08cHJlPgotdHlwZWRlZiBzdHJ1Y3Qgel9zdHJlYW1fcyB7Ci0gICAgQnl0ZWYgICAgKjxhIG5hbWU9Im5leHRfaW4iPm5leHRfaW48L2E+OyAgLyogbmV4dCBpbnB1dCBieXRlICovCi0gICAgdUludCAgICAgPGEgbmFtZT0iYXZhaWxfaW4iPmF2YWlsX2luPC9hPjsgIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+ICovCi0gICAgdUxvbmcgICAgPGEgbmFtZT0idG90YWxfaW4iPnRvdGFsX2luPC9hPjsgIC8qIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICovCi0KLSAgICBCeXRlZiAgICAqPGEgbmFtZT0ibmV4dF9vdXQiPm5leHRfb3V0PC9hPjsgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovCi0gICAgdUludCAgICAgPGEgbmFtZT0iYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+OyAvKiByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiAqLwotICAgIHVMb25nICAgIDxhIG5hbWU9InRvdGFsX291dCI+dG90YWxfb3V0PC9hPjsgLyogdG90YWwgbmIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqLwotCi0gICAgY2hhciAgICAgKjxhIG5hbWU9Im1zZyI+bXNnPC9hPjsgICAgICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi8KLSAgICBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICo8YSBuYW1lPSJzdGF0ZSI+c3RhdGU8L2E+OyAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi8KLQotICAgIGFsbG9jX2Z1bmMgPGEgbmFtZT0iemFsbG9jIj56YWxsb2M8L2E+OyAgLyogdXNlZCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gKi8KLSAgICBmcmVlX2Z1bmMgIDxhIG5hbWU9InpmcmVlIj56ZnJlZTwvYT47ICAgLyogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiAqLwotICAgIHZvaWRwZiAgICAgPGEgbmFtZT0ib3BhcXVlIj5vcGFxdWU8L2E+OyAgLyogcHJpdmF0ZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBhbmQgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gKi8KLQotICAgIGludCAgICAgPGEgbmFtZT0iZGF0YV90eXBlIj5kYXRhX3R5cGU8L2E+OyAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBhc2NpaSBvciBiaW5hcnkgKi8KLSAgICB1TG9uZyAgIDxhIG5hbWU9ImFkbGVyIj5hZGxlcjwvYT47ICAgICAgLyogPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqLwotICAgIHVMb25nICAgPGEgbmFtZT0icmVzZXJ2ZWQiPnJlc2VydmVkPC9hPjsgICAvKiA8YSBocmVmPSIjcmVzZXJ2ZWQiPnJlc2VydmVkPC9hPiBmb3IgZnV0dXJlIHVzZSAqLwotfSA8YSBocmVmPSIjel9zdHJlYW1fcyI+el9zdHJlYW08L2E+IDsKLQotdHlwZWRlZiA8YSBocmVmPSIjel9zdHJlYW1fcyI+el9zdHJlYW08L2E+IEZBUiAqIDxhIG5hbWU9Inpfc3RyZWFtcCI+el9zdHJlYW1wPC9hPjsgIP8KLTwvcHJlPgotPC9mb250PgotICAgVGhlIGFwcGxpY2F0aW9uIG11c3QgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gd2hlbiA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBoYXMKLSAgIGRyb3BwZWQgdG8gemVyby4gSXQgbXVzdCB1cGRhdGUgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gd2hlbiA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+Ci0gICBoYXMgZHJvcHBlZCB0byB6ZXJvLiBUaGUgYXBwbGljYXRpb24gbXVzdCBpbml0aWFsaXplIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFuZAotICAgPGEgaHJlZj0iI29wYXF1ZSI+b3BhcXVlPC9hPiBiZWZvcmUgY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbi4gQWxsIG90aGVyIGZpZWxkcyBhcmUgc2V0IGJ5IHRoZQotICAgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgbXVzdCBub3QgYmUgdXBkYXRlZCBieSB0aGUgYXBwbGljYXRpb24uIDxwPgotCi0gICBUaGUgPGEgaHJlZj0iI29wYXF1ZSI+b3BhcXVlPC9hPiB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0Ci0gICBwYXJhbWV0ZXIgZm9yIGNhbGxzIG9mIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+LiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGN1c3RvbQotICAgbWVtb3J5IG1hbmFnZW1lbnQuIFRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGF0dGFjaGVzIG5vIG1lYW5pbmcgdG8gdGhlCi0gICA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IHZhbHVlLiA8cD4KLQotICAgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBtdXN0IHJldHVybiA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+IGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb2JqZWN0LgotICAgSWYgemxpYiBpcyB1c2VkIGluIGEgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb24sIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IG11c3QgYmUKLSAgIHRocmVhZCBzYWZlLiA8cD4KLQotICAgT24gMTYtYml0IHN5c3RlbXMsIHRoZSBmdW5jdGlvbnMgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBhbmQgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gbXVzdCBiZSBhYmxlIHRvIGFsbG9jYXRlCi0gICBleGFjdGx5IDY1NTM2IGJ5dGVzLCBidXQgd2lsbCBub3QgYmUgcmVxdWlyZWQgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIHRoaXMKLSAgIGlmIHRoZSBzeW1ib2wgTUFYU0VHXzY0SyBpcyBkZWZpbmVkIChzZWUgemNvbmYuaCkuIFdBUk5JTkc6IE9uIE1TRE9TLAotICAgcG9pbnRlcnMgcmV0dXJuZWQgYnkgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBmb3Igb2JqZWN0cyBvZiBleGFjdGx5IDY1NTM2IGJ5dGVzICptdXN0KgotICAgaGF2ZSB0aGVpciBvZmZzZXQgbm9ybWFsaXplZCB0byB6ZXJvLiBUaGUgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9uCi0gICBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkgZW5zdXJlcyB0aGlzIChzZWUgenV0aWwuYykuIFRvIHJlZHVjZSBtZW1vcnkKLSAgIHJlcXVpcmVtZW50cyBhbmQgYXZvaWQgYW55IGFsbG9jYXRpb24gb2YgNjRLIG9iamVjdHMsIGF0IHRoZSBleHBlbnNlIG9mCi0gICBjb21wcmVzc2lvbiByYXRpbywgY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIC1ETUFYX1dCSVRTPTE0IChzZWUgemNvbmYuaCkuCi0gICA8cD4KLQotICAgVGhlIGZpZWxkcyA8YSBocmVmPSIjdG90YWxfaW4iPnRvdGFsX2luPC9hPiBhbmQgPGEgaHJlZj0iI3RvdGFsX291dCI+dG90YWxfb3V0PC9hPiBjYW4gYmUgdXNlZCBmb3Igc3RhdGlzdGljcyBvcgotICAgcHJvZ3Jlc3MgcmVwb3J0cy4gQWZ0ZXIgY29tcHJlc3Npb24sIDxhIGhyZWY9IiN0b3RhbF9pbiI+dG90YWxfaW48L2E+IGhvbGRzIHRoZSB0b3RhbCBzaXplIG9mCi0gICB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYW5kIG1heSBiZSBzYXZlZCBmb3IgdXNlIGluIHRoZSBkZWNvbXByZXNzb3IKLSAgIChwYXJ0aWN1bGFybHkgaWYgdGhlIGRlY29tcHJlc3NvciB3YW50cyB0byBkZWNvbXByZXNzIGV2ZXJ5dGhpbmcgaW4KLSAgIGEgc2luZ2xlIHN0ZXApLiA8cD4KLQotPGhyPgotPGEgbmFtZT0iQ29uc3RhbnRzIj48aDI+IENvbnN0YW50cyA8L2gyPgotPGZvbnQgY29sb3I9IkJsdWUiPgotPHByZT4KLSNkZWZpbmUgPGEgbmFtZT0iWl9OT19GTFVTSCI+Wl9OT19GTFVTSDwvYT4gICAgICAwCi0jZGVmaW5lIDxhIG5hbWU9IlpfUEFSVElBTF9GTFVTSCI+Wl9QQVJUSUFMX0ZMVVNIPC9hPiAxCi0JLyogd2lsbCBiZSByZW1vdmVkLCB1c2UgPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiBpbnN0ZWFkICovCi0jZGVmaW5lIDxhIG5hbWU9IlpfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiAgICAyCi0jZGVmaW5lIDxhIG5hbWU9IlpfRlVMTF9GTFVTSCI+Wl9GVUxMX0ZMVVNIPC9hPiAgICAzCi0jZGVmaW5lIDxhIG5hbWU9IlpfRklOSVNIIj5aX0ZJTklTSDwvYT4gICAgICAgIDQKLS8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzIDsgc2VlIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpIGJlbG93IGZvciBkZXRhaWxzICovCi0KLSNkZWZpbmUgPGEgbmFtZT0iWl9PSyI+Wl9PSzwvYT4gICAgICAgICAgICAwCi0jZGVmaW5lIDxhIG5hbWU9IlpfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiAgICAxCi0jZGVmaW5lIDxhIG5hbWU9IlpfTkVFRF9ESUNUIj5aX05FRURfRElDVDwvYT4gICAgIDIKLSNkZWZpbmUgPGEgbmFtZT0iWl9FUlJOTyI+Wl9FUlJOTzwvYT4gICAgICAgICgtMSkKLSNkZWZpbmUgPGEgbmFtZT0iWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiAoLTIpCi0jZGVmaW5lIDxhIG5hbWU9IlpfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPiAgICgtMykKLSNkZWZpbmUgPGEgbmFtZT0iWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiAgICAoLTQpCi0jZGVmaW5lIDxhIG5hbWU9IlpfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gICAgKC01KQotI2RlZmluZSA8YSBuYW1lPSJaX1ZFUlNJT05fRVJST1IiPlpfVkVSU0lPTl9FUlJPUjwvYT4gKC02KQotLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlCi0gKiB2YWx1ZXMgYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLgotICovCi0KLSNkZWZpbmUgPGEgbmFtZT0iWl9OT19DT01QUkVTU0lPTiI+Wl9OT19DT01QUkVTU0lPTjwvYT4gICAgICAgICAwCi0jZGVmaW5lIDxhIG5hbWU9IlpfQkVTVF9TUEVFRCI+Wl9CRVNUX1NQRUVEPC9hPiAgICAgICAgICAgICAxCi0jZGVmaW5lIDxhIG5hbWU9IlpfQkVTVF9DT01QUkVTU0lPTiI+Wl9CRVNUX0NPTVBSRVNTSU9OPC9hPiAgICAgICA5Ci0jZGVmaW5lIDxhIG5hbWU9IlpfREVGQVVMVF9DT01QUkVTU0lPTiI+Wl9ERUZBVUxUX0NPTVBSRVNTSU9OPC9hPiAgKC0xKQotLyogY29tcHJlc3Npb24gbGV2ZWxzICovCi0KLSNkZWZpbmUgPGEgbmFtZT0iWl9GSUxURVJFRCI+Wl9GSUxURVJFRDwvYT4gICAgICAgICAgICAxCi0jZGVmaW5lIDxhIG5hbWU9IlpfSFVGRk1BTl9PTkxZIj5aX0hVRkZNQU5fT05MWTwvYT4gICAgICAgIDIKLSNkZWZpbmUgPGEgbmFtZT0iWl9ERUZBVUxUX1NUUkFURUdZIj5aX0RFRkFVTFRfU1RSQVRFR1k8L2E+ICAgIDAKLS8qIGNvbXByZXNzaW9uIHN0cmF0ZWd5IDsgc2VlIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4oKSBiZWxvdyBmb3IgZGV0YWlscyAqLwotCi0jZGVmaW5lIDxhIG5hbWU9IlpfQklOQVJZIj5aX0JJTkFSWTwvYT4gICAwCi0jZGVmaW5lIDxhIG5hbWU9IlpfQVNDSUkiPlpfQVNDSUk8L2E+ICAgIDEKLSNkZWZpbmUgPGEgbmFtZT0iWl9VTktOT1dOIj5aX1VOS05PV048L2E+ICAyCi0vKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIDxhIGhyZWY9IiNkYXRhX3R5cGUiPmRhdGFfdHlwZTwvYT4gZmllbGQgKi8KLQotI2RlZmluZSA8YSBuYW1lPSJaX0RFRkxBVEVEIj5aX0RFRkxBVEVEPC9hPiAgIDgKLS8qIFRoZSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gY29tcHJlc3Npb24gbWV0aG9kICh0aGUgb25seSBvbmUgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbikgKi8KLQotI2RlZmluZSA8YSBuYW1lPSJaX05VTEwiPlpfTlVMTDwvYT4gIDAgIC8qIGZvciBpbml0aWFsaXppbmcgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4sIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gKi8KLQotI2RlZmluZSA8YSBuYW1lPSJ6bGliX3ZlcnNpb24iPnpsaWJfdmVyc2lvbjwvYT4gPGEgaHJlZj0iI3psaWJWZXJzaW9uIj56bGliVmVyc2lvbjwvYT4oKQotLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9ucyBsZXNzIHRoYW4gMS4wLjIgKi8KLTwvcHJlPgotPC9mb250PgotCi08aHI+Ci08YSBuYW1lPSJNaXNjIj48aDI+IE1pc2MgPC9oMj4KLSA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBhbmQgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gYXJlIG1hY3JvcyB0byBhbGxvdyBjaGVja2luZyB0aGUgemxpYiB2ZXJzaW9uCi0gYW5kIHRoZSBjb21waWxlcidzIHZpZXcgb2YgPGEgaHJlZj0iI3pfc3RyZWFtX3MiPnpfc3RyZWFtPC9hPi4KLSA8cD4KLSBPdGhlciBmdW5jdGlvbnM6Ci0gPGRsPgotIDxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGNvbnN0IGNoYXIgICAqICA8YSBuYW1lPSJ6RXJyb3IiPnpFcnJvcjwvYT4gICAgICAgICAgIChpbnQgZXJyKTs8L2ZvbnQ+Ci0gPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICAgICAgICAgIDxhIG5hbWU9ImluZmxhdGVTeW5jUG9pbnQiPmluZmxhdGVTeW5jUG9pbnQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHopOzwvZm9udD4KLSA8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBjb25zdCB1TG9uZ2YgKiAgPGEgbmFtZT0iZ2V0X2NyY190YWJsZSI+Z2V0X2NyY190YWJsZTwvYT4gICAgKHZvaWQpOzwvZm9udD4KLSA8L2RsPgotIDxocj4KLSA8Zm9udCBzaXplPSItMSI+Ci0gTGFzdCB1cGRhdGU6IFdlZCBPY3QgMTMgMjA6NDI6MzQgMTk5OTxicj4KLSBwaWFwaUBjc2llLm50dS5lZHUudHcKLSA8L2ZvbnQ+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3FueC9wYWNrYWdlLnFwZyBiL3FueC9wYWNrYWdlLnFwZwppbmRleCBhNDg3MmIwLi4zODRiY2YyIDEwMDY0NAotLS0gYS9xbngvcGFja2FnZS5xcGcKKysrIGIvcW54L3BhY2thZ2UucXBnCkBAIC0yNSwxMCArMjUsMTAgQEAKICAgICAgIDxRUEc6RmlsZXM+CiAgICAgICAgICA8UVBHOkFkZCBmaWxlPSIuLi96Y29uZi5oIiBpbnN0YWxsPSIvb3B0L2luY2x1ZGUvIiB1c2VyPSJyb290OnN5cyIgcGVybWlzc2lvbj0iNjQ0Ii8+CiAgICAgICAgICA8UVBHOkFkZCBmaWxlPSIuLi96bGliLmgiIGluc3RhbGw9Ii9vcHQvaW5jbHVkZS8iIHVzZXI9InJvb3Q6c3lzIiBwZXJtaXNzaW9uPSI2NDQiLz4KLSAgICAgICAgIDxRUEc6QWRkIGZpbGU9Ii4uL2xpYnouc28uMS4yLjMuNSIgaW5zdGFsbD0iL29wdC9saWIvIiB1c2VyPSJyb290OmJpbiIgcGVybWlzc2lvbj0iNjQ0Ii8+Ci0gICAgICAgICA8UVBHOkFkZCBmaWxlPSJsaWJ6LnNvIiBpbnN0YWxsPSIvb3B0L2xpYi8iIGNvbXBvbmVudD0iZGV2IiBmaWxldHlwZT0ic3ltbGluayIgbGlua3RvPSJsaWJ6LnNvLjEuMi4zLjUiLz4KLSAgICAgICAgIDxRUEc6QWRkIGZpbGU9ImxpYnouc28uMSIgaW5zdGFsbD0iL29wdC9saWIvIiBmaWxldHlwZT0ic3ltbGluayIgbGlua3RvPSJsaWJ6LnNvLjEuMi4zLjUiLz4KLSAgICAgICAgIDxRUEc6QWRkIGZpbGU9Ii4uL2xpYnouc28uMS4yLjMuNSIgaW5zdGFsbD0iL29wdC9saWIvIiBjb21wb25lbnQ9InNsaWIiLz4KKyAgICAgICAgIDxRUEc6QWRkIGZpbGU9Ii4uL2xpYnouc28uMS4yLjMuNiIgaW5zdGFsbD0iL29wdC9saWIvIiB1c2VyPSJyb290OmJpbiIgcGVybWlzc2lvbj0iNjQ0Ii8+CisgICAgICAgICA8UVBHOkFkZCBmaWxlPSJsaWJ6LnNvIiBpbnN0YWxsPSIvb3B0L2xpYi8iIGNvbXBvbmVudD0iZGV2IiBmaWxldHlwZT0ic3ltbGluayIgbGlua3RvPSJsaWJ6LnNvLjEuMi4zLjYiLz4KKyAgICAgICAgIDxRUEc6QWRkIGZpbGU9ImxpYnouc28uMSIgaW5zdGFsbD0iL29wdC9saWIvIiBmaWxldHlwZT0ic3ltbGluayIgbGlua3RvPSJsaWJ6LnNvLjEuMi4zLjYiLz4KKyAgICAgICAgIDxRUEc6QWRkIGZpbGU9Ii4uL2xpYnouc28uMS4yLjMuNiIgaW5zdGFsbD0iL29wdC9saWIvIiBjb21wb25lbnQ9InNsaWIiLz4KICAgICAgIDwvUVBHOkZpbGVzPgogCiAgICAgICA8UVBHOlBhY2thZ2VGaWx0ZXI+CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgICAgICA8L1FQTTpQcm9kdWN0RGVzY3JpcHRpb24+CiAKICAgICAgICAgICAgIDxRUE06UmVsZWFzZURlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPFFQTTpSZWxlYXNlVmVyc2lvbj4xLjIuMy41PC9RUE06UmVsZWFzZVZlcnNpb24+CisgICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VWZXJzaW9uPjEuMi4zLjY8L1FQTTpSZWxlYXNlVmVyc2lvbj4KICAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZVVyZ2VuY3k+TWVkaXVtPC9RUE06UmVsZWFzZVVyZ2VuY3k+CiAgICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VTdGFiaWxpdHk+U3RhYmxlPC9RUE06UmVsZWFzZVN0YWJpbGl0eT4KICAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZU5vdGVNaW5vcj48L1FQTTpSZWxlYXNlTm90ZU1pbm9yPgpkaWZmIC0tZ2l0IGEvdW5jb21wci5jIGIvdW5jb21wci5jCmluZGV4IGI1OWUzZDAuLmFkOThiZTMgMTAwNjQ0Ci0tLSBhL3VuY29tcHIuYworKysgYi91bmNvbXByLmMKQEAgLTEsNSArMSw1IEBACiAvKiB1bmNvbXByLmMgLS0gZGVjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMywgMjAxMCBKZWFuLWxvdXAgR2FpbGx5LgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKQEAgLTE2LDggKzE2LDYgQEAKICAgIGJlZW4gc2F2ZWQgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvcgogICAgYnkgc29tZSBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjb21wcmVzc2lvbiBsaWJyYXJ5LikKICAgIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLgotICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCi0gICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCiAKICAgICAgdW5jb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAogICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CmRpZmYgLS1naXQgYS96Y29uZi5oIGIvemNvbmYuaAppbmRleCA1YTJkMWVmLi4wNjYxODk4IDEwMDY0NAotLS0gYS96Y29uZi5oCisrKyBiL3pjb25mLmgKQEAgLTM4MiwxOSArMzgyLDE5IEBACiAKIC8qIE1WUyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBuYW1lcyBsYXJnZXIgdGhhbiA4IGJ5dGVzICovCiAjaWYgZGVmaW5lZChfX01WU19fKQotIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXRfLCJERUlOIikKLSMgICBwcmFnbWEgbWFwKGRlZmxhdGVJbml0Ml8sIkRFSU4yIikKLSMgICBwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKLSMgICBwcmFnbWEgbWFwKGRlZmxhdGVCb3VuZCwiREVCTkQiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXRfLCJJTklOIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVFbmQsIklORU5EIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVTeW5jLCJJTlNZIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQotIyAgIHByYWdtYSBtYXAoY29tcHJlc3NCb3VuZCwiQ01CTkQiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV90YWJsZSwiSU5UQUJMIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX2NvcHlyaWdodCwiSU5DT1BZIikKKyAgI3ByYWdtYSBtYXAoZGVmbGF0ZUluaXRfLCJERUlOIikKKyAgI3ByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQorICAjcHJhZ21hIG1hcChkZWZsYXRlRW5kLCJERUVORCIpCisgICNwcmFnbWEgbWFwKGRlZmxhdGVCb3VuZCwiREVCTkQiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQorICAjcHJhZ21hIG1hcChpbmZsYXRlSW5pdDJfLCJJTklOMiIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVFbmQsIklORU5EIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlU2V0RGljdGlvbmFyeSwiSU5TRURJIikKKyAgI3ByYWdtYSBtYXAoY29tcHJlc3NCb3VuZCwiQ01CTkQiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlX3RhYmxlLCJJTlRBQkwiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlX2Zhc3QsIklORkEiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlX2NvcHlyaWdodCwiSU5DT1BZIikKICNlbmRpZgogCiAjZW5kaWYgLyogWkNPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvemxpYi4zIGIvemxpYi4zCmluZGV4IGRiNDRlOWQuLjgwMmRiODggMTAwNjQ0Ci0tLSBhL3psaWIuMworKysgYi96bGliLjMKQEAgLTEsNCArMSw0IEBACi0uVEggWkxJQiAzICI4IEphbnVhcnkgMjAxMCIKKy5USCBaTElCIDMgIjE3IEphbnVhcnkgMjAxMCIKIC5TSCBOQU1FCiB6bGliIFwtIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gbGlicmFyeQogLlNIIFNZTk9QU0lTCkBAIC0xNyw3ICsxNyw2IEBACiBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lIHN0cmVhbSBpbnRlcmZhY2UuCiAuTFAKIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlIGVub3VnaAotKGZvciBleGFtcGxlIGlmIGFuIGlucHV0IGZpbGUgaXMgbW1hcCdlZCksCiBvciBjYW4gYmUgZG9uZSBieSByZXBlYXRlZCBjYWxscyBvZiB0aGUgY29tcHJlc3Npb24gZnVuY3Rpb24uCiBJbiB0aGUgbGF0dGVyIGNhc2UsCiB0aGUgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dApAQCAtMTMzLDggKzEzMiw4IEBACiBTZW5kIHF1ZXN0aW9ucyBhbmQvb3IgY29tbWVudHMgdG8gemxpYkBnemlwLm9yZywKIG9yIChmb3IgdGhlIFdpbmRvd3MgRExMIHZlcnNpb24pIHRvIEdpbGxlcyBWb2xsYW50IChpbmZvQHdpbmltYWdlLmNvbSkuCiAuU0ggQVVUSE9SUwotVmVyc2lvbiAxLjIuMy41Ci1Db3B5cmlnaHQgKEMpIDE5OTUtMjAwOSBKZWFuLWxvdXAgR2FpbGx5IChqbG91cEBnemlwLm9yZykKK1ZlcnNpb24gMS4yLjMuNgorQ29weXJpZ2h0IChDKSAxOTk1LTIwMTAgSmVhbi1sb3VwIEdhaWxseSAoamxvdXBAZ3ppcC5vcmcpCiBhbmQgTWFyayBBZGxlciAobWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdSkuCiAuTFAKIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzLWlzLCIKZGlmZiAtLWdpdCBhL3psaWIuaCBiL3psaWIuaAppbmRleCAxMWQ2OTAyLi5hNzUxYjMwIDEwMDY0NAotLS0gYS96bGliLmgKKysrIGIvemxpYi5oCkBAIC0xLDUgKzEsNSBAQAogLyogemxpYi5oIC0tIGludGVyZmFjZSBvZiB0aGUgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gIHZlcnNpb24gMS4yLjMuNSwgSmFuIDh0aCwgMjAxMAorICB2ZXJzaW9uIDEuMi4zLjYsIEphbiAxN3RoLCAyMDEwCiAKICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMTAgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgogCkBAIC0zNyw0NCArMzcsNDMgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLSNkZWZpbmUgWkxJQl9WRVJTSU9OICIxLjIuMy41IgotI2RlZmluZSBaTElCX1ZFUk5VTSAweDEyMzUKKyNkZWZpbmUgWkxJQl9WRVJTSU9OICIxLjIuMy42IgorI2RlZmluZSBaTElCX1ZFUk5VTSAweDEyMzYKICNkZWZpbmUgWkxJQl9WRVJfTUFKT1IgMQogI2RlZmluZSBaTElCX1ZFUl9NSU5PUiAyCiAjZGVmaW5lIFpMSUJfVkVSX1JFVklTSU9OIDMKIAogLyoKLSAgICAgVGhlICd6bGliJyBjb21wcmVzc2lvbiBsaWJyYXJ5IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQKLSAgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQKLSAgZGF0YS4gIFRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBzdXBwb3J0cyBvbmx5IG9uZSBjb21wcmVzc2lvbiBtZXRob2QKLSAgKGRlZmxhdGlvbikgYnV0IG90aGVyIGFsZ29yaXRobXMgd2lsbCBiZSBhZGRlZCBsYXRlciBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lCi0gIHN0cmVhbSBpbnRlcmZhY2UuCisgICAgVGhlICd6bGliJyBjb21wcmVzc2lvbiBsaWJyYXJ5IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQKKyAgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4KKyAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZCAoZGVmbGF0aW9uKQorICBidXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWUgc3RyZWFtCisgIGludGVyZmFjZS4KIAotICAgICBDb21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwIGlmIHRoZSBidWZmZXJzIGFyZSBsYXJnZQotICBlbm91Z2ggKGZvciBleGFtcGxlIGlmIGFuIGlucHV0IGZpbGUgaXMgbW1hcCdlZCksIG9yIGNhbiBiZSBkb25lIGJ5Ci0gIHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlCi0gIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1lIHRoZSBvdXRwdXQKKyAgICBDb21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwIGlmIHRoZSBidWZmZXJzIGFyZSBsYXJnZSBlbm91Z2gsCisgIG9yIGNhbiBiZSBkb25lIGJ5IHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4gIEluIHRoZSBsYXR0ZXIKKyAgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1lIHRoZSBvdXRwdXQKICAgKHByb3ZpZGluZyBtb3JlIG91dHB1dCBzcGFjZSkgYmVmb3JlIGVhY2ggY2FsbC4KIAotICAgICBUaGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCB1c2VkIGJ5IGRlZmF1bHQgYnkgdGhlIGluLW1lbW9yeSBmdW5jdGlvbnMgaXMKKyAgICBUaGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCB1c2VkIGJ5IGRlZmF1bHQgYnkgdGhlIGluLW1lbW9yeSBmdW5jdGlvbnMgaXMKICAgdGhlIHpsaWIgZm9ybWF0LCB3aGljaCBpcyBhIHpsaWIgd3JhcHBlciBkb2N1bWVudGVkIGluIFJGQyAxOTUwLCB3cmFwcGVkCiAgIGFyb3VuZCBhIGRlZmxhdGUgc3RyZWFtLCB3aGljaCBpcyBpdHNlbGYgZG9jdW1lbnRlZCBpbiBSRkMgMTk1MS4KIAotICAgICBUaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4gZ3ppcCAoLmd6KSBmb3JtYXQKKyAgICBUaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4gZ3ppcCAoLmd6KSBmb3JtYXQKICAgd2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvIHVzaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzdGFydAogICB3aXRoICJneiIuICBUaGUgZ3ppcCBmb3JtYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHpsaWIgZm9ybWF0LiAgZ3ppcCBpcyBhCiAgIGd6aXAgd3JhcHBlciwgZG9jdW1lbnRlZCBpbiBSRkMgMTk1Miwgd3JhcHBlZCBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbS4KIAotICAgICBUaGlzIGxpYnJhcnkgY2FuIG9wdGlvbmFsbHkgcmVhZCBhbmQgd3JpdGUgZ3ppcCBzdHJlYW1zIGluIG1lbW9yeSBhcyB3ZWxsLgorICAgIFRoaXMgbGlicmFyeSBjYW4gb3B0aW9uYWxseSByZWFkIGFuZCB3cml0ZSBnemlwIHN0cmVhbXMgaW4gbWVtb3J5IGFzIHdlbGwuCiAKLSAgICAgVGhlIHpsaWIgZm9ybWF0IHdhcyBkZXNpZ25lZCB0byBiZSBjb21wYWN0IGFuZCBmYXN0IGZvciB1c2UgaW4gbWVtb3J5CisgICAgVGhlIHpsaWIgZm9ybWF0IHdhcyBkZXNpZ25lZCB0byBiZSBjb21wYWN0IGFuZCBmYXN0IGZvciB1c2UgaW4gbWVtb3J5CiAgIGFuZCBvbiBjb21tdW5pY2F0aW9ucyBjaGFubmVscy4gIFRoZSBnemlwIGZvcm1hdCB3YXMgZGVzaWduZWQgZm9yIHNpbmdsZS0KICAgZmlsZSBjb21wcmVzc2lvbiBvbiBmaWxlIHN5c3RlbXMsIGhhcyBhIGxhcmdlciBoZWFkZXIgdGhhbiB6bGliIHRvIG1haW50YWluCiAgIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiwgYW5kIHVzZXMgYSBkaWZmZXJlbnQsIHNsb3dlciBjaGVjayBtZXRob2QgdGhhbiB6bGliLgogCi0gICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiBUaGUgZGVjb2RlciBjaGVja3MKLSAgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsIHNvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlcgotICBjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgorICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiAgVGhlIGRlY29kZXIgY2hlY2tzCisgIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLCBzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIgY3Jhc2gKKyAgZXZlbiBpbiBjYXNlIG9mIGNvcnJ1cHRlZCBpbnB1dC4KICovCiAKIHR5cGVkZWYgdm9pZHBmICgqYWxsb2NfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSkpOwpAQCAtMTI5LDM1ICsxMjgsMzQgQEAKIHR5cGVkZWYgZ3pfaGVhZGVyIEZBUiAqZ3pfaGVhZGVycDsKIAogLyoKLSAgIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbiB3aGVuIGF2YWlsX2luIGhhcwotICAgZHJvcHBlZCB0byB6ZXJvLiBJdCBtdXN0IHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0IHdoZW4gYXZhaWxfb3V0Ci0gICBoYXMgZHJvcHBlZCB0byB6ZXJvLiBUaGUgYXBwbGljYXRpb24gbXVzdCBpbml0aWFsaXplIHphbGxvYywgemZyZWUgYW5kCi0gICBvcGFxdWUgYmVmb3JlIGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24uIEFsbCBvdGhlciBmaWVsZHMgYXJlIHNldCBieSB0aGUKLSAgIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIG11c3Qgbm90IGJlIHVwZGF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICBUaGUgYXBwbGljYXRpb24gbXVzdCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4gd2hlbiBhdmFpbF9pbiBoYXMgZHJvcHBlZAorICAgdG8gemVyby4gIEl0IG11c3QgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgd2hlbiBhdmFpbF9vdXQgaGFzIGRyb3BwZWQKKyAgIHRvIHplcm8uICBUaGUgYXBwbGljYXRpb24gbXVzdCBpbml0aWFsaXplIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBiZWZvcmUKKyAgIGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24uICBBbGwgb3RoZXIgZmllbGRzIGFyZSBzZXQgYnkgdGhlIGNvbXByZXNzaW9uCisgICBsaWJyYXJ5IGFuZCBtdXN0IG5vdCBiZSB1cGRhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KIAotICAgVGhlIG9wYXF1ZSB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0Ci0gICBwYXJhbWV0ZXIgZm9yIGNhbGxzIG9mIHphbGxvYyBhbmQgemZyZWUuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgY3VzdG9tCi0gICBtZW1vcnkgbWFuYWdlbWVudC4gVGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXR0YWNoZXMgbm8gbWVhbmluZyB0byB0aGUKKyAgICAgVGhlIG9wYXF1ZSB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0CisgICBwYXJhbWV0ZXIgZm9yIGNhbGxzIG9mIHphbGxvYyBhbmQgemZyZWUuICBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGN1c3RvbQorICAgbWVtb3J5IG1hbmFnZW1lbnQuICBUaGUgY29tcHJlc3Npb24gbGlicmFyeSBhdHRhY2hlcyBubyBtZWFuaW5nIHRvIHRoZQogICAgb3BhcXVlIHZhbHVlLgogCi0gICB6YWxsb2MgbXVzdCByZXR1cm4gWl9OVUxMIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb2JqZWN0LgorICAgICB6YWxsb2MgbXVzdCByZXR1cm4gWl9OVUxMIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb2JqZWN0LgogICAgSWYgemxpYiBpcyB1c2VkIGluIGEgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb24sIHphbGxvYyBhbmQgemZyZWUgbXVzdCBiZQogICAgdGhyZWFkIHNhZmUuCiAKLSAgIE9uIDE2LWJpdCBzeXN0ZW1zLCB0aGUgZnVuY3Rpb25zIHphbGxvYyBhbmQgemZyZWUgbXVzdCBiZSBhYmxlIHRvIGFsbG9jYXRlCi0gICBleGFjdGx5IDY1NTM2IGJ5dGVzLCBidXQgd2lsbCBub3QgYmUgcmVxdWlyZWQgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIHRoaXMKLSAgIGlmIHRoZSBzeW1ib2wgTUFYU0VHXzY0SyBpcyBkZWZpbmVkIChzZWUgemNvbmYuaCkuIFdBUk5JTkc6IE9uIE1TRE9TLAotICAgcG9pbnRlcnMgcmV0dXJuZWQgYnkgemFsbG9jIGZvciBvYmplY3RzIG9mIGV4YWN0bHkgNjU1MzYgYnl0ZXMgKm11c3QqCi0gICBoYXZlIHRoZWlyIG9mZnNldCBub3JtYWxpemVkIHRvIHplcm8uIFRoZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb24KLSAgIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeSBlbnN1cmVzIHRoaXMgKHNlZSB6dXRpbC5jKS4gVG8gcmVkdWNlIG1lbW9yeQotICAgcmVxdWlyZW1lbnRzIGFuZCBhdm9pZCBhbnkgYWxsb2NhdGlvbiBvZiA2NEsgb2JqZWN0cywgYXQgdGhlIGV4cGVuc2Ugb2YKLSAgIGNvbXByZXNzaW9uIHJhdGlvLCBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggLURNQVhfV0JJVFM9MTQgKHNlZSB6Y29uZi5oKS4KKyAgICAgT24gMTYtYml0IHN5c3RlbXMsIHRoZSBmdW5jdGlvbnMgemFsbG9jIGFuZCB6ZnJlZSBtdXN0IGJlIGFibGUgdG8gYWxsb2NhdGUKKyAgIGV4YWN0bHkgNjU1MzYgYnl0ZXMsIGJ1dCB3aWxsIG5vdCBiZSByZXF1aXJlZCB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gdGhpcyBpZgorICAgdGhlIHN5bWJvbCBNQVhTRUdfNjRLIGlzIGRlZmluZWQgKHNlZSB6Y29uZi5oKS4gIFdBUk5JTkc6IE9uIE1TRE9TLCBwb2ludGVycworICAgcmV0dXJuZWQgYnkgemFsbG9jIGZvciBvYmplY3RzIG9mIGV4YWN0bHkgNjU1MzYgYnl0ZXMgKm11c3QqIGhhdmUgdGhlaXIKKyAgIG9mZnNldCBub3JtYWxpemVkIHRvIHplcm8uICBUaGUgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHRoaXMKKyAgIGxpYnJhcnkgZW5zdXJlcyB0aGlzIChzZWUgenV0aWwuYykuICBUbyByZWR1Y2UgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgYXZvaWQKKyAgIGFueSBhbGxvY2F0aW9uIG9mIDY0SyBvYmplY3RzLCBhdCB0aGUgZXhwZW5zZSBvZiBjb21wcmVzc2lvbiByYXRpbywgY29tcGlsZQorICAgdGhlIGxpYnJhcnkgd2l0aCAtRE1BWF9XQklUUz0xNCAoc2VlIHpjb25mLmgpLgogCi0gICBUaGUgZmllbGRzIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQgY2FuIGJlIHVzZWQgZm9yIHN0YXRpc3RpY3Mgb3IKLSAgIHByb2dyZXNzIHJlcG9ydHMuIEFmdGVyIGNvbXByZXNzaW9uLCB0b3RhbF9pbiBob2xkcyB0aGUgdG90YWwgc2l6ZSBvZgotICAgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFuZCBtYXkgYmUgc2F2ZWQgZm9yIHVzZSBpbiB0aGUgZGVjb21wcmVzc29yCi0gICAocGFydGljdWxhcmx5IGlmIHRoZSBkZWNvbXByZXNzb3Igd2FudHMgdG8gZGVjb21wcmVzcyBldmVyeXRoaW5nIGluCi0gICBhIHNpbmdsZSBzdGVwKS4KKyAgICAgVGhlIGZpZWxkcyB0b3RhbF9pbiBhbmQgdG90YWxfb3V0IGNhbiBiZSB1c2VkIGZvciBzdGF0aXN0aWNzIG9yIHByb2dyZXNzCisgICByZXBvcnRzLiAgQWZ0ZXIgY29tcHJlc3Npb24sIHRvdGFsX2luIGhvbGRzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgYW5kIG1heSBiZSBzYXZlZCBmb3IgdXNlIGluIHRoZSBkZWNvbXByZXNzb3IgKHBhcnRpY3VsYXJseQorICAgaWYgdGhlIGRlY29tcHJlc3NvciB3YW50cyB0byBkZWNvbXByZXNzIGV2ZXJ5dGhpbmcgaW4gYSBzaW5nbGUgc3RlcCkuCiAqLwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25zdGFudHMgKi8KQEAgLTE4MCw4ICsxNzgsOCBAQAogI2RlZmluZSBaX01FTV9FUlJPUiAgICAoLTQpCiAjZGVmaW5lIFpfQlVGX0VSUk9SICAgICgtNSkKICNkZWZpbmUgWl9WRVJTSU9OX0VSUk9SICgtNikKLS8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZQotICogdmFsdWVzIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KKy8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXMKKyAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KICAqLwogCiAjZGVmaW5lIFpfTk9fQ09NUFJFU1NJT04gICAgICAgICAwCkBAIC0yMTUsNjMgKzIxMyw2MyBAQAogCiBaRVhURVJOIGNvbnN0IGNoYXIgKiBaRVhQT1JUIHpsaWJWZXJzaW9uIE9GKCh2b2lkKSk7CiAvKiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbXBhcmUgemxpYlZlcnNpb24gYW5kIFpMSUJfVkVSU0lPTiBmb3IgY29uc2lzdGVuY3kuCi0gICBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGRpZmZlcnMsIHRoZSBsaWJyYXJ5IGNvZGUgYWN0dWFsbHkgdXNlZCBpcwotICAgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgemxpYi5oIGhlYWRlciBmaWxlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgotICAgVGhpcyBjaGVjayBpcyBhdXRvbWF0aWNhbGx5IG1hZGUgYnkgZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0LgorICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBkaWZmZXJzLCB0aGUgbGlicmFyeSBjb2RlIGFjdHVhbGx5IHVzZWQgaXMgbm90CisgICBjb21wYXRpYmxlIHdpdGggdGhlIHpsaWIuaCBoZWFkZXIgZmlsZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMgY2hlY2sKKyAgIGlzIGF1dG9tYXRpY2FsbHkgbWFkZSBieSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQuCiAgKi8KIAogLyoKIFpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgbGV2ZWwpKTsKIAotICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBjb21wcmVzc2lvbi4gVGhlIGZpZWxkcwotICAgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuCi0gICBJZiB6YWxsb2MgYW5kIHpmcmVlIGFyZSBzZXQgdG8gWl9OVUxMLCBkZWZsYXRlSW5pdCB1cGRhdGVzIHRoZW0gdG8KLSAgIHVzZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb25zLgorICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBjb21wcmVzc2lvbi4gIFRoZSBmaWVsZHMKKyAgIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieSB0aGUgY2FsbGVyLiAgSWYKKyAgIHphbGxvYyBhbmQgemZyZWUgYXJlIHNldCB0byBaX05VTEwsIGRlZmxhdGVJbml0IHVwZGF0ZXMgdGhlbSB0byB1c2UgZGVmYXVsdAorICAgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCiAKICAgICAgVGhlIGNvbXByZXNzaW9uIGxldmVsIG11c3QgYmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OLCBvciBiZXR3ZWVuIDAgYW5kIDk6Ci0gICAxIGdpdmVzIGJlc3Qgc3BlZWQsIDkgZ2l2ZXMgYmVzdCBjb21wcmVzc2lvbiwgMCBnaXZlcyBubyBjb21wcmVzc2lvbiBhdAotICAgYWxsICh0aGUgaW5wdXQgZGF0YSBpcyBzaW1wbHkgY29waWVkIGEgYmxvY2sgYXQgYSB0aW1lKS4KLSAgIFpfREVGQVVMVF9DT01QUkVTU0lPTiByZXF1ZXN0cyBhIGRlZmF1bHQgY29tcHJvbWlzZSBiZXR3ZWVuIHNwZWVkIGFuZAotICAgY29tcHJlc3Npb24gKGN1cnJlbnRseSBlcXVpdmFsZW50IHRvIGxldmVsIDYpLgorICAgMSBnaXZlcyBiZXN0IHNwZWVkLCA5IGdpdmVzIGJlc3QgY29tcHJlc3Npb24sIDAgZ2l2ZXMgbm8gY29tcHJlc3Npb24gYXQgYWxsCisgICAodGhlIGlucHV0IGRhdGEgaXMgc2ltcGx5IGNvcGllZCBhIGJsb2NrIGF0IGEgdGltZSkuICBaX0RFRkFVTFRfQ09NUFJFU1NJT04KKyAgIHJlcXVlc3RzIGEgZGVmYXVsdCBjb21wcm9taXNlIGJldHdlZW4gc3BlZWQgYW5kIGNvbXByZXNzaW9uIChjdXJyZW50bHkKKyAgIGVxdWl2YWxlbnQgdG8gbGV2ZWwgNikuCiAKICAgICAgZGVmbGF0ZUluaXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKICAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGxldmVsIGlzIG5vdCBhIHZhbGlkIGNvbXByZXNzaW9uIGxldmVsLAogICAgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiAoemxpYl92ZXJzaW9uKSBpcyBpbmNvbXBhdGlibGUKLSAgIHdpdGggdGhlIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyIChaTElCX1ZFUlNJT04pLgotICAgbXNnIGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBkZWZsYXRlSW5pdCBkb2VzIG5vdAotICAgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KKyAgIHdpdGggdGhlIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyIChaTElCX1ZFUlNJT04pLiAgbXNnIGlzIHNldCB0byBudWxsCisgICBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246CisgICB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCiAqLwogCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZSBPRigoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCkpOwogLyoKICAgICBkZWZsYXRlIGNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKLSAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiBJdCBtYXkgaW50cm9kdWNlIHNvbWUKLSAgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KKyAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiAgSXQgbWF5IGludHJvZHVjZQorICBzb21lIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCiAgIGZvcmNlZCB0byBmbHVzaC4KIAotICAgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIGRlZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgICAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gIGRlZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCiAgIGZvbGxvd2luZyBhY3Rpb25zOgogCiAgIC0gQ29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KLSAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGFjY29yZGluZ2x5LiAgSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAogICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBhbmQgYXZhaWxfaW4gYXJlIHVwZGF0ZWQgYW5kCiAgICAgcHJvY2Vzc2luZyB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KIAogICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0Ci0gICAgYWNjb3JkaW5nbHkuIFRoaXMgYWN0aW9uIGlzIGZvcmNlZCBpZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIG5vbiB6ZXJvLgorICAgIGFjY29yZGluZ2x5LiAgVGhpcyBhY3Rpb24gaXMgZm9yY2VkIGlmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgbm9uIHplcm8uCiAgICAgRm9yY2luZyBmbHVzaCBmcmVxdWVudGx5IGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbywgc28gdGhpcyBwYXJhbWV0ZXIKLSAgICBzaG91bGQgYmUgc2V0IG9ubHkgd2hlbiBuZWNlc3NhcnkgKGluIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucykuCi0gICAgU29tZSBvdXRwdXQgbWF5IGJlIHByb3ZpZGVkIGV2ZW4gaWYgZmx1c2ggaXMgbm90IHNldC4KKyAgICBzaG91bGQgYmUgc2V0IG9ubHkgd2hlbiBuZWNlc3NhcnkgKGluIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucykuICBTb21lCisgICAgb3V0cHV0IG1heSBiZSBwcm92aWRlZCBldmVuIGlmIGZsdXNoIGlzIG5vdCBzZXQuCiAKLSAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAotICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKLSAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyBhdmFpbF9pbiBvciBhdmFpbF9vdXQgYWNjb3JkaW5nbHk7IGF2YWlsX291dAotICBzaG91bGQgbmV2ZXIgYmUgemVybyBiZWZvcmUgdGhlIGNhbGwuIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUKLSAgY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsCi0gIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZiBkZWZsYXRlKCkuIElmIGRlZmxhdGUgcmV0dXJucyBaX09LCi0gIGFuZCB3aXRoIHplcm8gYXZhaWxfb3V0LCBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUKLSAgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCisgICAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAorICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcgbW9yZQorICBvdXRwdXQsIGFuZCB1cGRhdGluZyBhdmFpbF9pbiBvciBhdmFpbF9vdXQgYWNjb3JkaW5nbHk7IGF2YWlsX291dCBzaG91bGQKKyAgbmV2ZXIgYmUgemVybyBiZWZvcmUgdGhlIGNhbGwuICBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIGNvbXByZXNzZWQKKyAgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvciBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCAoYXZhaWxfb3V0CisgID09IDApLCBvciBhZnRlciBlYWNoIGNhbGwgb2YgZGVmbGF0ZSgpLiAgSWYgZGVmbGF0ZSByZXR1cm5zIFpfT0sgYW5kIHdpdGgKKyAgemVybyBhdmFpbF9vdXQsIGl0IG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZSBvdXRwdXQKKyAgYnVmZmVyIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KIAogICAgIE5vcm1hbGx5IHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfTk9fRkxVU0gsIHdoaWNoIGFsbG93cyBkZWZsYXRlIHRvCiAgIGRlY2lkZSBob3cgbXVjaCBkYXRhIHRvIGFjY3VtdWxhdGUgYmVmb3JlIHByb2R1Y2luZyBvdXRwdXQsIGluIG9yZGVyIHRvCkBAIC0yNzksMTIgKzI3NywxMyBAQAogCiAgICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9TWU5DX0ZMVVNILCBhbGwgcGVuZGluZyBvdXRwdXQgaXMKICAgZmx1c2hlZCB0byB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdGhlIG91dHB1dCBpcyBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgc28KLSAgdGhhdCB0aGUgZGVjb21wcmVzc29yIGNhbiBnZXQgYWxsIGlucHV0IGRhdGEgYXZhaWxhYmxlIHNvIGZhci4gKEluIHBhcnRpY3VsYXIKLSAgYXZhaWxfaW4gaXMgemVybyBhZnRlciB0aGUgY2FsbCBpZiBlbm91Z2ggb3V0cHV0IHNwYWNlIGhhcyBiZWVuIHByb3ZpZGVkCi0gIGJlZm9yZSB0aGUgY2FsbC4pICBGbHVzaGluZyBtYXkgZGVncmFkZSBjb21wcmVzc2lvbiBmb3Igc29tZSBjb21wcmVzc2lvbgotICBhbGdvcml0aG1zIGFuZCBzbyBpdCBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LiAgVGhpcyBjb21wbGV0ZXMgdGhlCi0gIGN1cnJlbnQgZGVmbGF0ZSBibG9jayBhbmQgZm9sbG93cyBpdCB3aXRoIGFuIGVtcHR5IHN0b3JlZCBibG9jayB0aGF0IGlzIHRocmVlCi0gIGJpdHMgcGx1cyBmaWxsZXIgYml0cyB0byB0aGUgbmV4dCBieXRlLCBmb2xsb3dlZCBieSBmb3VyIGJ5dGVzICgwMCAwMCBmZiBmZikuCisgIHRoYXQgdGhlIGRlY29tcHJlc3NvciBjYW4gZ2V0IGFsbCBpbnB1dCBkYXRhIGF2YWlsYWJsZSBzbyBmYXIuICAoSW4KKyAgcGFydGljdWxhciBhdmFpbF9pbiBpcyB6ZXJvIGFmdGVyIHRoZSBjYWxsIGlmIGVub3VnaCBvdXRwdXQgc3BhY2UgaGFzIGJlZW4KKyAgcHJvdmlkZWQgYmVmb3JlIHRoZSBjYWxsLikgRmx1c2hpbmcgbWF5IGRlZ3JhZGUgY29tcHJlc3Npb24gZm9yIHNvbWUKKyAgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBhbmQgc28gaXQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIG5lY2Vzc2FyeS4gIFRoaXMKKyAgY29tcGxldGVzIHRoZSBjdXJyZW50IGRlZmxhdGUgYmxvY2sgYW5kIGZvbGxvd3MgaXQgd2l0aCBhbiBlbXB0eSBzdG9yZWQgYmxvY2sKKyAgdGhhdCBpcyB0aHJlZSBiaXRzIHBsdXMgZmlsbGVyIGJpdHMgdG8gdGhlIG5leHQgYnl0ZSwgZm9sbG93ZWQgYnkgZm91ciBieXRlcworICAoMDAgMDAgZmYgZmYpLgogCiAgICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfUEFSVElBTF9GTFVTSCwgYWxsIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgdG8gdGhlCiAgIG91dHB1dCBidWZmZXIsIGJ1dCB0aGUgb3V0cHV0IGlzIG5vdCBhbGlnbmVkIHRvIGEgYnl0ZSBib3VuZGFyeS4gIEFsbCBvZiB0aGUKQEAgLTMwNiw0MyArMzA1LDQzIEBACiAgICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfRlVMTF9GTFVTSCwgYWxsIG91dHB1dCBpcyBmbHVzaGVkIGFzIHdpdGgKICAgWl9TWU5DX0ZMVVNILCBhbmQgdGhlIGNvbXByZXNzaW9uIHN0YXRlIGlzIHJlc2V0IHNvIHRoYXQgZGVjb21wcmVzc2lvbiBjYW4KICAgcmVzdGFydCBmcm9tIHRoaXMgcG9pbnQgaWYgcHJldmlvdXMgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGRhbWFnZWQgb3IgaWYKLSAgcmFuZG9tIGFjY2VzcyBpcyBkZXNpcmVkLiBVc2luZyBaX0ZVTExfRkxVU0ggdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZQorICByYW5kb20gYWNjZXNzIGlzIGRlc2lyZWQuICBVc2luZyBaX0ZVTExfRkxVU0ggdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZQogICBjb21wcmVzc2lvbi4KIAogICAgIElmIGRlZmxhdGUgcmV0dXJucyB3aXRoIGF2YWlsX291dCA9PSAwLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFnYWluCiAgIHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQKICAgYXZhaWxfb3V0KSwgdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlIChkZWZsYXRlIHJldHVybnMgd2l0aCBub24temVybwotICBhdmFpbF9vdXQpLiBJbiB0aGUgY2FzZSBvZiBhIFpfRlVMTF9GTFVTSCBvciBaX1NZTkNfRkxVU0gsIG1ha2Ugc3VyZSB0aGF0CisgIGF2YWlsX291dCkuICBJbiB0aGUgY2FzZSBvZiBhIFpfRlVMTF9GTFVTSCBvciBaX1NZTkNfRkxVU0gsIG1ha2Ugc3VyZSB0aGF0CiAgIGF2YWlsX291dCBpcyBncmVhdGVyIHRoYW4gc2l4IHRvIGF2b2lkIHJlcGVhdGVkIGZsdXNoIG1hcmtlcnMgZHVlIHRvCiAgIGF2YWlsX291dCA9PSAwIG9uIHJldHVybi4KIAogICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfRklOSVNILCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCwKLSAgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCBhbmQgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9TVFJFQU1fRU5EIGlmIHRoZXJlCi0gIHdhcyBlbm91Z2ggb3V0cHV0IHNwYWNlOyBpZiBkZWZsYXRlIHJldHVybnMgd2l0aCBaX09LLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUKKyAgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCBhbmQgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9TVFJFQU1fRU5EIGlmIHRoZXJlIHdhcworICBlbm91Z2ggb3V0cHV0IHNwYWNlOyBpZiBkZWZsYXRlIHJldHVybnMgd2l0aCBaX09LLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUKICAgY2FsbGVkIGFnYWluIHdpdGggWl9GSU5JU0ggYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkIGF2YWlsX291dCkgYnV0IG5vCi0gIG1vcmUgaW5wdXQgZGF0YSwgdW50aWwgaXQgcmV0dXJucyB3aXRoIFpfU1RSRUFNX0VORCBvciBhbiBlcnJvci4gQWZ0ZXIKLSAgZGVmbGF0ZSBoYXMgcmV0dXJuZWQgWl9TVFJFQU1fRU5ELCB0aGUgb25seSBwb3NzaWJsZSBvcGVyYXRpb25zIG9uIHRoZQotICBzdHJlYW0gYXJlIGRlZmxhdGVSZXNldCBvciBkZWZsYXRlRW5kLgorICBtb3JlIGlucHV0IGRhdGEsIHVudGlsIGl0IHJldHVybnMgd2l0aCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IuICBBZnRlcgorICBkZWZsYXRlIGhhcyByZXR1cm5lZCBaX1NUUkVBTV9FTkQsIHRoZSBvbmx5IHBvc3NpYmxlIG9wZXJhdGlvbnMgb24gdGhlIHN0cmVhbQorICBhcmUgZGVmbGF0ZVJlc2V0IG9yIGRlZmxhdGVFbmQuCiAKICAgICBaX0ZJTklTSCBjYW4gYmUgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCBpZiBhbGwgdGhlIGNvbXByZXNzaW9uCi0gIGlzIHRvIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcC4gSW4gdGhpcyBjYXNlLCBhdmFpbF9vdXQgbXVzdCBiZSBhdCBsZWFzdAotICB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZGVmbGF0ZUJvdW5kIChzZWUgYmVsb3cpLiBJZiBkZWZsYXRlIGRvZXMgbm90IHJldHVybgorICBpcyB0byBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAuICBJbiB0aGlzIGNhc2UsIGF2YWlsX291dCBtdXN0IGJlIGF0IGxlYXN0IHRoZQorICB2YWx1ZSByZXR1cm5lZCBieSBkZWZsYXRlQm91bmQgKHNlZSBiZWxvdykuICBJZiBkZWZsYXRlIGRvZXMgbm90IHJldHVybgogICBaX1NUUkVBTV9FTkQsIHRoZW4gaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYXMgZGVzY3JpYmVkIGFib3ZlLgogCiAgICAgZGVmbGF0ZSgpIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgYWxsIGlucHV0IHJlYWQKICAgc28gZmFyICh0aGF0IGlzLCB0b3RhbF9pbiBieXRlcykuCiAKICAgICBkZWZsYXRlKCkgbWF5IHVwZGF0ZSBzdHJtLT5kYXRhX3R5cGUgaWYgaXQgY2FuIG1ha2UgYSBnb29kIGd1ZXNzIGFib3V0Ci0gIHRoZSBpbnB1dCBkYXRhIHR5cGUgKFpfQklOQVJZIG9yIFpfVEVYVCkuIEluIGRvdWJ0LCB0aGUgZGF0YSBpcyBjb25zaWRlcmVkCi0gIGJpbmFyeS4gVGhpcyBmaWVsZCBpcyBvbmx5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3NlcyBhbmQgZG9lcyBub3QgYWZmZWN0Ci0gIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gaW4gYW55IG1hbm5lci4KKyAgdGhlIGlucHV0IGRhdGEgdHlwZSAoWl9CSU5BUlkgb3IgWl9URVhUKS4gIEluIGRvdWJ0LCB0aGUgZGF0YSBpcyBjb25zaWRlcmVkCisgIGJpbmFyeS4gIFRoaXMgZmllbGQgaXMgb25seSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMgYW5kIGRvZXMgbm90IGFmZmVjdCB0aGUKKyAgY29tcHJlc3Npb24gYWxnb3JpdGhtIGluIGFueSBtYW5uZXIuCiAKICAgICBkZWZsYXRlKCkgcmV0dXJucyBaX09LIGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dAogICBwcm9jZXNzZWQgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCBaX1NUUkVBTV9FTkQgaWYgYWxsIGlucHV0IGhhcyBiZWVuCiAgIGNvbnN1bWVkIGFuZCBhbGwgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkIChvbmx5IHdoZW4gZmx1c2ggaXMgc2V0IHRvCiAgIFpfRklOSVNIKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZQogICBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBaX05VTEwpLCBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZQotICAoZm9yIGV4YW1wbGUgYXZhaWxfaW4gb3IgYXZhaWxfb3V0IHdhcyB6ZXJvKS4gTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdAorICAoZm9yIGV4YW1wbGUgYXZhaWxfaW4gb3IgYXZhaWxfb3V0IHdhcyB6ZXJvKS4gIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QKICAgZmF0YWwsIGFuZCBkZWZsYXRlKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgaW5wdXQgYW5kIG1vcmUgb3V0cHV0CiAgIHNwYWNlIHRvIGNvbnRpbnVlIGNvbXByZXNzaW5nLgogKi8KQEAgLTM1MSwxMyArMzUwLDEzIEBACiBaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVFbmQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CiAvKgogICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgotICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueQotICAgcGVuZGluZyBvdXRwdXQuCisgICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55IHBlbmRpbmcKKyAgIG91dHB1dC4KIAogICAgICBkZWZsYXRlRW5kIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUKICAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIHN0cmVhbSB3YXMgZnJlZWQKLSAgIHByZW1hdHVyZWx5IChzb21lIGlucHV0IG9yIG91dHB1dCB3YXMgZGlzY2FyZGVkKS4gSW4gdGhlIGVycm9yIGNhc2UsCi0gICBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYSBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZQorICAgcHJlbWF0dXJlbHkgKHNvbWUgaW5wdXQgb3Igb3V0cHV0IHdhcyBkaXNjYXJkZWQpLiAgSW4gdGhlIGVycm9yIGNhc2UsIG1zZworICAgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYSBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZQogICAgZGVhbGxvY2F0ZWQpLgogKi8KIApAQCAtMzY1LDEwICszNjQsMTAgQEAKIC8qCiBaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0IE9GKCh6X3N0cmVhbXAgc3RybSkpOwogCi0gICAgIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGRlY29tcHJlc3Npb24uIFRoZSBmaWVsZHMKKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgZGVjb21wcmVzc2lvbi4gIFRoZSBmaWVsZHMKICAgIG5leHRfaW4sIGF2YWlsX2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkKLSAgIHRoZSBjYWxsZXIuIElmIG5leHRfaW4gaXMgbm90IFpfTlVMTCBhbmQgYXZhaWxfaW4gaXMgbGFyZ2UgZW5vdWdoICh0aGUgZXhhY3QKLSAgIHZhbHVlIGRlcGVuZHMgb24gdGhlIGNvbXByZXNzaW9uIG1ldGhvZCksIGluZmxhdGVJbml0IGRldGVybWluZXMgdGhlCisgICB0aGUgY2FsbGVyLiAgSWYgbmV4dF9pbiBpcyBub3QgWl9OVUxMIGFuZCBhdmFpbF9pbiBpcyBsYXJnZSBlbm91Z2ggKHRoZQorICAgZXhhY3QgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY29tcHJlc3Npb24gbWV0aG9kKSwgaW5mbGF0ZUluaXQgZGV0ZXJtaW5lcyB0aGUKICAgIGNvbXByZXNzaW9uIG1ldGhvZCBmcm9tIHRoZSB6bGliIGhlYWRlciBhbmQgYWxsb2NhdGVzIGFsbCBkYXRhIHN0cnVjdHVyZXMKICAgIGFjY29yZGluZ2x5OyBvdGhlcndpc2UgdGhlIGFsbG9jYXRpb24gd2lsbCBiZSBkZWZlcnJlZCB0byB0aGUgZmlyc3QgY2FsbCBvZgogICAgaW5mbGF0ZS4gIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIHNldCB0byBaX05VTEwsIGluZmxhdGVJbml0IHVwZGF0ZXMgdGhlbSB0bwpAQCAtMzc4LDY2ICszNzcsNjYgQEAKICAgIG1lbW9yeSwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKICAgIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgcGFyYW1ldGVycyBhcmUKICAgIGludmFsaWQsIHN1Y2ggYXMgYSBudWxsIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZS4gIG1zZyBpcyBzZXQgdG8gbnVsbCBpZgotICAgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gaW5mbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbgorICAgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGluZmxhdGVJbml0IGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24KICAgIGFwYXJ0IGZyb20gcG9zc2libHkgcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYgcHJlc2VudDogYWN0dWFsIGRlY29tcHJlc3Npb24KICAgIHdpbGwgYmUgZG9uZSBieSBpbmZsYXRlKCkuICAoU28gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbWF5IGJlIG1vZGlmaWVkLCBidXQKLSAgIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVudXNlZCBhbmQgdW5jaGFuZ2VkLikgIFRoZSBjdXJyZW50Ci0gICBpbXBsZW1lbnRhdGlvbiBvZiBpbmZsYXRlSW5pdCgpIGRvZXMgbm90IHByb2Nlc3MgYW55IGhlYWRlciBpbmZvcm1hdGlvbiAtLQotICAgdGhhdCBpcyBkZWZlcnJlZCB1bnRpbCBpbmZsYXRlKCkgaXMgY2FsbGVkLgorICAgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW51c2VkIGFuZCB1bmNoYW5nZWQuKSBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbgorICAgb2YgaW5mbGF0ZUluaXQoKSBkb2VzIG5vdCBwcm9jZXNzIGFueSBoZWFkZXIgaW5mb3JtYXRpb24gLS0gdGhhdCBpcyBkZWZlcnJlZAorICAgdW50aWwgaW5mbGF0ZSgpIGlzIGNhbGxlZC4KICovCiAKIAogWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGZsdXNoKSk7CiAvKgogICAgIGluZmxhdGUgZGVjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0Ci0gIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IGludHJvZHVjZQorICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuICBJdCBtYXkgaW50cm9kdWNlCiAgIHNvbWUgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KICAgZm9yY2VkIHRvIGZsdXNoLgogCi0gIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIGluZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuICBpbmZsYXRlIHBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZQogICBmb2xsb3dpbmcgYWN0aW9uczoKIAogICAtIERlY29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KLSAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAotICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBpcyB1cGRhdGVkIGFuZCBwcm9jZXNzaW5nCi0gICAgd2lsbCByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiBpbmZsYXRlKCkuCisgICAgYWNjb3JkaW5nbHkuICBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CisgICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCBuZXh0X2luIGlzIHVwZGF0ZWQgYW5kIHByb2Nlc3Npbmcgd2lsbAorICAgIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGluZmxhdGUoKS4KIAogICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0Ci0gICAgYWNjb3JkaW5nbHkuICBpbmZsYXRlKCkgcHJvdmlkZXMgYXMgbXVjaCBvdXRwdXQgYXMgcG9zc2libGUsIHVudGlsIHRoZXJlCi0gICAgaXMgbm8gbW9yZSBpbnB1dCBkYXRhIG9yIG5vIG1vcmUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIgKHNlZSBiZWxvdwotICAgIGFib3V0IHRoZSBmbHVzaCBwYXJhbWV0ZXIpLgorICAgIGFjY29yZGluZ2x5LiAgaW5mbGF0ZSgpIHByb3ZpZGVzIGFzIG11Y2ggb3V0cHV0IGFzIHBvc3NpYmxlLCB1bnRpbCB0aGVyZSBpcworICAgIG5vIG1vcmUgaW5wdXQgZGF0YSBvciBubyBtb3JlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyIChzZWUgYmVsb3cgYWJvdXQKKyAgICB0aGUgZmx1c2ggcGFyYW1ldGVyKS4KIAotICBCZWZvcmUgdGhlIGNhbGwgb2YgaW5mbGF0ZSgpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0Ci0gIG9uZSBvZiB0aGUgYWN0aW9ucyBpcyBwb3NzaWJsZSwgYnkgcHJvdmlkaW5nIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWluZwotICBtb3JlIG91dHB1dCwgYW5kIHVwZGF0aW5nIHRoZSBuZXh0XyogYW5kIGF2YWlsXyogdmFsdWVzIGFjY29yZGluZ2x5LgotICBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yCi0gIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2gKLSAgY2FsbCBvZiBpbmZsYXRlKCkuIElmIGluZmxhdGUgcmV0dXJucyBaX09LIGFuZCB3aXRoIHplcm8gYXZhaWxfb3V0LCBpdAotICBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlCi0gIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCisgICAgQmVmb3JlIHRoZSBjYWxsIG9mIGluZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAorICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcgbW9yZQorICBvdXRwdXQsIGFuZCB1cGRhdGluZyB0aGUgbmV4dF8qIGFuZCBhdmFpbF8qIHZhbHVlcyBhY2NvcmRpbmdseS4gIFRoZQorICBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUgdW5jb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IgZXhhbXBsZQorICB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgKGF2YWlsX291dCA9PSAwKSwgb3IgYWZ0ZXIgZWFjaCBjYWxsIG9mCisgIGluZmxhdGUoKS4gIElmIGluZmxhdGUgcmV0dXJucyBaX09LIGFuZCB3aXRoIHplcm8gYXZhaWxfb3V0LCBpdCBtdXN0IGJlCisgIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlCisgIG1vcmUgb3V0cHV0IHBlbmRpbmcuCiAKICAgICBUaGUgZmx1c2ggcGFyYW1ldGVyIG9mIGluZmxhdGUoKSBjYW4gYmUgWl9OT19GTFVTSCwgWl9TWU5DX0ZMVVNILCBaX0ZJTklTSCwKLSAgWl9CTE9DSywgb3IgWl9UUkVFUy4gWl9TWU5DX0ZMVVNIIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpIGZsdXNoIGFzIG11Y2gKLSAgb3V0cHV0IGFzIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiBaX0JMT0NLIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpIHN0b3AKLSAgaWYgYW5kIHdoZW4gaXQgZ2V0cyB0byB0aGUgbmV4dCBkZWZsYXRlIGJsb2NrIGJvdW5kYXJ5LiBXaGVuIGRlY29kaW5nIHRoZQotICB6bGliIG9yIGd6aXAgZm9ybWF0LCB0aGlzIHdpbGwgY2F1c2UgaW5mbGF0ZSgpIHRvIHJldHVybiBpbW1lZGlhdGVseSBhZnRlcgotICB0aGUgaGVhZGVyIGFuZCBiZWZvcmUgdGhlIGZpcnN0IGJsb2NrLiBXaGVuIGRvaW5nIGEgcmF3IGluZmxhdGUsIGluZmxhdGUoKQotICB3aWxsIGdvIGFoZWFkIGFuZCBwcm9jZXNzIHRoZSBmaXJzdCBibG9jaywgYW5kIHdpbGwgcmV0dXJuIHdoZW4gaXQgZ2V0cyB0bwotICB0aGUgZW5kIG9mIHRoYXQgYmxvY2ssIG9yIHdoZW4gaXQgcnVucyBvdXQgb2YgZGF0YS4KKyAgWl9CTE9DSywgb3IgWl9UUkVFUy4gIFpfU1lOQ19GTFVTSCByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKSBmbHVzaCBhcyBtdWNoCisgIG91dHB1dCBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gIFpfQkxPQ0sgcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkKKyAgc3RvcCBpZiBhbmQgd2hlbiBpdCBnZXRzIHRvIHRoZSBuZXh0IGRlZmxhdGUgYmxvY2sgYm91bmRhcnkuICBXaGVuIGRlY29kaW5nCisgIHRoZSB6bGliIG9yIGd6aXAgZm9ybWF0LCB0aGlzIHdpbGwgY2F1c2UgaW5mbGF0ZSgpIHRvIHJldHVybiBpbW1lZGlhdGVseQorICBhZnRlciB0aGUgaGVhZGVyIGFuZCBiZWZvcmUgdGhlIGZpcnN0IGJsb2NrLiAgV2hlbiBkb2luZyBhIHJhdyBpbmZsYXRlLAorICBpbmZsYXRlKCkgd2lsbCBnbyBhaGVhZCBhbmQgcHJvY2VzcyB0aGUgZmlyc3QgYmxvY2ssIGFuZCB3aWxsIHJldHVybiB3aGVuIGl0CisgIGdldHMgdG8gdGhlIGVuZCBvZiB0aGF0IGJsb2NrLCBvciB3aGVuIGl0IHJ1bnMgb3V0IG9mIGRhdGEuCiAKICAgICBUaGUgWl9CTE9DSyBvcHRpb24gYXNzaXN0cyBpbiBhcHBlbmRpbmcgdG8gb3IgY29tYmluaW5nIGRlZmxhdGUgc3RyZWFtcy4KICAgQWxzbyB0byBhc3Npc3QgaW4gdGhpcywgb24gcmV0dXJuIGluZmxhdGUoKSB3aWxsIHNldCBzdHJtLT5kYXRhX3R5cGUgdG8gdGhlCi0gIG51bWJlciBvZiB1bnVzZWQgYml0cyBpbiB0aGUgbGFzdCBieXRlIHRha2VuIGZyb20gc3RybS0+bmV4dF9pbiwgcGx1cyA2NAotICBpZiBpbmZsYXRlKCkgaXMgY3VycmVudGx5IGRlY29kaW5nIHRoZSBsYXN0IGJsb2NrIGluIHRoZSBkZWZsYXRlIHN0cmVhbSwKLSAgcGx1cyAxMjggaWYgaW5mbGF0ZSgpIHJldHVybmVkIGltbWVkaWF0ZWx5IGFmdGVyIGRlY29kaW5nIGFuIGVuZC1vZi1ibG9jawotICBjb2RlIG9yIGRlY29kaW5nIHRoZSBjb21wbGV0ZSBoZWFkZXIgdXAgdG8ganVzdCBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlCi0gIGRlZmxhdGUgc3RyZWFtLiBUaGUgZW5kLW9mLWJsb2NrIHdpbGwgbm90IGJlIGluZGljYXRlZCB1bnRpbCBhbGwgb2YgdGhlCi0gIHVuY29tcHJlc3NlZCBkYXRhIGZyb20gdGhhdCBibG9jayBoYXMgYmVlbiB3cml0dGVuIHRvIHN0cm0tPm5leHRfb3V0LiAgVGhlCi0gIG51bWJlciBvZiB1bnVzZWQgYml0cyBtYXkgaW4gZ2VuZXJhbCBiZSBncmVhdGVyIHRoYW4gc2V2ZW4sIGV4Y2VwdCB3aGVuCi0gIGJpdCA3IG9mIGRhdGFfdHlwZSBpcyBzZXQsIGluIHdoaWNoIGNhc2UgdGhlIG51bWJlciBvZiB1bnVzZWQgYml0cyB3aWxsIGJlCi0gIGxlc3MgdGhhbiBlaWdodC4gIGRhdGFfdHlwZSBpcyBzZXQgYXMgbm90ZWQgaGVyZSBldmVyeSB0aW1lIGluZmxhdGUoKQotICByZXR1cm5zIGZvciBhbGwgZmx1c2ggb3B0aW9ucywgYW5kIHNvIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgYW1vdW50Ci0gIG9mIGN1cnJlbnRseSBjb25zdW1lZCBpbnB1dCBpbiBiaXRzLgorICBudW1iZXIgb2YgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW4sIHBsdXMgNjQgaWYKKyAgaW5mbGF0ZSgpIGlzIGN1cnJlbnRseSBkZWNvZGluZyB0aGUgbGFzdCBibG9jayBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0sIHBsdXMKKyAgMTI4IGlmIGluZmxhdGUoKSByZXR1cm5lZCBpbW1lZGlhdGVseSBhZnRlciBkZWNvZGluZyBhbiBlbmQtb2YtYmxvY2sgY29kZSBvcgorICBkZWNvZGluZyB0aGUgY29tcGxldGUgaGVhZGVyIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBkZWZsYXRlCisgIHN0cmVhbS4gIFRoZSBlbmQtb2YtYmxvY2sgd2lsbCBub3QgYmUgaW5kaWNhdGVkIHVudGlsIGFsbCBvZiB0aGUgdW5jb21wcmVzc2VkCisgIGRhdGEgZnJvbSB0aGF0IGJsb2NrIGhhcyBiZWVuIHdyaXR0ZW4gdG8gc3RybS0+bmV4dF9vdXQuICBUaGUgbnVtYmVyIG9mCisgIHVudXNlZCBiaXRzIG1heSBpbiBnZW5lcmFsIGJlIGdyZWF0ZXIgdGhhbiBzZXZlbiwgZXhjZXB0IHdoZW4gYml0IDcgb2YKKyAgZGF0YV90eXBlIGlzIHNldCwgaW4gd2hpY2ggY2FzZSB0aGUgbnVtYmVyIG9mIHVudXNlZCBiaXRzIHdpbGwgYmUgbGVzcyB0aGFuCisgIGVpZ2h0LiAgZGF0YV90eXBlIGlzIHNldCBhcyBub3RlZCBoZXJlIGV2ZXJ5IHRpbWUgaW5mbGF0ZSgpIHJldHVybnMgZm9yIGFsbAorICBmbHVzaCBvcHRpb25zLCBhbmQgc28gY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgY3VycmVudGx5CisgIGNvbnN1bWVkIGlucHV0IGluIGJpdHMuCiAKICAgICBUaGUgWl9UUkVFUyBvcHRpb24gYmVoYXZlcyBhcyBaX0JMT0NLIGRvZXMsIGJ1dCBpdCBhbHNvIHJldHVybnMgd2hlbiB0aGUKICAgZW5kIG9mIGVhY2ggZGVmbGF0ZSBibG9jayBoZWFkZXIgaXMgcmVhY2hlZCwgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpbiB0aGF0CkBAIC00NDcsMTkgKzQ0NiwxOSBAQAogICBpbW1lZGlhdGVseSBhZnRlciByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIGJsb2NrIGhlYWRlci4KIAogICAgIGluZmxhdGUoKSBzaG91bGQgbm9ybWFsbHkgYmUgY2FsbGVkIHVudGlsIGl0IHJldHVybnMgWl9TVFJFQU1fRU5EIG9yIGFuCi0gIGVycm9yLiBIb3dldmVyIGlmIGFsbCBkZWNvbXByZXNzaW9uIGlzIHRvIGJlIHBlcmZvcm1lZCBpbiBhIHNpbmdsZSBzdGVwCi0gIChhIHNpbmdsZSBjYWxsIG9mIGluZmxhdGUpLCB0aGUgcGFyYW1ldGVyIGZsdXNoIHNob3VsZCBiZSBzZXQgdG8KLSAgWl9GSU5JU0guIEluIHRoaXMgY2FzZSBhbGwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQgYW5kIGFsbCBwZW5kaW5nCi0gIG91dHB1dCBpcyBmbHVzaGVkOyBhdmFpbF9vdXQgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgdGhlCi0gIHVuY29tcHJlc3NlZCBkYXRhLiAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG1heSBoYXZlIGJlZW4gc2F2ZWQKLSAgYnkgdGhlIGNvbXByZXNzb3IgZm9yIHRoaXMgcHVycG9zZS4pIFRoZSBuZXh0IG9wZXJhdGlvbiBvbiB0aGlzIHN0cmVhbSBtdXN0Ci0gIGJlIGluZmxhdGVFbmQgdG8gZGVhbGxvY2F0ZSB0aGUgZGVjb21wcmVzc2lvbiBzdGF0ZS4gVGhlIHVzZSBvZiBaX0ZJTklTSAotICBpcyBuZXZlciByZXF1aXJlZCwgYnV0IGNhbiBiZSB1c2VkIHRvIGluZm9ybSBpbmZsYXRlIHRoYXQgYSBmYXN0ZXIgYXBwcm9hY2gKLSAgbWF5IGJlIHVzZWQgZm9yIHRoZSBzaW5nbGUgaW5mbGF0ZSgpIGNhbGwuCisgIGVycm9yLiAgSG93ZXZlciBpZiBhbGwgZGVjb21wcmVzc2lvbiBpcyB0byBiZSBwZXJmb3JtZWQgaW4gYSBzaW5nbGUgc3RlcCAoYQorICBzaW5nbGUgY2FsbCBvZiBpbmZsYXRlKSwgdGhlIHBhcmFtZXRlciBmbHVzaCBzaG91bGQgYmUgc2V0IHRvIFpfRklOSVNILiAgSW4KKyAgdGhpcyBjYXNlIGFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCBhbmQgYWxsIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQ7CisgIGF2YWlsX291dCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCB0aGUgdW5jb21wcmVzc2VkIGRhdGEuICAoVGhlIHNpemUKKyAgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG1heSBoYXZlIGJlZW4gc2F2ZWQgYnkgdGhlIGNvbXByZXNzb3IgZm9yIHRoaXMKKyAgcHVycG9zZS4pIFRoZSBuZXh0IG9wZXJhdGlvbiBvbiB0aGlzIHN0cmVhbSBtdXN0IGJlIGluZmxhdGVFbmQgdG8gZGVhbGxvY2F0ZQorICB0aGUgZGVjb21wcmVzc2lvbiBzdGF0ZS4gIFRoZSB1c2Ugb2YgWl9GSU5JU0ggaXMgbmV2ZXIgcmVxdWlyZWQsIGJ1dCBjYW4gYmUKKyAgdXNlZCB0byBpbmZvcm0gaW5mbGF0ZSB0aGF0IGEgZmFzdGVyIGFwcHJvYWNoIG1heSBiZSB1c2VkIGZvciB0aGUgc2luZ2xlCisgIGluZmxhdGUoKSBjYWxsLgogCiAgICAgIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIGluZmxhdGUoKSBhbHdheXMgZmx1c2hlcyBhcyBtdWNoIG91dHB1dCBhcwogICBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgYW5kIGFsd2F5cyB1c2VzIHRoZSBmYXN0ZXIgYXBwcm9hY2ggb24gdGhlCi0gIGZpcnN0IGNhbGwuIFNvIHRoZSBvbmx5IGVmZmVjdCBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIGluIHRoaXMgaW1wbGVtZW50YXRpb24KKyAgZmlyc3QgY2FsbC4gIFNvIHRoZSBvbmx5IGVmZmVjdCBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIGluIHRoaXMgaW1wbGVtZW50YXRpb24KICAgaXMgb24gdGhlIHJldHVybiB2YWx1ZSBvZiBpbmZsYXRlKCksIGFzIG5vdGVkIGJlbG93LCBvciB3aGVuIGl0IHJldHVybnMgZWFybHkKICAgYmVjYXVzZSBaX0JMT0NLIG9yIFpfVFJFRVMgaXMgdXNlZC4KIApAQCAtNDY4LDcgKzQ2Nyw3IEBACiAgIGNob3NlbiBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX05FRURfRElDVDsgb3RoZXJ3aXNlIGl0IHNldHMKICAgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgYWxsIG91dHB1dCBwcm9kdWNlZCBzbyBmYXIgKHRoYXQgaXMsCiAgIHRvdGFsX291dCBieXRlcykgYW5kIHJldHVybnMgWl9PSywgWl9TVFJFQU1fRU5EIG9yIGFuIGVycm9yIGNvZGUgYXMgZGVzY3JpYmVkCi0gIGJlbG93LiBBdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIGluZmxhdGUoKSBjaGVja3MgdGhhdCBpdHMgY29tcHV0ZWQgYWRsZXIzMgorICBiZWxvdy4gIEF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgaW5mbGF0ZSgpIGNoZWNrcyB0aGF0IGl0cyBjb21wdXRlZCBhZGxlcjMyCiAgIGNoZWNrc3VtIGlzIGVxdWFsIHRvIHRoYXQgc2F2ZWQgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9TVFJFQU1fRU5ECiAgIG9ubHkgaWYgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QuCiAKQEAgLTQ4NywyMiArNDg2LDIyIEBACiAgIHZhbHVlKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKICAgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgWl9OVUxMKSwgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5LAogICBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZQotICBvdXRwdXQgYnVmZmVyIHdoZW4gWl9GSU5JU0ggaXMgdXNlZC4gTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbCwgYW5kCisgIG91dHB1dCBidWZmZXIgd2hlbiBaX0ZJTklTSCBpcyB1c2VkLiAgTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbCwgYW5kCiAgIGluZmxhdGUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBpbnB1dCBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgdG8KLSAgY29udGludWUgZGVjb21wcmVzc2luZy4gSWYgWl9EQVRBX0VSUk9SIGlzIHJldHVybmVkLCB0aGUgYXBwbGljYXRpb24gbWF5IHRoZW4KLSAgY2FsbCBpbmZsYXRlU3luYygpIHRvIGxvb2sgZm9yIGEgZ29vZCBjb21wcmVzc2lvbiBibG9jayBpZiBhIHBhcnRpYWwgcmVjb3ZlcnkKLSAgb2YgdGhlIGRhdGEgaXMgZGVzaXJlZC4KKyAgY29udGludWUgZGVjb21wcmVzc2luZy4gIElmIFpfREFUQV9FUlJPUiBpcyByZXR1cm5lZCwgdGhlIGFwcGxpY2F0aW9uIG1heQorICB0aGVuIGNhbGwgaW5mbGF0ZVN5bmMoKSB0byBsb29rIGZvciBhIGdvb2QgY29tcHJlc3Npb24gYmxvY2sgaWYgYSBwYXJ0aWFsCisgIHJlY292ZXJ5IG9mIHRoZSBkYXRhIGlzIGRlc2lyZWQuCiAqLwogCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKIC8qCiAgICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCi0gICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55Ci0gICBwZW5kaW5nIG91dHB1dC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkgcGVuZGluZworICAgb3V0cHV0LgogCiAgICAgIGluZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUKLSAgIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBlcnJvciBjYXNlLCBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQorICAgd2FzIGluY29uc2lzdGVudC4gIEluIHRoZSBlcnJvciBjYXNlLCBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQogICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgogKi8KIApAQCAtNTIwLDU1ICs1MTksNTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIG1lbUxldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgc3RyYXRlZ3kpKTsKIAotICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBkZWZsYXRlSW5pdCB3aXRoIG1vcmUgY29tcHJlc3Npb24gb3B0aW9ucy4gVGhlCi0gICBmaWVsZHMgbmV4dF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5Ci0gICB0aGUgY2FsbGVyLgorICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBkZWZsYXRlSW5pdCB3aXRoIG1vcmUgY29tcHJlc3Npb24gb3B0aW9ucy4gIFRoZQorICAgZmllbGRzIG5leHRfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieSB0aGUKKyAgIGNhbGxlci4KIAotICAgICBUaGUgbWV0aG9kIHBhcmFtZXRlciBpcyB0aGUgY29tcHJlc3Npb24gbWV0aG9kLiBJdCBtdXN0IGJlIFpfREVGTEFURUQgaW4KKyAgICAgVGhlIG1ldGhvZCBwYXJhbWV0ZXIgaXMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4gIEl0IG11c3QgYmUgWl9ERUZMQVRFRCBpbgogICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgogCiAgICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZQotICAgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yIHRoaXMKLSAgIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIExhcmdlciB2YWx1ZXMgb2YgdGhpcyBwYXJhbWV0ZXIgcmVzdWx0IGluIGJldHRlcgotICAgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZgorICAgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvciB0aGlzCisgICB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiAgTGFyZ2VyIHZhbHVlcyBvZiB0aGlzIHBhcmFtZXRlciByZXN1bHQgaW4gYmV0dGVyCisgICBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZgogICAgZGVmbGF0ZUluaXQgaXMgdXNlZCBpbnN0ZWFkLgogCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGRlZmxhdGUuIEluIHRoaXMgY2FzZSwgLXdpbmRvd0JpdHMKLSAgIGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLiBkZWZsYXRlKCkgd2lsbCB0aGVuIGdlbmVyYXRlIHJhdyBkZWZsYXRlIGRhdGEKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSAtOC4uLTE1IGZvciByYXcgZGVmbGF0ZS4gIEluIHRoaXMgY2FzZSwgLXdpbmRvd0JpdHMKKyAgIGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLiAgZGVmbGF0ZSgpIHdpbGwgdGhlbiBnZW5lcmF0ZSByYXcgZGVmbGF0ZSBkYXRhCiAgICB3aXRoIG5vIHpsaWIgaGVhZGVyIG9yIHRyYWlsZXIsIGFuZCB3aWxsIG5vdCBjb21wdXRlIGFuIGFkbGVyMzIgY2hlY2sgdmFsdWUuCiAKLSAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSBncmVhdGVyIHRoYW4gMTUgZm9yIG9wdGlvbmFsIGd6aXAgZW5jb2RpbmcuIEFkZAorICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIGdyZWF0ZXIgdGhhbiAxNSBmb3Igb3B0aW9uYWwgZ3ppcCBlbmNvZGluZy4gIEFkZAogICAgMTYgdG8gd2luZG93Qml0cyB0byB3cml0ZSBhIHNpbXBsZSBnemlwIGhlYWRlciBhbmQgdHJhaWxlciBhcm91bmQgdGhlCi0gICBjb21wcmVzc2VkIGRhdGEgaW5zdGVhZCBvZiBhIHpsaWIgd3JhcHBlci4gVGhlIGd6aXAgaGVhZGVyIHdpbGwgaGF2ZSBubwotICAgZmlsZSBuYW1lLCBubyBleHRyYSBkYXRhLCBubyBjb21tZW50LCBubyBtb2RpZmljYXRpb24gdGltZSAoc2V0IHRvIHplcm8pLAotICAgbm8gaGVhZGVyIGNyYywgYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdpbGwgYmUgc2V0IHRvIDI1NSAodW5rbm93bikuICBJZiBhCisgICBjb21wcmVzc2VkIGRhdGEgaW5zdGVhZCBvZiBhIHpsaWIgd3JhcHBlci4gIFRoZSBnemlwIGhlYWRlciB3aWxsIGhhdmUgbm8KKyAgIGZpbGUgbmFtZSwgbm8gZXh0cmEgZGF0YSwgbm8gY29tbWVudCwgbm8gbW9kaWZpY2F0aW9uIHRpbWUgKHNldCB0byB6ZXJvKSwgbm8KKyAgIGhlYWRlciBjcmMsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3aWxsIGJlIHNldCB0byAyNTUgKHVua25vd24pLiAgSWYgYQogICAgZ3ppcCBzdHJlYW0gaXMgYmVpbmcgd3JpdHRlbiwgc3RybS0+YWRsZXIgaXMgYSBjcmMzMiBpbnN0ZWFkIG9mIGFuIGFkbGVyMzIuCiAKICAgICAgVGhlIG1lbUxldmVsIHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG11Y2ggbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQKLSAgIGZvciB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuIG1lbUxldmVsPTEgdXNlcyBtaW5pbXVtIG1lbW9yeSBidXQKLSAgIGlzIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW87IG1lbUxldmVsPTkgdXNlcyBtYXhpbXVtIG1lbW9yeQotICAgZm9yIG9wdGltYWwgc3BlZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDguIFNlZSB6Y29uZi5oIGZvciB0b3RhbCBtZW1vcnkKLSAgIHVzYWdlIGFzIGEgZnVuY3Rpb24gb2Ygd2luZG93Qml0cyBhbmQgbWVtTGV2ZWwuCisgICBmb3IgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLiAgbWVtTGV2ZWw9MSB1c2VzIG1pbmltdW0gbWVtb3J5IGJ1dCBpcworICAgc2xvdyBhbmQgcmVkdWNlcyBjb21wcmVzc2lvbiByYXRpbzsgbWVtTGV2ZWw9OSB1c2VzIG1heGltdW0gbWVtb3J5IGZvcgorICAgb3B0aW1hbCBzcGVlZC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDguICBTZWUgemNvbmYuaCBmb3IgdG90YWwgbWVtb3J5IHVzYWdlCisgICBhcyBhIGZ1bmN0aW9uIG9mIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLgogCi0gICAgIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0dW5lIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uIFVzZSB0aGUKKyAgICAgVGhlIHN0cmF0ZWd5IHBhcmFtZXRlciBpcyB1c2VkIHRvIHR1bmUgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS4gIFVzZSB0aGUKICAgIHZhbHVlIFpfREVGQVVMVF9TVFJBVEVHWSBmb3Igbm9ybWFsIGRhdGEsIFpfRklMVEVSRUQgZm9yIGRhdGEgcHJvZHVjZWQgYnkgYQogICAgZmlsdGVyIChvciBwcmVkaWN0b3IpLCBaX0hVRkZNQU5fT05MWSB0byBmb3JjZSBIdWZmbWFuIGVuY29kaW5nIG9ubHkgKG5vCiAgICBzdHJpbmcgbWF0Y2gpLCBvciBaX1JMRSB0byBsaW1pdCBtYXRjaCBkaXN0YW5jZXMgdG8gb25lIChydW4tbGVuZ3RoCi0gICBlbmNvZGluZykuIEZpbHRlcmVkIGRhdGEgY29uc2lzdHMgbW9zdGx5IG9mIHNtYWxsIHZhbHVlcyB3aXRoIGEgc29tZXdoYXQKLSAgIHJhbmRvbSBkaXN0cmlidXRpb24uIEluIHRoaXMgY2FzZSwgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpcyB0dW5lZCB0bwotICAgY29tcHJlc3MgdGhlbSBiZXR0ZXIuIFRoZSBlZmZlY3Qgb2YgWl9GSUxURVJFRCBpcyB0byBmb3JjZSBtb3JlIEh1ZmZtYW4KKyAgIGVuY29kaW5nKS4gIEZpbHRlcmVkIGRhdGEgY29uc2lzdHMgbW9zdGx5IG9mIHNtYWxsIHZhbHVlcyB3aXRoIGEgc29tZXdoYXQKKyAgIHJhbmRvbSBkaXN0cmlidXRpb24uICBJbiB0aGlzIGNhc2UsIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gaXMgdHVuZWQgdG8KKyAgIGNvbXByZXNzIHRoZW0gYmV0dGVyLiAgVGhlIGVmZmVjdCBvZiBaX0ZJTFRFUkVEIGlzIHRvIGZvcmNlIG1vcmUgSHVmZm1hbgogICAgY29kaW5nIGFuZCBsZXNzIHN0cmluZyBtYXRjaGluZzsgaXQgaXMgc29tZXdoYXQgaW50ZXJtZWRpYXRlIGJldHdlZW4KLSAgIFpfREVGQVVMVF9TVFJBVEVHWSBhbmQgWl9IVUZGTUFOX09OTFkuIFpfUkxFIGlzIGRlc2lnbmVkIHRvIGJlIGFsbW9zdCBhcwotICAgZmFzdCBhcyBaX0hVRkZNQU5fT05MWSwgYnV0IGdpdmUgYmV0dGVyIGNvbXByZXNzaW9uIGZvciBQTkcgaW1hZ2UgZGF0YS4gVGhlCisgICBaX0RFRkFVTFRfU1RSQVRFR1kgYW5kIFpfSFVGRk1BTl9PTkxZLiAgWl9STEUgaXMgZGVzaWduZWQgdG8gYmUgYWxtb3N0IGFzCisgICBmYXN0IGFzIFpfSFVGRk1BTl9PTkxZLCBidXQgZ2l2ZSBiZXR0ZXIgY29tcHJlc3Npb24gZm9yIFBORyBpbWFnZSBkYXRhLiAgVGhlCiAgICBzdHJhdGVneSBwYXJhbWV0ZXIgb25seSBhZmZlY3RzIHRoZSBjb21wcmVzc2lvbiByYXRpbyBidXQgbm90IHRoZQogICAgY29ycmVjdG5lc3Mgb2YgdGhlIGNvbXByZXNzZWQgb3V0cHV0IGV2ZW4gaWYgaXQgaXMgbm90IHNldCBhcHByb3ByaWF0ZWx5LgogICAgWl9GSVhFRCBwcmV2ZW50cyB0aGUgdXNlIG9mIGR5bmFtaWMgSHVmZm1hbiBjb2RlcywgYWxsb3dpbmcgZm9yIGEgc2ltcGxlcgogICAgZGVjb2RlciBmb3Igc3BlY2lhbCBhcHBsaWNhdGlvbnMuCiAKLSAgICAgIGRlZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgICAgZGVmbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAogICAgbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGFuIGludmFsaWQKLSAgIG1ldGhvZCkuIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQyIGRvZXMKLSAgIG5vdCBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgorICAgbWV0aG9kKS4gIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQyCisgICBkb2VzIG5vdCBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgogKi8KIAogWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlU2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCkBAIC01NzYsMTQgKzU3NSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCAgZGljdExlbmd0aCkpOwogLyoKICAgICAgSW5pdGlhbGl6ZXMgdGhlIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBzZXF1ZW5jZQotICAgd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkCi0gICBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCwgZGVmbGF0ZUluaXQyIG9yIGRlZmxhdGVSZXNldCwgYmVmb3JlIGFueQotICAgY2FsbCBvZiBkZWZsYXRlLiBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKKyAgIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQKKyAgIGltbWVkaWF0ZWx5IGFmdGVyIGRlZmxhdGVJbml0LCBkZWZsYXRlSW5pdDIgb3IgZGVmbGF0ZVJlc2V0LCBiZWZvcmUgYW55IGNhbGwKKyAgIG9mIGRlZmxhdGUuICBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKICAgIGRpY3Rpb25hcnkgKHNlZSBpbmZsYXRlU2V0RGljdGlvbmFyeSkuCiAKICAgICAgVGhlIGRpY3Rpb25hcnkgc2hvdWxkIGNvbnNpc3Qgb2Ygc3RyaW5ncyAoYnl0ZSBzZXF1ZW5jZXMpIHRoYXQgYXJlIGxpa2VseQogICAgdG8gYmUgZW5jb3VudGVyZWQgbGF0ZXIgaW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCwgd2l0aCB0aGUgbW9zdCBjb21tb25seQotICAgdXNlZCBzdHJpbmdzIHByZWZlcmFibHkgcHV0IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeS4gVXNpbmcgYQorICAgdXNlZCBzdHJpbmdzIHByZWZlcmFibHkgcHV0IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeS4gIFVzaW5nIGEKICAgIGRpY3Rpb25hcnkgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkIGlzIHNob3J0IGFuZCBjYW4gYmUKICAgIHByZWRpY3RlZCB3aXRoIGdvb2QgYWNjdXJhY3k7IHRoZSBkYXRhIGNhbiB0aGVuIGJlIGNvbXByZXNzZWQgYmV0dGVyIHRoYW4KICAgIHdpdGggdGhlIGRlZmF1bHQgZW1wdHkgZGljdGlvbmFyeS4KQEAgLTU5MSwyMiArNTkwLDIyIEBACiAgICAgIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3Npb24gZGF0YSBzdHJ1Y3R1cmVzIHNlbGVjdGVkIGJ5CiAgICBkZWZsYXRlSW5pdCBvciBkZWZsYXRlSW5pdDIsIGEgcGFydCBvZiB0aGUgZGljdGlvbmFyeSBtYXkgaW4gZWZmZWN0IGJlCiAgICBkaXNjYXJkZWQsIGZvciBleGFtcGxlIGlmIHRoZSBkaWN0aW9uYXJ5IGlzIGxhcmdlciB0aGFuIHRoZSB3aW5kb3cgc2l6ZQotICAgcHJvdmlkZWQgaW4gZGVmbGF0ZUluaXQgb3IgZGVmbGF0ZUluaXQyLiBUaHVzIHRoZSBzdHJpbmdzIG1vc3QgbGlrZWx5IHRvIGJlCi0gICB1c2VmdWwgc2hvdWxkIGJlIHB1dCBhdCB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LCBub3QgYXQgdGhlIGZyb250LiBJbgorICAgcHJvdmlkZWQgaW4gZGVmbGF0ZUluaXQgb3IgZGVmbGF0ZUluaXQyLiAgVGh1cyB0aGUgc3RyaW5ncyBtb3N0IGxpa2VseSB0byBiZQorICAgdXNlZnVsIHNob3VsZCBiZSBwdXQgYXQgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeSwgbm90IGF0IHRoZSBmcm9udC4gIEluCiAgICBhZGRpdGlvbiwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGVmbGF0ZSB3aWxsIHVzZSBhdCBtb3N0IHRoZSB3aW5kb3cKICAgIHNpemUgbWludXMgMjYyIGJ5dGVzIG9mIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5LgogCiAgICAgIFVwb24gcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24sIHN0cm0tPmFkbGVyIGlzIHNldCB0byB0aGUgYWRsZXIzMiB2YWx1ZQogICAgb2YgdGhlIGRpY3Rpb25hcnk7IHRoZSBkZWNvbXByZXNzb3IgbWF5IGxhdGVyIHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZQotICAgd2hpY2ggZGljdGlvbmFyeSBoYXMgYmVlbiB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLiAoVGhlIGFkbGVyMzIgdmFsdWUKKyAgIHdoaWNoIGRpY3Rpb25hcnkgaGFzIGJlZW4gdXNlZCBieSB0aGUgY29tcHJlc3Nvci4gIChUaGUgYWRsZXIzMiB2YWx1ZQogICAgYXBwbGllcyB0byB0aGUgd2hvbGUgZGljdGlvbmFyeSBldmVuIGlmIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGRpY3Rpb25hcnkgaXMKICAgIGFjdHVhbGx5IHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuKSBJZiBhIHJhdyBkZWZsYXRlIHdhcyByZXF1ZXN0ZWQsIHRoZW4gdGhlCiAgICBhZGxlcjMyIHZhbHVlIGlzIG5vdCBjb21wdXRlZCBhbmQgc3RybS0+YWRsZXIgaXMgbm90IHNldC4KIAogICAgICBkZWZsYXRlU2V0RGljdGlvbmFyeSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgYQotICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKGUuZy4gZGljdGlvbmFyeSBiZWluZyBaX05VTEwpIG9yIHRoZSBzdHJlYW0gc3RhdGUgaXMKKyAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChlLmcuICBkaWN0aW9uYXJ5IGJlaW5nIFpfTlVMTCkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcwogICAgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZSBpZiBkZWZsYXRlIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHN0cmVhbQotICAgb3IgaWYgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBpcyBic29ydCkuIGRlZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90CisgICBvciBpZiB0aGUgY29tcHJlc3Npb24gbWV0aG9kIGlzIGJzb3J0KS4gIGRlZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90CiAgICBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgogKi8KIApAQCAtNjE3LDI1ICs2MTYsMjUgQEAKIAogICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBzZXZlcmFsIGNvbXByZXNzaW9uIHN0cmF0ZWdpZXMgd2lsbCBiZQogICAgdHJpZWQsIGZvciBleGFtcGxlIHdoZW4gdGhlcmUgYXJlIHNldmVyYWwgd2F5cyBvZiBwcmUtcHJvY2Vzc2luZyB0aGUgaW5wdXQKLSAgIGRhdGEgd2l0aCBhIGZpbHRlci4gVGhlIHN0cmVhbXMgdGhhdCB3aWxsIGJlIGRpc2NhcmRlZCBzaG91bGQgdGhlbiBiZSBmcmVlZAorICAgZGF0YSB3aXRoIGEgZmlsdGVyLiAgVGhlIHN0cmVhbXMgdGhhdCB3aWxsIGJlIGRpc2NhcmRlZCBzaG91bGQgdGhlbiBiZSBmcmVlZAogICAgYnkgY2FsbGluZyBkZWZsYXRlRW5kLiAgTm90ZSB0aGF0IGRlZmxhdGVDb3B5IGR1cGxpY2F0ZXMgdGhlIGludGVybmFsCi0gICBjb21wcmVzc2lvbiBzdGF0ZSB3aGljaCBjYW4gYmUgcXVpdGUgbGFyZ2UsIHNvIHRoaXMgc3RyYXRlZ3kgaXMgc2xvdyBhbmQKLSAgIGNhbiBjb25zdW1lIGxvdHMgb2YgbWVtb3J5LgorICAgY29tcHJlc3Npb24gc3RhdGUgd2hpY2ggY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNsb3cgYW5kIGNhbgorICAgY29uc3VtZSBsb3RzIG9mIG1lbW9yeS4KIAogICAgICBkZWZsYXRlQ29weSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAogICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudAotICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIFpfTlVMTCkuIG1zZyBpcyBsZWZ0IHVuY2hhbmdlZCBpbiBib3RoIHNvdXJjZSBhbmQKKyAgIChzdWNoIGFzIHphbGxvYyBiZWluZyBaX05VTEwpLiAgbXNnIGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAogICAgZGVzdGluYXRpb24uCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVSZXNldCBPRigoel9zdHJlYW1wIHN0cm0pKTsKIC8qCiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBkZWZsYXRlRW5kIGZvbGxvd2VkIGJ5IGRlZmxhdGVJbml0LAotICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4KLSAgIFRoZSBzdHJlYW0gd2lsbCBrZWVwIHRoZSBzYW1lIGNvbXByZXNzaW9uIGxldmVsIGFuZCBhbnkgb3RoZXIgYXR0cmlidXRlcwotICAgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSBkZWZsYXRlSW5pdDIuCisgICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLiAgVGhlCisgICBzdHJlYW0gd2lsbCBrZWVwIHRoZSBzYW1lIGNvbXByZXNzaW9uIGxldmVsIGFuZCBhbnkgb3RoZXIgYXR0cmlidXRlcyB0aGF0CisgICBtYXkgaGF2ZSBiZWVuIHNldCBieSBkZWZsYXRlSW5pdDIuCiAKLSAgICAgIGRlZmxhdGVSZXNldCByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgICBkZWZsYXRlUmVzZXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKICAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIHphbGxvYyBvciBzdGF0ZSBiZWluZyBaX05VTEwpLgogKi8KIApAQCAtNjQ2LDE4ICs2NDUsMTggQEAKICAgICAgRHluYW1pY2FsbHkgdXBkYXRlIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBhbmQgY29tcHJlc3Npb24gc3RyYXRlZ3kuICBUaGUKICAgIGludGVycHJldGF0aW9uIG9mIGxldmVsIGFuZCBzdHJhdGVneSBpcyBhcyBpbiBkZWZsYXRlSW5pdDIuICBUaGlzIGNhbiBiZQogICAgdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3RyYWlnaHQgY29weSBvZiB0aGUgaW5wdXQgZGF0YSwgb3IKLSAgIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudCBraW5kIG9mIGlucHV0IGRhdGEgcmVxdWlyaW5nIGEgZGlmZmVyZW50Ci0gICBzdHJhdGVneS4gSWYgdGhlIGNvbXByZXNzaW9uIGxldmVsIGlzIGNoYW5nZWQsIHRoZSBpbnB1dCBhdmFpbGFibGUgc28gZmFyCi0gICBpcyBjb21wcmVzc2VkIHdpdGggdGhlIG9sZCBsZXZlbCAoYW5kIG1heSBiZSBmbHVzaGVkKTsgdGhlIG5ldyBsZXZlbCB3aWxsCi0gICB0YWtlIGVmZmVjdCBvbmx5IGF0IHRoZSBuZXh0IGNhbGwgb2YgZGVmbGF0ZSgpLgorICAgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IGtpbmQgb2YgaW5wdXQgZGF0YSByZXF1aXJpbmcgYSBkaWZmZXJlbnQgc3RyYXRlZ3kuCisgICBJZiB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgY2hhbmdlZCwgdGhlIGlucHV0IGF2YWlsYWJsZSBzbyBmYXIgaXMKKyAgIGNvbXByZXNzZWQgd2l0aCB0aGUgb2xkIGxldmVsIChhbmQgbWF5IGJlIGZsdXNoZWQpOyB0aGUgbmV3IGxldmVsIHdpbGwgdGFrZQorICAgZWZmZWN0IG9ubHkgYXQgdGhlIG5leHQgY2FsbCBvZiBkZWZsYXRlKCkuCiAKICAgICAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGVQYXJhbXMsIHRoZSBzdHJlYW0gc3RhdGUgbXVzdCBiZSBzZXQgYXMgZm9yCi0gICBhIGNhbGwgb2YgZGVmbGF0ZSgpLCBzaW5jZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBpbnB1dCBtYXkgaGF2ZSB0bwotICAgYmUgY29tcHJlc3NlZCBhbmQgZmx1c2hlZC4gSW4gcGFydGljdWxhciwgc3RybS0+YXZhaWxfb3V0IG11c3QgYmUgbm9uLXplcm8uCisgICBhIGNhbGwgb2YgZGVmbGF0ZSgpLCBzaW5jZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBpbnB1dCBtYXkgaGF2ZSB0byBiZQorICAgY29tcHJlc3NlZCBhbmQgZmx1c2hlZC4gIEluIHBhcnRpY3VsYXIsIHN0cm0tPmF2YWlsX291dCBtdXN0IGJlIG5vbi16ZXJvLgogCiAgICAgIGRlZmxhdGVQYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKLSAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IG9yIGlmIGEgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLCBaX0JVRl9FUlJPUgotICAgaWYgc3RybS0+YXZhaWxfb3V0IHdhcyB6ZXJvLgorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgb3IgaWYgYSBwYXJhbWV0ZXIgd2FzIGludmFsaWQsIFpfQlVGX0VSUk9SIGlmCisgICBzdHJtLT5hdmFpbF9vdXQgd2FzIHplcm8uCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVUdW5lIE9GKCh6X3N0cmVhbXAgc3RybSwKQEAgLTY5MiwyMSArNjkxLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSk7CiAvKgogICAgICBkZWZsYXRlUHJpbWUoKSBpbnNlcnRzIGJpdHMgaW4gdGhlIGRlZmxhdGUgb3V0cHV0IHN0cmVhbS4gIFRoZSBpbnRlbnQKLSAgaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgb2ZmIHRoZSBkZWZsYXRlIG91dHB1dCB3aXRoIHRoZQotICBiaXRzIGxlZnRvdmVyIGZyb20gYSBwcmV2aW91cyBkZWZsYXRlIHN0cmVhbSB3aGVuIGFwcGVuZGluZyB0byBpdC4gIEFzIHN1Y2gsCi0gIHRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBmb3IgcmF3IGRlZmxhdGUsIGFuZCBtdXN0IGJlIHVzZWQgYmVmb3JlIHRoZQotICBmaXJzdCBkZWZsYXRlKCkgY2FsbCBhZnRlciBhIGRlZmxhdGVJbml0MigpIG9yIGRlZmxhdGVSZXNldCgpLiAgYml0cyBtdXN0IGJlCi0gIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxNiwgYW5kIHRoYXQgbWFueSBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZgotICB2YWx1ZSB3aWxsIGJlIGluc2VydGVkIGluIHRoZSBvdXRwdXQuCisgICBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCBvZmYgdGhlIGRlZmxhdGUgb3V0cHV0IHdpdGggdGhlIGJpdHMKKyAgIGxlZnRvdmVyIGZyb20gYSBwcmV2aW91cyBkZWZsYXRlIHN0cmVhbSB3aGVuIGFwcGVuZGluZyB0byBpdC4gIEFzIHN1Y2gsIHRoaXMKKyAgIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHJhdyBkZWZsYXRlLCBhbmQgbXVzdCBiZSB1c2VkIGJlZm9yZSB0aGUgZmlyc3QKKyAgIGRlZmxhdGUoKSBjYWxsIGFmdGVyIGEgZGVmbGF0ZUluaXQyKCkgb3IgZGVmbGF0ZVJlc2V0KCkuICBiaXRzIG11c3QgYmUgbGVzcworICAgdGhhbiBvciBlcXVhbCB0byAxNiwgYW5kIHRoYXQgbWFueSBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB2YWx1ZQorICAgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgb3V0cHV0LgogCi0gICAgICBkZWZsYXRlUHJpbWUgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgICAgZGVmbGF0ZVByaW1lIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCiAgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KICovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVNldEhlYWRlciBPRigoel9zdHJlYW1wIHN0cm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd6X2hlYWRlcnAgaGVhZCkpOwogLyoKLSAgICAgIGRlZmxhdGVTZXRIZWFkZXIoKSBwcm92aWRlcyBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3Igd2hlbiBhIGd6aXAKKyAgICAgZGVmbGF0ZVNldEhlYWRlcigpIHByb3ZpZGVzIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIGZvciB3aGVuIGEgZ3ppcAogICAgc3RyZWFtIGlzIHJlcXVlc3RlZCBieSBkZWZsYXRlSW5pdDIoKS4gIGRlZmxhdGVTZXRIZWFkZXIoKSBtYXkgYmUgY2FsbGVkCiAgICBhZnRlciBkZWZsYXRlSW5pdDIoKSBvciBkZWZsYXRlUmVzZXQoKSBhbmQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIG9mCiAgICBkZWZsYXRlKCkuICBUaGUgdGV4dCwgdGltZSwgb3MsIGV4dHJhIGZpZWxkLCBuYW1lLCBhbmQgY29tbWVudCBpbmZvcm1hdGlvbgpAQCAtNzE5LDExICs3MTgsMTEgQEAKICAgIDEuMy54KSBkbyBub3Qgc3VwcG9ydCBoZWFkZXIgY3JjJ3MsIGFuZCB3aWxsIHJlcG9ydCB0aGF0IGl0IGlzIGEgIm11bHRpLXBhcnQKICAgIGd6aXAgZmlsZSIgYW5kIGdpdmUgdXAuCiAKLSAgICAgIElmIGRlZmxhdGVTZXRIZWFkZXIgaXMgbm90IHVzZWQsIHRoZSBkZWZhdWx0IGd6aXAgaGVhZGVyIGhhcyB0ZXh0IGZhbHNlLAorICAgICBJZiBkZWZsYXRlU2V0SGVhZGVyIGlzIG5vdCB1c2VkLCB0aGUgZGVmYXVsdCBnemlwIGhlYWRlciBoYXMgdGV4dCBmYWxzZSwKICAgIHRoZSB0aW1lIHNldCB0byB6ZXJvLCBhbmQgb3Mgc2V0IHRvIDI1NSwgd2l0aCBubyBleHRyYSwgbmFtZSwgb3IgY29tbWVudAogICAgZmllbGRzLiAgVGhlIGd6aXAgaGVhZGVyIGlzIHJldHVybmVkIHRvIHRoZSBkZWZhdWx0IHN0YXRlIGJ5IGRlZmxhdGVSZXNldCgpLgogCi0gICAgICBkZWZsYXRlU2V0SGVhZGVyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICAgIGRlZmxhdGVTZXRIZWFkZXIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKICAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgogKi8KIApAQCAtNzMxLDUwICs3MzAsNTAgQEAKIFpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHdpbmRvd0JpdHMpKTsKIAotICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBpbmZsYXRlSW5pdCB3aXRoIGFuIGV4dHJhIHBhcmFtZXRlci4gVGhlCisgICAgIFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIGluZmxhdGVJbml0IHdpdGggYW4gZXh0cmEgcGFyYW1ldGVyLiAgVGhlCiAgICBmaWVsZHMgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkCiAgICBiZWZvcmUgYnkgdGhlIGNhbGxlci4KIAogICAgICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgbWF4aW11bSB3aW5kb3cKICAgIHNpemUgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvcgotICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZiBpbmZsYXRlSW5pdCBpcyB1c2VkCi0gICBpbnN0ZWFkLiB3aW5kb3dCaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB3aW5kb3dCaXRzIHZhbHVlCisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZiBpbmZsYXRlSW5pdCBpcyB1c2VkCisgICBpbnN0ZWFkLiAgd2luZG93Qml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgd2luZG93Qml0cyB2YWx1ZQogICAgcHJvdmlkZWQgdG8gZGVmbGF0ZUluaXQyKCkgd2hpbGUgY29tcHJlc3NpbmcsIG9yIGl0IG11c3QgYmUgZXF1YWwgdG8gMTUgaWYKLSAgIGRlZmxhdGVJbml0MigpIHdhcyBub3QgdXNlZC4gSWYgYSBjb21wcmVzc2VkIHN0cmVhbSB3aXRoIGEgbGFyZ2VyIHdpbmRvdworICAgZGVmbGF0ZUluaXQyKCkgd2FzIG5vdCB1c2VkLiAgSWYgYSBjb21wcmVzc2VkIHN0cmVhbSB3aXRoIGEgbGFyZ2VyIHdpbmRvdwogICAgc2l6ZSBpcyBnaXZlbiBhcyBpbnB1dCwgaW5mbGF0ZSgpIHdpbGwgcmV0dXJuIHdpdGggdGhlIGVycm9yIGNvZGUKICAgIFpfREFUQV9FUlJPUiBpbnN0ZWFkIG9mIHRyeWluZyB0byBhbGxvY2F0ZSBhIGxhcmdlciB3aW5kb3cuCiAKICAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSB6ZXJvIHRvIHJlcXVlc3QgdGhhdCBpbmZsYXRlIHVzZSB0aGUgd2luZG93IHNpemUgaW4KICAgIHRoZSB6bGliIGhlYWRlciBvZiB0aGUgY29tcHJlc3NlZCBzdHJlYW0uCiAKLSAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSAtOC4uLTE1IGZvciByYXcgaW5mbGF0ZS4gSW4gdGhpcyBjYXNlLCAtd2luZG93Qml0cwotICAgZGV0ZXJtaW5lcyB0aGUgd2luZG93IHNpemUuIGluZmxhdGUoKSB3aWxsIHRoZW4gcHJvY2VzcyByYXcgZGVmbGF0ZSBkYXRhLAorICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIC04Li4tMTUgZm9yIHJhdyBpbmZsYXRlLiAgSW4gdGhpcyBjYXNlLCAtd2luZG93Qml0cworICAgZGV0ZXJtaW5lcyB0aGUgd2luZG93IHNpemUuICBpbmZsYXRlKCkgd2lsbCB0aGVuIHByb2Nlc3MgcmF3IGRlZmxhdGUgZGF0YSwKICAgIG5vdCBsb29raW5nIGZvciBhIHpsaWIgb3IgZ3ppcCBoZWFkZXIsIG5vdCBnZW5lcmF0aW5nIGEgY2hlY2sgdmFsdWUsIGFuZCBub3QKLSAgIGxvb2tpbmcgZm9yIGFueSBjaGVjayB2YWx1ZXMgZm9yIGNvbXBhcmlzb24gYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiBUaGlzCisgICBsb29raW5nIGZvciBhbnkgY2hlY2sgdmFsdWVzIGZvciBjb21wYXJpc29uIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gIFRoaXMKICAgIGlzIGZvciB1c2Ugd2l0aCBvdGhlciBmb3JtYXRzIHRoYXQgdXNlIHRoZSBkZWZsYXRlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQKLSAgIHN1Y2ggYXMgemlwLiAgVGhvc2UgZm9ybWF0cyBwcm92aWRlIHRoZWlyIG93biBjaGVjayB2YWx1ZXMuIElmIGEgY3VzdG9tCisgICBzdWNoIGFzIHppcC4gIFRob3NlIGZvcm1hdHMgcHJvdmlkZSB0aGVpciBvd24gY2hlY2sgdmFsdWVzLiAgSWYgYSBjdXN0b20KICAgIGZvcm1hdCBpcyBkZXZlbG9wZWQgdXNpbmcgdGhlIHJhdyBkZWZsYXRlIGZvcm1hdCBmb3IgY29tcHJlc3NlZCBkYXRhLCBpdCBpcwogICAgcmVjb21tZW5kZWQgdGhhdCBhIGNoZWNrIHZhbHVlIHN1Y2ggYXMgYW4gYWRsZXIzMiBvciBhIGNyYzMyIGJlIGFwcGxpZWQgdG8KICAgIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBhcyBpcyBkb25lIGluIHRoZSB6bGliLCBnemlwLCBhbmQgemlwIGZvcm1hdHMuICBGb3IKLSAgIG1vc3QgYXBwbGljYXRpb25zLCB0aGUgemxpYiBmb3JtYXQgc2hvdWxkIGJlIHVzZWQgYXMgaXMuIE5vdGUgdGhhdCBjb21tZW50cworICAgbW9zdCBhcHBsaWNhdGlvbnMsIHRoZSB6bGliIGZvcm1hdCBzaG91bGQgYmUgdXNlZCBhcyBpcy4gIE5vdGUgdGhhdCBjb21tZW50cwogICAgYWJvdmUgb24gdGhlIHVzZSBpbiBkZWZsYXRlSW5pdDIoKSBhcHBsaWVzIHRvIHRoZSBtYWduaXR1ZGUgb2Ygd2luZG93Qml0cy4KIAotICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIGdyZWF0ZXIgdGhhbiAxNSBmb3Igb3B0aW9uYWwgZ3ppcCBkZWNvZGluZy4gQWRkCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgZ3JlYXRlciB0aGFuIDE1IGZvciBvcHRpb25hbCBnemlwIGRlY29kaW5nLiAgQWRkCiAgICAzMiB0byB3aW5kb3dCaXRzIHRvIGVuYWJsZSB6bGliIGFuZCBnemlwIGRlY29kaW5nIHdpdGggYXV0b21hdGljIGhlYWRlcgogICAgZGV0ZWN0aW9uLCBvciBhZGQgMTYgdG8gZGVjb2RlIG9ubHkgdGhlIGd6aXAgZm9ybWF0ICh0aGUgemxpYiBmb3JtYXQgd2lsbAotICAgcmV0dXJuIGEgWl9EQVRBX0VSUk9SKS4gIElmIGEgZ3ppcCBzdHJlYW0gaXMgYmVpbmcgZGVjb2RlZCwgc3RybS0+YWRsZXIgaXMKLSAgIGEgY3JjMzIgaW5zdGVhZCBvZiBhbiBhZGxlcjMyLgorICAgcmV0dXJuIGEgWl9EQVRBX0VSUk9SKS4gIElmIGEgZ3ppcCBzdHJlYW0gaXMgYmVpbmcgZGVjb2RlZCwgc3RybS0+YWRsZXIgaXMgYQorICAgY3JjMzIgaW5zdGVhZCBvZiBhbiBhZGxlcjMyLgogCiAgICAgIGluZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKICAgIG1lbW9yeSwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKICAgIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgcGFyYW1ldGVycyBhcmUKICAgIGludmFsaWQsIHN1Y2ggYXMgYSBudWxsIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZS4gIG1zZyBpcyBzZXQgdG8gbnVsbCBpZgotICAgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gaW5mbGF0ZUluaXQyIGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24KKyAgIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBpbmZsYXRlSW5pdDIgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbgogICAgYXBhcnQgZnJvbSBwb3NzaWJseSByZWFkaW5nIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiBhY3R1YWwgZGVjb21wcmVzc2lvbgogICAgd2lsbCBiZSBkb25lIGJ5IGluZmxhdGUoKS4gIChTbyBuZXh0X2luIGFuZCBhdmFpbF9pbiBtYXkgYmUgbW9kaWZpZWQsIGJ1dAotICAgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW51c2VkIGFuZCB1bmNoYW5nZWQuKSAgVGhlIGN1cnJlbnQKLSAgIGltcGxlbWVudGF0aW9uIG9mIGluZmxhdGVJbml0MigpIGRvZXMgbm90IHByb2Nlc3MgYW55IGhlYWRlciBpbmZvcm1hdGlvbiAtLQotICAgdGhhdCBpcyBkZWZlcnJlZCB1bnRpbCBpbmZsYXRlKCkgaXMgY2FsbGVkLgorICAgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW51c2VkIGFuZCB1bmNoYW5nZWQuKSBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbgorICAgb2YgaW5mbGF0ZUluaXQyKCkgZG9lcyBub3QgcHJvY2VzcyBhbnkgaGVhZGVyIGluZm9ybWF0aW9uIC0tIHRoYXQgaXMKKyAgIGRlZmVycmVkIHVudGlsIGluZmxhdGUoKSBpcyBjYWxsZWQuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVTZXREaWN0aW9uYXJ5IE9GKCh6X3N0cmVhbXAgc3RybSwKQEAgLTc4Miw4ICs3ODEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCAgZGljdExlbmd0aCkpOwogLyoKICAgICAgSW5pdGlhbGl6ZXMgdGhlIGRlY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiB1bmNvbXByZXNzZWQgYnl0ZQotICAgc2VxdWVuY2UuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjYWxsIG9mIGluZmxhdGUsCi0gICBpZiB0aGF0IGNhbGwgcmV0dXJuZWQgWl9ORUVEX0RJQ1QuIFRoZSBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvcgorICAgc2VxdWVuY2UuICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgY2FsbCBvZiBpbmZsYXRlLAorICAgaWYgdGhhdCBjYWxsIHJldHVybmVkIFpfTkVFRF9ESUNULiAgVGhlIGRpY3Rpb25hcnkgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yCiAgICBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBhZGxlcjMyIHZhbHVlIHJldHVybmVkIGJ5IHRoYXQgY2FsbCBvZiBpbmZsYXRlLgogICAgVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lIGRpY3Rpb25hcnkgKHNlZQogICAgZGVmbGF0ZVNldERpY3Rpb25hcnkpLiAgRm9yIHJhdyBpbmZsYXRlLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQKQEAgLTc5MiwyNiArNzkxLDI2IEBACiAgICBkaWN0aW9uYXJ5IHRoYXQgd2FzIHVzZWQgZm9yIGNvbXByZXNzaW9uIGlzIHByb3ZpZGVkLgogCiAgICAgIGluZmxhdGVTZXREaWN0aW9uYXJ5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiBhCi0gICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoZS5nLiBkaWN0aW9uYXJ5IGJlaW5nIFpfTlVMTCkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcworICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKGUuZy4gIGRpY3Rpb25hcnkgYmVpbmcgWl9OVUxMKSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCiAgICBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgZ2l2ZW4gZGljdGlvbmFyeSBkb2Vzbid0IG1hdGNoIHRoZQotICAgZXhwZWN0ZWQgb25lIChpbmNvcnJlY3QgYWRsZXIzMiB2YWx1ZSkuIGluZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90CisgICBleHBlY3RlZCBvbmUgKGluY29ycmVjdCBhZGxlcjMyIHZhbHVlKS4gIGluZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90CiAgICBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBzdWJzZXF1ZW50IGNhbGxzIG9mCiAgICBpbmZsYXRlKCkuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVTeW5jIE9GKCh6X3N0cmVhbXAgc3RybSkpOwogLyoKLSAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZSB0aGUKLSAgZGVzY3JpcHRpb24gb2YgZGVmbGF0ZSB3aXRoIFpfRlVMTF9GTFVTSCkgY2FuIGJlIGZvdW5kLCBvciB1bnRpbCBhbGwKLSAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuIE5vIG91dHB1dCBpcyBwcm92aWRlZC4KKyAgICAgU2tpcHMgaW52YWxpZCBjb21wcmVzc2VkIGRhdGEgdW50aWwgYSBmdWxsIGZsdXNoIHBvaW50IChzZWUgYWJvdmUgdGhlCisgICBkZXNjcmlwdGlvbiBvZiBkZWZsYXRlIHdpdGggWl9GVUxMX0ZMVVNIKSBjYW4gYmUgZm91bmQsIG9yIHVudGlsIGFsbAorICAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuICBObyBvdXRwdXQgaXMgcHJvdmlkZWQuCiAKLSAgICBpbmZsYXRlU3luYyByZXR1cm5zIFpfT0sgaWYgYSBmdWxsIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLCBaX0JVRl9FUlJPUgotICBpZiBubyBtb3JlIGlucHV0IHdhcyBwcm92aWRlZCwgWl9EQVRBX0VSUk9SIGlmIG5vIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLAotICBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50LiBJbiB0aGUgc3VjY2VzcwotICBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHNhdmUgdGhlIGN1cnJlbnQgY3VycmVudCB2YWx1ZSBvZiB0b3RhbF9pbiB3aGljaAotICBpbmRpY2F0ZXMgd2hlcmUgdmFsaWQgY29tcHJlc3NlZCBkYXRhIHdhcyBmb3VuZC4gSW4gdGhlIGVycm9yIGNhc2UsIHRoZQotICBhcHBsaWNhdGlvbiBtYXkgcmVwZWF0ZWRseSBjYWxsIGluZmxhdGVTeW5jLCBwcm92aWRpbmcgbW9yZSBpbnB1dCBlYWNoIHRpbWUsCi0gIHVudGlsIHN1Y2Nlc3Mgb3IgZW5kIG9mIHRoZSBpbnB1dCBkYXRhLgorICAgICBpbmZsYXRlU3luYyByZXR1cm5zIFpfT0sgaWYgYSBmdWxsIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLCBaX0JVRl9FUlJPUgorICAgaWYgbm8gbW9yZSBpbnB1dCB3YXMgcHJvdmlkZWQsIFpfREFUQV9FUlJPUiBpZiBubyBmbHVzaCBwb2ludCBoYXMgYmVlbgorICAgZm91bmQsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuICBJbiB0aGUKKyAgIHN1Y2Nlc3MgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSBzYXZlIHRoZSBjdXJyZW50IGN1cnJlbnQgdmFsdWUgb2YgdG90YWxfaW4KKyAgIHdoaWNoIGluZGljYXRlcyB3aGVyZSB2YWxpZCBjb21wcmVzc2VkIGRhdGEgd2FzIGZvdW5kLiAgSW4gdGhlIGVycm9yIGNhc2UsCisgICB0aGUgYXBwbGljYXRpb24gbWF5IHJlcGVhdGVkbHkgY2FsbCBpbmZsYXRlU3luYywgcHJvdmlkaW5nIG1vcmUgaW5wdXQgZWFjaAorICAgdGltZSwgdW50aWwgc3VjY2VzcyBvciBlbmQgb2YgdGhlIGlucHV0IGRhdGEuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVDb3B5IE9GKCh6X3N0cmVhbXAgZGVzdCwKQEAgLTgyNiwxNyArODI1LDE3IEBACiAKICAgICAgaW5mbGF0ZUNvcHkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKICAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQKLSAgIChzdWNoIGFzIHphbGxvYyBiZWluZyBaX05VTEwpLiBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCisgICAoc3VjaCBhcyB6YWxsb2MgYmVpbmcgWl9OVUxMKS4gIG1zZyBpcyBsZWZ0IHVuY2hhbmdlZCBpbiBib3RoIHNvdXJjZSBhbmQKICAgIGRlc3RpbmF0aW9uLgogKi8KIAogWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CiAvKgogICAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gaW5mbGF0ZUVuZCBmb2xsb3dlZCBieSBpbmZsYXRlSW5pdCwKLSAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgZGVjb21wcmVzc2lvbiBzdGF0ZS4KLSAgIFRoZSBzdHJlYW0gd2lsbCBrZWVwIGF0dHJpYnV0ZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSBpbmZsYXRlSW5pdDIuCisgICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGRlY29tcHJlc3Npb24gc3RhdGUuICBUaGUKKyAgIHN0cmVhbSB3aWxsIGtlZXAgYXR0cmlidXRlcyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IGluZmxhdGVJbml0Mi4KIAotICAgICAgaW5mbGF0ZVJlc2V0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICAgIGluZmxhdGVSZXNldCByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQogICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIFpfTlVMTCkuCiAqLwogCkBAIC04NDQsMTAgKzg0MywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cykpOwogLyoKICAgICAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyBpbmZsYXRlUmVzZXQsIGJ1dCBpdCBhbHNvIHBlcm1pdHMgY2hhbmdpbmcKLSAgIHRoZSB3cmFwIGFuZCB3aW5kb3cgc2l6ZSByZXF1ZXN0cy4gIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcwotICAgaW50ZXJwcmV0ZWQgdGhlIHNhbWUgYXMgaXQgaXMgZm9yIGluZmxhdGVJbml0Mi4KKyAgIHRoZSB3cmFwIGFuZCB3aW5kb3cgc2l6ZSByZXF1ZXN0cy4gIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyBpbnRlcnByZXRlZAorICAgdGhlIHNhbWUgYXMgaXQgaXMgZm9yIGluZmxhdGVJbml0Mi4KIAotICAgICAgaW5mbGF0ZVJlc2V0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgICBpbmZsYXRlUmVzZXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCiAgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgWl9OVUxMKSwgb3IgaWYKICAgIHRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyBpbnZhbGlkLgogKi8KQEAgLTg1NywxOSArODU2LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSk7CiAvKgogICAgICBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYml0cyBpbiB0aGUgaW5mbGF0ZSBpbnB1dCBzdHJlYW0uICBUaGUgaW50ZW50IGlzCi0gIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IGluZmxhdGluZyBhdCBhIGJpdCBwb3NpdGlvbiBpbiB0aGUKLSAgbWlkZGxlIG9mIGEgYnl0ZS4gIFRoZSBwcm92aWRlZCBiaXRzIHdpbGwgYmUgdXNlZCBiZWZvcmUgYW55IGJ5dGVzIGFyZSB1c2VkCi0gIGZyb20gbmV4dF9pbi4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHJhdyBpbmZsYXRlLCBhbmQKLSAgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIHRoZSBmaXJzdCBpbmZsYXRlKCkgY2FsbCBhZnRlciBpbmZsYXRlSW5pdDIoKSBvcgotICBpbmZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYsIGFuZCB0aGF0IG1hbnkgb2YgdGhlCi0gIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdmFsdWUgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgaW5wdXQuCisgICB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCBpbmZsYXRpbmcgYXQgYSBiaXQgcG9zaXRpb24gaW4gdGhlCisgICBtaWRkbGUgb2YgYSBieXRlLiAgVGhlIHByb3ZpZGVkIGJpdHMgd2lsbCBiZSB1c2VkIGJlZm9yZSBhbnkgYnl0ZXMgYXJlIHVzZWQKKyAgIGZyb20gbmV4dF9pbi4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHJhdyBpbmZsYXRlLCBhbmQKKyAgIHNob3VsZCBiZSB1c2VkIGJlZm9yZSB0aGUgZmlyc3QgaW5mbGF0ZSgpIGNhbGwgYWZ0ZXIgaW5mbGF0ZUluaXQyKCkgb3IKKyAgIGluZmxhdGVSZXNldCgpLiAgYml0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxNiwgYW5kIHRoYXQgbWFueSBvZiB0aGUKKyAgIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdmFsdWUgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgaW5wdXQuCiAKICAgICAgSWYgYml0cyBpcyBuZWdhdGl2ZSwgdGhlbiB0aGUgaW5wdXQgc3RyZWFtIGJpdCBidWZmZXIgaXMgZW1wdGllZC4gIFRoZW4KLSAgaW5mbGF0ZVByaW1lKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB0byBwdXQgYml0cyBpbiB0aGUgYnVmZmVyLiAgVGhpcyBpcyB1c2VkCi0gIHRvIGNsZWFyIG91dCBiaXRzIGxlZnRvdmVyIGFmdGVyIGZlZWRpbmcgaW5mbGF0ZSBhIGJsb2NrIGRlc2NyaXB0aW9uIHByaW9yCi0gIHRvIGZlZWRpbmcgaW5mbGF0ZSBjb2Rlcy4KKyAgIGluZmxhdGVQcmltZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gdG8gcHV0IGJpdHMgaW4gdGhlIGJ1ZmZlci4gIFRoaXMgaXMgdXNlZAorICAgdG8gY2xlYXIgb3V0IGJpdHMgbGVmdG92ZXIgYWZ0ZXIgZmVlZGluZyBpbmZsYXRlIGEgYmxvY2sgZGVzY3JpcHRpb24gcHJpb3IKKyAgIHRvIGZlZWRpbmcgaW5mbGF0ZSBjb2Rlcy4KIAotICAgICAgaW5mbGF0ZVByaW1lIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICAgIGluZmxhdGVQcmltZSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQogICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCiAqLwogCkBAIC04OTEsMjAgKzg5MCwyMCBAQAogICAgZGVjb2Rpbmcgb2YgdGhlIGNvZGUsIG9yIGlmIGl0IGhhcyBjb21wbGV0ZWQgZGVjb2RpbmcgYnV0IGlzIHdhaXRpbmcgZm9yCiAgICBtb3JlIG91dHB1dCBzcGFjZSB0byB3cml0ZSB0aGUgbGl0ZXJhbCBvciBtYXRjaCBkYXRhLgogCi0gICAgICBpbmZsYXRlTWFyaygpIGlzIHVzZWQgdG8gbWFyayBsb2NhdGlvbnMgaW4gdGhlIGlucHV0IGRhdGEgZm9yIHJhbmRvbQorICAgICBpbmZsYXRlTWFyaygpIGlzIHVzZWQgdG8gbWFyayBsb2NhdGlvbnMgaW4gdGhlIGlucHV0IGRhdGEgZm9yIHJhbmRvbQogICAgYWNjZXNzLCB3aGljaCBtYXkgYmUgYXQgYml0IHBvc2l0aW9ucywgYW5kIHRvIG5vdGUgdGhvc2UgY2FzZXMgd2hlcmUgdGhlCiAgICBvdXRwdXQgb2YgYSBjb2RlIG1heSBzcGFuIGJvdW5kYXJpZXMgb2YgcmFuZG9tIGFjY2VzcyBibG9ja3MuICBUaGUgY3VycmVudAogICAgbG9jYXRpb24gaW4gdGhlIGlucHV0IHN0cmVhbSBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIGF2YWlsX2luIGFuZCBkYXRhX3R5cGUKICAgIGFzIG5vdGVkIGluIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIFpfQkxPQ0sgZmx1c2ggcGFyYW1ldGVyIGZvciBpbmZsYXRlLgogCi0gICAgICBpbmZsYXRlTWFyayByZXR1cm5zIHRoZSB2YWx1ZSBub3RlZCBhYm92ZSBvciAtMSA8PCAxNiBpZiB0aGUgcHJvdmlkZWQKKyAgICAgaW5mbGF0ZU1hcmsgcmV0dXJucyB0aGUgdmFsdWUgbm90ZWQgYWJvdmUgb3IgLTEgPDwgMTYgaWYgdGhlIHByb3ZpZGVkCiAgICBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVHZXRIZWFkZXIgT0YoKHpfc3RyZWFtcCBzdHJtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnel9oZWFkZXJwIGhlYWQpKTsKIC8qCi0gICAgICBpbmZsYXRlR2V0SGVhZGVyKCkgcmVxdWVzdHMgdGhhdCBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBiZSBzdG9yZWQgaW4gdGhlCisgICAgIGluZmxhdGVHZXRIZWFkZXIoKSByZXF1ZXN0cyB0aGF0IGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIGJlIHN0b3JlZCBpbiB0aGUKICAgIHByb3ZpZGVkIGd6X2hlYWRlciBzdHJ1Y3R1cmUuICBpbmZsYXRlR2V0SGVhZGVyKCkgbWF5IGJlIGNhbGxlZCBhZnRlcgogICAgaW5mbGF0ZUluaXQyKCkgb3IgaW5mbGF0ZVJlc2V0KCksIGFuZCBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgb2YgaW5mbGF0ZSgpLgogICAgQXMgaW5mbGF0ZSgpIHByb2Nlc3NlcyB0aGUgZ3ppcCBzdHJlYW0sIGhlYWQtPmRvbmUgaXMgemVybyB1bnRpbCB0aGUgaGVhZGVyCkBAIC05MTQsMzAgKzkxMywzMCBAQAogICAgdXNlZCB0byBmb3JjZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGhlYWRlciBwcm9jZXNzaW5nIGlzCiAgICBjb21wbGV0ZSBhbmQgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpcyBkZWNvbXByZXNzZWQuCiAKLSAgICAgIFRoZSB0ZXh0LCB0aW1lLCB4ZmxhZ3MsIGFuZCBvcyBmaWVsZHMgYXJlIGZpbGxlZCBpbiB3aXRoIHRoZSBnemlwIGhlYWRlcgorICAgICBUaGUgdGV4dCwgdGltZSwgeGZsYWdzLCBhbmQgb3MgZmllbGRzIGFyZSBmaWxsZWQgaW4gd2l0aCB0aGUgZ3ppcCBoZWFkZXIKICAgIGNvbnRlbnRzLiAgaGNyYyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGVyZSBpcyBhIGhlYWRlciBDUkMuICAoVGhlIGhlYWRlciBDUkMKLSAgIHdhcyB2YWxpZCBpZiBkb25lIGlzIHNldCB0byBvbmUuKSAgSWYgZXh0cmEgaXMgbm90IFpfTlVMTCwgdGhlbiBleHRyYV9tYXgKKyAgIHdhcyB2YWxpZCBpZiBkb25lIGlzIHNldCB0byBvbmUuKSBJZiBleHRyYSBpcyBub3QgWl9OVUxMLCB0aGVuIGV4dHJhX21heAogICAgY29udGFpbnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIGV4dHJhLiAgT25jZSBkb25lIGlzIHRydWUsCiAgICBleHRyYV9sZW4gY29udGFpbnMgdGhlIGFjdHVhbCBleHRyYSBmaWVsZCBsZW5ndGgsIGFuZCBleHRyYSBjb250YWlucyB0aGUKICAgIGV4dHJhIGZpZWxkLCBvciB0aGF0IGZpZWxkIHRydW5jYXRlZCBpZiBleHRyYV9tYXggaXMgbGVzcyB0aGFuIGV4dHJhX2xlbi4KICAgIElmIG5hbWUgaXMgbm90IFpfTlVMTCwgdGhlbiB1cCB0byBuYW1lX21heCBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoZXJlLAogICAgdGVybWluYXRlZCB3aXRoIGEgemVybyB1bmxlc3MgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gbmFtZV9tYXguICBJZgogICAgY29tbWVudCBpcyBub3QgWl9OVUxMLCB0aGVuIHVwIHRvIGNvbW1fbWF4IGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gdGhlcmUsCi0gICB0ZXJtaW5hdGVkIHdpdGggYSB6ZXJvIHVubGVzcyB0aGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBjb21tX21heC4gIFdoZW4KLSAgIGFueSBvZiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCBhcmUgbm90IFpfTlVMTCBhbmQgdGhlIHJlc3BlY3RpdmUgZmllbGQgaXMKLSAgIG5vdCBwcmVzZW50IGluIHRoZSBoZWFkZXIsIHRoZW4gdGhhdCBmaWVsZCBpcyBzZXQgdG8gWl9OVUxMIHRvIHNpZ25hbCBpdHMKKyAgIHRlcm1pbmF0ZWQgd2l0aCBhIHplcm8gdW5sZXNzIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIGNvbW1fbWF4LiAgV2hlbiBhbnkKKyAgIG9mIGV4dHJhLCBuYW1lLCBvciBjb21tZW50IGFyZSBub3QgWl9OVUxMIGFuZCB0aGUgcmVzcGVjdGl2ZSBmaWVsZCBpcyBub3QKKyAgIHByZXNlbnQgaW4gdGhlIGhlYWRlciwgdGhlbiB0aGF0IGZpZWxkIGlzIHNldCB0byBaX05VTEwgdG8gc2lnbmFsIGl0cwogICAgYWJzZW5jZS4gIFRoaXMgYWxsb3dzIHRoZSB1c2Ugb2YgZGVmbGF0ZVNldEhlYWRlcigpIHdpdGggdGhlIHJldHVybmVkCiAgICBzdHJ1Y3R1cmUgdG8gZHVwbGljYXRlIHRoZSBoZWFkZXIuICBIb3dldmVyIGlmIHRob3NlIGZpZWxkcyBhcmUgc2V0IHRvCiAgICBhbGxvY2F0ZWQgbWVtb3J5LCB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5lZWQgdG8gc2F2ZSB0aG9zZSBwb2ludGVycwogICAgZWxzZXdoZXJlIHNvIHRoYXQgdGhleSBjYW4gYmUgZXZlbnR1YWxseSBmcmVlZC4KIAotICAgICAgSWYgaW5mbGF0ZUdldEhlYWRlciBpcyBub3QgdXNlZCwgdGhlbiB0aGUgaGVhZGVyIGluZm9ybWF0aW9uIGlzIHNpbXBseQorICAgICBJZiBpbmZsYXRlR2V0SGVhZGVyIGlzIG5vdCB1c2VkLCB0aGVuIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gaXMgc2ltcGx5CiAgICBkaXNjYXJkZWQuICBUaGUgaGVhZGVyIGlzIGFsd2F5cyBjaGVja2VkIGZvciB2YWxpZGl0eSwgaW5jbHVkaW5nIHRoZSBoZWFkZXIKICAgIENSQyBpZiBwcmVzZW50LiAgaW5mbGF0ZVJlc2V0KCkgd2lsbCByZXNldCB0aGUgcHJvY2VzcyB0byBkaXNjYXJkIHRoZSBoZWFkZXIKICAgIGluZm9ybWF0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIHdvdWxkIG5lZWQgdG8gY2FsbCBpbmZsYXRlR2V0SGVhZGVyKCkgYWdhaW4gdG8KICAgIHJldHJpZXZlIHRoZSBoZWFkZXIgZnJvbSB0aGUgbmV4dCBnemlwIHN0cmVhbS4KIAotICAgICAgaW5mbGF0ZUdldEhlYWRlciByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgICBpbmZsYXRlR2V0SGVhZGVyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCiAgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KICovCiAKQEAgLTk1OCw5ICs5NTcsOSBAQAogICAgICBTZWUgaW5mbGF0ZUJhY2soKSBmb3IgdGhlIHVzYWdlIG9mIHRoZXNlIHJvdXRpbmVzLgogCiAgICAgIGluZmxhdGVCYWNrSW5pdCB3aWxsIHJldHVybiBaX09LIG9uIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIGFueSBvZgotICAgdGhlIHBhcmFtYXRlcnMgYXJlIGludmFsaWQsIFpfTUVNX0VSUk9SIGlmIHRoZSBpbnRlcm5hbCBzdGF0ZSBjb3VsZCBub3QKLSAgIGJlIGFsbG9jYXRlZCwgb3IgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGRvZXMgbm90Ci0gICBtYXRjaCB0aGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyIGZpbGUuCisgICB0aGUgcGFyYW1hdGVycyBhcmUgaW52YWxpZCwgWl9NRU1fRVJST1IgaWYgdGhlIGludGVybmFsIHN0YXRlIGNvdWxkIG5vdCBiZQorICAgYWxsb2NhdGVkLCBvciBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgZG9lcyBub3QgbWF0Y2gKKyAgIHRoZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIgZmlsZS4KICovCiAKIHR5cGVkZWYgdW5zaWduZWQgKCppbl9mdW5jKSBPRigodm9pZCBGQVIgKiwgdW5zaWduZWQgY2hhciBGQVIgKiBGQVIgKikpOwpAQCAtOTgwLDE1ICs5NzksMTUgQEAKICAgICAgaW5mbGF0ZUJhY2tJbml0KCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIHN0YXRlCiAgICBhbmQgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhdGUgd2l0aCB0aGUgdXNlci1wcm92aWRlZCB3aW5kb3cgYnVmZmVyLgogICAgaW5mbGF0ZUJhY2soKSBtYXkgdGhlbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzIHRvIGluZmxhdGUgYSBjb21wbGV0ZSwgcmF3Ci0gICBkZWZsYXRlIHN0cmVhbSB3aXRoIGVhY2ggY2FsbC4gIGluZmxhdGVCYWNrRW5kKCkgaXMgdGhlbiBjYWxsZWQgdG8gZnJlZQotICAgdGhlIGFsbG9jYXRlZCBzdGF0ZS4KKyAgIGRlZmxhdGUgc3RyZWFtIHdpdGggZWFjaCBjYWxsLiAgaW5mbGF0ZUJhY2tFbmQoKSBpcyB0aGVuIGNhbGxlZCB0byBmcmVlIHRoZQorICAgYWxsb2NhdGVkIHN0YXRlLgogCiAgICAgIEEgcmF3IGRlZmxhdGUgc3RyZWFtIGlzIG9uZSB3aXRoIG5vIHpsaWIgb3IgZ3ppcCBoZWFkZXIgb3IgdHJhaWxlci4KICAgIFRoaXMgcm91dGluZSB3b3VsZCBub3JtYWxseSBiZSB1c2VkIGluIGEgdXRpbGl0eSB0aGF0IHJlYWRzIHppcCBvciBnemlwCiAgICBmaWxlcyBhbmQgd3JpdGVzIG91dCB1bmNvbXByZXNzZWQgZmlsZXMuICBUaGUgdXRpbGl0eSB3b3VsZCBkZWNvZGUgdGhlCi0gICBoZWFkZXIgYW5kIHByb2Nlc3MgdGhlIHRyYWlsZXIgb24gaXRzIG93biwgaGVuY2UgdGhpcyByb3V0aW5lIGV4cGVjdHMKLSAgIG9ubHkgdGhlIHJhdyBkZWZsYXRlIHN0cmVhbSB0byBkZWNvbXByZXNzLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUKLSAgIG5vcm1hbCBiZWhhdmlvciBvZiBpbmZsYXRlKCksIHdoaWNoIGV4cGVjdHMgZWl0aGVyIGEgemxpYiBvciBnemlwIGhlYWRlciBhbmQKKyAgIGhlYWRlciBhbmQgcHJvY2VzcyB0aGUgdHJhaWxlciBvbiBpdHMgb3duLCBoZW5jZSB0aGlzIHJvdXRpbmUgZXhwZWN0cyBvbmx5CisgICB0aGUgcmF3IGRlZmxhdGUgc3RyZWFtIHRvIGRlY29tcHJlc3MuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBub3JtYWwKKyAgIGJlaGF2aW9yIG9mIGluZmxhdGUoKSwgd2hpY2ggZXhwZWN0cyBlaXRoZXIgYSB6bGliIG9yIGd6aXAgaGVhZGVyIGFuZAogICAgdHJhaWxlciBhcm91bmQgdGhlIGRlZmxhdGUgc3RyZWFtLgogCiAgICAgIGluZmxhdGVCYWNrKCkgdXNlcyB0d28gc3Vicm91dGluZXMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlciB0aGF0IGFyZSB0aGVuCkBAIC0xMDE0LDcgKzEwMTMsNyBAQAogICAgY2FsbGluZyBpbmZsYXRlQmFjaygpLiAgSWYgc3RybS0+bmV4dF9pbiBpcyBaX05VTEwsIHRoZW4gaW4oKSB3aWxsIGJlIGNhbGxlZAogICAgaW1tZWRpYXRlbHkgZm9yIGlucHV0LiAgSWYgc3RybS0+bmV4dF9pbiBpcyBub3QgWl9OVUxMLCB0aGVuIHN0cm0tPmF2YWlsX2luCiAgICBtdXN0IGFsc28gYmUgaW5pdGlhbGl6ZWQsIGFuZCB0aGVuIGlmIHN0cm0tPmF2YWlsX2luIGlzIG5vdCB6ZXJvLCBpbnB1dCB3aWxsCi0gICBpbml0aWFsbHkgYmUgdGFrZW4gZnJvbSBzdHJtLT5uZXh0X2luWzAgLi4gc3RybS0+YXZhaWxfaW4gLSAxXS4KKyAgIGluaXRpYWxseSBiZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW5bMCAuLiAgc3RybS0+YXZhaWxfaW4gLSAxXS4KIAogICAgICBUaGUgaW5fZGVzYyBhbmQgb3V0X2Rlc2MgcGFyYW1ldGVycyBvZiBpbmZsYXRlQmFjaygpIGlzIHBhc3NlZCBhcyB0aGUKICAgIGZpcnN0IHBhcmFtZXRlciBvZiBpbigpIGFuZCBvdXQoKSByZXNwZWN0aXZlbHkgd2hlbiB0aGV5IGFyZSBjYWxsZWQuICBUaGVzZQpAQCAtMTAyNCwxNSArMTAyMywxNSBAQAogICAgICBPbiByZXR1cm4sIGluZmxhdGVCYWNrKCkgd2lsbCBzZXQgc3RybS0+bmV4dF9pbiBhbmQgc3RybS0+YXZhaWxfaW4gdG8KICAgIHBhc3MgYmFjayBhbnkgdW51c2VkIGlucHV0IHRoYXQgd2FzIHByb3ZpZGVkIGJ5IHRoZSBsYXN0IGluKCkgY2FsbC4gIFRoZQogICAgcmV0dXJuIHZhbHVlcyBvZiBpbmZsYXRlQmFjaygpIGNhbiBiZSBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9CVUZfRVJST1IKLSAgIGlmIGluKCkgb3Igb3V0KCkgcmV0dXJuZWQgYW4gZXJyb3IsIFpfREFUQV9FUlJPUiBpZiB0aGVyZSB3YXMgYSBmb3JtYXQKLSAgIGVycm9yIGluIHRoZSBkZWZsYXRlIHN0cmVhbSAoaW4gd2hpY2ggY2FzZSBzdHJtLT5tc2cgaXMgc2V0IHRvIGluZGljYXRlIHRoZQotICAgbmF0dXJlIG9mIHRoZSBlcnJvciksIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gd2FzIG5vdCBwcm9wZXJseQotICAgaW5pdGlhbGl6ZWQuICBJbiB0aGUgY2FzZSBvZiBaX0JVRl9FUlJPUiwgYW4gaW5wdXQgb3Igb3V0cHV0IGVycm9yIGNhbiBiZQotICAgZGlzdGluZ3Vpc2hlZCB1c2luZyBzdHJtLT5uZXh0X2luIHdoaWNoIHdpbGwgYmUgWl9OVUxMIG9ubHkgaWYgaW4oKSByZXR1cm5lZAotICAgYW4gZXJyb3IuICBJZiBzdHJtLT5uZXh0X2luIGlzIG5vdCBaX05VTEwsIHRoZW4gdGhlIFpfQlVGX0VSUk9SIHdhcyBkdWUgdG8KLSAgIG91dCgpIHJldHVybmluZyBub24temVyby4gIChpbigpIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBiZWZvcmUgb3V0KCksIHNvCi0gICBzdHJtLT5uZXh0X2luIGlzIGFzc3VyZWQgdG8gYmUgZGVmaW5lZCBpZiBvdXQoKSByZXR1cm5zIG5vbi16ZXJvLikgIE5vdGUKLSAgIHRoYXQgaW5mbGF0ZUJhY2soKSBjYW5ub3QgcmV0dXJuIFpfT0suCisgICBpZiBpbigpIG9yIG91dCgpIHJldHVybmVkIGFuIGVycm9yLCBaX0RBVEFfRVJST1IgaWYgdGhlcmUgd2FzIGEgZm9ybWF0IGVycm9yCisgICBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0gKGluIHdoaWNoIGNhc2Ugc3RybS0+bXNnIGlzIHNldCB0byBpbmRpY2F0ZSB0aGUgbmF0dXJlCisgICBvZiB0aGUgZXJyb3IpLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHdhcyBub3QgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCisgICBJbiB0aGUgY2FzZSBvZiBaX0JVRl9FUlJPUiwgYW4gaW5wdXQgb3Igb3V0cHV0IGVycm9yIGNhbiBiZSBkaXN0aW5ndWlzaGVkCisgICB1c2luZyBzdHJtLT5uZXh0X2luIHdoaWNoIHdpbGwgYmUgWl9OVUxMIG9ubHkgaWYgaW4oKSByZXR1cm5lZCBhbiBlcnJvci4gIElmCisgICBzdHJtLT5uZXh0X2luIGlzIG5vdCBaX05VTEwsIHRoZW4gdGhlIFpfQlVGX0VSUk9SIHdhcyBkdWUgdG8gb3V0KCkgcmV0dXJuaW5nCisgICBub24temVyby4gIChpbigpIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBiZWZvcmUgb3V0KCksIHNvIHN0cm0tPm5leHRfaW4gaXMKKyAgIGFzc3VyZWQgdG8gYmUgZGVmaW5lZCBpZiBvdXQoKSByZXR1cm5zIG5vbi16ZXJvLikgTm90ZSB0aGF0IGluZmxhdGVCYWNrKCkKKyAgIGNhbm5vdCByZXR1cm4gWl9PSy4KICovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tFbmQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CkBAIC0xMDg5LDIyICsxMDg4LDIxIEBACiAKIC8qCiAgICAgIFRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUKLSAgIGJhc2ljIHN0cmVhbS1vcmllbnRlZCBmdW5jdGlvbnMuIFRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UsIHNvbWUKLSAgIGRlZmF1bHQgb3B0aW9ucyBhcmUgYXNzdW1lZCAoY29tcHJlc3Npb24gbGV2ZWwgYW5kIG1lbW9yeSB1c2FnZSwKLSAgIHN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucykuIFRoZSBzb3VyY2UgY29kZSBvZiB0aGVzZQotICAgdXRpbGl0eSBmdW5jdGlvbnMgY2FuIGVhc2lseSBiZSBtb2RpZmllZCBpZiB5b3UgbmVlZCBzcGVjaWFsIG9wdGlvbnMuCisgICBiYXNpYyBzdHJlYW0tb3JpZW50ZWQgZnVuY3Rpb25zLiAgVG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZSwgc29tZSBkZWZhdWx0CisgICBvcHRpb25zIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLCBzdGFuZGFyZCBtZW1vcnkKKyAgIGFsbG9jYXRpb24gZnVuY3Rpb25zKS4gIFRoZSBzb3VyY2UgY29kZSBvZiB0aGVzZSB1dGlsaXR5IGZ1bmN0aW9ucyBjYW4KKyAgIGVhc2lseSBiZSBtb2RpZmllZCBpZiB5b3UgbmVlZCBzcGVjaWFsIG9wdGlvbnMuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGNvbXByZXNzIE9GKChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKIC8qCiAgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCi0gICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCi0gICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgdGhlIHZhbHVlIHJldHVybmVkCi0gICBieSBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbikuIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCisgICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuICBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplCisgICBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAgY29tcHJlc3NCb3VuZChzb3VyY2VMZW4pLiAgVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUKICAgIGNvbXByZXNzZWQgYnVmZmVyLgotICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQotICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgorCiAgICAgIGNvbXByZXNzIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CiAgICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKICAgIGJ1ZmZlci4KQEAgLTExMTQsMTEgKzExMTIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSk7CiAvKgotICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gVGhlIGxldmVsCisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgVGhlIGxldmVsCiAgICBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gZGVmbGF0ZUluaXQuICBzb3VyY2VMZW4gaXMgdGhlIGJ5dGUKLSAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKKyAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCiAgICBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgdGhlIHZhbHVlIHJldHVybmVkIGJ5Ci0gICBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbikuIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCisgICBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbikuICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQogICAgY29tcHJlc3NlZCBidWZmZXIuCiAKICAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaApAQCAtMTEyOSwyMiArMTEyNywyMCBAQAogWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNvbXByZXNzQm91bmQgT0YoKHVMb25nIHNvdXJjZUxlbikpOwogLyoKICAgICAgY29tcHJlc3NCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgotICAgY29tcHJlc3MoKSBvciBjb21wcmVzczIoKSBvbiBzb3VyY2VMZW4gYnl0ZXMuICBJdCB3b3VsZCBiZSB1c2VkIGJlZm9yZQotICAgYSBjb21wcmVzcygpIG9yIGNvbXByZXNzMigpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAgIGNvbXByZXNzKCkgb3IgY29tcHJlc3MyKCkgb24gc291cmNlTGVuIGJ5dGVzLiAgSXQgd291bGQgYmUgdXNlZCBiZWZvcmUgYQorICAgY29tcHJlc3MoKSBvciBjb21wcmVzczIoKSBjYWxsIHRvIGFsbG9jYXRlIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIHVuY29tcHJlc3MgT0YoKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKSk7CiAvKgogICAgICBEZWNvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCi0gICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCi0gICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCi0gICBlbnRpcmUgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbXVzdCBoYXZlCi0gICBiZWVuIHNhdmVkIHByZXZpb3VzbHkgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHRyYW5zbWl0dGVkIHRvIHRoZSBkZWNvbXByZXNzb3IKLSAgIGJ5IHNvbWUgbWVjaGFuaXNtIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgY29tcHJlc3Npb24gbGlicmFyeS4pCi0gICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgYnVmZmVyLgotICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCi0gICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCisgICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuICBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplCisgICBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBlbnRpcmUKKyAgIHVuY29tcHJlc3NlZCBkYXRhLiAgKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGhhdmUgYmVlbiBzYXZlZAorICAgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvciBieSBzb21lCisgICBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjb21wcmVzc2lvbiBsaWJyYXJ5LikgVXBvbiBleGl0LCBkZXN0TGVuCisgICBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBidWZmZXIuCiAKICAgICAgdW5jb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAogICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CkBAIC0xMTUzLDEwICsxMTQ5LDkgQEAKIAogLyoKICAgICAgVGhpcyBsaWJyYXJ5IHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4gZ3ppcCAoLmd6KSBmb3JtYXQKLSAgd2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvIHVzaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzdGFydAotICB3aXRoICJneiIuIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuIGd6aXAgaXMgYQotICBnemlwIHdyYXBwZXIsIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTIsIHdyYXBwZWQgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0uCi0KKyAgIHdpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpbyB1c2luZyB0aGUgZnVuY3Rpb25zIHRoYXQgc3RhcnQKKyAgIHdpdGggImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEKKyAgIGd6aXAgd3JhcHBlciwgZG9jdW1lbnRlZCBpbiBSRkMgMTk1Miwgd3JhcHBlZCBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbS4KICovCiAKIHR5cGVkZWYgdm9pZHAgZ3pGaWxlOwpAQCAtMTE2NCwxNDggKzExNTksMTc0IEBACiAvKgogWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW4gT0YoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUpKTsKIAotICAgICBPcGVucyBhIGd6aXAgKC5neikgZmlsZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLiBUaGUgbW9kZSBwYXJhbWV0ZXIKLSAgIGlzIGFzIGluIGZvcGVuICgicmIiIG9yICJ3YiIpIGJ1dCBjYW4gYWxzbyBpbmNsdWRlIGEgY29tcHJlc3Npb24gbGV2ZWwKLSAgICgid2I5Iikgb3IgYSBzdHJhdGVneTogJ2YnIGZvciBmaWx0ZXJlZCBkYXRhIGFzIGluICJ3YjZmIiwgJ2gnIGZvcgotICAgSHVmZm1hbiBvbmx5IGNvbXByZXNzaW9uIGFzIGluICJ3YjFoIiwgb3IgJ1InIGZvciBydW4tbGVuZ3RoIGVuY29kaW5nCi0gICBhcyBpbiAid2IxUiIuIChTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIGRlZmxhdGVJbml0MiBmb3IgbW9yZSBpbmZvcm1hdGlvbgotICAgYWJvdXQgdGhlIHN0cmF0ZWd5IHBhcmFtZXRlci4pCisgICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuICBUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgYXMKKyAgIGluIGZvcGVuICgicmIiIG9yICJ3YiIpIGJ1dCBjYW4gYWxzbyBpbmNsdWRlIGEgY29tcHJlc3Npb24gbGV2ZWwgKCJ3YjkiKSBvcgorICAgYSBzdHJhdGVneTogJ2YnIGZvciBmaWx0ZXJlZCBkYXRhIGFzIGluICJ3YjZmIiwgJ2gnIGZvciBIdWZmbWFuLW9ubHkKKyAgIGNvbXByZXNzaW9uIGFzIGluICJ3YjFoIiwgJ1InIGZvciBydW4tbGVuZ3RoIGVuY29kaW5nIGFzIGluICJ3YjFSIiwgb3IgJ0YnCisgICBmb3IgZml4ZWQgY29kZSBjb21wcmVzc2lvbiBhcyBpbiAid2I5RiIuICAoU2VlIHRoZSBkZXNjcmlwdGlvbiBvZgorICAgZGVmbGF0ZUluaXQyIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJhdGVneSBwYXJhbWV0ZXIuKSBBbHNvICJhIgorICAgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiAidyIgdG8gcmVxdWVzdCB0aGF0IHRoZSBnemlwIHN0cmVhbSB0aGF0IHdpbGwgYmUKKyAgIHdyaXR0ZW4gYmUgYXBwZW5kZWQgdG8gdGhlIGZpbGUuICAiKyIgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IsIHNpbmNlIHJlYWRpbmcKKyAgIGFuZCB3cml0aW5nIHRvIHRoZSBzYW1lIGd6aXAgZmlsZSBpcyBub3Qgc3VwcG9ydGVkLgogCiAgICAgIGd6b3BlbiBjYW4gYmUgdXNlZCB0byByZWFkIGEgZmlsZSB3aGljaCBpcyBub3QgaW4gZ3ppcCBmb3JtYXQ7IGluIHRoaXMKICAgIGNhc2UgZ3pyZWFkIHdpbGwgZGlyZWN0bHkgcmVhZCBmcm9tIHRoZSBmaWxlIHdpdGhvdXQgZGVjb21wcmVzc2lvbi4KIAogICAgICBnem9wZW4gcmV0dXJucyBOVUxMIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgb3IgaWYgdGhlcmUgd2FzCi0gICBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGU7IGVycm5vCi0gICBjYW4gYmUgY2hlY2tlZCB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIGNhc2VzIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUKLSAgIHpsaWIgZXJyb3IgaXMgWl9NRU1fRVJST1IpLiAgKi8KKyAgIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZTsgZXJybm8gY2FuIGJlCisgICBjaGVja2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gY2FzZXMgKGlmIGVycm5vIGlzIHplcm8sIHRoZSB6bGliIGVycm9yIGlzCisgICBaX01FTV9FUlJPUikuCisqLwogCiBaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6ZG9wZW4gT0YoKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSkpOwogLyoKICAgICAgZ3pkb3BlbigpIGFzc29jaWF0ZXMgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiAgRmlsZQotICAgZGVzY3JpcHRvcnMgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yCi0gICBmaWxlbm8gKGluIHRoZSBmaWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLgotICAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzIGluIGd6b3Blbi4KLSAgICAgVGhlIG5leHQgY2FsbCBvZiBnemNsb3NlIG9uIHRoZSByZXR1cm5lZCBnekZpbGUgd2lsbCBhbHNvIGNsb3NlIHRoZQotICAgZmlsZSBkZXNjcmlwdG9yIGZkLCBqdXN0IGxpa2UgZmNsb3NlKGZkb3BlbihmZCksIG1vZGUpIGNsb3NlcyB0aGUgZmlsZQotICAgZGVzY3JpcHRvciBmZC4gSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgZ3pkb3BlbihkdXAoZmQpLCBtb2RlKS4KLSAgICAgZ3pkb3BlbiByZXR1cm5zIE5VTEwgaWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUKLSAgIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuCisgICBkZXNjcmlwdG9ycyBhcmUgb2J0YWluZWQgZnJvbSBjYWxscyBsaWtlIG9wZW4sIGR1cCwgY3JlYXQsIHBpcGUgb3IgZmlsZW5vCisgICAoaW4gdGhlIGZpbGUgaGFzIGJlZW4gcHJldmlvdXNseSBvcGVuZWQgd2l0aCBmb3BlbikuICBUaGUgbW9kZSBwYXJhbWV0ZXIgaXMKKyAgIGFzIGluIGd6b3Blbi4KKworICAgICBUaGUgbmV4dCBjYWxsIG9mIGd6Y2xvc2Ugb24gdGhlIHJldHVybmVkIGd6RmlsZSB3aWxsIGFsc28gY2xvc2UgdGhlIGZpbGUKKyAgIGRlc2NyaXB0b3IgZmQsIGp1c3QgbGlrZSBmY2xvc2UoZmRvcGVuKGZkKSwgbW9kZSkgY2xvc2VzIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAgIGZkLiAgSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgZ3pkb3BlbihkdXAoZmQpLCBtb2RlKS4KKworICAgICBnemRvcGVuIHJldHVybnMgTlVMTCBpZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUKKyAgIChkZSljb21wcmVzc2lvbiBzdGF0ZS4KICovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgZ3pidWZmZXIgT0YoKGd6RmlsZSBmaWxlLCB1bnNpZ25lZCBzaXplKSk7CiAvKgotICAgICBTZXQgdGhlIGludGVybmFsIGJ1ZmZlciBzaXplIHVzZWQgYnkgdGhpcyBsaWJyYXJ5J3MgZnVuY3Rpb25zLiBUaGUgZGVmYXVsdAotICAgYnVmZmVyIHNpemUgaXMgODE5MiBieXRlcy4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBnel9vcGVuKCkgb3IKLSAgIGd6X2RvcGVuKCksIGFuZCBiZWZvcmUgYW55IG90aGVyIGNhbGxzIHRoYXQgcmVhZCBvciB3cml0ZSB0aGUgZmlsZS4gVGhlCi0gICBidWZmZXIgbWVtb3J5IGFsbG9jYXRpb24gaXMgYWx3YXlzIGRlZmVycmVkIHRvIHRoZSBmaXJzdCByZWFkIG9yIHdyaXRlLiBUd28KLSAgIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCwgZWl0aGVyIGJvdGggb2YgdGhlIHNwZWNpZmllZCBzaXplIHdoZW4gd3JpdGluZywgb3IKLSAgIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHNpemUgYW5kIHRoZSBvdGhlciB0d2ljZSB0aGF0IHNpemUgd2hlbiByZWFkaW5nLiBBCi0gICBsYXJnZXIgYnVmZmVyIHNpemUgb2YsIGZvciBleGFtcGxlLCA2NEsgb3IgMTI4SyBieXRlcyB3aWxsIG5vdGljZWFibHkKLSAgIGluY3JlYXNlIHRoZSBzcGVlZCBvZiBkZWNvbXByZXNzaW9uIChyZWFkaW5nKS4KLSAgICAgZ3pfYnVmZmVyKCkgcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUsIHN1Y2ggYXMgYmVpbmcgY2FsbGVkCisgICAgIFNldCB0aGUgaW50ZXJuYWwgYnVmZmVyIHNpemUgdXNlZCBieSB0aGlzIGxpYnJhcnkncyBmdW5jdGlvbnMuICBUaGUKKyAgIGRlZmF1bHQgYnVmZmVyIHNpemUgaXMgODE5MiBieXRlcy4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKKyAgIGd6b3BlbigpIG9yIGd6ZG9wZW4oKSwgYW5kIGJlZm9yZSBhbnkgb3RoZXIgY2FsbHMgdGhhdCByZWFkIG9yIHdyaXRlIHRoZQorICAgZmlsZS4gIFRoZSBidWZmZXIgbWVtb3J5IGFsbG9jYXRpb24gaXMgYWx3YXlzIGRlZmVycmVkIHRvIHRoZSBmaXJzdCByZWFkIG9yCisgICB3cml0ZS4gIFR3byBidWZmZXJzIGFyZSBhbGxvY2F0ZWQsIGVpdGhlciBib3RoIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSB3aGVuCisgICB3cml0aW5nLCBvciBvbmUgb2YgdGhlIHNwZWNpZmllZCBzaXplIGFuZCB0aGUgb3RoZXIgdHdpY2UgdGhhdCBzaXplIHdoZW4KKyAgIHJlYWRpbmcuICBBIGxhcmdlciBidWZmZXIgc2l6ZSBvZiwgZm9yIGV4YW1wbGUsIDY0SyBvciAxMjhLIGJ5dGVzIHdpbGwKKyAgIG5vdGljZWFibHkgaW5jcmVhc2UgdGhlIHNwZWVkIG9mIGRlY29tcHJlc3Npb24gKHJlYWRpbmcpLgorCisgICAgIFRoZSBuZXcgYnVmZmVyIHNpemUgYWxzbyBhZmZlY3RzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgZ3pwcmludGYoKS4KKworICAgICBnemJ1ZmZlcigpIHJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLCBzdWNoIGFzIGJlaW5nIGNhbGxlZAogICAgdG9vIGxhdGUuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGd6c2V0cGFyYW1zIE9GKChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpKTsKIC8qCi0gICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3Igc3RyYXRlZ3kuIFNlZSB0aGUgZGVzY3JpcHRpb24KKyAgICAgRHluYW1pY2FsbHkgdXBkYXRlIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBvciBzdHJhdGVneS4gIFNlZSB0aGUgZGVzY3JpcHRpb24KICAgIG9mIGRlZmxhdGVJbml0MiBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlc2UgcGFyYW1ldGVycy4KKwogICAgICBnenNldHBhcmFtcyByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGZpbGUgd2FzIG5vdAogICAgb3BlbmVkIGZvciB3cml0aW5nLgogKi8KIAogWkVYVEVSTiBpbnQgWkVYUE9SVCBnenJlYWQgT0YoKGd6RmlsZSBmaWxlLCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbikpOwogLyoKLSAgICAgUmVhZHMgdGhlIGdpdmVuIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLgotICAgSWYgdGhlIGlucHV0IGZpbGUgd2FzIG5vdCBpbiBnemlwIGZvcm1hdCwgZ3pyZWFkIGNvcGllcyB0aGUgZ2l2ZW4gbnVtYmVyCi0gICBvZiBieXRlcyBpbnRvIHRoZSBidWZmZXIuCi0gICAgIGd6cmVhZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHJlYWQgKDAgZm9yCi0gICBlbmQgb2YgZmlsZSwgLTEgZm9yIGVycm9yKS4gKi8KKyAgICAgUmVhZHMgdGhlIGdpdmVuIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLiAgSWYKKyAgIHRoZSBpbnB1dCBmaWxlIHdhcyBub3QgaW4gZ3ppcCBmb3JtYXQsIGd6cmVhZCBjb3BpZXMgdGhlIGdpdmVuIG51bWJlciBvZgorICAgYnl0ZXMgaW50byB0aGUgYnVmZmVyLgorCisgICAgIEFmdGVyIHJlYWNoaW5nIHRoZSBlbmQgb2YgYSBnemlwIHN0cmVhbSBpbiB0aGUgaW5wdXQsIGd6cmVhZCB3aWxsIGNvbnRpbnVlCisgICB0byByZWFkLCBsb29raW5nIGZvciBhbm90aGVyIGd6aXAgc3RyZWFtLCBvciBmYWlsaW5nIHRoYXQsIHJlYWRpbmcgdGhlIHJlc3QKKyAgIG9mIHRoZSBpbnB1dCBmaWxlIGRpcmVjdGx5IHdpdGhvdXQgZGVjb21wcmVzc2lvbi4gIFRoZSBlbnRpcmUgaW5wdXQgZmlsZQorICAgd2lsbCBiZSByZWFkIGlmIGd6cmVhZCBpcyBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZAorICAgbGVuLgorCisgICAgIGd6cmVhZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHJlYWQgKGxlc3MgdGhhbgorICAgbGVuIGZvciBlbmQgb2YgZmlsZSwgLTEgZm9yIGVycm9yKS4KKyovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgZ3p3cml0ZSBPRigoZ3pGaWxlIGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwYyBidWYsIHVuc2lnbmVkIGxlbikpOwogLyoKICAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KLSAgIGd6d3JpdGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuCi0gICAoMCBpbiBjYXNlIG9mIGVycm9yKS4KKyAgIGd6d3JpdGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2UKKyAgIG9mIGVycm9yKS4KICovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlRWQSBnenByaW50ZiBPRigoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSk7CiAvKgogICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJndW1lbnRzIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUgdW5kZXIKLSAgIGNvbnRyb2wgb2YgdGhlIGZvcm1hdCBzdHJpbmcsIGFzIGluIGZwcmludGYuIGd6cHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZgotICAgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4sIG9yIDAgaW4gY2FzZSBvZiBlcnJvci4gVGhlIG51bWJlciBvZgorICAgY29udHJvbCBvZiB0aGUgZm9ybWF0IHN0cmluZywgYXMgaW4gZnByaW50Zi4gIGd6cHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZgorICAgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4sIG9yIDAgaW4gY2FzZSBvZiBlcnJvci4gIFRoZSBudW1iZXIgb2YKICAgIHVuY29tcHJlc3NlZCBieXRlcyB3cml0dGVuIGlzIGxpbWl0ZWQgdG8gODE5MSwgb3Igb25lIGxlc3MgdGhhbiB0aGUgYnVmZmVyCi0gICBzaXplIGdpdmVuIHRvIGd6X2J1ZmZlcigpLiBUaGUgY2FsbGVyIHNob3VsZCBhc3N1cmUgdGhhdCB0aGlzIGxpbWl0IGlzIG5vdAotICAgZXhjZWVkZWQuIElmIGl0IGlzIGV4Y2VlZGVkLCB0aGVuIGd6cHJpbnRmKCkgd2lsbCByZXR1cm4gYW4gZXJyb3IgKDApIHdpdGgKLSAgIG5vdGhpbmcgd3JpdHRlbi4gSW4gdGhpcyBjYXNlLCB0aGVyZSBtYXkgYWxzbyBiZSBhIGJ1ZmZlciBvdmVyZmxvdyB3aXRoCi0gICB1bnByZWRpY3RhYmxlIGNvbnNlcXVlbmNlcywgd2hpY2ggaXMgcG9zc2libGUgb25seSBpZiB6bGliIHdhcyBjb21waWxlZAotICAgd2l0aCB0aGUgaW5zZWN1cmUgZnVuY3Rpb25zIHNwcmludGYoKSBvciB2c3ByaW50ZigpIGJlY2F1c2UgdGhlIHNlY3VyZQotICAgc25wcmludGYoKSBvciB2c25wcmludGYoKSBmdW5jdGlvbnMgd2VyZSBub3QgYXZhaWxhYmxlLgorICAgc2l6ZSBnaXZlbiB0byBnemJ1ZmZlcigpLiAgVGhlIGNhbGxlciBzaG91bGQgYXNzdXJlIHRoYXQgdGhpcyBsaW1pdCBpcyBub3QKKyAgIGV4Y2VlZGVkLiAgSWYgaXQgaXMgZXhjZWVkZWQsIHRoZW4gZ3pwcmludGYoKSB3aWxsIHJldHVybiBhbiBlcnJvciAoMCkgd2l0aAorICAgbm90aGluZyB3cml0dGVuLiAgSW4gdGhpcyBjYXNlLCB0aGVyZSBtYXkgYWxzbyBiZSBhIGJ1ZmZlciBvdmVyZmxvdyB3aXRoCisgICB1bnByZWRpY3RhYmxlIGNvbnNlcXVlbmNlcywgd2hpY2ggaXMgcG9zc2libGUgb25seSBpZiB6bGliIHdhcyBjb21waWxlZCB3aXRoCisgICB0aGUgaW5zZWN1cmUgZnVuY3Rpb25zIHNwcmludGYoKSBvciB2c3ByaW50ZigpIGJlY2F1c2UgdGhlIHNlY3VyZSBzbnByaW50ZigpCisgICBvciB2c25wcmludGYoKSBmdW5jdGlvbnMgd2VyZSBub3QgYXZhaWxhYmxlLiAgVGhpcyBjYW4gYmUgY2hlY2tlZCBmb3IgdXNpbmcKKyAgIHpsaWJDb21waWxlRmxhZ3MoKS4KICovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgZ3pwdXRzIE9GKChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcykpOwogLyoKLSAgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgY29tcHJlc3NlZCBmaWxlLCBleGNsdWRpbmcKKyAgICAgV3JpdGVzIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUsIGV4Y2x1ZGluZwogICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgotICAgICAgZ3pwdXRzIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisKKyAgICAgZ3pwdXRzIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCiAqLwogCiBaRVhURVJOIGNoYXIgKiBaRVhQT1JUIGd6Z2V0cyBPRigoZ3pGaWxlIGZpbGUsIGNoYXIgKmJ1ZiwgaW50IGxlbikpOwogLyoKLSAgICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZSByZWFkLCBvcgorICAgICBSZWFkcyBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUgdW50aWwgbGVuLTEgY2hhcmFjdGVycyBhcmUgcmVhZCwgb3IKICAgIGEgbmV3bGluZSBjaGFyYWN0ZXIgaXMgcmVhZCBhbmQgdHJhbnNmZXJyZWQgdG8gYnVmLCBvciBhbiBlbmQtb2YtZmlsZQogICAgY29uZGl0aW9uIGlzIGVuY291bnRlcmVkLiAgVGhlIHN0cmluZyBpcyB0aGVuIHRlcm1pbmF0ZWQgd2l0aCBhIG51bGwKICAgIGNoYXJhY3Rlci4KLSAgICAgIGd6Z2V0cyByZXR1cm5zIGJ1Ziwgb3IgWl9OVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisKKyAgICAgZ3pnZXRzIHJldHVybnMgYnVmLCBvciBaX05VTEwgaW4gY2FzZSBvZiBlcnJvci4KICovCiAKLVpFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pwdXRjIE9GKChnekZpbGUgZmlsZSwgaW50IGMpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pwdXRjIE9GKChnekZpbGUgZmlsZSwgaW50IGMpKTsKIC8qCi0gICAgICBXcml0ZXMgYywgY29udmVydGVkIHRvIGFuIHVuc2lnbmVkIGNoYXIsIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KLSAgIGd6cHV0YyByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgorICAgICBXcml0ZXMgYywgY29udmVydGVkIHRvIGFuIHVuc2lnbmVkIGNoYXIsIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4gIGd6cHV0YworICAgcmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KICovCiAKLVpFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pnZXRjIE9GKChnekZpbGUgZmlsZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemdldGMgT0YoKGd6RmlsZSBmaWxlKSk7CiAvKgotICAgICAgUmVhZHMgb25lIGJ5dGUgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLiBnemdldGMgcmV0dXJucyB0aGlzIGJ5dGUKLSAgIG9yIC0xIGluIGNhc2Ugb2YgZW5kIG9mIGZpbGUgb3IgZXJyb3IuCisgICAgIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gIGd6Z2V0YyByZXR1cm5zIHRoaXMgYnl0ZSBvciAtMQorICAgaW4gY2FzZSBvZiBlbmQgb2YgZmlsZSBvciBlcnJvci4KICovCiAKLVpFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3p1bmdldGMgT0YoKGludCBjLCBnekZpbGUgZmlsZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBnenVuZ2V0YyBPRigoaW50IGMsIGd6RmlsZSBmaWxlKSk7CiAvKgotICAgICAgUHVzaCBvbmUgY2hhcmFjdGVyIGJhY2sgb250byB0aGUgc3RyZWFtIHRvIGJlIHJlYWQgYWdhaW4gbGF0ZXIuCi0gICBPbmx5IG9uZSBjaGFyYWN0ZXIgb2YgcHVzaC1iYWNrIGlzIGFsbG93ZWQuICBnenVuZ2V0YygpIHJldHVybnMgdGhlCi0gICBjaGFyYWN0ZXIgcHVzaGVkLCBvciAtMSBvbiBmYWlsdXJlLiAgZ3p1bmdldGMoKSB3aWxsIGZhaWwgaWYgYQotICAgY2hhcmFjdGVyIGhhcyBiZWVuIHB1c2hlZCBidXQgbm90IHJlYWQgeWV0LCBvciBpZiBjIGlzIC0xLiBUaGUgcHVzaGVkCi0gICBjaGFyYWN0ZXIgd2lsbCBiZSBkaXNjYXJkZWQgaWYgdGhlIHN0cmVhbSBpcyByZXBvc2l0aW9uZWQgd2l0aCBnenNlZWsoKQotICAgb3IgZ3pyZXdpbmQoKS4KKyAgICAgUHVzaCBvbmUgY2hhcmFjdGVyIGJhY2sgb250byB0aGUgc3RyZWFtIHRvIGJlIHJlYWQgYWdhaW4gbGF0ZXIuICBBdCBsZWFzdAorICAgb25lIGNoYXJhY3RlciBvZiBwdXNoLWJhY2sgaXMgYWxsb3dlZC4gIGd6dW5nZXRjKCkgcmV0dXJucyB0aGUgY2hhcmFjdGVyCisgICBwdXNoZWQsIG9yIC0xIG9uIGZhaWx1cmUuICBnenVuZ2V0YygpIHdpbGwgZmFpbCBpZiBjIGlzIC0xLCBhbmQgbWF5IGZhaWwgaWYKKyAgIGEgY2hhcmFjdGVyIGhhcyBiZWVuIHB1c2hlZCBidXQgbm90IHJlYWQgeWV0LiAgVGhlIHB1c2hlZCBjaGFyYWN0ZXIgd2lsbCBiZQorICAgZGlzY2FyZGVkIGlmIHRoZSBzdHJlYW0gaXMgcmVwb3NpdGlvbmVkIHdpdGggZ3pzZWVrKCkgb3IgZ3pyZXdpbmQoKS4KICovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgZ3pmbHVzaCBPRigoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCkpOwogLyoKLSAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCi0gICBmbHVzaCBpcyBhcyBpbiB0aGUgZGVmbGF0ZSgpIGZ1bmN0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCi0gICBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiBnemVycm9yIGJlbG93KS4gZ3pmbHVzaCByZXR1cm5zIFpfT0sgaWYKLSAgIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaXMgWl9GSU5JU0ggYW5kIGFsbCBvdXRwdXQgY291bGQgYmUgZmx1c2hlZC4KLSAgICAgZ3pmbHVzaCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBzdHJpY3RseSBuZWNlc3NhcnkgYmVjYXVzZSBpdCBjYW4KLSAgIGRlZ3JhZGUgY29tcHJlc3Npb24uCisgICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4gIFRoZSBwYXJhbWV0ZXIgZmx1c2gKKyAgIGlzIGFzIGluIHRoZSBkZWZsYXRlKCkgZnVuY3Rpb24uICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliIGVycm9yIG51bWJlcgorICAgKHNlZSBmdW5jdGlvbiBnemVycm9yIGJlbG93KS4KKworICAgICBJZiB0aGUgZmx1c2ggcGFyYW1ldGVyIGlzIFpfRklOSVNILCB0aGUgcmVtYWluaW5nIGRhdGEgaXMgd3JpdHRlbiBhbmQgdGhlCisgICBnemlwIHN0cmVhbSBpcyBjb21wbGV0ZWQgaW4gdGhlIG91dHB1dC4gIElmIGd6d3JpdGUoKSBpcyBjYWxsZWQgYWdhaW4sIGEgbmV3CisgICBnemlwIHN0cmVhbSB3aWxsIGJlIHN0YXJ0ZWQgaW4gdGhlIG91dHB1dC4gIGd6cmVhZCgpIGlzIGFibGUgdG8gcmVhZCBzdWNoCisgICBjb25jYXRlbnRlZCBnemlwIHN0cmVhbXMuCisKKyAgICAgZ3pmbHVzaCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBzdHJpY3RseSBuZWNlc3NhcnkgYmVjYXVzZSBpdCB3aWxsCisgICBkZWdyYWRlIGNvbXByZXNzaW9uIGlmIGNhbGxlZCB0b28gb2Z0ZW4uCiAqLwogCiAvKgogWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgZ3pzZWVrIE9GKChnekZpbGUgZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9vZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpKTsKIAotICAgICAgU2V0cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZQotICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGUgb2Zmc2V0IHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCi0gICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uIFRoZSB3aGVuY2UgcGFyYW1ldGVyIGlzIGRlZmluZWQgYXMgaW4gbHNlZWsoMik7CisgICAgIFNldHMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUgZ2l2ZW4KKyAgIGNvbXByZXNzZWQgZmlsZS4gIFRoZSBvZmZzZXQgcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKKyAgIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbS4gIFRoZSB3aGVuY2UgcGFyYW1ldGVyIGlzIGRlZmluZWQgYXMgaW4gbHNlZWsoMik7CiAgICB0aGUgdmFsdWUgU0VFS19FTkQgaXMgbm90IHN1cHBvcnRlZC4KKwogICAgICBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcsIHRoaXMgZnVuY3Rpb24gaXMgZW11bGF0ZWQgYnV0IGNhbiBiZQotICAgZXh0cmVtZWx5IHNsb3cuIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZywgb25seSBmb3J3YXJkIHNlZWtzIGFyZQorICAgZXh0cmVtZWx5IHNsb3cuICBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcsIG9ubHkgZm9yd2FyZCBzZWVrcyBhcmUKICAgIHN1cHBvcnRlZDsgZ3pzZWVrIHRoZW4gY29tcHJlc3NlcyBhIHNlcXVlbmNlIG9mIHplcm9lcyB1cCB0byB0aGUgbmV3CiAgICBzdGFydGluZyBwb3NpdGlvbi4KIAotICAgICAgZ3pzZWVrIHJldHVybnMgdGhlIHJlc3VsdGluZyBvZmZzZXQgbG9jYXRpb24gYXMgbWVhc3VyZWQgaW4gYnl0ZXMgZnJvbQorICAgICBnenNlZWsgcmV0dXJucyB0aGUgcmVzdWx0aW5nIG9mZnNldCBsb2NhdGlvbiBhcyBtZWFzdXJlZCBpbiBieXRlcyBmcm9tCiAgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLCBpbgogICAgcGFydGljdWxhciBpZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcgYW5kIHRoZSBuZXcgc3RhcnRpbmcgcG9zaXRpb24KICAgIHdvdWxkIGJlIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbi4KQEAgLTEzMTUsNDcgKzEzMzYsNTAgQEAKIC8qCiAgICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCiAKLSAgIGd6cmV3aW5kKGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gKGludClnenNlZWsoZmlsZSwgMEwsIFNFRUtfU0VUKQorICAgICBnenJld2luZChmaWxlKSBpcyBlcXVpdmFsZW50IHRvIChpbnQpZ3pzZWVrKGZpbGUsIDBMLCBTRUVLX1NFVCkKICovCiAKIC8qCiBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCAgICBnenRlbGwgT0YoKGd6RmlsZSBmaWxlKSk7CiAKLSAgICAgUmV0dXJucyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZQotICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCi0gICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0sIGFuZCBpcyB6ZXJvIHdoZW4gc3RhcnRpbmcsIGV2ZW4gaWYgYXBwZW5kaW5nCi0gICBvciByZWFkaW5nIGEgZ3ppcCBzdHJlYW0gZnJvbSB0aGUgbWlkZGxlIG9mIGEgZmlsZSB1c2luZyBnel9kb3BlbigpLgorICAgICBSZXR1cm5zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZ3pyZWFkIG9yIGd6d3JpdGUgb24gdGhlIGdpdmVuCisgICBjb21wcmVzc2VkIGZpbGUuICBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0sIGFuZCBpcyB6ZXJvIHdoZW4gc3RhcnRpbmcsIGV2ZW4gaWYgYXBwZW5kaW5nIG9yCisgICByZWFkaW5nIGEgZ3ppcCBzdHJlYW0gZnJvbSB0aGUgbWlkZGxlIG9mIGEgZmlsZSB1c2luZyBnemRvcGVuKCkuCiAKLSAgIGd6dGVsbChmaWxlKSBpcyBlcXVpdmFsZW50IHRvIGd6c2VlayhmaWxlLCAwTCwgU0VFS19DVVIpCisgICAgIGd6dGVsbChmaWxlKSBpcyBlcXVpdmFsZW50IHRvIGd6c2VlayhmaWxlLCAwTCwgU0VFS19DVVIpCiAqLwogCiAvKgogWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgZ3pvZmZzZXQgT0YoKGd6RmlsZSBmaWxlKSk7CiAKLSAgICAgUmV0dXJucyB0aGUgY3VycmVudCBvZmZzZXQgaW4gdGhlIGZpbGUgYmVpbmcgcmVhZCBvciB3cml0dGVuLiBUaGlzIG9mZnNldAorICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IG9mZnNldCBpbiB0aGUgZmlsZSBiZWluZyByZWFkIG9yIHdyaXR0ZW4uICBUaGlzIG9mZnNldAogICAgaW5jbHVkZXMgdGhlIGNvdW50IG9mIGJ5dGVzIHRoYXQgcHJlY2VkZSB0aGUgZ3ppcCBzdHJlYW0sIGZvciBleGFtcGxlIHdoZW4KLSAgIGFwcGVuZGluZyBvciB3aGVuIHVzaW5nIGd6X2RvcGVuKCkgZm9yIHJlYWRpbmcuIFdoZW4gcmVhZGluZywgdGhlIG9mZnNldAorICAgYXBwZW5kaW5nIG9yIHdoZW4gdXNpbmcgZ3pkb3BlbigpIGZvciByZWFkaW5nLiAgV2hlbiByZWFkaW5nLCB0aGUgb2Zmc2V0CiAgICBpbmNsdWRlcyBkYXRhIHRoYXQgaGFzIGJlZW4gdXNlZCB0byBnZW5lcmF0ZSB3aGF0IGhhcyBiZWVuIHByb3ZpZGVkIGFzCiAgICB1bmNvbXByZXNzZWQgZGF0YSBzbyBmYXIsIGJ1dCBkb2VzIG5vdCBpbmNsdWRlIGFzIHlldCB1bnVzZWQgYnVmZmVyZWQgaW5wdXQuCi0gICBPbiBlcnJvciwgZ3pfb2Zmc2V0KCkgcmV0dXJucyAtMS4KKyAgIE9uIGVycm9yLCBnem9mZnNldCgpIHJldHVybnMgLTEuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGd6ZW9mIE9GKChnekZpbGUgZmlsZSkpOwogLyoKLSAgICAgUmV0dXJucyAxIHdoZW4gRU9GIGhhcyBwcmV2aW91c2x5IGJlZW4gZGV0ZWN0ZWQgcmVhZGluZyB0aGUgZ2l2ZW4KLSAgIGlucHV0IHN0cmVhbSwgb3RoZXJ3aXNlIHplcm8uCisgICAgIFJldHVybnMgMSB3aGVuIEVPRiBoYXMgcHJldmlvdXNseSBiZWVuIGRldGVjdGVkIHJlYWRpbmcgdGhlIGdpdmVuIGlucHV0CisgICBzdHJlYW0sIG90aGVyd2lzZSB6ZXJvLgogKi8KIAogWkVYVEVSTiBpbnQgWkVYUE9SVCBnemRpcmVjdCBPRigoZ3pGaWxlIGZpbGUpKTsKIC8qCiAgICAgIFJldHVybnMgMSBpZiBmaWxlIGlzIGJlaW5nIHJlYWQgZGlyZWN0bHkgd2l0aG91dCBkZWNvbXByZXNzaW9uLCBvdGhlcndpc2UKLSAgIHplcm8uCisgICB6ZXJvLiAgZ3pkaXJlY3QoKSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZ3pvcGVuKCkgd2lsbCBhbHdheXMgcmV0dXJuIHplcm8sCisgICBzaW5jZSBub3RoaW5nIGhhcyBiZWVuIHJlYWQgeWV0LiAgV2hldGhlciB0byByZWFkIHRoZSBmaWxlIHdpdGgKKyAgIGRlY29tcHJlc3Npb24gb3Igbm90IGlzIG5vdCBkZXRlcm1pbmVkIHVudGlsIGFmdGVyIHRoZSBmaXJzdCByZWFkIG9wZXJhdGlvbgorICAgKGUuZy4gIGd6cmVhZCgpLCBnemdldGMoKSwgZXRjLikuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUICAgIGd6Y2xvc2UgT0YoKGd6RmlsZSBmaWxlKSk7CiAvKgotICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlCi0gICBhbmQgZGVhbGxvY2F0ZXMgYWxsIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIKKyAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaWYgbmVjZXNzYXJ5LCBjbG9zZXMgdGhlIGNvbXByZXNzZWQgZmlsZSBhbmQKKyAgIGRlYWxsb2NhdGVzIGFsbCB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgogICAgZXJyb3IgbnVtYmVyLiAgTm90ZSB0aGF0IG9uY2UgZmlsZSBpcyBjbG9zZWQsIHlvdSBjYW5ub3QgY2FsbCBnemVycm9yIHdpdGgKICAgIGZpbGUsIHNpbmNlIGl0cyBzdHJ1Y3R1cmVzIGhhdmUgYmVlbiBkZWFsbG9jYXRlZC4KICovCkBAIC0xMzYzLDMxICsxMzg3LDMxIEBACiBaRVhURVJOIGludCBaRVhQT1JUIGd6Y2xvc2VfciBPRigoZ3pGaWxlIGZpbGUpKTsKIFpFWFRFUk4gaW50IFpFWFBPUlQgZ3pjbG9zZV93IE9GKChnekZpbGUgZmlsZSkpOwogLyoKLSAgICBTYW1lIGFzIGd6X2Nsb3NlKCksIGJ1dCBnel9jbG9zZV9yKCkgaXMgb25seSBmb3IgdXNlIHdoZW4gcmVhZGluZywgYW5kCi0gICBnel9jbG9zZV93KCkgaXMgb25seSBmb3IgdXNlIHdoZW4gd3JpdGluZy4gVGhlIGFkdmFudGFnZSB0byB1c2luZyB0aGVzZQotICAgaW5zdGVhZCBvZiBnel9jbG9zZSgpIGlzIHRoYXQgdGhleSBhdm9pZCBsaW5raW5nIGluIHpsaWIgY29tcHJlc3Npb24gb3IKKyAgICAgU2FtZSBhcyBnemNsb3NlKCksIGJ1dCBnemNsb3NlX3IoKSBpcyBvbmx5IGZvciB1c2Ugd2hlbiByZWFkaW5nLCBhbmQKKyAgIGd6Y2xvc2VfdygpIGlzIG9ubHkgZm9yIHVzZSB3aGVuIHdyaXRpbmcuICBUaGUgYWR2YW50YWdlIHRvIHVzaW5nIHRoZXNlCisgICBpbnN0ZWFkIG9mIGd6Y2xvc2UoKSBpcyB0aGF0IHRoZXkgYXZvaWQgbGlua2luZyBpbiB6bGliIGNvbXByZXNzaW9uIG9yCiAgICBkZWNvbXByZXNzaW9uIGNvZGUgdGhhdCBpcyBub3QgdXNlZCB3aGVuIG9ubHkgcmVhZGluZyBvciBvbmx5IHdyaXRpbmcKLSAgIHJlc3BlY3RpdmVseS4gSWYgZ3pfY2xvc2UoKSBpcyB1c2VkLCB0aGVuIGJvdGggY29tcHJlc3Npb24gYW5kCi0gICBkZWNvbXByZXNzaW9uIGNvZGUgd2lsbCBiZSBpbmNsdWRlZCB0aGUgYXBwbGljYXRpb24gd2hlbiBsaW5raW5nIHRvIGEKLSAgIHN0YXRpYyB6bGliIGxpYnJhcnkuCisgICByZXNwZWN0aXZlbHkuICBJZiBnemNsb3NlKCkgaXMgdXNlZCwgdGhlbiBib3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCisgICBjb2RlIHdpbGwgYmUgaW5jbHVkZWQgdGhlIGFwcGxpY2F0aW9uIHdoZW4gbGlua2luZyB0byBhIHN0YXRpYyB6bGliIGxpYnJhcnkuCiAqLwogCiBaRVhURVJOIGNvbnN0IGNoYXIgKiBaRVhQT1JUIGd6ZXJyb3IgT0YoKGd6RmlsZSBmaWxlLCBpbnQgKmVycm51bSkpOwogLyoKLSAgICAgUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGxhc3QgZXJyb3Igd2hpY2ggb2NjdXJyZWQgb24gdGhlCi0gICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuIElmIGFuCi0gICBlcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwKLSAgIGVycm51bSBpcyBzZXQgdG8gWl9FUlJOTyBhbmQgdGhlIGFwcGxpY2F0aW9uIG1heSBjb25zdWx0IGVycm5vCi0gICB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCisgICAgIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZSBnaXZlbgorICAgY29tcHJlc3NlZCBmaWxlLiAgZXJybnVtIGlzIHNldCB0byB6bGliIGVycm9yIG51bWJlci4gIElmIGFuIGVycm9yIG9jY3VycmVkCisgICBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwgZXJybnVtIGlzIHNldCB0bworICAgWl9FUlJOTyBhbmQgdGhlIGFwcGxpY2F0aW9uIG1heSBjb25zdWx0IGVycm5vIHRvIGdldCB0aGUgZXhhY3QgZXJyb3IgY29kZS4KIAotICAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nIGFuZCBmdXR1cmUgY2FsbHMgdG8KLSAgIHRoaXMgZnVuY3Rpb24gbWF5IGludmFsaWRhdGUgdGhlIHJldHVybmVkIHN0cmluZy4KKyAgICAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nLiAgRnV0dXJlIGNhbGxzIHRvCisgICB0aGlzIGZ1bmN0aW9uIG1heSBpbnZhbGlkYXRlIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIHN0cmluZy4gIElmIGZpbGUgaXMKKyAgIGNsb3NlZCwgdGhlbiB0aGUgc3RyaW5nIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgZ3plcnJvciB3aWxsIG5vIGxvbmdlciBiZQorICAgYXZhaWxhYmxlLgogKi8KIAogWkVYVEVSTiB2b2lkIFpFWFBPUlQgZ3pjbGVhcmVyciBPRigoZ3pGaWxlIGZpbGUpKTsKIC8qCi0gICAgIENsZWFycyB0aGUgZXJyb3IgYW5kIGVuZC1vZi1maWxlIGZsYWdzIGZvciBmaWxlLiBUaGlzIGlzIGFuYWxvZ291cyB0byB0aGUKLSAgIGNsZWFyZXJyKCkgZnVuY3Rpb24gaW4gc3RkaW8uIFRoaXMgaXMgdXNlZnVsIGZvciBjb250aW51aW5nIHRvIHJlYWQgYSBnemlwCisgICAgIENsZWFycyB0aGUgZXJyb3IgYW5kIGVuZC1vZi1maWxlIGZsYWdzIGZvciBmaWxlLiAgVGhpcyBpcyBhbmFsb2dvdXMgdG8gdGhlCisgICBjbGVhcmVycigpIGZ1bmN0aW9uIGluIHN0ZGlvLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnRpbnVpbmcgdG8gcmVhZCBhIGd6aXAKICAgIGZpbGUgdGhhdCBpcyBiZWluZyB3cml0dGVuIGNvbmN1cnJlbnRseS4KICovCiAKQEAgLTEzOTUsMTcgKzE0MTksMjAgQEAKIAogLyoKICAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcmVsYXRlZCB0byBjb21wcmVzc2lvbiBidXQgYXJlIGV4cG9ydGVkCi0gICBhbnl3YXkgYmVjYXVzZSB0aGV5IG1pZ2h0IGJlIHVzZWZ1bCBpbiBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlCi0gICBjb21wcmVzc2lvbiBsaWJyYXJ5LgorICAgYW55d2F5IGJlY2F1c2UgdGhleSBtaWdodCBiZSB1c2VmdWwgaW4gYXBwbGljYXRpb25zIHVzaW5nIHRoZSBjb21wcmVzc2lvbgorICAgbGlicmFyeS4KICovCiAKIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyIE9GKCh1TG9uZyBhZGxlciwgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pKTsKIC8qCiAgICAgIFVwZGF0ZSBhIHJ1bm5pbmcgQWRsZXItMzIgY2hlY2tzdW0gd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQKLSAgIHJldHVybiB0aGUgdXBkYXRlZCBjaGVja3N1bS4gSWYgYnVmIGlzIFpfTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCi0gICB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNoZWNrc3VtLgotICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAotICAgbXVjaCBmYXN0ZXIuIFVzYWdlIGV4YW1wbGU6CisgICByZXR1cm4gdGhlIHVwZGF0ZWQgY2hlY2tzdW0uICBJZiBidWYgaXMgWl9OVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlCisgICByZXF1aXJlZCBpbml0aWFsIHZhbHVlIGZvciB0aGUgY2hlY2tzdW0uCisKKyAgICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAorICAgbXVjaCBmYXN0ZXIuCisKKyAgIFVzYWdlIGV4YW1wbGU6CiAKICAgICAgdUxvbmcgYWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOwogCkBAIC0xNDI4LDkgKzE0NTUsMTEgQEAKIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMiAgIE9GKCh1TG9uZyBjcmMsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7CiAvKgogICAgICBVcGRhdGUgYSBydW5uaW5nIENSQy0zMiB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZCByZXR1cm4gdGhlCi0gICB1cGRhdGVkIENSQy0zMi4gSWYgYnVmIGlzIFpfTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1aXJlZCBpbml0aWFsCi0gICB2YWx1ZSBmb3IgdGhlIGZvciB0aGUgY3JjLiBQcmUtIGFuZCBwb3N0LWNvbmRpdGlvbmluZyAob25lJ3MgY29tcGxlbWVudCkgaXMKLSAgIHBlcmZvcm1lZCB3aXRoaW4gdGhpcyBmdW5jdGlvbiBzbyBpdCBzaG91bGRuJ3QgYmUgZG9uZSBieSB0aGUgYXBwbGljYXRpb24uCisgICB1cGRhdGVkIENSQy0zMi4gIElmIGJ1ZiBpcyBaX05VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWlyZWQKKyAgIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBmb3IgdGhlIGNyYy4gIFByZS0gYW5kIHBvc3QtY29uZGl0aW9uaW5nIChvbmUncworICAgY29tcGxlbWVudCkgaXMgcGVyZm9ybWVkIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHNvIGl0IHNob3VsZG4ndCBiZSBkb25lIGJ5IHRoZQorICAgYXBwbGljYXRpb24uCisKICAgIFVzYWdlIGV4YW1wbGU6CiAKICAgICAgdUxvbmcgY3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CmRpZmYgLS1naXQgYS96bGliLm1hcCBiL3psaWIubWFwCmluZGV4IDQ5OTIxM2QuLmM5OWU5NzMgMTAwNjQ0Ci0tLSBhL3psaWIubWFwCisrKyBiL3psaWIubWFwCkBAIC0xNCw2ICsxNCw4IEBACiAgICAgemNhbGxvYzsKICAgICB6Y2ZyZWU7CiAgICAgel9lcnJtc2c7CisgICAgZ3pfZXJyb3I7CisgICAgZ3ppb19vbGQ7CiAgICAgXyo7CiB9OwogCkBAIC01MSwzICs1MywxMSBAQAogICAgIGluZmxhdGVSZXNldDI7CiAgICAgaW5mbGF0ZU1hcms7CiB9IFpMSUJfMS4yLjMuMzsKKworWkxJQl8xLjIuMy41IHsKKyAgICBnemJ1ZmZlcjsKKyAgICBnem9mZnNldDsKKyAgICBnem9mZnNldDY0OworICAgIGd6Y2xvc2VfcjsKKyAgICBnemNsb3NlX3c7Cit9IFpMSUJfMS4yLjMuNDsKZGlmZiAtLWdpdCBhL3p1dGlsLmMgYi96dXRpbC5jCmluZGV4IGQ1NWY1OTQuLjk4YTU1YTggMTAwNjQ0Ci0tLSBhL3p1dGlsLmMKKysrIGIvenV0aWwuYwpAQCAtMzQsMjUgKzM0LDI1IEBACiAgICAgdUxvbmcgZmxhZ3M7CiAKICAgICBmbGFncyA9IDA7Ci0gICAgc3dpdGNoIChzaXplb2YodUludCkpIHsKKyAgICBzd2l0Y2ggKChpbnQpKHNpemVvZih1SW50KSkpIHsKICAgICBjYXNlIDI6ICAgICBicmVhazsKICAgICBjYXNlIDQ6ICAgICBmbGFncyArPSAxOyAgICAgYnJlYWs7CiAgICAgY2FzZSA4OiAgICAgZmxhZ3MgKz0gMjsgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDM7CiAgICAgfQotICAgIHN3aXRjaCAoc2l6ZW9mKHVMb25nKSkgeworICAgIHN3aXRjaCAoKGludCkoc2l6ZW9mKHVMb25nKSkpIHsKICAgICBjYXNlIDI6ICAgICBicmVhazsKICAgICBjYXNlIDQ6ICAgICBmbGFncyArPSAxIDw8IDI7ICAgICAgICBicmVhazsKICAgICBjYXNlIDg6ICAgICBmbGFncyArPSAyIDw8IDI7ICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OiAgICBmbGFncyArPSAzIDw8IDI7CiAgICAgfQotICAgIHN3aXRjaCAoc2l6ZW9mKHZvaWRwZikpIHsKKyAgICBzd2l0Y2ggKChpbnQpKHNpemVvZih2b2lkcGYpKSkgewogICAgIGNhc2UgMjogICAgIGJyZWFrOwogICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDEgPDwgNDsgICAgICAgIGJyZWFrOwogICAgIGNhc2UgODogICAgIGZsYWdzICs9IDIgPDwgNDsgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDMgPDwgNDsKICAgICB9Ci0gICAgc3dpdGNoIChzaXplb2Yoel9vZmZfdCkpIHsKKyAgICBzd2l0Y2ggKChpbnQpKHNpemVvZih6X29mZl90KSkpIHsKICAgICBjYXNlIDI6ICAgICBicmVhazsKICAgICBjYXNlIDQ6ICAgICBmbGFncyArPSAxIDw8IDY7ICAgICAgICBicmVhazsKICAgICBjYXNlIDg6ICAgICBmbGFncyArPSAyIDw8IDY7ICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL3p1dGlsLmggYi96dXRpbC5oCmluZGV4IDE4YTEzY2YuLjkzZDY1NTMgMTAwNjQ0Ci0tLSBhL3p1dGlsLmgKKysrIGIvenV0aWwuaApAQCAtMTE2LDcgKzExNiw3IEBACiAjaWZkZWYgT1MyCiAjICBkZWZpbmUgT1NfQ09ERSAgMHgwNgogIyAgaWZkZWYgTV9JODYKLSAgICAgI2luY2x1ZGUgPG1hbGxvYy5oPgorIyAgICBpbmNsdWRlIDxtYWxsb2MuaD4KICMgIGVuZGlmCiAjZW5kaWYKIApAQCAtMTYyLDkgKzE2Miw5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKQotI3ByYWdtYSB3YXJuIC04MDA0Ci0jcHJhZ21hIHdhcm4gLTgwMDgKLSNwcmFnbWEgd2FybiAtODA2NgorICAjcHJhZ21hIHdhcm4gLTgwMDQKKyAgI3ByYWdtYSB3YXJuIC04MDA4CisgICNwcmFnbWEgd2FybiAtODA2NgogI2VuZGlmCiAKICNpZmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCg==